Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 87 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Apply List To Co... | 3491078 | 9 days ago | IN | 0 ETH | 0.00000371 | ||||
Apply List To Co... | 3369494 | 11 days ago | IN | 0 ETH | 0.00000371 | ||||
Apply List To Co... | 3362578 | 11 days ago | IN | 0 ETH | 0.00000371 | ||||
Set Transfer Sec... | 3361601 | 11 days ago | IN | 0 ETH | 0.00000399 | ||||
Apply List To Co... | 3361563 | 11 days ago | IN | 0 ETH | 0.00000391 | ||||
Set Transfer Sec... | 3323059 | 11 days ago | IN | 0 ETH | 0.00000419 | ||||
Apply List To Co... | 3323055 | 11 days ago | IN | 0 ETH | 0.00000426 | ||||
Add Accounts To ... | 3200880 | 13 days ago | IN | 0 ETH | 0.00000662 | ||||
Apply List To Co... | 3200838 | 13 days ago | IN | 0 ETH | 0.00000427 | ||||
Set Transfer Sec... | 3165647 | 13 days ago | IN | 0 ETH | 0.00000421 | ||||
Apply List To Co... | 3165642 | 13 days ago | IN | 0 ETH | 0.00000426 | ||||
Add Accounts To ... | 2459173 | 22 days ago | IN | 0 ETH | 0.00000539 | ||||
Apply List To Co... | 2459138 | 22 days ago | IN | 0 ETH | 0.00000442 | ||||
Create List Copy | 2459054 | 22 days ago | IN | 0 ETH | 0.00000725 | ||||
Apply List To Co... | 2373039 | 23 days ago | IN | 0 ETH | 0.00000392 | ||||
Set Transfer Sec... | 2372998 | 23 days ago | IN | 0 ETH | 0.00000537 | ||||
Apply List To Co... | 2368665 | 23 days ago | IN | 0 ETH | 0.00000552 | ||||
Create List | 2368522 | 23 days ago | IN | 0 ETH | 0.00000559 | ||||
Add Accounts To ... | 2275318 | 24 days ago | IN | 0 ETH | 0.00000624 | ||||
Apply List To Co... | 2251275 | 24 days ago | IN | 0 ETH | 0.00000418 | ||||
Add Accounts To ... | 2251256 | 24 days ago | IN | 0 ETH | 0.00000534 | ||||
Create List Copy | 2251177 | 24 days ago | IN | 0 ETH | 0.00000685 | ||||
Set Transfer Sec... | 2181902 | 25 days ago | IN | 0 ETH | 0.00000422 | ||||
Apply List To Co... | 2181897 | 25 days ago | IN | 0 ETH | 0.00000426 | ||||
Set Transfer Sec... | 1697356 | 31 days ago | IN | 0 ETH | 0.0000043 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
200487 | 52 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
CreatorTokenTransferValidator
Compiler Version
v0.8.24-1.0.1
ZkSolc Version
v1.5.7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./Constants.sol"; import "./DataTypes.sol"; import "./ZkTstorish.sol"; import "@limitbreak/permit-c/PermitC.sol"; import "@limitbreak/tm-core-lib/src/utils/introspection/ERC165.sol"; import "@limitbreak/tm-core-lib/src/utils/structs/EnumerableSet.sol"; import "@limitbreak/tm-core-lib/src/utils/token/IEOARegistry.sol"; import "@limitbreak/tm-core-lib/src/utils/token/ITransferValidator.sol"; /** * @title CreatorTokenTransferValidator * @author Limit Break, Inc. * @notice The CreatorTokenTransferValidator contract is designed to provide a customizable and secure transfer * validation mechanism for NFT collections. This contract allows the owner of an NFT collection to configure * the transfer security level, blacklisted accounts and codehashes, whitelisted accounts and codehashes, and * authorized accounts and codehashes for each collection. * * @dev <h4>Features</h4> * - Transfer security levels: Provides different levels of transfer security, * from open transfers to completely restricted transfers. * - Blacklist: Allows the owner of a collection to blacklist specific operator addresses or codehashes * from executing transfers on behalf of others. * - Whitelist: Allows the owner of a collection to whitelist specific operator addresses or codehashes * permitted to execute transfers on behalf of others or send/receive tokens when otherwise disabled by * security policy. * - Authorizers: Allows the owner of a collection to enable authorizer contracts, that can perform * authorization-based filtering of transfers. * * @dev <h4>Benefits</h4> * - Enhanced security: Allows creators to have more control over their NFT collections, ensuring the safety * and integrity of their assets. * - Flexibility: Provides collection owners the ability to customize transfer rules as per their requirements. * - Compliance: Facilitates compliance with regulations by enabling creators to restrict transfers based on * specific criteria. * * @dev <h4>Intended Usage</h4> * - The CreatorTokenTransferValidatorV3 contract is intended to be used by NFT collection owners to manage and * enforce transfer policies. This contract is integrated with the following varations of creator token * NFT contracts to validate transfers according to the defined security policies. * * - ERC721-C: Creator token implenting OpenZeppelin's ERC-721 standard. * - ERC721-AC: Creator token implenting Azuki's ERC-721A standard. * - ERC721-CW: Creator token implementing OpenZeppelin's ERC-721 standard with opt-in staking to * wrap/upgrade a pre-existing ERC-721 collection. * - ERC721-ACW: Creator token implementing Azuki's ERC721-A standard with opt-in staking to * wrap/upgrade a pre-existing ERC-721 collection. * - ERC1155-C: Creator token implenting OpenZeppelin's ERC-1155 standard. * - ERC1155-CW: Creator token implementing OpenZeppelin's ERC-1155 standard with opt-in staking to * wrap/upgrade a pre-existing ERC-1155 collection. * * <h4>Transfer Security Levels</h4> * - Recommended: Recommended defaults are same as Level 3 (Whitelisting with OTC Enabled). * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: None * - Level 1: No transfer restrictions. * - Caller Constraints: None * - Receiver Constraints: None * - Level 2: Only non-blacklisted operators can initiate transfers, over-the-counter (OTC) trading enabled. * - Caller Constraints: OperatorBlacklistEnableOTC * - Receiver Constraints: None * - Level 3: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading enabled. * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: None * - Level 4: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading disabled. * - Caller Constraints: OperatorWhitelistDisableOTC * - Receiver Constraints: None * - Level 5: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading enabled. * Transfers to contracts with code are not allowed, unless present on the whitelist. * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: NoCode * - Level 6: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading enabled. * Transfers are allowed only to Externally Owned Accounts (EOAs), unless present on the whitelist. * - Caller Constraints: OperatorWhitelistEnableOTC * - Receiver Constraints: EOA * - Level 7: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading disabled. * Transfers to contracts with code are not allowed, unless present on the whitelist. * - Caller Constraints: OperatorWhitelistDisableOTC * - Receiver Constraints: NoCode * - Level 8: Only whitelisted accounts can initiate transfers, over-the-counter (OTC) trading disabled. * Transfers are allowed only to Externally Owned Accounts (EOAs), unless present on the whitelist. * - Caller Constraints: OperatorWhitelistDisableOTC * - Receiver Constraints: EOA * - Level 9: Soulbound Token, No Transfers Allowed. */ contract CreatorTokenTransferValidator is IEOARegistry, ITransferValidator, ERC165, ZkTstorish, PermitC { using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.Bytes32Set; /*************************************************************************/ /* CUSTOM ERRORS */ /*************************************************************************/ /// @dev Thrown when attempting to set a list id that does not exist. error CreatorTokenTransferValidator__ListDoesNotExist(); /// @dev Thrown when attempting to transfer the ownership of a list to the zero address. error CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress(); /// @dev Thrown when attempting to call a function that requires the caller to be the list owner. error CreatorTokenTransferValidator__CallerDoesNotOwnList(); /// @dev Thrown when validating a transfer for a collection using whitelists and the operator is not on the whitelist. error CreatorTokenTransferValidator__CallerMustBeWhitelisted(); /// @dev Thrown when authorizing a transfer for a collection using authorizers and the msg.sender is not in the authorizer list. error CreatorTokenTransferValidator__CallerMustBeAnAuthorizer(); /// @dev Thrown when attempting to call a function that requires owner or default admin role for a collection that the caller does not have. error CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT(); /// @dev Thrown when attempting to renounce or transfer ownership of the default list id. error CreatorTokenTransferValidator__CannotReassignOwnershipOfDefaultList(); /// @dev Thrown when constructor args are not valid error CreatorTokenTransferValidator__InvalidConstructorArgs(); /// @dev Thrown when setting the transfer security level to an invalid value. error CreatorTokenTransferValidator__InvalidTransferSecurityLevel(); /// @dev Thrown when validating a transfer for a collection using blacklists and the operator is on the blacklist. error CreatorTokenTransferValidator__OperatorIsBlacklisted(); /// @dev Thrown when validating a transfer for a collection that does not allow receiver to have code and the receiver has code. error CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode(); /// @dev Thrown when validating a transfer for a collection that requires receivers be verified EOAs and the receiver is not verified. error CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified(); /// @dev Thrown when a frozen account is the receiver of a transfer error CreatorTokenTransferValidator__ReceiverAccountIsFrozen(); /// @dev Thrown when a frozen account is the sender of a transfer error CreatorTokenTransferValidator__SenderAccountIsFrozen(); /// @dev Thrown when validating a transfer for a collection that is in soulbound token mode. error CreatorTokenTransferValidator__TokenIsSoulbound(); /// @dev Thrown when an authorizer attempts to set a wildcard authorized operator on collections that don't allow wildcards error CreatorTokenTransferValidator__WildcardOperatorsCannotBeAuthorizedForCollection(); /// @dev Thrown when attempting to set a authorized operator when authorization mode is disabled. error CreatorTokenTransferValidator__AuthorizationDisabledForCollection(); /// @dev Thrown when attempting to validate a permitted transfer where the permit type does not match the collection-defined token type. error CreatorTokenTransferValidator__TokenTypesDoNotMatch(); /*************************************************************************/ /* EVENTS */ /*************************************************************************/ /// @dev Emitted when a new list is created. event CreatedList(uint256 indexed id, string name); /// @dev Emitted when a list is applied to a collection. event AppliedListToCollection(address indexed collection, uint120 indexed id); /// @dev Emitted when the ownership of a list is transferred to a new owner. event ReassignedListOwnership(uint256 indexed id, address indexed newOwner); /// @dev Emitted when an account is added to the list of frozen accounts for a collection. event AccountFrozenForCollection(address indexed collection, address indexed account); /// @dev Emitted when an account is removed from the list of frozen accounts for a collection. event AccountUnfrozenForCollection(address indexed collection, address indexed account); /// @dev Emitted when an address is added to a list. event AddedAccountToList(uint8 indexed kind, uint256 indexed id, address indexed account); /// @dev Emitted when a codehash is added to a list. event AddedCodeHashToList(uint8 indexed kind, uint256 indexed id, bytes32 indexed codehash); /// @dev Emitted when an address is removed from a list. event RemovedAccountFromList(uint8 indexed kind, uint256 indexed id, address indexed account); /// @dev Emitted when a codehash is removed from a list. event RemovedCodeHashFromList(uint8 indexed kind, uint256 indexed id, bytes32 indexed codehash); /// @dev Emitted when the security level for a collection is updated. event SetTransferSecurityLevel(address indexed collection, uint8 level); /// @dev Emitted when a collection updates its authorization mode. event SetAuthorizationModeEnabled(address indexed collection, bool disabled, bool authorizersCannotSetWildcardOperators); /// @dev Emitted when a collection turns account freezing on or off. event SetAccountFreezingModeEnabled(address indexed collection, bool enabled); /// @dev Emitted when a collection's token type is updated. event SetTokenType(address indexed collection, uint16 tokenType); /*************************************************************************/ /* STRUCTS */ /*************************************************************************/ /** * @dev This struct is internally for the storage of account and codehash lists. */ struct List { EnumerableSet.AddressSet enumerableAccounts; EnumerableSet.Bytes32Set enumerableCodehashes; mapping (address => bool) nonEnumerableAccounts; mapping (bytes32 => bool) nonEnumerableCodehashes; } /** * @dev This struct is internally for the storage of account lists. */ struct AccountList { EnumerableSet.AddressSet enumerableAccounts; mapping (address => bool) nonEnumerableAccounts; } /*************************************************************************/ /* CONSTANTS */ /*************************************************************************/ /// @dev Immutable lookup table for constant gas determination of caller constraints by security level. /// @dev Created during contract construction using defined constants. uint256 private immutable _callerConstraintsLookup; /// @dev Immutable lookup table for constant gas determination of receiver constraints by security level. /// @dev Created during contract construction using defined constants. uint256 private immutable _receiverConstraintsLookup; /// @dev The address of the EOA Registry to use to validate an account is a verified EOA. address private immutable _eoaRegistry; /// @dev The legacy Creator Token Transfer Validator Interface bytes4 private constant LEGACY_TRANSFER_VALIDATOR_INTERFACE_ID = 0x00000000; /// @dev The default admin role value for contracts that implement access control. bytes32 private constant DEFAULT_ACCESS_CONTROL_ADMIN_ROLE = 0x00; /// @dev Value representing a zero value code hash. bytes32 private constant BYTES32_ZERO = 0x0000000000000000000000000000000000000000000000000000000000000000; address private constant WILDCARD_OPERATOR_ADDRESS = address(0x01); uint16 private constant DEFAULT_TOKEN_TYPE = 0; /*************************************************************************/ /* STORAGE */ /*************************************************************************/ /// @notice Keeps track of the most recently created list id. uint120 public lastListId; /// @dev Used as a collision guard. uint256 private _transientOperatorSlotHolder; /// @notice Mapping of list ids to list owners mapping (uint120 => address) public listOwners; /// @dev Mapping of collection addresses to their security policy settings mapping (address => CollectionSecurityPolicyV3) internal collectionSecurityPolicies; /// @dev Mapping of list ids to blacklist settings mapping (uint120 => List) internal blacklists; /// @dev Mapping of list ids to whitelist settings mapping (uint120 => List) internal whitelists; /// @dev Mapping of list ids to authorizers mapping (uint120 => List) internal authorizers; /// @dev Mapping of collections to accounts that are frozen for those collections mapping (address => AccountList) internal frozenAccounts; constructor( address defaultOwner, address eoaRegistry_, string memory name, string memory version ) ZkTstorish() PermitC( name, version, defaultOwner, block.chainid == 1 ? 0.33 ether : 0.01 ether ) { if (defaultOwner == address(0) || eoaRegistry_ == address(0)) { revert CreatorTokenTransferValidator__InvalidConstructorArgs(); } _createDefaultList(defaultOwner); _eoaRegistry = eoaRegistry_; _callerConstraintsLookup = _constructCallerConstraintsTable(); _receiverConstraintsLookup = _constructReceiverConstraintsTable(); } /** * @dev This function is only called during contract construction to create the default list. */ function _createDefaultList(address defaultOwner) internal { uint120 id = 0; listOwners[id] = defaultOwner; emit CreatedList(id, "DEFAULT LIST"); emit ReassignedListOwnership(id, defaultOwner); } /** * @dev This function is only called during contract construction to create the caller constraints * @dev lookup table. */ function _constructCallerConstraintsTable() internal pure returns (uint256) { return (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_RECOMMENDED << 3)) | (CALLER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_ONE << 3)) | (CALLER_CONSTRAINTS_OPERATOR_BLACKLIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_TWO << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_THREE << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC << (TRANSFER_SECURITY_LEVEL_FOUR << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_FIVE << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC << (TRANSFER_SECURITY_LEVEL_SIX << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC << (TRANSFER_SECURITY_LEVEL_SEVEN << 3)) | (CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC << (TRANSFER_SECURITY_LEVEL_EIGHT << 3)) | (CALLER_CONSTRAINTS_SBT << (TRANSFER_SECURITY_LEVEL_NINE << 3)); } /** * @dev This function is only called during contract construction to create the receiver constraints * @dev lookup table. */ function _constructReceiverConstraintsTable() internal pure returns (uint256) { return (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_RECOMMENDED << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_ONE << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_TWO << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_THREE << 3)) | (RECEIVER_CONSTRAINTS_NONE << (TRANSFER_SECURITY_LEVEL_FOUR << 3)) | (RECEIVER_CONSTRAINTS_NO_CODE << (TRANSFER_SECURITY_LEVEL_FIVE << 3)) | (RECEIVER_CONSTRAINTS_EOA << (TRANSFER_SECURITY_LEVEL_SIX << 3)) | (RECEIVER_CONSTRAINTS_NO_CODE << (TRANSFER_SECURITY_LEVEL_SEVEN << 3)) | (RECEIVER_CONSTRAINTS_EOA << (TRANSFER_SECURITY_LEVEL_EIGHT << 3)) | (RECEIVER_CONSTRAINTS_SBT << (TRANSFER_SECURITY_LEVEL_NINE << 3)); } /*************************************************************************/ /* MODIFIERS */ /*************************************************************************/ /** * @dev This modifier restricts a function call to the owner of the list `id`. * @dev Throws when the caller is not the list owner. */ modifier onlyListOwner(uint120 id) { _requireCallerOwnsList(id); _; } /*************************************************************************/ /* APPLY TRANSFER POLICIES */ /*************************************************************************/ /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. */ function validateTransfer(address caller, address from, address to) public view { (bytes4 errorSelector,) = _validateTransfer(_callerAuthorizedCheckCollection, msg.sender, caller, from, to, 0); if (errorSelector != SELECTOR_NO_ERROR) { _revertCustomErrorSelectorAsm(errorSelector); } } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. * @param tokenId The token id being transferred. */ function validateTransfer(address caller, address from, address to, uint256 tokenId) public view { (bytes4 errorSelector,) = _validateTransfer(_callerAuthorizedCheckToken, msg.sender, caller, from, to, tokenId); if (errorSelector != SELECTOR_NO_ERROR) { _revertCustomErrorSelectorAsm(errorSelector); } } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. * @param tokenId The token id being transferred. */ function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 /*amount*/) external { validateTransfer(caller, from, to, tokenId); } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. */ function applyCollectionTransferPolicy(address caller, address from, address to) external view { validateTransfer(caller, from, to); } /** * @notice Returns the caller and receiver constraints for the specified transfer security level. * * @param level The transfer security level to return the caller and receiver constraints for. * * @return callerConstraints The `CallerConstraints` value for the level. * @return receiverConstraints The `ReceiverConstraints` value for the level. */ function transferSecurityPolicies( uint256 level ) public view returns (uint256 callerConstraints, uint256 receiverConstraints) { callerConstraints = uint8((_callerConstraintsLookup >> (level << 3))); receiverConstraints = uint8((_receiverConstraintsLookup >> (level << 3))); } /** * @notice Sets an operator for an authorized transfer that skips transfer security level * validation for caller and receiver constraints. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The `operator` is stored as an authorized operator for transfers. * * @param operator The address of the operator to set as authorized for transfers. * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function beforeAuthorizedTransfer(address operator, address token, uint256 tokenId) external { _setOperatorInTransientStorage(operator, token, tokenId, false); } /** * @notice Clears the authorized operator for a token to prevent additional transfers that * do not conform to the transfer security level for the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The authorized operator for the token is cleared from storage. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function afterAuthorizedTransfer(address token, uint256 tokenId) public { _setOperatorInTransientStorage(address(uint160(uint256(BYTES32_ZERO))), token, tokenId, false); } /** * @notice Sets an operator for an authorized transfer that skips transfer security level * validation for caller and receiver constraints. * @notice This overload of `beforeAuthorizedTransfer` defaults to a tokenId of 0. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The `operator` is stored as an authorized operator for transfers. * * @param operator The address of the operator to set as authorized for transfers. * @param token The address of the token to authorize. */ function beforeAuthorizedTransfer(address operator, address token) external { _setOperatorInTransientStorage(operator, token, 0, true); } /** * @notice Clears the authorized operator for a token to prevent additional transfers that * do not conform to the transfer security level for the token. * @notice This overload of `afterAuthorizedTransfer` defaults to a tokenId of 0. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The authorized operator for the token is cleared from storage. * * @param token The address of the token to authorize. */ function afterAuthorizedTransfer(address token) external { afterAuthorizedTransfer(token, 0); } /** * @notice Sets the wildcard operator to authorize any operator to transfer a token while * skipping transfer security level validation for caller and receiver constraints. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when the collection does not allow for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The wildcard operator is stored as an authorized operator for transfers. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function beforeAuthorizedTransfer(address token, uint256 tokenId) external { _setOperatorInTransientStorage(WILDCARD_OPERATOR_ADDRESS, token, tokenId, false); } /** * @notice Sets the wildcard operator to authorize any operator to transfer a token while * skipping transfer security level validation for caller and receiver constraints. * * @dev An authorizer *MUST* clear the authorization with a call to `afterAuthorizedTransfer` * to prevent unauthorized transfers of the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when the collection does not allow for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The wildcard operator is stored as an authorized operator for transfers. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 /*amount*/) external { _setOperatorInTransientStorage(WILDCARD_OPERATOR_ADDRESS, token, tokenId, false); } /** * @notice Clears the authorized operator for a token to prevent additional transfers that * do not conform to the transfer security level for the token. * * @dev Throws when authorization mode is disabled for the collection. * @dev Throws when using the wildcard operator address and the collection does not allow * for wildcard authorized operators. * @dev Throws when the caller is not an allowed authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. The authorized operator for the token is cleared from storage. * * @param token The address of the token to authorize. * @param tokenId The token id to set the authorized operator for. */ function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external { afterAuthorizedTransfer(token, tokenId); } /*************************************************************************/ /* LIST MANAGEMENT */ /*************************************************************************/ /** * @notice Creates a new list id. The list id is a handle to allow editing of blacklisted and whitelisted accounts * and codehashes. * * @dev <h4>Postconditions:</h4> * 1. A new list with the specified name is created. * 2. The caller is set as the owner of the new list. * 3. A `CreatedList` event is emitted. * 4. A `ReassignedListOwnership` event is emitted. * * @param name The name of the new list. * @return id The id of the new list. */ function createList(string calldata name) public returns (uint120 id) { unchecked { id = ++lastListId; } listOwners[id] = msg.sender; emit CreatedList(id, name); emit ReassignedListOwnership(id, msg.sender); } /** * @notice Creates a new list id, and copies all blacklisted and whitelisted accounts and codehashes from the * specified source list. * * @dev <h4>Postconditions:</h4> * 1. A new list with the specified name is created. * 2. The caller is set as the owner of the new list. * 3. A `CreatedList` event is emitted. * 4. A `ReassignedListOwnership` event is emitted. * 5. All blacklisted and whitelisted accounts and codehashes from the specified source list are copied * to the new list. * 6. An `AddedAccountToList` event is emitted for each blacklisted and whitelisted account copied. * 7. An `AddedCodeHashToList` event is emitted for each blacklisted and whitelisted codehash copied. * * @param name The name of the new list. * @param sourceListId The id of the source list to copy from. * @return id The id of the new list. */ function createListCopy(string calldata name, uint120 sourceListId) external returns (uint120 id) { unchecked { id = ++lastListId; } unchecked { if (sourceListId > id - 1) { revert CreatorTokenTransferValidator__ListDoesNotExist(); } } listOwners[id] = msg.sender; emit CreatedList(id, name); emit ReassignedListOwnership(id, msg.sender); List storage sourceBlacklist = blacklists[sourceListId]; List storage sourceWhitelist = whitelists[sourceListId]; List storage sourceAuthorizers = authorizers[sourceListId]; List storage targetBlacklist = blacklists[id]; List storage targetWhitelist = whitelists[id]; List storage targetAuthorizers = authorizers[id]; _copyAddressSet(LIST_TYPE_BLACKLIST, id, sourceBlacklist, targetBlacklist); _copyBytes32Set(LIST_TYPE_BLACKLIST, id, sourceBlacklist, targetBlacklist); _copyAddressSet(LIST_TYPE_WHITELIST, id, sourceWhitelist, targetWhitelist); _copyBytes32Set(LIST_TYPE_WHITELIST, id, sourceWhitelist, targetWhitelist); _copyAddressSet(LIST_TYPE_AUTHORIZERS, id, sourceAuthorizers, targetAuthorizers); _copyBytes32Set(LIST_TYPE_AUTHORIZERS, id, sourceAuthorizers, targetAuthorizers); } /** * @notice Transfer ownership of a list to a new owner. * * @dev Throws when the new owner is the zero address. * @dev Throws when the caller does not own the specified list. * @dev Throws when list id is zero (default list). * * @dev <h4>Postconditions:</h4> * 1. The list ownership is transferred to the new owner. * 2. A `ReassignedListOwnership` event is emitted. * * @param id The id of the list. * @param newOwner The address of the new owner. */ function reassignOwnershipOfList(uint120 id, address newOwner) public { if(newOwner == address(0)) { revert CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress(); } _reassignOwnershipOfList(id, newOwner); } /** * @notice Renounce the ownership of a list, rendering the list immutable. * * @dev Throws when the caller does not own the specified list. * @dev Throws when list id is zero (default list). * * @dev <h4>Postconditions:</h4> * 1. The ownership of the specified list is renounced. * 2. A `ReassignedListOwnership` event is emitted. * * @param id The id of the list. */ function renounceOwnershipOfList(uint120 id) public { _reassignOwnershipOfList(id, address(0)); } /** * @notice Set the transfer security level, authorization mode and account freezing mode settings of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The transfer security level of the specified collection is set to the new value. * 2. The authorization mode setting of the specified collection is set to the new value. * 3. The authorization wildcard operator mode setting of the specified collection is set to the new value. * 4. The account freezing mode setting of the specified collection is set to the new value. * 5. A `SetTransferSecurityLevel` event is emitted. * 6. A `SetAuthorizationModeEnabled` event is emitted. * 7. A `SetAccountFreezingModeEnabled` event is emitted. * * @param collection The address of the collection. * @param level The new transfer security level to apply. * @param disableAuthorizationMode Flag if the collection allows for authorizer mode. * @param disableWildcardOperators Flag if the authorizer can set wildcard operators. * @param enableAccountFreezingMode Flag if the collection is using account freezing. */ function setTransferSecurityLevelOfCollection( address collection, uint8 level, bool disableAuthorizationMode, bool disableWildcardOperators, bool enableAccountFreezingMode) external { if (level > TRANSFER_SECURITY_LEVEL_NINE) { revert CreatorTokenTransferValidator__InvalidTransferSecurityLevel(); } _requireCallerIsNFTOrContractOwnerOrAdmin(collection); collectionSecurityPolicies[collection].transferSecurityLevel = level; collectionSecurityPolicies[collection].disableAuthorizationMode = disableAuthorizationMode; collectionSecurityPolicies[collection].authorizersCannotSetWildcardOperators = disableWildcardOperators; collectionSecurityPolicies[collection].enableAccountFreezingMode = enableAccountFreezingMode; emit SetTransferSecurityLevel(collection, level); emit SetAuthorizationModeEnabled(collection, disableAuthorizationMode, disableWildcardOperators); emit SetAccountFreezingModeEnabled(collection, enableAccountFreezingMode); } /** * @notice Set the token type setting of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The token type of the specified collection is set to the new value. * 2. A `SetTokenType` event is emitted. * * @param collection The address of the collection. * @param tokenType The new transfer security level to apply. */ function setTokenTypeOfCollection( address collection, uint16 tokenType ) external { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); collectionSecurityPolicies[collection].tokenType = tokenType; emit SetTokenType(collection, tokenType); } /** * @notice Applies the specified list to a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * @dev Throws when the specified list id does not exist. * * @dev <h4>Postconditions:</h4> * 1. The list of the specified collection is set to the new value. * 2. An `AppliedListToCollection` event is emitted. * * @param collection The address of the collection. * @param id The id of the operator whitelist. */ function applyListToCollection(address collection, uint120 id) public { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); if (id > lastListId) { revert CreatorTokenTransferValidator__ListDoesNotExist(); } collectionSecurityPolicies[collection].listId = id; emit AppliedListToCollection(collection, id); } /** * @notice Adds accounts to the frozen accounts list of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The accounts are added to the list of frozen accounts for a collection. * 2. A `AccountFrozenForCollection` event is emitted for each account added to the list. * * @param collection The address of the collection. * @param accountsToFreeze The list of accounts to added to frozen accounts. */ function freezeAccountsForCollection(address collection, address[] calldata accountsToFreeze) external { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); AccountList storage accounts = frozenAccounts[collection]; for (uint256 i = 0; i < accountsToFreeze.length;) { address accountToFreeze = accountsToFreeze[i]; if (accounts.enumerableAccounts.add(accountToFreeze)) { emit AccountFrozenForCollection(collection, accountToFreeze); accounts.nonEnumerableAccounts[accountToFreeze] = true; } unchecked { ++i; } } } /** * @notice Removes accounts to the frozen accounts list of a collection. * * @dev Throws when the caller is neither collection contract, nor the owner or admin of the specified collection. * * @dev <h4>Postconditions:</h4> * 1. The accounts are removed from the list of frozen accounts for a collection. * 2. A `AccountUnfrozenForCollection` event is emitted for each account removed from the list. * * @param collection The address of the collection. * @param accountsToUnfreeze The list of accounts to remove from frozen accounts. */ function unfreezeAccountsForCollection(address collection, address[] calldata accountsToUnfreeze) external { _requireCallerIsNFTOrContractOwnerOrAdmin(collection); AccountList storage accounts = frozenAccounts[collection]; for (uint256 i = 0; i < accountsToUnfreeze.length;) { address accountToUnfreeze = accountsToUnfreeze[i]; if (accounts.enumerableAccounts.remove(accountToUnfreeze)) { emit AccountUnfrozenForCollection(collection, accountToUnfreeze); accounts.nonEnumerableAccounts[accountToUnfreeze] = false; } unchecked { ++i; } } } /** * @notice Get the security policy of the specified collection. * @param collection The address of the collection. * @return The security policy of the specified collection, which includes: * Transfer security level, operator whitelist id, permitted contract receiver allowlist id, * authorizer mode, if authorizer can set a wildcard operator, and if account freezing is * enabled. */ function getCollectionSecurityPolicy( address collection ) external view returns (CollectionSecurityPolicyV3 memory) { return collectionSecurityPolicies[collection]; } /** * @notice Adds one or more accounts to a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts not previously in the list are added. * 2. An `AddedAccountToList` event is emitted for each account that is newly added to the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to add. */ function addAccountsToBlacklist( uint120 id, address[] calldata accounts ) external { _addAccountsToList(blacklists[id], LIST_TYPE_BLACKLIST, id, accounts); } /** * @notice Adds one or more accounts to a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts not previously in the list are added. * 2. An `AddedAccountToList` event is emitted for each account that is newly added to the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to add. */ function addAccountsToWhitelist( uint120 id, address[] calldata accounts ) external { _addAccountsToList(whitelists[id], LIST_TYPE_WHITELIST, id, accounts); } /** * @notice Adds one or more accounts to authorizers. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts not previously in the list are added. * 2. An `AddedAccountToList` event is emitted for each account that is newly added to the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to add. */ function addAccountsToAuthorizers( uint120 id, address[] calldata accounts ) external { _addAccountsToList(authorizers[id], LIST_TYPE_AUTHORIZERS, id, accounts); } /** * @notice Adds one or more codehashes to a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * @dev Throws when a codehash is zero. * * @dev <h4>Postconditions:</h4> * 1. Codehashes not previously in the list are added. * 2. An `AddedCodeHashToList` event is emitted for each codehash that is newly added to the list. * * @param id The id of the list. * @param codehashes The codehashes to add. */ function addCodeHashesToBlacklist( uint120 id, bytes32[] calldata codehashes ) external { _addCodeHashesToList(blacklists[id], LIST_TYPE_BLACKLIST, id, codehashes); } /** * @notice Adds one or more codehashes to a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * @dev Throws when a codehash is zero. * * @dev <h4>Postconditions:</h4> * 1. Codehashes not previously in the list are added. * 2. An `AddedCodeHashToList` event is emitted for each codehash that is newly added to the list. * * @param id The id of the list. * @param codehashes The codehashes to add. */ function addCodeHashesToWhitelist( uint120 id, bytes32[] calldata codehashes ) external { _addCodeHashesToList(whitelists[id], LIST_TYPE_WHITELIST, id, codehashes); } /** * @notice Removes one or more accounts from a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts previously in the list are removed. * 2. A `RemovedAccountFromList` event is emitted for each account that is removed from the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to remove. */ function removeAccountsFromBlacklist( uint120 id, address[] calldata accounts ) external { _removeAccountsFromList(blacklists[id], LIST_TYPE_BLACKLIST, id, accounts); } /** * @notice Removes one or more accounts from a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts previously in the list are removed. * 2. A `RemovedAccountFromList` event is emitted for each account that is removed from the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to remove. */ function removeAccountsFromWhitelist( uint120 id, address[] calldata accounts ) external { _removeAccountsFromList(whitelists[id], LIST_TYPE_WHITELIST, id, accounts); } /** * @notice Removes one or more accounts from authorizers. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the accounts array is empty. * * @dev <h4>Postconditions:</h4> * 1. Accounts previously in the list are removed. * 2. A `RemovedAccountFromList` event is emitted for each account that is removed from the list. * * @param id The id of the list. * @param accounts The addresses of the accounts to remove. */ function removeAccountsFromAuthorizers( uint120 id, address[] calldata accounts ) external { _removeAccountsFromList(authorizers[id], LIST_TYPE_AUTHORIZERS, id, accounts); } /** * @notice Removes one or more codehashes from a blacklist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * * @dev <h4>Postconditions:</h4> * 1. Codehashes previously in the list are removed. * 2. A `RemovedCodeHashFromList` event is emitted for each codehash that is removed from the list. * * @param id The id of the list. * @param codehashes The codehashes to remove. */ function removeCodeHashesFromBlacklist( uint120 id, bytes32[] calldata codehashes ) external { _removeCodeHashesFromList(blacklists[id], LIST_TYPE_BLACKLIST, id, codehashes); } /** * @notice Removes one or more codehashes from a whitelist. * * @dev Throws when the caller does not own the specified list. * @dev Throws when the codehashes array is empty. * * @dev <h4>Postconditions:</h4> * 1. Codehashes previously in the list are removed. * 2. A `RemovedCodeHashFromList` event is emitted for each codehash that is removed from the list. * * @param id The id of the list. * @param codehashes The codehashes to remove. */ function removeCodeHashesFromWhitelist( uint120 id, bytes32[] calldata codehashes ) external { _removeCodeHashesFromList(whitelists[id], LIST_TYPE_WHITELIST, id, codehashes); } /** * @notice Get blacklisted accounts by list id. * @param id The id of the list. * @return An array of blacklisted accounts. */ function getBlacklistedAccounts(uint120 id) public view returns (address[] memory) { return blacklists[id].enumerableAccounts.values(); } /** * @notice Get whitelisted accounts by list id. * @param id The id of the list. * @return An array of whitelisted accounts. */ function getWhitelistedAccounts(uint120 id) public view returns (address[] memory) { return whitelists[id].enumerableAccounts.values(); } /** * @notice Get authorizor accounts by list id. * @param id The id of the list. * @return An array of authorizer accounts. */ function getAuthorizerAccounts(uint120 id) public view returns (address[] memory) { return authorizers[id].enumerableAccounts.values(); } /** * @notice Get blacklisted codehashes by list id. * @param id The id of the list. * @return An array of blacklisted codehashes. */ function getBlacklistedCodeHashes(uint120 id) public view returns (bytes32[] memory) { return blacklists[id].enumerableCodehashes.values(); } /** * @notice Get whitelisted codehashes by list id. * @param id The id of the list. * @return An array of whitelisted codehashes. */ function getWhitelistedCodeHashes(uint120 id) public view returns (bytes32[] memory) { return whitelists[id].enumerableCodehashes.values(); } /** * @notice Check if an account is blacklisted in a specified list. * @param id The id of the list. * @param account The address of the account to check. * @return True if the account is blacklisted in the specified list, false otherwise. */ function isAccountBlacklisted(uint120 id, address account) public view returns (bool) { return blacklists[id].nonEnumerableAccounts[account]; } /** * @notice Check if an account is whitelisted in a specified list. * @param id The id of the list. * @param account The address of the account to check. * @return True if the account is whitelisted in the specified list, false otherwise. */ function isAccountWhitelisted(uint120 id, address account) public view returns (bool) { return whitelists[id].nonEnumerableAccounts[account]; } /** * @notice Check if an account is an authorizer in a specified list. * @param id The id of the list. * @param account The address of the account to check. * @return True if the account is an authorizer in the specified list, false otherwise. */ function isAccountAuthorizer(uint120 id, address account) public view returns (bool) { return authorizers[id].nonEnumerableAccounts[account]; } /** * @notice Check if a codehash is blacklisted in a specified list. * @param id The id of the list. * @param codehash The codehash to check. * @return True if the codehash is blacklisted in the specified list, false otherwise. */ function isCodeHashBlacklisted(uint120 id, bytes32 codehash) public view returns (bool) { return blacklists[id].nonEnumerableCodehashes[codehash]; } /** * @notice Check if a codehash is whitelisted in a specified list. * @param id The id of the list. * @param codehash The codehash to check. * @return True if the codehash is whitelisted in the specified list, false otherwise. */ function isCodeHashWhitelisted(uint120 id, bytes32 codehash) public view returns (bool) { return whitelists[id].nonEnumerableCodehashes[codehash]; } /** * @notice Get blacklisted accounts by collection. * @param collection The address of the collection. * @return An array of blacklisted accounts. */ function getBlacklistedAccountsByCollection(address collection) external view returns (address[] memory) { return getBlacklistedAccounts(collectionSecurityPolicies[collection].listId); } /** * @notice Get whitelisted accounts by collection. * @param collection The address of the collection. * @return An array of whitelisted accounts. */ function getWhitelistedAccountsByCollection(address collection) external view returns (address[] memory) { return getWhitelistedAccounts(collectionSecurityPolicies[collection].listId); } /** * @notice Get authorizer accounts by collection. * @param collection The address of the collection. * @return An array of authorizer accounts. */ function getAuthorizerAccountsByCollection(address collection) external view returns (address[] memory) { return getAuthorizerAccounts(collectionSecurityPolicies[collection].listId); } /** * @notice Get frozen accounts by collection. * @param collection The address of the collection. * @return An array of frozen accounts. */ function getFrozenAccountsByCollection(address collection) external view returns (address[] memory) { return frozenAccounts[collection].enumerableAccounts.values(); } /** * @notice Get blacklisted codehashes by collection. * @param collection The address of the collection. * @return An array of blacklisted codehashes. */ function getBlacklistedCodeHashesByCollection(address collection) external view returns (bytes32[] memory) { return getBlacklistedCodeHashes(collectionSecurityPolicies[collection].listId); } /** * @notice Get whitelisted codehashes by collection. * @param collection The address of the collection. * @return An array of whitelisted codehashes. */ function getWhitelistedCodeHashesByCollection(address collection) external view returns (bytes32[] memory) { return getWhitelistedCodeHashes(collectionSecurityPolicies[collection].listId); } /** * @notice Check if an account is blacklisted by a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is blacklisted by the specified collection, false otherwise. */ function isAccountBlacklistedByCollection(address collection, address account) external view returns (bool) { return isAccountBlacklisted(collectionSecurityPolicies[collection].listId, account); } /** * @notice Check if an account is whitelisted by a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is whitelisted by the specified collection, false otherwise. */ function isAccountWhitelistedByCollection(address collection, address account) external view returns (bool) { return isAccountWhitelisted(collectionSecurityPolicies[collection].listId, account); } /** * @notice Check if an account is an authorizer of a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is an authorizer by the specified collection, false otherwise. */ function isAccountAuthorizerOfCollection(address collection, address account) external view returns (bool) { return isAccountAuthorizer(collectionSecurityPolicies[collection].listId, account); } /** * @notice Check if an account is frozen for a specified collection. * @param collection The address of the collection. * @param account The address of the account to check. * @return True if the account is frozen by the specified collection, false otherwise. */ function isAccountFrozenForCollection(address collection, address account) external view returns (bool) { return frozenAccounts[collection].nonEnumerableAccounts[account]; } /** * @notice Check if a codehash is blacklisted by a specified collection. * @param collection The address of the collection. * @param codehash The codehash to check. * @return True if the codehash is blacklisted by the specified collection, false otherwise. */ function isCodeHashBlacklistedByCollection(address collection, bytes32 codehash) external view returns (bool) { return isCodeHashBlacklisted(collectionSecurityPolicies[collection].listId, codehash); } /** * @notice Check if a codehash is whitelisted by a specified collection. * @param collection The address of the collection. * @param codehash The codehash to check. * @return True if the codehash is whitelisted by the specified collection, false otherwise. */ function isCodeHashWhitelistedByCollection(address collection, bytes32 codehash) external view returns (bool) { return isCodeHashWhitelisted(collectionSecurityPolicies[collection].listId, codehash); } /// @notice Returns true if the specified account has verified a signature on the registry, false otherwise. function isVerifiedEOA(address account) public view returns (bool) { return IEOARegistry(_eoaRegistry).isVerifiedEOA(account); } /// @notice ERC-165 Interface Support /// @dev Do not remove LEGACY from this contract or future contracts. /// Doing so will break backwards compatibility with V1 and V2 creator tokens. function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == LEGACY_TRANSFER_VALIDATOR_INTERFACE_ID || interfaceId == type(ITransferValidator).interfaceId || interfaceId == type(IPermitC).interfaceId || interfaceId == type(IEOARegistry).interfaceId || super.supportsInterface(interfaceId); } /*************************************************************************/ /* HELPERS */ /*************************************************************************/ /** * @notice Reverts the transaction if the caller is not the owner or assigned the default * @notice admin role of the contract at `tokenAddress`. * * @dev Throws when the caller is neither owner nor assigned the default admin role. * * @param tokenAddress The contract address of the token to check permissions for. */ function _requireCallerIsNFTOrContractOwnerOrAdmin(address tokenAddress) internal view { address caller = msg.sender; if(caller == tokenAddress) { return; } (address contractOwner,) = _safeOwner(tokenAddress); if(caller == contractOwner) { return; } (bool callerIsContractAdmin,) = _safeHasRole(tokenAddress, DEFAULT_ACCESS_CONTROL_ADMIN_ROLE, caller); if(callerIsContractAdmin) { return; } revert CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT(); } /** * @notice Copies all addresses in `ptrFromList` to `ptrToList`. * * @dev This function will copy all addresses from one list to another list. * @dev Note: If used to copy adddresses to an existing list the current list contents will not be * @dev deleted before copying. New addresses will be appeneded to the end of the list and the * @dev non-enumerable mapping key value will be set to true. * * @dev <h4>Postconditions:</h4> * 1. Addresses in from list that are not already present in to list are added to the to list. * 2. Emits an `AddedAccountToList` event for each address copied to the list. * * @param listType The type of list addresses are being copied from and to. * @param destinationListId The id of the list being copied to. * @param ptrFromList The storage pointer for the list being copied from. * @param ptrToList The storage pointer for the list being copied to. */ function _copyAddressSet( uint8 listType, uint120 destinationListId, List storage ptrFromList, List storage ptrToList ) private { EnumerableSet.AddressSet storage ptrFromSet = ptrFromList.enumerableAccounts; EnumerableSet.AddressSet storage ptrToSet = ptrToList.enumerableAccounts; mapping (address => bool) storage ptrToNonEnumerableSet = ptrToList.nonEnumerableAccounts; uint256 sourceLength = ptrFromSet.length(); address account; for (uint256 i = 0; i < sourceLength;) { account = ptrFromSet.at(i); if (ptrToSet.add(account)) { emit AddedAccountToList(listType, destinationListId, account); ptrToNonEnumerableSet[account] = true; } unchecked { ++i; } } } /** * @notice Copies all codehashes in `ptrFromList` to `ptrToList`. * * @dev This function will copy all codehashes from one list to another list. * @dev Note: If used to copy codehashes to an existing list the current list contents will not be * @dev deleted before copying. New codehashes will be appeneded to the end of the list and the * @dev non-enumerable mapping key value will be set to true. * * @dev <h4>Postconditions:</h4> * 1. Codehashes in from list that are not already present in to list are added to the to list. * 2. Emits an `AddedCodeHashToList` event for each codehash copied to the list. * * @param listType The type of list codehashes are being copied from and to. * @param destinationListId The id of the list being copied to. * @param ptrFromList The storage pointer for the list being copied from. * @param ptrToList The storage pointer for the list being copied to. */ function _copyBytes32Set( uint8 listType, uint120 destinationListId, List storage ptrFromList, List storage ptrToList ) private { EnumerableSet.Bytes32Set storage ptrFromSet = ptrFromList.enumerableCodehashes; EnumerableSet.Bytes32Set storage ptrToSet = ptrToList.enumerableCodehashes; mapping (bytes32 => bool) storage ptrToNonEnumerableSet = ptrToList.nonEnumerableCodehashes; uint256 sourceLength = ptrFromSet.length(); bytes32 codehash; for (uint256 i = 0; i < sourceLength;) { codehash = ptrFromSet.at(i); if (ptrToSet.add(codehash)) { emit AddedCodeHashToList(listType, destinationListId, codehash); ptrToNonEnumerableSet[codehash] = true; } unchecked { ++i; } } } /** * @notice Adds one or more accounts to a list. * * @dev <h4>Postconditions:</h4> * 1. Accounts that were not previously in the list are added to the list. * 2. An `AddedAccountToList` event is emitted for each account that was not * previously on the list. * * @param list The storage pointer for the list to add accounts to. * @param listType The type of list the accounts are being added to. * @param id The id of the list the accounts are being added to. * @param accounts An array of accounts to add to the list. */ function _addAccountsToList( List storage list, uint8 listType, uint120 id, address[] calldata accounts ) internal onlyListOwner(id) { address account; for (uint256 i = 0; i < accounts.length;) { account = accounts[i]; if (list.enumerableAccounts.add(account)) { emit AddedAccountToList(listType, id, account); list.nonEnumerableAccounts[account] = true; } unchecked { ++i; } } } /** * @notice Adds one or more codehashes to a list. * * @dev <h4>Postconditions:</h4> * 1. Codehashes that were not previously in the list are added to the list. * 2. An `AddedCodeHashToList` event is emitted for each codehash that was not * previously on the list. * * @param list The storage pointer for the list to add codehashes to. * @param listType The type of list the codehashes are being added to. * @param id The id of the list the codehashes are being added to. * @param codehashes An array of codehashes to add to the list. */ function _addCodeHashesToList( List storage list, uint8 listType, uint120 id, bytes32[] calldata codehashes ) internal onlyListOwner(id) { bytes32 codehash; for (uint256 i = 0; i < codehashes.length;) { codehash = codehashes[i]; if (list.enumerableCodehashes.add(codehash)) { emit AddedCodeHashToList(listType, id, codehash); list.nonEnumerableCodehashes[codehash] = true; } unchecked { ++i; } } } /** * @notice Removes one or more accounts from a list. * * @dev <h4>Postconditions:</h4> * 1. Accounts that were previously in the list are removed from the list. * 2. An `RemovedAccountFromList` event is emitted for each account that was * previously on the list. * * @param list The storage pointer for the list to remove accounts from. * @param listType The type of list the accounts are being removed from. * @param id The id of the list the accounts are being removed from. * @param accounts An array of accounts to remove from the list. */ function _removeAccountsFromList( List storage list, uint8 listType, uint120 id, address[] memory accounts ) internal onlyListOwner(id) { address account; for (uint256 i = 0; i < accounts.length;) { account = accounts[i]; if (list.enumerableAccounts.remove(account)) { emit RemovedAccountFromList(listType, id, account); delete list.nonEnumerableAccounts[account]; } unchecked { ++i; } } } /** * @notice Removes one or more codehashes from a list. * * @dev <h4>Postconditions:</h4> * 1. Codehashes that were previously in the list are removed from the list. * 2. An `RemovedCodeHashFromList` event is emitted for each codehash that was * previously on the list. * * @param list The storage pointer for the list to remove codehashes from. * @param listType The type of list the codehashes are being removed from. * @param id The id of the list the codehashes are being removed from. * @param codehashes An array of codehashes to remove from the list. */ function _removeCodeHashesFromList( List storage list, uint8 listType, uint120 id, bytes32[] calldata codehashes ) internal onlyListOwner(id) { bytes32 codehash; for (uint256 i = 0; i < codehashes.length;) { codehash = codehashes[i]; if (list.enumerableCodehashes.remove(codehash)) { emit RemovedCodeHashFromList(listType, id, codehash); delete list.nonEnumerableCodehashes[codehash]; } unchecked { ++i; } } } /** * @notice Sets the owner of list `id` to `newOwner`. * * @dev Throws when the caller is not the owner of the list. * * @dev <h4>Postconditions:</h4> * 1. The owner of list `id` is set to `newOwner`. * 2. Emits a `ReassignedListOwnership` event. * * @param id The id of the list to reassign ownership of. * @param newOwner The account to assign ownership of the list to. */ function _reassignOwnershipOfList(uint120 id, address newOwner) private { if (id == DEFAULT_LIST_ID) { revert CreatorTokenTransferValidator__CannotReassignOwnershipOfDefaultList(); } _requireCallerOwnsList(id); listOwners[id] = newOwner; emit ReassignedListOwnership(id, newOwner); } /** * @notice Requires the caller to be the owner of list `id`. * * @dev Throws when the caller is not the owner of the list. * * @param id The id of the list to check ownership of. */ function _requireCallerOwnsList(uint120 id) private view { if (msg.sender != listOwners[id]) { revert CreatorTokenTransferValidator__CallerDoesNotOwnList(); } } /** * @dev Internal function used to efficiently retrieve the code length of `account`. * * @param account The address to get the deployed code length for. * * @return length The length of deployed code at the address. */ function _getCodeLengthAsm(address account) internal view returns (uint256 length) { assembly { length := extcodesize(account) } } /** * @dev Internal function used to efficiently retrieve the codehash of `account`. * * @param account The address to get the deployed codehash for. * * @return codehash The codehash of the deployed code at the address. */ function _getCodeHashAsm(address account) internal view returns (bytes32 codehash) { assembly { codehash := extcodehash(account) } } /** * @dev Hook that is called before any permitted token transfer that goes through Permit-C. * Applies the collection transfer policy, using the operator that called Permit-C as the caller. * This allows creator token standard protections to extend to permitted transfers. * * @param token The collection address of the token being transferred. * @param from The address of the token owner. * @param to The address of the token receiver. * @param id The token id being transferred. */ function _beforeTransferFrom( uint256 tokenType, address token, address from, address to, uint256 id, uint256 /*amount*/ ) internal override returns (bool isError) { (bytes4 selector, uint16 collectionTokenType) = _validateTransfer(_callerAuthorizedCheckToken, token, msg.sender, from, to, id); if (collectionTokenType == DEFAULT_TOKEN_TYPE || collectionTokenType == tokenType) { isError = SELECTOR_NO_ERROR != selector; } else { revert CreatorTokenTransferValidator__TokenTypesDoNotMatch(); } } /** * @notice Apply the collection transfer policy to a transfer operation of a creator token. * * @dev If the caller is self (Permit-C Processor) it means we have already applied operator validation in the * _beforeTransferFrom callback. In this case, the security policy was already applied and the operator * that used the Permit-C processor passed the security policy check and transfer can be safely allowed. * * @dev The order of checking whitelisted accounts, authorized operator check and whitelisted codehashes * is very deliberate. The order of operations is determined by the most frequently used settings that are * expected in the wild. * * @dev Throws when the collection has enabled account freezing mode and either the `from` or `to` addresses * are on the list of frozen accounts for the collection. * @dev Throws when the collection is set to Level 9 - Soulbound Token. * @dev Throws when the receiver has deployed code and isn't whitelisted, if ReceiverConstraints.NoCode is set * and the transfer is not approved by an authorizer for the collection. * @dev Throws when the receiver has never verified a signature to prove they are an EOA and the receiver * isn't whitelisted, if the ReceiverConstraints.EOA is set and the transfer is not approved by an * authorizer for the collection.. * @dev Throws when `msg.sender` is blacklisted, if CallerConstraints.OperatorBlacklistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when `msg.sender` isn't whitelisted, if CallerConstraints.OperatorWhitelistEnableOTC is set, unless * `msg.sender` is also the `from` address or the transfer is approved by an authorizer for the collection. * @dev Throws when neither `msg.sender` nor `from` are whitelisted, if * CallerConstraints.OperatorWhitelistDisableOTC is set and the transfer * is not approved by an authorizer for the collection. * * @dev <h4>Postconditions:</h4> * 1. Transfer is allowed or denied based on the applied transfer policy. * * @param collection The collection address of the token being transferred. * @param caller The address initiating the transfer. * @param from The address of the token owner. * @param to The address of the token receiver. * @param tokenId The token id being transferred. * * @return The selector value for an error if the transfer is not allowed, `SELECTOR_NO_ERROR` if the transfer is allowed. */ function _validateTransfer( function(address,address,uint256) internal view returns(bool) _callerAuthorizedParam, address collection, address caller, address from, address to, uint256 tokenId ) internal view returns (bytes4,uint16) { if (caller == address(this)) { // If the caller is self (Permit-C Processor) it means we have already applied operator validation in the // _beforeTransferFrom callback. In this case, the security policy was already applied and the operator // that used the Permit-C processor passed the security policy check and transfer can be safely allowed. return (SELECTOR_NO_ERROR, DEFAULT_TOKEN_TYPE); } CollectionSecurityPolicyV3 storage collectionSecurityPolicy = collectionSecurityPolicies[collection]; uint120 listId = collectionSecurityPolicy.listId; (uint256 callerConstraints, uint256 receiverConstraints) = transferSecurityPolicies(collectionSecurityPolicy.transferSecurityLevel); if (collectionSecurityPolicy.enableAccountFreezingMode) { AccountList storage frozenAccountList = frozenAccounts[collection]; if (frozenAccountList.nonEnumerableAccounts[from]) { return (CreatorTokenTransferValidator__SenderAccountIsFrozen.selector, DEFAULT_TOKEN_TYPE); } if (frozenAccountList.nonEnumerableAccounts[to]) { return (CreatorTokenTransferValidator__ReceiverAccountIsFrozen.selector, DEFAULT_TOKEN_TYPE); } } if (callerConstraints == CALLER_CONSTRAINTS_SBT) { return (CreatorTokenTransferValidator__TokenIsSoulbound.selector, DEFAULT_TOKEN_TYPE); } List storage whitelist = whitelists[listId]; if (receiverConstraints == RECEIVER_CONSTRAINTS_NO_CODE) { if (_getCodeLengthAsm(to) > 0) { if (!whitelist.nonEnumerableAccounts[to]) { // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(!_callerAuthorized(collection, caller, tokenId)) { if (!whitelist.nonEnumerableCodehashes[_getCodeHashAsm(to)]) { return (CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode.selector, DEFAULT_TOKEN_TYPE); } } } } } else if (receiverConstraints == RECEIVER_CONSTRAINTS_EOA) { if (!isVerifiedEOA(to)) { if (!whitelist.nonEnumerableAccounts[to]) { // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(!_callerAuthorized(collection, caller, tokenId)) { if (!whitelist.nonEnumerableCodehashes[_getCodeHashAsm(to)]) { return (CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified.selector, DEFAULT_TOKEN_TYPE); } } } } } if (caller == from) { if (callerConstraints != CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } } if (callerConstraints == CALLER_CONSTRAINTS_OPERATOR_BLACKLIST_ENABLE_OTC) { // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(_callerAuthorized(collection, caller, tokenId)) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } List storage blacklist = blacklists[listId]; if (blacklist.nonEnumerableAccounts[caller]) { return (CreatorTokenTransferValidator__OperatorIsBlacklisted.selector, DEFAULT_TOKEN_TYPE); } if (blacklist.nonEnumerableCodehashes[_getCodeHashAsm(caller)]) { return (CreatorTokenTransferValidator__OperatorIsBlacklisted.selector, DEFAULT_TOKEN_TYPE); } } else if (callerConstraints == CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC) { if (whitelist.nonEnumerableAccounts[caller]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if( _callerAuthorized(collection, caller, tokenId)) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } if (whitelist.nonEnumerableCodehashes[_getCodeHashAsm(caller)]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } return (CreatorTokenTransferValidator__CallerMustBeWhitelisted.selector, DEFAULT_TOKEN_TYPE); } else if (callerConstraints == CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC) { mapping(address => bool) storage accountWhitelist = whitelist.nonEnumerableAccounts; if (accountWhitelist[caller]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } if (accountWhitelist[from]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } // Cache _callerAuthorizedParam on stack to avoid stack too deep function(address,address,uint256) internal view returns(bool) _callerAuthorized = _callerAuthorizedParam; if(_callerAuthorized(collection, caller, tokenId)) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } mapping(bytes32 => bool) storage codehashWhitelist = whitelist.nonEnumerableCodehashes; // Cache caller on stack to avoid stack too deep address tmpAddress = caller; if (codehashWhitelist[_getCodeHashAsm(tmpAddress)]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } // Cache from on stack to avoid stack too deep tmpAddress = from; if (codehashWhitelist[_getCodeHashAsm(tmpAddress)]) { return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } return (CreatorTokenTransferValidator__CallerMustBeWhitelisted.selector, DEFAULT_TOKEN_TYPE); } return (SELECTOR_NO_ERROR, collectionSecurityPolicy.tokenType); } /** * @dev Internal function used to efficiently revert with a custom error selector. * * @param errorSelector The error selector to revert with. */ function _revertCustomErrorSelectorAsm(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } /** * @dev Internal function used to check if authorization mode can be activated for a transfer. * * @dev Throws when the collection has not enabled authorization mode. * @dev Throws when the wildcard operator is being set for a collection that does not * allow wildcard operators. * @dev Throws when the authorizer is not in the list of approved authorizers for * the collection. * * @param collection The collection address to activate authorization mode for a transfer. * @param operator The operator specified by the authorizer to allow transfers. * @param authorizer The address of the authorizer making the call. */ function _checkCollectionAllowsAuthorizerAndOperator( address collection, address operator, address authorizer ) internal view { CollectionSecurityPolicyV3 storage collectionSecurityPolicy = collectionSecurityPolicies[collection]; if (collectionSecurityPolicy.disableAuthorizationMode) { revert CreatorTokenTransferValidator__AuthorizationDisabledForCollection(); } if (collectionSecurityPolicy.authorizersCannotSetWildcardOperators) { if (operator == WILDCARD_OPERATOR_ADDRESS) { revert CreatorTokenTransferValidator__WildcardOperatorsCannotBeAuthorizedForCollection(); } } if (!authorizers[collectionSecurityPolicy.listId].nonEnumerableAccounts[authorizer]) { revert CreatorTokenTransferValidator__CallerMustBeAnAuthorizer(); } } /** * @dev Modifier to apply the allowed authorizer and operator for collection checks. * * @dev Throws when the collection has not enabled authorization mode. * @dev Throws when the wildcard operator is being set for a collection that does not * allow wildcard operators. * @dev Throws when the authorizer is not in the list of approved authorizers for * the collection. * * @param collection The collection address to activate authorization mode for a transfer. * @param operator The operator specified by the authorizer to allow transfers. * @param authorizer The address of the authorizer making the call. */ modifier whenAuthorizerAndOperatorEnabledForCollection( address collection, address operator, address authorizer ) { _checkCollectionAllowsAuthorizerAndOperator(collection, operator, authorizer); _; } /** * @dev Internal function for setting the authorized operator in storage for a token and collection. * * @param operator The allowed operator for an authorized transfer. * @param collection The address of the collection that the operator is authorized for. * @param tokenId The id of the token that is authorized. * @param allowAnyTokenId Flag if the authorizer is enabling transfers for any token id */ function _setOperatorInTransientStorage( address operator, address collection, uint256 tokenId, bool allowAnyTokenId ) internal whenAuthorizerAndOperatorEnabledForCollection(collection, operator, msg.sender) { _setTstorish(_getTransientOperatorSlot(collection), (allowAnyTokenId ? 1 << 255 : 0) | uint256(uint160(operator))); _setTstorish(_getTransientOperatorSlot(collection, tokenId), uint256(uint160(operator))); } /** * @dev Internal function to check if a caller is an authorized operator for the token being transferred. * * @param caller The caller of the token transfer. * @param collection The collection address of the token being transferred. * @param tokenId The id of the token being transferred. * * @return isAuthorized True if the caller is authorized to transfer the token, false otherwise. */ function _callerAuthorizedCheckToken( address collection, address caller, uint256 tokenId ) internal view returns (bool isAuthorized) { uint256 slotValue; (isAuthorized, ) = _callerAuthorized(caller, _getTransientOperatorSlot(collection, tokenId)); if (isAuthorized) return true; (isAuthorized, slotValue) = _callerAuthorized(caller, _getTransientOperatorSlot(collection)); isAuthorized = isAuthorized && slotValue >> 255 == 1; } /** * @dev Internal function to check if a caller is an authorized operator for the collection being transferred. * * @param caller The caller of the token transfer. * @param collection The collection address of the token being transferred. * * @return isAuthorized True if the caller is authorized to transfer the collection, false otherwise. */ function _callerAuthorizedCheckCollection( address collection, address caller, uint256 /*tokenId*/ ) internal view returns (bool isAuthorized) { (isAuthorized, ) = _callerAuthorized(caller, _getTransientOperatorSlot(collection)); } /** * @dev Internal function to check if a caller is an authorized operator. * @dev This overload of `_callerAuthorized` checks a specific storage slot for the caller address. * * @param caller The caller of the token transfer. * @param slot The storage slot to check for the caller address. * * @return isAuthorized True if the caller is authorized to transfer the token, false otherwise. * @return slotValue The transient storage value in `slot`, used to check for allow any token id flag if necessary. */ function _callerAuthorized(address caller, uint256 slot) internal view returns (bool isAuthorized, uint256 slotValue) { slotValue = _getTstorish(slot); address authorizedOperator = address(uint160(slotValue)); isAuthorized = authorizedOperator == WILDCARD_OPERATOR_ADDRESS || authorizedOperator == caller; } /** * @dev Internal function used to compute the transient storage slot for the authorized * operator of a token in a collection. * * @param collection The collection address of the token being transferred. * @param tokenId The id of the token being transferred. * * @return operatorSlot The storage slot location for the authorized operator value. */ function _getTransientOperatorSlot( address collection, uint256 tokenId ) internal pure returns (uint256 operatorSlot) { assembly { mstore(0x00, collection) mstore(0x20, tokenId) operatorSlot := shr(4, keccak256(0x00, 0x40)) } } /** * @dev Internal function used to compute the transient storage slot for the authorized operator of a collection. * * @param collection The collection address of the token being transferred. * * @return operatorSlot The storage slot location for the authorized operator value. */ function _getTransientOperatorSlot(address collection) internal pure returns (uint256 operatorSlot) { assembly { mstore(0x00, collection) mstore(0x20, _transientOperatorSlotHolder.slot) operatorSlot := keccak256(0x00, 0x40) } } /** * @dev A gas efficient, and fallback-safe way to call the owner function on a token contract. * This will get the owner if it exists - and when the function is unimplemented, the * presence of a fallback function will not result in halted execution. * * @param tokenAddress The address of the token collection to get the owner of. * * @return owner The owner of the token collection contract. * @return isError True if there was an error in retrieving the owner, false if the call was successful. */ function _safeOwner( address tokenAddress ) internal view returns(address owner, bool isError) { assembly { function _callOwner(_tokenAddress) -> _owner, _isError { mstore(0x00, 0x8da5cb5b) if and(iszero(lt(returndatasize(), 0x20)), staticcall(gas(), _tokenAddress, 0x1C, 0x04, 0x00, 0x20)) { _owner := mload(0x00) leave } _isError := true } owner, isError := _callOwner(tokenAddress) } } /** * @dev A gas efficient, and fallback-safe way to call the hasRole function on a token contract. * This will check if the account `hasRole` if `hasRole` exists - and when the function is unimplemented, the * presence of a fallback function will not result in halted execution. * * @param tokenAddress The address of the token collection to call hasRole on. * @param role The role to check if the account has on the collection. * @param account The address of the account to check if they have a specified role. * * @return hasRole The owner of the token collection contract. * @return isError True if there was an error in retrieving the owner, false if the call was successful. */ function _safeHasRole( address tokenAddress, bytes32 role, address account ) internal view returns(bool hasRole, bool isError) { assembly { function _callHasRole(_tokenAddress, _role, _account) -> _hasRole, _isError { let ptr := mload(0x40) mstore(0x40, add(ptr, 0x60)) mstore(ptr, 0x91d14854) mstore(add(0x20, ptr), _role) mstore(add(0x40, ptr), _account) if and(iszero(lt(returndatasize(), 0x20)), staticcall(gas(), _tokenAddress, add(ptr, 0x1C), 0x44, 0x00, 0x20)) { _hasRole := mload(0x00) leave } _isError := true } hasRole, isError := _callHasRole(tokenAddress, role, account) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) pragma solidity ^0.8.0; import "../token/ERC1155/IERC1155.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /* @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ #@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@* @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ #@@ @@@@@@@@@@@@/ @@@@@@@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@&%%%%%%%%&&@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@& @@@@@@@@@@@@@@ *@@@@@@@ (@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@% @@@@@@@@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ * @title CollateralizedPausableFlags * @custom:version 1.0.0 * @author Limit Break, Inc. * @description Collateralized Pausable Flags is an extension for contracts * that require features to be pausable in the event of potential * or actual threats without incurring a storage read overhead cost * during normal operations by using contract starting balance as * a signal for checking the paused state. * * Using contract balance to enable checking paused state creates an * economic penalty for developers that deploy code that can be * exploited as well as an economic incentive (recovery of collateral) * for them to mitigate the threat. * * Developers implementing Collateralized Pausable Flags should consider * their risk mitigation strategy and ensure funds are readily available * for pausing if ever necessary by setting an appropriate threshold * value and considering use of an escrow contract that can initiate the * pause with funds. * * There is no restriction on the depositor as this can be easily * circumvented through a `SELFDESTRUCT` opcode. * * Developers must be aware of potential outflows from the contract that * could reduce collateral below the pausable check threshold and protect * against those methods when pausing is required. */ abstract contract CollateralizedPausableFlags { /// @dev Emitted when the pausable flags are updated event PausableFlagsUpdated(uint256 previousFlags, uint256 newFlags); /// @dev Thrown when an execution path requires a flag to not be paused but it is paused error CollateralizedPausableFlags__Paused(); /// @dev Thrown when an executin path requires a flag to be paused but it is not paused error CollateralizedPausableFlags__NotPaused(); /// @dev Thrown when a call to withdraw funds fails error CollateralizedPausableFlags__WithdrawFailed(); /// @dev Immutable variable that defines the native funds threshold before flags are checked uint256 private immutable nativeValueToCheckPauseState; /// @dev Flags for current pausable state, each bit is considered a separate flag uint256 private pausableFlags; /// @dev Immutable pointer for the _requireNotPaused function to use based on value threshold function(uint256) internal view immutable _requireNotPaused; /// @dev Immutable pointer for the _requirePaused function to use based on value threshold function(uint256) internal view immutable _requirePaused; /// @dev Immutable pointer for the _getPausableFlags function to use based on value threshold function() internal view returns (uint256) immutable _getPausableFlags; constructor(uint256 _nativeValueToCheckPauseState) { // Optimizes value check at runtime by reducing the stored immutable // value by 1 so that greater than can be used instead of greater // than or equal while allowing the deployment parameter to reflect // the value at which the deployer wants to trigger pause checking. // Example: // Constructed with a value of 1000 // Immutable value stored is 999 // State checking enabled at 1000 units deposited because // 1000 > 999 evaluates true if (_nativeValueToCheckPauseState > 0) { unchecked { _nativeValueToCheckPauseState -= 1; } _requireNotPaused = _requireNotPausedWithCollateralCheck; _requirePaused = _requirePausedWithCollateralCheck; _getPausableFlags = _getPausableFlagsWithCollateralCheck; } else { _requireNotPaused = _requireNotPausedWithoutCollateralCheck; _requirePaused = _requirePausedWithoutCollateralCheck; _getPausableFlags = _getPausableFlagsWithoutCollateralCheck; } nativeValueToCheckPauseState = _nativeValueToCheckPauseState; } /** * @dev Modifier to make a function callable only when the specified flags are not paused * @dev Throws when any of the flags specified are paused * * @param _flags The flags to check for pause state */ modifier whenNotPaused(uint256 _flags) { _requireNotPaused(_flags); _; } /** * @dev Modifier to make a function callable only when the specified flags are paused * @dev Throws when any of the flags specified are not paused * * @param _flags The flags to check for pause state */ modifier whenPaused(uint256 _flags) { _requirePaused(_flags); _; } /** * @dev Modifier to make a function callable only by a permissioned account * @dev Throws when the caller does not have permission */ modifier onlyPausePermissionedCaller() { _requireCallerHasPausePermissions(); _; } /** * @notice Updates the pausable flags settings * * @dev Throws when the caller does not have permission * @dev **NOTE:** Pausable flag settings will only take effect if contract balance exceeds * @dev `nativeValueToPause` * * @dev <h4>Postconditions:</h4> * @dev 1. address(this).balance increases by msg.value * @dev 2. `pausableFlags` is set to the new value * @dev 3. Emits a PausableFlagsUpdated event * * @param _pausableFlags The new pausable flags to set */ function pause(uint256 _pausableFlags) external payable onlyPausePermissionedCaller { _setPausableFlags(_pausableFlags); } /** * @notice Allows any account to supply funds for enabling the pausable checks * * @dev **NOTE:** The threshold check for pausable collateral does not pause * @dev any functions unless the associated pausable flag is set. */ function pausableDepositCollateral() external payable { // thank you for your contribution to safety } /** * @notice Resets all pausable flags to unpaused and withdraws funds * * @dev Throws when the caller does not have permission * * @dev <h4>Postconditions:</h4> * @dev 1. `pausableFlags` is set to zero * @dev 2. Emits a PausableFlagsUpdated event * @dev 3. Transfers `withdrawAmount` of native funds to `withdrawTo` if non-zero * * @param withdrawTo The address to withdraw the collateral to * @param withdrawAmount The amount of collateral to withdraw */ function unpause(address withdrawTo, uint256 withdrawAmount) external onlyPausePermissionedCaller { _setPausableFlags(0); if (withdrawAmount > 0) { (bool success, ) = withdrawTo.call{value: withdrawAmount}(""); if(!success) revert CollateralizedPausableFlags__WithdrawFailed(); } } /** * @notice Returns collateralized pausable configuration information * * @return _nativeValueToCheckPauseState The collateral required to enable pause state checking * @return _pausableFlags The current pausable flags set, only checked when collateral met */ function pausableConfigurationSettings() external view returns( uint256 _nativeValueToCheckPauseState, uint256 _pausableFlags ) { unchecked { _nativeValueToCheckPauseState = nativeValueToCheckPauseState + 1; _pausableFlags = pausableFlags; } } /** * @notice Updates the `pausableFlags` variable and emits a PausableFlagsUpdated event * * @param _pausableFlags The new pausable flags to set */ function _setPausableFlags(uint256 _pausableFlags) internal { uint256 previousFlags = pausableFlags; pausableFlags = _pausableFlags; emit PausableFlagsUpdated(previousFlags, _pausableFlags); } /** * @notice Checks the current pause state of the supplied flags and reverts if any are paused * * @dev *Should* be called prior to any transfers of native funds out of the contract for efficiency * @dev Throws when the native funds balance is greater than the value to enable pausing AND * @dev one or more of the supplied `_flags` is paused. * * @param _flags The flags to check for pause state */ function _requireNotPausedWithCollateralCheck(uint256 _flags) private view { if (_nativeBalanceSubMsgValue() > nativeValueToCheckPauseState) { if (pausableFlags & _flags > 0) { revert CollateralizedPausableFlags__Paused(); } } } /** * @notice Checks the current pause state of the supplied flags and reverts if any are paused * * @dev Throws when one or more of the supplied `_flags` is paused. * * @param _flags The flags to check for pause state */ function _requireNotPausedWithoutCollateralCheck(uint256 _flags) private view { if (pausableFlags & _flags > 0) { revert CollateralizedPausableFlags__Paused(); } } /** * @notice Checks the current pause state of the supplied flags and reverts if none are paused * * @dev *Should* be called prior to any transfers of native funds out of the contract for efficiency * @dev Throws when the native funds balance is not greater than the value to enable pausing OR * @dev none of the supplied `_flags` are paused. * * @param _flags The flags to check for pause state */ function _requirePausedWithCollateralCheck(uint256 _flags) private view { if (_nativeBalanceSubMsgValue() <= nativeValueToCheckPauseState) { revert CollateralizedPausableFlags__NotPaused(); } else if (pausableFlags & _flags == 0) { revert CollateralizedPausableFlags__NotPaused(); } } /** * @notice Checks the current pause state of the supplied flags and reverts if none are paused * * @dev Throws when none of the supplied `_flags` are paused. * * @param _flags The flags to check for pause state */ function _requirePausedWithoutCollateralCheck(uint256 _flags) private view { if (pausableFlags & _flags == 0) { revert CollateralizedPausableFlags__NotPaused(); } } /** * @notice Returns the current state of the pausable flags * * @dev Will return zero if the native funds balance is not greater than the value to enable pausing * * @return _pausableFlags The current state of the pausable flags */ function _getPausableFlagsWithCollateralCheck() private view returns(uint256 _pausableFlags) { if (_nativeBalanceSubMsgValue() > nativeValueToCheckPauseState) { _pausableFlags = pausableFlags; } } /** * @notice Returns the current state of the pausable flags * * @return _pausableFlags The current state of the pausable flags */ function _getPausableFlagsWithoutCollateralCheck() private view returns(uint256 _pausableFlags) { _pausableFlags = pausableFlags; } /** * @notice Returns the current contract balance minus the value sent with the call * * @dev This is expected to be the contract balance at the beginning of a function call * @dev to efficiently determine whether a contract has the necessary collateral to enable * @dev the pausable flags checking for contracts that hold native token funds. * @dev This should **NOT** be used in any way to determine current balance for contract logic * @dev other than its intended purpose for pause state checking activation. */ function _nativeBalanceSubMsgValue() private view returns (uint256 _value) { unchecked { _value = address(this).balance - msg.value; } } /** * @dev To be implemented by an inheriting contract for authorization to `pause` and `unpause` * @dev functions as well as any functions in the inheriting contract that utilize the * @dev `onlyPausePermissionedCaller` modifier. * * @dev Implementing contract function **MUST** throw when the caller is not permissioned */ function _requireCallerHasPausePermissions() internal view virtual; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Constant bytes32 value of 0x000...000 bytes32 constant ZERO_BYTES32 = bytes32(0); /// @dev Constant value of 0 uint256 constant ZERO = 0; /// @dev Constant value of 1 uint256 constant ONE = 1; /// @dev Constant value representing an open order in storage uint8 constant ORDER_STATE_OPEN = 0; /// @dev Constant value representing a filled order in storage uint8 constant ORDER_STATE_FILLED = 1; /// @dev Constant value representing a cancelled order in storage uint8 constant ORDER_STATE_CANCELLED = 2; /// @dev Constant value representing the ERC721 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC721 = 721; /// @dev Constant value representing the ERC1155 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC1155 = 1155; /// @dev Constant value representing the ERC20 token type for signatures and transfer hooks uint256 constant TOKEN_TYPE_ERC20 = 20; /// @dev Constant value to mask the upper bits of a signature that uses a packed `vs` value to extract `s` bytes32 constant UPPER_BIT_MASK = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @dev EIP-712 typehash used for validating signature based stored approvals bytes32 constant UPDATE_APPROVAL_TYPEHASH = keccak256("UpdateApprovalBySignature(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 approvalExpiration,uint256 sigDeadline,uint256 masterNonce)"); /// @dev EIP-712 typehash used for validating a single use permit without additional data bytes32 constant SINGLE_USE_PERMIT_TYPEHASH = keccak256("PermitTransferFrom(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 expiration,uint256 masterNonce)"); /// @dev EIP-712 typehash used for validating a single use permit with additional data string constant SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB = "PermitTransferFromWithAdditionalData(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 nonce,address operator,uint256 expiration,uint256 masterNonce,"; /// @dev EIP-712 typehash used for validating an order permit that updates storage as it fills string constant PERMIT_ORDER_ADVANCED_TYPEHASH_STUB = "PermitOrderWithAdditionalData(uint256 tokenType,address token,uint256 id,uint256 amount,uint256 salt,address operator,uint256 expiration,uint256 masterNonce,"; /// @dev Pausable flag for stored approval transfers of ERC721 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721 = 1 << 0; /// @dev Pausable flag for stored approval transfers of ERC1155 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155 = 1 << 1; /// @dev Pausable flag for stored approval transfers of ERC20 assets uint256 constant PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20 = 1 << 2; /// @dev Pausable flag for single use permit transfers of ERC721 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721 = 1 << 3; /// @dev Pausable flag for single use permit transfers of ERC1155 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155 = 1 << 4; /// @dev Pausable flag for single use permit transfers of ERC20 assets uint256 constant PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20 = 1 << 5; /// @dev Pausable flag for order fill transfers of ERC1155 assets uint256 constant PAUSABLE_ORDER_TRANSFER_FROM_ERC1155 = 1 << 6; /// @dev Pausable flag for order fill transfers of ERC20 assets uint256 constant PAUSABLE_ORDER_TRANSFER_FROM_ERC20 = 1 << 7;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Storage data struct for stored approvals and order approvals struct PackedApproval { // Only used for partial fill position 1155 transfers uint8 state; // Amount allowed uint200 amount; // Permission expiry uint48 expiration; } /// @dev Calldata data struct for order fill amounts struct OrderFillAmounts { uint256 orderStartAmount; uint256 requestedFillAmount; uint256 minimumFillAmount; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @dev Thrown when a stored approval exceeds type(uint200).max error PermitC__AmountExceedsStorageMaximum(); /// @dev Thrown when a transfer amount requested exceeds the permitted amount error PermitC__ApprovalTransferExceededPermittedAmount(); /// @dev Thrown when a transfer is requested after the permit has expired error PermitC__ApprovalTransferPermitExpiredOrUnset(); /// @dev Thrown when attempting to close an order by an account that is not the owner or operator error PermitC__CallerMustBeOwnerOrOperator(); /// @dev Thrown when attempting to approve a token type that is not valid for PermitC error PermitC__InvalidTokenType(); /// @dev Thrown when attempting to invalidate a nonce that has already been used error PermitC__NonceAlreadyUsedOrRevoked(); /// @dev Thrown when attempting to restore a nonce that has not been used error PermitC__NonceNotUsedOrRevoked(); /// @dev Thrown when attempting to fill an order that has already been filled or cancelled error PermitC__OrderIsEitherCancelledOrFilled(); /// @dev Thrown when a transfer amount requested exceeds the permitted amount error PermitC__SignatureTransferExceededPermittedAmount(); /// @dev Thrown when a transfer is requested after the permit has expired error PermitC__SignatureTransferExceededPermitExpired(); /// @dev Thrown when attempting to use an advanced permit typehash that is not registered error PermitC__SignatureTransferPermitHashNotRegistered(); /// @dev Thrown when a permit signature is invalid error PermitC__SignatureTransferInvalidSignature(); /// @dev Thrown when the remaining fill amount is less than the requested minimum fill error PermitC__UnableToFillMinimumRequestedQuantity();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "./Errors.sol"; import {IERC20} from "@openzeppelin/contracts/interfaces/IERC20.sol"; import {IERC721} from "@openzeppelin/contracts/interfaces/IERC721.sol"; import {IERC1155} from "@openzeppelin/contracts/interfaces/IERC1155.sol"; import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol"; import {Ownable} from "./openzeppelin-optimized/Ownable.sol"; import {EIP712} from "./openzeppelin-optimized/EIP712.sol"; import { ZERO_BYTES32, ZERO, ONE, ORDER_STATE_OPEN, ORDER_STATE_FILLED, ORDER_STATE_CANCELLED, SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB, PERMIT_ORDER_ADVANCED_TYPEHASH_STUB, UPPER_BIT_MASK, TOKEN_TYPE_ERC1155, TOKEN_TYPE_ERC20, TOKEN_TYPE_ERC721, PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721, PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155, PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20, PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721, PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155, PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20, PAUSABLE_ORDER_TRANSFER_FROM_ERC1155, PAUSABLE_ORDER_TRANSFER_FROM_ERC20 } from "./Constants.sol"; import {PackedApproval, OrderFillAmounts} from "./DataTypes.sol"; import {PermitHash} from './libraries/PermitHash.sol'; import {IPermitC} from './interfaces/IPermitC.sol'; import {CollateralizedPausableFlags} from './CollateralizedPausableFlags.sol'; /* @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ #@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@* @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@ @@@@@@@@@@@@@@@ #@@ @@@@@@@@@@@@/ @@@@@@@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@&%%%%%%%%&&@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@@@@@& @@@@@@@@@@@@@@ *@@@@@@@ (@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@% @@@@@@@@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ * @title PermitC * @custom:version 1.0.0 * @author Limit Break, Inc. * @description Advanced approval management for ERC20, ERC721 and ERC1155 tokens * allowing for single use permit transfers, time-bound approvals * and order ID based transfers. */ contract PermitC is Ownable, CollateralizedPausableFlags, EIP712, IPermitC { /** * @notice Map of approval details for the provided bytes32 hash to allow for multiple accessors * * @dev keccak256(abi.encode(owner, tokenType, token, id, orderId, masterNonce)) => * @dev operator => (state, amount, expiration) * @dev Utilized for stored approvals by an owner's direct call to `approve` and * @dev approvals by signature in `updateApprovalBySignature`. Both methods use a * @dev bytes32(0) value for the `orderId`. */ mapping(bytes32 => mapping(address => PackedApproval)) private _transferApprovals; /** * @notice Map of approval details for the provided bytes32 hash to allow for multiple accessors * * @dev keccak256(abi.encode(owner, tokenType, token, id, orderId, masterNonce)) => * @dev operator => (state, amount, expiration) * @dev Utilized for order approvals by `fillPermittedOrderERC20` and `fillPermittedOrderERC1155` * @dev with the `orderId` provided by the sender. */ mapping(bytes32 => mapping(address => PackedApproval)) private _orderApprovals; /** * @notice Map of registered additional data hashes for transfer permits. * * @dev This is used to prevent someone from providing an invalid EIP712 envelope label * @dev and tricking a user into signing a different message than they expect. */ mapping(bytes32 => bool) private _registeredTransferHashes; /** * @notice Map of registered additional data hashes for order permits. * * @dev This is used to prevent someone from providing an invalid EIP712 envelope label * @dev and tricking a user into signing a different message than they expect. */ mapping(bytes32 => bool) private _registeredOrderHashes; /// @dev Map of an address to a bitmap (slot => status) mapping(address => mapping(uint256 => uint256)) private _unorderedNonces; /** * @notice Master nonce used to invalidate all outstanding approvals for an owner * * @dev owner => masterNonce * @dev This is incremented when the owner calls lockdown() */ mapping(address => uint256) private _masterNonces; constructor( string memory name, string memory version, address _defaultContractOwner, uint256 _nativeValueToCheckPauseState ) CollateralizedPausableFlags(_nativeValueToCheckPauseState) EIP712(name, version) { _transferOwnership(_defaultContractOwner); } /** * ================================================= * ================= Modifiers ===================== * ================================================= */ modifier onlyRegisteredTransferAdvancedTypeHash(bytes32 advancedPermitHash) { _requireTransferAdvancedPermitHashIsRegistered(advancedPermitHash); _; } modifier onlyRegisteredOrderAdvancedTypeHash(bytes32 advancedPermitHash) { _requireOrderAdvancedPermitHashIsRegistered(advancedPermitHash); _; } /** * ================================================= * ============== Approval Transfers =============== * ================================================= */ /** * @notice Approve an operator to spend a specific token / ID combination * @notice This function is compatible with ERC20, ERC721 and ERC1155 * @notice To give unlimited approval for ERC20 and ERC1155, set amount to type(uint200).max * @notice When approving an ERC721, you MUST set amount to `1` * @notice When approving an ERC20, you MUST set id to `0` * * @dev <h4>Postconditions:</h4> * @dev 1. Updates the approval for an operator to use an amount of a specific token / ID combination * @dev 2. If the expiration is 0, the approval is valid only in the context of the current block * @dev 3. If the expiration is not 0, the approval is valid until the expiration timestamp * @dev 4. If the provided amount is type(uint200).max, the approval is unlimited * * @param tokenType The type of token being approved - must be 20, 721 or 1155. * @param token The address of the token contract * @param id The token ID * @param operator The address of the operator * @param amount The amount of tokens to approve * @param expiration The expiration timestamp of the approval */ function approve( uint256 tokenType, address token, uint256 id, address operator, uint200 amount, uint48 expiration ) external { _requireValidTokenType(tokenType); _storeApproval(tokenType, token, id, amount, expiration, msg.sender, operator); } /** * @notice Use a signed permit to increase the allowance for a provided operator * @notice This function is compatible with ERC20, ERC721 and ERC1155 * @notice To give unlimited approval for ERC20 and ERC1155, set amount to type(uint200).max * @notice When approving an ERC721, you MUST set amount to `1` * @notice When approving an ERC20, you MUST set id to `0` * @notice An `approvalExpiration` of zero is considered an atomic permit which will use the * @notice current block time as the expiration time when storing the permit data. * * @dev - Throws if the permit has expired * @dev - Throws if the permit's nonce has already been used * @dev - Throws if the permit signature is does not recover to the provided owner * * @dev <h4>Postconditions:</h4> * @dev 1. Updates the approval for an operator to use an amount of a specific token / ID combination * @dev 3. Sets the expiration of the approval to the expiration timestamp of the permit * @dev 4. If the provided amount is type(uint200).max, the approval is unlimited * * @param tokenType The type of token being approved - must be 20, 721 or 1155. * @param token Address of the token to approve * @param id The token ID * @param nonce The nonce of the permit * @param amount The amount of tokens to approve * @param operator The address of the operator * @param approvalExpiration The expiration timestamp of the approval * @param sigDeadline The deadline timestamp for the permit signature * @param owner The owner of the tokens * @param signedPermit The permit signature, signed by the owner */ function updateApprovalBySignature( uint256 tokenType, address token, uint256 id, uint256 nonce, uint200 amount, address operator, uint48 approvalExpiration, uint48 sigDeadline, address owner, bytes calldata signedPermit ) external { if (block.timestamp > sigDeadline) { revert PermitC__ApprovalTransferPermitExpiredOrUnset(); } _requireValidTokenType(tokenType); _checkAndInvalidateNonce(owner, nonce); _verifyPermitSignature( _hashTypedDataV4( PermitHash.hashOnChainApproval( tokenType, token, id, amount, nonce, operator, approvalExpiration, sigDeadline, _masterNonces[owner] ) ), signedPermit, owner ); // Expiration of zero is considered an atomic permit which is only valid in the // current block. approvalExpiration = approvalExpiration == 0 ? uint48(block.timestamp) : approvalExpiration; _storeApproval(tokenType, token, id, amount, approvalExpiration, owner, operator); } /** * @notice Returns the amount of allowance an operator has and it's expiration for a specific token and id * @notice If the expiration on the allowance has expired, returns 0 * @notice To retrieve allowance for ERC20, set id to `0` * * @param owner The owner of the token * @param operator The operator of the token * @param tokenType The type of token the allowance is for * @param token The address of the token contract * @param id The token ID * * @return allowedAmount The amount of allowance the operator has * @return expiration The expiration timestamp of the allowance */ function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id ) external view returns (uint256 allowedAmount, uint256 expiration) { return _allowance(_transferApprovals, owner, operator, tokenType, token, id, ZERO_BYTES32); } /** * ================================================= * ================ Signed Transfers =============== * ================================================= */ /** * @notice Registers the combination of a provided string with the `SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB` * @notice and `PERMIT_ORDER_ADVANCED_TYPEHASH_STUB` to create valid additional data hashes * * @dev This function prevents malicious actors from changing the label of the EIP712 hash * @dev to a value that would fool an external user into signing a different message. * * @dev <h4>Postconditions:</h4> * @dev 1. The provided string is combined with the `SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB` string * @dev 2. The combined string is hashed using keccak256 * @dev 3. The resulting hash is added to the `_registeredTransferHashes` mapping * @dev 4. The provided string is combined with the `PERMIT_ORDER_ADVANCED_TYPEHASH_STUB` string * @dev 5. The combined string is hashed using keccak256 * @dev 6. The resulting hash is added to the `_registeredOrderHashes` mapping * * @param additionalDataTypeString The string to register as a valid additional data hash */ function registerAdditionalDataHash(string calldata additionalDataTypeString) external { _registeredTransferHashes[ keccak256( bytes( string.concat( SINGLE_USE_PERMIT_TRANSFER_ADVANCED_TYPEHASH_STUB, additionalDataTypeString ) ) ) ] = true; _registeredOrderHashes[ keccak256( bytes( string.concat( PERMIT_ORDER_ADVANCED_TYPEHASH_STUB, additionalDataTypeString ) ) ) ] = true; } /** * @notice Transfer an ERC721 token from the owner to the recipient using a permit signature. * * @dev Be advised that the permitted amount for ERC721 is always inferred to be 1, so signed permitted amount * @dev MUST always be set to 1. * * @dev - Throws if the permit is expired * @dev - Throws if the nonce has already been used * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount exceeds the permitted amount * @dev - Throws if the provided token address does not implement ERC721 transferFrom function * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token from the owner to the recipient * @dev 2. The nonce of the permit is marked as used * @dev 3. Performs any additional checks in the before and after hooks * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes calldata signedPermit ) external returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721); _checkPermitApproval(TOKEN_TYPE_ERC721, token, id, ONE, nonce, expiration, owner, ONE, signedPermit); isError = _transferFromERC721(owner, to, token, id); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfers an ERC721 token from the owner to the recipient using a permit signature * @notice This function includes additional data to verify on the signature, allowing * @notice protocols to extend the validation in one function call. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev Be advised that the permitted amount for ERC721 is always inferred to be 1, so signed permitted amount * @dev MUST always be set to 1. * * @dev - Throws for any reason permitTransferFromERC721 would. * @dev - Throws if the additional data does not match the signature * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Throws if the provided hash does not match the provided additional data * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token from the owner to the recipient * @dev 2. Performs any additional checks in the before and after hooks * @dev 3. The nonce of the permit is marked as used * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param additionalData The additional data to verify on the signature * @param advancedPermitHash The hash of the additional data * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromWithAdditionalDataERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external onlyRegisteredTransferAdvancedTypeHash(advancedPermitHash) returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC721); _checkPermitApprovalWithAdditionalDataERC721( token, id, ONE, nonce, expiration, owner, ONE, signedPermit, additionalData, advancedPermitHash ); isError = _transferFromERC721(owner, to, token, id); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfer an ERC1155 token from the owner to the recipient using a permit signature * * @dev - Throws if the permit is expired * @dev - Throws if the nonce has already been used * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount exceeds the permitted amount * @dev - Throws if the provided token address does not implement ERC1155 safeTransferFrom function * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. The nonce of the permit is marked as used * @dev 3. Performs any additional checks in the before and after hooks * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param transferAmount The amount of tokens to transfer * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155); _checkPermitApproval(TOKEN_TYPE_ERC1155, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit); isError = _transferFromERC1155(token, owner, to, id, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfers a token from the owner to the recipient using a permit signature * @notice This function includes additional data to verify on the signature, allowing * @notice protocols to extend the validation in one function call. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev - Throws for any reason permitTransferFrom would. * @dev - Throws if the additional data does not match the signature * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Throws if the provided hash does not match the provided additional data * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Performs any additional checks in the before and after hooks * @dev 3. The nonce of the permit is marked as used * * @param token The address of the token * @param id The ID of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param transferAmount The amount of tokens to transfer * @param additionalData The additional data to verify on the signature * @param advancedPermitHash The hash of the additional data * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromWithAdditionalDataERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external onlyRegisteredTransferAdvancedTypeHash(advancedPermitHash) returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC1155); _checkPermitApprovalWithAdditionalDataERC1155( token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); // copy id to top of stack to avoid stack too deep uint256 tmpId = id; isError = _transferFromERC1155(token, owner, to, tmpId, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfer an ERC20 token from the owner to the recipient using a permit signature. * * @dev Be advised that the token ID for ERC20 is always inferred to be 0, so signed token ID * @dev MUST always be set to 0. * * @dev - Throws if the permit is expired * @dev - Throws if the nonce has already been used * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount exceeds the permitted amount * @dev - Throws if the provided token address does not implement ERC20 transferFrom function * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token in the requested amount from the owner to the recipient * @dev 2. The nonce of the permit is marked as used * @dev 3. Performs any additional checks in the before and after hooks * * @param token The address of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20); _checkPermitApproval(TOKEN_TYPE_ERC20, token, ZERO, permitAmount, nonce, expiration, owner, transferAmount, signedPermit); isError = _transferFromERC20(token, owner, to, ZERO, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Transfers an ERC20 token from the owner to the recipient using a permit signature * @notice This function includes additional data to verify on the signature, allowing * @notice protocols to extend the validation in one function call. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev Be advised that the token ID for ERC20 is always inferred to be 0, so signed token ID * @dev MUST always be set to 0. * * @dev - Throws for any reason permitTransferFromERC20 would. * @dev - Throws if the additional data does not match the signature * @dev - Throws if the provided hash has not been registered as a valid additional data hash * @dev - Throws if the provided hash does not match the provided additional data * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Performs any additional checks in the before and after hooks * @dev 3. The nonce of the permit is marked as used * * @param token The address of the token * @param nonce The nonce of the permit * @param permitAmount The amount of tokens permitted by the owner * @param expiration The expiration timestamp of the permit * @param owner The owner of the token * @param to The address to transfer the tokens to * @param transferAmount The amount of tokens to transfer * @param additionalData The additional data to verify on the signature * @param advancedPermitHash The hash of the additional data * @param signedPermit The permit signature, signed by the owner * * @return isError True if the transfer failed, false otherwise */ function permitTransferFromWithAdditionalDataERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external onlyRegisteredTransferAdvancedTypeHash(advancedPermitHash) returns (bool isError) { _requireNotPaused(PAUSABLE_PERMITTED_TRANSFER_FROM_ERC20); _checkPermitApprovalWithAdditionalDataERC20( token, ZERO, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); isError = _transferFromERC20(token, owner, to, ZERO, transferAmount); if (isError) { _restoreNonce(owner, nonce); } } /** * @notice Returns true if the provided hash has been registered as a valid additional data hash for transfers. * * @param hash The hash to check * * @return isRegistered true if the hash is valid, false otherwise */ function isRegisteredTransferAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered) { isRegistered = _registeredTransferHashes[hash]; } /** * @notice Returns true if the provided hash has been registered as a valid additional data hash for orders. * * @param hash The hash to check * * @return isRegistered true if the hash is valid, false otherwise */ function isRegisteredOrderAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered) { isRegistered = _registeredOrderHashes[hash]; } /** * ================================================= * =============== Order Transfers ================= * ================================================= */ /** * @notice Transfers an ERC1155 token from the owner to the recipient using a permit signature * @notice Order transfers are used to transfer a specific amount of a token from a specific order * @notice and allow for multiple uses of the same permit up to the allocated amount. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev - Throws if the permit is expired * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount + amount already filled exceeds the permitted amount * @dev - Throws if the requested amount is less than the minimum fill amount * @dev - Throws if the provided token address does not implement ERC1155 safeTransferFrom function * @dev - Throws if the provided advanced permit hash has not been registered * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Updates the amount filled for the order ID * @dev 3. If completely filled, marks the order as filled * * @param signedPermit The permit signature, signed by the owner * @param orderFillAmounts The amount of tokens to transfer * @param token The address of the token * @param id The ID of the token * @param owner The owner of the token * @param to The address to transfer the tokens to * @param salt The salt of the permit * @param expiration The expiration timestamp of the permit * @param orderId The order ID * @param advancedPermitHash The hash of the additional data * * @return quantityFilled The amount of tokens filled * @return isError True if the transfer failed, false otherwise */ function fillPermittedOrderERC1155( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, address to, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external onlyRegisteredOrderAdvancedTypeHash(advancedPermitHash) returns (uint256 quantityFilled, bool isError) { _requireNotPaused(PAUSABLE_ORDER_TRANSFER_FROM_ERC1155); PackedApproval storage orderStatus = _checkOrderTransferERC1155( signedPermit, orderFillAmounts, token, id, owner, salt, expiration, orderId, advancedPermitHash ); ( quantityFilled, isError ) = _orderTransfer( orderStatus, orderFillAmounts, token, id, owner, to, orderId, _transferFromERC1155 ); if (isError) { _restoreFillableItems(orderStatus, owner, orderId, quantityFilled, true); } } /** * @notice Transfers an ERC20 token from the owner to the recipient using a permit signature * @notice Order transfers are used to transfer a specific amount of a token from a specific order * @notice and allow for multiple uses of the same permit up to the allocated amount. NOTE: before calling this * @notice function you MUST register the stub end of the additional data typestring using * @notice the `registerAdditionalDataHash` function. * * @dev - Throws if the permit is expired * @dev - Throws if the permit is not signed by the owner * @dev - Throws if the requested amount + amount already filled exceeds the permitted amount * @dev - Throws if the requested amount is less than the minimum fill amount * @dev - Throws if the provided token address does not implement ERC20 transferFrom function * @dev - Throws if the provided advanced permit hash has not been registered * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Updates the amount filled for the order ID * @dev 3. If completely filled, marks the order as filled * * @param signedPermit The permit signature, signed by the owner * @param orderFillAmounts The amount of tokens to transfer * @param token The address of the token * @param owner The owner of the token * @param to The address to transfer the tokens to * @param salt The salt of the permit * @param expiration The expiration timestamp of the permit * @param orderId The order ID * @param advancedPermitHash The hash of the additional data * * @return quantityFilled The amount of tokens filled * @return isError True if the transfer failed, false otherwise */ function fillPermittedOrderERC20( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, address owner, address to, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external onlyRegisteredOrderAdvancedTypeHash(advancedPermitHash) returns (uint256 quantityFilled, bool isError) { _requireNotPaused(PAUSABLE_ORDER_TRANSFER_FROM_ERC20); PackedApproval storage orderStatus = _checkOrderTransferERC20( signedPermit, orderFillAmounts, token, ZERO, owner, salt, expiration, orderId, advancedPermitHash ); ( quantityFilled, isError ) = _orderTransfer( orderStatus, orderFillAmounts, token, ZERO, owner, to, orderId, _transferFromERC20 ); if (isError) { _restoreFillableItems(orderStatus, owner, orderId, quantityFilled, true); } } /** * @notice Closes an outstanding order to prevent further execution of transfers. * * @dev - Throws if the order is not in the open state * * @dev <h4>Postconditions:</h4> * @dev 1. Marks the order as cancelled * @dev 2. Sets the order amount to 0 * @dev 3. Sets the order expiration to 0 * @dev 4. Emits a OrderClosed event * * @param owner The owner of the token * @param operator The operator allowed to transfer the token * @param tokenType The type of token the order is for - must be 20, 721 or 1155. * @param token The address of the token contract * @param id The token ID * @param orderId The order ID */ function closePermittedOrder( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external { if(!(msg.sender == owner || msg.sender == operator)) { revert PermitC__CallerMustBeOwnerOrOperator(); } _requireValidTokenType(tokenType); PackedApproval storage orderStatus = _getPackedApprovalPtr(_orderApprovals, owner, tokenType, token, id, orderId, operator); if (orderStatus.state == ORDER_STATE_OPEN) { orderStatus.state = ORDER_STATE_CANCELLED; orderStatus.amount = 0; orderStatus.expiration = 0; emit OrderClosed(orderId, owner, operator, true); } else { revert PermitC__OrderIsEitherCancelledOrFilled(); } } /** * @notice Returns the amount of allowance an operator has for a specific token and id * @notice If the expiration on the allowance has expired, returns 0 * * @dev Overload of the on chain allowance function for approvals with a specified order ID * * @param owner The owner of the token * @param operator The operator of the token * @param token The address of the token contract * @param id The token ID * * @return allowedAmount The amount of allowance the operator has */ function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external view returns (uint256 allowedAmount, uint256 expiration) { return _allowance(_orderApprovals, owner, operator, tokenType, token, id, orderId); } /** * ================================================= * ================ Nonce Management =============== * ================================================= */ /** * @notice Invalidates the provided nonce * * @dev - Throws if the provided nonce has already been used * * @dev <h4>Postconditions:</h4> * @dev 1. Sets the provided nonce as used for the sender * * @param nonce Nonce to invalidate */ function invalidateUnorderedNonce(uint256 nonce) external { _checkAndInvalidateNonce(msg.sender, nonce); } /** * @notice Returns if the provided nonce has been used * * @param owner The owner of the token * @param nonce The nonce to check * * @return isValid true if the nonce is valid, false otherwise */ function isValidUnorderedNonce(address owner, uint256 nonce) external view returns (bool isValid) { isValid = ((_unorderedNonces[owner][uint248(nonce >> 8)] >> uint8(nonce)) & ONE) == ZERO; } /** * @notice Revokes all outstanding approvals for the sender * * @dev <h4>Postconditions:</h4> * @dev 1. Increments the master nonce for the sender * @dev 2. All outstanding approvals for the sender are invalidated */ function lockdown() external { unchecked { _masterNonces[msg.sender]++; } emit Lockdown(msg.sender); } /** * @notice Returns the master nonce for the provided owner address * * @param owner The owner address * * @return The master nonce */ function masterNonce(address owner) external view returns (uint256) { return _masterNonces[owner]; } /** * ================================================= * ============== Transfer Functions =============== * ================================================= */ /** * @notice Transfer an ERC721 token from the owner to the recipient using on chain approvals * * @dev Public transfer function overload for approval transfers * @dev - Throws if the provided token address does not implement ERC721 transferFrom function * @dev - Throws if the requested amount exceeds the approved amount * @dev - Throws if the approval is expired * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Decrements the approval amount by the requested amount * @dev 3. Performs any additional checks in the before and after hooks * * @param owner The owner of the token * @param to The recipient of the token * @param token The address of the token * @param id The id of the token * * @return isError True if the transfer failed, false otherwise */ function transferFromERC721( address owner, address to, address token, uint256 id ) external returns (bool isError) { _requireNotPaused(PAUSABLE_APPROVAL_TRANSFER_FROM_ERC721); PackedApproval storage approval = _checkAndUpdateApproval(owner, TOKEN_TYPE_ERC721, token, id, ONE, true); isError = _transferFromERC721(owner, to, token, id); if (isError) { _restoreFillableItems(approval, owner, ZERO_BYTES32, ONE, false); } } /** * @notice Transfer an ERC1155 token from the owner to the recipient using on chain approvals * * @dev Public transfer function overload for approval transfers * @dev - Throws if the provided token address does not implement ERC1155 safeTransferFrom function * @dev - Throws if the requested amount exceeds the approved amount * @dev - Throws if the approval is expired * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Decrements the approval amount by the requested amount * @dev 3. Performs any additional checks in the before and after hooks * * @param owner The owner of the token * @param to The recipient of the token * @param amount The amount of the token to transfer * @param token The address of the token * @param id The id of the token * * @return isError True if the transfer failed, false otherwise */ function transferFromERC1155( address owner, address to, address token, uint256 id, uint256 amount ) external returns (bool isError) { _requireNotPaused(PAUSABLE_APPROVAL_TRANSFER_FROM_ERC1155); PackedApproval storage approval = _checkAndUpdateApproval(owner, TOKEN_TYPE_ERC1155, token, id, amount, false); isError = _transferFromERC1155(token, owner, to, id, amount); if (isError) { _restoreFillableItems(approval, owner, ZERO_BYTES32, amount, false); } } /** * @notice Transfer an ERC20 token from the owner to the recipient using on chain approvals * * @dev Public transfer function overload for approval transfers * @dev - Throws if the provided token address does not implement ERC20 transferFrom function * @dev - Throws if the requested amount exceeds the approved amount * @dev - Throws if the approval is expired * @dev - Returns `false` if the transfer fails * * @dev <h4>Postconditions:</h4> * @dev 1. Transfers the token (in the requested amount) from the owner to the recipient * @dev 2. Decrements the approval amount by the requested amount * @dev 3. Performs any additional checks in the before and after hooks * * @param owner The owner of the token * @param to The recipient of the token * @param amount The amount of the token to transfer * @param token The address of the token * * @return isError True if the transfer failed, false otherwise */ function transferFromERC20( address owner, address to, address token, uint256 amount ) external returns (bool isError) { _requireNotPaused(PAUSABLE_APPROVAL_TRANSFER_FROM_ERC20); PackedApproval storage approval = _checkAndUpdateApproval(owner, TOKEN_TYPE_ERC20, token, ZERO, amount, false); isError = _transferFromERC20(token, owner, to, ZERO, amount); if (isError) { _restoreFillableItems(approval, owner, ZERO_BYTES32, amount, false); } } /** * @notice Performs a transfer of an ERC721 token. * * @dev Will **NOT** attempt transfer if `_beforeTransferFrom` hook returns false. * @dev Will **NOT** revert if the transfer is unsucessful. * @dev Invokers **MUST** check `isError` return value to determine success. * * @param owner The owner of the token being transferred * @param to The address to transfer the token to * @param token The token address of the token being transferred * @param id The token id being transferred * * @return isError True if the token was not transferred, false if token was transferred */ function _transferFromERC721( address owner, address to, address token, uint256 id ) private returns (bool isError) { isError = _beforeTransferFrom(TOKEN_TYPE_ERC721, token, owner, to, id, ONE); if (!isError) { try IERC721(token).transferFrom(owner, to, id) { } catch { isError = true; } } } /** * @notice Performs a transfer of an ERC1155 token. * * @dev Will **NOT** attempt transfer if `_beforeTransferFrom` hook returns false. * @dev Will **NOT** revert if the transfer is unsucessful. * @dev Invokers **MUST** check `isError` return value to determine success. * * @param token The token address of the token being transferred * @param owner The owner of the token being transferred * @param to The address to transfer the token to * @param id The token id being transferred * @param amount The quantity of token id to transfer * * @return isError True if the token was not transferred, false if token was transferred */ function _transferFromERC1155( address token, address owner, address to, uint256 id, uint256 amount ) private returns (bool isError) { isError = _beforeTransferFrom(TOKEN_TYPE_ERC1155, token, owner, to, id, amount); if (!isError) { try IERC1155(token).safeTransferFrom(owner, to, id, amount, "") { } catch { isError = true; } } } /** * @notice Performs a transfer of an ERC20 token. * * @dev Will **NOT** attempt transfer if `_beforeTransferFrom` hook returns false. * @dev Will **NOT** revert if the transfer is unsucessful. * @dev Invokers **MUST** check `isError` return value to determine success. * * @param token The token address of the token being transferred * @param owner The owner of the token being transferred * @param to The address to transfer the token to * @param amount The quantity of token id to transfer * * @return isError True if the token was not transferred, false if token was transferred */ function _transferFromERC20( address token, address owner, address to, uint256 /*id*/, uint256 amount ) private returns (bool isError) { isError = _beforeTransferFrom(TOKEN_TYPE_ERC20, token, owner, to, ZERO, amount); if (!isError) { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, owner, to, amount)); if (!success) { isError = true; } else if (data.length > 0) { isError = !abi.decode(data, (bool)); } } } /** * ================================================= * ============ Signature Verification ============= * ================================================= */ /** * @notice Returns the domain separator used in the permit signature * * @return domainSeparator The domain separator */ function domainSeparatorV4() external view returns (bytes32 domainSeparator) { domainSeparator = _domainSeparatorV4(); } /** * @notice Verifies a permit signature based on the bytes length of the signature provided. * * @dev Throws when - * @dev The bytes signature length is 64 or 65 bytes AND * @dev The ECDSA recovered signer is not the owner AND * @dev The owner's code length is zero OR the owner does not return a valid EIP-1271 response * @dev * @dev OR * @dev * @dev The bytes signature length is not 64 or 65 bytes AND * @dev The owner's code length is zero OR the owner does not return a valid EIP-1271 response */ function _verifyPermitSignature(bytes32 digest, bytes calldata signature, address owner) private view { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // Divide the signature in r, s and v variables /// @solidity memory-safe-assembly assembly { r := calldataload(signature.offset) s := calldataload(add(signature.offset, 32)) v := byte(0, calldataload(add(signature.offset, 64))) } (bool isError, address signer) = _ecdsaRecover(digest, v, r, s); if (owner != signer || isError) { _verifyEIP1271Signature(owner, digest, signature); } } else if (signature.length == 64) { bytes32 r; bytes32 vs; // Divide the signature in r and vs variables /// @solidity memory-safe-assembly assembly { r := calldataload(signature.offset) vs := calldataload(add(signature.offset, 32)) } (bool isError, address signer) = _ecdsaRecover(digest, r, vs); if (owner != signer || isError) { _verifyEIP1271Signature(owner, digest, signature); } } else { _verifyEIP1271Signature(owner, digest, signature); } } /** * @notice Verifies an EIP-1271 signature. * * @dev Throws when `signer` code length is zero OR the EIP-1271 call does not * @dev return the correct magic value. * * @param signer The signer address to verify a signature with * @param hash The hash digest to verify with the signer * @param signature The signature to verify */ function _verifyEIP1271Signature(address signer, bytes32 hash, bytes calldata signature) private view { if(signer.code.length == 0) { revert PermitC__SignatureTransferInvalidSignature(); } if (!_safeIsValidSignature(signer, hash, signature)) { revert PermitC__SignatureTransferInvalidSignature(); } } /** * @notice Overload of the `_ecdsaRecover` function to unpack the `v` and `s` values * * @param digest The hash digest that was signed * @param r The `r` value of the signature * @param vs The packed `v` and `s` values of the signature * * @return isError True if the ECDSA function is provided invalid inputs * @return signer The recovered address from ECDSA */ function _ecdsaRecover(bytes32 digest, bytes32 r, bytes32 vs) private pure returns (bool isError, address signer) { unchecked { bytes32 s = vs & UPPER_BIT_MASK; uint8 v = uint8(uint256(vs >> 255)) + 27; (isError, signer) = _ecdsaRecover(digest, v, r, s); } } /** * @notice Recovers the signer address using ECDSA * * @dev Does **NOT** revert if invalid input values are provided or `signer` is recovered as address(0) * @dev Returns an `isError` value in those conditions that is handled upstream * * @param digest The hash digest that was signed * @param v The `v` value of the signature * @param r The `r` value of the signature * @param s The `s` value of the signature * * @return isError True if the ECDSA function is provided invalid inputs * @return signer The recovered address from ECDSA */ function _ecdsaRecover(bytes32 digest, uint8 v, bytes32 r, bytes32 s) private pure returns (bool isError, address signer) { if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { // Invalid signature `s` value - return isError = true and signer = address(0) to check EIP-1271 return (true, address(0)); } signer = ecrecover(digest, v, r, s); isError = (signer == address(0)); } /** * @notice A gas efficient, and fallback-safe way to call the isValidSignature function for EIP-1271. * * @param signer The EIP-1271 signer to call to check for a valid signature. * @param hash The hash digest to verify with the EIP-1271 signer. * @param signature The supplied signature to verify. * * @return isValid True if the EIP-1271 signer returns the EIP-1271 magic value. */ function _safeIsValidSignature( address signer, bytes32 hash, bytes calldata signature ) private view returns(bool isValid) { assembly { function _callIsValidSignature(_signer, _hash, _signatureOffset, _signatureLength) -> _isValid { let ptr := mload(0x40) // store isValidSignature(bytes32,bytes) selector mstore(ptr, hex"1626ba7e") // store bytes32 hash value in abi encoded location mstore(add(ptr, 0x04), _hash) // store abi encoded location of the bytes signature data mstore(add(ptr, 0x24), 0x40) // store bytes signature length mstore(add(ptr, 0x44), _signatureLength) // copy calldata bytes signature to memory calldatacopy(add(ptr, 0x64), _signatureOffset, _signatureLength) // calculate data length based on abi encoded data with rounded up signature length let dataLength := add(0x64, and(add(_signatureLength, 0x1F), not(0x1F))) // update free memory pointer mstore(0x40, add(ptr, dataLength)) // static call _signer with abi encoded data // skip return data check if call failed or return data size is not at least 32 bytes if and(iszero(lt(returndatasize(), 0x20)), staticcall(gas(), _signer, ptr, dataLength, 0x00, 0x20)) { // check if return data is equal to isValidSignature magic value _isValid := eq(mload(0x00), hex"1626ba7e") leave } } isValid := _callIsValidSignature(signer, hash, signature.offset, signature.length) } } /** * ================================================= * ===================== Hooks ===================== * ================================================= */ /** * @dev This function is empty by default. Override it to add additional logic after the approval transfer. * @dev The function returns a boolean value instead of reverting to indicate if there is an error for more granular control in inheriting protocols. */ function _beforeTransferFrom(uint256 tokenType, address token, address owner, address to, uint256 id, uint256 amount) internal virtual returns (bool isError) {} /** * ================================================= * ==================== Internal =================== * ================================================= */ /** * @notice Checks if an advanced permit typehash has been registered with PermitC * * @dev Throws when the typehash has not been registered * * @param advancedPermitHash The permit typehash to check */ function _requireTransferAdvancedPermitHashIsRegistered(bytes32 advancedPermitHash) private view { if (!_registeredTransferHashes[advancedPermitHash]) { revert PermitC__SignatureTransferPermitHashNotRegistered(); } } /** * @notice Checks if an advanced permit typehash has been registered with PermitC * * @dev Throws when the typehash has not been registered * * @param advancedPermitHash The permit typehash to check */ function _requireOrderAdvancedPermitHashIsRegistered(bytes32 advancedPermitHash) private view { if (!_registeredOrderHashes[advancedPermitHash]) { revert PermitC__SignatureTransferPermitHashNotRegistered(); } } /** * @notice Invalidates an account nonce if it has not been previously used * * @dev Throws when the nonce was previously used * * @param account The account to invalidate the nonce of * @param nonce The nonce to invalidate */ function _checkAndInvalidateNonce(address account, uint256 nonce) private { unchecked { if (uint256(_unorderedNonces[account][uint248(nonce >> 8)] ^= (ONE << uint8(nonce))) & (ONE << uint8(nonce)) == ZERO) { revert PermitC__NonceAlreadyUsedOrRevoked(); } } } /** * @notice Checks an approval to ensure it is sufficient for the `amount` to send * * @dev Throws when the approval is expired * @dev Throws when the approved amount is insufficient * * @param owner The owner of the token * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount to deduct from the approval * @param zeroOutApproval True if the approval should be set to zero * * @return approval Storage pointer for the approval data */ function _checkAndUpdateApproval( address owner, uint256 tokenType, address token, uint256 id, uint256 amount, bool zeroOutApproval ) private returns (PackedApproval storage approval) { approval = _getPackedApprovalPtr(_transferApprovals, owner, tokenType, token, id, ZERO_BYTES32, msg.sender); if (approval.expiration < block.timestamp) { revert PermitC__ApprovalTransferPermitExpiredOrUnset(); } if (approval.amount < amount) { revert PermitC__ApprovalTransferExceededPermittedAmount(); } if(zeroOutApproval) { approval.amount = 0; } else if (approval.amount < type(uint200).max) { unchecked { approval.amount -= uint200(amount); } } } /** * @notice Gets the storage pointer for an approval * * @param _approvals The mapping to retrieve the approval from * @param account The account the approval is from * @param tokenType The type of token the approval is for * @param token The address of the token * @param id The id of the token * @param orderId The order id for the approval * @param operator The operator for the approval * * @return approval Storage pointer for the approval data */ function _getPackedApprovalPtr( mapping(bytes32 => mapping(address => PackedApproval)) storage _approvals, address account, uint256 tokenType, address token, uint256 id, bytes32 orderId, address operator ) private view returns (PackedApproval storage approval) { approval = _approvals[_getPackedApprovalKey(account, tokenType, token, id, orderId)][operator]; } /** * @notice Gets the storage key for the mapping for a specific approval * * @param owner The owner of the token * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param orderId The order id of the approval * * @return key The key value to use to access the approval in the mapping */ function _getPackedApprovalKey(address owner, uint256 tokenType, address token, uint256 id, bytes32 orderId) private view returns (bytes32 key) { key = keccak256(abi.encode(owner, tokenType, token, id, orderId, _masterNonces[owner])); } /** * @notice Checks the permit approval for a single use permit without additional data * * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit */ function _checkPermitApproval( uint256 tokenType, address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit ) private { bytes32 digest = _hashTypedDataV4( PermitHash.hashSingleUsePermit( tokenType, token, id, permitAmount, nonce, expiration, _masterNonces[owner] ) ); _checkPermitData( nonce, expiration, transferAmount, permitAmount, owner, digest, signedPermit ); } /** * @notice Overload of `_checkPermitApprovalWithAdditionalData` to supply TOKEN_TYPE_ERC1155 * * @dev Prevents stack too deep in `permitTransferFromWithAdditionalDataERC1155` * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalDataERC1155( address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { _checkPermitApprovalWithAdditionalData( TOKEN_TYPE_ERC1155, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); } /** * @notice Overload of `_checkPermitApprovalWithAdditionalData` to supply TOKEN_TYPE_ERC20 * * @dev Prevents stack too deep in `permitTransferFromWithAdditionalDataERC220` * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalDataERC20( address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { _checkPermitApprovalWithAdditionalData( TOKEN_TYPE_ERC20, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); } /** * @notice Overload of `_checkPermitApprovalWithAdditionalData` to supply TOKEN_TYPE_ERC721 * * @dev Prevents stack too deep in `permitTransferFromWithAdditionalDataERC721` * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalDataERC721( address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { _checkPermitApprovalWithAdditionalData( TOKEN_TYPE_ERC721, token, id, permitAmount, nonce, expiration, owner, transferAmount, signedPermit, additionalData, advancedPermitHash ); } /** * @notice Checks the permit approval for a single use permit with additional data * * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param permitAmount The amount authorized by the owner signature * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param owner The owner of the token * @param transferAmount The amount of tokens requested to transfer * @param signedPermit The signature for the permit * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature */ function _checkPermitApprovalWithAdditionalData( uint256 tokenType, address token, uint256 id, uint256 permitAmount, uint256 nonce, uint256 expiration, address owner, uint256 transferAmount, bytes calldata signedPermit, bytes32 additionalData, bytes32 advancedPermitHash ) private { bytes32 digest = _getAdvancedTypedDataV4PermitHash( tokenType, token, id, permitAmount, owner, nonce, expiration, additionalData, advancedPermitHash ); _checkPermitData( nonce, expiration, transferAmount, permitAmount, owner, digest, signedPermit ); } /** * @notice Checks that a single use permit has not expired, was authorized for the amount * @notice being transferred, has a valid nonce and has a valid signature. * * @dev Throws when the `nonce` has already been consumed * @dev Throws when the permit amount is less than the transfer amount * @dev Throws when the permit is expired * @dev Throws when the signature is invalid * * @param nonce The nonce of the permit * @param expiration The time the permit expires * @param transferAmount The amount of tokens requested to transfer * @param permitAmount The amount authorized by the owner signature * @param owner The owner of the token * @param digest The digest that was signed by the owner * @param signedPermit The signature for the permit */ function _checkPermitData( uint256 nonce, uint256 expiration, uint256 transferAmount, uint256 permitAmount, address owner, bytes32 digest, bytes calldata signedPermit ) private { if (block.timestamp > expiration) { revert PermitC__SignatureTransferExceededPermitExpired(); } if (transferAmount > permitAmount) { revert PermitC__SignatureTransferExceededPermittedAmount(); } _checkAndInvalidateNonce(owner, nonce); _verifyPermitSignature(digest, signedPermit, owner); } /** * @notice Stores an approval for future use by `operator` to move tokens on behalf of `owner` * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner * @param expiration The time the permit expires * @param owner The owner of the token * @param operator The account allowed to transfer the tokens */ function _storeApproval( uint256 tokenType, address token, uint256 id, uint200 amount, uint48 expiration, address owner, address operator ) private { PackedApproval storage approval = _getPackedApprovalPtr(_transferApprovals, owner, tokenType, token, id, ZERO_BYTES32, operator); approval.expiration = expiration; approval.amount = amount; emit Approval(owner, token, operator, id, amount, expiration); } /** * @notice Overload of `_checkOrderTransfer` to supply TOKEN_TYPE_ERC1155 * * @dev Prevents stack too deep in `fillPermittedOrderERC1155` * @dev Throws when the order start amount is greater than type(uint200).max * @dev Throws when the order status is not open * @dev Throws when the signature is invalid * @dev Throws when the permit is expired * * @param signedPermit The signature for the permit * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param salt The salt value for the permit * @param expiration The time the permit expires * @param orderId The order id for the permit * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return orderStatus Storage pointer for the approval data */ function _checkOrderTransferERC1155( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) private returns (PackedApproval storage orderStatus) { orderStatus = _checkOrderTransfer( signedPermit, orderFillAmounts, TOKEN_TYPE_ERC1155, token, id, owner, salt, expiration, orderId, advancedPermitHash ); } /** * @notice Overload of `_checkOrderTransfer` to supply TOKEN_TYPE_ERC20 * * @dev Prevents stack too deep in `fillPermittedOrderERC20` * @dev Throws when the order start amount is greater than type(uint200).max * @dev Throws when the order status is not open * @dev Throws when the signature is invalid * @dev Throws when the permit is expired * * @param signedPermit The signature for the permit * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param salt The salt value for the permit * @param expiration The time the permit expires * @param orderId The order id for the permit * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return orderStatus Storage pointer for the approval data */ function _checkOrderTransferERC20( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) private returns (PackedApproval storage orderStatus) { orderStatus = _checkOrderTransfer( signedPermit, orderFillAmounts, TOKEN_TYPE_ERC20, token, id, owner, salt, expiration, orderId, advancedPermitHash ); } /** * @notice Validates an order transfer to check order start amount, status, signature if not previously * @notice opened, and expiration. * * @dev Throws when the order start amount is greater than type(uint200).max * @dev Throws when the order status is not open * @dev Throws when the signature is invalid * @dev Throws when the permit is expired * * @param signedPermit The signature for the permit * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param salt The salt value for the permit * @param expiration The time the permit expires * @param orderId The order id for the permit * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return orderStatus Storage pointer for the approval data */ function _checkOrderTransfer( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, uint256 tokenType, address token, uint256 id, address owner, uint256 salt, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) private returns (PackedApproval storage orderStatus) { if (orderFillAmounts.orderStartAmount > type(uint200).max) { revert PermitC__AmountExceedsStorageMaximum(); } orderStatus = _getPackedApprovalPtr(_orderApprovals, owner, tokenType, token, id, orderId, msg.sender); if (orderStatus.state == ORDER_STATE_OPEN) { if (orderStatus.amount == 0) { _verifyPermitSignature( _getAdvancedTypedDataV4PermitHash( tokenType, token, id, orderFillAmounts.orderStartAmount, owner, salt, expiration, orderId, advancedPermitHash ), signedPermit, owner ); orderStatus.amount = uint200(orderFillAmounts.orderStartAmount); orderStatus.expiration = expiration; emit OrderOpened(orderId, owner, msg.sender, orderFillAmounts.orderStartAmount); } if (block.timestamp > orderStatus.expiration) { revert PermitC__SignatureTransferExceededPermitExpired(); } } else { revert PermitC__OrderIsEitherCancelledOrFilled(); } } /** * @notice Checks the order fill amounts against approval data and transfers tokens, updates * @notice approval if the fill results in the order being closed. * * @dev Throws when the amount to fill is less than the minimum fill amount * * @param orderStatus Storage pointer for the approval data * @param orderFillAmounts A struct containing the order start, requested fill and minimum fill amounts * @param token The address of the token * @param id The id of the token * @param owner The owner of the token * @param to The address to send the tokens to * @param orderId The order id for the permit * @param _transferFrom Function pointer of the transfer function to send tokens with * * @return quantityFilled The number of tokens filled in the order * @return isError True if there was an error transferring tokens, false otherwise */ function _orderTransfer( PackedApproval storage orderStatus, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, address to, bytes32 orderId, function (address, address, address, uint256, uint256) internal returns (bool) _transferFrom ) private returns (uint256 quantityFilled, bool isError) { quantityFilled = orderFillAmounts.requestedFillAmount; if (quantityFilled > orderStatus.amount) { quantityFilled = orderStatus.amount; } if (quantityFilled < orderFillAmounts.minimumFillAmount) { revert PermitC__UnableToFillMinimumRequestedQuantity(); } unchecked { orderStatus.amount -= uint200(quantityFilled); emit OrderFilled(orderId, owner, msg.sender, quantityFilled); } if (orderStatus.amount == 0) { orderStatus.state = ORDER_STATE_FILLED; emit OrderClosed(orderId, owner, msg.sender, false); } isError = _transferFrom(token, owner, to, id, quantityFilled); } /** * @notice Restores an account's nonce when a transfer was not successful * * @dev Throws when the nonce was not already consumed * * @param account The account to restore the nonce of * @param nonce The nonce to restore */ function _restoreNonce(address account, uint256 nonce) private { unchecked { if (uint256(_unorderedNonces[account][uint248(nonce >> 8)] ^= (ONE << uint8(nonce))) & (ONE << uint8(nonce)) != ZERO) { revert PermitC__NonceNotUsedOrRevoked(); } } } /** * @notice Restores an approval amount when a transfer was not successful * * @param approval Storage pointer for the approval data * @param owner The owner of the tokens * @param orderId The order id to restore approval amount on * @param unfilledAmount The amount that was not filled on the order * @param isOrderPermit True if the fill restoration is for an permit order */ function _restoreFillableItems( PackedApproval storage approval, address owner, bytes32 orderId, uint256 unfilledAmount, bool isOrderPermit ) private { if (unfilledAmount > 0) { if (isOrderPermit) { // Order permits always deduct amount and must be restored unchecked { approval.amount += uint200(unfilledAmount); } approval.state = ORDER_STATE_OPEN; emit OrderRestored(orderId, owner, unfilledAmount); } else if (approval.amount < type(uint200).max) { // Stored approvals only deduct amount unchecked { approval.amount += uint200(unfilledAmount); } } } } function _requireValidTokenType(uint256 tokenType) private pure { if(!( tokenType == TOKEN_TYPE_ERC721 || tokenType == TOKEN_TYPE_ERC1155 || tokenType == TOKEN_TYPE_ERC20 ) ) { revert PermitC__InvalidTokenType(); } } /** * @notice Generates an EIP-712 digest for a permit * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param owner The owner of the token * @param nonce The nonce for the permit * @param expiration The time the permit expires * @param additionalData The additional data to validate with the permit signature * @param advancedPermitHash The typehash of the permit to use for validating the signature * * @return digest The EIP-712 digest of the permit data */ function _getAdvancedTypedDataV4PermitHash( uint256 tokenType, address token, uint256 id, uint256 amount, address owner, uint256 nonce, uint256 expiration, bytes32 additionalData, bytes32 advancedPermitHash ) private view returns (bytes32 digest) { // cache masterNonce on stack to avoid stack too deep uint256 masterNonce_ = _masterNonces[owner]; digest = _hashTypedDataV4( PermitHash.hashSingleUsePermitWithAdditionalData( tokenType, token, id, amount, nonce, expiration, additionalData, advancedPermitHash, masterNonce_ ) ); } /** * @notice Returns the current allowed amount and expiration for a stored permit * * @dev Returns zero allowed if the permit has expired * * @param _approvals The mapping to retrieve the approval from * @param owner The account the approval is from * @param operator The operator for the approval * @param tokenType The type of token the approval is for * @param token The address of the token * @param id The id of the token * @param orderId The order id for the approval * * @return allowedAmount The amount authorized by the approval, zero if the permit has expired * @return expiration The expiration of the approval */ function _allowance( mapping(bytes32 => mapping(address => PackedApproval)) storage _approvals, address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) private view returns (uint256 allowedAmount, uint256 expiration) { PackedApproval storage allowed = _getPackedApprovalPtr(_approvals, owner, tokenType, token, id, orderId, operator); allowedAmount = allowed.expiration < block.timestamp ? 0 : allowed.amount; expiration = allowed.expiration; } /** * @notice Allows the owner of the PermitC contract to access pausable admin functions * * @dev May be overriden by an inheriting contract to provide alternative permission structure */ function _requireCallerHasPausePermissions() internal view virtual override { _checkOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {OrderFillAmounts} from "../DataTypes.sol"; interface IPermitC { /** * ================================================= * ==================== Events ===================== * ================================================= */ /// @dev Emitted when an approval is stored event Approval( address indexed owner, address indexed token, address indexed operator, uint256 id, uint200 amount, uint48 expiration ); /// @dev Emitted when a user increases their master nonce event Lockdown(address indexed owner); /// @dev Emitted when an order is opened event OrderOpened( bytes32 indexed orderId, address indexed owner, address indexed operator, uint256 fillableQuantity ); /// @dev Emitted when an order has a fill event OrderFilled( bytes32 indexed orderId, address indexed owner, address indexed operator, uint256 amount ); /// @dev Emitted when an order has been fully filled or cancelled event OrderClosed( bytes32 indexed orderId, address indexed owner, address indexed operator, bool wasCancellation); /// @dev Emitted when an order has an amount restored due to a failed transfer event OrderRestored( bytes32 indexed orderId, address indexed owner, uint256 amountRestoredToOrder ); /** * ================================================= * ============== Approval Transfers =============== * ================================================= */ function approve(uint256 tokenType, address token, uint256 id, address operator, uint200 amount, uint48 expiration) external; function updateApprovalBySignature( uint256 tokenType, address token, uint256 id, uint256 nonce, uint200 amount, address operator, uint48 approvalExpiration, uint48 sigDeadline, address owner, bytes calldata signedPermit ) external; function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id ) external view returns (uint256 amount, uint256 expiration); /** * ================================================= * ================ Signed Transfers =============== * ================================================= */ function registerAdditionalDataHash(string memory additionalDataTypeString) external; function permitTransferFromERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromWithAdditionalDataERC721( address token, uint256 id, uint256 nonce, uint256 expiration, address owner, address to, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromWithAdditionalDataERC1155( address token, uint256 id, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes calldata signedPermit ) external returns (bool isError); function permitTransferFromWithAdditionalDataERC20( address token, uint256 nonce, uint256 permitAmount, uint256 expiration, address owner, address to, uint256 transferAmount, bytes32 additionalData, bytes32 advancedPermitHash, bytes calldata signedPermit ) external returns (bool isError); function isRegisteredTransferAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered); function isRegisteredOrderAdditionalDataHash(bytes32 hash) external view returns (bool isRegistered); /** * ================================================= * =============== Order Transfers ================= * ================================================= */ function fillPermittedOrderERC1155( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, uint256 id, address owner, address to, uint256 nonce, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external returns (uint256 quantityFilled, bool isError); function fillPermittedOrderERC20( bytes calldata signedPermit, OrderFillAmounts calldata orderFillAmounts, address token, address owner, address to, uint256 nonce, uint48 expiration, bytes32 orderId, bytes32 advancedPermitHash ) external returns (uint256 quantityFilled, bool isError); function closePermittedOrder( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external; function allowance( address owner, address operator, uint256 tokenType, address token, uint256 id, bytes32 orderId ) external view returns (uint256 amount, uint256 expiration); /** * ================================================= * ================ Nonce Management =============== * ================================================= */ function invalidateUnorderedNonce(uint256 nonce) external; function isValidUnorderedNonce(address owner, uint256 nonce) external view returns (bool isValid); function lockdown() external; function masterNonce(address owner) external view returns (uint256); /** * ================================================= * ============== Transfer Functions =============== * ================================================= */ function transferFromERC721( address from, address to, address token, uint256 id ) external returns (bool isError); function transferFromERC1155( address from, address to, address token, uint256 id, uint256 amount ) external returns (bool isError); function transferFromERC20( address from, address to, address token, uint256 amount ) external returns (bool isError); /** * ================================================= * ============ Signature Verification ============= * ================================================= */ function domainSeparatorV4() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {SINGLE_USE_PERMIT_TYPEHASH, UPDATE_APPROVAL_TYPEHASH} from "../Constants.sol"; library PermitHash { /** * @notice Hashes the permit data for a stored approval * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param nonce The nonce for the permit * @param operator The account that is allowed to use the permit * @param approvalExpiration The time the permit approval expires * @param sigDeadline The deadline for submitting the permit onchain * @param masterNonce The signers master nonce * * @return hash The hash of the permit data */ function hashOnChainApproval( uint256 tokenType, address token, uint256 id, uint256 amount, uint256 nonce, address operator, uint256 approvalExpiration, uint256 sigDeadline, uint256 masterNonce ) internal pure returns (bytes32 hash) { hash = keccak256( abi.encode( UPDATE_APPROVAL_TYPEHASH, tokenType, token, id, amount, nonce, operator, approvalExpiration, sigDeadline, masterNonce ) ); } /** * @notice Hashes the permit data with the single user permit without additional data typehash * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param nonce The nonce for the permit * @param expiration The time the permit expires * @param masterNonce The signers master nonce * * @return hash The hash of the permit data */ function hashSingleUsePermit( uint256 tokenType, address token, uint256 id, uint256 amount, uint256 nonce, uint256 expiration, uint256 masterNonce ) internal view returns (bytes32 hash) { hash = keccak256( abi.encode( SINGLE_USE_PERMIT_TYPEHASH, tokenType, token, id, amount, nonce, msg.sender, expiration, masterNonce ) ); } /** * @notice Hashes the permit data with the supplied typehash * * @param tokenType The type of token * @param token The address of the token * @param id The id of the token * @param amount The amount authorized by the owner signature * @param nonce The nonce for the permit * @param expiration The time the permit expires * @param additionalData The additional data to validate with the permit signature * @param additionalDataTypeHash The typehash of the permit to use for validating the signature * @param masterNonce The signers master nonce * * @return hash The hash of the permit data with the supplied typehash */ function hashSingleUsePermitWithAdditionalData( uint256 tokenType, address token, uint256 id, uint256 amount, uint256 nonce, uint256 expiration, bytes32 additionalData, bytes32 additionalDataTypeHash, uint256 masterNonce ) internal view returns (bytes32 hash) { hash = keccak256( abi.encode( additionalDataTypeHash, tokenType, token, id, amount, nonce, msg.sender, expiration, masterNonce, additionalData ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment */ abstract contract EIP712 { bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _cachedDomainSeparator; uint256 private immutable _cachedChainId; bytes32 private immutable _hashedName; bytes32 private immutable _hashedVersion; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { _hashedName = keccak256(bytes(name)); _hashedVersion = keccak256(bytes(version)); _cachedChainId = block.chainid; _cachedDomainSeparator = _buildDomainSeparator(); } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _cachedChainId) { return _cachedDomainSeparator; } else { return _buildDomainSeparator(); } } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import {Context} from "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { error Ownable__CallerIsNotOwner(); error Ownable__NewOwnerIsZeroAddress(); address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if(owner() != _msgSender()) revert Ownable__CallerIsNotOwner(); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if(newOwner == address(0)) revert Ownable__NewOwnerIsZeroAddress(); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {StdStorage} from "./StdStorage.sol"; import {Vm, VmSafe} from "./Vm.sol"; abstract contract CommonBase { // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); // console.sol and console2.sol work by executing a staticcall to this address. address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); // Address of the test contract, deployed by the DEFAULT_SENDER. address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; // Deterministic deployment address of the Multicall3 contract. address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; // The order of the secp256k1 curve. uint256 internal constant SECP256K1_ORDER = 115792089237316195423570985008687907852837564279074904382605163141518161494337; uint256 internal constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; Vm internal constant vm = Vm(VM_ADDRESS); StdStorage internal stdstore; } abstract contract TestBase is CommonBase {} abstract contract ScriptBase is CommonBase { VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; // 💬 ABOUT // Forge Std's default Script. // 🧩 MODULES import {console} from "./console.sol"; import {console2} from "./console2.sol"; import {safeconsole} from "./safeconsole.sol"; import {StdChains} from "./StdChains.sol"; import {StdCheatsSafe} from "./StdCheats.sol"; import {stdJson} from "./StdJson.sol"; import {stdMath} from "./StdMath.sol"; import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; import {StdStyle} from "./StdStyle.sol"; import {StdUtils} from "./StdUtils.sol"; import {VmSafe} from "./Vm.sol"; // 📦 BOILERPLATE import {ScriptBase} from "./Base.sol"; // ⭐️ SCRIPT abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { // Note: IS_SCRIPT() must return true. bool public IS_SCRIPT = true; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {VmSafe} from "./Vm.sol"; /** * StdChains provides information about EVM compatible chains that can be used in scripts/tests. * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the * alias used in this contract, which can be found as the first argument to the * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. * * There are two main ways to use this contract: * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or * `setChain(string memory chainAlias, Chain memory chain)` * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. * * The first time either of those are used, chains are initialized with the default set of RPC URLs. * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in * `defaultRpcUrls`. * * The `setChain` function is straightforward, and it simply saves off the given chain data. * * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say * we want to retrieve the RPC URL for `mainnet`: * - If you have specified data with `setChain`, it will return that. * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it * is valid (e.g. a URL is specified, or an environment variable is given and exists). * - If neither of the above conditions is met, the default data is returned. * * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. */ abstract contract StdChains { VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); bool private stdChainsInitialized; struct ChainData { string name; uint256 chainId; string rpcUrl; } struct Chain { // The chain name. string name; // The chain's Chain ID. uint256 chainId; // The chain's alias. (i.e. what gets specified in `foundry.toml`). string chainAlias; // A default RPC endpoint for this chain. // NOTE: This default RPC URL is included for convenience to facilitate quick tests and // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy // usage as you will be throttled and this is a disservice to others who need this endpoint. string rpcUrl; } // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. mapping(string => Chain) private chains; // Maps from the chain's alias to it's default RPC URL. mapping(string => string) private defaultRpcUrls; // Maps from a chain ID to it's alias. mapping(uint256 => string) private idToAlias; bool private fallbackToDefaultRpcUrls = true; // The RPC URL will be fetched from config or defaultRpcUrls if possible. function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); initializeStdChains(); chain = chains[chainAlias]; require( chain.chainId != 0, string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) ); chain = getChainWithUpdatedRpcUrl(chainAlias, chain); } function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); initializeStdChains(); string memory chainAlias = idToAlias[chainId]; chain = chains[chainAlias]; require( chain.chainId != 0, string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) ); chain = getChainWithUpdatedRpcUrl(chainAlias, chain); } // set chain info, with priority to argument's rpcUrl field. function setChain(string memory chainAlias, ChainData memory chain) internal virtual { require( bytes(chainAlias).length != 0, "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." ); require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); initializeStdChains(); string memory foundAlias = idToAlias[chain.chainId]; require( bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), string( abi.encodePacked( "StdChains setChain(string,ChainData): Chain ID ", vm.toString(chain.chainId), " already used by \"", foundAlias, "\"." ) ) ); uint256 oldChainId = chains[chainAlias].chainId; delete idToAlias[oldChainId]; chains[chainAlias] = Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); idToAlias[chain.chainId] = chainAlias; } // set chain info, with priority to argument's rpcUrl field. function setChain(string memory chainAlias, Chain memory chain) internal virtual { setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); } function _toUpper(string memory str) private pure returns (string memory) { bytes memory strb = bytes(str); bytes memory copy = new bytes(strb.length); for (uint256 i = 0; i < strb.length; i++) { bytes1 b = strb[i]; if (b >= 0x61 && b <= 0x7A) { copy[i] = bytes1(uint8(b) - 32); } else { copy[i] = b; } } return string(copy); } // lookup rpcUrl, in descending order of priority: // current -> config (foundry.toml) -> environment variable -> default function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) private view returns (Chain memory) { if (bytes(chain.rpcUrl).length == 0) { try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { chain.rpcUrl = configRpcUrl; } catch (bytes memory err) { string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); if (fallbackToDefaultRpcUrls) { chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); } else { chain.rpcUrl = vm.envString(envName); } // Distinguish 'not found' from 'cannot read' // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions bytes memory oldNotFoundError = abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); bytes memory newNotFoundError = abi.encodeWithSignature( "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias)) ); bytes32 errHash = keccak256(err); if ( (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError)) || bytes(chain.rpcUrl).length == 0 ) { /// @solidity memory-safe-assembly assembly { revert(add(32, err), mload(err)) } } } } return chain; } function setFallbackToDefaultRpcUrls(bool useDefault) internal { fallbackToDefaultRpcUrls = useDefault; } function initializeStdChains() private { if (stdChainsInitialized) return; stdChainsInitialized = true; // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol` setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); setChainWithDefaultRpcUrl( "mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP") ); setChainWithDefaultRpcUrl( "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") ); setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io")); setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); setChainWithDefaultRpcUrl( "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io") ); setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); setChainWithDefaultRpcUrl( "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc") ); setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); setChainWithDefaultRpcUrl( "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology") ); setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); setChainWithDefaultRpcUrl( "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") ); setChainWithDefaultRpcUrl( "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") ); setChainWithDefaultRpcUrl( "bnb_smart_chain_testnet", ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") ); setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network")); setChainWithDefaultRpcUrl( "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network") ); setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network")); setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org")); setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org")); setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io")); setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io")); setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/")); setChainWithDefaultRpcUrl( "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/") ); setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com")); setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com")); setChainWithDefaultRpcUrl( "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com") ); } // set chain info, with priority to chainAlias' rpc url in foundry.toml function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { string memory rpcUrl = chain.rpcUrl; defaultRpcUrls[chainAlias] = rpcUrl; chain.rpcUrl = ""; setChain(chainAlias, chain); chain.rpcUrl = rpcUrl; // restore argument } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; import {StdStorage, stdStorage} from "./StdStorage.sol"; import {console2} from "./console2.sol"; import {Vm} from "./Vm.sol"; abstract contract StdCheatsSafe { Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); uint256 private constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; bool private gasMeteringOff; // Data structures to parse Transaction objects from the broadcast artifact // that conform to EIP1559. The Raw structs is what is parsed from the JSON // and then converted to the one that is used by the user for better UX. struct RawTx1559 { string[] arguments; address contractAddress; string contractName; // json value name = function string functionSig; bytes32 hash; // json value name = tx RawTx1559Detail txDetail; // json value name = type string opcode; } struct RawTx1559Detail { AccessList[] accessList; bytes data; address from; bytes gas; bytes nonce; address to; bytes txType; bytes value; } struct Tx1559 { string[] arguments; address contractAddress; string contractName; string functionSig; bytes32 hash; Tx1559Detail txDetail; string opcode; } struct Tx1559Detail { AccessList[] accessList; bytes data; address from; uint256 gas; uint256 nonce; address to; uint256 txType; uint256 value; } // Data structures to parse Transaction objects from the broadcast artifact // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON // and then converted to the one that is used by the user for better UX. struct TxLegacy { string[] arguments; address contractAddress; string contractName; string functionSig; string hash; string opcode; TxDetailLegacy transaction; } struct TxDetailLegacy { AccessList[] accessList; uint256 chainId; bytes data; address from; uint256 gas; uint256 gasPrice; bytes32 hash; uint256 nonce; bytes1 opcode; bytes32 r; bytes32 s; uint256 txType; address to; uint8 v; uint256 value; } struct AccessList { address accessAddress; bytes32[] storageKeys; } // Data structures to parse Receipt objects from the broadcast artifact. // The Raw structs is what is parsed from the JSON // and then converted to the one that is used by the user for better UX. struct RawReceipt { bytes32 blockHash; bytes blockNumber; address contractAddress; bytes cumulativeGasUsed; bytes effectiveGasPrice; address from; bytes gasUsed; RawReceiptLog[] logs; bytes logsBloom; bytes status; address to; bytes32 transactionHash; bytes transactionIndex; } struct Receipt { bytes32 blockHash; uint256 blockNumber; address contractAddress; uint256 cumulativeGasUsed; uint256 effectiveGasPrice; address from; uint256 gasUsed; ReceiptLog[] logs; bytes logsBloom; uint256 status; address to; bytes32 transactionHash; uint256 transactionIndex; } // Data structures to parse the entire broadcast artifact, assuming the // transactions conform to EIP1559. struct EIP1559ScriptArtifact { string[] libraries; string path; string[] pending; Receipt[] receipts; uint256 timestamp; Tx1559[] transactions; TxReturn[] txReturns; } struct RawEIP1559ScriptArtifact { string[] libraries; string path; string[] pending; RawReceipt[] receipts; TxReturn[] txReturns; uint256 timestamp; RawTx1559[] transactions; } struct RawReceiptLog { // json value = address address logAddress; bytes32 blockHash; bytes blockNumber; bytes data; bytes logIndex; bool removed; bytes32[] topics; bytes32 transactionHash; bytes transactionIndex; bytes transactionLogIndex; } struct ReceiptLog { // json value = address address logAddress; bytes32 blockHash; uint256 blockNumber; bytes data; uint256 logIndex; bytes32[] topics; uint256 transactionIndex; uint256 transactionLogIndex; bool removed; } struct TxReturn { string internalType; string value; } struct Account { address addr; uint256 key; } enum AddressType { Payable, NonPayable, ZeroAddress, Precompile, ForgeAddress } // Checks that `addr` is not blacklisted by token contracts that have a blacklist. function assumeNotBlacklisted(address token, address addr) internal view virtual { // Nothing to check if `token` is not a contract. uint256 tokenCodeSize; assembly { tokenCodeSize := extcodesize(token) } require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); bool success; bytes memory returnData; // 4-byte selector for `isBlacklisted(address)`, used by USDC. (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr)); vm.assume(!success || abi.decode(returnData, (bool)) == false); // 4-byte selector for `isBlackListed(address)`, used by USDT. (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr)); vm.assume(!success || abi.decode(returnData, (bool)) == false); } // Checks that `addr` is not blacklisted by token contracts that have a blacklist. // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for // backwards compatibility, since this name was used in the original PR which has already has // a release. This function can be removed in a future release once we want a breaking change. function assumeNoBlacklisted(address token, address addr) internal view virtual { assumeNotBlacklisted(token, addr); } function assumeAddressIsNot(address addr, AddressType addressType) internal virtual { if (addressType == AddressType.Payable) { assumeNotPayable(addr); } else if (addressType == AddressType.NonPayable) { assumePayable(addr); } else if (addressType == AddressType.ZeroAddress) { assumeNotZeroAddress(addr); } else if (addressType == AddressType.Precompile) { assumeNotPrecompile(addr); } else if (addressType == AddressType.ForgeAddress) { assumeNotForgeAddress(addr); } } function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual { assumeAddressIsNot(addr, addressType1); assumeAddressIsNot(addr, addressType2); } function assumeAddressIsNot( address addr, AddressType addressType1, AddressType addressType2, AddressType addressType3 ) internal virtual { assumeAddressIsNot(addr, addressType1); assumeAddressIsNot(addr, addressType2); assumeAddressIsNot(addr, addressType3); } function assumeAddressIsNot( address addr, AddressType addressType1, AddressType addressType2, AddressType addressType3, AddressType addressType4 ) internal virtual { assumeAddressIsNot(addr, addressType1); assumeAddressIsNot(addr, addressType2); assumeAddressIsNot(addr, addressType3); assumeAddressIsNot(addr, addressType4); } // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to // `addr` and checking the `success` return value. // NOTE: This function may result in state changes depending on the fallback/receive logic // implemented by `addr`, which should be taken into account when this function is used. function _isPayable(address addr) private returns (bool) { require( addr.balance < UINT256_MAX, "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds" ); uint256 origBalanceTest = address(this).balance; uint256 origBalanceAddr = address(addr).balance; vm.deal(address(this), 1); (bool success,) = payable(addr).call{value: 1}(""); // reset balances vm.deal(address(this), origBalanceTest); vm.deal(addr, origBalanceAddr); return success; } // NOTE: This function may result in state changes depending on the fallback/receive logic // implemented by `addr`, which should be taken into account when this function is used. See the // `_isPayable` method for more information. function assumePayable(address addr) internal virtual { vm.assume(_isPayable(addr)); } function assumeNotPayable(address addr) internal virtual { vm.assume(!_isPayable(addr)); } function assumeNotZeroAddress(address addr) internal pure virtual { vm.assume(addr != address(0)); } function assumeNotPrecompile(address addr) internal pure virtual { assumeNotPrecompile(addr, _pureChainId()); } function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual { // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific // address), but the same rationale for excluding them applies so we include those too. // These should be present on all EVM-compatible chains. vm.assume(addr < address(0x1) || addr > address(0x9)); // forgefmt: disable-start if (chainId == 10 || chainId == 420) { // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); } else if (chainId == 42161 || chainId == 421613) { // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); } else if (chainId == 43114 || chainId == 43113) { // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); } // forgefmt: disable-end } function assumeNotForgeAddress(address addr) internal pure virtual { // vm, console, and Create2Deployer addresses vm.assume( addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C ); } function readEIP1559ScriptArtifact(string memory path) internal view virtual returns (EIP1559ScriptArtifact memory) { string memory data = vm.readFile(path); bytes memory parsedData = vm.parseJson(data); RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); EIP1559ScriptArtifact memory artifact; artifact.libraries = rawArtifact.libraries; artifact.path = rawArtifact.path; artifact.timestamp = rawArtifact.timestamp; artifact.pending = rawArtifact.pending; artifact.txReturns = rawArtifact.txReturns; artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); return artifact; } function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { Tx1559[] memory txs = new Tx1559[](rawTxs.length); for (uint256 i; i < rawTxs.length; i++) { txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); } return txs; } function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { Tx1559 memory transaction; transaction.arguments = rawTx.arguments; transaction.contractName = rawTx.contractName; transaction.functionSig = rawTx.functionSig; transaction.hash = rawTx.hash; transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); transaction.opcode = rawTx.opcode; return transaction; } function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) internal pure virtual returns (Tx1559Detail memory) { Tx1559Detail memory txDetail; txDetail.data = rawDetail.data; txDetail.from = rawDetail.from; txDetail.to = rawDetail.to; txDetail.nonce = _bytesToUint(rawDetail.nonce); txDetail.txType = _bytesToUint(rawDetail.txType); txDetail.value = _bytesToUint(rawDetail.value); txDetail.gas = _bytesToUint(rawDetail.gas); txDetail.accessList = rawDetail.accessList; return txDetail; } function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { string memory deployData = vm.readFile(path); bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); return rawToConvertedEIPTx1559s(rawTxs); } function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { string memory deployData = vm.readFile(path); string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); bytes memory parsedDeployData = vm.parseJson(deployData, key); RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); return rawToConvertedEIPTx1559(rawTx); } // Analogous to readTransactions, but for receipts. function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { string memory deployData = vm.readFile(path); bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); return rawToConvertedReceipts(rawReceipts); } function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { string memory deployData = vm.readFile(path); string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); bytes memory parsedDeployData = vm.parseJson(deployData, key); RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); return rawToConvertedReceipt(rawReceipt); } function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { Receipt[] memory receipts = new Receipt[](rawReceipts.length); for (uint256 i; i < rawReceipts.length; i++) { receipts[i] = rawToConvertedReceipt(rawReceipts[i]); } return receipts; } function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { Receipt memory receipt; receipt.blockHash = rawReceipt.blockHash; receipt.to = rawReceipt.to; receipt.from = rawReceipt.from; receipt.contractAddress = rawReceipt.contractAddress; receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); receipt.status = _bytesToUint(rawReceipt.status); receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); receipt.logsBloom = rawReceipt.logsBloom; receipt.transactionHash = rawReceipt.transactionHash; return receipt; } function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) internal pure virtual returns (ReceiptLog[] memory) { ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); for (uint256 i; i < rawLogs.length; i++) { logs[i].logAddress = rawLogs[i].logAddress; logs[i].blockHash = rawLogs[i].blockHash; logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); logs[i].data = rawLogs[i].data; logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); logs[i].topics = rawLogs[i].topics; logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); logs[i].removed = rawLogs[i].removed; } return logs; } // Deploy a contract by fetching the contract bytecode from // the artifacts directory // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); /// @solidity memory-safe-assembly assembly { addr := create(0, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); } function deployCode(string memory what) internal virtual returns (address addr) { bytes memory bytecode = vm.getCode(what); /// @solidity memory-safe-assembly assembly { addr := create(0, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); } /// @dev deploy contract with value on construction function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); /// @solidity memory-safe-assembly assembly { addr := create(val, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); } function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { bytes memory bytecode = vm.getCode(what); /// @solidity memory-safe-assembly assembly { addr := create(val, add(bytecode, 0x20), mload(bytecode)) } require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); } // creates a labeled address and the corresponding private key function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { privateKey = uint256(keccak256(abi.encodePacked(name))); addr = vm.addr(privateKey); vm.label(addr, name); } // creates a labeled address function makeAddr(string memory name) internal virtual returns (address addr) { (addr,) = makeAddrAndKey(name); } // Destroys an account immediately, sending the balance to beneficiary. // Destroying means: balance will be zero, code will be empty, and nonce will be 0 // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce // only after tx ends, this will run immediately. function destroyAccount(address who, address beneficiary) internal virtual { uint256 currBalance = who.balance; vm.etch(who, abi.encode()); vm.deal(who, 0); vm.resetNonce(who); uint256 beneficiaryBalance = beneficiary.balance; vm.deal(beneficiary, currBalance + beneficiaryBalance); } // creates a struct containing both a labeled address and the corresponding private key function makeAccount(string memory name) internal virtual returns (Account memory account) { (account.addr, account.key) = makeAddrAndKey(name); } function deriveRememberKey(string memory mnemonic, uint32 index) internal virtual returns (address who, uint256 privateKey) { privateKey = vm.deriveKey(mnemonic, index); who = vm.rememberKey(privateKey); } function _bytesToUint(bytes memory b) private pure returns (uint256) { require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); } function isFork() internal view virtual returns (bool status) { try vm.activeFork() { status = true; } catch (bytes memory) {} } modifier skipWhenForking() { if (!isFork()) { _; } } modifier skipWhenNotForking() { if (isFork()) { _; } } modifier noGasMetering() { vm.pauseGasMetering(); // To prevent turning gas monitoring back on with nested functions that use this modifier, // we check if gasMetering started in the off position. If it did, we don't want to turn // it back on until we exit the top level function that used the modifier // // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. // funcA will have `gasStartedOff` as false, funcB will have it as true, // so we only turn metering back on at the end of the funcA bool gasStartedOff = gasMeteringOff; gasMeteringOff = true; _; // if gas metering was on when this modifier was called, turn it back on at the end if (!gasStartedOff) { gasMeteringOff = false; vm.resumeGasMetering(); } } // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We // can't simply access the chain ID in a normal view or pure function because the solc View Pure // Checker changed `chainid` from pure to view in 0.8.0. function _viewChainId() private view returns (uint256 chainId) { // Assembly required since `block.chainid` was introduced in 0.8.0. assembly { chainId := chainid() } address(this); // Silence warnings in older Solc versions. } function _pureChainId() private pure returns (uint256 chainId) { function() internal view returns (uint256) fnIn = _viewChainId; function() internal pure returns (uint256) pureChainId; assembly { pureChainId := fnIn } chainId = pureChainId(); } } // Wrappers around cheatcodes to avoid footguns abstract contract StdCheats is StdCheatsSafe { using stdStorage for StdStorage; StdStorage private stdstore; Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; // Skip forward or rewind time by the specified number of seconds function skip(uint256 time) internal virtual { vm.warp(block.timestamp + time); } function rewind(uint256 time) internal virtual { vm.warp(block.timestamp - time); } // Setup a prank from an address that has some ether function hoax(address msgSender) internal virtual { vm.deal(msgSender, 1 << 128); vm.prank(msgSender); } function hoax(address msgSender, uint256 give) internal virtual { vm.deal(msgSender, give); vm.prank(msgSender); } function hoax(address msgSender, address origin) internal virtual { vm.deal(msgSender, 1 << 128); vm.prank(msgSender, origin); } function hoax(address msgSender, address origin, uint256 give) internal virtual { vm.deal(msgSender, give); vm.prank(msgSender, origin); } // Start perpetual prank from an address that has some ether function startHoax(address msgSender) internal virtual { vm.deal(msgSender, 1 << 128); vm.startPrank(msgSender); } function startHoax(address msgSender, uint256 give) internal virtual { vm.deal(msgSender, give); vm.startPrank(msgSender); } // Start perpetual prank from an address that has some ether // tx.origin is set to the origin parameter function startHoax(address msgSender, address origin) internal virtual { vm.deal(msgSender, 1 << 128); vm.startPrank(msgSender, origin); } function startHoax(address msgSender, address origin, uint256 give) internal virtual { vm.deal(msgSender, give); vm.startPrank(msgSender, origin); } function changePrank(address msgSender) internal virtual { console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead."); vm.stopPrank(); vm.startPrank(msgSender); } function changePrank(address msgSender, address txOrigin) internal virtual { vm.stopPrank(); vm.startPrank(msgSender, txOrigin); } // The same as Vm's `deal` // Use the alternative signature for ERC20 tokens function deal(address to, uint256 give) internal virtual { vm.deal(to, give); } // Set the balance of an account for any ERC20 token // Use the alternative signature to update `totalSupply` function deal(address token, address to, uint256 give) internal virtual { deal(token, to, give, false); } // Set the balance of an account for any ERC1155 token // Use the alternative signature to update `totalSupply` function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { dealERC1155(token, to, id, give, false); } function deal(address token, address to, uint256 give, bool adjust) internal virtual { // get current balance (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); uint256 prevBal = abi.decode(balData, (uint256)); // update balance stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); // update total supply if (adjust) { (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd)); uint256 totSup = abi.decode(totSupData, (uint256)); if (give < prevBal) { totSup -= (prevBal - give); } else { totSup += (give - prevBal); } stdstore.target(token).sig(0x18160ddd).checked_write(totSup); } } function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { // get current balance (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id)); uint256 prevBal = abi.decode(balData, (uint256)); // update balance stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); // update total supply if (adjust) { (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id)); require( totSupData.length != 0, "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." ); uint256 totSup = abi.decode(totSupData, (uint256)); if (give < prevBal) { totSup -= (prevBal - give); } else { totSup += (give - prevBal); } stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); } } function dealERC721(address token, address to, uint256 id) internal virtual { // check if token id is already minted and the actual owner. (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); // get owner current balance (, bytes memory fromBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); // get new user current balance (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); uint256 toPrevBal = abi.decode(toBalData, (uint256)); // update balances stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); // update owner stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); } function deployCodeTo(string memory what, address where) internal virtual { deployCodeTo(what, "", 0, where); } function deployCodeTo(string memory what, bytes memory args, address where) internal virtual { deployCodeTo(what, args, 0, where); } function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual { bytes memory creationCode = vm.getCode(what); vm.etch(where, abi.encodePacked(creationCode, args)); (bool success, bytes memory runtimeBytecode) = where.call{value: value}(""); require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); vm.etch(where, runtimeBytecode); } // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. function console2_log_StdCheats(string memory p0) private view { (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0)); status; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; pragma experimental ABIEncoderV2; import {VmSafe} from "./Vm.sol"; // Helpers for parsing and writing JSON files // To parse: // ``` // using stdJson for string; // string memory json = vm.readFile("<some_path>"); // json.readUint("<json_path>"); // ``` // To write: // ``` // using stdJson for string; // string memory json = "json"; // json.serialize("a", uint256(123)); // string memory semiFinal = json.serialize("b", string("test")); // string memory finalJson = json.serialize("c", semiFinal); // finalJson.write("<some_path>"); // ``` library stdJson { VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { return vm.parseJson(json, key); } function readUint(string memory json, string memory key) internal pure returns (uint256) { return vm.parseJsonUint(json, key); } function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) { return vm.parseJsonUintArray(json, key); } function readInt(string memory json, string memory key) internal pure returns (int256) { return vm.parseJsonInt(json, key); } function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) { return vm.parseJsonIntArray(json, key); } function readBytes32(string memory json, string memory key) internal pure returns (bytes32) { return vm.parseJsonBytes32(json, key); } function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) { return vm.parseJsonBytes32Array(json, key); } function readString(string memory json, string memory key) internal pure returns (string memory) { return vm.parseJsonString(json, key); } function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) { return vm.parseJsonStringArray(json, key); } function readAddress(string memory json, string memory key) internal pure returns (address) { return vm.parseJsonAddress(json, key); } function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) { return vm.parseJsonAddressArray(json, key); } function readBool(string memory json, string memory key) internal pure returns (bool) { return vm.parseJsonBool(json, key); } function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) { return vm.parseJsonBoolArray(json, key); } function readBytes(string memory json, string memory key) internal pure returns (bytes memory) { return vm.parseJsonBytes(json, key); } function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) { return vm.parseJsonBytesArray(json, key); } function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { return vm.serializeJson(jsonKey, rootObject); } function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { return vm.serializeBool(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bool[] memory value) internal returns (string memory) { return vm.serializeBool(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { return vm.serializeUint(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, uint256[] memory value) internal returns (string memory) { return vm.serializeUint(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { return vm.serializeInt(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, int256[] memory value) internal returns (string memory) { return vm.serializeInt(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { return vm.serializeAddress(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, address[] memory value) internal returns (string memory) { return vm.serializeAddress(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { return vm.serializeBytes32(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes32[] memory value) internal returns (string memory) { return vm.serializeBytes32(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { return vm.serializeBytes(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, bytes[] memory value) internal returns (string memory) { return vm.serializeBytes(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, string memory value) internal returns (string memory) { return vm.serializeString(jsonKey, key, value); } function serialize(string memory jsonKey, string memory key, string[] memory value) internal returns (string memory) { return vm.serializeString(jsonKey, key, value); } function write(string memory jsonKey, string memory path) internal { vm.writeJson(jsonKey, path); } function write(string memory jsonKey, string memory path, string memory valueKey) internal { vm.writeJson(jsonKey, path, valueKey); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; library stdMath { int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; function abs(int256 a) internal pure returns (uint256) { // Required or it will fail when `a = type(int256).min` if (a == INT256_MIN) { return 57896044618658097711785492504343953926634992332820282019728792003956564819968; } return uint256(a > 0 ? a : -a); } function delta(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a - b : b - a; } function delta(int256 a, int256 b) internal pure returns (uint256) { // a and b are of the same sign // this works thanks to two's complement, the left-most bit is the sign bit if ((a ^ b) > -1) { return delta(abs(a), abs(b)); } // a and b are of opposite signs return abs(a) + abs(b); } function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { uint256 absDelta = delta(a, b); return absDelta * 1e18 / b; } function percentDelta(int256 a, int256 b) internal pure returns (uint256) { uint256 absDelta = delta(a, b); uint256 absB = abs(b); return absDelta * 1e18 / absB; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {Vm} from "./Vm.sol"; struct FindData { uint256 slot; uint256 offsetLeft; uint256 offsetRight; bool found; } struct StdStorage { mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds; bytes32[] _keys; bytes4 _sig; uint256 _depth; address _target; bytes32 _set; bool _enable_packed_slots; bytes _calldata; } library stdStorageSafe { event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); event WARNING_UninitedSlot(address who, uint256 slot); Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; function sigs(string memory sigStr) internal pure returns (bytes4) { return bytes4(keccak256(bytes(sigStr))); } function getCallParams(StdStorage storage self) internal view returns (bytes memory) { if (self._calldata.length == 0) { return flatten(self._keys); } else { return self._calldata; } } // Calls target contract with configured parameters function callTarget(StdStorage storage self) internal view returns (bool, bytes32) { bytes memory cald = abi.encodePacked(self._sig, getCallParams(self)); (bool success, bytes memory rdat) = self._target.staticcall(cald); bytes32 result = bytesToBytes32(rdat, 32 * self._depth); return (success, result); } // Tries mutating slot value to determine if the targeted value is stored in it. // If current value is 0, then we are setting slot value to type(uint256).max // Otherwise, we set it to 0. That way, return value should always be affected. function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) { bytes32 prevSlotValue = vm.load(self._target, slot); (bool success, bytes32 prevReturnValue) = callTarget(self); bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0); vm.store(self._target, slot, testVal); (, bytes32 newReturnValue) = callTarget(self); vm.store(self._target, slot, prevSlotValue); return (success && (prevReturnValue != newReturnValue)); } // Tries setting one of the bits in slot to 1 until return value changes. // Index of resulted bit is an offset packed slot has from left/right side function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) { for (uint256 offset = 0; offset < 256; offset++) { uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset); vm.store(self._target, slot, bytes32(valueToPut)); (bool success, bytes32 data) = callTarget(self); if (success && (uint256(data) > 0)) { return (true, offset); } } return (false, 0); } function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) { bytes32 prevSlotValue = vm.load(self._target, slot); (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true); (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false); // `findOffset` may mutate slot value, so we are setting it to initial value vm.store(self._target, slot, prevSlotValue); return (foundLeft && foundRight, offsetLeft, offsetRight); } function find(StdStorage storage self) internal returns (FindData storage) { return find(self, true); } /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against // slot complexity: // if flat, will be bytes32(uint256(uint)); // if map, will be keccak256(abi.encode(key, uint(slot))); // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); function find(StdStorage storage self, bool _clear) internal returns (FindData storage) { address who = self._target; bytes4 fsig = self._sig; uint256 field_depth = self._depth; bytes memory params = getCallParams(self); // calldata to test against if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { if (_clear) { clear(self); } return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; } vm.record(); (, bytes32 callResult) = callTarget(self); (bytes32[] memory reads,) = vm.accesses(address(who)); if (reads.length == 0) { revert("stdStorage find(StdStorage): No storage use detected for target."); } else { for (uint256 i = reads.length; --i >= 0;) { bytes32 prev = vm.load(who, reads[i]); if (prev == bytes32(0)) { emit WARNING_UninitedSlot(who, uint256(reads[i])); } if (!checkSlotMutatesCall(self, reads[i])) { continue; } (uint256 offsetLeft, uint256 offsetRight) = (0, 0); if (self._enable_packed_slots) { bool found; (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]); if (!found) { continue; } } // Check that value between found offsets is equal to the current call result uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight; if (uint256(callResult) != curVal) { continue; } emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i])); self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] = FindData(uint256(reads[i]), offsetLeft, offsetRight, true); break; } } require( self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found, "stdStorage find(StdStorage): Slot(s) not found." ); if (_clear) { clear(self); } return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; } function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { self._target = _target; return self; } function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { self._sig = _sig; return self; } function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { self._sig = sigs(_sig); return self; } function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { self._calldata = _calldata; return self; } function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { self._keys.push(bytes32(uint256(uint160(who)))); return self; } function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { self._keys.push(bytes32(amt)); return self; } function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { self._keys.push(key); return self; } function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { self._enable_packed_slots = true; return self; } function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { self._depth = _depth; return self; } function read(StdStorage storage self) private returns (bytes memory) { FindData storage data = find(self, false); uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight); uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight; clear(self); return abi.encode(value); } function read_bytes32(StdStorage storage self) internal returns (bytes32) { return abi.decode(read(self), (bytes32)); } function read_bool(StdStorage storage self) internal returns (bool) { int256 v = read_int(self); if (v == 0) return false; if (v == 1) return true; revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); } function read_address(StdStorage storage self) internal returns (address) { return abi.decode(read(self), (address)); } function read_uint(StdStorage storage self) internal returns (uint256) { return abi.decode(read(self), (uint256)); } function read_int(StdStorage storage self) internal returns (int256) { return abi.decode(read(self), (int256)); } function parent(StdStorage storage self) internal returns (uint256, bytes32) { address who = self._target; uint256 field_depth = self._depth; vm.startMappingRecording(); uint256 child = find(self, true).slot - field_depth; (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); if (!found) { revert( "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." ); } return (uint256(parent_slot), key); } function root(StdStorage storage self) internal returns (uint256) { address who = self._target; uint256 field_depth = self._depth; vm.startMappingRecording(); uint256 child = find(self, true).slot - field_depth; bool found; bytes32 root_slot; bytes32 parent_slot; (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); if (!found) { revert( "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." ); } while (found) { root_slot = parent_slot; (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot)); } return uint256(root_slot); } function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { bytes32 out; uint256 max = b.length > 32 ? 32 : b.length; for (uint256 i = 0; i < max; i++) { out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); } return out; } function flatten(bytes32[] memory b) private pure returns (bytes memory) { bytes memory result = new bytes(b.length * 32); for (uint256 i = 0; i < b.length; i++) { bytes32 k = b[i]; /// @solidity memory-safe-assembly assembly { mstore(add(result, add(32, mul(32, i))), k) } } return result; } function clear(StdStorage storage self) internal { delete self._target; delete self._sig; delete self._keys; delete self._depth; delete self._enable_packed_slots; delete self._calldata; } // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight` // (slotValue & mask) >> offsetRight will be the value of the given packed variable function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) { // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight; // using assembly because (1 << 256) causes overflow assembly { mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1)) } } // Returns slot value with updated packed variable. function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight) internal pure returns (bytes32 newValue) { return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight)); } } library stdStorage { Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); function sigs(string memory sigStr) internal pure returns (bytes4) { return stdStorageSafe.sigs(sigStr); } function find(StdStorage storage self) internal returns (uint256) { return find(self, true); } function find(StdStorage storage self, bool _clear) internal returns (uint256) { return stdStorageSafe.find(self, _clear).slot; } function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { return stdStorageSafe.target(self, _target); } function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { return stdStorageSafe.sig(self, _sig); } function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { return stdStorageSafe.sig(self, _sig); } function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { return stdStorageSafe.with_key(self, who); } function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { return stdStorageSafe.with_key(self, amt); } function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { return stdStorageSafe.with_key(self, key); } function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { return stdStorageSafe.with_calldata(self, _calldata); } function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { return stdStorageSafe.enable_packed_slots(self); } function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { return stdStorageSafe.depth(self, _depth); } function clear(StdStorage storage self) internal { stdStorageSafe.clear(self); } function checked_write(StdStorage storage self, address who) internal { checked_write(self, bytes32(uint256(uint160(who)))); } function checked_write(StdStorage storage self, uint256 amt) internal { checked_write(self, bytes32(amt)); } function checked_write_int(StdStorage storage self, int256 val) internal { checked_write(self, bytes32(uint256(val))); } function checked_write(StdStorage storage self, bool write) internal { bytes32 t; /// @solidity memory-safe-assembly assembly { t := write } checked_write(self, t); } function checked_write(StdStorage storage self, bytes32 set) internal { address who = self._target; bytes4 fsig = self._sig; uint256 field_depth = self._depth; bytes memory params = stdStorageSafe.getCallParams(self); if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { find(self, false); } FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; if ((data.offsetLeft + data.offsetRight) > 0) { uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight)); require( uint256(set) < maxVal, string( abi.encodePacked( "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ", vm.toString(maxVal) ) ) ); } bytes32 curVal = vm.load(who, bytes32(data.slot)); bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight); vm.store(who, bytes32(data.slot), valToSet); (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self); if (!success || callResult != set) { vm.store(who, bytes32(data.slot), curVal); revert("stdStorage find(StdStorage): Failed to write value."); } clear(self); } function read_bytes32(StdStorage storage self) internal returns (bytes32) { return stdStorageSafe.read_bytes32(self); } function read_bool(StdStorage storage self) internal returns (bool) { return stdStorageSafe.read_bool(self); } function read_address(StdStorage storage self) internal returns (address) { return stdStorageSafe.read_address(self); } function read_uint(StdStorage storage self) internal returns (uint256) { return stdStorageSafe.read_uint(self); } function read_int(StdStorage storage self) internal returns (int256) { return stdStorageSafe.read_int(self); } function parent(StdStorage storage self) internal returns (uint256, bytes32) { return stdStorageSafe.parent(self); } function root(StdStorage storage self) internal returns (uint256) { return stdStorageSafe.root(self); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import {VmSafe} from "./Vm.sol"; library StdStyle { VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); string constant RED = "\u001b[91m"; string constant GREEN = "\u001b[92m"; string constant YELLOW = "\u001b[93m"; string constant BLUE = "\u001b[94m"; string constant MAGENTA = "\u001b[95m"; string constant CYAN = "\u001b[96m"; string constant BOLD = "\u001b[1m"; string constant DIM = "\u001b[2m"; string constant ITALIC = "\u001b[3m"; string constant UNDERLINE = "\u001b[4m"; string constant INVERSE = "\u001b[7m"; string constant RESET = "\u001b[0m"; function styleConcat(string memory style, string memory self) private pure returns (string memory) { return string(abi.encodePacked(style, self, RESET)); } function red(string memory self) internal pure returns (string memory) { return styleConcat(RED, self); } function red(uint256 self) internal pure returns (string memory) { return red(vm.toString(self)); } function red(int256 self) internal pure returns (string memory) { return red(vm.toString(self)); } function red(address self) internal pure returns (string memory) { return red(vm.toString(self)); } function red(bool self) internal pure returns (string memory) { return red(vm.toString(self)); } function redBytes(bytes memory self) internal pure returns (string memory) { return red(vm.toString(self)); } function redBytes32(bytes32 self) internal pure returns (string memory) { return red(vm.toString(self)); } function green(string memory self) internal pure returns (string memory) { return styleConcat(GREEN, self); } function green(uint256 self) internal pure returns (string memory) { return green(vm.toString(self)); } function green(int256 self) internal pure returns (string memory) { return green(vm.toString(self)); } function green(address self) internal pure returns (string memory) { return green(vm.toString(self)); } function green(bool self) internal pure returns (string memory) { return green(vm.toString(self)); } function greenBytes(bytes memory self) internal pure returns (string memory) { return green(vm.toString(self)); } function greenBytes32(bytes32 self) internal pure returns (string memory) { return green(vm.toString(self)); } function yellow(string memory self) internal pure returns (string memory) { return styleConcat(YELLOW, self); } function yellow(uint256 self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellow(int256 self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellow(address self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellow(bool self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellowBytes(bytes memory self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function yellowBytes32(bytes32 self) internal pure returns (string memory) { return yellow(vm.toString(self)); } function blue(string memory self) internal pure returns (string memory) { return styleConcat(BLUE, self); } function blue(uint256 self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blue(int256 self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blue(address self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blue(bool self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blueBytes(bytes memory self) internal pure returns (string memory) { return blue(vm.toString(self)); } function blueBytes32(bytes32 self) internal pure returns (string memory) { return blue(vm.toString(self)); } function magenta(string memory self) internal pure returns (string memory) { return styleConcat(MAGENTA, self); } function magenta(uint256 self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magenta(int256 self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magenta(address self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magenta(bool self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magentaBytes(bytes memory self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function magentaBytes32(bytes32 self) internal pure returns (string memory) { return magenta(vm.toString(self)); } function cyan(string memory self) internal pure returns (string memory) { return styleConcat(CYAN, self); } function cyan(uint256 self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyan(int256 self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyan(address self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyan(bool self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyanBytes(bytes memory self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function cyanBytes32(bytes32 self) internal pure returns (string memory) { return cyan(vm.toString(self)); } function bold(string memory self) internal pure returns (string memory) { return styleConcat(BOLD, self); } function bold(uint256 self) internal pure returns (string memory) { return bold(vm.toString(self)); } function bold(int256 self) internal pure returns (string memory) { return bold(vm.toString(self)); } function bold(address self) internal pure returns (string memory) { return bold(vm.toString(self)); } function bold(bool self) internal pure returns (string memory) { return bold(vm.toString(self)); } function boldBytes(bytes memory self) internal pure returns (string memory) { return bold(vm.toString(self)); } function boldBytes32(bytes32 self) internal pure returns (string memory) { return bold(vm.toString(self)); } function dim(string memory self) internal pure returns (string memory) { return styleConcat(DIM, self); } function dim(uint256 self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dim(int256 self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dim(address self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dim(bool self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dimBytes(bytes memory self) internal pure returns (string memory) { return dim(vm.toString(self)); } function dimBytes32(bytes32 self) internal pure returns (string memory) { return dim(vm.toString(self)); } function italic(string memory self) internal pure returns (string memory) { return styleConcat(ITALIC, self); } function italic(uint256 self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italic(int256 self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italic(address self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italic(bool self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italicBytes(bytes memory self) internal pure returns (string memory) { return italic(vm.toString(self)); } function italicBytes32(bytes32 self) internal pure returns (string memory) { return italic(vm.toString(self)); } function underline(string memory self) internal pure returns (string memory) { return styleConcat(UNDERLINE, self); } function underline(uint256 self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underline(int256 self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underline(address self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underline(bool self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underlineBytes(bytes memory self) internal pure returns (string memory) { return underline(vm.toString(self)); } function underlineBytes32(bytes32 self) internal pure returns (string memory) { return underline(vm.toString(self)); } function inverse(string memory self) internal pure returns (string memory) { return styleConcat(INVERSE, self); } function inverse(uint256 self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverse(int256 self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverse(address self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverse(bool self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverseBytes(bytes memory self) internal pure returns (string memory) { return inverse(vm.toString(self)); } function inverseBytes32(bytes32 self) internal pure returns (string memory) { return inverse(vm.toString(self)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; import {IMulticall3} from "./interfaces/IMulticall3.sol"; import {MockERC20} from "./mocks/MockERC20.sol"; import {MockERC721} from "./mocks/MockERC721.sol"; import {VmSafe} from "./Vm.sol"; abstract contract StdUtils { /*////////////////////////////////////////////////////////////////////////// CONSTANTS //////////////////////////////////////////////////////////////////////////*/ IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; uint256 private constant INT256_MIN_ABS = 57896044618658097711785492504343953926634992332820282019728792003956564819968; uint256 private constant SECP256K1_ORDER = 115792089237316195423570985008687907852837564279074904382605163141518161494337; uint256 private constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; /*////////////////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); // If x is between min and max, return x directly. This is to ensure that dictionary values // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 if (x >= min && x <= max) return x; uint256 size = max - min + 1; // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. // This helps ensure coverage of the min/max values. if (x <= 3 && size > x) return min + x; if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. if (x > max) { uint256 diff = x - max; uint256 rem = diff % size; if (rem == 0) return max; result = min + rem - 1; } else if (x < min) { uint256 diff = min - x; uint256 rem = diff % size; if (rem == 0) return min; result = max - rem + 1; } } function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { result = _bound(x, min, max); console2_log_StdUtils("Bound result", result); } function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); // Shifting all int256 values to uint256 to use _bound function. The range of two types are: // int256 : -(2**255) ~ (2**255 - 1) // uint256: 0 ~ (2**256 - 1) // So, add 2**255, INT256_MIN_ABS to the integer values. // // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. // So, use `~uint256(x) + 1` instead. uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); uint256 y = _bound(_x, _min, _max); // To move it back to int256 value, subtract INT256_MIN_ABS at here. result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); } function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { result = _bound(x, min, max); console2_log_StdUtils("Bound result", vm.toString(result)); } function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) { result = _bound(privateKey, 1, SECP256K1_ORDER - 1); } function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); } /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead."); return vm.computeCreateAddress(deployer, nonce); } function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) internal pure virtual returns (address) { console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); return vm.computeCreate2Address(salt, initcodeHash, deployer); } /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); return vm.computeCreate2Address(salt, initCodeHash); } /// @dev returns an initialized mock ERC20 contract function deployMockERC20(string memory name, string memory symbol, uint8 decimals) internal returns (MockERC20 mock) { mock = new MockERC20(); mock.initialize(name, symbol, decimals); } /// @dev returns an initialized mock ERC721 contract function deployMockERC721(string memory name, string memory symbol) internal returns (MockERC721 mock) { mock = new MockERC721(); mock.initialize(name, symbol); } /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { return hashInitCode(creationCode, ""); } /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode /// @param args the ABI-encoded arguments to the constructor of C function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { return keccak256(abi.encodePacked(creationCode, args)); } // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. function getTokenBalances(address token, address[] memory addresses) internal virtual returns (uint256[] memory balances) { uint256 tokenCodeSize; assembly { tokenCodeSize := extcodesize(token) } require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); // ABI encode the aggregate call to Multicall3. uint256 length = addresses.length; IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); for (uint256 i = 0; i < length; ++i) { // 0x70a08231 = bytes4("balanceOf(address)")) calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); } // Make the aggregate call. (, bytes[] memory returnData) = multicall.aggregate(calls); // ABI decode the return data and return the balances. balances = new uint256[](length); for (uint256 i = 0; i < length; ++i) { balances[i] = abi.decode(returnData[i], (uint256)); } } /*////////////////////////////////////////////////////////////////////////// PRIVATE FUNCTIONS //////////////////////////////////////////////////////////////////////////*/ function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { return address(uint160(uint256(bytesValue))); } // This section is used to prevent the compilation of console, which shortens the compilation time when console is // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid // any breaking changes to function signatures. function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn) internal pure returns (function(bytes memory) internal pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castLogPayloadViewToPure(_sendLogPayloadView)(payload); } function _sendLogPayloadView(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE2_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function console2_log_StdUtils(string memory p0) private pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function console2_log_StdUtils(string memory p0, uint256 p1) private pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function console2_log_StdUtils(string memory p0, string memory p1) private pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } }
// Automatically @generated by scripts/vm.py. Do not modify manually. // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; /// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may /// result in Script simulations differing from on-chain execution. It is recommended to only use /// these cheats in scripts. interface VmSafe { /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`. enum CallerMode { // No caller modification is currently active. None, // A one time broadcast triggered by a `vm.broadcast()` call is currently active. Broadcast, // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active. RecurrentBroadcast, // A one time prank triggered by a `vm.prank()` call is currently active. Prank, // A recurrent prank triggered by a `vm.startPrank()` call is currently active. RecurrentPrank } /// The kind of account access that occurred. enum AccountAccessKind { // The account was called. Call, // The account was called via delegatecall. DelegateCall, // The account was called via callcode. CallCode, // The account was called via staticcall. StaticCall, // The account was created. Create, // The account was selfdestructed. SelfDestruct, // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess). Resume, // The account's balance was read. Balance, // The account's codesize was read. Extcodesize, // The account's codehash was read. Extcodehash, // The account's code was copied. Extcodecopy } /// Forge execution contexts. enum ForgeContext { // Test group execution context (test, coverage or snapshot). TestGroup, // `forge test` execution context. Test, // `forge coverage` execution context. Coverage, // `forge snapshot` execution context. Snapshot, // Script group execution context (dry run, broadcast or resume). ScriptGroup, // `forge script` execution context. ScriptDryRun, // `forge script --broadcast` execution context. ScriptBroadcast, // `forge script --resume` execution context. ScriptResume, // Unknown `forge` execution context. Unknown } /// An Ethereum log. Returned by `getRecordedLogs`. struct Log { // The topics of the log, including the signature, if any. bytes32[] topics; // The raw data of the log. bytes data; // The address of the log's emitter. address emitter; } /// An RPC URL and its alias. Returned by `rpcUrlStructs`. struct Rpc { // The alias of the RPC URL. string key; // The RPC URL. string url; } /// An RPC log object. Returned by `eth_getLogs`. struct EthGetLogs { // The address of the log's emitter. address emitter; // The topics of the log, including the signature, if any. bytes32[] topics; // The raw data of the log. bytes data; // The block hash. bytes32 blockHash; // The block number. uint64 blockNumber; // The transaction hash. bytes32 transactionHash; // The transaction index in the block. uint64 transactionIndex; // The log index. uint256 logIndex; // Whether the log was removed. bool removed; } /// A single entry in a directory listing. Returned by `readDir`. struct DirEntry { // The error message, if any. string errorMessage; // The path of the entry. string path; // The depth of the entry. uint64 depth; // Whether the entry is a directory. bool isDir; // Whether the entry is a symlink. bool isSymlink; } /// Metadata information about a file. /// This structure is returned from the `fsMetadata` function and represents known /// metadata about a file such as its permissions, size, modification /// times, etc. struct FsMetadata { // True if this metadata is for a directory. bool isDir; // True if this metadata is for a symlink. bool isSymlink; // The size of the file, in bytes, this metadata is for. uint256 length; // True if this metadata is for a readonly (unwritable) file. bool readOnly; // The last modification time listed in this metadata. uint256 modified; // The last access time of this metadata. uint256 accessed; // The creation time listed in this metadata. uint256 created; } /// A wallet with a public and private key. struct Wallet { // The wallet's address. address addr; // The wallet's public key `X`. uint256 publicKeyX; // The wallet's public key `Y`. uint256 publicKeyY; // The wallet's private key. uint256 privateKey; } /// The result of a `tryFfi` call. struct FfiResult { // The exit code of the call. int32 exitCode; // The optionally hex-decoded `stdout` data. bytes stdout; // The `stderr` data. bytes stderr; } /// Information on the chain and fork. struct ChainInfo { // The fork identifier. Set to zero if no fork is active. uint256 forkId; // The chain ID of the current fork. uint256 chainId; } /// The result of a `stopAndReturnStateDiff` call. struct AccountAccess { // The chain and fork the access occurred. ChainInfo chainInfo; // The kind of account access that determines what the account is. // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee. // If kind is Create, then the account is the newly created account. // If kind is SelfDestruct, then the account is the selfdestruct recipient. // If kind is a Resume, then account represents a account context that has resumed. AccountAccessKind kind; // The account that was accessed. // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT. address account; // What accessed the account. address accessor; // If the account was initialized or empty prior to the access. // An account is considered initialized if it has code, a // non-zero nonce, or a non-zero balance. bool initialized; // The previous balance of the accessed account. uint256 oldBalance; // The potential new balance of the accessed account. // That is, all balance changes are recorded here, even if reverts occurred. uint256 newBalance; // Code of the account deployed by CREATE. bytes deployedCode; // Value passed along with the account access uint256 value; // Input data provided to the CREATE or CALL bytes data; // If this access reverted in either the current or parent context. bool reverted; // An ordered list of storage accesses made during an account access operation. StorageAccess[] storageAccesses; // Call depth traversed during the recording of state differences uint64 depth; } /// The storage accessed during an `AccountAccess`. struct StorageAccess { // The account whose storage was accessed. address account; // The slot that was accessed. bytes32 slot; // If the access was a write. bool isWrite; // The previous value of the slot. bytes32 previousValue; // The new value of the slot. bytes32 newValue; // If the access was reverted. bool reverted; } /// Gas used. Returned by `lastCallGas`. struct Gas { // The gas limit of the call. uint64 gasLimit; // The total gas used. uint64 gasTotalUsed; // DEPRECATED: The amount of gas used for memory expansion. Ref: <https://github.com/foundry-rs/foundry/pull/7934#pullrequestreview-2069236939> uint64 gasMemoryUsed; // The amount of gas refunded. int64 gasRefunded; // The amount of gas remaining. uint64 gasRemaining; } // ======== Crypto ======== /// Derives a private key from the name, labels the account with that name, and returns the wallet. function createWallet(string calldata walletLabel) external returns (Wallet memory wallet); /// Generates a wallet from the private key and returns the wallet. function createWallet(uint256 privateKey) external returns (Wallet memory wallet); /// Generates a wallet from the private key, labels the account with that name, and returns the wallet. function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet); /// Derive a private key from a provided mnenomic string (or mnenomic file path) /// at the derivation path `m/44'/60'/0'/0/{index}`. function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); /// Derive a private key from a provided mnenomic string (or mnenomic file path) /// at `{derivationPath}{index}`. function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) external pure returns (uint256 privateKey); /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language /// at the derivation path `m/44'/60'/0'/0/{index}`. function deriveKey(string calldata mnemonic, uint32 index, string calldata language) external pure returns (uint256 privateKey); /// Derive a private key from a provided mnenomic string (or mnenomic file path) in the specified language /// at `{derivationPath}{index}`. function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language) external pure returns (uint256 privateKey); /// Adds a private key to the local forge wallet and returns the address. function rememberKey(uint256 privateKey) external returns (address keyAddr); /// Signs data with a `Wallet`. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs); /// Signs `digest` with `privateKey` using the secp256k1 curve. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. /// If `--sender` is provided, the signer with provided address is used, otherwise, /// if exactly one signer is provided to the script, that signer is used. /// Raises error if signer passed through `--sender` does not match any unlocked signers or /// if `--sender` is not provided and not exactly one signer is passed to the script. function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the /// signature's `s` value, and the recovery id `v` in a single bytes32. /// This format reduces the signature size from 65 to 64 bytes. /// Raises error if none of the signers passed into the script have provided address. function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs); /// Signs `digest` with `privateKey` using the secp256r1 curve. function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s); /// Signs data with a `Wallet`. function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s); /// Signs `digest` with `privateKey` using the secp256k1 curve. function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// If `--sender` is provided, the signer with provided address is used, otherwise, /// if exactly one signer is provided to the script, that signer is used. /// Raises error if signer passed through `--sender` does not match any unlocked signers or /// if `--sender` is not provided and not exactly one signer is passed to the script. function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); /// Signs `digest` with signer provided to script using the secp256k1 curve. /// Raises error if none of the signers passed into the script have provided address. function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); // ======== Environment ======== /// Gets the environment variable `name` and parses it as `address`. /// Reverts if the variable was not found or could not be parsed. function envAddress(string calldata name) external view returns (address value); /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); /// Gets the environment variable `name` and parses it as `bool`. /// Reverts if the variable was not found or could not be parsed. function envBool(string calldata name) external view returns (bool value); /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); /// Gets the environment variable `name` and parses it as `bytes32`. /// Reverts if the variable was not found or could not be parsed. function envBytes32(string calldata name) external view returns (bytes32 value); /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); /// Gets the environment variable `name` and parses it as `bytes`. /// Reverts if the variable was not found or could not be parsed. function envBytes(string calldata name) external view returns (bytes memory value); /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); /// Gets the environment variable `name` and returns true if it exists, else returns false. function envExists(string calldata name) external view returns (bool result); /// Gets the environment variable `name` and parses it as `int256`. /// Reverts if the variable was not found or could not be parsed. function envInt(string calldata name) external view returns (int256 value); /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); /// Gets the environment variable `name` and parses it as `bool`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, bool defaultValue) external view returns (bool value); /// Gets the environment variable `name` and parses it as `uint256`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value); /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) external view returns (address[] memory value); /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) external view returns (bytes32[] memory value); /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) external view returns (string[] memory value); /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) external view returns (bytes[] memory value); /// Gets the environment variable `name` and parses it as `int256`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, int256 defaultValue) external view returns (int256 value); /// Gets the environment variable `name` and parses it as `address`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, address defaultValue) external view returns (address value); /// Gets the environment variable `name` and parses it as `bytes32`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value); /// Gets the environment variable `name` and parses it as `string`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value); /// Gets the environment variable `name` and parses it as `bytes`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value); /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) external view returns (bool[] memory value); /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) external view returns (uint256[] memory value); /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. /// Reverts if the variable could not be parsed. /// Returns `defaultValue` if the variable was not found. function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) external view returns (int256[] memory value); /// Gets the environment variable `name` and parses it as `string`. /// Reverts if the variable was not found or could not be parsed. function envString(string calldata name) external view returns (string memory value); /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envString(string calldata name, string calldata delim) external view returns (string[] memory value); /// Gets the environment variable `name` and parses it as `uint256`. /// Reverts if the variable was not found or could not be parsed. function envUint(string calldata name) external view returns (uint256 value); /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. /// Reverts if the variable was not found or could not be parsed. function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); /// Returns true if `forge` command was executed in given context. function isContext(ForgeContext context) external view returns (bool result); /// Sets environment variables. function setEnv(string calldata name, string calldata value) external; // ======== EVM ======== /// Gets all accessed reads and write slot from a `vm.record` session, for a given address. function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); /// Gets the address for a given private key. function addr(uint256 privateKey) external pure returns (address keyAddr); /// Gets all the logs according to specified filter. function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics) external returns (EthGetLogs[] memory logs); /// Gets the current `block.blobbasefee`. /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction, /// and as a result will get optimized out by the compiler. /// See https://github.com/foundry-rs/foundry/issues/6180 function getBlobBaseFee() external view returns (uint256 blobBaseFee); /// Gets the current `block.number`. /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction, /// and as a result will get optimized out by the compiler. /// See https://github.com/foundry-rs/foundry/issues/6180 function getBlockNumber() external view returns (uint256 height); /// Gets the current `block.timestamp`. /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction, /// and as a result will get optimized out by the compiler. /// See https://github.com/foundry-rs/foundry/issues/6180 function getBlockTimestamp() external view returns (uint256 timestamp); /// Gets the map key and parent of a mapping at a given slot, for a given address. function getMappingKeyAndParentOf(address target, bytes32 elementSlot) external returns (bool found, bytes32 key, bytes32 parent); /// Gets the number of elements in the mapping at the given slot, for a given address. function getMappingLength(address target, bytes32 mappingSlot) external returns (uint256 length); /// Gets the elements at index idx of the mapping at the given slot, for a given address. The /// index must be less than the length of the mapping (i.e. the number of keys in the mapping). function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external returns (bytes32 value); /// Gets the nonce of an account. function getNonce(address account) external view returns (uint64 nonce); /// Get the nonce of a `Wallet`. function getNonce(Wallet calldata wallet) external returns (uint64 nonce); /// Gets all the recorded logs. function getRecordedLogs() external returns (Log[] memory logs); /// Gets the gas used in the last call. function lastCallGas() external view returns (Gas memory gas); /// Loads a storage slot from an address. function load(address target, bytes32 slot) external view returns (bytes32 data); /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. function pauseGasMetering() external; /// Records all storage reads and writes. function record() external; /// Record all the transaction logs. function recordLogs() external; /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on. function resumeGasMetering() external; /// Performs an Ethereum JSON-RPC request to the current fork URL. function rpc(string calldata method, string calldata params) external returns (bytes memory data); /// Performs an Ethereum JSON-RPC request to the given endpoint. function rpc(string calldata urlOrAlias, string calldata method, string calldata params) external returns (bytes memory data); /// Starts recording all map SSTOREs for later retrieval. function startMappingRecording() external; /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order, /// along with the context of the calls function startStateDiffRecording() external; /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session. function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses); /// Stops recording all map SSTOREs for later retrieval and clears the recorded data. function stopMappingRecording() external; // ======== Filesystem ======== /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. /// `path` is relative to the project root. function closeFile(string calldata path) external; /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`. /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`. /// Both `from` and `to` are relative to the project root. function copyFile(string calldata from, string calldata to) external returns (uint64 copied); /// Creates a new, empty directory at the provided path. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - User lacks permissions to modify `path`. /// - A parent of the given path doesn't exist and `recursive` is false. /// - `path` already exists and `recursive` is false. /// `path` is relative to the project root. function createDir(string calldata path, bool recursive) external; /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. function deployCode(string calldata artifactPath) external returns (address deployedAddress); /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. /// Additionaly accepts abi-encoded constructor arguments. function deployCode(string calldata artifactPath, bytes calldata constructorArgs) external returns (address deployedAddress); /// Returns true if the given path points to an existing entity, else returns false. function exists(string calldata path) external returns (bool result); /// Performs a foreign function call via the terminal. function ffi(string[] calldata commandInput) external returns (bytes memory result); /// Given a path, query the file system to get information about a file, directory, etc. function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional. function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); /// Returns true if the path exists on disk and is pointing at a directory, else returns false. function isDir(string calldata path) external returns (bool result); /// Returns true if the path exists on disk and is pointing at a regular file, else returns false. function isFile(string calldata path) external returns (bool result); /// Get the path of the current project root. function projectRoot() external view returns (string memory path); /// Prompts the user for a string value in the terminal. function prompt(string calldata promptText) external returns (string memory input); /// Prompts the user for an address in the terminal. function promptAddress(string calldata promptText) external returns (address); /// Prompts the user for a hidden string value in the terminal. function promptSecret(string calldata promptText) external returns (string memory input); /// Prompts the user for hidden uint256 in the terminal (usually pk). function promptSecretUint(string calldata promptText) external returns (uint256); /// Prompts the user for uint256 in the terminal. function promptUint(string calldata promptText) external returns (uint256); /// Reads the directory at the given path recursively, up to `maxDepth`. /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned. /// Follows symbolic links if `followLinks` is true. function readDir(string calldata path) external view returns (DirEntry[] memory entries); /// See `readDir(string)`. function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); /// See `readDir(string)`. function readDir(string calldata path, uint64 maxDepth, bool followLinks) external view returns (DirEntry[] memory entries); /// Reads the entire content of file to string. `path` is relative to the project root. function readFile(string calldata path) external view returns (string memory data); /// Reads the entire content of file as binary. `path` is relative to the project root. function readFileBinary(string calldata path) external view returns (bytes memory data); /// Reads next line of file to string. function readLine(string calldata path) external view returns (string memory line); /// Reads a symbolic link, returning the path that the link points to. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - `path` is not a symbolic link. /// - `path` does not exist. function readLink(string calldata linkPath) external view returns (string memory targetPath); /// Removes a directory at the provided path. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - `path` doesn't exist. /// - `path` isn't a directory. /// - User lacks permissions to modify `path`. /// - The directory is not empty and `recursive` is false. /// `path` is relative to the project root. function removeDir(string calldata path, bool recursive) external; /// Removes a file from the filesystem. /// This cheatcode will revert in the following situations, but is not limited to just these cases: /// - `path` points to a directory. /// - The file doesn't exist. /// - The user lacks permissions to remove the file. /// `path` is relative to the project root. function removeFile(string calldata path) external; /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr. function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result); /// Returns the time since unix epoch in milliseconds. function unixTime() external returns (uint256 milliseconds); /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. /// `path` is relative to the project root. function writeFile(string calldata path, string calldata data) external; /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. /// `path` is relative to the project root. function writeFileBinary(string calldata path, bytes calldata data) external; /// Writes line to file, creating a file if it does not exist. /// `path` is relative to the project root. function writeLine(string calldata path, string calldata data) external; // ======== JSON ======== /// Checks if `key` exists in a JSON object /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions. function keyExists(string calldata json, string calldata key) external view returns (bool); /// Checks if `key` exists in a JSON object. function keyExistsJson(string calldata json, string calldata key) external view returns (bool); /// Parses a string of JSON data at `key` and coerces it to `address`. function parseJsonAddress(string calldata json, string calldata key) external pure returns (address); /// Parses a string of JSON data at `key` and coerces it to `address[]`. function parseJsonAddressArray(string calldata json, string calldata key) external pure returns (address[] memory); /// Parses a string of JSON data at `key` and coerces it to `bool`. function parseJsonBool(string calldata json, string calldata key) external pure returns (bool); /// Parses a string of JSON data at `key` and coerces it to `bool[]`. function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory); /// Parses a string of JSON data at `key` and coerces it to `bytes`. function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory); /// Parses a string of JSON data at `key` and coerces it to `bytes32`. function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32); /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`. function parseJsonBytes32Array(string calldata json, string calldata key) external pure returns (bytes32[] memory); /// Parses a string of JSON data at `key` and coerces it to `bytes[]`. function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory); /// Parses a string of JSON data at `key` and coerces it to `int256`. function parseJsonInt(string calldata json, string calldata key) external pure returns (int256); /// Parses a string of JSON data at `key` and coerces it to `int256[]`. function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory); /// Returns an array of all the keys in a JSON object. function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); /// Parses a string of JSON data at `key` and coerces it to `string`. function parseJsonString(string calldata json, string calldata key) external pure returns (string memory); /// Parses a string of JSON data at `key` and coerces it to `string[]`. function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory); /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`. function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`. function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory); /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`. function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); /// Parses a string of JSON data at `key` and coerces it to `uint256`. function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256); /// Parses a string of JSON data at `key` and coerces it to `uint256[]`. function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory); /// ABI-encodes a JSON object. function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); /// ABI-encodes a JSON object at `key`. function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); /// See `serializeJson`. function serializeAddress(string calldata objectKey, string calldata valueKey, address value) external returns (string memory json); /// See `serializeJson`. function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeBool(string calldata objectKey, string calldata valueKey, bool value) external returns (string memory json); /// See `serializeJson`. function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) external returns (string memory json); /// See `serializeJson`. function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) external returns (string memory json); /// See `serializeJson`. function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) external returns (string memory json); /// See `serializeJson`. function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) external returns (string memory json); /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file. /// Returns the stringified version of the specific JSON file up to that moment. function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json); /// See `serializeJson`. function serializeJsonType(string calldata typeDescription, bytes calldata value) external pure returns (string memory json); /// See `serializeJson`. function serializeJsonType( string calldata objectKey, string calldata valueKey, string calldata typeDescription, bytes calldata value ) external returns (string memory json); /// See `serializeJson`. function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) external returns (string memory json); /// See `serializeJson`. function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) external returns (string memory json); /// See `serializeJson`. function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value) external returns (string memory json); /// See `serializeJson`. function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) external returns (string memory json); /// See `serializeJson`. function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) external returns (string memory json); /// Write a serialized JSON object to a file. If the file exists, it will be overwritten. function writeJson(string calldata json, string calldata path) external; /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = <value_key.> /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing. function writeJson(string calldata json, string calldata path, string calldata valueKey) external; // ======== Scripting ======== /// Takes a signed transaction and broadcasts it to the network. function broadcastRawTransaction(bytes calldata data) external; /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain. /// Broadcasting address is determined by checking the following in order: /// 1. If `--sender` argument was provided, that address is used. /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. function broadcast() external; /// Has the next call (at this call depth only) create a transaction with the address provided /// as the sender that can later be signed and sent onchain. function broadcast(address signer) external; /// Has the next call (at this call depth only) create a transaction with the private key /// provided as the sender that can later be signed and sent onchain. function broadcast(uint256 privateKey) external; /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain. /// Broadcasting address is determined by checking the following in order: /// 1. If `--sender` argument was provided, that address is used. /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. function startBroadcast() external; /// Has all subsequent calls (at this call depth only) create transactions with the address /// provided that can later be signed and sent onchain. function startBroadcast(address signer) external; /// Has all subsequent calls (at this call depth only) create transactions with the private key /// provided that can later be signed and sent onchain. function startBroadcast(uint256 privateKey) external; /// Stops collecting onchain transactions. function stopBroadcast() external; // ======== String ======== /// Returns the index of the first occurrence of a `key` in an `input` string. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found. /// Returns 0 in case of an empty `key`. function indexOf(string calldata input, string calldata key) external pure returns (uint256); /// Parses the given `string` into an `address`. function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); /// Parses the given `string` into a `bool`. function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); /// Parses the given `string` into `bytes`. function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); /// Parses the given `string` into a `bytes32`. function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); /// Parses the given `string` into a `int256`. function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); /// Parses the given `string` into a `uint256`. function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); /// Replaces occurrences of `from` in the given `string` with `to`. function replace(string calldata input, string calldata from, string calldata to) external pure returns (string memory output); /// Splits the given `string` into an array of strings divided by the `delimiter`. function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs); /// Converts the given `string` value to Lowercase. function toLowercase(string calldata input) external pure returns (string memory output); /// Converts the given value to a `string`. function toString(address value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(bytes calldata value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(bytes32 value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(bool value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(uint256 value) external pure returns (string memory stringifiedValue); /// Converts the given value to a `string`. function toString(int256 value) external pure returns (string memory stringifiedValue); /// Converts the given `string` value to Uppercase. function toUppercase(string calldata input) external pure returns (string memory output); /// Trims leading and trailing whitespace from the given `string` value. function trim(string calldata input) external pure returns (string memory output); // ======== Testing ======== /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqAbsDecimal( uint256 left, uint256 right, uint256 maxDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqAbsDecimal( int256 left, int256 right, uint256 maxDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure; /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. /// Includes error message into revert string on failure. function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure; /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. /// Includes error message into revert string on failure. function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqRelDecimal( uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertApproxEqRelDecimal( int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals, string calldata error ) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure; /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Includes error message into revert string on failure. function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure; /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% /// Includes error message into revert string on failure. function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure; /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `bool` values are equal. function assertEq(bool left, bool right) external pure; /// Asserts that two `bool` values are equal and includes error message into revert string on failure. function assertEq(bool left, bool right, string calldata error) external pure; /// Asserts that two `string` values are equal. function assertEq(string calldata left, string calldata right) external pure; /// Asserts that two `string` values are equal and includes error message into revert string on failure. function assertEq(string calldata left, string calldata right, string calldata error) external pure; /// Asserts that two `bytes` values are equal. function assertEq(bytes calldata left, bytes calldata right) external pure; /// Asserts that two `bytes` values are equal and includes error message into revert string on failure. function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; /// Asserts that two arrays of `bool` values are equal. function assertEq(bool[] calldata left, bool[] calldata right) external pure; /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure. function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `uint256 values are equal. function assertEq(uint256[] calldata left, uint256[] calldata right) external pure; /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure. function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `int256` values are equal. function assertEq(int256[] calldata left, int256[] calldata right) external pure; /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure. function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are equal. function assertEq(uint256 left, uint256 right) external pure; /// Asserts that two arrays of `address` values are equal. function assertEq(address[] calldata left, address[] calldata right) external pure; /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure. function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes32` values are equal. function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure; /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure. function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `string` values are equal. function assertEq(string[] calldata left, string[] calldata right) external pure; /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure. function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes` values are equal. function assertEq(bytes[] calldata left, bytes[] calldata right) external pure; /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure. function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are equal and includes error message into revert string on failure. function assertEq(uint256 left, uint256 right, string calldata error) external pure; /// Asserts that two `int256` values are equal. function assertEq(int256 left, int256 right) external pure; /// Asserts that two `int256` values are equal and includes error message into revert string on failure. function assertEq(int256 left, int256 right, string calldata error) external pure; /// Asserts that two `address` values are equal. function assertEq(address left, address right) external pure; /// Asserts that two `address` values are equal and includes error message into revert string on failure. function assertEq(address left, address right, string calldata error) external pure; /// Asserts that two `bytes32` values are equal. function assertEq(bytes32 left, bytes32 right) external pure; /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure. function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; /// Asserts that the given condition is false. function assertFalse(bool condition) external pure; /// Asserts that the given condition is false and includes error message into revert string on failure. function assertFalse(bool condition, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. function assertGe(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be greater than or equal to second. /// Includes error message into revert string on failure. function assertGe(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. function assertGe(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be greater than or equal to second. /// Includes error message into revert string on failure. function assertGe(int256 left, int256 right, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. function assertGt(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be greater than second. /// Includes error message into revert string on failure. function assertGt(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be greater than second. function assertGt(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be greater than second. /// Includes error message into revert string on failure. function assertGt(int256 left, int256 right, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. function assertLe(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be less than or equal to second. /// Includes error message into revert string on failure. function assertLe(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. function assertLe(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be less than or equal to second. /// Includes error message into revert string on failure. function assertLe(int256 left, int256 right, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Formats values with decimals in failure message. Includes error message into revert string on failure. function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Compares two `uint256` values. Expects first value to be less than second. function assertLt(uint256 left, uint256 right) external pure; /// Compares two `uint256` values. Expects first value to be less than second. /// Includes error message into revert string on failure. function assertLt(uint256 left, uint256 right, string calldata error) external pure; /// Compares two `int256` values. Expects first value to be less than second. function assertLt(int256 left, int256 right) external pure; /// Compares two `int256` values. Expects first value to be less than second. /// Includes error message into revert string on failure. function assertLt(int256 left, int256 right, string calldata error) external pure; /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure; /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. /// Includes error message into revert string on failure. function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; /// Asserts that two `bool` values are not equal. function assertNotEq(bool left, bool right) external pure; /// Asserts that two `bool` values are not equal and includes error message into revert string on failure. function assertNotEq(bool left, bool right, string calldata error) external pure; /// Asserts that two `string` values are not equal. function assertNotEq(string calldata left, string calldata right) external pure; /// Asserts that two `string` values are not equal and includes error message into revert string on failure. function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; /// Asserts that two `bytes` values are not equal. function assertNotEq(bytes calldata left, bytes calldata right) external pure; /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; /// Asserts that two arrays of `bool` values are not equal. function assertNotEq(bool[] calldata left, bool[] calldata right) external pure; /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure. function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `uint256` values are not equal. function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure; /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure. function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `int256` values are not equal. function assertNotEq(int256[] calldata left, int256[] calldata right) external pure; /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure. function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are not equal. function assertNotEq(uint256 left, uint256 right) external pure; /// Asserts that two arrays of `address` values are not equal. function assertNotEq(address[] calldata left, address[] calldata right) external pure; /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure. function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes32` values are not equal. function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure; /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `string` values are not equal. function assertNotEq(string[] calldata left, string[] calldata right) external pure; /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure. function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; /// Asserts that two arrays of `bytes` values are not equal. function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure; /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure. function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; /// Asserts that two `int256` values are not equal. function assertNotEq(int256 left, int256 right) external pure; /// Asserts that two `int256` values are not equal and includes error message into revert string on failure. function assertNotEq(int256 left, int256 right, string calldata error) external pure; /// Asserts that two `address` values are not equal. function assertNotEq(address left, address right) external pure; /// Asserts that two `address` values are not equal and includes error message into revert string on failure. function assertNotEq(address left, address right, string calldata error) external pure; /// Asserts that two `bytes32` values are not equal. function assertNotEq(bytes32 left, bytes32 right) external pure; /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure. function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; /// Asserts that the given condition is true. function assertTrue(bool condition) external pure; /// Asserts that the given condition is true and includes error message into revert string on failure. function assertTrue(bool condition, string calldata error) external pure; /// If the condition is false, discard this run's fuzz inputs and generate new ones. function assume(bool condition) external pure; /// Writes a breakpoint to jump to in the debugger. function breakpoint(string calldata char) external; /// Writes a conditional breakpoint to jump to in the debugger. function breakpoint(string calldata char, bool value) external; /// Returns the Foundry version. /// Format: <cargo_version>+<git_sha>+<build_timestamp> /// Sample output: 0.2.0+faa94c384+202407110019 /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs. /// For reliable version comparisons, use YYYYMMDD0000 format (e.g., >= 202407110000) /// to compare timestamps while ignoring minor time differences. function getFoundryVersion() external view returns (string memory version); /// Returns the RPC url for the given alias. function rpcUrl(string calldata rpcAlias) external view returns (string memory json); /// Returns all rpc urls and their aliases as structs. function rpcUrlStructs() external view returns (Rpc[] memory urls); /// Returns all rpc urls and their aliases `[alias, url][]`. function rpcUrls() external view returns (string[2][] memory urls); /// Suspends execution of the main thread for `duration` milliseconds. function sleep(uint256 duration) external; // ======== Toml ======== /// Checks if `key` exists in a TOML table. function keyExistsToml(string calldata toml, string calldata key) external view returns (bool); /// Parses a string of TOML data at `key` and coerces it to `address`. function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address); /// Parses a string of TOML data at `key` and coerces it to `address[]`. function parseTomlAddressArray(string calldata toml, string calldata key) external pure returns (address[] memory); /// Parses a string of TOML data at `key` and coerces it to `bool`. function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool); /// Parses a string of TOML data at `key` and coerces it to `bool[]`. function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory); /// Parses a string of TOML data at `key` and coerces it to `bytes`. function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory); /// Parses a string of TOML data at `key` and coerces it to `bytes32`. function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32); /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`. function parseTomlBytes32Array(string calldata toml, string calldata key) external pure returns (bytes32[] memory); /// Parses a string of TOML data at `key` and coerces it to `bytes[]`. function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory); /// Parses a string of TOML data at `key` and coerces it to `int256`. function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256); /// Parses a string of TOML data at `key` and coerces it to `int256[]`. function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory); /// Returns an array of all the keys in a TOML table. function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys); /// Parses a string of TOML data at `key` and coerces it to `string`. function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory); /// Parses a string of TOML data at `key` and coerces it to `string[]`. function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory); /// Parses a string of TOML data at `key` and coerces it to `uint256`. function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256); /// Parses a string of TOML data at `key` and coerces it to `uint256[]`. function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory); /// ABI-encodes a TOML table. function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData); /// ABI-encodes a TOML table at `key`. function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData); /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file. function writeToml(string calldata json, string calldata path) external; /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = <value_key.> /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing. function writeToml(string calldata json, string calldata path, string calldata valueKey) external; // ======== Utilities ======== /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer. function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) external pure returns (address); /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer. function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address); /// Compute the address a contract will be deployed at for a given deployer address and nonce. function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address); /// Returns ENS namehash for provided string. function ensNamehash(string calldata name) external pure returns (bytes32); /// Gets the label for the specified address. function getLabel(address account) external view returns (string memory currentLabel); /// Labels an address in call traces. function label(address account, string calldata newLabel) external; /// Returns a random `address`. function randomAddress() external returns (address); /// Returns a random uint256 value. function randomUint() external returns (uint256); /// Returns random uin256 value between the provided range (=min..=max). function randomUint(uint256 min, uint256 max) external returns (uint256); /// Encodes a `bytes` value to a base64url string. function toBase64URL(bytes calldata data) external pure returns (string memory); /// Encodes a `string` value to a base64url string. function toBase64URL(string calldata data) external pure returns (string memory); /// Encodes a `bytes` value to a base64 string. function toBase64(bytes calldata data) external pure returns (string memory); /// Encodes a `string` value to a base64 string. function toBase64(string calldata data) external pure returns (string memory); } /// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used /// in tests, but it is not recommended to use these cheats in scripts. interface Vm is VmSafe { // ======== EVM ======== /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. function activeFork() external view returns (uint256 forkId); /// In forking mode, explicitly grant the given address cheatcode access. function allowCheatcodes(address account) external; /// Sets `block.blobbasefee` function blobBaseFee(uint256 newBlobBaseFee) external; /// Sets the blobhashes in the transaction. /// Not available on EVM versions before Cancun. /// If used on unsupported EVM versions it will revert. function blobhashes(bytes32[] calldata hashes) external; /// Sets `block.chainid`. function chainId(uint256 newChainId) external; /// Clears all mocked calls. function clearMockedCalls() external; /// Sets `block.coinbase`. function coinbase(address newCoinbase) external; /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork. function createFork(string calldata urlOrAlias) external returns (uint256 forkId); /// Creates a new fork with the given endpoint and block and returns the identifier of the fork. function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); /// Creates a new fork with the given endpoint and at the block the given transaction was mined in, /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork. function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork. function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork. function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in, /// replays all transaction mined in the block before the transaction, returns the identifier of the fork. function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); /// Sets an address' balance. function deal(address account, uint256 newBalance) external; /// Removes the snapshot with the given ID created by `snapshot`. /// Takes the snapshot ID to delete. /// Returns `true` if the snapshot was successfully deleted. /// Returns `false` if the snapshot does not exist. function deleteSnapshot(uint256 snapshotId) external returns (bool success); /// Removes _all_ snapshots previously created by `snapshot`. function deleteSnapshots() external; /// Sets `block.difficulty`. /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead. /// Reverts if used on unsupported EVM versions. function difficulty(uint256 newDifficulty) external; /// Dump a genesis JSON file's `allocs` to disk. function dumpState(string calldata pathToStateJson) external; /// Sets an address' code. function etch(address target, bytes calldata newRuntimeBytecode) external; /// Sets `block.basefee`. function fee(uint256 newBasefee) external; /// Gets the blockhashes from the current transaction. /// Not available on EVM versions before Cancun. /// If used on unsupported EVM versions it will revert. function getBlobhashes() external view returns (bytes32[] memory hashes); /// Returns true if the account is marked as persistent. function isPersistent(address account) external view returns (bool persistent); /// Load a genesis JSON file's `allocs` into the in-memory revm state. function loadAllocs(string calldata pathToAllocsJson) external; /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup /// Meaning, changes made to the state of this account will be kept when switching forks. function makePersistent(address account) external; /// See `makePersistent(address)`. function makePersistent(address account0, address account1) external; /// See `makePersistent(address)`. function makePersistent(address account0, address account1, address account2) external; /// See `makePersistent(address)`. function makePersistent(address[] calldata accounts) external; /// Reverts a call to an address with specified revert data. function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; /// Reverts a call to an address with a specific `msg.value`, with specified revert data. function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) external; /// Mocks a call to an address, returning specified data. /// Calldata can either be strict or a partial match, e.g. if you only /// pass a Solidity selector to the expected calldata, then the entire Solidity /// function will be mocked. function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; /// Mocks a call to an address with a specific `msg.value`, returning specified data. /// Calldata match takes precedence over `msg.value` in case of ambiguity. function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; /// Sets the *next* call's `msg.sender` to be the input address. function prank(address msgSender) external; /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input. function prank(address msgSender, address txOrigin) external; /// Sets `block.prevrandao`. /// Not available on EVM versions before Paris. Use `difficulty` instead. /// If used on unsupported EVM versions it will revert. function prevrandao(bytes32 newPrevrandao) external; /// Sets `block.prevrandao`. /// Not available on EVM versions before Paris. Use `difficulty` instead. /// If used on unsupported EVM versions it will revert. function prevrandao(uint256 newPrevrandao) external; /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification. function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin); /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts. function resetNonce(address account) external; /// Revert the state of the EVM to a previous snapshot /// Takes the snapshot ID to revert to. /// Returns `true` if the snapshot was successfully reverted. /// Returns `false` if the snapshot does not exist. /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteSnapshot`. function revertTo(uint256 snapshotId) external returns (bool success); /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots /// Takes the snapshot ID to revert to. /// Returns `true` if the snapshot was successfully reverted and deleted. /// Returns `false` if the snapshot does not exist. function revertToAndDelete(uint256 snapshotId) external returns (bool success); /// Revokes persistent status from the address, previously added via `makePersistent`. function revokePersistent(address account) external; /// See `revokePersistent(address)`. function revokePersistent(address[] calldata accounts) external; /// Sets `block.height`. function roll(uint256 newHeight) external; /// Updates the currently active fork to given block number /// This is similar to `roll` but for the currently active fork. function rollFork(uint256 blockNumber) external; /// Updates the currently active fork to given transaction. This will `rollFork` with the number /// of the block the transaction was mined in and replays all transaction mined before it in the block. function rollFork(bytes32 txHash) external; /// Updates the given fork to given block number. function rollFork(uint256 forkId, uint256 blockNumber) external; /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block. function rollFork(uint256 forkId, bytes32 txHash) external; /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. function selectFork(uint256 forkId) external; /// Set blockhash for the current block. /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`. function setBlockhash(uint256 blockNumber, bytes32 blockHash) external; /// Sets the nonce of an account. Must be higher than the current nonce of the account. function setNonce(address account, uint64 newNonce) external; /// Sets the nonce of an account to an arbitrary value. function setNonceUnsafe(address account, uint64 newNonce) external; /// Snapshot the current state of the evm. /// Returns the ID of the snapshot that was created. /// To revert a snapshot use `revertTo`. function snapshot() external returns (uint256 snapshotId); /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called. function startPrank(address msgSender) external; /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input. function startPrank(address msgSender, address txOrigin) external; /// Resets subsequent calls' `msg.sender` to be `address(this)`. function stopPrank() external; /// Stores a value to an address' storage slot. function store(address target, bytes32 slot, bytes32 value) external; /// Fetches the given transaction from the active fork and executes it on the current state. function transact(bytes32 txHash) external; /// Fetches the given transaction from the given fork and executes it on the current state. function transact(uint256 forkId, bytes32 txHash) external; /// Sets `tx.gasprice`. function txGasPrice(uint256 newGasPrice) external; /// Sets `block.timestamp`. function warp(uint256 newTimestamp) external; // ======== Testing ======== /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) external; /// Expects a call to an address with the specified calldata. /// Calldata can either be a strict or a partial match. function expectCall(address callee, bytes calldata data) external; /// Expects given number of calls to an address with the specified calldata. function expectCall(address callee, bytes calldata data, uint64 count) external; /// Expects a call to an address with the specified `msg.value` and calldata. function expectCall(address callee, uint256 msgValue, bytes calldata data) external; /// Expects given number of calls to an address with the specified `msg.value` and calldata. function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; /// Expect a call to an address with the specified `msg.value`, gas, and calldata. function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata. function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmitAnonymous( bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter ) external; /// Prepare an expected anonymous log with all topic and data checks enabled. /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data. function expectEmitAnonymous() external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmitAnonymous(address emitter) external; /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). /// Call this function, then emit an event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) external; /// Prepare an expected log with all topic and data checks enabled. /// Call this function, then emit an event, then call a function. Internally after the call, we check if /// logs were emitted in the expected order with the expected topics and data. function expectEmit() external; /// Same as the previous method, but also checks supplied address against emitting contract. function expectEmit(address emitter) external; /// Expects an error on next call with any revert data. function expectRevert() external; /// Expects an error on next call that starts with the revert data. function expectRevert(bytes4 revertData) external; /// Expects an error on next call that exactly matches the revert data. function expectRevert(bytes calldata revertData) external; /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. function expectSafeMemory(uint64 min, uint64 max) external; /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges /// to the set. function expectSafeMemoryCall(uint64 min, uint64 max) external; /// Marks a test as skipped. Must be called at the top of the test. function skip(bool skipTest) external; /// Stops all safe memory expectation in the current subcontext. function stopExpectSafeMemory() external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _castLogPayloadViewToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) internal pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castLogPayloadViewToPure(_sendLogPayloadView)(payload); } function _sendLogPayloadView(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(int p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, int p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,int)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import {console as console2} from "./console.sol";
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; /// @dev Interface of the ERC20 standard as defined in the EIP. /// @dev This includes the optional name, symbol, and decimals metadata. interface IERC20 { /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). event Transfer(address indexed from, address indexed to, uint256 value); /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` /// is the new allowance. event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice Returns the amount of tokens in existence. function totalSupply() external view returns (uint256); /// @notice Returns the amount of tokens owned by `account`. function balanceOf(address account) external view returns (uint256); /// @notice Moves `amount` tokens from the caller's account to `to`. function transfer(address to, uint256 amount) external returns (bool); /// @notice Returns the remaining number of tokens that `spender` is allowed /// to spend on behalf of `owner` function allowance(address owner, address spender) external view returns (uint256); /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 function approve(address spender, uint256 amount) external returns (bool); /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. /// `amount` is then deducted from the caller's allowance. function transferFrom(address from, address to, uint256 amount) external returns (bool); /// @notice Returns the name of the token. function name() external view returns (string memory); /// @notice Returns the symbol of the token. function symbol() external view returns (string memory); /// @notice Returns the decimals places of the token. function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; import "./IERC165.sol"; /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external payable; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. interface IERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4); } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface IERC721Metadata is IERC721 { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string memory _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string memory _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string memory); } /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface IERC721Enumerable is IERC721 { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; pragma experimental ABIEncoderV2; interface IMulticall3 { struct Call { address target; bytes callData; } struct Call3 { address target; bool allowFailure; bytes callData; } struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; } struct Result { bool success; bytes returnData; } function aggregate(Call[] calldata calls) external payable returns (uint256 blockNumber, bytes[] memory returnData); function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); function blockAndAggregate(Call[] calldata calls) external payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); function getBasefee() external view returns (uint256 basefee); function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); function getBlockNumber() external view returns (uint256 blockNumber); function getChainId() external view returns (uint256 chainid); function getCurrentBlockCoinbase() external view returns (address coinbase); function getCurrentBlockDifficulty() external view returns (uint256 difficulty); function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); function getCurrentBlockTimestamp() external view returns (uint256 timestamp); function getEthBalance(address addr) external view returns (uint256 balance); function getLastBlockHash() external view returns (bytes32 blockHash); function tryAggregate(bool requireSuccess, Call[] calldata calls) external payable returns (Result[] memory returnData); function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) external payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {IERC20} from "../interfaces/IERC20.sol"; /// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production. /// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol contract MockERC20 is IERC20 { /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string internal _name; string internal _symbol; uint8 internal _decimals; function name() external view override returns (string memory) { return _name; } function symbol() external view override returns (string memory) { return _symbol; } function decimals() external view override returns (uint8) { return _decimals; } /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal _totalSupply; mapping(address => uint256) internal _balanceOf; mapping(address => mapping(address => uint256)) internal _allowance; function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address owner) external view override returns (uint256) { return _balanceOf[owner]; } function allowance(address owner, address spender) external view override returns (uint256) { return _allowance[owner][spender]; } /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal INITIAL_CHAIN_ID; bytes32 internal INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// INITIALIZE //////////////////////////////////////////////////////////////*/ /// @dev A bool to track whether the contract has been initialized. bool private initialized; /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and /// syntaxes, we add an initialization function that can be called only once. function initialize(string memory name_, string memory symbol_, uint8 decimals_) public { require(!initialized, "ALREADY_INITIALIZED"); _name = name_; _symbol = symbol_; _decimals = decimals_; INITIAL_CHAIN_ID = _pureChainId(); INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); initialized = true; } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual override returns (bool) { _allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual override returns (bool) { _balanceOf[msg.sender] = _sub(_balanceOf[msg.sender], amount); _balanceOf[to] = _add(_balanceOf[to], amount); emit Transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { uint256 allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != ~uint256(0)) _allowance[from][msg.sender] = _sub(allowed, amount); _balanceOf[from] = _sub(_balanceOf[from], amount); _balanceOf[to] = _add(_balanceOf[to], amount); emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); _allowance[recoveredAddress][spender] = value; emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return _pureChainId() == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256("1"), _pureChainId(), address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { _totalSupply = _add(_totalSupply, amount); _balanceOf[to] = _add(_balanceOf[to], amount); emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { _balanceOf[from] = _sub(_balanceOf[from], amount); _totalSupply = _sub(_totalSupply, amount); emit Transfer(from, address(0), amount); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MATH LOGIC //////////////////////////////////////////////////////////////*/ function _add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ERC20: addition overflow"); return c; } function _sub(uint256 a, uint256 b) internal pure returns (uint256) { require(a >= b, "ERC20: subtraction underflow"); return a - b; } /*////////////////////////////////////////////////////////////// HELPERS //////////////////////////////////////////////////////////////*/ // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We // can't simply access the chain ID in a normal view or pure function because the solc View Pure // Checker changed `chainid` from pure to view in 0.8.0. function _viewChainId() private view returns (uint256 chainId) { // Assembly required since `block.chainid` was introduced in 0.8.0. assembly { chainId := chainid() } address(this); // Silence warnings in older Solc versions. } function _pureChainId() private pure returns (uint256 chainId) { function() internal view returns (uint256) fnIn = _viewChainId; function() internal pure returns (uint256) pureChainId; assembly { pureChainId := fnIn } chainId = pureChainId(); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; import {IERC721Metadata, IERC721TokenReceiver} from "../interfaces/IERC721.sol"; /// @notice This is a mock contract of the ERC721 standard for testing purposes only, it SHOULD NOT be used in production. /// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC721.sol contract MockERC721 is IERC721Metadata { /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string internal _name; string internal _symbol; function name() external view override returns (string memory) { return _name; } function symbol() external view override returns (string memory) { return _symbol; } function tokenURI(uint256 id) public view virtual override returns (string memory) {} /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual override returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _getApproved; mapping(address => mapping(address => bool)) internal _isApprovedForAll; function getApproved(uint256 id) public view virtual override returns (address) { return _getApproved[id]; } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _isApprovedForAll[owner][operator]; } /*////////////////////////////////////////////////////////////// INITIALIZE //////////////////////////////////////////////////////////////*/ /// @dev A bool to track whether the contract has been initialized. bool private initialized; /// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and /// syntaxes, we add an initialization function that can be called only once. function initialize(string memory name_, string memory symbol_) public { require(!initialized, "ALREADY_INITIALIZED"); _name = name_; _symbol = symbol_; initialized = true; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public payable virtual override { address owner = _ownerOf[id]; require(msg.sender == owner || _isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); _getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual override { _isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom(address from, address to, uint256 id) public payable virtual override { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || _isApprovedForAll[from][msg.sender] || msg.sender == _getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. _balanceOf[from]--; _balanceOf[to]++; _ownerOf[id] = to; delete _getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom(address from, address to, uint256 id) public payable virtual override { transferFrom(from, to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom(address from, address to, uint256 id, bytes memory data) public payable virtual override { transferFrom(from, to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. _balanceOf[to]++; _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); _balanceOf[owner]--; delete _ownerOf[id]; delete _getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint(address to, uint256 id, bytes memory data) internal virtual { _mint(to, id); require( !_isContract(to) || IERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == IERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// HELPERS //////////////////////////////////////////////////////////////*/ function _isContract(address _addr) private view returns (bool) { uint256 codeLength; // Assembly required for versions < 0.8.0 to check extcodesize. assembly { codeLength := extcodesize(_addr) } return codeLength > 0; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.9.0; /// @author philogy <https://github.com/philogy> /// @dev Code generated automatically by script. library safeconsole { uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67; // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374) // for the view-to-pure log trick. function _sendLogPayload(uint256 offset, uint256 size) private pure { function(uint256, uint256) internal view fnIn = _sendLogPayloadView; function(uint256, uint256) internal pure pureSendLogPayload; /// @solidity memory-safe-assembly assembly { pureSendLogPayload := fnIn } pureSendLogPayload(offset, size); } function _sendLogPayloadView(uint256 offset, uint256 size) private view { /// @solidity memory-safe-assembly assembly { pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0)) } } function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure { function(uint256, uint256, uint256) internal view fnIn = _memcopyView; function(uint256, uint256, uint256) internal pure pureMemcopy; /// @solidity memory-safe-assembly assembly { pureMemcopy := fnIn } pureMemcopy(fromOffset, toOffset, length); } function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view { /// @solidity memory-safe-assembly assembly { pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length)) } } function logMemory(uint256 offset, uint256 length) internal pure { if (offset >= 0x60) { // Sufficient memory before slice to prepare call header. bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(sub(offset, 0x60)) m1 := mload(sub(offset, 0x40)) m2 := mload(sub(offset, 0x20)) // Selector of `log(bytes)`. mstore(sub(offset, 0x60), 0x0be77f56) mstore(sub(offset, 0x40), 0x20) mstore(sub(offset, 0x20), length) } _sendLogPayload(offset - 0x44, length + 0x44); /// @solidity memory-safe-assembly assembly { mstore(sub(offset, 0x60), m0) mstore(sub(offset, 0x40), m1) mstore(sub(offset, 0x20), m2) } } else { // Insufficient space, so copy slice forward, add header and reverse. bytes32 m0; bytes32 m1; bytes32 m2; uint256 endOffset = offset + length; /// @solidity memory-safe-assembly assembly { m0 := mload(add(endOffset, 0x00)) m1 := mload(add(endOffset, 0x20)) m2 := mload(add(endOffset, 0x40)) } _memcopy(offset, offset + 0x60, length); /// @solidity memory-safe-assembly assembly { // Selector of `log(bytes)`. mstore(add(offset, 0x00), 0x0be77f56) mstore(add(offset, 0x20), 0x20) mstore(add(offset, 0x40), length) } _sendLogPayload(offset + 0x1c, length + 0x44); _memcopy(offset + 0x60, offset, length); /// @solidity memory-safe-assembly assembly { mstore(add(endOffset, 0x00), m0) mstore(add(endOffset, 0x20), m1) mstore(add(endOffset, 0x40), m2) } } } function log(address p0) internal pure { bytes32 m0; bytes32 m1; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) // Selector of `log(address)`. mstore(0x00, 0x2c2ecbc2) mstore(0x20, p0) } _sendLogPayload(0x1c, 0x24); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) } } function log(bool p0) internal pure { bytes32 m0; bytes32 m1; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) // Selector of `log(bool)`. mstore(0x00, 0x32458eed) mstore(0x20, p0) } _sendLogPayload(0x1c, 0x24); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) } } function log(uint256 p0) internal pure { bytes32 m0; bytes32 m1; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) // Selector of `log(uint256)`. mstore(0x00, 0xf82c50f1) mstore(0x20, p0) } _sendLogPayload(0x1c, 0x24); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) } } function log(bytes32 p0) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(string)`. mstore(0x00, 0x41304fac) mstore(0x20, 0x20) writeString(0x40, p0) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(address,address)`. mstore(0x00, 0xdaf0d4aa) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(address p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(address,bool)`. mstore(0x00, 0x75b605d3) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(address p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(address,uint256)`. mstore(0x00, 0x8309e8a8) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(address p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,string)`. mstore(0x00, 0x759f86bb) mstore(0x20, p0) mstore(0x40, 0x40) writeString(0x60, p1) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(bool,address)`. mstore(0x00, 0x853c4849) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(bool p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(bool,bool)`. mstore(0x00, 0x2a110e83) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(bool p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(bool,uint256)`. mstore(0x00, 0x399174d3) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(bool p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,string)`. mstore(0x00, 0x8feac525) mstore(0x20, p0) mstore(0x40, 0x40) writeString(0x60, p1) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(uint256,address)`. mstore(0x00, 0x69276c86) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(uint256 p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(uint256,bool)`. mstore(0x00, 0x1c9d7eb3) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(uint256 p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) // Selector of `log(uint256,uint256)`. mstore(0x00, 0xf666715a) mstore(0x20, p0) mstore(0x40, p1) } _sendLogPayload(0x1c, 0x44); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) } } function log(uint256 p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,string)`. mstore(0x00, 0x643fd0df) mstore(0x20, p0) mstore(0x40, 0x40) writeString(0x60, p1) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, address p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(string,address)`. mstore(0x00, 0x319af333) mstore(0x20, 0x40) mstore(0x40, p1) writeString(0x60, p0) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, bool p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(string,bool)`. mstore(0x00, 0xc3b55635) mstore(0x20, 0x40) mstore(0x40, p1) writeString(0x60, p0) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, uint256 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(string,uint256)`. mstore(0x00, 0xb60e72cc) mstore(0x20, 0x40) mstore(0x40, p1) writeString(0x60, p0) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bytes32 p0, bytes32 p1) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,string)`. mstore(0x00, 0x4b5c4277) mstore(0x20, 0x40) mstore(0x40, 0x80) writeString(0x60, p0) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,address,address)`. mstore(0x00, 0x018c84c2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,address,bool)`. mstore(0x00, 0xf2a66286) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,address,uint256)`. mstore(0x00, 0x17fe6185) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,address,string)`. mstore(0x00, 0x007150be) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,bool,address)`. mstore(0x00, 0xf11699ed) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,bool,bool)`. mstore(0x00, 0xeb830c92) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,bool,uint256)`. mstore(0x00, 0x9c4f99fb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,bool,string)`. mstore(0x00, 0x212255cc) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,uint256,address)`. mstore(0x00, 0x7bc0d848) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,uint256,bool)`. mstore(0x00, 0x678209a8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(address,uint256,uint256)`. mstore(0x00, 0xb69bcaf6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(address p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,uint256,string)`. mstore(0x00, 0xa1f2e8aa) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,string,address)`. mstore(0x00, 0xf08744e8) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,string,bool)`. mstore(0x00, 0xcf020fb1) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(address,string,uint256)`. mstore(0x00, 0x67dd6ff1) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(address p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(address,string,string)`. mstore(0x00, 0xfb772265) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, 0xa0) writeString(0x80, p1) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bool p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,address,address)`. mstore(0x00, 0xd2763667) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,address,bool)`. mstore(0x00, 0x18c9c746) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,address,uint256)`. mstore(0x00, 0x5f7b9afb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,address,string)`. mstore(0x00, 0xde9a9270) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,bool,address)`. mstore(0x00, 0x1078f68d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,bool,bool)`. mstore(0x00, 0x50709698) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,bool,uint256)`. mstore(0x00, 0x12f21602) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,bool,string)`. mstore(0x00, 0x2555fa46) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,uint256,address)`. mstore(0x00, 0x088ef9d2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,uint256,bool)`. mstore(0x00, 0xe8defba9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(bool,uint256,uint256)`. mstore(0x00, 0x37103367) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(bool p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,uint256,string)`. mstore(0x00, 0xc3fc3970) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,string,address)`. mstore(0x00, 0x9591b953) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,string,bool)`. mstore(0x00, 0xdbb4c247) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(bool,string,uint256)`. mstore(0x00, 0x1093ee11) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bool p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(bool,string,string)`. mstore(0x00, 0xb076847f) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, 0xa0) writeString(0x80, p1) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(uint256 p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,address,address)`. mstore(0x00, 0xbcfd9be0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,address,bool)`. mstore(0x00, 0x9b6ec042) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,address,uint256)`. mstore(0x00, 0x5a9b5ed5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,address,string)`. mstore(0x00, 0x63cb41f9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,bool,address)`. mstore(0x00, 0x35085f7b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,bool,bool)`. mstore(0x00, 0x20718650) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,bool,uint256)`. mstore(0x00, 0x20098014) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,bool,string)`. mstore(0x00, 0x85775021) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,uint256,address)`. mstore(0x00, 0x5c96b331) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,uint256,bool)`. mstore(0x00, 0x4766da72) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) // Selector of `log(uint256,uint256,uint256)`. mstore(0x00, 0xd1ed7a3c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) } _sendLogPayload(0x1c, 0x64); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) } } function log(uint256 p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,uint256,string)`. mstore(0x00, 0x71d04af2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x60) writeString(0x80, p2) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,string,address)`. mstore(0x00, 0x7afac959) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,string,bool)`. mstore(0x00, 0x4ceda75a) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(uint256,string,uint256)`. mstore(0x00, 0x37aa7d4c) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, p2) writeString(0x80, p1) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(uint256,string,string)`. mstore(0x00, 0xb115611f) mstore(0x20, p0) mstore(0x40, 0x60) mstore(0x60, 0xa0) writeString(0x80, p1) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, address p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,address,address)`. mstore(0x00, 0xfcec75e0) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, address p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,address,bool)`. mstore(0x00, 0xc91d5ed4) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, address p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,address,uint256)`. mstore(0x00, 0x0d26b925) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, address p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,address,string)`. mstore(0x00, 0xe0e9ad4f) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, 0xa0) writeString(0x80, p0) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bool p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,bool,address)`. mstore(0x00, 0x932bbb38) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, bool p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,bool,bool)`. mstore(0x00, 0x850b7ad6) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, bool p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,bool,uint256)`. mstore(0x00, 0xc95958d6) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, bool p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,bool,string)`. mstore(0x00, 0xe298f47d) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, 0xa0) writeString(0x80, p0) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, uint256 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,uint256,address)`. mstore(0x00, 0x1c7ec448) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, uint256 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,uint256,bool)`. mstore(0x00, 0xca7733b1) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, uint256 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) // Selector of `log(string,uint256,uint256)`. mstore(0x00, 0xca47c4eb) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, p2) writeString(0x80, p0) } _sendLogPayload(0x1c, 0xa4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) } } function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,uint256,string)`. mstore(0x00, 0x5970e089) mstore(0x20, 0x60) mstore(0x40, p1) mstore(0x60, 0xa0) writeString(0x80, p0) writeString(0xc0, p2) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, address p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,string,address)`. mstore(0x00, 0x95ed0195) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, p2) writeString(0x80, p0) writeString(0xc0, p1) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, bool p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,string,bool)`. mstore(0x00, 0xb0e0f9b5) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, p2) writeString(0x80, p0) writeString(0xc0, p1) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) // Selector of `log(string,string,uint256)`. mstore(0x00, 0x5821efa1) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, p2) writeString(0x80, p0) writeString(0xc0, p1) } _sendLogPayload(0x1c, 0xe4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) } } function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) // Selector of `log(string,string,string)`. mstore(0x00, 0x2ced7cef) mstore(0x20, 0x60) mstore(0x40, 0xa0) mstore(0x60, 0xe0) writeString(0x80, p0) writeString(0xc0, p1) writeString(0x100, p2) } _sendLogPayload(0x1c, 0x124); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) } } function log(address p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,address,address)`. mstore(0x00, 0x665bf134) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,address,bool)`. mstore(0x00, 0x0e378994) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,address,uint256)`. mstore(0x00, 0x94250d77) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,address,string)`. mstore(0x00, 0xf808da20) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,bool,address)`. mstore(0x00, 0x9f1bc36e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,bool,bool)`. mstore(0x00, 0x2cd4134a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,bool,uint256)`. mstore(0x00, 0x3971e78c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,bool,string)`. mstore(0x00, 0xaa6540c8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,uint256,address)`. mstore(0x00, 0x8da6def5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,uint256,bool)`. mstore(0x00, 0x9b4254e2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,address,uint256,uint256)`. mstore(0x00, 0xbe553481) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,uint256,string)`. mstore(0x00, 0xfdb4f990) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,string,address)`. mstore(0x00, 0x8f736d16) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,string,bool)`. mstore(0x00, 0x6f1a594e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,address,string,uint256)`. mstore(0x00, 0xef1cefe7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,address,string,string)`. mstore(0x00, 0x21bdaf25) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,address,address)`. mstore(0x00, 0x660375dd) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,address,bool)`. mstore(0x00, 0xa6f50b0f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,address,uint256)`. mstore(0x00, 0xa75c59de) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,address,string)`. mstore(0x00, 0x2dd778e6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,bool,address)`. mstore(0x00, 0xcf394485) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,bool,bool)`. mstore(0x00, 0xcac43479) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,bool,uint256)`. mstore(0x00, 0x8c4e5de6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,bool,string)`. mstore(0x00, 0xdfc4a2e8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,uint256,address)`. mstore(0x00, 0xccf790a1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,uint256,bool)`. mstore(0x00, 0xc4643e20) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,bool,uint256,uint256)`. mstore(0x00, 0x386ff5f4) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,uint256,string)`. mstore(0x00, 0x0aa6cfad) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,string,address)`. mstore(0x00, 0x19fd4956) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,string,bool)`. mstore(0x00, 0x50ad461d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,bool,string,uint256)`. mstore(0x00, 0x80e6a20b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,bool,string,string)`. mstore(0x00, 0x475c5c33) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,address,address)`. mstore(0x00, 0x478d1c62) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,address,bool)`. mstore(0x00, 0xa1bcc9b3) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,address,uint256)`. mstore(0x00, 0x100f650e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,address,string)`. mstore(0x00, 0x1da986ea) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,bool,address)`. mstore(0x00, 0xa31bfdcc) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,bool,bool)`. mstore(0x00, 0x3bf5e537) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,bool,uint256)`. mstore(0x00, 0x22f6b999) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,bool,string)`. mstore(0x00, 0xc5ad85f9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,uint256,address)`. mstore(0x00, 0x20e3984d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,uint256,bool)`. mstore(0x00, 0x66f1bc67) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(address,uint256,uint256,uint256)`. mstore(0x00, 0x34f0e636) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,uint256,string)`. mstore(0x00, 0x4a28c017) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,string,address)`. mstore(0x00, 0x5c430d47) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,string,bool)`. mstore(0x00, 0xcf18105c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,uint256,string,uint256)`. mstore(0x00, 0xbf01f891) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,uint256,string,string)`. mstore(0x00, 0x88a8c406) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,address,address)`. mstore(0x00, 0x0d36fa20) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,address,bool)`. mstore(0x00, 0x0df12b76) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,address,uint256)`. mstore(0x00, 0x457fe3cf) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,address,string)`. mstore(0x00, 0xf7e36245) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,bool,address)`. mstore(0x00, 0x205871c2) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,bool,bool)`. mstore(0x00, 0x5f1d5c9f) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,bool,uint256)`. mstore(0x00, 0x515e38b6) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,bool,string)`. mstore(0x00, 0xbc0b61fe) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,uint256,address)`. mstore(0x00, 0x63183678) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,uint256,bool)`. mstore(0x00, 0x0ef7e050) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(address,string,uint256,uint256)`. mstore(0x00, 0x1dc8e1b8) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,uint256,string)`. mstore(0x00, 0x448830a8) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,string,address)`. mstore(0x00, 0xa04e2f87) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,string,bool)`. mstore(0x00, 0x35a5071f) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(address,string,string,uint256)`. mstore(0x00, 0x159f8927) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(address,string,string,string)`. mstore(0x00, 0x5d02c50b) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p1) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bool p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,address,address)`. mstore(0x00, 0x1d14d001) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,address,bool)`. mstore(0x00, 0x46600be0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,address,uint256)`. mstore(0x00, 0x0c66d1be) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,address,string)`. mstore(0x00, 0xd812a167) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,bool,address)`. mstore(0x00, 0x1c41a336) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,bool,bool)`. mstore(0x00, 0x6a9c478b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,bool,uint256)`. mstore(0x00, 0x07831502) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,bool,string)`. mstore(0x00, 0x4a66cb34) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,uint256,address)`. mstore(0x00, 0x136b05dd) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,uint256,bool)`. mstore(0x00, 0xd6019f1c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,address,uint256,uint256)`. mstore(0x00, 0x7bf181a1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,uint256,string)`. mstore(0x00, 0x51f09ff8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,string,address)`. mstore(0x00, 0x6f7c603e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,string,bool)`. mstore(0x00, 0xe2bfd60b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,address,string,uint256)`. mstore(0x00, 0xc21f64c7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,address,string,string)`. mstore(0x00, 0xa73c1db6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,address,address)`. mstore(0x00, 0xf4880ea4) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,address,bool)`. mstore(0x00, 0xc0a302d8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,address,uint256)`. mstore(0x00, 0x4c123d57) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,address,string)`. mstore(0x00, 0xa0a47963) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,bool,address)`. mstore(0x00, 0x8c329b1a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,bool,bool)`. mstore(0x00, 0x3b2a5ce0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,bool,uint256)`. mstore(0x00, 0x6d7045c1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,bool,string)`. mstore(0x00, 0x2ae408d4) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,uint256,address)`. mstore(0x00, 0x54a7a9a0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,uint256,bool)`. mstore(0x00, 0x619e4d0e) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,bool,uint256,uint256)`. mstore(0x00, 0x0bb00eab) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,uint256,string)`. mstore(0x00, 0x7dd4d0e0) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,string,address)`. mstore(0x00, 0xf9ad2b89) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,string,bool)`. mstore(0x00, 0xb857163a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,bool,string,uint256)`. mstore(0x00, 0xe3a9ca2f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,bool,string,string)`. mstore(0x00, 0x6d1e8751) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,address,address)`. mstore(0x00, 0x26f560a8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,address,bool)`. mstore(0x00, 0xb4c314ff) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,address,uint256)`. mstore(0x00, 0x1537dc87) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,address,string)`. mstore(0x00, 0x1bb3b09a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,bool,address)`. mstore(0x00, 0x9acd3616) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,bool,bool)`. mstore(0x00, 0xceb5f4d7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,bool,uint256)`. mstore(0x00, 0x7f9bbca2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,bool,string)`. mstore(0x00, 0x9143dbb1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,uint256,address)`. mstore(0x00, 0x00dd87b9) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,uint256,bool)`. mstore(0x00, 0xbe984353) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(bool,uint256,uint256,uint256)`. mstore(0x00, 0x374bb4b2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,uint256,string)`. mstore(0x00, 0x8e69fb5d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,string,address)`. mstore(0x00, 0xfedd1fff) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,string,bool)`. mstore(0x00, 0xe5e70b2b) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,uint256,string,uint256)`. mstore(0x00, 0x6a1199e2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,uint256,string,string)`. mstore(0x00, 0xf5bc2249) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,address,address)`. mstore(0x00, 0x2b2b18dc) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,address,bool)`. mstore(0x00, 0x6dd434ca) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,address,uint256)`. mstore(0x00, 0xa5cada94) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,address,string)`. mstore(0x00, 0x12d6c788) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,bool,address)`. mstore(0x00, 0x538e06ab) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,bool,bool)`. mstore(0x00, 0xdc5e935b) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,bool,uint256)`. mstore(0x00, 0x1606a393) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,bool,string)`. mstore(0x00, 0x483d0416) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,uint256,address)`. mstore(0x00, 0x1596a1ce) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,uint256,bool)`. mstore(0x00, 0x6b0e5d53) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(bool,string,uint256,uint256)`. mstore(0x00, 0x28863fcb) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,uint256,string)`. mstore(0x00, 0x1ad96de6) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,string,address)`. mstore(0x00, 0x97d394d8) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,string,bool)`. mstore(0x00, 0x1e4b87e5) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(bool,string,string,uint256)`. mstore(0x00, 0x7be0c3eb) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(bool,string,string,string)`. mstore(0x00, 0x1762e32a) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p1) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(uint256 p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,address,address)`. mstore(0x00, 0x2488b414) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,address,bool)`. mstore(0x00, 0x091ffaf5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,address,uint256)`. mstore(0x00, 0x736efbb6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,address,string)`. mstore(0x00, 0x031c6f73) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,bool,address)`. mstore(0x00, 0xef72c513) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,bool,bool)`. mstore(0x00, 0xe351140f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,bool,uint256)`. mstore(0x00, 0x5abd992a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,bool,string)`. mstore(0x00, 0x90fb06aa) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,uint256,address)`. mstore(0x00, 0x15c127b5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,uint256,bool)`. mstore(0x00, 0x5f743a7c) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,address,uint256,uint256)`. mstore(0x00, 0x0c9cd9c1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,uint256,string)`. mstore(0x00, 0xddb06521) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,string,address)`. mstore(0x00, 0x9cba8fff) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,string,bool)`. mstore(0x00, 0xcc32ab07) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,address,string,uint256)`. mstore(0x00, 0x46826b5d) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,address,string,string)`. mstore(0x00, 0x3e128ca3) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,address,address)`. mstore(0x00, 0xa1ef4cbb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,address,bool)`. mstore(0x00, 0x454d54a5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,address,uint256)`. mstore(0x00, 0x078287f5) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,address,string)`. mstore(0x00, 0xade052c7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,bool,address)`. mstore(0x00, 0x69640b59) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,bool,bool)`. mstore(0x00, 0xb6f577a1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,bool,uint256)`. mstore(0x00, 0x7464ce23) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,bool,string)`. mstore(0x00, 0xdddb9561) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,uint256,address)`. mstore(0x00, 0x88cb6041) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,uint256,bool)`. mstore(0x00, 0x91a02e2a) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,bool,uint256,uint256)`. mstore(0x00, 0xc6acc7a8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,uint256,string)`. mstore(0x00, 0xde03e774) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,string,address)`. mstore(0x00, 0xef529018) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,string,bool)`. mstore(0x00, 0xeb928d7f) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,bool,string,uint256)`. mstore(0x00, 0x2c1d0746) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,bool,string,string)`. mstore(0x00, 0x68c8b8bd) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,address,address)`. mstore(0x00, 0x56a5d1b1) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,address,bool)`. mstore(0x00, 0x15cac476) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,address,uint256)`. mstore(0x00, 0x88f6e4b2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,address,string)`. mstore(0x00, 0x6cde40b8) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,bool,address)`. mstore(0x00, 0x9a816a83) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,bool,bool)`. mstore(0x00, 0xab085ae6) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,bool,uint256)`. mstore(0x00, 0xeb7f6fd2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,bool,string)`. mstore(0x00, 0xa5b4fc99) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,uint256,address)`. mstore(0x00, 0xfa8185af) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,uint256,bool)`. mstore(0x00, 0xc598d185) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; /// @solidity memory-safe-assembly assembly { m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) // Selector of `log(uint256,uint256,uint256,uint256)`. mstore(0x00, 0x193fb800) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) } _sendLogPayload(0x1c, 0x84); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) } } function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,uint256,string)`. mstore(0x00, 0x59cfcbe3) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0x80) writeString(0xa0, p3) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,string,address)`. mstore(0x00, 0x42d21db7) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,string,bool)`. mstore(0x00, 0x7af6ab25) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,uint256,string,uint256)`. mstore(0x00, 0x5da297eb) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, p3) writeString(0xa0, p2) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,uint256,string,string)`. mstore(0x00, 0x27d8afd2) mstore(0x20, p0) mstore(0x40, p1) mstore(0x60, 0x80) mstore(0x80, 0xc0) writeString(0xa0, p2) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,address,address)`. mstore(0x00, 0x6168ed61) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,address,bool)`. mstore(0x00, 0x90c30a56) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,address,uint256)`. mstore(0x00, 0xe8d3018d) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,address,string)`. mstore(0x00, 0x9c3adfa1) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,bool,address)`. mstore(0x00, 0xae2ec581) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,bool,bool)`. mstore(0x00, 0xba535d9c) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,bool,uint256)`. mstore(0x00, 0xcf009880) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,bool,string)`. mstore(0x00, 0xd2d423cd) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,uint256,address)`. mstore(0x00, 0x3b2279b4) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,uint256,bool)`. mstore(0x00, 0x691a8f74) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(uint256,string,uint256,uint256)`. mstore(0x00, 0x82c25b74) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p1) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,uint256,string)`. mstore(0x00, 0xb7b914ca) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p1) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,string,address)`. mstore(0x00, 0xd583c602) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,string,bool)`. mstore(0x00, 0xb3a6b6bd) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(uint256,string,string,uint256)`. mstore(0x00, 0xb028c9bd) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p1) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(uint256,string,string,string)`. mstore(0x00, 0x21ad0683) mstore(0x20, p0) mstore(0x40, 0x80) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p1) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, address p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,address,address)`. mstore(0x00, 0xed8f28f6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,address,bool)`. mstore(0x00, 0xb59dbd60) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,address,uint256)`. mstore(0x00, 0x8ef3f399) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,address,string)`. mstore(0x00, 0x800a1c67) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,bool,address)`. mstore(0x00, 0x223603bd) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,bool,bool)`. mstore(0x00, 0x79884c2b) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,bool,uint256)`. mstore(0x00, 0x3e9f866a) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,bool,string)`. mstore(0x00, 0x0454c079) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,uint256,address)`. mstore(0x00, 0x63fb8bc5) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,uint256,bool)`. mstore(0x00, 0xfc4845f0) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,address,uint256,uint256)`. mstore(0x00, 0xf8f51b1e) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,uint256,string)`. mstore(0x00, 0x5a477632) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,string,address)`. mstore(0x00, 0xaabc9a31) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,string,bool)`. mstore(0x00, 0x5f15d28c) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,address,string,uint256)`. mstore(0x00, 0x91d1112e) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,address,string,string)`. mstore(0x00, 0x245986f2) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bool p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,address,address)`. mstore(0x00, 0x33e9dd1d) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,address,bool)`. mstore(0x00, 0x958c28c6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,address,uint256)`. mstore(0x00, 0x5d08bb05) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,address,string)`. mstore(0x00, 0x2d8e33a4) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,bool,address)`. mstore(0x00, 0x7190a529) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,bool,bool)`. mstore(0x00, 0x895af8c5) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,bool,uint256)`. mstore(0x00, 0x8e3f78a9) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,bool,string)`. mstore(0x00, 0x9d22d5dd) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,uint256,address)`. mstore(0x00, 0x935e09bf) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,uint256,bool)`. mstore(0x00, 0x8af7cf8a) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,bool,uint256,uint256)`. mstore(0x00, 0x64b5bb67) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,uint256,string)`. mstore(0x00, 0x742d6ee7) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,string,address)`. mstore(0x00, 0xe0625b29) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,string,bool)`. mstore(0x00, 0x3f8a701d) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,bool,string,uint256)`. mstore(0x00, 0x24f91465) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,bool,string,string)`. mstore(0x00, 0xa826caeb) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,address,address)`. mstore(0x00, 0x5ea2b7ae) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,address,bool)`. mstore(0x00, 0x82112a42) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,address,uint256)`. mstore(0x00, 0x4f04fdc6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,address,string)`. mstore(0x00, 0x9ffb2f93) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,bool,address)`. mstore(0x00, 0xe0e95b98) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,bool,bool)`. mstore(0x00, 0x354c36d6) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,bool,uint256)`. mstore(0x00, 0xe41b6f6f) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,bool,string)`. mstore(0x00, 0xabf73a98) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,uint256,address)`. mstore(0x00, 0xe21de278) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,uint256,bool)`. mstore(0x00, 0x7626db92) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) // Selector of `log(string,uint256,uint256,uint256)`. mstore(0x00, 0xa7a87853) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) } _sendLogPayload(0x1c, 0xc4); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) } } function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,uint256,string)`. mstore(0x00, 0x854b3496) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, p2) mstore(0x80, 0xc0) writeString(0xa0, p0) writeString(0xe0, p3) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,string,address)`. mstore(0x00, 0x7c4632a4) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,string,bool)`. mstore(0x00, 0x7d24491d) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,uint256,string,uint256)`. mstore(0x00, 0xc67ea9d1) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p2) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,uint256,string,string)`. mstore(0x00, 0x5ab84e1f) mstore(0x20, 0x80) mstore(0x40, p1) mstore(0x60, 0xc0) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p2) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,address,address)`. mstore(0x00, 0x439c7bef) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,address,bool)`. mstore(0x00, 0x5ccd4e37) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,address,uint256)`. mstore(0x00, 0x7cc3c607) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,address,string)`. mstore(0x00, 0xeb1bff80) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,bool,address)`. mstore(0x00, 0xc371c7db) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,bool,bool)`. mstore(0x00, 0x40785869) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,bool,uint256)`. mstore(0x00, 0xd6aefad2) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,bool,string)`. mstore(0x00, 0x5e84b0ea) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,uint256,address)`. mstore(0x00, 0x1023f7b2) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,uint256,bool)`. mstore(0x00, 0xc3a8a654) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) // Selector of `log(string,string,uint256,uint256)`. mstore(0x00, 0xf45d7d2c) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) } _sendLogPayload(0x1c, 0x104); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) } } function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,uint256,string)`. mstore(0x00, 0x5d1a971a) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, p2) mstore(0x80, 0x100) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p3) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,string,address)`. mstore(0x00, 0x6d572f44) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,string,bool)`. mstore(0x00, 0x2c1754ed) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) // Selector of `log(string,string,string,uint256)`. mstore(0x00, 0x8eafb02b) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, p3) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) } _sendLogPayload(0x1c, 0x144); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) } } function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { bytes32 m0; bytes32 m1; bytes32 m2; bytes32 m3; bytes32 m4; bytes32 m5; bytes32 m6; bytes32 m7; bytes32 m8; bytes32 m9; bytes32 m10; bytes32 m11; bytes32 m12; /// @solidity memory-safe-assembly assembly { function writeString(pos, w) { let length := 0 for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } mstore(pos, length) let shift := sub(256, shl(3, length)) mstore(add(pos, 0x20), shl(shift, shr(shift, w))) } m0 := mload(0x00) m1 := mload(0x20) m2 := mload(0x40) m3 := mload(0x60) m4 := mload(0x80) m5 := mload(0xa0) m6 := mload(0xc0) m7 := mload(0xe0) m8 := mload(0x100) m9 := mload(0x120) m10 := mload(0x140) m11 := mload(0x160) m12 := mload(0x180) // Selector of `log(string,string,string,string)`. mstore(0x00, 0xde68f20a) mstore(0x20, 0x80) mstore(0x40, 0xc0) mstore(0x60, 0x100) mstore(0x80, 0x140) writeString(0xa0, p0) writeString(0xe0, p1) writeString(0x120, p2) writeString(0x160, p3) } _sendLogPayload(0x1c, 0x184); /// @solidity memory-safe-assembly assembly { mstore(0x00, m0) mstore(0x20, m1) mstore(0x40, m2) mstore(0x60, m3) mstore(0x80, m4) mstore(0xa0, m5) mstore(0xc0, m6) mstore(0xe0, m7) mstore(0x100, m8) mstore(0x120, m9) mstore(0x140, m10) mstore(0x160, m11) mstore(0x180, m12) } } }
pragma solidity ^0.8.4; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
pragma solidity ^0.8.4; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
pragma solidity ^0.8.4; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
pragma solidity ^0.8.4; import "../introspection/IERC165.sol"; interface IEOARegistry is IERC165 { function isVerifiedEOA(address account) external view returns (bool); }
pragma solidity ^0.8.4; interface ITransferValidator { function applyCollectionTransferPolicy(address caller, address from, address to) external view; function validateTransfer(address caller, address from, address to) external view; function validateTransfer(address caller, address from, address to, uint256 tokenId) external view; function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount) external; function beforeAuthorizedTransfer(address operator, address token, uint256 tokenId) external; function afterAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransfer(address operator, address token) external; function afterAuthorizedTransfer(address token) external; function beforeAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 amount) external; function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external; }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.24; import "forge-std/Script.sol"; import "forge-std/console2.sol"; import "src/CreatorTokenTransferValidator.sol"; contract DeployCreatorTokenTransferValidator is Script { function run() public { uint256 deployerPrivateKey = vm.envUint("DEPLOYER_KEY"); address defaultOwner = address(0x67985B1f8B613b57077bbDb24A5DEFCDDA458317); address eoaRegistry = address(0xdB8C854027A93F3f98300DE8ECcf4268De676160); string memory name = "CreatorTokenTransferValidator"; string memory version = "4"; vm.startBroadcast(deployerPrivateKey); address validator = address(new CreatorTokenTransferValidator(defaultOwner, eoaRegistry, name, version)); vm.stopBroadcast(); console.log("Validator: ", validator); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; /** * @dev Constant definitions for receiver constraints used by the transfer validator. */ /// @dev No constraints on the receiver of a token. uint256 constant RECEIVER_CONSTRAINTS_NONE = 0; /// @dev Token receiver cannot have deployed code. uint256 constant RECEIVER_CONSTRAINTS_NO_CODE = 1; /// @dev Token receiver must be a verified EOA with the EOA Registry. uint256 constant RECEIVER_CONSTRAINTS_EOA = 2; /// @dev Token is a soulbound token and cannot be transferred. uint256 constant RECEIVER_CONSTRAINTS_SBT = 3; /** * @dev Constant definitions for caller constraints used by the transfer validator. */ /// @dev No constraints on the caller of a token transfer. uint256 constant CALLER_CONSTRAINTS_NONE = 0; /// @dev Caller of a token transfer must not be on the blacklist unless it is an OTC transfer. uint256 constant CALLER_CONSTRAINTS_OPERATOR_BLACKLIST_ENABLE_OTC = 1; /// @dev Caller of a token transfer must be on the whitelist unless it is an OTC transfer. uint256 constant CALLER_CONSTRAINTS_OPERATOR_WHITELIST_ENABLE_OTC = 2; /// @dev Caller of a token transfer must be on the whitelist. uint256 constant CALLER_CONSTRAINTS_OPERATOR_WHITELIST_DISABLE_OTC = 3; /// @dev Token is a soulbound token and cannot be transferred. uint256 constant CALLER_CONSTRAINTS_SBT = 4; /** * @dev Constant definitions for transfer security levels used by the transfer validator * to define what receiver and caller constraints are applied to a transfer. */ /// @dev Recommend Security Level - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_RECOMMENDED = 0; /// @dev Security Level One - /// Caller Constraints: None /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_ONE = 1; /// @dev Security Level Two - /// Caller Constraints: Operator Blacklist /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_TWO = 2; /// @dev Security Level Three - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: None /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_THREE = 3; /// @dev Security Level Four - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: None /// OTC: Not Allowed uint8 constant TRANSFER_SECURITY_LEVEL_FOUR = 4; /// @dev Security Level Five - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: No Code /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_FIVE = 5; /// @dev Security Level Six - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: Verified EOA /// OTC: Allowed uint8 constant TRANSFER_SECURITY_LEVEL_SIX = 6; /// @dev Security Level Seven - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: No Code /// OTC: Not Allowed uint8 constant TRANSFER_SECURITY_LEVEL_SEVEN = 7; /// @dev Security Level Eight - /// Caller Constraints: Operator Whitelist /// Receiver Constraints: Verified EOA /// OTC: Not Allowed uint8 constant TRANSFER_SECURITY_LEVEL_EIGHT = 8; /// @dev Security Level Nine - /// Soulbound Token, No Transfers Allowed uint8 constant TRANSFER_SECURITY_LEVEL_NINE = 9; /// @dev List type is a blacklist. uint8 constant LIST_TYPE_BLACKLIST = 0; /// @dev List type is a whitelist. uint8 constant LIST_TYPE_WHITELIST = 1; /// @dev List type is authorizers. uint8 constant LIST_TYPE_AUTHORIZERS = 2; /// @dev Constant value for the no error selector. bytes4 constant SELECTOR_NO_ERROR = bytes4(0x00000000); /// @dev Constant value for the default validator list ID. uint120 constant DEFAULT_LIST_ID = 0;
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; struct CollectionSecurityPolicyV3 { bool disableAuthorizationMode; bool authorizersCannotSetWildcardOperators; uint8 transferSecurityLevel; uint120 listId; bool enableAccountFreezingMode; uint16 tokenType; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /** * @title ZkTstorish */ abstract contract ZkTstorish { function _setTstorish(uint256 storageSlot, uint256 value) internal { assembly { tstore(storageSlot, value) } } function _getTstorish( uint256 storageSlot ) internal view returns (uint256 value) { assembly { value := tload(storageSlot) } } function _clearTstorish(uint256 storageSlot) internal { assembly { tstore(storageSlot, 0) } } }
{ "viaIR": false, "codegen": "yul", "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "@limitbreak/tm-core-lib/=lib/tm-core-lib/", "@limitbreak/permit-c/=lib/PermitC/src/", "@openzeppelin/=lib/PermitC/lib/openzeppelin-contracts/", "@rari-capital/solmate/=lib/PermitC/lib/solmate/", "PermitC/=lib/PermitC/", "erc4626-tests/=lib/PermitC/lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-gas-metering/=lib/PermitC/lib/forge-gas-metering/", "openzeppelin-contracts/=lib/PermitC/lib/openzeppelin-contracts/", "openzeppelin/=lib/PermitC/lib/openzeppelin-contracts/contracts/", "solady/=lib/PermitC/lib/forge-gas-metering/lib/solady/", "solmate/=lib/PermitC/lib/solmate/src/", "tm-core-lib/=lib/tm-core-lib/src/" ], "evmVersion": "cancun", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"defaultOwner","type":"address"},{"internalType":"address","name":"eoaRegistry_","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CollateralizedPausableFlags__NotPaused","type":"error"},{"inputs":[],"name":"CollateralizedPausableFlags__Paused","type":"error"},{"inputs":[],"name":"CollateralizedPausableFlags__WithdrawFailed","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__AuthorizationDisabledForCollection","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerDoesNotOwnList","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerMustBeAnAuthorizer","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerMustBeWhitelisted","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CallerMustHaveElevatedPermissionsForSpecifiedNFT","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__CannotReassignOwnershipOfDefaultList","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__InvalidConstructorArgs","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__InvalidTransferSecurityLevel","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ListDoesNotExist","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ListOwnershipCannotBeTransferredToZeroAddress","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__OperatorIsBlacklisted","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ReceiverAccountIsFrozen","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ReceiverMustNotHaveDeployedCode","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__ReceiverProofOfEOASignatureUnverified","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__SenderAccountIsFrozen","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__TokenIsSoulbound","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__TokenTypesDoNotMatch","type":"error"},{"inputs":[],"name":"CreatorTokenTransferValidator__WildcardOperatorsCannotBeAuthorizedForCollection","type":"error"},{"inputs":[],"name":"Ownable__CallerIsNotOwner","type":"error"},{"inputs":[],"name":"Ownable__NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"PermitC__AmountExceedsStorageMaximum","type":"error"},{"inputs":[],"name":"PermitC__ApprovalTransferExceededPermittedAmount","type":"error"},{"inputs":[],"name":"PermitC__ApprovalTransferPermitExpiredOrUnset","type":"error"},{"inputs":[],"name":"PermitC__CallerMustBeOwnerOrOperator","type":"error"},{"inputs":[],"name":"PermitC__InvalidTokenType","type":"error"},{"inputs":[],"name":"PermitC__NonceAlreadyUsedOrRevoked","type":"error"},{"inputs":[],"name":"PermitC__NonceNotUsedOrRevoked","type":"error"},{"inputs":[],"name":"PermitC__OrderIsEitherCancelledOrFilled","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferExceededPermitExpired","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferExceededPermittedAmount","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferInvalidSignature","type":"error"},{"inputs":[],"name":"PermitC__SignatureTransferPermitHashNotRegistered","type":"error"},{"inputs":[],"name":"PermitC__UnableToFillMinimumRequestedQuantity","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountFrozenForCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountUnfrozenForCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedAccountToList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"AddedCodeHashToList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint120","name":"id","type":"uint120"}],"name":"AppliedListToCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint200","name":"amount","type":"uint200"},{"indexed":false,"internalType":"uint48","name":"expiration","type":"uint48"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"CreatedList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"Lockdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"wasCancellation","type":"bool"}],"name":"OrderClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OrderFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"fillableQuantity","type":"uint256"}],"name":"OrderOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountRestoredToOrder","type":"uint256"}],"name":"OrderRestored","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":"uint256","name":"previousFlags","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFlags","type":"uint256"}],"name":"PausableFlagsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"ReassignedListOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedAccountFromList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"RemovedCodeHashFromList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetAccountFreezingModeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"bool","name":"disabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"authorizersCannotSetWildcardOperators","type":"bool"}],"name":"SetAuthorizationModeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokenType","type":"uint16"}],"name":"SetTokenType","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"}],"name":"SetTransferSecurityLevel","type":"event"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAccountsToAuthorizers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAccountsToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addAccountsToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"addCodeHashesToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"addCodeHashesToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"afterAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"afterAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"afterAuthorizedTransferWithAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"allowedAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"orderId","type":"bytes32"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"allowedAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"applyCollectionTransferPolicy","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint120","name":"id","type":"uint120"}],"name":"applyListToCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint200","name":"amount","type":"uint200"},{"internalType":"uint48","name":"expiration","type":"uint48"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"beforeAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"beforeAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"beforeAuthorizedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"beforeAuthorizedTransferWithAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"orderId","type":"bytes32"}],"name":"closePermittedOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createList","outputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint120","name":"sourceListId","type":"uint120"}],"name":"createListCopy","outputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparatorV4","outputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signedPermit","type":"bytes"},{"components":[{"internalType":"uint256","name":"orderStartAmount","type":"uint256"},{"internalType":"uint256","name":"requestedFillAmount","type":"uint256"},{"internalType":"uint256","name":"minimumFillAmount","type":"uint256"}],"internalType":"struct OrderFillAmounts","name":"orderFillAmounts","type":"tuple"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"}],"name":"fillPermittedOrderERC1155","outputs":[{"internalType":"uint256","name":"quantityFilled","type":"uint256"},{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signedPermit","type":"bytes"},{"components":[{"internalType":"uint256","name":"orderStartAmount","type":"uint256"},{"internalType":"uint256","name":"requestedFillAmount","type":"uint256"},{"internalType":"uint256","name":"minimumFillAmount","type":"uint256"}],"internalType":"struct OrderFillAmounts","name":"orderFillAmounts","type":"tuple"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"}],"name":"fillPermittedOrderERC20","outputs":[{"internalType":"uint256","name":"quantityFilled","type":"uint256"},{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address[]","name":"accountsToFreeze","type":"address[]"}],"name":"freezeAccountsForCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getAuthorizerAccounts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getAuthorizerAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getBlacklistedAccounts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getBlacklistedAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getBlacklistedCodeHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getBlacklistedCodeHashesByCollection","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getCollectionSecurityPolicy","outputs":[{"components":[{"internalType":"bool","name":"disableAuthorizationMode","type":"bool"},{"internalType":"bool","name":"authorizersCannotSetWildcardOperators","type":"bool"},{"internalType":"uint8","name":"transferSecurityLevel","type":"uint8"},{"internalType":"uint120","name":"listId","type":"uint120"},{"internalType":"bool","name":"enableAccountFreezingMode","type":"bool"},{"internalType":"uint16","name":"tokenType","type":"uint16"}],"internalType":"struct CollectionSecurityPolicyV3","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getFrozenAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getWhitelistedAccounts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getWhitelistedAccountsByCollection","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"getWhitelistedCodeHashes","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getWhitelistedCodeHashesByCollection","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"invalidateUnorderedNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountAuthorizer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountAuthorizerOfCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountBlacklistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountFrozenForCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"isAccountWhitelistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashBlacklistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"bytes32","name":"codehash","type":"bytes32"}],"name":"isCodeHashWhitelistedByCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isRegisteredOrderAdditionalDataHash","outputs":[{"internalType":"bool","name":"isRegistered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isRegisteredTransferAdditionalDataHash","outputs":[{"internalType":"bool","name":"isRegistered","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"isValidUnorderedNonce","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isVerifiedEOA","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastListId","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint120","name":"","type":"uint120"}],"name":"listOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"masterNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableConfigurationSettings","outputs":[{"internalType":"uint256","name":"_nativeValueToCheckPauseState","type":"uint256"},{"internalType":"uint256","name":"_pausableFlags","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausableDepositCollateral","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pausableFlags","type":"uint256"}],"name":"pause","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromERC1155","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromERC20","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromERC721","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes32","name":"additionalData","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromWithAdditionalDataERC1155","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"permitAmount","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"bytes32","name":"additionalData","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromWithAdditionalDataERC20","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"additionalData","type":"bytes32"},{"internalType":"bytes32","name":"advancedPermitHash","type":"bytes32"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"permitTransferFromWithAdditionalDataERC721","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"reassignOwnershipOfList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"additionalDataTypeString","type":"string"}],"name":"registerAdditionalDataHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAccountsFromAuthorizers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAccountsFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeAccountsFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"removeCodeHashesFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"},{"internalType":"bytes32[]","name":"codehashes","type":"bytes32[]"}],"name":"removeCodeHashesFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint120","name":"id","type":"uint120"}],"name":"renounceOwnershipOfList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint16","name":"tokenType","type":"uint16"}],"name":"setTokenTypeOfCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"bool","name":"disableAuthorizationMode","type":"bool"},{"internalType":"bool","name":"disableWildcardOperators","type":"bool"},{"internalType":"bool","name":"enableAccountFreezingMode","type":"bool"}],"name":"setTransferSecurityLevelOfCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromERC1155","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromERC20","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFromERC721","outputs":[{"internalType":"bool","name":"isError","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"transferSecurityPolicies","outputs":[{"internalType":"uint256","name":"callerConstraints","type":"uint256"},{"internalType":"uint256","name":"receiverConstraints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address[]","name":"accountsToUnfreeze","type":"address[]"}],"name":"unfreezeAccountsForCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawTo","type":"address"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint200","name":"amount","type":"uint200"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint48","name":"approvalExpiration","type":"uint48"},{"internalType":"uint48","name":"sigDeadline","type":"uint48"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"signedPermit","type":"bytes"}],"name":"updateApprovalBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"validateTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"validateTransfer","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"validateTransfer","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010016f5b3d0a4c6c87b944df7ecd7b6f97a8373c041e2dd3a26e868f33c42a20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000067985b1f8b613b57077bbdb24a5defcdda458317000000000000000000000000db8c854027a93f3f98300de8eccf4268de676160000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001d43726561746f72546f6b656e5472616e7366657256616c696461746f7200000000000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x00040000000000020011000000000002000000000801034f0000006003100270000015d90130019700030000001803550002000000080355000015d90030019d0000000100200190000001020000c13d0000008002000039000000400020043f000000040010008c0000012a0000413d000000000208043b000000e002200270000015f20020009c0000012c0000a13d000015f30020009c0000018d0000a13d000015f40020009c000002cf0000a13d000015f50020009c000004050000213d000015fd0020009c000007850000213d000016010020009c000013ba0000613d000016020020009c00000f8a0000613d000016030020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000a00000003001d000015dd0030009c0000012a0000213d000900240020003d0000000a0200002900000005022002100000000902200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a0000006b000015900000613d0000000f02000029000b00020020003d000700050020003d000c00030020003d000f00000000001d0000006c0000013d0000000f020000290000000102200039000f00000002001d0000000a0020006c000015900000813d0000000f01000029000000050110021000000009011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000000670000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d000000c20000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167a04000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e302200197000000000021041b000000670000013d000001e003000039000000400030043f0000000002000416000000000002004b0000012a0000c13d0000001f02100039000015da02200197000001e002200039000000400020043f0000001f0410018f000015db05100198000001e002500039000001140000613d000000000608034f000000006706043c0000000003730436000000000023004b000001100000c13d000000000004004b000001210000613d000000000358034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000800010008c0000012a0000413d000001e00600043d000015dc0060009c0000012a0000213d000002000200043d000f00000002001d000015dc0020009c0000029a0000a13d0000000001000019000056b0000104300000162f0020009c000001ac0000213d0000164d0020009c000003bc0000213d0000165c0020009c0000054c0000a13d0000165d0020009c000007c60000213d000016610020009c0000148e0000613d000016620020009c0000118f0000613d000016630020009c0000012a0000c13d000000a40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000008401800370000000000101043b000b00000001001d0000006401800370000000000101043b000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015cd0001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000a00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000a0010006b00001ccc0000a13d0000000101000039000000000101041a000000020010019000000f870000c13d00001ccc0000013d000016120020009c000002b40000213d000016210020009c000004210000a13d000016220020009c0000066f0000213d000016260020009c00000cda0000613d000016270020009c00000c340000613d000016280020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a000000180110027000001676011001970000151e0000013d000016300020009c000003f60000213d0000163f0020009c000005c50000a13d000016400020009c000007e00000213d000016440020009c000015150000613d000016450020009c0000119a0000613d000016460020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000a00000003001d000015dd0030009c0000012a0000213d000900240020003d0000000a0200002900000005022002100000000902200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a0000006b000015900000613d0000000f02000029000b00020020003d000700050020003d000c00030020003d000f00000000001d000002040000013d0000000f020000290000000102200039000f00000002001d0000000a0020006c000015900000813d0000000f01000029000000050110021000000009011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000001ff0000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d0000025a0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167a04000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e302200197000000000021041b000001ff0000013d000002200500043d000015dd0050009c0000012a0000213d0000001f02500039000000000012004b0000000003000019000015de03008041000015de02200197000000000002004b0000000004000019000015de04004041000015de0020009c000000000403c019000000000004004b0000012a0000c13d000e00000006001d000001e0025000390000000004020433000015dd0040009c000008bf0000a13d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b000010430000016130020009c0000043a0000a13d000016140020009c000007200000213d000016180020009c00000ce20000613d000016190020009c00000be70000613d0000161a0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000000010043f0000000e010000390000133a0000013d000016040020009c000004c30000a13d000016050020009c000007750000213d000016090020009c000013580000613d0000160a0020009c00000eca0000613d0000160b0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000302043b000015dd0030009c0000012a0000213d0000002302300039000000000012004b0000012a0000813d0000000402300039000000000428034f000000000404043b000f00000004001d000015dd0040009c0000012a0000213d0000000f033000290000002403300039000000000013004b0000012a0000213d0000016001000039000000400010043f000000a501000039000000800010043f0000168a01000041000000a00010043f0000168b03000041000000c00030043f0000168c04000041000000e00040043f0000168d05000041000001000050043f0000168e06000041000001200060043f0000168f07000041000001400070043f000001800010043f000001a00030043f000001c00040043f000001e00050043f000002000060043f000002200070043f0000000f01000029000016e4071001980000001f0910018f000c00200020003d0000000c028003600000022501700039000002250000043f000003130000613d0000022503000039000000000402034f000000004504043c0000000003530436000000000013004b0000030f0000c13d000000000009004b000003200000613d000000000272034f0000000303900210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000d00000009001d000e00000007001d0000000f0300002900000225013000390000000000010435000000e401300039000016e402100197000000a501300039000001600010043f000016900020009c000002ae0000213d0000016002200039000000400020043f000015d90010009c000015d90100804100000060011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f00001691011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b000000400100043d000015e70010009c000002ae0000213d000000c002100039000000400020043f000000a002100039000016920300004100000000003204350000008002100039000016930300004100000000003204350000006002100039000016940300004100000000003204350000004002100039000016950300004100000000003204350000009d02000039000000000321043600001696010000410000000000130435000000400100043d0000002002100039000000000400001900000000052400190000000006340019000000000606043300000000006504350000007d0040008c0000002004400039000003640000413d000000bd0310003900000000000304350000000e043000290000000c0500002900000002055003670000000e0000006b000003780000613d000000000605034f0000000007030019000000006806043c0000000007870436000000000047004b000003740000c13d0000000d0000006b000003860000613d0000000e055003600000000d060000290000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000f04000029000000000343001900000000000304350000009d034000390000000000310435000000dc03400039000016e4033001970000000003310019000000000013004b00000000040000390000000104004039000015dd0030009c000002ae0000213d0000000100400190000002ae0000c13d000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000501000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000001000019000056af0001042e0000164e0020009c000006510000a13d0000164f0020009c000008510000213d000016530020009c000015240000613d000016540020009c000011f60000613d000016550020009c0000012a0000c13d000000a40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000000ff0010008c0000012a0000213d0000004401800370000000000201043b000000000002004b0000000001000039000000010100c039000d00000002001d000000000012004b0000012a0000c13d0000006401800370000000000201043b000000000002004b0000000001000039000000010100c039000c00000002001d000000000012004b0000012a0000c13d0000008401800370000000000201043b000000000002004b0000000001000039000000010100c039000b00000002001d000000000012004b0000012a0000c13d0000000e01000029000000ff0110018f000a00000001001d0000000a0010008c00001b960000413d000016cd01000041000000800010043f0000167501000041000056b000010430000016310020009c0000065c0000a13d000016320020009c000008690000213d000016360020009c0000154d0000613d000016370020009c000012ff0000613d000016380020009c0000012a0000c13d0000000001000416000000000001004b0000012a0000c13d56ae52520000040f0000167c0000013d000015f60020009c000007b60000213d000015fa0020009c000015900000613d000015fb0020009c00000fb30000613d000015fc0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000601043b000015dc0060009c0000012a0000213d000000000100041a000015dc021001970000000005000411000000000052004b000017e00000c13d000000000006004b0000184f0000c13d0000167401000041000000800010043f0000167501000041000056b000010430000016290020009c00000a1e0000a13d0000162a0020009c00000c060000613d0000162b0020009c00000be90000613d0000162c0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000016760010009c0000012a0000213d0000000f01000029000000000001004b000017e40000c13d000016ba01000041000000800010043f0000167501000041000056b0000104300000161b0020009c00000a4c0000a13d0000161c0020009c00000c110000613d0000161d0020009c00000bf50000613d0000161e0020009c0000012a0000c13d000001240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000010402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000700000001001d0000004401800370000000000101043b000800000001001d0000006401800370000000000101043b000900000001001d000000c401800370000000000101043b000500000001001d000000e401800370000000000101043b000600000001001d000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015b90001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b0000244a0000a13d0000000101000039000000000101041a000000080010019000000f870000c13d0000244a0000013d0000160c0020009c00000a5e0000a13d0000160d0020009c00000ebf0000613d0000160e0020009c00000cd30000613d0000160f0020009c0000012a0000c13d000001640010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002302200039000000000012004b0000012a0000813d0000000f020000290000000402200039000000000228034f000000000202043b000e00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002403200039000d00000003001d0000000e02300029000000000012004b0000012a0000213d0000008401800370000000000101043b000c00000001001d000015dc0010009c0000012a0000213d000000a401800370000000000101043b000b00000001001d000015dc0010009c0000012a0000213d000000c401800370000000000101043b000a00000001001d000015dc0010009c0000012a0000213d0000010401800370000000000101043b000900000001001d000016a40010009c0000012a0000213d000000e401800370000000000101043b000600000001001d0000012401800370000000000101043b000800000001001d0000014401800370000000000101043b000700000001001d000000000010043f0000000501000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015b50001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b000028180000a13d0000000101000039000000000101041a000000800010019000000f870000c13d000028180000013d000016640020009c00000a7f0000a13d000016650020009c000010ed0000613d000016660020009c00000cf80000613d000016670020009c0000012a0000c13d000001240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000010402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000600000001001d0000004401800370000000000101043b000700000001001d0000006401800370000000000101043b000800000001001d0000008401800370000000000101043b000900000001001d000000e401800370000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015d50001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b000021040000a13d0000000101000039000000000101041a000000100010019000000f870000c13d000021040000013d000016470020009c00000a980000a13d000016480020009c000010fe0000613d000016490020009c00000d370000613d0000164a0020009c0000012a0000c13d000001440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000012402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000700000001001d0000004401800370000000000101043b000800000001001d0000006401800370000000000101043b000900000001001d000000c401800370000000000101043b000400000001001d000000e401800370000000000101043b000500000001001d0000010401800370000000000101043b000600000001001d000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015c50001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000030010006b0000258b0000a13d0000000101000039000000000101041a000000200010019000000f870000c13d0000258b0000013d000016560020009c00000aba0000a13d000016570020009c000011710000613d000016580020009c00000be80000613d000016590020009c0000012a0000c13d000000640010008c0000134c0000813d0000012a0000013d000016390020009c00000ada0000a13d0000163a0020009c0000117a0000613d0000163b0020009c00000de10000613d0000163c0020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae47f10000040f0000151f0000013d000016230020009c00000df50000613d000016240020009c00000c460000613d000016250020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000a01000029000700040010003d000d00010010003d000f00000000001d000006c00000013d0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b000006bb0000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000010500003900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b000006bb0000013d000016150020009c00000be70000613d000016160020009c00000c570000613d000016170020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d0000014002000039000000400020043f000000800000043f000000a00000043f000000c00000043f000000e00000043f000001000000043f000001200000043f000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000f00000001001d000001400100003956ae47900000040f0000000f01000029000000000101041a000000ff001001900000000002000039000000010200c039000001400020043f0000ff00001001900000000003000039000000010300c039000001600030043f0000001003100270000000ff0330018f000001800030043f00000018031002700000167603300197000001a00030043f000016ae001001980000000003000039000000010300c039000001c00030043f00000098011002700000ffff0110018f000001e00010043f000000400100043d0000000002210436000001600300043d000000000003004b0000000003000039000000010300c0390000000000320435000001800200043d000000ff0220018f00000040031000390000000000230435000001a00200043d000016760220019700000060031000390000000000230435000001c00200043d000000000002004b0000000002000039000000010200c03900000080031000390000000000230435000001e00200043d0000ffff0220018f000000a0031000390000000000230435000015d90010009c000015d9010080410000004001100210000016af011001c7000056af0001042e000016060020009c000013680000613d000016070020009c00000f380000613d000016080020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000017400000013d000015fe0020009c000014650000613d000015ff0020009c00000fc70000613d000016000020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000015dc0020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000a00000003001d000015dd0030009c0000012a0000213d000900240020003d0000000a0200002900000005022002100000000902200029000000000012004b0000012a0000213d0000000002000411000000080020006c00001df30000613d0000162601000041000000000010043f00000000010004140000000802000029000000040020008c00001ba40000c13d0000001c0100043d000000000010043f0000000102000039000000010300003100001bc70000013d000015f70020009c000014780000613d000015f80020009c000010d00000613d000015f90020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000000000010043f000000050100003900000e110000013d0000165e0020009c000015780000613d0000165f0020009c0000132a0000613d000016600020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a0000001801100270000016760110019756ae47f10000040f0000151f0000013d000016410020009c000015920000613d000016420020009c0000133e0000613d000016430020009c0000012a0000c13d000000e40010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000006402800370000000000202043b000d00000002001d0000004402800370000000000202043b000c00000002001d0000002402800370000000000202043b000b00000002001d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000900000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000a00000002001d000015dd0020009c0000012a0000213d0000000a020000290000002302200039000000000012004b0000012a0000813d0000000a02000029000700040020003d0000000702800360000000000202043b000800000002001d000015dd0020009c0000012a0000213d0000000a0300002900000008023000290000002402200039000000000012004b0000012a0000213d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015c10001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000600000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000060010006b000022440000a13d0000000101000039000000000101041a000000080010019000000f870000c13d000022440000013d000016500020009c000016120000613d000016510020009c0000134a0000613d000016520020009c0000012a0000c13d0000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000e01000039000016710000013d000016330020009c000016600000613d000016340020009c00000be80000613d000016350020009c0000012a0000c13d000000840010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015bd0001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001d850000a13d0000000101000039000000000101041a000000010010019000000f870000c13d00001d850000013d0000001f02400039000016e4022001970000003f02200039000016e402200197000000400700043d0000000006270019000d00000007001d000000000076004b00000000020000390000000102004039000015dd0060009c000002ae0000213d0000000100200190000002ae0000c13d000001e002100039000000400060043f0000000d060000290000000006460436000c00000006001d00000200055000390000000006540019000000000026004b0000012a0000213d000000000004004b0000000c09000029000008e10000613d000000000600001900000000076900190000000008560019000000000808043300000000008704350000002006600039000000000046004b000008da0000413d0000000d0440002900000020044000390000000000040435000002400400043d000015dd0040009c0000012a0000213d0000001f05400039000000000015004b0000000001000019000015de01008041000015de05500197000000000005004b0000000006000019000015de06004041000015de0050009c000000000601c019000000000006004b0000012a0000c13d000001e0014000390000000001010433000015dd0010009c000002ae0000213d0000001f05100039000016e4055001970000003f05500039000016e403500197000000400500043d0000000003350019000b00000005001d000000000053004b00000000050000390000000105004039000015dd0030009c000002ae0000213d0000000100500190000002ae0000c13d000000400030043f0000000b030000290000000003130436000a00000003001d00000200034000390000000004310019000000000024004b0000012a0000213d000000000001004b0000000a06000029000009180000613d000000000200001900000000042600190000000005320019000000000505043300000000005404350000002002200039000000000012004b000009110000413d0000000b0110002900000020011000390000000000010435000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d0000000002000411000015dc06200197000000000200041a000015e103200197000000000363019f000000000101043b000900000001001d000000000030041b0000000001000414000015dc05200197000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015e30400004156ae56a40000040f00000001002001900000012a0000613d0000000101000039000000a00010043f0000000301000039000000c00010043f0000000501000039000000e00010043f0000000901000029000000010010008c000015e501000041000015e401006041000000800010043f0000000c01000029000015d90010009c000015d90100804100000040011002100000000d020000290000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000d00000001001d000001400010043f0000000a01000029000015d90010009c000015d90100804100000040011002100000000b020000290000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000201043b000001600020043f0000000905000029000001200050043f000000400100043d000000a00310003900000000040004100000000000430435000000800310003900000000005304350000006003100039000000000023043500000040021000390000000d030000290000000000320435000000a0020000390000000002210436000015e6030000410000000000320435000015e70010009c000002ae0000213d000000c003100039000d00000003001d000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b000001000010043f000015dc06200197000000000100041a000015e102100197000000000262019f000000000020041b0000000002000414000015dc05100197000015d90020009c000015d902008041000000c001200210000015e2011001c70000800d020000390000000303000039000015e304000041000e00000006001d56ae56a40000040f00000001002001900000012a0000613d0000000e0000006b000027ec0000613d0000000f01000029000015dc00100198000027ec0000613d000000000000043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000015e1022001970000000e022001af000000000021041b000015e901000041000000400200043d000000400320003900000000001304350000000c010000390000002003200039000000000013043500000020010000390000000000120435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015ea011001c70000800d020000390000000203000039000015eb04000041000000000500001956ae56a40000040f00000001002001900000012a0000613d0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec0400004100000000050000190000000e0600002956ae56a40000040f00000001002001900000012a0000613d0000000f05000029000001c00050043f000015ed02000041000001800020043f000015ee01000041000001a00010043f000000800300043d00000140000004430000016000300443000000a00300043d00000020060000390000018000600443000001a0003004430000004003000039000000c00400043d000001c000300443000001e0004004430000006003000039000000e00400043d000002000030044300000220004004430000008003000039000001000400043d00000240003004430000026000400443000001200300043d000000a0040000390000028000400443000002a000300443000000c003000039000001400400043d000002c000300443000002e000400443000000e003000039000001600400043d0000030000300443000003200040044300000100030000390000034000300443000003600020044300000120020000390000038000200443000003a0001004430000014001000039000003c000100443000003e00050044300000100006004430000000b010000390000012000100443000015ef01000041000056af0001042e0000162d0020009c00000e080000613d0000162e0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000301043b000000000100041a000015dc011001970000000002000411000000000021004b000017e00000c13d000e00000003001d0000000103000039000000000103041a000000000003041b000000800010043f000000a00000043f0000000001000414000015d90010009c000015d901008041000000c001100210000016b6011001c70000800d02000039000d00000003001d000016b70400004156ae56a40000040f00000001002001900000012a0000613d0000000e0000006b000015900000613d00000000010004140000000f04000029000000040040008c0000193c0000c13d0000000101000031000019490000013d0000161f0020009c00000e150000613d000016200020009c0000012a0000c13d0000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000f01000039000000200010043f0000004002000039000000000100001956ae56710000040f0000000201100039000016760000013d000016100020009c000013900000613d000016110020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000016760010009c0000012a0000213d00000000050004110000000f04000029000000000045004b00001b0a0000613d0000162601000041000000000010043f0000000001000414000000040040008c0000190f0000c13d0000001c0100043d000000000010043f00000001020000390000000103000031000019340000013d000016680020009c000016830000613d000016690020009c0000012a0000c13d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000201043b000016b0002001980000012a0000c13d0000000101000039000016dd0020009c000018140000a13d000016de0020009c0000154a0000613d000016df0020009c0000154a0000613d000016e00020009c0000154a0000613d000000800000043f0000166a01000041000056af0001042e0000164b0020009c0000172e0000613d0000164c0020009c0000012a0000c13d0000000001000416000000000001004b0000012a0000c13d0000000001000411000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a0000000102200039000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000203000039000016bf0400004100000000050004110000158d0000013d0000165a0020009c0000174f0000613d0000165b0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000000000010043f0000000601000039000000200010043f0000004002000039000000000100001956ae56710000040f0000000f02000029000000080220027056ae47170000040f000000000101041a000016e5011001670000000f02000029000000ff0220018f000000000121022f000000010110018f0000167c0000013d0000163d0020009c000017560000613d0000163e0020009c0000012a0000c13d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000f00000003001d000015dd0030009c0000012a0000213d00000024032000390000000f02000029000e0005002002180000000e04300029000000000014004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000d00000003001d000c00000004001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000e010000290000003f011000390000167801100197000000400200043d0000000001120019000a00000002001d000000000021004b00000000020000390000000102004039000015dd0010009c000002ae0000213d0000000100200190000002ae0000c13d000000400010043f0000000a010000290000000f030000290000000001310436000900000001001d0000000c05000029000000000050007c0000000d040000290000012a0000213d0000000f0000006b00000b2f0000613d00000002010003670000000a02000029000000000341034f000000000303043b000015dc0030009c0000012a0000213d000000200220003900000000003204350000002004400039000000000054004b00000b260000413d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a010000290000000001010433000000000001004b000015900000613d0000000b01000029000700040010003d000c00010010003d000f00000000001d00000b550000013d000000000101043b000000000201041a000016e302200197000000000021041b0000000f02000029000f00010020003d0000000a0100002900000000010104330000000f0010006b000015900000813d0000000f01000029000000050110021000000009011000290000000001010433000015dc01100197000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b00000b4f0000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d00000bab0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167904000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000b4b0000c13d0000012a0000013d56ae466b0000040f56ae43400000040f000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d56ae48780000040f000000000001004b0000167a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000000000010043f0000000a01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000cde0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae48350000040f000017410000013d000000c40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d000000a401800370000000000301043b0000008401800370000000000501043b0000004401800370000000000401043b00000000010004110000000f0010006c0000185b0000613d0000000e0010006c0000185b0000613d000016b401000041000000800010043f0000167501000041000056b0000104300000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000d01000039000016710000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b56ae49000000040f000000400300043d000000200430003900000000002404350000000000130435000015d90030009c000015d9030080410000004001300210000016aa011001c7000056af0001042e000000240010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d000e00040020003d0000000e03800360000000000303043b000f00000003001d000015dd0030009c0000012a0000213d0000000f022000290000002402200039000000000012004b0000012a0000213d0000000801000039000000000201041a0000167b0320019700000001022000390000167604200197000000000234019f000000000021041b000d00000004001d000000000040043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000015dc02200197000000000101043b000000000301041a000015e103300197000000000223019f000000000021041b0000002002000039000000400100043d00000000022104360000000f030000290000000000320435000016e4053001980000001f0630018f000000400310003900000000045300190000000e070000290000002007700039000000020770036700000c9b0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00000c970000c13d000000000006004b00000ca80000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000f04000029000000000343001900000000000304350000001f03400039000016e4023001970000167c0020009c0000167c020080410000006002200210000015d90010009c000015d9010080410000004001100210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000167d0110009a0000800d020000390000000203000039000015eb040000410000000d0500002956ae56a40000040f00000001002001900000012a0000613d000000400100043d000f00000001001d0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec040000410000000d05000029000000000600041156ae56a40000040f00000001002001900000012a0000613d0000000d010000290000000f020000290000167d0000013d0000000002000416000000000002004b0000012a0000c13d56ae46550000040f56ae492f0000040f0000000001000019000056af0001042e0000000001000416000000000001004b0000012a0000c13d000000000100041a000015dc01100197000000800010043f0000166a01000041000056af0001042e000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f00000040020000390000000001000019000f00000008035356ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000d01000039000015390000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff00100190000018110000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000001b760000c13d000000400100043d000016dc0200004100001d7f0000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000f02000029000a00020020003d000700050020003d000d00030020003d000f00000000001d00000d880000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00000d830000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e030000290000012a0000613d000000000101043b0000000901100029000000000031041b0000000a01000029000000000101041a000900000001001d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000010500003900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000d7e0000c13d0000012a0000013d0000000001000416000000000001004b0000012a0000c13d000000000100041a000015dc021001970000000005000411000000000052004b000017e00000c13d000015e101100197000000000010041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015e30400004100000000060000190000158d0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000011980000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000000000010043f0000000401000039000000200010043f00000040020000390000000001000019000015450000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000f00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000f02000029000a00020020003d000700050020003d000d00030020003d000f00000000001d00000e660000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000101043b000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00000e610000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e030000290000012a0000613d000000000101043b0000000901100029000000000031041b0000000a01000029000000000101041a000900000001001d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000000500001900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000e5c0000c13d0000012a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000201043b000000000100041156ae51350000040f0000000001000019000056af0001042e000001040010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000006402800370000000000202043b000d00000002001d0000004402800370000000000202043b000c00000002001d0000002402800370000000000202043b000b00000002001d0000008402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000900000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000800000002001d000000e402800370000000000202043b000a00000002001d000015dd0020009c0000012a0000213d0000000a020000290000002302200039000000000012004b0000012a0000813d0000000a02000029000600040020003d0000000602800360000000000202043b000700000002001d000015dd0020009c0000012a0000213d0000000a0300002900000007023000290000002402200039000000000012004b0000012a0000213d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015b10001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b000023820000a13d0000000101000039000000000101041a000000200010019000000f870000c13d000023820000013d000000840010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015ad0001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001c1e0000a13d0000000101000039000000000101041a000000040010019000001c1e0000613d000000400100043d000016d50200004100001d7f0000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d000e00040020003d0000000e03800360000000000303043b000f00000003001d000015dd0030009c0000012a0000213d0000000f022000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000d00000001001d000016760010009c0000012a0000213d0000000801000039000000000201041a000000010320003900001676043001970000167b03200197000000000334019f000000000031041b00001676012001970000000d0010006b000019df0000a13d0000168101000041000000800010043f0000167501000041000056b000010430000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a0000001801100270000016760110019756ae48350000040f000017410000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000f00000003001d000015dd0030009c0000012a0000213d00000024032000390000000f02000029000e0005002002180000000e04300029000000000014004b0000012a0000213d0000000801000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000d00000003001d000c00000004001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000e010000290000003f011000390000167801100197000000400200043d0000000001120019000a00000002001d000000000021004b00000000020000390000000102004039000015dd0010009c000002ae0000213d0000000100200190000002ae0000c13d000000400010043f0000000a010000290000000f030000290000000001310436000900000001001d0000000c05000029000000000050007c0000000d040000290000012a0000213d0000000f0000006b000010180000613d00000002010003670000000a02000029000000000341034f000000000303043b000015dc0030009c0000012a0000213d000000200220003900000000003204350000002004400039000000000054004b0000100f0000413d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a010000290000000001010433000000000001004b000015900000613d0000000b01000029000700040010003d000c00010010003d000f00000000001d0000103e0000013d000000000101043b000000000201041a000016e302200197000000000021041b0000000f02000029000f00010020003d0000000a0100002900000000010104330000000f0010006b000015900000813d0000000f01000029000000050110021000000009011000290000000001010433000015dc01100197000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000010380000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d000010940000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167904000041000000020500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000010340000c13d0000012a0000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d0000ffff0010008c0000012a0000213d00000000050004110000000f04000029000000000045004b000019530000613d0000162601000041000000000010043f0000000001000414000000040040008c000018d00000c13d0000001c0100043d000000000010043f00000001020000390000000103000031000018f50000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000000010043f0000000d010000390000133a0000013d000000a40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d0000004401800370000000000101043b000c00000001001d0000008401800370000000000101043b000b00000001001d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000b03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000000c03000029000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000f00000001001d000016860100004100000000001004430000000001000414000017cc0000013d0000000001000416000000000001004b0000012a0000c13d0000000801000039000000000101041a0000167601100197000000800010043f0000166a01000041000056af0001042e000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000016760010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000000e0000006b0000181b0000c13d000016bb01000041000000800010043f0000167501000041000056b000010430000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae46d40000040f000017410000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000000e01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff00100190000018110000c13d0000000f02000029000000010020008c000011bf0000c13d0000ff00001001900000138d0000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000000d340000613d0000000e01000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f02000029000015de022001c700000000002104470000000e01000029000000000010043f000000200000043f000000000100041400001af90000013d000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000f00000003001d000015dd0030009c0000012a0000213d00000024032000390000000f02000029000e0005002002180000000e04300029000000000014004b0000012a0000213d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000d00000003001d000c00000004001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000e010000290000003f011000390000167801100197000000400200043d0000000001120019000a00000002001d000000000021004b00000000020000390000000102004039000015dd0010009c000002ae0000213d0000000100200190000002ae0000c13d000000400010043f0000000a010000290000000f030000290000000001310436000900000001001d0000000c05000029000000000050007c0000000d040000290000012a0000213d0000000f0000006b000012470000613d00000002010003670000000a02000029000000000341034f000000000303043b000015dc0030009c0000012a0000213d000000200220003900000000003204350000002004400039000000000054004b0000123e0000413d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000a010000290000000001010433000000000001004b000015900000613d0000000b01000029000700040010003d000c00010010003d000f00000000001d000012690000013d0000000f02000029000f00010020003d0000000a0100002900000000010104330000000f0010006b000015900000813d0000000f01000029000000050110021000000009011000290000000001010433000015dc01100197000e00000001001d000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b000012630000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d000012bf0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000e01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167904000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e302200197000000000021041b000012630000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000301041a000000400200043d000f00000002001d000d00000003001d0000000002320436000e00000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d05000029000000000005004b000018fd0000c13d0000000e04000029000019060000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000000010043f0000000c01000039000000200010043f00000040020000390000000001000019000016740000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000000000010043f0000000d01000039000013630000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d0000002402800370000000000202043b56ae47270000040f0000000001000019000056af0001042e000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d000000000010043f0000000c01000039000000200010043f00000040020000390000000001000019000f0000000803530000153c0000013d000000640010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000000e01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff00100190000018110000c13d0000000f02000029000000010020008c00001abf0000c13d0000ff000010019000001abf0000613d000000400100043d000016be0200004100001d7f0000013d000000c40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000201043b0000002401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000008401800370000000000101043b000d00000001001d000016870010009c0000012a0000213d000000a401800370000000000101043b000c00000001001d000016a40010009c0000012a0000213d0000000001020019000b00000002001d56ae51260000040f00000044010000390000000201100367000000000301043b00000000060004110000000b010000290000000f020000290000000d040000290000000c050000290000000e0700002956ae51660000040f0000000001000019000056af0001042e000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000a01000029000700040010003d000d00010010003d000f00000000001d0000140a0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b000014050000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000020500003900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000014000000c13d0000012a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000701000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a000000800010043f0000166a01000041000056af0001042e0000000001000416000000000001004b0000012a0000c13d0000000101000039000000000101041a000f00000001001d0000000001000412001100000001001d001000000000003d000080050100003900000044030000390000000004000415000000110440008a0000000504400210000016720200004156ae56860000040f0000000101100039000000800010043f0000000f01000029000000a00010043f0000167301000041000056af0001042e000001640010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d000000a402800370000000000202043b000e00000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000c00000002001d000015dc0020009c0000012a0000213d0000014402800370000000000202043b000d00000002001d000015dd0020009c0000012a0000213d0000000d020000290000002302200039000000000012004b0000012a0000813d0000000d02000029000a00040020003d0000000a02800360000000000202043b000b00000002001d000015dd0020009c0000012a0000213d0000000d030000290000000b023000290000002402200039000000000012004b0000012a0000213d0000002401800370000000000101043b000600000001001d0000004401800370000000000101043b000700000001001d0000006401800370000000000101043b000800000001001d0000008401800370000000000101043b000900000001001d000000e401800370000000000101043b000300000001001d0000010401800370000000000101043b000400000001001d0000012401800370000000000101043b000500000001001d000000000010043f0000000401000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff001001900000165d0000613d0000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015d10001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000020010006b000026cd0000a13d0000000101000039000000000101041a000000100010019000000f870000c13d000026cd0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000016760010009c0000012a0000213d56ae47ad0000040f0000000002010019000000400100043d000f00000001001d56ae43310000040f000017450000013d000000440010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f00000040020000390000000001000019000f00000008035356ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000c01000039000000200010043f0000000001000019000000400200003956ae56710000040f0000000f0200035f0000002402200370000000000202043b000000000020043f0000000501100039000000200010043f0000000001000019000000400200003956ae56710000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f0000166a01000041000056af0001042e000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000015dc0020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000002000411000000080020006c00001ebb0000613d0000162601000041000000000010043f00000000010004140000000802000029000000040020008c00001bcf0000c13d0000001c0100043d000000000010043f0000000102000039000000010300003100001bf20000013d000000240010008c0000012a0000413d000000000100041a000015dc011001970000000002000411000000000021004b000017e00000c13d0000000401800370000000000101043b0000000103000039000000000203041a000000000013041b000000800020043f000000a00010043f0000000001000414000015d90010009c000015d901008041000000c001100210000016b6011001c70000800d02000039000016b70400004156ae56a40000040f00000001002001900000012a0000613d0000000001000019000056af0001042e000001440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000002402800370000000000202043b000f00000002001d000015dc0020009c0000012a0000213d0000008402800370000000000202043b000e00000002001d000016870020009c0000012a0000213d000000a402800370000000000202043b000d00000002001d000015dc0020009c0000012a0000213d000000c402800370000000000202043b000c00000002001d000016a40020009c0000012a0000213d000000e402800370000000000202043b000b00000002001d000016a40020009c0000012a0000213d0000010402800370000000000202043b000900000002001d000015dc0020009c0000012a0000213d0000012402800370000000000202043b000a00000002001d000015dd0020009c0000012a0000213d0000000a020000290000002302200039000000000012004b0000012a0000813d0000000a02000029000700040020003d0000000702800360000000000202043b000800000002001d000015dd0020009c0000012a0000213d0000000a0300002900000008023000290000002402200039000000000012004b0000012a0000213d0000000401800370000000000101043b000600000001001d0000004401800370000000000101043b000400000001001d0000006401800370000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d0000000b0010006c00001dec0000213d0000000601000029000000140010008c000015eb0000613d0000000601000029000002d10010008c000015eb0000613d0000000601000029000004830010008c0000298f0000c13d0000000901000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005020000290000000802200270000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000502000029000000ff0220018f000000010220020f000000000101043b000000000301041a000000000323013f000000000031041b000000000023017000002af80000c13d000000400100043d000016d80200004100001d7f0000013d000001840010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000f00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002302200039000000000012004b0000012a0000813d0000000f020000290000000402200039000000000228034f000000000202043b000e00000002001d000015dd0020009c0000012a0000213d0000000f020000290000002403200039000d00000003001d0000000e02300029000000000012004b0000012a0000213d0000008401800370000000000101043b000c00000001001d000015dc0010009c0000012a0000213d000000c401800370000000000101043b000b00000001001d000015dc0010009c0000012a0000213d000000e401800370000000000101043b000a00000001001d000015dc0010009c0000012a0000213d0000012401800370000000000101043b000900000001001d000016a40010009c0000012a0000213d000000a401800370000000000101043b000700000001001d0000010401800370000000000101043b000500000001001d0000014401800370000000000101043b000800000001001d0000016401800370000000000101043b000600000001001d000000000010043f0000000501000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000001fd50000c13d000000400100043d000016d30200004100001d7f0000013d0000000002000416000000000002004b0000012a0000c13d56ae46450000040f000f00000002001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a00000018011002700000167601100197000000000010043f0000000c01000039000000200010043f0000000001000019000000400200003956ae56710000040f00000004011000390000000f0200002956ae46c40000040f000000000101041a000000ff001001900000000001000039000000010100c039000000400200043d0000000000120435000015d90020009c000015d902008041000000400120021000001680011001c7000056af0001042e000000440010008c0000012a0000413d0000000002000416000000000002004b0000012a0000c13d0000000402800370000000000202043b000800000002001d000016760020009c0000012a0000213d0000002402800370000000000202043b000015dd0020009c0000012a0000213d0000002303200039000000000013004b0000012a0000813d0000000403200039000000000338034f000000000303043b000c00000003001d000015dd0030009c0000012a0000213d000b00240020003d0000000c0200002900000005022002100000000b02200029000000000012004b0000012a0000213d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000801000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000c0000006b000015900000613d0000000a01000029000700040010003d000d00010010003d000f00000000001d000016d30000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b000016ce0000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000000500001900000008060000290000000e0700002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000016c90000c13d0000012a0000013d000000240010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000015dc0010009c0000012a0000213d000000000010043f0000000b01000039000000200010043f0000004002000039000000000100001956ae56710000040f000000000101041a0000001801100270000016760110019756ae4c950000040f0000000002010019000000400100043d000f00000001001d56ae430b0000040f0000000f020000290000000001210049000015d90010009c000015d9010080410000006001100210000015d90020009c000015d9020080410000004002200210000000000121019f000056af0001042e0000000002000416000000000002004b0000012a0000c13d56ae431b0000040f56ae492f0000040f0000000001000019000056af0001042e000000c40010008c0000012a0000413d0000000001000416000000000001004b0000012a0000c13d0000000401800370000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000002401800370000000000101043b000e00000001001d000015dc0010009c0000012a0000213d0000006401800370000000000101043b000d00000001001d000015dc0010009c0000012a0000213d000000a401800370000000000101043b000a00000001001d0000008401800370000000000101043b000b00000001001d0000004401800370000000000101043b000c00000001001d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000a03000029000000000032043500000080021000390000000b03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000000c03000029000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000f00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000f05000029000000d002500270000000400300043d0000002004300039000000000024043500000008045002700000168704400197000000000012004b0000000004004019000000000043043500000c520000013d000016d001000041000000800010043f0000167501000041000056b000010430000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000f01000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000015e102200197000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec040000410000000f0500002900000df30000013d000000400100043d000016db0200004100001d7f0000013d000000000002004b0000154a0000613d000016e10020009c000000000100c019000000800010043f0000166a01000041000056af0001042e0000000f01000029000000000001004b000004360000613d000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000015dc011001970000000002000411000000000012004b0000184c0000c13d0000000f01000029000000000010043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000015e1022001970000000e06000029000000000262019f000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec0400004100001b2e0000013d000000400100043d000016e20200004100001d7f0000013d000015e101100197000000000161019f000000000010041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015e3040000410000158d0000013d000b00000005001d000c00000003001d000000140040008c000018630000613d000002d10040008c000018630000613d000004830040008c00001b720000c13d000a00000004001d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000c03000029000000000032043500000080021000390000000b03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000000a03000029000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000e02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000ff0020019000002ade0000c13d0000000202000039000000000021041b0000000101000039000000400200043d0000000000120435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a7040000410000000c050000290000000f060000290000000e070000290000158d0000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000018e40000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000018e00000c13d000000000005004b000018f10000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f0400002900000000050004110000000100200190000019500000613d000000200030008c0000000001000019000019510000413d000000000100043d000015dc01100197000019510000013d000000000101043b00000000020000190000000e04000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000019000000413d0000000f01000029000000000214004956ae479b0000040f000000400100043d000e00000001001d0000000f0200002956ae430b0000040f0000000e02000029000017460000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000019230000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000191f0000c13d000000000005004b000019300000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f040000290000000005000411000000010020019000001b070000613d000000200030008c000000000100001900001b080000413d000000000100043d000015dc0110019700001b080000013d000015d90010009c000015d901008041000000c001100210000015e2011001c700008009020000390000000e03000029000000000500001956ae56a40000040f000d00010020019300030000000103550000006001100270000115d90010019d000015d901100197000000000001004b000019880000c13d0000000d0000006b000015900000c13d000000400100043d000016b80200004100001d7f0000013d0000000001000019000000000015004b000019780000c13d000000000040043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000e030000290000ffff0230018f00000098033002100000166e03300197000000000101043b000000000401041a0000166f04400197000000000334019f000000000031041b000000400100043d0000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d02000039000000020300003900001671040000410000000f050000290000158d0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000005204350000166c02000041000000000221043600000000000204350000001c021000390000000001000414000000040040008c000019af0000c13d0000000001020433000000000010043f0000000102000039000019d70000013d0000001f03100039000016e4033001970000003f03300039000016e404300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000015dd0040009c000002ae0000213d0000000100500190000002ae0000c13d000000400040043f0000000005130436000016e4021001980000001f0310018f00000000012500190000000304000367000019a10000613d000000000604034f000000006706043c0000000005750436000000000015004b0000199d0000c13d000000000003004b0000194b0000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f00000000002104350000194b0000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000019c70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000019c30000c13d000000000005004b000019d40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f04000029000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b000019530000c13d00001b6f0000013d000800000004001d000000000040043f0000000a01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000015dc02200197000000000101043b000000000301041a000015e103300197000000000223019f000000000021041b0000002002000039000000400100043d00000000022104360000000f030000290000000000320435000016e4053001980000001f0630018f000000400310003900000000045300190000000e070000290000002007700039000000020770036700001a060000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00001a020000c13d000000000006004b00001a130000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000f04000029000000000343001900000000000304350000001f03400039000016e4023001970000167c0020009c0000167c020080410000006002200210000015d90010009c000015d9010080410000004001100210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000167d0110009a0000800d020000390000000203000039000015eb04000041000000080500002956ae56a40000040f00000001002001900000012a0000613d0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000015ec040000410000000805000029000000000600041156ae56a40000040f00000001002001900000012a0000613d0000000d01000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000d01000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000700000001001d0000000d01000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000400000001001d0000000801000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000c00000001001d0000000801000029000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000000801000029000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000300000001001d0000000a01000029000000000101041a000900000001001d000000000001004b00002be10000c13d0000000a010000290000000201100039000a00000001001d000000000101041a000900000001001d000000000001004b00002d3f0000c13d0000000701000029000000000101041a000b00000001001d000000000001004b00002db60000c13d00000007010000290000000201100039000a00000001001d000000000101041a000900000001001d000000000001004b00002f150000c13d0000000401000029000000000101041a000b00000001001d000000000001004b00002f8c0000c13d00000004010000290000000201100039000a00000001001d000000000101041a000900000001001d000000000001004b000030040000c13d000000400100043d00000008020000290000000000210435000015d90010009c000015d901008041000000400110021000001680011001c7000056af0001042e00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000ff0010019000000d340000613d00000044010000390000000201100367000000000101043b000d00000001001d0000000e01000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f0200002900000000002104470000000e01000029000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000004011002700000000f0200002900000000002104470000000001000019000056af0001042e0000000001000019000000000015004b00001b300000c13d0000000801000039000000000101041a00001676011001970000000e0010006b00001b120000a13d000000400100043d000016810200004100001d7f0000013d000000000040043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000e060000290000001802600210000016ab02200197000000000101043b000000000301041a000016ac03300197000000000223019f000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000016ad040000410000000f050000290000158d0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000005204350000166c02000041000000000221043600000000000204350000001c021000390000000001000414000000040040008c00001b400000c13d0000000001020433000000000010043f000000010200003900001b680000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000000204001956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001b580000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001b540000c13d000000000005004b00001b650000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000f04000029000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b0a0000c13d000000400100043d000016c50200004100001d7f0000013d000016b501000041000000800010043f0000167501000041000056b0000104300000000f01000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000000000104470000000f01000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000040110027000000000000104470000000001000019000056af0001042e00000000020004110000000f0020006c000020580000613d0000162601000041000000000010043f00000000010004140000000f02000029000000040020008c00001fa40000c13d0000001c0100043d000000000010043f0000000102000039000000010300003100001fc70000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001bb80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001bb40000c13d000000000005004b00001bc50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001def0000613d000000200030008c000000000100001900001df00000413d000000000100043d000015dc0110019700001df00000013d000015d90010009c000015d901008041000000c0011002100000166b011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001be30000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001bdf0000c13d000000000005004b00001bf00000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001eb70000613d000000200030008c000000000100001900001eb80000413d000000000100043d000015dc0110019700001eb80000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001d7d0000a13d0000000101000039000000000101041a000000040010019000001d7d0000613d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000060021000390000000d03000029000000000032043500000040021000390000001403000039000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a003100039000000000003043500000080031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d000000000101041a000b00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b02000029000000d002200270000000000012004b00001dec0000413d0000000b01000029000000080110027000001687021001970000000c0020006c000029950000413d000016870020009c00001c930000613d0000000c0110006a000000080110021000001688011001970000000a03000029000000000203041a0000168902200197000000000112019f000000000013041b0000000d010000290000000f020000290000000e030000290000000c0400002956ae4d3f0000040f000000000001004b00000bf30000613d0000000c0000006b00000bf30000613d0000000a02000029000000000202041a0000168803200197000016880030009c00000bf30000613d0000000c030000290000000803300210000000000332001900001688033001970000168902200197000000000223019f00002af50000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000a00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000a0010006b00001d7d0000a13d0000000101000039000000000101041a000000020010019000001d7d0000613d0000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000c03000029000000000032043500000060021000390000000d03000029000000000032043500000040021000390000048303000039000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000900000001001d000000000101041a000a00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000a02000029000000d002200270000000000012004b00001dec0000413d0000000a01000029000000080110027000001687021001970000000b0020006c000029950000413d000016870020009c00001d420000613d0000000b0110006a000000080110021000001688011001970000000903000029000000000203041a0000168902200197000000000112019f000000000013041b0000000d010000290000000f020000290000000e030000290000000c040000290000000b0500002956ae4cd80000040f000000000001004b00000bf30000613d0000000b0000006b00000bf30000613d0000000902000029000000000202041a0000168803200197000016880030009c00000bf30000613d0000000b030000290000000803300210000000000332001900001688033001970000168902200197000000000223019f000000090300002900002af60000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000b00000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b0010006b00001d7d0000a13d0000000101000039000000000101041a000000010010019000001d850000c13d000000400100043d000016d4020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300000000f01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000c03000029000000000032043500000060021000390000000d0300002900000000003204350000004002100039000002d103000039000000000032043500000020021000390000000f030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d000000000101041a000b00000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000b02000029000000d002200270000000000012004b000029920000813d000000400100043d000016d20200004100001d7f0000013d00000000010000190000000004000411000000000014004b00001ea60000c13d0000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000a0000006b000015900000613d0000000b01000029000700020010003d000c00010010003d000e00000000001d00001e120000013d000000000101043b000000000201041a000016e302200197000000000021041b0000000e020000290000000102200039000e00000002001d0000000a0020006c000015900000813d0000000e01000029000000050110021000000009011000290000000201100367000000000101043b000f00000001001d000015dc0010009c0000012a0000213d0000000f01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000000002004b00001e0d0000613d0000000b01000029000000000301041a000000000003004b00001fcf0000613d000000000032004b000d00000002001d00001e6b0000613d000600000003001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d020000290005000100200092000000000101043b0000000b03000029000000000203041a000000050020006c0000307b0000a13d0000000602000029000000010220008a0000000001120019000000000101041a000600000001001d000000000030043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000005011000290000000602000029000000000021041b000000000020043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000021041b0000000b01000029000000000201041a000d00000002001d000000000002004b000024200000613d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000d02000029000000010220008a000000000101043b0000000001210019000000000001041b0000000b01000029000000000021041b0000000f01000029000000000010043f0000000c01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000001041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000016770400004100000008050000290000000f0600002956ae56a40000040f00000001002001900000012a0000613d0000000f01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000001e090000c13d0000012a0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000004204350000166c02000041000000000221043600000000000204350000001c0210003900000000010004140000000804000029000000040040008c00001f460000c13d0000000001020433000000000010043f000000010200003900001f6d0000013d00000000010000190000000004000411000000000014004b00001f350000c13d0000000801000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000a00000001001d0000000c0000006b000015900000613d0000000a01000029000700020010003d000d00010010003d000f00000000001d00001edb0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f020000290000000102200039000f00000002001d0000000c0020006c000015900000813d0000000f0100002900000005011002100000000b011000290000000201100367000000000301043b000015dc0030009c0000012a0000213d000000000030043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000e00000003001d56ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00001ed60000c13d0000000a02000029000000000102041a000015dd0010009c000002ae0000213d000900000001001d0000000101100039000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000000e020000290000012a0000613d000000000101043b0000000901100029000000000021041b0000000a01000029000000000101041a000900000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d020000390000000303000039000016b90400004100000008050000290000000e0600002956ae56a40000040f0000000e0100002900000001002001900000012a0000613d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000001ed10000c13d0000012a0000013d000000400100043d0000006002100039000000400020043f000000400210003900000000004204350000166c02000041000000000221043600000000000204350000001c0210003900000000010004140000000804000029000000040040008c00001f750000c13d0000000001020433000000000010043f000000010200003900001f9c0000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001f5e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001f5a0000c13d000000000005004b00001f6b0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b6f0000613d00001df30000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c7000000080200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001f8d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001f890000c13d000000000005004b00001f9a0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b6f0000613d00001ebb0000013d000015d90010009c000015d901008041000000c0011002100000166b011001c70000000f0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000001fb80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00001fb40000c13d000000000005004b00001fc50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000020140000613d000000200030008c0000000001000019000020150000413d000000000100043d000015dc01100197000020150000013d000016ce01000041000000000010043f0000001101000039000000040010043f000016cf01000041000056b0000104300000167201000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000010110008a000000030010008c000015c90001a13e0000200e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b000029860000a13d0000000101000039000000000101041a000000400010019000000f870000c13d000029860000013d000016ce01000041000000000010043f0000005101000039000000040010043f000016cf01000041000056b00001043000000000010000190000000002000411000000000012004b000020580000613d000000400100043d0000006002100039000000400020043f0000004002100039000000000400041100000000004204350000166c02000041000000000221043600000000000204350000001c0210003900000000010004140000000f04000029000000040040008c0000202a0000c13d0000000001020433000000000010043f0000000102000039000020510000013d000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f0000166d011001c70000000f0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000020420000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000203e0000c13d000000000005004b0000204f0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000001b6f0000613d000000200030008c00001b6f0000413d000000000100043d000000000001004b00001b6f0000613d0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000e020000290000001002200210000016c602200197000000000101043b000000000301041a000016c703300197000000000223019f000000000021041b0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e3022001970000000d022001af000000000021041b0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e6022001970000000c0000006b000001000220c1bf000000000021041b0000000f01000029000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000b0000006b000016c8020000410000000002006019000000000101043b000000000301041a000016c903300197000000000223019f000000000021041b000000400100043d0000000a020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000203000039000016ca040000410000000f0500002956ae56a40000040f00000001002001900000012a0000613d000000400100043d00000020021000390000000c0300002900000000003204350000000d020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e8011001c70000800d020000390000000203000039000016cb040000410000000f0500002956ae56a40000040f00000001002001900000012a0000613d000000400100043d0000000b020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000203000039000016cc0400004100001b2e0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b00001d7d0000a13d0000000101000039000000000101041a000000100010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000120031000390000000000230435000001000210003900000009030000290000000000320435000000c00210003900000007030000290000000000320435000000a0021000390000000803000029000000000032043500000080021000390000000603000029000000000032043500000060021000390000000f030000290000000000320435000000400210003900000483030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000169703000041000000000032043500000120030000390000000000310435000016980010009c000002ae0000213d0000014003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000400000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000000030010006c00002c580000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000040400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000400000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000802000029000000050020006b0000241d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000007020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000702000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c000032430000613d0000000b01000029000000410010008c000032790000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c000034410000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000004030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000021f50000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000032740000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003b6d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000221b0000c13d00003b6d0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000600000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000060010006b00001d7d0000a13d0000000101000039000000000101041a000000080010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d0000012003100039000000000023043500000100021000390000000d030000290000000000320435000000c0021000390000000c030000290000000000320435000000a0021000390000000103000039000600000003001d000000000032043500000080021000390000000b03000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000002d1030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000169703000041000000000032043500000120030000390000000000310435000016980010009c000002ae0000213d0000014003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000040010006c00002ca50000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000050400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000d0010006c0000423d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c020000290000000802200270000d00000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000c02000029000000ff0220018f000c000100200217000000000101043b000000000201041a0000000c0220014f000000000021041b0000000c002001800000160f0000613d0000000801000029000000400010008c0000314e0000613d0000000801000029000000410010008c000031840000c13d0000000a01000029000a00440010003d00000002020003670000000a01200360000000000101043b0000169c0010009c000032be0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40410003900000064031000390000000a02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000023330000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c0000317f0000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000038af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000023590000c13d000038af0000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b00001d7d0000a13d0000000101000039000000000101041a000000200010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d0000012003100039000000000023043500000100021000390000000d030000290000000000320435000000e00210003900000000030004110000000000320435000000c0021000390000000b030000290000000000320435000000a0021000390000000c03000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000000140300003900000000003204350000002002100039000016970300004100000000003204350000012003000039000000000031043500000080031000390000000000030435000016980010009c000002ae0000213d0000014003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000040010006c00002cf20000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000050400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000d0010006c0000423d0000213d0000000c02000029000000080020006b000030810000a13d000000400100043d000016d90200004100001d7f0000013d000016ce01000041000000000010043f0000003101000039000000040010043f000016cf01000041000056b00001043000001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b00001d7d0000a13d0000000101000039000000000101041a000000080010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000504000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000c00210003900000008030000290000000000320435000000a0021000390000000103000039000500000003001d000000000032043500000080021000390000000703000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000002d1030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000000603000029000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000040010006c00002e2e0000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000060400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000008020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000802000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c000034840000613d0000000b01000029000000410010008c000034ba0000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c0000368d0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b0000253c0000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000034b50000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003cc20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000025620000c13d00003cc20000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000030010006b00001d7d0000a13d0000000101000039000000000101041a000000200010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000504000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000e00210003900000000030004110000000000320435000000c00210003900000007030000290000000000320435000000a0021000390000000803000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000000140300003900000000003204350000002002100039000000060300002900000000003204350000014003000039000000000031043500000080031000390000000000030435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000050010006c00002e7b0000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000060400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000802000029000000040020006b0000241d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000007020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000702000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c000036d00000613d0000000b01000029000000410010008c000037060000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c000039300000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b0000267e0000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000037010000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e960000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000026a40000c13d00003e960000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000020010006b00001d7d0000a13d0000000101000039000000000101041a000000100010019000001d7d0000613d0000000e01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000404000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000c00210003900000007030000290000000000320435000000a0021000390000000803000029000000000032043500000080021000390000000603000029000000000032043500000060021000390000000f030000290000000000320435000000400210003900000483030000390000000000320435000000e0021000390000000003000411000000000032043500000020021000390000000503000029000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000000040010006c00002ec80000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000050400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000500000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000090010006c0000423d0000213d0000000802000029000000030020006b0000241d0000213d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b00000007020000290000000802200270000900000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000702000029000000ff0220018f0008000100200217000000000101043b000000000201041a000000080220014f000000000021041b00000008002001800000160f0000613d0000000b01000029000000400010008c0000374b0000613d0000000b01000029000000410010008c000037810000c13d0000000d01000029000d00440010003d00000002020003670000000d01200360000000000101043b0000169c0010009c000039730000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40410003900000064031000390000000d02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000027c10000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c0000377c0000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003eea0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000027e70000c13d00003eea0000013d000015f0010000410000000d020000290000000000120435000015d90020009c000015d9020080410000004001200210000015f1011001c7000056b00001043000001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000050010006b00001d7d0000a13d0000000101000039000000000101041a000000800010019000001d7d0000613d00000024010000390000000201100367000000000101043b000500000001001d000016870010009c0000298c0000213d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000803000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000001403000039000000000032043500000020021000390000000b030000290000000000320435000000c003000039000000000031043500000080031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000300000001001d000000000101041a000400000001001d000000ff0010019000002ade0000c13d000000040100002900001688001001980000415a0000c13d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000804000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000e00210003900000000030004110000000000320435000000c00210003900000006030000290000000000320435000000a0021000390000000503000029000000000032043500000060021000390000000c0300002900000000003204350000004002100039000000140300003900000000003204350000002002100039000000070300002900000000003204350000014003000039000000000031043500000080031000390000000000030435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000700000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000600000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000000060010006c000035f30000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000070400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000700000001001d0000000e01000029000000400010008c00003d2c0000613d0000000e01000029000000410010008c00003d620000c13d0000000f01000029000f00440010003d00000002020003670000000f01200360000000000101043b0000169c0010009c00003f740000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000007030000290000000000320435000000a40410003900000064031000390000000f02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000029370000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000b03000029000000040030008c00003d5d0000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041220000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000295d0000c13d000041220000013d00001683010000410000000000100443000000000100041000000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c70000800a0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000400000001001d000016720100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000040010006b00001d7d0000a13d0000000101000039000000000101041a000000400010019000001d7d0000613d00000024010000390000000201100367000000000101043b000400000001001d000016c00010009c000029980000413d000000400100043d000016c40200004100001d7f0000013d000000400100043d000016b50200004100001d7f0000013d0000000b01000029000016880010019800002ae10000c13d000000400100043d000016d10200004100001d7f0000013d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c0031000390000000000230435000000a0021000390000000803000029000000000032043500000080021000390000000703000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000048303000039000000000032043500000020021000390000000b030000290000000000320435000000c0030000390000000000310435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000301000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000002000411000000000101043b000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000200000001001d000000000101041a000300000001001d000000ff0010019000002ade0000c13d000000030100002900001688001001980000422d0000c13d0000000b01000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d00000140031000390000000804000029000000000043043500000120031000390000000000230435000001000210003900000009030000290000000000320435000000e00210003900000000030004110000000000320435000000c00210003900000005030000290000000000320435000000a0021000390000000403000029000000000032043500000080021000390000000703000029000000000032043500000060021000390000000c03000029000000000032043500000040021000390000048303000039000000000032043500000020021000390000000603000029000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000300000001001d000000050010006c000036400000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d0000002203200039000000060400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000600000001001d0000000e01000029000000400010008c00003da60000613d0000000e01000029000000410010008c00003ddc0000c13d0000000f01000029000f00440010003d00000002020003670000000f01200360000000000101043b0000169c0010009c00003fb70000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40410003900000064031000390000000f02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b00002ab30000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000b03000029000000040030008c00003dd70000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041f50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00002ad90000c13d000041f50000013d000000400100043d000016c10200004100001d7f0000013d0000000b0100002900001689011001970000000a02000029000000000012041b0000000f010000290000000e020000290000000d030000290000000c0400002956ae51f30000040f000000000001004b00000bf30000613d0000000a02000029000000000202041a0000168803200197000016880030009c00000bf30000613d000016890320019700000100022000390000168802200197000000000232019f0000000a03000029000000000023041b00000bf30000013d0000000901000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d0000014003100039000000000023043500000120021000390000000b03000029000000000032043500000100021000390000000c030000290000000000320435000000e0021000390000000d030000290000000000320435000000c00210003900000005030000290000000000320435000000a0021000390000000e03000029000000000032043500000080021000390000000403000029000000000032043500000060021000390000000f0300002900000000003204350000004002100039000000060300002900000000003204350000002002100039000016bc03000041000000000032043500000140030000390000000000310435000016900010009c000002ae0000213d0000016003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000500000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000200000001001d000000050010006c000031010000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000400200043d00000022032000390000000b0400002900000000004304350000169903000041000000000032043500000002032000390000000000130435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000121019f0000169a011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000b00000001001d0000000801000029000000400010008c000031c80000613d0000000801000029000000410010008c000031fe0000c13d0000000a01000029000a00440010003d00000002020003670000000a01200360000000000101043b0000169c0010009c000033bd0000a13d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000b030000290000000000320435000000a40410003900000064031000390000000a02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b00002bb60000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000903000029000000040030008c000031f90000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c7000000090200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003ac60000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00002bdc0000c13d00003ac60000013d0000000c01000029000500040010003d000d00010010003d000000000300001900002bef0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f030000290000000103300039000000090030006c00001a980000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000015dc01100197000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002beb0000c13d0000000c01000029000000000101041a000b00000001001d000015dd0010009c000002ae0000213d0000000b0100002900000001011000390000000c02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b011000290000000e02000029000000000021041b0000000c01000029000000000101041a000b00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002be60000c13d0000012a0000013d000000400100043d000300000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000302000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000304000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000302000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000021770000013d000000400100043d000400000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000022b80000013d000000400100043d000400000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000023f40000c13d0000012a0000013d0000000c01000029000500050010003d000b00020010003d000d00030010003d000000000300001900002d490000013d0000000f030000290000000103300039000000090030006c00001a9f0000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002d450000c13d0000000b01000029000000000101041a000c00000001001d000015dd0010009c000002ae0000213d0000000c0100002900000001011000390000000b02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c011000290000000e02000029000000000021041b0000000b01000029000000000101041a000c00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000000500001900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b00002d450000013d0000000601000029000a00040010003d000d00010010003d000000000200001900002dc40000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f0200002900000001022000390000000b0020006c00001aa40000813d0000000701000029000000000101041a000f00000002001d000000000021004b0000307b0000a13d0000000701000029000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000015dc01100197000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002dc00000c13d0000000601000029000000000101041a000c00000001001d000015dd0010009c000002ae0000213d0000000c0100002900000001011000390000000602000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c011000290000000e02000029000000000021041b0000000601000029000000000101041a000c00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000a01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002dbb0000c13d0000012a0000013d000000400100043d000400000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000024c10000c13d0000012a0000013d000000400100043d000500000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000502000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000502000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000026000000013d000000400100043d000400000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000402000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000404000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000402000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000027430000013d0000000601000029000700050010003d000c00020010003d000d00030010003d000000000300001900002f240000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f030000290000000103300039000000090030006c00001aab0000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002f200000c13d0000000c01000029000000000101041a000b00000001001d000015dd0010009c000002ae0000213d0000000b0100002900000001011000390000000c02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b011000290000000e02000029000000000021041b0000000c01000029000000000101041a000b00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000010500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002f1b0000c13d0000012a0000013d0000000301000029000a00040010003d000d00010010003d000000000200001900002f9a0000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f0200002900000001022000390000000b0020006c00001ab00000813d0000000401000029000000000101041a000f00000002001d000000000021004b0000307b0000a13d0000000401000029000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000015dc01100197000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b00002f960000c13d0000000301000029000000000101041a000c00000001001d000015dd0010009c000002ae0000213d0000000c0100002900000001011000390000000302000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c011000290000000e02000029000000000021041b0000000301000029000000000101041a000c00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000c02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167e04000041000000020500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000a01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000002f910000c13d0000012a0000013d0000000301000029000700050010003d000c00020010003d000d00030010003d0000000003000019000030130000013d000000000101043b000000000201041a000016e30220019700000001022001bf000000000021041b0000000f030000290000000103300039000000090030006c00001ab70000813d0000000a02000029000000000102041a000f00000003001d000000000031004b0000307b0000a13d000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000f01100029000000000101041a000e00000001001d000000000010043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000101041a000000000001004b0000300f0000c13d0000000c01000029000000000101041a000b00000001001d000015dd0010009c000002ae0000213d0000000b0100002900000001011000390000000c02000029000000000012041b000000000020043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b011000290000000e02000029000000000021041b0000000c01000029000000000101041a000b00000001001d000000000020043f0000000d01000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b02000029000000000021041b0000000001000414000015d90010009c000015d901008041000000c001100210000015e2011001c70000800d0200003900000004030000390000167f04000041000000020500003900000008060000290000000e0700002956ae56a40000040f00000001002001900000012a0000613d0000000e01000029000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000300a0000c13d0000012a0000013d000016ce01000041000000000010043f0000003201000039000000040010043f000016cf01000041000056b0000104300000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000b020000290000000802200270000d00000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d0000000b02000029000000ff0220018f000c000100200217000000000101043b000000000201041a0000000c0220014f000000000021041b0000000c002001800000160f0000613d0000000701000029000000400010008c000033010000613d0000000701000029000000410010008c000033370000c13d0000000a01000029000b00440010003d00000002020003670000000b01200360000000000101043b0000169c0010009c000034fe0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000004402100039000000410300003900000000003204350000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40410003900000064031000390000000b02000029000000200220008a0000000202200367000000000502034f0000000006030019000000005705043c0000000006760436000000000046004b000030d60000c13d00000040033000390000000004030433000016a1044001970000004002200370000000000202043b000016a202200197000000000242019f0000000000230435000000c402100039000000400020043f00000000020004140000000e03000029000000040030008c000033320000613d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a3011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003bf30000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000030fc0000c13d00003bf30000013d000000400100043d000500000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000502000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000502000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d00002b6e0000013d0000000a01000029000a00440010003d00000002030003670000000a01300360000000000101043b0000169b021001970000169c0020009c0000337c0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40210003900000064031000390000000a04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000031760000c13d000000400020043f00000000020004140000000e03000029000000040030008c000038970000c13d0000000001010433000000000010043f00000001020000390000000103000031000038be0000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000440210003900000008030000290000000000320435000016e4043001980000001f0530018f00000064071000390000000003470019000000070600002900000020066000390000000206600367000031ad0000613d000000000806034f000000008908043c0000000007970436000000000037004b000031a90000c13d000000000005004b000031ba0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000008030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c000037c60000c13d0000000001010433000000000010043f0000000102000031000037f10000013d0000000a01000029000a00440010003d00000002030003670000000a01300360000000000101043b0000169b021001970000169c0020009c000034000000a13d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f02000041000000000021043500000004021000390000000b030000290000000000320435000000a40210003900000064031000390000000a04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000031f00000c13d000000400020043f00000000020004140000000903000029000000040030008c00003aae0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003ad50000013d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000b030000290000000000320435000000440210003900000008030000290000000000320435000016e4043001980000001f0530018f00000064071000390000000003470019000000070600002900000020066000390000000206600367000032270000613d000000000806034f000000008908043c0000000007970436000000000037004b000032230000c13d000000000005004b000032340000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000008030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000904000029000000040040008c000038680000c13d0000000001010433000000000010043f00000001020000390000000103000031000038920000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c000035410000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000004030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b0000326b0000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003b550000c13d0000000001010433000000000010043f0000000102000039000000010300003100003b7c0000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000403000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a0600002900000020066000390000000206600367000032a20000613d000000000806034f000000008908043c0000000007970436000000000037004b0000329e0000c13d000000000005004b000032af0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c000039b60000c13d0000000001010433000000000010043f00000001020000390000000103000031000039e00000013d0000000a04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000032e90000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000032e50000c13d000000000005004b000032f60000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035820000613d000000000100043d000015dc00100198000023100000613d0000000e0110014f000015dc00100198000038c50000613d000023100000013d0000000a01000029000b00440010003d00000002030003670000000b01300360000000000101043b0000169b021001970000169c0020009c0000358e0000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40210003900000064031000390000000b04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000033290000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003bdb0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003c020000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000440210003900000007030000290000000000320435000016e4043001980000001f0530018f00000064071000390000000003470019000000060600002900000020066000390000000206600367000033600000613d000000000806034f000000008908043c0000000007970436000000000037004b0000335c0000c13d000000000005004b0000336d0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000043043500000007030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c000039e50000c13d0000000001010433000000000010043f0000000102000039000000010300003100003a0f0000013d0000000a04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000033a50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000033a10000c13d000000000005004b000033b20000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035cf0000613d000000000100043d000015dc00100198000031560000613d0000000e0110014f000015dc00100198000038c50000613d000031560000013d0000000a04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f801200270000000200240003900000000001204350000000b010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000033e80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000033e40000c13d000000000005004b000033f50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035db0000613d000000000100043d000015dc0010019800002b930000613d000000090110014f000015dc0010019800003adc0000613d00002b930000013d0000000a04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b01100039000000200240003900000000001204350000000b010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000034290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000034250000c13d000000000005004b000034360000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000035e70000613d000000000100043d000015dc00100198000031d00000613d000000090110014f000015dc0010019800003adc0000613d000031d00000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000004010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000346c0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000034680000c13d000000000005004b000034790000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000037f70000613d000000000100043d000015dc00100198000021d20000613d0000000e0110014f000015dc0010019800003b830000613d000021d20000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c000038030000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000034ac0000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003caa0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003cd10000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000603000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a0600002900000020066000390000000206600367000034e30000613d000000000806034f000000008908043c0000000007970436000000000037004b000034df0000c13d000000000005004b000034f00000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c00003c370000c13d0000000001010433000000000010043f000000010200003100003c620000013d0000000b04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000035290000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000035250000c13d000000000005004b000035360000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000038440000613d000000000100043d000015dc00100198000030b30000613d0000000e0110014f000015dc0010019800003c090000613d000030b30000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000004010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000356a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000035660000c13d000000000005004b000035770000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000038500000613d000000000100043d000015dc001001980000324b0000613d0000000e0110014f000015dc0010019800003b830000613d0000324b0000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035890000c13d00003c970000013d0000000b04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000035b70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000035b30000c13d000000000005004b000035c40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000385c0000613d000000000100043d000015dc00100198000033090000613d0000000e0110014f000015dc0010019800003c090000613d000033090000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035d60000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035e20000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000035ee0000c13d00003c970000013d000000400100043d000600000001001d0000002002100039000015e601000041000200000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000602000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000604000029000000a0024000390000000003000410000000000032043500000080024000390000000403000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000602000029000000c001200039000000400010043f0000000201000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000028ef0000c13d0000012a0000013d000000400100043d000500000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000502000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000303000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000015e70040009c000002ae0000213d0000000502000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d00002a6b0000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000036b80000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000036b40000c13d000000000005004b000036c50000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003a140000613d000000000100043d000015dc00100198000025190000613d0000000e0110014f000015dc0010019800003cd80000613d000025190000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c00003a200000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000036f80000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003e7e0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003ea50000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000603000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a06000029000000200660003900000002066003670000372f0000613d000000000806034f000000008908043c0000000007970436000000000037004b0000372b0000c13d000000000005004b0000373c0000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c00003e200000c13d0000000001010433000000000010043f0000000102000039000000010300003100003e4a0000013d0000000d01000029000d00440010003d00000002030003670000000d01300360000000000101043b0000169b021001970000169c0020009c00003a610000a13d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000005030000290000000000320435000000a40210003900000064031000390000000d04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b000037730000c13d000000400020043f00000000020004140000000e03000029000000040030008c00003ed20000c13d0000000001010433000000000010043f0000000102000039000000010300003100003ef90000013d0000169e0100004100000000001004430000000e0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000503000029000000000032043500000044021000390000000b030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000a0600002900000020066000390000000206600367000037aa0000613d000000000806034f000000008908043c0000000007970436000000000037004b000037a60000c13d000000000005004b000037b70000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000e04000029000000040040008c00003e4f0000c13d0000000001010433000000000010043f0000000102000039000000010300003100003e790000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f000600000002001d0000006002100270000015d902200197000000200020008c000000200300003900000000030240190000001f0430018f0000002003300190000037e20000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b000037de0000c13d000000000004004b000037ef0000613d000000000531034f0000000304400210000000000603043300000000064601cf000000000646022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000464019f0000000000430435000100000002001f000300000001035500000006010000290000000100100190000042400000613d000000200020008c000038c20000813d000042400000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000037fe0000c13d00003c970000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000382c0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000038280000c13d000000000005004b000038390000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003aa20000613d000000000100043d000015dc001001980000348c0000613d0000000e0110014f000015dc0010019800003cd80000613d0000348c0000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000384b0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000038570000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000038630000c13d00003c970000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f000000090200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000038830000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000387f0000c13d000000000005004b000038900000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003ad90000813d000042400000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000038af0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000038ab0000c13d000000000005004b000038bc0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e0300002900000009040000290000000b0500002956ae52da0000040f0000ffff0220018f000002d10020008c000038d00000613d000000000002004b000042da0000c13d000016b00010009c0000390b0000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d00000044013000390000000b020000290000000000210435000000240130003900000009020000290000000000210435000016b1010000410000000000130435000b00000003001d00000004013000390000000e02000029000000000021043500000000010004140000000f02000029000000040020008c000039030000613d0000000b02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016b2011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d000300000001035500000001002001900000390b0000613d0000000b01000029000015dd0010009c000002ae0000213d0000000b01000029000000400010043f00000000010000190000000b020000290000167d0000013d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a0000000c0220014f000000000021041b0000000c00200180000000400100043d000b00000001001d00003d290000c13d00000001010000390000000b020000290000167d0000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000395b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000039570000c13d000000000005004b000039680000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c680000613d000000000100043d000015dc001001980000265b0000613d0000000e0110014f000015dc0010019800003eac0000613d0000265b0000013d0000000d04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000399e0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000399a0000c13d000000000005004b000039ab0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c740000613d000000000100043d000015dc001001980000279e0000613d0000000e0110014f000015dc0010019800003f000000613d0000279e0000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000039d10000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000039cd0000c13d000000000005004b000039de0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003b800000813d000042400000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003a000000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000039fc0000c13d000000000005004b00003a0d0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003c060000813d000042400000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003a1b0000c13d00003c970000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003a490000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003a450000c13d000000000005004b00003a560000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c800000613d000000000100043d000015dc00100198000036d80000613d0000000e0110014f000015dc0010019800003eac0000613d000036d80000013d0000000d04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000005010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003a8a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003a860000c13d000000000005004b00003a970000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f0003000000010355000000010020019000003c8c0000613d000000000100043d000015dc00100198000037530000613d0000000e0110014f000015dc0010019800003f000000613d000037530000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003aa90000c13d00003c970000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c7000000090200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003ac60000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003ac20000c13d000000000005004b00003ad30000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000901000029000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000303000029000016a4043001970000000c0000006b0000000c0400c029000c00000004001d00000001002001900000012a0000613d000000000101043b000000000201041a000000400100043d000000c003100039000000000023043500000080021000390000000403000029000000000032043500000060021000390000000f030000290000000000320435000000400210003900000006030000290000000000320435000000200210003900000009030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016850010009c000002ae0000213d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000ff0220018f0000000c05000029000000d003500210000000000232019f0000000e0400002900000008034002100000168803300197000000000232019f000000000021041b000000400100043d000000400210003900000000005204350000002002100039000000000042043500000004020000290000000000210435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015ea011001c70000800d020000390000000403000039000016bd0400004100000009050000290000000f060000290000000d070000290000158d0000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003b6d0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003b690000c13d000000000005004b00003b7a0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e030000290000000c04000029000000060500002956ae52da0000040f0000ffff0220019000003b8d0000613d000004830020008c000042da0000c13d000016b00010009c00003bc80000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000502000029000000000021043500000044013000390000000602000029000000000021043500000024013000390000000c020000290000000000210435000016c201000041000000000013043500000004013000390000000e020000290000000000210435000d00000003001d000000a401300039000000000001043500000000010004140000000f02000029000000040020008c00003f460000613d0000000d02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016a3011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d0003000000010355000000010020019000003f460000c13d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f000000000100041400003f5f0000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003bf30000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003bef0000c13d000000000005004b00003c000000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f010000290000000e020000290000000903000029000000080400002956ae4d3f0000040f000f00000001001d000000000001004b00003c130000c13d0000000f0100002900000bf30000013d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000d02000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a0000000c03000029000000000232013f000000000021041b000000000032017000003c110000613d000000400100043d000016b30200004100001d7f0000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f000500000002001d0000006002100270000015d902200197000000200020008c000000200300003900000000030240190000001f0430018f000000200330019000003c530000613d000000000501034f0000000006000019000000005705043c0000000006760436000000000036004b00003c4f0000c13d000000000004004b00003c600000613d000000000531034f0000000304400210000000000603043300000000064601cf000000000646022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000464019f0000000000430435000100000002001f000300000001035500000005010000290000000100100190000042400000613d000000200020008c00003cd50000813d000042400000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c6f0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c7b0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c870000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00003c930000c13d000000000005004b00003ca40000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003cc20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003cbe0000c13d000000000005004b00003ccf0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e030000290000000c04000029000000070500002956ae52da0000040f0000ffff0220018f000002d10020008c00003ce30000613d000000000002004b000042da0000c13d000016b00010009c00003d160000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d00000044013000390000000702000029000000000021043500000024013000390000000c020000290000000000210435000016b1010000410000000000130435000d00000003001d00000004013000390000000e02000029000000000021043500000000010004140000000f02000029000000040020008c00003f460000613d0000000d02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016b2011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d0003000000010355000000010020019000003f460000c13d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f000000000100041400003f5f0000013d000016b3010000410000000b02000029000027ee0000013d0000000f01000029000f00440010003d00000002030003670000000f01300360000000000101043b0000169b021001970000169c0020009c00003ffa0000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000007030000290000000000320435000000a40210003900000064031000390000000f04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b00003d540000c13d000000400020043f00000000020004140000000b03000029000000040030008c0000410a0000c13d0000000001010433000000000010043f00000001020000390000000103000031000041310000013d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000703000029000000000032043500000044021000390000000e030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000d06000029000000020660036700003d8a0000613d000000000806034f000000008908043c0000000007970436000000000037004b00003d860000c13d000000000005004b00003d970000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000e030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000b04000029000000040040008c000040ac0000c13d0000000001010433000000000010043f00000001020000390000000103000031000040d60000013d0000000f01000029000f00440010003d00000002030003670000000f01300360000000000101043b0000169b021001970000169c0020009c0000403b0000a13d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d000000440210003900000040030000390000000000320435000000240210003900000000003204350000169f020000410000000000210435000000040210003900000006030000290000000000320435000000a40210003900000064031000390000000f04000029000000200440008a0000000204400367000000004504043c0000000003530436000000000023004b00003dce0000c13d000000400020043f00000000020004140000000b03000029000000040030008c000041dd0000c13d0000000001010433000000000010043f00000001020000390000000103000031000042040000013d0000169e0100004100000000001004430000000b0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b000042400000613d000000400100043d0000002402100039000000400300003900000000003204350000169f02000041000000000021043500000004021000390000000603000029000000000032043500000044021000390000000e030000290000000000320435000016e4043001980000001f0530018f000000640710003900000000034700190000000d06000029000000020660036700003e040000613d000000000806034f000000008908043c0000000007970436000000000037004b00003e000000c13d000000000005004b00003e110000613d000000000446034f0000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000e030000290000001f03300039000016e40230019700000064032000390000000002310019000000400020043f00000000020004140000000b04000029000000040040008c000040db0000c13d0000000001010433000000000010043f00000001020000390000000103000031000041050000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e3b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003e370000c13d000000000005004b00003e480000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003ea90000813d000042400000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e6a0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003e660000c13d000000000005004b00003e770000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c00003efd0000813d000042400000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003e960000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003e920000c13d000000000005004b00003ea30000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f010000290000000e020000290000000c03000029000000040400002956ae4d3f0000040f000f00000001001d000000000001004b00003c110000613d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000080300002900003c300000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000e0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003eea0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003ee60000c13d000000000005004b00003ef70000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000f0100002900000000020004110000000e030000290000000c04000029000000060500002956ae52da0000040f0000ffff0220018f000004830020008c00003f0b0000613d000000000002004b000042da0000c13d000016b00010009c00003f4d0000213d0000169e0100004100000000001004430000000f0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000302000029000000000021043500000044013000390000000602000029000000000021043500000024013000390000000c020000290000000000210435000016c201000041000000000013043500000004013000390000000e020000290000000000210435000d00000003001d000000a401300039000000000001043500000000010004140000000f02000029000000040020008c00003f460000613d0000000d02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016a3011001c70000000f0200002956ae56a40000040f0000006003100270000115d90030019d0003000000010355000000010020019000003f4d0000613d0000000d01000029000015dd0010009c000002ae0000213d0000000d01000029000000400010043f000000000100001900003f700000013d0000000e01000029000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b0000000902000029000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000012a0000613d000000000101043b000000000201041a000000080220014f000000000021041b0000000800200180000000400100043d000d00000001001d00003f720000c13d00000001010000390000000d020000290000167d0000013d000016b301000041000027ed0000013d0000000f04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000007010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003f9f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003f9b0000c13d000000000005004b00003fac0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000407c0000613d000000000100043d000015dc00100198000029140000613d0000000b0110014f000015dc00100198000041380000613d000029140000013d0000000f04000029000000200340008a000000000332034f0000002004400039000000000242034f000000000202043b000000000303043b000000400400043d0000006005400039000000000015043500000040014000390000000000310435000000f8012002700000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000003fe20000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00003fde0000c13d000000000005004b00003fef0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000040880000613d000000000100043d000015dc0010019800002a900000613d0000000b0110014f000015dc001001980000420b0000613d00002a900000013d0000000f04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000007010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040230000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000401f0000c13d000000000005004b000040300000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000040940000613d000000000100043d000015dc0010019800003d340000613d0000000b0110014f000015dc00100198000041380000613d00003d340000013d0000000f04000029000000200440008a000000000343034f000000000303043b000000400400043d0000006005400039000000000025043500000040024000390000000000320435000000ff011002700000001b011000390000002002400039000000000012043500000006010000290000000000140435000000000000043f000015d90040009c000015d90400804100000040014002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f0000169d011001c7000000010200003956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040640000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000040600000c13d000000000005004b000040710000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000040a00000613d000000000100043d000015dc0010019800003dae0000613d0000000b0110014f000015dc001001980000420b0000613d00003dae0000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000040830000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000408f0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000409b0000c13d00003c970000013d0000001f0530018f000015db06300198000000400200043d000000000462001900003c970000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000040a70000c13d00003c970000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040c70000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000040c30000c13d000000000005004b000040d40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c000041350000813d000042400000013d000015d90030009c000015d9030080410000006003300210000015d90010009c000015d9010080410000004001100210000000000131019f000015d90020009c000015d902008041000000c002200210000000000112019f0000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000040f60000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000040f20000c13d000000000005004b000041030000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d000000200030008c000042080000813d000042400000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041220000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000411e0000c13d000000000005004b0000412f0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000303000029000000000103041a000000ff0110018f000000050400002900000008024002100000168802200197000000000112019f0000000902000029000000d002200210000000000121019f000000000013041b000000400100043d0000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a50400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000301000029000000000101041a000400000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d0000000402000029000000d002200270000000000101043b000000000021004b0000423d0000213d00000002030003670000004401300370000000000501043b0000000301000029000000000101041a00000008021002700000168704200197000000000045004b00000000050480190000006403300370000000000303043b000f00000005001d000000000035004b000042510000413d0000000f030000290000000002320049000000080220021000001688022001970000168901100197000000000112019f0000000302000029000000000012041b000000400100043d0000000000310435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a60400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000301000029000000000101041a0000168800100198000041b00000c13d000016e30110019700000001011001bf0000000302000029000000000012041b000000400100043d0000000000010435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a70400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000c010000290000000b020000290000000a030000290000000f0400002956ae4d3f0000040f000e00000001001d0000000f0000006b000041d60000613d0000000e0000006b000041d60000613d0000000f0400002900000008014002100000000303000029000000000203041a00000000011200190000168801100197000016a802200197000000000121019f000000000013041b000000400100043d0000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000303000039000016a90400004100000008050000290000000b0600002956ae56a40000040f00000001002001900000012a0000613d0000000e0000006b0000000001000039000000010100c039000000400200043d00000020032000390000000000130435000043040000013d000015d90020009c000015d902008041000000c002200210000015d90010009c000015d9010080410000004001100210000000000121019f000016a0011001c70000000b0200002956ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000041f50000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000041f10000c13d000000000005004b000042020000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000042400000613d0000001f0030008c000042400000a13d000000000100043d0000169f0010009c000042400000c13d0000000203000029000000000103041a000000ff0110018f000000040400002900000008024002100000168802200197000000000112019f0000000902000029000000d002200210000000000121019f000000000013041b000000400100043d0000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a50400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000201000029000000000101041a000300000001001d000016860100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000042d90000613d0000000302000029000000d002200270000000000101043b000000000021004b000042430000a13d000000400100043d000016da0200004100001d7f0000013d000000400100043d000016d70200004100001d7f0000013d00000002030003670000004401300370000000000501043b0000000201000029000000000101041a00000008021002700000168704200197000000000045004b00000000050480190000006403300370000000000303043b000f00000005001d000000000035004b000042540000813d000000400100043d000016c30200004100001d7f0000013d0000000f030000290000000002320049000000080220021000001688022001970000168901100197000000000112019f0000000202000029000000000012041b000000400100043d0000000000310435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a60400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000201000029000000000101041a00001688001001980000428c0000c13d000016e30110019700000001011001bf0000000202000029000000000012041b000000400100043d0000000000010435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000403000039000016a70400004100000008050000290000000b06000029000000000700041156ae56a40000040f00000001002001900000012a0000613d0000000c0100002900000000020004110000000b030000290000000a04000029000000070500002956ae52da0000040f0000ffff0220018f000004830020008c000042970000613d000000000002004b000042da0000c13d000016b00010009c000042dd0000213d0000169e0100004100000000001004430000000c0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000042d90000613d000000000101043b000000000001004b0000012a0000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000f02000029000000000021043500000044013000390000000702000029000000000021043500000024013000390000000a020000290000000000210435000016c201000041000000000013043500000004013000390000000b020000290000000000210435000e00000003001d000000a401300039000000000001043500000000010004140000000c02000029000000040020008c000042d20000613d0000000e02000029000015d90020009c000015d9020080410000004002200210000015d90010009c000015d901008041000000c001100210000000000121019f000016a3011001c70000000c0200002956ae56a40000040f0000006003100270000115d90030019d00030000000103550000000100200190000042dd0000613d0000000e01000029000015dd0010009c000002ae0000213d0000000e01000029000000400010043f000d00000000001d000043000000013d000000000001042f000000400100043d000016d60200004100001d7f0000013d000d00010000003d000000400100043d000e00000001001d0000000f0000006b000043000000613d0000000f0400002900000008014002100000000203000029000000000203041a00000000011200190000168801100197000016a802200197000000000121019f000000000013041b0000000e010000290000000000410435000015d90010009c000015d90100804100000040011002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f00001670011001c70000800d020000390000000303000039000016a90400004100000008050000290000000b0600002956ae56a40000040f00000001002001900000012a0000613d000000400100043d000e00000001001d0000000e0200002900000020012000390000000d0300002900000000003104350000000f010000290000000000120435000015d90020009c000015d9020080410000004001200210000016aa011001c7000056af0001042e00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b0000431a0000613d000000000400001900000020022000390000000005020433000015dc0550019700000000015104360000000104400039000000000034004b000043130000413d000000000001042d0000169b0010009c0000432f0000213d000000a30010008c0000432f0000a13d00000002040003670000000401400370000000000101043b000015dc0010009c0000432f0000213d0000002402400370000000000202043b000015dc0020009c0000432f0000213d0000004403400370000000000303043b000015dc0030009c0000432f0000213d0000006404400370000000000404043b000000000001042d0000000001000019000056b00001043000000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b0000433f0000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b000043390000413d000000000001042d00080000000000020000000001000416000000000001004b000043560000c13d00000000010000310000169b0010009c000043560000213d000000630010008c000043560000a13d00000002010003670000000402100370000000000302043b000015dc0030009c000043560000213d0000002402100370000000000402043b000015dc0040009c000043560000213d0000004401100370000000000501043b000015dc0050009c000043580000a13d0000000001000019000056b0000104300000000001000410000000000013004b0000435d0000c13d0000000001000019000056af0001042e0000000001000411000015dc01100197000600000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c70000801002000039000500000003001d000800000004001d000700000005001d56ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000400000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000300000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000200000001001d00000004020000290000000d01200270000007f80310018f000000030130024f000000ff0110018f000300000003001d000000ff0030008c0000000001002019000016ae00200198000043a40000c13d000016e905000041000000040010008c000043da0000c13d000000000050043f000015f101000041000056b000010430000100000001001d0000000601000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000008030000290000000100200190000043560000613d000000000101043b000000000030043f0000000201100039000600000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000007030000290000000100200190000043560000613d000016e705000041000000000101043b000000000101041a000000ff00100190000043a10000c13d000000000030043f0000000601000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000016e805000041000000000101043b000000000101041a000000ff0010019000000001010000290000439e0000613d000043a10000013d000100000001001d000000040100002900000018011002700000167601100197000600000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000705000029000000080400002900000005030000290000000100200190000043560000613d0000000306000029000000020260024f000000ff0060008c0000000002002019000000000101043b000400000001001d000000ff0120018f000000010010008c000044190000613d000000020010008c0000000102000029000045090000c13d000000400200043d000016df010000410000000000120435000300000002001d000000040120003900000000005104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000046220000613d000000000201043b0000000001000414000015dc02200197000000040020008c0000447b0000c13d0000000103000031000000200030008c00000020040000390000000004034019000044a50000013d0000169e01000041000000000010044300000004005004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000001004b0000000503000029000000080400002900000001020000290000000701000029000045090000613d000000000010043f00000004010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000080400002900000005030000290000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000000102000029000045090000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000705000029000000080400002900000005030000290000000100200190000043560000613d000000000101043b0000000001010446000015dc01100197000000010010008c0000000102000029000045090000613d000000000031004b000045090000613d000016ea01000041000000000010044300000004005004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000004010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000005030000290000000804000029000043560000613d000016ec05000041000000000101043b000000000101041a000000ff001001900000000102000029000043a10000613d000045090000013d0000000303000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f0000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000305700029000044940000613d000000000801034f0000000309000029000000008a08043c0000000009a90436000000000059004b000044900000c13d000000000006004b000044a10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000046230000613d0000001f01400039000000600210018f0000000301200029000000000021004b00000000020000390000000102004039000015dd0010009c0000457f0000213d00000001002001900000457f0000c13d000000400010043f000000200030008c000000050300002900000008040000290000000705000029000043560000413d00000003010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000043560000c13d000000000001004b0000000102000029000045090000c13d000000000050043f00000004010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000080400002900000005030000290000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000000102000029000045090000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000705000029000000080400002900000005030000290000000100200190000043560000613d000000000101043b0000000001010446000015dc01100197000000010010008c0000000102000029000045090000613d000000000031004b000045090000613d000016ea01000041000000000010044300000004005004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000004010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000000005030000290000000804000029000043560000613d000016eb05000041000044750000013d000000000043004b0000450d0000c13d000000030020008c0000435b0000c13d000000ff0120018f000000010010008c000045850000613d000000020010008c000045db0000613d000000030010008c00000005010000290000435b0000c13d000000000010043f00000004010000290000000401100039000700000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000008030000290000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d000000000030043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000005030000290000000100200190000043560000613d000000000101043b0000000001010446000015dc01100197000000010010008c0000435b0000613d000000000031004b0000435b0000613d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d00000004020000290000000502200039000000000101043b000000000010043f000700000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000000802000029000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d000016ea01000041000000000010044300000004002004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f0000000701000029000000200010043f0000000001000414000046140000013d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000000502000029000043560000613d000000000101043b0000000001010446000015dc01100197000000010010008c0000435b0000613d000000000021004b0000435b0000613d0000000601000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000005030000290000000100200190000043560000613d000000000101043b000000000030043f000800000001001d0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff00100190000046410000c13d000016ea010000410000000000100443000000050100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff00100190000016ee050000410000435b0000613d000043a10000013d0000000501000029000000000010043f00000004010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000000000101043b000000000101041a000000ff001001900000435b0000c13d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000005030000290000000100200190000043560000613d000000000101043b0000000001010446000015dc01100197000000010010008c0000435b0000613d000000000031004b0000435b0000613d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000046220000613d000000000101043b000000000010043f00000004010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000043560000613d000016ed05000041000000000101043b000000000101041a000000ff001001900000435b0000c13d000043a10000013d000000000001042f0000001f0530018f000015db06300198000000400200043d00000000046200190000462e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000462a0000c13d000000000005004b0000463b0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000016ee05000041000000000050043f000015f101000041000056b0000104300000169b0010009c000046530000213d000000430010008c000046530000a13d00000002020003670000000401200370000000000101043b000015dc0010009c000046530000213d0000002402200370000000000202043b000015dc0020009c000046530000213d000000000001042d0000000001000019000056b0000104300000169b0010009c000046690000213d000000830010008c000046690000a13d00000002040003670000000401400370000000000101043b000015dc0010009c000046690000213d0000002402400370000000000202043b000015dc0020009c000046690000213d0000004403400370000000000303043b000015dc0030009c000046690000213d0000006404400370000000000404043b000000000001042d0000000001000019000056b00001043000010000000000020000000001000416000000000001004b000046af0000c13d00000000010000310000169b0010009c000046af0000213d000000430010008c000046af0000a13d00000004010000390000000201100367000000000201043b000015dc0020009c000046af0000213d000000000020043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000100000002001d000080100200003956ae56a90000040f0000000100200190000046af0000613d000000000101043b000000000101041a000000ff00100190000046b10000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000046af0000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000000102000029000046af0000613d000000000101043b000000000101041a000000ff00100190000046b90000c13d000000400100043d000016dc02000041000046b30000013d0000000001000019000056b000010430000000400100043d000016db020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000000000102001956ae56500000040f000000000001044700000024010000390000000201100367000000000201043b000000010100002956ae56600000040f00000000000104470000000001000019000056af0001042e000015dc02200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000046d20000613d000000000101043b000000000001042d0000000001000019000056b00001043000030000000000020000167601100197000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000470f0000613d000000000101043b000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000470f0000613d0000000205000029000000000005004b000047000000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000046f90000413d000047010000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c000047110000213d0000000100200190000047110000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b000010430000016a102200197000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047250000613d000000000101043b000000000001042d0000000001000019000056b0000104300002000000000002000100000002001d000200000001001d000015dc01100197000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b000000000101041a000000ff00100190000047820000c13d0000ff0000100190000047850000c13d00000018011002700000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b0000000002000411000015dc02200197000000000020043f0000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b000000000101041a000000ff00100190000047880000613d0000000201000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b000000010200003900000000002104470000000201000029000000000010043f0000000101000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047800000613d000000000101043b000000040110027000000001020000390000000000210447000000000001042d0000000001000019000056b000010430000000400100043d000016db020000410000478a0000013d000000400100043d000016be020000410000478a0000013d000000400100043d000016dc020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000016ef0010009c000047950000813d000000c001100039000000400010043f000000000001042d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f02200039000016e4022001970000000001120019000000000021004b00000000020000390000000102004039000015dd0010009c000047a70000213d0000000100200190000047a70000c13d000000400010043f000000000001042d000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167601100197000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000047e90000613d000000000101043b0000000201100039000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f0000000100200190000047e90000613d0000000205000029000000000005004b000047da0000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000047d30000413d000047db0000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c000047eb0000213d0000000100200190000047eb0000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167601100197000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000482d0000613d000000000101043b0000000201100039000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f00000001002001900000482d0000613d0000000205000029000000000005004b0000481e0000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b000048170000413d0000481f0000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c0000482f0000213d00000001002001900000482f0000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167601100197000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000048700000613d000000000101043b000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f0000000100200190000048700000613d0000000205000029000000000005004b000048610000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b0000485a0000413d000048620000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c000048720000213d0000000100200190000048720000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300001000000000002000000400300043d000016df020000410000000000230435000015dc01100197000100000003001d000000040230003900000000001204350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000048db0000613d000000000201043b0000000001000414000015dc02200197000000040020008c0000489a0000c13d0000000103000031000000200030008c00000020040000390000000004034019000000010b000029000048c50000013d0000000103000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000010b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000048b40000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000048b00000c13d000000000006004b000048c10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000048e20000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c000048dc0000213d0000000100200190000048dc0000c13d000000400010043f0000001f0030008c000048d90000a13d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000048d90000c13d000000000001042d0000000001000019000056b000010430000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d0000000004620019000048ed0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000048e90000c13d000000000005004b000048fa0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b0000104300002000000000002000200000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000492e0000613d000000000101043b000100000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000492e0000613d00000002020000290000000302200210000000010320024f000000ff0330018f000000ff0020008c0000000003002019000000000101043b000000000121022f000000ff0210018f00000000020020190000000001030019000000000001042d000000000001042f000a000000000002000500000004001d000900000003001d000a00000002001d000400000001001d000015dc021001970000000001000410000000000012004b00004c100000613d000600000002001d0000000001000411000015dc01100197000100000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000800000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000700000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000200000001001d00000008020000290000000d01200270000007f80310018f000000070130024f000000ff0110018f000300000003001d000000ff0030008c0000000001002019000016ae00200198000700000001001d000049ac0000613d0000000101000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000a02000029000015dc02200197000000000020043f0000000201100039000100000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c670000c13d0000000901000029000015dc01100197000000000010043f0000000101000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff00100190000000070100002900004c690000c13d000000040010008c00004c650000613d000000080100002900000018011002700000167601100197000100000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d0000000303000029000000020230024f000000ff0030008c0000000002002019000000000101043b000800000001001d000000ff0120018f000000010010008c000049ec0000613d000000020010008c00004ab20000c13d000000400300043d000016df0100004100000000001304350000000901000029000015dc02100197000300000003001d0000000401300039000200000002001d00000000002104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f000000010020019000004c640000613d000000000201043b0000000001000414000015dc02200197000000040020008c00004a600000c13d0000000103000031000000200030008c00000020040000390000000004034019000000030b00002900004a8b0000013d0000169e010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000001004b00004ab20000613d0000000901000029000015dc01100197000000000010043f00000008010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004ab20000c13d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00004ab20000613d000000060010006c00004ab20000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000003010446000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c00004a3f0000413d000000000112016f000000010010019000004ab20000613d000016ea010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004ab20000c13d000016ec0100004100004c6a0000013d0000000303000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000030b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900004a7a0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00004a760000c13d000000000006004b00004a870000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f0003000000010355000000010020019000004c750000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c00004c6f0000213d000000010020019000004c6f0000c13d000000400010043f000000200030008c00004c620000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b00004c620000c13d000000000001004b00004ab20000c13d0000000201000029000000000010043f00000008010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c110000613d0000000a01000029000015dc031001970000000602000029000000000032004b000000070100002900004aba0000c13d000000030010008c00004c100000c13d000000ff0110018f000000010010008c00004b450000613d000000020010008c00004bb30000613d000000030010008c00004c100000c13d000900000003001d000000000020043f00000008010000290000000401100039000700000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff00100190000000090100002900004c100000c13d000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000c13d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c000000060200002900004c100000613d000000000021004b00004c100000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000001010446000015dc02100197000000010020008c000000060300002900004b100000613d000000000032004b00004b120000c13d0000169b0010009c00004c100000213d000016ea010000410000000000100443000000040100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d00000008020000290000000502200039000000000101043b000000000010043f000900000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000c13d000016ea0100004100000000001004430000000a0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f0000000901000029000000200010043f000000000100041400004c040000013d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c000000060200002900004c100000613d000000000021004b00004c100000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000001010446000015dc02100197000000010020008c000000060300002900004b700000613d000000000032004b00004b720000c13d0000169b0010009c00004c100000213d0000000101000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000201043b0000000601000029000000000010043f000a00000002001d0000000401200039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000916ee00000045000000000101043b000000000101041a000000ff0010019000004c6b0000c13d000016ea010000410000000000100443000000040100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f0000000a010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000613d00004c6b0000013d000000000020043f00000008010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c100000c13d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c000000060200002900004c100000613d000000000021004b00004c100000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000001010446000015dc02100197000000010020008c000000060300002900004bef0000613d000000000032004b00004bf10000c13d0000169b0010009c00004c100000213d000016ea010000410000000000100443000000040100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004c930000613d000000000001042d0000000001000411000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00004ab20000613d000000060010006c00004ab20000613d0000000001000411000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b0000000003010446000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c00004c410000413d000000000112016f000000010010019000004ab20000613d000016ea010000410000000000100443000000090100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004c640000613d000000000101043b000000000010043f00000008010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004c620000613d000000000101043b000000000101041a000000ff0010019000004ab20000c13d000016eb0100004100004c6a0000013d0000000001000019000056b000010430000000000001042f000016e90100004100004c6a0000013d000016e70100004100004c6a0000013d000016e801000041000900000001001d0000000901000029000000000010043f000015f101000041000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d000000000462001900004c800000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00004c7c0000c13d000000000005004b00004c8d0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000016ed0100004100004c6a0000013d00030000000000020000167601100197000000000010043f0000000e01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f000000010020019000004cd00000613d000000000101043b000000000301041a000000400200043d000300000002001d000200000003001d0000000002320436000100000002001d000000000010043f0000000001000414000015d90010009c000015d901008041000000c00110021000001670011001c7000080100200003956ae56a90000040f000000010020019000004cd00000613d0000000205000029000000000005004b00004cc10000613d000000000101043b00000000020000190000000104000029000000000301041a000000000434043600000001011000390000000102200039000000000052004b00004cba0000413d00004cc20000013d0000000104000029000000030100002900000000021400490000001f03200039000016e4023001970000000003120019000000000023004b00000000020000390000000102004039000015dd0030009c00004cd20000213d000000010020019000004cd20000c13d000000400030043f000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300005000000000002000100000005001d0000000005040019000000000403001900000000030200190000000002000411000500000001001d000400000003001d000300000004001d000200000005001d56ae52da0000040f0000ffff0220019000004ce70000613d000004830020008c00004d2e0000c13d0000000102000039000016b00010009c00004d2c0000213d0000169e0100004100000000001004430000000501000029000015dc01100197000500000001001d00000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f000000010020019000004d360000613d000000000101043b000000000001004b00004d370000613d000000400300043d0000008401300039000000a00200003900000000002104350000006401300039000000010200002900000000002104350000004401300039000000020200002900000000002104350000000301000029000015dc0110019700000024023000390000000000120435000016c20100004100000000001304350000000401000029000015dc0110019700000004023000390000000000120435000000a401300039000000000001043500000000010004140000000502000029000000040020008c00004d280000613d000015d90030009c000400000003001d000015d90300004100000004030040290000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016a3011001c756ae56a40000040f0000006003100270000115d90030019d000000040300002900030000000103550000000100200190000000010200003900004d2c0000613d000016f00030009c00004d390000813d000000400030043f00000000020000190000000001020019000000000001042d000000400100043d000016d6020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000000000001042f0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b000010430000b00000000000200000000050100190000000001000411000015dc061001970000000001000410000000000016004b00004d8a0000c13d000000400600043d00000064016000390000000000410435000015dc01300197000000440360003900000000001304350000002001600039000016b1030000410000000000310435000015dc032001970000002404600039000000000034043500000064030000390000000000360435000016f10060009c000051020000213d000000a003600039000000400030043f00000000030604330000000002000414000000040050008c00004df10000c13d00000001020000390000000104000031000000000004004b00004e040000613d0000001f01400039000016e4011001970000003f01100039000016e403100197000000400100043d0000000003310019000000000013004b00000000060000390000000106004039000015dd0030009c000051020000213d0000000100600190000051020000c13d000000400030043f0000000003410436000016e4054001980000001f0640018f0000000004530019000000030700036700004d7a0000613d000000000807034f0000000009030019000000008a08043c0000000009a90436000000000049004b00004d760000c13d000000000006004b00004d870000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000100200190000050fd0000613d00004e080000013d000600000006001d000200000004001d000800000003001d000a00000002001d000500000005001d000015dc01500197000700000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000b00000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000900000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000300000001001d0000000b020000290000000d01200270000007f80310018f000000090130024f000000ff0110018f000400000003001d000000ff0030008c0000000001002019000016ae00200198000900000001001d00004e190000613d0000000701000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000a02000029000015dc02200197000000000020043f0000000201100039000700000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d0000000102000039000000000101043b000000000101041a000000ff0010019000004e1f0000613d0000000001020019000000000001042d000015d90010009c000015d9010080410000004001100210000015d90030009c000015d9030080410000006003300210000000000113019f000015d90020009c000015d902008041000000c002200210000000000121019f000000000205001956ae56a40000040f00030000000103550000006001100270000115d90010019d000015d904100197000000000004004b00004d600000c13d000000600100003900000080030000390000000100200190000050fd0000613d0000000001010433000000000001004b00004e1d0000613d0000169b0010009c000050ff0000213d000000200010008c000050ff0000413d0000000001030433000000000001004b0000000002000039000000010200c039000000000021004b000050ff0000c13d000000000001004b00000000010000390000000101006039000000000001042d000000040010008c00004e350000c13d0000000101000039000000000001042d0000000001000019000000000001042d0000000801000029000015dc01100197000000000010043f0000000701000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050fd0000c13d0000000901000029000000040010008c000000010200003900004def0000613d0000000b0100002900000018011002700000167601100197000100000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d0000000403000029000000030230024f000000ff0030008c0000000002002019000000000101043b000700000001001d000000ff0120018f000000010010008c00004e730000613d000000020010008c00004f370000c13d000000400300043d000016df0100004100000000001304350000000801000029000015dc02100197000400000003001d0000000401300039000300000002001d00000000002104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000051010000613d000000000201043b0000000001000414000015dc02200197000000040020008c00004ee50000c13d0000000103000031000000200030008c00000020040000390000000004034019000000040b00002900004f100000013d0000169e010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000001004b00004f370000613d0000000801000029000015dc01100197000000000010043f00000007010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff0010019000004f370000c13d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00004f370000613d000000060010006c00004f370000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000003010446000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c00004ec50000413d000000000112016f000000010010019000004f370000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000007010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff0010019000004f370000c13d000050fd0000013d0000000403000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000040b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900004eff0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00004efb0000c13d000000000006004b00004f0c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000051080000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c000051020000213d0000000100200190000051020000c13d000000400010043f000000200030008c000050ff0000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000050ff0000c13d000000000001004b00004f370000c13d0000000301000029000000000010043f00000007010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050640000613d0000000a01000029000015dc02100197000000060020006b000000090100002900004f3e0000c13d000000030010008c000050520000c13d000000ff0110018f000000010010008c00004fd40000613d000000020010008c000050400000613d000000030010008c000050520000c13d000900000002001d0000000601000029000000000010043f00000007010000290000000401100039000400000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff001001900000000901000029000050520000c13d000000000010043f0000000401000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c000050520000613d000000060010006c000050520000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000001010446000015dc02100197000000010020008c00004f920000613d000000060020006c00004f940000c13d0000169b0010009c000050520000213d000016ea010000410000000000100443000000000100041100000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d00000007020000290000000502200039000000000101043b000000000010043f000900000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d000016ea0100004100000000001004430000000a0100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f0000000901000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d0000000101000039000000000001042d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c000050520000613d000000060010006c000050520000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000001010446000015dc02100197000000010020008c00004ffc0000613d000000060020006c00004ffe0000c13d0000169b0010009c000050520000213d0000000101000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000201043b0000000601000029000000000010043f000900000002001d0000000401200039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d0000000102000039000000000101043b000000000101041a000000ff0010019000004def0000c13d000016ea010000410000000000100443000000000100041100000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000000010200003900004def0000c13d000050520000013d0000000601000029000000000010043f00000007010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050b40000613d0000000b0100002900000098011002700000ffff0110019000000005050000290000000a020000290000000803000029000000020400002900004d460000613d000000140010008c00004d460000613d000000400100043d000016d6020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00004f370000613d000000060010006c00004f370000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000003010446000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c000050930000413d000000000112016f000000010010019000004f370000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000007010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff0010019000004f370000c13d0000000101000039000000000001042d0000000501000029000000000010043f000000200000043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c000050520000613d000000060010006c000050520000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b0000000001010446000015dc02100197000000010020008c000050dc0000613d000000060020006c000050de0000c13d0000169b0010009c000050520000213d000016ea010000410000000000100443000000000100041100000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000051010000613d000000000101043b000000000010043f00000007010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000050ff0000613d000000000101043b000000000101041a000000ff00100190000050520000c13d0000000101000039000000000001042d0000000001000019000056b000010430000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d0000000004620019000051130000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000510f0000c13d000000000005004b000051200000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000000140010008c0000512c0000613d000002d10010008c0000512c0000613d000004830010008c0000512d0000c13d000000000001042d000000400100043d000016b5020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300001000000000002000100000002001d000015dc01100197000000000010043f0000000601000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000515c0000613d000000000101043b00000001020000290000000802200270000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000515c0000613d0000000102000029000000ff0220018f000000010220020f000000000101043b000000000301041a000000000323013f000000000031041b00000000002301700000515e0000613d000000000001042d0000000001000019000056b000010430000000400100043d000016d8020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b0000104300007000000000002000300000007001d000100000005001d000200000004001d000600000003001d000500000002001d000400000001001d000015dc01600197000700000001001d000000000010043f0000000701000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b000000000201041a000000400100043d000000c00310003900000000002304350000008002100039000000060300002900000000003204350000004002100039000000040300002900000000003204350000000502000029000015dc032001970000006002100039000500000003001d0000000000320435000000200210003900000007030000290000000000320435000000c0030000390000000000310435000000a0031000390000000000030435000016f20010009c000051ed0000813d000000e003100039000000400030043f000015d90020009c000015d90200804100000040022002100000000001010433000015d90010009c000015d9010080410000006001100210000000000121019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b000000000010043f0000000201000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b0000000302000029000015dc02200197000400000002001d000000000020043f000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000051eb0000613d000000000101043b000000000201041a000000ff0220018f0000000105000029000000d003500210000000000232019f000000020400002900000008034002100000168803300197000000000232019f000000000021041b000016a401500197000000400200043d0000004003200039000000000013043500001687014001970000002003200039000000000013043500000006010000290000000000120435000015d90020009c000015d90200804100000040012002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015ea011001c70000800d020000390000000403000039000016bd0400004100000007050000290000000506000029000000040700002956ae56a40000040f0000000100200190000051eb0000613d000000000001042d0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000040000000000020000000005040019000400000003001d0000000004020019000000000301001900000000020004110000000401000029000300000003001d000100000004001d000200000005001d56ae52da0000040f0000ffff02200190000052020000613d000002d10020008c000052410000c13d0000000102000039000016b00010009c0000523f0000213d0000169e0100004100000000001004430000000401000029000015dc01100197000400000001001d00000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f0000000100200190000052490000613d000000000101043b000000000001004b0000524a0000613d000000400300043d0000004401300039000000020200002900000000002104350000000101000029000015dc0110019700000024023000390000000000120435000016b10100004100000000001304350000000301000029000015dc011001970000000402300039000000000012043500000000010004140000000402000029000000040020008c0000523b0000613d000015d90030009c000300000003001d000015d90300004100000003030040290000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016b2011001c756ae56a40000040f0000006003100270000115d90030019d00000003030000290003000000010355000000010020019000000001020000390000523f0000613d000016f00030009c0000524c0000813d000000400030043f00000000020000190000000001020019000000000001042d000000400100043d000016d6020000410000000000210435000015d90010009c000015d9010080410000004001100210000015f1011001c7000056b000010430000000000001042f0000000001000019000056b000010430000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b00001043000030000000000020000167201000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b000300000001001d000015df0100004100000000001004430000000001000414000015d90010009c000015d901008041000000c001100210000015e0011001c70000800b0200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b000000030010006c000052820000c13d0000167201000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052cf0000c13d000052d10000013d000200000001001d000000400100043d000300000001001d0000002002100039000015e601000041000100000002001d00000000001204350000167201000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b0000000302000029000000400220003900000000001204350000167201000041000000000010044300000000010004120000000400100443000000e00100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f0000000100200190000052d10000613d000000000101043b0000000304000029000000a0024000390000000003000410000000000032043500000080024000390000000203000029000000000032043500000060024000390000000000120435000000a0010000390000000000140435000016ef0040009c000052d20000813d0000000302000029000000c001200039000000400010043f0000000101000029000015d90010009c000015d90100804100000040011002100000000002020433000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000052d80000613d000000000101043b000000000001042d000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000000001000019000056b000010430000c0000000000020000000006020019000015dc072001970000000002000410000000000027004b00000000080000190000000002000019000052e40000c13d0000000001080019000000000001042d000800000004001d000500000005001d000a00000003001d000600000007001d000200000006001d000700000001001d000015dc01100197000900000001001d000000000010043f0000000b01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000c00000001001d0000167201000041000000000010044300000000010004120000000400100443000001000100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000b00000001001d0000167201000041000000000010044300000000010004120000000400100443000001200100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000300000001001d0000000c020000290000000d01200270000007f80310018f0000000b0130024f000000ff0110018f000400000003001d000000ff0030008c0000000001002019000016ae00200198000053620000613d000b00000001001d0000000901000029000000000010043f0000000f01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000a02000029000015dc02200197000000000020043f0000000201100039000900000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000534c0000613d000016e7010000410000000002000019000000000001042d0000000801000029000015dc01100197000000000010043f0000000901000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000b01000029000053620000613d000016e8010000410000000002000019000000000001042d000000040010008c000053670000c13d000016e9010000410000000002000019000000000001042d000b00000001001d0000000c0100002900000018011002700000167601100197000100000001001d000000000010043f0000000d01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d0000000403000029000000030230024f000000ff0030008c0000000002002019000000000101043b000900000001001d000000ff0120018f000000010010008c000053a60000613d000000020010008c0000546d0000c13d000000400300043d000016df0100004100000000001304350000000801000029000015dc02100197000400000003001d0000000401300039000300000002001d00000000002104350000167201000041000000000010044300000000010004120000000400100443000001400100003900000024001004430000000001000414000015d90010009c000015d901008041000000c00110021000001682011001c7000080050200003956ae56a90000040f00000001002001900000562b0000613d000000000201043b0000000001000414000015dc02200197000000040020008c0000541b0000c13d0000000103000031000000200030008c00000020040000390000000004034019000000040b000029000054460000013d0000169e010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000001004b0000546d0000613d0000000801000029000015dc01100197000000000010043f00000009010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000546d0000c13d0000000701000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c0000546d0000613d000000060010006c0000546d0000613d0000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000003010446000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c000053f90000413d000000000112016f00000001001001900000546d0000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000546d0000c13d000016ec010000410000000002000019000000000001042d0000000403000029000015d90030009c000015d9030080410000004003300210000015d90010009c000015d901008041000000c001100210000000000131019f000016cf011001c756ae56a90000040f000000040b0000290000006003100270000015d903300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000054350000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000054310000c13d000000000006004b000054420000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000056320000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000015dd0010009c0000562c0000213d00000001002001900000562c0000c13d000000400010043f000000200030008c000056290000413d00000000010b0433000000000001004b0000000002000039000000010200c039000000000021004b000056290000c13d000000000001004b0000546d0000c13d0000000301000029000000000010043f00000009010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff00100190000055680000613d0000000a01000029000015dc051001970000000602000029000000000052004b000000070300002900000005040000290000000b01000029000054770000c13d000000030010008c000055630000c13d000000ff0110018f000000010010008c000055020000613d000000020010008c000055500000613d000000030010008c000055630000c13d000b00000005001d000000000020043f00000009010000290000000401100039000800000001001d000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000b01000029000055630000c13d000000000010043f0000000801000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff0010019000000007010000290000000502000029000055630000c13d000000000010043f000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00000006020000290000000703000029000055630000613d000000000021004b000055630000613d000000000030043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000001010446000015dc02100197000000010020008c00000002030000290000000604000029000054ce0000613d000000000042004b000054d00000c13d0000169b0010009c000055630000213d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d00000009020000290000000502200039000000000101043b000000000010043f000b00000002001d000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000a02000029000055630000c13d000016ea01000041000000000010044300000004002004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f0000000b01000029000000200010043f0000000001000414000055f80000013d000000000030043f000000200040043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00000006020000290000000703000029000055630000613d000000000021004b000055630000613d000000000030043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000001010446000015dc02100197000000010020008c00000006030000290000552b0000613d000000000032004b0000552d0000c13d0000169b0010009c000055630000213d0000000101000029000000000010043f0000000c01000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000201043b0000000601000029000000000010043f000b00000002001d0000000401200039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff00100190000056070000613d0000000002000019000016ee01000041000000000001042d000000000020043f00000009010000290000000401100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff0010019000000007010000290000000502000029000055ba0000613d0000000c0100002900000098011002700000ffff0210018f0000000001000019000000000001042d0000000701000029000000000010043f0000000501000029000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c0000546d0000613d000000060010006c0000546d0000613d0000000701000029000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000003010446000015dc02300197000000060020006c0000000001000039000000010100c039000000010020008c0000000002000039000000010200c039000015de0030009c000055980000413d000000000112016f00000001001001900000546d0000613d000016ea010000410000000000100443000000080100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000546d0000c13d000016eb010000410000000002000019000000000001042d000000000010043f000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b00000004011002700000000001010446000015dc01100197000000010010008c00000006020000290000000703000029000055630000613d000000000021004b000055630000613d000000000030043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b0000000001010446000015dc02100197000000010020008c00000002030000290000000604000029000055e40000613d000000000042004b000055e60000c13d0000169b0010009c000055630000213d000016ea01000041000000000010044300000004003004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f00000009010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff00100190000055630000c13d000016ed010000410000000002000019000000000001042d000016ea010000410000000000100443000000020100002900000004001004430000000001000414000015d90010009c000015d901008041000000c00110021000001684011001c7000080020200003956ae56a90000040f00000001002001900000562b0000613d000000000101043b000000000010043f0000000b010000290000000501100039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f0000000100200190000056290000613d000000000101043b000000000101041a000000ff001001900000000002000019000016ee08000041000052e20000c13d000055630000013d0000000001000019000056b000010430000000000001042f000016ce01000041000000000010043f0000004101000039000000040010043f000016cf01000041000056b0000104300000001f0530018f000015db06300198000000400200043d00000000046200190000563d0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000056390000c13d000000000005004b0000564a0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000015d90020009c000015d9020080410000004002200210000000000112019f000056b000010430000000000010043f0000000901000039000000200010043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000565e0000613d000000000101043b000000000001042d0000000001000019000056b000010430000000000010043f000000200020043f0000000001000414000015d90010009c000015d901008041000000c001100210000015e8011001c7000080100200003956ae56a90000040f00000001002001900000566e0000613d000000000101043b0000000401100270000000000001042d0000000001000019000056b000010430000000000001042f000015d90010009c000015d9010080410000004001100210000015d90020009c000015d9020080410000006002200210000000000112019f0000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000015e2011001c7000080100200003956ae56a90000040f0000000100200190000056840000613d000000000101043b000000000001042d0000000001000019000056b00001043000000000050100190000000000200443000000050030008c000056940000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b0000568c0000413d000015d90030009c000015d90300804100000060013002100000000002000414000015d90020009c000015d902008041000000c002200210000000000112019f000016f3011001c7000000000205001956ae56a90000040f0000000100200190000056a30000613d000000000101043b000000000001042d000000000001042f000056a7002104210000000102000039000000000001042d0000000002000019000000000001042d000056ac002104230000000102000039000000000001042d0000000002000019000000000001042d000056ae00000432000056af0001042e000056b0000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f630000000000000000000000000000000000000000000000000000000000000f830000000000000000000000000000000000000000000000000000000000001bfa0000000000000000000000000000000000000000000000000000000000001c1a0000000000000000000000000000000000000000000000000000000000000f130000000000000000000000000000000000000000000000000000000000000f33000000000000000000000000000000000000000000000000000000000000235e000000000000000000000000000000000000000000000000000000000000237e0000000000000000000000000000000000000000000000000000000000000527000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000027f40000000000000000000000000000000000000000000000000000000000002814000000000000000000000000000000000000000000000000000000000000049e00000000000000000000000000000000000000000000000000000000000004be00000000000000000000000000000000000000000000000000000000000024260000000000000000000000000000000000000000000000000000000000002446000000000000000000000000000000000000000000000000000000000000089a00000000000000000000000000000000000000000000000000000000000008ba0000000000000000000000000000000000000000000000000000000000001d590000000000000000000000000000000000000000000000000000000000001d79000000000000000000000000000000000000000000000000000000000000082c000000000000000000000000000000000000000000000000000000000000084c00000000000000000000000000000000000000000000000000000000000022200000000000000000000000000000000000000000000000000000000000002240000000000000000000000000000000000000000000000000000000000000062c000000000000000000000000000000000000000000000000000000000000064c000000000000000000000000000000000000000000000000000000000000256700000000000000000000000000000000000000000000000000000000000025870000000000000000000000000000000000000000000000000000000000001fe9000000000000000000000000000000000000000000000000000000000000200900000000000000000000000000000000000000000000000000000000000029620000000000000000000000000000000000000000000000000000000000002982000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000001ca80000000000000000000000000000000000000000000000000000000000001cc800000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000151000000000000000000000000000000000000000000000000000000000000026a900000000000000000000000000000000000000000000000000000000000026c900000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000020e0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff80000000000000000000000000000000000000000000000000000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b0200000200000000000000000000000000000004000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000000000000000000000000000000494654067e0ffff000000000000000000000000000000000000000000000000002386f26fc0ffff8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f020000000000000000000000000000000000004000000000000000000000000044454641554c54204c495354000000000000000000000000000000000000000002000000000000000000000000000000000000600000000000000000000000005cc365f89543268cb9f25c255f7f610e9147e733c589bc2732279575f125be149b0894203394c3cbb23140db7a23b224d3e18e0366e9f65bd9c8402650e27367000000000000000000000000000000000000000000000403030202030201000200000000000000000000000000000000000000000000030201020100000000000000000200000000000000000000000000000300000001000000000000000000c56e5d73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000008254fcb600000000000000000000000000000000000000000000000000000000b97f6f8a00000000000000000000000000000000000000000000000000000000ddae38f100000000000000000000000000000000000000000000000000000000e34fda8400000000000000000000000000000000000000000000000000000000f7a2000900000000000000000000000000000000000000000000000000000000f7a2000a00000000000000000000000000000000000000000000000000000000fb2de5d700000000000000000000000000000000000000000000000000000000ffbcb4aa00000000000000000000000000000000000000000000000000000000e34fda8500000000000000000000000000000000000000000000000000000000e991dc3000000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000df21dc1c00000000000000000000000000000000000000000000000000000000df21dc1d00000000000000000000000000000000000000000000000000000000df5fd29a00000000000000000000000000000000000000000000000000000000e07cb24000000000000000000000000000000000000000000000000000000000ddae38f200000000000000000000000000000000000000000000000000000000de02cbb100000000000000000000000000000000000000000000000000000000def0125b00000000000000000000000000000000000000000000000000000000d415f62e00000000000000000000000000000000000000000000000000000000db5f30a700000000000000000000000000000000000000000000000000000000db5f30a800000000000000000000000000000000000000000000000000000000dd71105d00000000000000000000000000000000000000000000000000000000dda964e300000000000000000000000000000000000000000000000000000000d415f62f00000000000000000000000000000000000000000000000000000000d5dc239a00000000000000000000000000000000000000000000000000000000db188e6300000000000000000000000000000000000000000000000000000000c435f43400000000000000000000000000000000000000000000000000000000c435f43500000000000000000000000000000000000000000000000000000000caee23ea00000000000000000000000000000000000000000000000000000000cfea7ecf00000000000000000000000000000000000000000000000000000000b97f6f8b00000000000000000000000000000000000000000000000000000000bf7bfd7e00000000000000000000000000000000000000000000000000000000a5d56b4500000000000000000000000000000000000000000000000000000000b67d8f9800000000000000000000000000000000000000000000000000000000b89c4b0c00000000000000000000000000000000000000000000000000000000b89c4b0d00000000000000000000000000000000000000000000000000000000b8dcc68f00000000000000000000000000000000000000000000000000000000b955455200000000000000000000000000000000000000000000000000000000b67d8f9900000000000000000000000000000000000000000000000000000000b6e39ba100000000000000000000000000000000000000000000000000000000b70510f500000000000000000000000000000000000000000000000000000000ad1ff68400000000000000000000000000000000000000000000000000000000ad1ff68500000000000000000000000000000000000000000000000000000000ae602f4400000000000000000000000000000000000000000000000000000000b3992ab100000000000000000000000000000000000000000000000000000000a5d56b4600000000000000000000000000000000000000000000000000000000a87b03b6000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000982d03bf00000000000000000000000000000000000000000000000000000000982d03c0000000000000000000000000000000000000000000000000000000009c2a9c6f00000000000000000000000000000000000000000000000000000000a1cc5cc1000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008e28800f000000000000000000000000000000000000000000000000000000009340a7cc000000000000000000000000000000000000000000000000000000008963162500000000000000000000000000000000000000000000000000000000896316260000000000000000000000000000000000000000000000000000000089a9c855000000000000000000000000000000000000000000000000000000008b6ee865000000000000000000000000000000000000000000000000000000008254fcb70000000000000000000000000000000000000000000000000000000086e11774000000000000000000000000000000000000000000000000000000003e5c139c000000000000000000000000000000000000000000000000000000006498c0440000000000000000000000000000000000000000000000000000000071be859c000000000000000000000000000000000000000000000000000000007bac97dd000000000000000000000000000000000000000000000000000000007bac97de000000000000000000000000000000000000000000000000000000007c1e14b4000000000000000000000000000000000000000000000000000000007df81b900000000000000000000000000000000000000000000000000000000071be859d00000000000000000000000000000000000000000000000000000000725d07c50000000000000000000000000000000000000000000000000000000078e890ba000000000000000000000000000000000000000000000000000000006bfab91c000000000000000000000000000000000000000000000000000000006bfab91d00000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000007161ac8d000000000000000000000000000000000000000000000000000000006498c0450000000000000000000000000000000000000000000000000000000069710828000000000000000000000000000000000000000000000000000000004c9d0b4400000000000000000000000000000000000000000000000000000000539d260100000000000000000000000000000000000000000000000000000000539d2602000000000000000000000000000000000000000000000000000000005e17263d000000000000000000000000000000000000000000000000000000005ed5917f000000000000000000000000000000000000000000000000000000004c9d0b45000000000000000000000000000000000000000000000000000000005079331500000000000000000000000000000000000000000000000000000000515f7b28000000000000000000000000000000000000000000000000000000003f6560ed000000000000000000000000000000000000000000000000000000003f6560ee00000000000000000000000000000000000000000000000000000000409dc573000000000000000000000000000000000000000000000000000000004be52a89000000000000000000000000000000000000000000000000000000003e5c139d000000000000000000000000000000000000000000000000000000003e8a0bc9000000000000000000000000000000000000000000000000000000001854b240000000000000000000000000000000000000000000000000000000002c7fe709000000000000000000000000000000000000000000000000000000003779e6fc000000000000000000000000000000000000000000000000000000003779e6fd000000000000000000000000000000000000000000000000000000003a0e3160000000000000000000000000000000000000000000000000000000003cda743a000000000000000000000000000000000000000000000000000000002c7fe70a000000000000000000000000000000000000000000000000000000002eb0b98a00000000000000000000000000000000000000000000000000000000317e3e8d0000000000000000000000000000000000000000000000000000000023c992610000000000000000000000000000000000000000000000000000000023c9926200000000000000000000000000000000000000000000000000000000285fb8c80000000000000000000000000000000000000000000000000000000028cc1131000000000000000000000000000000000000000000000000000000001854b241000000000000000000000000000000000000000000000000000000001f2fdc79000000000000000000000000000000000000000000000000000000000f59197c00000000000000000000000000000000000000000000000000000000136439dc00000000000000000000000000000000000000000000000000000000136439dd0000000000000000000000000000000000000000000000000000000016a17ce00000000000000000000000000000000000000000000000000000000016f18d74000000000000000000000000000000000000000000000000000000000f59197d0000000000000000000000000000000000000000000000000000000010b5c6a00000000000000000000000000000000000000000000000000000000012d3848a00000000000000000000000000000000000000000000000000000000057497ca00000000000000000000000000000000000000000000000000000000057497cb000000000000000000000000000000000000000000000000000000000ad38899000000000000000000000000000000000000000000000000000000000e14021a00000000000000000000000000000000000000000000000000000000015499300000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000002000000080000000000000000000000000000000000000000000000000000000040000001c00000000000000000000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000440000000000000000000000000000000000000000000000ffff00000000000000000000000000000000000000ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff0200000000000000000000000000000000000020000000000000000000000000a5c37ab91519073edd58e608f19f7ce383fd171f4f22c3612a1d0a7c1047794a310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e00000000000000000000000000000000000000400000008000000000000000003e58254b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff208795fcac393398e42038456348398d8cac9067232f671ab240444cb51b1d207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0503012490a650739416858609e898957b874d17415a062945179c57357978840061d78094976b1d9ae7bb858f141c915b46152756409caadb07482983c2ca301ffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffbffdffffffffffffffffffffffffffffffffffffc0000000000000000000000000da8f3bd170446760f0f965a9b52bf271cb9679b5e0a70059eff2d49425229d17c8615322788d404dfe307db9eef031bc148d1cec5e270a1fd6528a02b445d4450000000000000000000000000000000000000020000000000000000000000000f71687260000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000440000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f390200000200000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff1f796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913200000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff00000000000000000000000000000000000000000000000000ff5065726d69745472616e7366657246726f6d576974684164646974696f6e616c446174612875696e7432353620746f6b656e547970652c6164647265737320746f6b656e2c75696e743235362069642c75696e7432353620616d6f756e742c75696e74323536206e6f6e63652c61646472657373206f70657261746f722c75696e743235362065787069726174696f6e2c75696e74323536206d61737465724e6f6e63652c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe9f02000000000000000000000000000000000000000000018000000000000000007069726174696f6e2c75696e74323536206d61737465724e6f6e63652c00000073616c742c61646472657373206f70657261746f722c75696e743235362065786e743235362069642c75696e7432353620616d6f756e742c75696e74323536206e7432353620746f6b656e547970652c6164647265737320746f6b656e2c75695065726d69744f72646572576974684164646974696f6e616c44617461287569932b8553b8e35bbee682d275cbe1cf115e14a777e2ca3266b4797369fb6317d3000000000000000000000000000000000000000000000000fffffffffffffebf190100000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000420000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a000000000000000000000000000000000000000800000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b831626ba7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c40000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff257001e1f7fbfc5bbde5da225c876ab67293f37bda3afb8b35d9a55dfad6f65d2203cb053e6b01ec07e87d67d288d360ae164171185684936663b7d8fa9c534c705db7ac401a8091bb37a7838ad73d1fa8e1c663cb345f347fefe71280e3f03bffffffffffff000000000000000000000000000000000000000000000000000083e0ca2c1392f14286fa1e41c797789d48c5827572e8bcc352d8943c1961eaf000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff000000000000000000000000000000ffffffa66ff5557b7dc1562bb5e83306e15b513a25aa7537369bce38fc29c20847a79100000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff23b872dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000e4adc0bf00000000000000000000000000000000000000000000000000000000eda71103000000000000000000000000000000000000000000000000000000009d36a979000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000800000000000000000e0d8d9ad73c586e8cf60ffd390b6f3654200a2d8857eb6abba4f6842a1210aae3f1df144000000000000000000000000000000000000000000000000000000001138edbff75f319641eb242dbcacee294ebc2a473eb6aa1454a7706da5bf96b0519973e7000000000000000000000000000000000000000000000000000000001f4ee59800000000000000000000000000000000000000000000000000000000f9c04f8b028fcfa3315ea5accaee4589194a685f07cda0392e6ba955070611190ec867d4f1b037422566cd0248bae620e6c142dcf5631948271916e8ca8dd263bf729bb1000000000000000000000000000000000000000000000000000000008e8cebe67607ce50a14a2e3261437f641a7b33ecc053e3d9c90b25ae5e66c65600000000000001000000000000000000000000000000000000000000000000008cbf875200000000000000000000000000000000000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000b9ff9815000000000000000000000000000000000000000000000000000000003b0a3343000000000000000000000000000000000000000000000000000000007f954ba1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff0000000000000000000000000001000000000000000000000000000000000000ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffb39d8f1e6f05413a407e46fc950eb92e9f5b3d65a47c3f0bdc7a2741a6ec0f7d9c615afab54584e53810beb24cced6ca36919dfc62bff2d4a0d244906c41c2ac9c6e8620d0004b9dd8b49560e2de8ced6f409f529cc23d0bb9e5a106d5c4324217c57023000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000021943c000000000000000000000000000000000000000000000000000000000fee142c500000000000000000000000000000000000000000000000000000000827aed80000000000000000000000000000000000000000000000000000000004722506e00000000000000000000000000000000000000000000000000000000fd2c901300000000000000000000000000000000000000000000000000000000cc47725a000000000000000000000000000000000000000000000000000000007a535da60000000000000000000000000000000000000000000000000000000073c919b500000000000000000000000000000000000000000000000000000000d979627300000000000000000000000000000000000000000000000000000000de7fafeb00000000000000000000000000000000000000000000000000000000e3fd7ac300000000000000000000000000000000000000000000000000000000b1ae736700000000000000000000000000000000000000000000000000000000bc8ea062000000000000000000000000000000000000000000000000000000001bb3460dffffffffffffffffffffffffffffffffffffffffffffffffffffffff1bb3460e0000000000000000000000000000000000000000000000000000000089a9c85500000000000000000000000000000000000000000000000000000000c05808340000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000004e680cb000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff2b635c88000000000000000000000000000000000000000000000000000000002a5cb1c300000000000000000000000000000000000000000000000000000000d73e63af00000000000000000000000000000000000000000000000000000000e03fe177bb050a40ea1b3ecd64121a3fa063a94b6d404b2f45c64697555efe0ece32f2aa00000000000000000000000000000000000000000000000000000000aca58aa000000000000000000000000000000000000000000000000000000000ef28f90100000000000000000000000000000000000000000000000000000000409e6e1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff400000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f000000000000000000000000000000000000000000000000ffffffffffffff200200000200000000000000000000000000000000000000000000000000000000f542e4f8e0ad687ae5fd5d9b4f1b5f4b431eaff792dc4646d330d31982a8bfb6
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000067985B1f8B613b57077bbDb24A5DEFCDDA458317000000000000000000000000dB8C854027A93F3f98300DE8ECcf4268De676160000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001d43726561746f72546f6b656e5472616e7366657256616c696461746f7200000000000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : defaultOwner (address): 0x67985B1f8B613b57077bbDb24A5DEFCDDA458317
Arg [1] : eoaRegistry_ (address): 0xdB8C854027A93F3f98300DE8ECcf4268De676160
Arg [2] : name (string): CreatorTokenTransferValidator
Arg [3] : version (string): 4
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000067985B1f8B613b57077bbDb24A5DEFCDDA458317
Arg [1] : 000000000000000000000000dB8C854027A93F3f98300DE8ECcf4268De676160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [5] : 43726561746f72546f6b656e5472616e7366657256616c696461746f72000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 3400000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.