Source Code
Overview
SOPH Balance
More Info
ContractCreator
Multichain Info
N/A
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704084 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704082 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH | ||||
704080 | 11 hrs ago | 0 SOPH |
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:
DynamicRewards
Compiler Version
v0.8.26+commit.8a97fa7a
ZkSolc Version
v1.5.6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "contracts/access/AccessControl.sol"; import "contracts/token/ERC20/IERC20.sol"; import "contracts/utils/ReentrancyGuard.sol"; import "contracts/utils/Pausable.sol"; import "contracts/interfaces/IReclaim.sol"; import "contracts/token/ERC20/utils/SafeERC20.sol"; /** * @title DynamicRewards * @dev A smart contract for managing social media post rewards with proof verification * * This contract enables a reward system for social media posts where users can claim rewards * by proving their ownership of specific posts using zkTLS. The system supports * both native tokens (ETH) and ERC20 tokens as rewards. * * Key Features: * - Dynamic limits for post IDsx and usernames * - Configurable bulk operation limits * - Support for both ETH and ERC20 token rewards * - zkTLS Proof-based verification using Reclaim Protocol * - Gas-optimized using bytes32 for storage * - Comprehensive event logging * - Role-based access control with admin capabilities * * Security Features: * - String length restrictions to prevent DOS attacks * - Role-based access control for administrative functions * - Proof verification for claiming rewards * - Reentrancy protection for all external calls * - Pausable functionality for emergencies * - Emergency withdrawal capability * - Custom error messages for better debugging */ contract DynamicRewards is AccessControl, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; // Role definition for admins bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 public constant REWARD_CREATOR_ROLE = keccak256("REWARD_CREATOR_ROLE"); // Dynamic limits that can be adjusted by the owner uint256 public maxPostIdLength; uint256 public maxUsernameLength; uint256 public maxBulkOperations; uint256 public defaultExpirationDuration; // Custom Errors for better gas efficiency and clearer error messages error EmptyPostId(); error ZeroAmount(); error PostIdAlreadyRewarded(); error NativeTokenNotNeeded(); error InsufficientContractBalance(); error NoRewardAvailable(); error RewardAlreadyClaimed(); error EmptyUsername(); error InvalidUsername(); error InvalidPostId(); error StringTooLong(); error RewardNotClaimable(); error ZeroAddress(); error EmptyArray(); error ArrayLengthMismatch(); error InvalidLength(); error ExceedsMaxBulkOperations(); error InvalidProofData(); error RewardExpired(); error InvalidExpiration(); error ProofVerificationFailed(); // New error for proof verification failure error UsernameVerificationFailed(); // New error for username verification failure /** * @dev Struct to store reward information * @param postId Original post ID for reference * @param username Username associated with the reward * @param token Address of the reward token (address(0) for ETH) * @param amount Amount of tokens to be rewarded * @param claimed Whether the reward has been claimed * @param claimable Whether the reward is still claimable (false if removed) * @param createdAt Timestamp when the reward was created * @param expiresAt Timestamp when the reward expires */ struct Reward { string postId; // Original post ID for reference string username; // Username associated with the reward address token; // Token address (address(0) for ETH) uint256 amount; // Amount of tokens to reward bool claimed; // Whether the reward has been claimed bool claimable; // Whether the reward is still claimable uint256 createdAt; // Timestamp when reward was created uint256 expiresAt; // Timestamp when reward expires } // STATE VARIABLES /// @dev Address of the Reclaim Protocol verifier contract for proof validation address public reclaimAddress; /// @dev Mapping from keccak256(postId) to reward information /// @notice Using bytes32 instead of string for gas optimization mapping(bytes32 => Reward) public postRewards; // EVENTS /// @dev Emitted when a new reward is added /// @param postIdHash Hash of the post ID for efficient indexing /// @param postId Original post ID for readability event RewardAdded( bytes32 indexed postIdHash, string postId, address indexed token, uint256 amount ); /// @dev Emitted when a reward is claimed /// @param postIdHash Hash of the post ID for efficient indexing /// @param postId Original post ID for readability event RewardClaimed( bytes32 indexed postIdHash, string postId, string username, address indexed token, uint256 amount ); /// @dev Emitted when Reclaim verifier address is updated event ReclaimAddressUpdated( address indexed oldAddress, address indexed newAddress ); /// @dev Emitted when a reward is removed event RewardRemoved(bytes32 indexed postIdHash, string postId); /// @dev Emitted when contract is paused/unpaused event ContractPaused(address indexed owner); event ContractUnpaused(address indexed owner); /// @dev Emitted when limits are updated event LimitsUpdated( uint256 maxPostIdLength, uint256 maxUsernameLength, uint256 maxBulkOperations ); event DefaultExpirationDurationUpdated(uint256 newDefaultExpirationDuration); /** * @dev Contract constructor * @param initialOwner Address to be set as contract owner * @param reclaimAddress_ Address of Reclaim Protocol verifier * @param initialMaxPostIdLength Initial maximum length for post IDs * @param initialMaxUsernameLength Initial maximum length for usernames * @param initialMaxBulkOperations Initial maximum number of bulk operations * @param initialDefaultExpirationDuration Initial default duration in seconds for reward expiration */ constructor( address initialOwner, address reclaimAddress_, uint256 initialMaxPostIdLength, uint256 initialMaxUsernameLength, uint256 initialMaxBulkOperations, uint256 initialDefaultExpirationDuration ) { if (initialOwner == address(0)) revert ZeroAddress(); if (reclaimAddress_ == address(0)) revert ZeroAddress(); if (initialMaxPostIdLength == 0) revert InvalidLength(); if (initialMaxUsernameLength == 0) revert InvalidLength(); if (initialMaxBulkOperations == 0) revert InvalidLength(); if (initialDefaultExpirationDuration == 0) revert InvalidLength(); _grantRole(DEFAULT_ADMIN_ROLE, initialOwner); _grantRole(ADMIN_ROLE, initialOwner); reclaimAddress = reclaimAddress_; maxPostIdLength = initialMaxPostIdLength; maxUsernameLength = initialMaxUsernameLength; maxBulkOperations = initialMaxBulkOperations; defaultExpirationDuration = initialDefaultExpirationDuration; } // granting and reworking roles functionality is inherited from AccessControl /** * @dev Updates the system limits * @notice This function allows the owner to adjust the maximum lengths and bulk operation limits * @param newMaxPostIdLength New maximum length for post IDs * @param newMaxUsernameLength New maximum length for usernames * @param newMaxBulkOperations New maximum number of bulk operations */ function updateLimits( uint256 newMaxPostIdLength, uint256 newMaxUsernameLength, uint256 newMaxBulkOperations ) external onlyRole(ADMIN_ROLE) { if (newMaxPostIdLength == 0) revert InvalidLength(); if (newMaxUsernameLength == 0) revert InvalidLength(); if (newMaxBulkOperations == 0) revert InvalidLength(); maxPostIdLength = newMaxPostIdLength; maxUsernameLength = newMaxUsernameLength; maxBulkOperations = newMaxBulkOperations; emit LimitsUpdated(newMaxPostIdLength, newMaxUsernameLength, newMaxBulkOperations); } function updateReclaimAddress(address newReclaimAddress) external onlyRole(ADMIN_ROLE) { if (newReclaimAddress == address(0)) revert ZeroAddress(); address oldAddress = reclaimAddress; reclaimAddress = newReclaimAddress; emit ReclaimAddressUpdated(oldAddress, newReclaimAddress); } function pause() external onlyRole(ADMIN_ROLE) { _pause(); emit ContractPaused(msg.sender); } function unpause() external onlyRole(ADMIN_ROLE) { _unpause(); emit ContractUnpaused(msg.sender); } /** * @dev Internal function to convert post ID to its hash * @param postId Original post ID * @return bytes32 Hash of the post ID */ function _postIdToHash(string calldata postId) internal pure returns (bytes32) { return keccak256(abi.encodePacked(postId)); } /** * @dev Internal function to add a new reward * @notice Handles both ETH and ERC20 token rewards * @param postId Unique identifier of the post * @param username Username associated with the post * @param token Address of reward token (address(0) for ETH) * @param amount Amount of tokens to reward * @param expirationTimestamp Timestamp when the reward expires */ function _addReward( string calldata postId, string calldata username, address token, uint256 amount, uint256 expirationTimestamp ) internal { if (amount == 0) revert ZeroAmount(); if (bytes(postId).length == 0) revert EmptyPostId(); if (bytes(username).length == 0) revert EmptyUsername(); if (bytes(postId).length > maxPostIdLength) revert StringTooLong(); if (bytes(username).length > maxUsernameLength) revert StringTooLong(); bytes32 postIdHash = _postIdToHash(postId); if (postRewards[postIdHash].amount != 0) revert PostIdAlreadyRewarded(); uint256 currentTime = block.timestamp; uint256 actualExpirationTimestamp; // If expiration is 0 or equal to creation time, use default duration if (expirationTimestamp == 0 || expirationTimestamp == currentTime) { actualExpirationTimestamp = currentTime + defaultExpirationDuration; } else { if (expirationTimestamp <= currentTime) revert InvalidExpiration(); actualExpirationTimestamp = expirationTimestamp; } // let SafeERC20 handle invalid tokens postRewards[postIdHash] = Reward({ postId: postId, username: username, token: token, amount: amount, claimed: false, claimable: true, createdAt: currentTime, expiresAt: actualExpirationTimestamp }); emit RewardAdded(postIdHash, postId, token, amount); } function addReward( string calldata postId, string calldata username, address token, uint256 amount, uint256 expirationTimestamp ) external onlyRole(REWARD_CREATOR_ROLE) whenNotPaused { _addReward(postId, username, token, amount, expirationTimestamp); } /** * @dev Adds multiple rewards in a single transaction * @notice This function optimizes gas usage for multiple reward additions * @param postIds Array of post IDs * @param usernames Array of usernames * @param tokens Array of token addresses * @param amounts Array of reward amounts * @param expirationTimestamps Array of expiration timestamps */ function addBulkRewards( string[] calldata postIds, string[] calldata usernames, address[] calldata tokens, uint256[] calldata amounts, uint256[] calldata expirationTimestamps ) external onlyRole(REWARD_CREATOR_ROLE) whenNotPaused { uint256 length = postIds.length; if (length == 0) revert EmptyArray(); if (length > maxBulkOperations) revert ExceedsMaxBulkOperations(); if (length != usernames.length || length != tokens.length || length != amounts.length || length != expirationTimestamps.length) revert ArrayLengthMismatch(); for (uint256 i = 0; i < length; i++) { _addReward(postIds[i], usernames[i], tokens[i], amounts[i], expirationTimestamps[i]); } } function removeReward( string calldata postId, bool withTransfer ) external onlyRole(ADMIN_ROLE) { bytes32 postIdHash = _postIdToHash(postId); Reward storage reward = postRewards[postIdHash]; if (reward.amount == 0) revert NoRewardAvailable(); if (reward.claimed) revert RewardAlreadyClaimed(); if (withTransfer) { IERC20(reward.token).safeTransfer(msg.sender, reward.amount); } reward.claimable = false; emit RewardRemoved(postIdHash, postId); } function removeBulkRewards( string[] calldata postIds, bool withTransfer ) external onlyRole(ADMIN_ROLE) { uint256 length = postIds.length; if (length == 0) revert EmptyArray(); if (length > maxBulkOperations) revert ExceedsMaxBulkOperations(); if (withTransfer) { address[] memory tokenAddresses = new address[](length); uint256[] memory tokenAmounts = new uint256[](length); uint256 tokenCount; for (uint256 i = 0; i < length; i++) { bytes32 postIdHash = _postIdToHash(postIds[i]); Reward storage reward = postRewards[postIdHash]; if (reward.amount == 0) revert NoRewardAvailable(); if (reward.claimed) revert RewardAlreadyClaimed(); if (!reward.claimable) revert RewardNotClaimable(); bool found = false; for (uint256 j = 0; j < tokenCount; j++) { if (tokenAddresses[j] == reward.token) { tokenAmounts[j] += reward.amount; found = true; break; } } if (!found) { tokenAddresses[tokenCount] = reward.token; tokenAmounts[tokenCount] = reward.amount; tokenCount++; } reward.claimable = false; } for (uint256 i = 0; i < tokenCount; i++) { IERC20(tokenAddresses[i]).safeTransfer(msg.sender, tokenAmounts[i]); } } else { for (uint256 i = 0; i < length; i++) { bytes32 postIdHash = _postIdToHash(postIds[i]); Reward storage reward = postRewards[postIdHash]; if (reward.amount == 0) revert NoRewardAvailable(); if (reward.claimed) revert RewardAlreadyClaimed(); if (!reward.claimable) revert RewardNotClaimable(); reward.claimable = false; } } for (uint256 i = 0; i < length; i++) { emit RewardRemoved(_postIdToHash(postIds[i]), postIds[i]); } } /** * @dev Claims a reward for a social media post * @notice Verifies proof using Reclaim Protocol before processing claim * @param postId ID of the post to claim reward for * @param username Username of the claimer * @param proof Proof of post ownership from Reclaim Protocol */ function claimReward( string calldata postId, string calldata username, IReclaim.Proof memory proof ) external nonReentrant whenNotPaused { if (bytes(proof.claimInfo.context).length == 0) revert InvalidProofData(); // Try to verify the proof, revert with custom error if it fails try IReclaim(reclaimAddress).verifyProof(proof) { bytes32 postIdHash = _postIdToHash(postId); Reward storage reward = postRewards[postIdHash]; if (reward.amount == 0) revert NoRewardAvailable(); if (reward.claimed) revert RewardAlreadyClaimed(); if (!reward.claimable) revert RewardNotClaimable(); if (block.timestamp > reward.expiresAt) revert RewardExpired(); // Extract and verify username string memory proofUsername; try IReclaim(reclaimAddress).extractFieldFromContext( proof.claimInfo.context, '"screen_name":"' ) returns (string memory extractedUsername) { proofUsername = extractedUsername; } catch { revert UsernameVerificationFailed(); } if (keccak256(abi.encodePacked(reward.postId)) != keccak256(abi.encodePacked(postId))) revert InvalidPostId(); if (keccak256(abi.encodePacked(reward.username)) != keccak256(abi.encodePacked(username)) || keccak256(abi.encodePacked(proofUsername)) != keccak256(abi.encodePacked(username))) { revert InvalidUsername(); } reward.claimed = true; IERC20(reward.token).safeTransfer(msg.sender, reward.amount); emit RewardClaimed(postIdHash, postId, username, reward.token, reward.amount); } catch { revert ProofVerificationFailed(); } } function getReward( string calldata postId ) external view returns (Reward memory) { return postRewards[_postIdToHash(postId)]; } /** * @dev Emergency withdrawal function * @notice Allows owner to withdraw tokens in case of emergency * @param token Address of token to withdraw (address(0) for ETH) * @param amount Amount to withdraw */ function emergencyWithdraw( IERC20 token, uint256 amount ) external onlyRole(ADMIN_ROLE) { token.safeTransfer(msg.sender, amount); } /** * @dev Updates the default expiration duration * @param newDefaultExpirationDuration New default duration in seconds */ function updateDefaultExpirationDuration(uint256 newDefaultExpirationDuration) external onlyRole(ADMIN_ROLE) { if (newDefaultExpirationDuration == 0) revert InvalidLength(); defaultExpirationDuration = newDefaultExpirationDuration; emit DefaultExpirationDurationUpdated(newDefaultExpirationDuration); } /// @dev disAllows contract to receive SOPH receive() external payable { revert NativeTokenNotNeeded(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "contracts/access/IAccessControl.sol"; import {Context} from "contracts/utils/Context.sol"; import {ERC165} from "contracts/utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "contracts/utils/introspection/IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "contracts/utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; interface IReclaim { struct CompleteClaimData { bytes32 identifier; address owner; uint32 timestampS; uint32 epoch; } struct ClaimInfo { string provider; string parameters; string context; } struct SignedClaim { CompleteClaimData claim; bytes[] signatures; } struct Proof { ClaimInfo claimInfo; SignedClaim signedClaim; } function verifyProof(Proof memory proof) external view; function extractFieldFromContext( string memory data, string memory target ) external pure returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "contracts/token/ERC20/IERC20.sol"; import {IERC20Permit} from "contracts/token/ERC20/extensions/IERC20Permit.sol"; import {Address} from "contracts/utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
{ "evmVersion": "shanghai", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "DynamicRewards.sol": {} }, "remappings": [ "@openzeppelin=./node_modules/@openzeppelin", "OpenZeppelin=C:/Users/tomcb/.brownie/packages/OpenZeppelin", "paulrberg=C:/Users/tomcb/.brownie/packages/paulrberg" ], "metadata": { "appendCBOR": false, "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "abi" ] } } }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"reclaimAddress_","type":"address"},{"internalType":"uint256","name":"initialMaxPostIdLength","type":"uint256"},{"internalType":"uint256","name":"initialMaxUsernameLength","type":"uint256"},{"internalType":"uint256","name":"initialMaxBulkOperations","type":"uint256"},{"internalType":"uint256","name":"initialDefaultExpirationDuration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"EmptyArray","type":"error"},{"inputs":[],"name":"EmptyPostId","type":"error"},{"inputs":[],"name":"EmptyUsername","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExceedsMaxBulkOperations","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientContractBalance","type":"error"},{"inputs":[],"name":"InvalidExpiration","type":"error"},{"inputs":[],"name":"InvalidLength","type":"error"},{"inputs":[],"name":"InvalidPostId","type":"error"},{"inputs":[],"name":"InvalidProofData","type":"error"},{"inputs":[],"name":"InvalidUsername","type":"error"},{"inputs":[],"name":"NativeTokenNotNeeded","type":"error"},{"inputs":[],"name":"NoRewardAvailable","type":"error"},{"inputs":[],"name":"PostIdAlreadyRewarded","type":"error"},{"inputs":[],"name":"ProofVerificationFailed","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RewardAlreadyClaimed","type":"error"},{"inputs":[],"name":"RewardExpired","type":"error"},{"inputs":[],"name":"RewardNotClaimable","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"StringTooLong","type":"error"},{"inputs":[],"name":"UsernameVerificationFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDefaultExpirationDuration","type":"uint256"}],"name":"DefaultExpirationDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPostIdLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxUsernameLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBulkOperations","type":"uint256"}],"name":"LimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"ReclaimAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"postIdHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"postId","type":"string"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"postIdHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"postId","type":"string"},{"indexed":false,"internalType":"string","name":"username","type":"string"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"postIdHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"postId","type":"string"}],"name":"RewardRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_CREATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"postIds","type":"string[]"},{"internalType":"string[]","name":"usernames","type":"string[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"expirationTimestamps","type":"uint256[]"}],"name":"addBulkRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"postId","type":"string"},{"internalType":"string","name":"username","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expirationTimestamp","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"postId","type":"string"},{"internalType":"string","name":"username","type":"string"},{"components":[{"components":[{"internalType":"string","name":"provider","type":"string"},{"internalType":"string","name":"parameters","type":"string"},{"internalType":"string","name":"context","type":"string"}],"internalType":"struct IReclaim.ClaimInfo","name":"claimInfo","type":"tuple"},{"components":[{"components":[{"internalType":"bytes32","name":"identifier","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"timestampS","type":"uint32"},{"internalType":"uint32","name":"epoch","type":"uint32"}],"internalType":"struct IReclaim.CompleteClaimData","name":"claim","type":"tuple"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"internalType":"struct IReclaim.SignedClaim","name":"signedClaim","type":"tuple"}],"internalType":"struct IReclaim.Proof","name":"proof","type":"tuple"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultExpirationDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"postId","type":"string"}],"name":"getReward","outputs":[{"components":[{"internalType":"string","name":"postId","type":"string"},{"internalType":"string","name":"username","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"claimable","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"internalType":"struct DynamicRewards.Reward","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBulkOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPostIdLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUsernameLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"postRewards","outputs":[{"internalType":"string","name":"postId","type":"string"},{"internalType":"string","name":"username","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"claimable","type":"bool"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reclaimAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"postIds","type":"string[]"},{"internalType":"bool","name":"withTransfer","type":"bool"}],"name":"removeBulkRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"postId","type":"string"},{"internalType":"bool","name":"withTransfer","type":"bool"}],"name":"removeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDefaultExpirationDuration","type":"uint256"}],"name":"updateDefaultExpirationDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPostIdLength","type":"uint256"},{"internalType":"uint256","name":"newMaxUsernameLength","type":"uint256"},{"internalType":"uint256","name":"newMaxBulkOperations","type":"uint256"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReclaimAddress","type":"address"}],"name":"updateReclaimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000595d6531a370b530cfb0145cd32db533c7f15dd887e862192a335f55706000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000078ae12562527b865dd1a06784a2b06dbe1a3c7af000000000000000000000000760de1fed5889052a2c01ea7823d930060d4af4d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode
0x0004000000000002001600000000000200000000030200190000006004100270000005130240019700030000002103550002000000010355000005130040019d00000001003001900000002b0000c13d0000008003000039000000400030043f000000040020008c000000e60000413d000000000301043b000000e003300270000005210030009c000000ec0000213d000005350030009c000001090000213d0000053f0030009c000001410000a13d000005400030009c000002fb0000213d000005430030009c000003a50000613d000005440030009c00000f400000c13d000000240020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000401100370000000000101043b14470fd00000040f000000400200043d0000000000120435000005130020009c0000051302008041000000400120021000000581011001c7000014480001042e0000000003000416000000000003004b00000f400000c13d0000001f0320003900000514033001970000008003300039000000400030043f0000001f0420018f000005150520019800000080035000390000003c0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000036004b000000380000c13d000000000004004b000000490000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000c00020008c00000f400000413d000000800800043d000005160080009c00000f400000213d000000a00500043d000005160050009c00000f400000213d000001200300043d000001000400043d000000e00600043d000000c00700043d0000000101000039000000000011041b0000000201000039000000000201041a0000058502200197000000000021041b000000000008004b0000013d0000613d000000000005004b0000013d0000613d000000000007004b000006a60000613d000000000006004b000006a60000613d000000000004004b000006a60000613d000000000003004b000006a60000613d000f00000007001d001000000006001d001100000004001d001200000003001d000000000080043f0000051701000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039001300000005001d001400000008001d144714420000040f0000001403000029000000010020019000000f400000613d000000000101043b000000000101041a000000ff001001900000009e0000c13d000000000030043f0000051701000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f0000001406000029000000010020019000000f400000613d000000000101043b000000000201041a000005850220019700000001022001bf000000000021041b0000000001000414000005130010009c0000051301008041000000c00110021000000519011001c70000800d02000039000000040300003900000000070004110000051a0400004100000000050000191447143d0000040f0000001403000029000000010020019000000f400000613d000000000030043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000014040000290000001303000029000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000000d00000c13d000000000040043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f0000001406000029000000010020019000000f400000613d000000000101043b000000000201041a000005850220019700000001022001bf000000000021041b0000000001000414000005130010009c0000051301008041000000c00110021000000519011001c70000800d02000039000000040300003900000000070004110000051a040000410000051c050000411447143d0000040f0000001303000029000000010020019000000f400000613d0000000701000039000000000201041a0000051d02200197000000000232019f000000000021041b00000003010000390000000f02000029000000000021041b00000004010000390000001002000029000000000021041b00000005010000390000001102000029000000000021041b00000006010000390000001202000029000000000021041b0000002001000039000001000010044300000120000004430000051e01000041000014480001042e000000000002004b00000f400000c13d0000051f01000041000000000010043f00000520010000410000144900010430000005220030009c000001160000213d0000052c0030009c0000014c0000a13d0000052d0030009c000003410000213d000005300030009c000003ad0000613d000005310030009c00000f400000c13d000000440020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000401100370000000000101043b001400000001001d000005160010009c00000f400000213d144710420000040f00000024010000390000000201100367000000000301043b00000000020004110000001401000029144713800000040f0000000001000019000014480001042e000005360030009c000001910000a13d000005370030009c0000034b0000213d0000053a0030009c000003c50000613d0000053b0030009c00000f400000c13d0000000001000416000000000001004b00000f400000c13d0000000501000039000003a90000013d000005230030009c0000019c0000a13d000005240030009c000003560000213d000005270030009c000003e20000613d000005280030009c00000f400000c13d000000240020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000401100370000000000101043b001400000001001d000005160010009c00000f400000213d00000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000005ef0000613d00000014010000290000051606100198000006e10000c13d0000054f01000041000000000010043f00000520010000410000144900010430000005450030009c000005f70000613d000005460030009c0000054b0000613d000005470030009c00000f400000c13d0000000001000416000000000001004b00000f400000c13d0000000301000039000003a90000013d000005320030009c000006820000613d000005330030009c0000055c0000613d000005340030009c00000f400000c13d000000440020008c00000f400000413d0000000003000416000000000003004b00000f400000c13d0000000403100370000000000303043b001200000003001d000005480030009c00000f400000213d00000012030000290000002303300039000000000023004b00000f400000813d00000012030000290000000403300039000000000331034f000000000303043b001100000003001d000005480030009c00000f400000213d0000001203000029000000240430003900000011030000290000000503300210001400000004001d001300000003001d0000000003430019000000000023004b00000f400000213d0000002401100370000000000201043b000000000002004b0000000001000039000000010100c039001000000002001d000000000012004b00000f400000c13d00000000010004110000051601100197000900000001001d000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000005ef0000613d000000110000006b000007370000c13d0000058001000041000000000010043f000005200100004100001449000104300000053c0030009c000006890000613d0000053d0030009c000005930000613d0000053e0030009c00000f400000c13d0000000001000416000000000001004b00000f400000c13d0000000401000039000003a90000013d000005290030009c0000069a0000613d0000052a0030009c000005d50000613d0000052b0030009c00000f400000c13d000000640020008c00000f400000413d0000000003000416000000000003004b00000f400000c13d0000000403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000441034f000000000404043b001400000004001d000005480040009c00000f400000213d0000002404300039001300000004001d0000001403400029000000000023004b00000f400000213d0000002403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000441034f000000000404043b001200000004001d000005480040009c00000f400000213d0000002404300039001100000004001d0000001203400029000000000023004b00000f400000213d0000004403100370000000000303043b000005480030009c00000f400000213d0000000004320049000005500040009c00000f400000213d000000440040008c00000f400000413d000000c004000039000000400040043f0000000405300039000000000551034f000000000505043b000005480050009c00000f400000213d00000000053500190000000006520049000005500060009c00000f400000213d000000640060008c00000f400000413d0000012006000039000000400060043f0000000407500039000000000871034f000000000808043b000005480080009c00000f400000213d000000000a5800190000002308a00039000000000028004b00000f400000813d0000000409a00039000000000891034f000000000808043b000005480080009c00000f420000213d0000001f0b800039000005860bb001970000003f0bb00039000005860bb001970000055100b0009c00000f420000213d000000240aa00039000001200bb000390000004000b0043f000001200080043f000000000aa8001900000000002a004b00000f400000213d0000002009900039000000000a91034f000005860b8001980000001f0c80018f0000014009b000390000020a0000613d000001400d000039000000000e0a034f00000000ef0e043c000000000dfd043600000000009d004b000002060000c13d00000000000c004b000002170000613d000000000aba034f000000030bc00210000000000c090433000000000cbc01cf000000000cbc022f000000000a0a043b000001000bb00089000000000aba022f000000000aba01cf000000000aca019f0000000000a9043500000140088000390000000000080435000000c00060043f0000002006700039000000000761034f000000000707043b000005480070009c00000f400000213d00000000095700190000002307900039000000000027004b00000f400000813d000000040a9000390000000007a1034f000000000707043b000005480070009c00000f420000213d0000001f0870003900000586088001970000003f08800039000005860b800197000000400800043d000000000bb8001900000000008b004b000000000c000039000000010c0040390000054800b0009c00000f420000213d0000000100c0019000000f420000c13d000000240c9000390000004000b0043f0000000009780436000000000bc7001900000000002b004b00000f400000213d000000200aa000390010000000a10353000005860c7001980000001f0d70018f000000000ac90019000002470000613d000000100e00035f000000000f09001900000000eb0e043c000000000fbf04360000000000af004b000002430000c13d00000000000d004b000002540000613d000000100bc0035f000000030cd00210000000000d0a0433000000000dcd01cf000000000dcd022f000000000b0b043b000001000cc00089000000000bcb022f000000000bcb01cf000000000bdb019f0000000000ba043500000000077900190000000000070435000000e00080043f0000002006600039000000000661034f000000000606043b000005480060009c00000f400000213d00000000075600190000002305700039000000000025004b00000f400000813d0000000408700039000000000581034f000000000505043b000005480050009c00000f420000213d0000001f0650003900000586066001970000003f066000390000058609600197000000400600043d0000000009960019000000000069004b000000000a000039000000010a004039000005480090009c00000f420000213d0000000100a0019000000f420000c13d000000240a700039000000400090043f00000000075604360000000009a50019000000000029004b00000f400000213d0000002008800039000000000981034f000005860a5001980000001f0b50018f0000000008a70019000002840000613d000000000c09034f000000000d07001900000000ce0c043c000000000ded043600000000008d004b000002800000c13d00000000000b004b000002910000613d0000000009a9034f000000030ab00210000000000b080433000000000bab01cf000000000bab022f000000000909043b000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f000000000098043500000000055700190000000000050435000001000060043f000000800040043f0000002404300039000000000441034f000000000404043b000005480040009c00000f400000213d00000000053400190000000003520049000005500030009c00000f400000213d000000a40030008c00000f400000413d000000400300043d001000000003001d000005520030009c00000f420000213d00000010030000290000004004300039000000400040043f000005530030009c00000f420000213d0000001003000029000000c006300039000000400060043f0000000406500039000000000661034f000000000606043b00000000006404350000002406500039000000000761034f000000000707043b000005160070009c00000f400000213d0000001003000029000000600830003900000000007804350000002006600039000000000761034f000000000707043b000005130070009c00000f400000213d0000001003000029000000800830003900000000007804350000002006600039000000000761034f000000000707043b000005130070009c00000f400000213d00000010030000290000000004430436000f00000004001d000000a00430003900000000007404350000002004600039000000000441034f000000000404043b000005480040009c00000f400000213d00000000075400190000002304700039000000000024004b00000f400000813d0000000405700039000000000451034f000000000904043b000005480090009c00000f420000213d00000005089002100000003f048000390000055404400197000000400300043d0000000006430019000e00000003001d000000000036004b00000000040000390000000104004039000005480060009c00000f420000213d000000010040019000000f420000c13d000000400060043f0000000e03000029000000000093043500000024077000390000000008780019000000000028004b00000f400000213d000000000009004b00000aee0000c13d0000000f010000290000000e0200002900000000002104350000001001000029000000a00010043f0000000101000039000000000101041a000000020010008c00000b390000c13d0000056701000041000000000010043f00000520010000410000144900010430000005410030009c000003f60000613d000005420030009c00000f400000c13d000000440020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000402100370000000000202043b001400000002001d0000002401100370000000000101043b001300000001001d000005160010009c00000f400000213d0000001401000029000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b0000000101100039000000000101041a001200000001001d000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b00000000020004110000051602200197000000000020043f000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000006f00000c13d0000054c01000041000000000010043f0000000001000411000000040010043f0000001201000029000000240010043f0000054d0100004100001449000104300000052e0030009c0000047c0000613d0000052f0030009c00000f400000c13d0000000001000416000000000001004b00000f400000c13d000000800000043f0000056901000041000014480001042e000005380030009c000004b90000613d000005390030009c00000f400000c13d0000000001000416000000000001004b00000f400000c13d0000051c01000041000000800010043f0000056901000041000014480001042e000005250030009c000004c40000613d000005260030009c00000f400000c13d000000240020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000401100370000000000101043b000000000010043f0000000801000039000000200010043f00000040020000390000000001000019144714280000040f001400000001001d14470f830000040f000f00000001001d0000001401000029000000010110003914470f830000040f00000014030000290000000202300039000000000202041a001300000002001d0000000302300039000000000202041a001200000002001d0000000402300039000000000202041a001100000002001d0000000502300039000000000202041a001000000002001d0000000602300039000000000202041a000e00000002001d0000010002000039000000400300043d001400000003001d0000000002230436000c00000002001d000d00000001001d00000100023000390000000f0100002914470f660000040f0000000002010019000000140120006a0000000c0300002900000000001304350000000d0100002914470f660000040f0000001404000029000000e0024000390000000e030000290000000000320435000000c0024000390000001003000029000000000032043500000011050000290000ff00005001900000000002000039000000010200c039000000a0034000390000000000230435000000ff005001900000000002000039000000010200c03900000080034000390000000000230435000000600240003900000012030000290000000000320435000000130200002900000516022001970000004003400039000006780000013d0000000001000416000000000001004b00000f400000c13d0000000601000039000000000101041a000000800010043f0000056901000041000014480001042e000000440020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000002402100370000000000202043b001400000002001d000005160020009c00000f400000213d0000000401100370000000000101043b000000000010043f000000200000043f00000040020000390000000001000019144714280000040f0000001402000029000000000020043f000000200010043f00000000010000190000004002000039144714280000040f000004bd0000013d0000000001000416000000000001004b00000f400000c13d00000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000005ef0000613d0000000201000039000000000201041a000000ff00200190000006ae0000c13d0000057701000041000000000010043f00000520010000410000144900010430000000440020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000002402100370000000000202043b001400000002001d000005160020009c00000f400000213d0000000401100370000000000101043b001300000001001d14470fd00000040f1447105f0000040f00000013010000290000001402000029144713310000040f0000000001000019000014480001042e000000a40020008c00000f400000413d0000000003000416000000000003004b00000f400000c13d0000000403100370000000000303043b001400000003001d000005480030009c00000f400000213d00000014030000290000002303300039000000000023004b00000f400000813d00000014030000290000000403300039000000000331034f000000000303043b001300000003001d000005480030009c00000f400000213d0000001403000029001200240030003d000000130300002900000005033002100000001203300029000000000023004b00000f400000213d0000002403100370000000000303043b001100000003001d000005480030009c00000f400000213d00000011030000290000002303300039000000000023004b00000f400000813d00000011030000290000000403300039000000000331034f000000000303043b001000000003001d000005480030009c00000f400000213d0000001103000029000f00240030003d000000100300002900000005033002100000000f03300029000000000023004b00000f400000213d0000004403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000441034f000000000404043b000b00000004001d000005480040009c00000f400000213d000e00240030003d0000000b0300002900000005033002100000000e03300029000000000023004b00000f400000213d0000006403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000441034f000000000404043b000a00000004001d000005480040009c00000f400000213d000d00240030003d0000000a0300002900000005033002100000000d03300029000000000023004b00000f400000213d0000008403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000141034f000000000101043b000900000001001d000005480010009c00000f400000213d000c00240030003d000000090100002900000005011002100000000c01100029000000000021004b00000f400000213d00000000010004110000051601100197000000000010043f0000057c01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff0010019000000a560000c13d0000054c01000041000000000010043f0000000001000411000000040010043f0000057401000041000000240010043f0000054d010000410000144900010430000000a40020008c00000f400000413d0000000003000416000000000003004b00000f400000c13d0000000403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000441034f000000000404043b001400000004001d000005480040009c00000f400000213d0000002404300039001300000004001d0000001403400029000000000023004b00000f400000213d0000002403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d0000000404300039000000000441034f000000000404043b001200000004001d000005480040009c00000f400000213d0000002404300039001100000004001d0000001203400029000000000023004b00000f400000213d0000004401100370000000000101043b001000000001001d000005160010009c00000f400000213d144710250000040f144710890000040f00000002010003670000006402100370000000000602043b0000008401100370000000000701043b00000013010000290000001402000029000000110300002900000012040000290000001005000029144710920000040f0000000001000019000014480001042e0000000001000416000000000001004b00000f400000c13d0000000201000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f0000056901000041000014480001042e000000440020008c00000f400000413d0000000003000416000000000003004b00000f400000c13d0000000403100370000000000303043b000005480030009c00000f400000213d0000002304300039000000000024004b00000f400000813d001300040030003d0000001304100360000000000404043b001400000004001d000005480040009c00000f400000213d00000014033000290000002403300039000000000023004b00000f400000213d0000002401100370000000000201043b000000000002004b0000000001000039000000010100c039001200000002001d000000000012004b00000f400000c13d00000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000005ef0000613d0000001401000029001105860010019c0000001f0810018f000000400100043d0000002002100039000000110320002900000013040000290000002004400039001000000004001d0000000204400367000005050000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000036004b000005010000c13d000000000008004b000005120000613d00000011044003600000000305800210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435001300000008001d00000014040000290000000003420019000000000003043500000000004104350000003f0340003900000586033001970000000003310019000000000013004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f000005130020009c000005130200804100000040022002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000f00000001001d000000000010043f0000000801000039000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b0000000302100039000000000302041a000000000003004b000009740000c13d0000057101000041000000000010043f00000520010000410000144900010430000000240020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000401100370000000000101043b000005820010019800000f400000c13d000005830010009c00000000020000390000000102006039000005840010009c00000001022061bf000000800020043f0000056901000041000014480001042e0000000001000416000000000001004b00000f400000c13d00000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000005ef0000613d0000000201000039000000000201041a000000ff0020019000000b490000c13d000005850220019700000001022001bf000000000021041b000000400100043d00000000020004110000000000210435000005130010009c000005130100804100000040011002100000000002000414000005130020009c0000051302008041000000c002200210000000000112019f0000055f011001c70000800d02000039000000010300003900000572040000411447143d0000040f000000010020019000000f400000613d0000000001000414000005130010009c0000051301008041000000c00110021000000519011001c70000800d0200003900000002030000390000057304000041000006ca0000013d000000640020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000004402100370000000000202043b001300000002001d0000002402100370000000000202043b001400000002001d0000000401100370000000000101043b001200000001001d00000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000005ef0000613d0000001205000029000000000005004b00000014030000290000001304000029000006a60000613d000000000003004b000006a60000613d000000000004004b000006a60000613d0000000301000039000000000051041b0000000401000039000000000031041b0000000501000039000000000041041b000000400100043d00000040021000390000000000420435000000200210003900000000003204350000000000510435000005130010009c000005130100804100000040011002100000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000578011001c70000800d0200003900000001030000390000057904000041000006dc0000013d000000240020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000000401100370000000000101043b001400000001001d00000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000006a30000c13d0000054c01000041000000000010043f0000000001000411000000040010043f0000051c01000041000000240010043f0000054d010000410000144900010430000000240020008c00000f400000413d0000000003000416000000000003004b00000f400000c13d0000000401100370000000000101043b000005480010009c00000f400000213d000000040110003914470f4c0000040f0000018003000039000000400030043f0000006003000039000000800030043f000000a00030043f000000c00000043f000000e00000043f000001000000043f000001200000043f000001400000043f000001600000043f14470fe10000040f000000000010043f0000000801000039000000200010043f00000040020000390000000001000019144714280000040f001400000001001d000000400100043d001200000001001d14470f780000040f000000140100002914470f830000040f00000012020000290000000001120436001300000001001d0000001401000029000000010110003914470f830000040f0000001302000029000000000012043500000014050000290000000201500039000000000101041a000005160110019700000012030000290000004002300039001100000002001d00000000001204350000000301500039000000000101041a0000006002300039001000000002001d00000000001204350000000401500039000000000101041a000000ff001001900000000002000039000000010200c0390000008004300039000c00000004001d00000000002404350000ff00001001900000000001000039000000010100c039000000a002300039000e00000002001d00000000001204350000000501500039000000000101041a000000c002300039000f00000002001d00000000001204350000000601500039000000000101041a000000e002300039000d00000002001d00000000001204350000002001000039000000400400043d001400000004001d0000000002140436000000000103043300000100030000390000000000320435000001200240003914470f660000040f000000000201001900000014040000290000000001410049000000200310008a000000130100002900000000010104330000004004400039000000000034043514470f660000040f00000011020000290000000002020433000005160220019700000014040000290000006003400039000000000023043500000010020000290000000002020433000000800340003900000000002304350000000c020000290000000002020433000000000002004b0000000002000039000000010200c039000000a00340003900000000002304350000000e020000290000000002020433000000000002004b0000000002000039000000010200c039000000c00340003900000000002304350000000f020000290000000002020433000000e00340003900000000002304350000000d020000290000000002020433000001000340003900000000002304350000000001410049000005130040009c00000513040080410000004002400210000005130010009c00000513010080410000006001100210000000000121019f000014480001042e0000000001000416000000000001004b00000f400000c13d0000057401000041000000800010043f0000056901000041000014480001042e000000440020008c00000f400000413d0000000002000416000000000002004b00000f400000c13d0000002402100370000000000302043b000005160030009c00000f400000213d0000000002000411000000000023004b000006aa0000c13d0000000401100370000000000101043b144713310000040f0000000001000019000014480001042e0000000001000416000000000001004b00000f400000c13d0000000701000039000000000101041a0000051601100197000000800010043f0000056901000041000014480001042e0000001402000029000000000002004b000006cc0000c13d0000057a01000041000000000010043f000005200100004100001449000104300000057b01000041000000000010043f000005200100004100001449000104300000058502200197000000000021041b000000400100043d00000000020004110000000000210435000005130010009c000005130100804100000040011002100000000002000414000005130020009c0000051302008041000000c002200210000000000112019f0000055f011001c70000800d02000039000000010300003900000575040000411447143d0000040f000000010020019000000f400000613d0000000001000414000005130010009c0000051301008041000000c00110021000000519011001c70000800d02000039000000020300003900000576040000410000000005000411000006dc0000013d0000000601000039000000000021041b000000400100043d0000000000210435000005130010009c000005130100804100000040011002100000000002000414000005130020009c0000051302008041000000c002200210000000000112019f0000055f011001c70000800d02000039000000010300003900000568040000411447143d0000040f000000010020019000000f400000613d0000000001000019000014480001042e0000000701000039000000000201041a0000051d03200197000000000363019f000000000031041b00000000010004140000051605200197000005130010009c0000051301008041000000c00110021000000519011001c70000800d0200003900000003030000390000054e04000041000006dc0000013d0000001401000029000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b0000001302000029000000000020043f000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000101041a000000ff00100190000006df0000c13d0000001401000029000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b0000001302000029000000000020043f000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000201041a000005850220019700000001022001bf000000000021041b0000000001000414000005130010009c0000051301008041000000c00110021000000519011001c70000800d0200003900000004030000390000051a04000041000000140500002900000013060000290000000007000411000006dc0000013d0000000501000039000000000101041a000000110010006b0000073f0000a13d0000057f01000041000000000010043f00000520010000410000144900010430000000100000006b0000088a0000c13d0000000002000019001300000002001d000000050120021000000014011000290000000202000367000000000112034f000000000101043b0000000003000031000000120430006a000000430440008a00000555054001970000055506100197000000000756013f000000000056004b00000000050000190000055505004041000000000041004b00000000040000190000055504008041000005550070009c000000000504c019000000000005004b00000f400000c13d0000001404100029000000000142034f000000000101043b000005480010009c00000f400000213d0000000005130049000000200340003900000555045001970000055506300197000000000746013f000000000046004b00000000040000190000055504004041000000000053004b00000000050000190000055505002041000005550070009c000000000405c019000000000004004b00000f400000c13d000000000532034f0000058606100198000000400200043d00000020032000390000000004630019000007780000613d000000000705034f0000000008030019000000007907043c0000000008980436000000000048004b000007740000c13d0000001f07100190000007850000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000004130019000000000004043500000000001204350000003f0110003900000586011001970000000001120019000000000021004b00000000040000390000000104004039000005480010009c00000f420000213d000000010040019000000f420000c13d000000400010043f000005130030009c000005130300804100000040013002100000000002020433000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000010043f0000000801000039000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b0000000302100039000000000202041a000000000002004b000005470000613d0000000401100039000000000201041a000000ff0020019000000c550000c13d0000ff000020019000000c510000613d0000058702200197000000000021041b00000013020000290000000102200039000000110020006c000007420000413d001300000000001d00000013010000290000000501100210000000140a10002900000002020003670000000001a2034f000000000101043b0000000003000031000000120430006a000000430440008a00000555054001970000055506100197000000000756013f000000000056004b00000000050000190000055505004041000000000041004b00000000040000190000055504008041000005550070009c000000000504c019000000000005004b00000f400000c13d0000001404100029000000000142034f000000000101043b000005480010009c00000f400000213d0000000005130049000000200340003900000555045001970000055506300197000000000746013f000000000046004b00000000040000190000055504004041000000000053004b00000000050000190000055505002041000005550070009c000000000405c019000000000004004b00000f400000c13d000000000532034f0000058606100198000000400200043d00000020032000390000000004630019000007fa0000613d000000000705034f0000000008030019000000007907043c0000000008980436000000000048004b000007f60000c13d0000001f07100190000008070000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000054043500100000000a001d0000000004130019000000000004043500000000001204350000003f0110003900000586011001970000000001120019000000000021004b00000000040000390000000104004039000005480010009c00000f420000213d000000010040019000000f420000c13d000000400010043f000005130030009c000005130300804100000040013002100000000002020433000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f0000000100200190000000100300002900000f400000613d0000000202000367000000000332034f000000000403043b0000000003000031000000120530006a000000430550008a00000555065001970000055507400197000000000867013f000000000067004b00000000060000190000055506004041000000000054004b00000000050000190000055505008041000005550080009c000000000605c019000000000501043b000000000006004b00000f400000c13d0000001404400029000000000142034f000000000101043b000005480010009c00000f400000213d0000000006130049000000200340003900000555046001970000055507300197000000000847013f000000000047004b00000000040000190000055504004041000000000063004b00000000060000190000055506002041000005550080009c000000000406c019000000000004004b00000f400000c13d000000000632034f000000400200043d000000200300003900000000033204360000000000130435000005860710019800000040032000390000000004730019000008600000613d000000000806034f0000000009030019000000008a08043c0000000009a90436000000000049004b0000085c0000c13d0000001f081001900000086d0000613d000000000676034f0000000307800210000000000804043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000640435000000000313001900000000000304350000001f011000390000058601100197000005490010009c00000549010080410000006001100210000005130020009c00000513020080410000004002200210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000121019f0000054a0110009a0000800d0200003900000002030000390000054b040000411447143d0000040f000000010020019000000f400000613d00000013020000290000000102200039001300000002001d000000110020006c000007c40000413d000006df0000013d00000013010000290000003f011000390000055403100197000000400200043d0000000001320019000f00000002001d000000000021004b00000000020000390000000102004039000005480010009c00000f420000213d000000010020019000000f420000c13d000000400010043f00000011010000290000000f020000290000000001120436000e00000001001d00000013040000290000001f0140018f00000000020000310000000202200367000000000004004b000008a90000613d0000000e060000290000001304600029000000000502034f000000005705043c0000000006760436000000000046004b000008a50000c13d000000000001004b000000400400043d0000000003340019000d00000004001d000000000043004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f00000011030000290000000d040000290000000003340436000c00000003001d000000130000006b000008c10000613d0000000c040000290000001303400029000000002502043c0000000004540436000000000034004b000008bd0000c13d000000000001004b0000000002000019001300000000001d000008cf0000013d0000000c045000290000000000340435000000010aa0003900130000000a001d0000058702200197000000000021041b00000010020000290000000102200039000000110020006c000009bc0000813d001000000002001d000000050120021000000014011000290000000202000367000000000112034f000000000101043b0000000003000031000000120430006a000000430440008a00000555054001970000055506100197000000000756013f000000000056004b00000000050000190000055505004041000000000041004b00000000040000190000055504008041000005550070009c000000000504c019000000000005004b00000f400000c13d0000001404100029000000000142034f000000000101043b000005480010009c00000f400000213d0000000005130049000000200340003900000555045001970000055506300197000000000746013f000000000046004b00000000040000190000055504004041000000000053004b00000000050000190000055505002041000005550070009c000000000405c019000000000004004b00000f400000c13d000000000532034f0000058606100198000000400200043d00000020032000390000000004630019000009050000613d000000000705034f0000000008030019000000007907043c0000000008980436000000000048004b000009010000c13d0000001f07100190000009120000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000004130019000000000004043500000000001204350000003f0110003900000586011001970000000001120019000000000021004b00000000040000390000000104004039000005480010009c00000f420000213d000000010040019000000f420000c13d000000400010043f000005130030009c000005130300804100000040013002100000000002020433000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000000010043f0000000801000039000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000401043b0000000301400039000000000301041a000000000003004b000005470000613d0000000401400039000000000201041a000000ff002001900000000e09000029000000130a00002900000c550000c13d0000ff000020019000000c510000613d0000000f0500002900000000050504330000000204400039000000000404041a000005160440019700000000000a004b0000095f0000613d0000000006000019000000000065004b00000a500000a13d0000000507600210000000000897001900000000080804330000051608800197000000000048004b000009690000613d00000001066000390000000000a6004b000009540000413d0000000000a5004b00000a500000a13d0000000505a00210000000000695001900000000004604350000000d0400002900000000040404330000000000a4004b000008c50000213d00000a500000013d0000000d040000290000000004040433000000000064004b00000a500000a13d0000000c047000290000000005040433000000000035001a00000ae80000413d00000000033500190000000000340435000008c80000013d0000000402100039000e00000002001d000000000202041a000000ff0020019000000c550000c13d000000120000006b000009820000613d0000000201100039000000000101041a00000516011001970000000002000411144713800000040f0000000e01000029000000000201041a00000587012001970000000e02000029000000000012041b000000400100043d000000200210003900000014030000290000000000320435000000200200003900000000002104350000004002100039000000110320002900000010040000290000000204400367000000110000006b000009970000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000036004b000009930000c13d000000130000006b000009a50000613d000000110440036000000013050000290000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000001403000029000000000232001900000000000204350000001f023000390000058602200197000005490020009c00000549020080410000006002200210000005130010009c00000513010080410000004001100210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000121019f0000054a0110009a0000800d0200003900000002030000390000054b040000410000000f05000029000006dc0000013d0000000003000019000009c20000013d00000010030000290000000103300039000000130030006c000007c30000813d0000000f010000290000000001010433000000000031004b0000000e0200002900000a500000a13d0000000d010000290000000001010433000000000031004b00000a500000a13d001000000003001d0000000501300210000000000221001900000000030204330000000c011000290000000001010433000000400600043d0000004404600039000000000014043500000020016000390000056a040000410000000000410435000000240460003900000009050000290000000000540435000000440400003900000000004604350000056b0060009c00000f420000213d00000516023001970000008003600039000000400030043f00000000030604330000000004000414000000040020008c000a00000002001d000009e90000c13d00000001010000310000000102000039000009fa0000013d000005130010009c00000513010080410000004001100210000005130030009c00000513030080410000006003300210000000000113019f000005130040009c0000051304008041000000c003400210000000000131019f1447143d0000040f000000010220018f00030000000103550000006001100270000105130010019d0000051301100197000000000001004b0000008009000039000000600a00003900000a260000613d000005480010009c00000f420000213d0000001f0310003900000586033001970000003f033000390000058603300197000000400a00043d00000000033a00190000000000a3004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f00000000091a043600000586041001980000000003490019000000030500036700000a190000613d000000000605034f0000000007090019000000006806043c0000000007870436000000000037004b00000a150000c13d0000001f0110019000000a260000613d000000000445034f0000000301100210000000000503043300000000051501cf000000000515022f000000000404043b0000010001100089000000000414022f00000000011401cf000000000151019f0000000000130435000b00000009001d00000000010a0433000000000002004b00000acf0000613d000000000001004b00000a410000c13d00080000000a001d000005560100004100000000001004430000000a0100002900000004001004430000000001000414000005130010009c0000051301008041000000c00110021000000557011001c70000800202000039144714420000040f000000010020019000000c8f0000613d000000000101043b000000000001004b000000080100002900000ade0000613d0000000001010433000000000001004b000009be0000613d000005500010009c00000f400000213d000000200010008c00000f400000413d0000000b010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000f400000c13d000000000001004b000009be0000c13d0000056c0100004100000adf0000013d0000056301000041000000000010043f0000003201000039000000040010043f000005640100004100001449000104300000000201000039000000000101041a000000ff0010019000000b490000c13d000000130000006b0000018d0000613d0000000501000039000000000101041a000000130010006b0000073b0000213d0000001002000029000000130020006b00000ae40000c13d0000000b02000029000000130020006b00000ae40000c13d0000000a02000029000000130020006b00000ae40000c13d0000000902000029000000130020006b00000ae40000c13d001000000000001d0000001001000029000000050610021000000012016000290000000207000367000000000117034f000000000101043b0000000003000031000000140230006a000000430220008a00000555042001970000055505100197000000000845013f000000000045004b00000000040000190000055504004041000000000021004b00000000020000190000055502008041000005550080009c000000000402c019000000000004004b00000f400000c13d0000001201100029000000000217034f000000000202043b000005480020009c00000f400000213d0000000004230049000000200110003900000555054001970000055508100197000000000958013f000000000058004b00000000050000190000055505004041000000000041004b00000000040000190000055504002041000005550090009c000000000504c019000000000005004b00000f400000c13d000000110530006a0000000f04600029000000000447034f000000000404043b000000430550008a00000555085001970000055509400197000000000a89013f000000000089004b00000000080000190000055508004041000000000054004b000000000500001900000555050080410000055500a0009c000000000805c019000000000008004b00000f400000c13d0000000f05400029000000000457034f000000000404043b000005480040009c00000f400000213d0000000008430049000000200350003900000555058001970000055509300197000000000a59013f000000000059004b00000000050000190000055505004041000000000083004b000000000800001900000555080020410000055500a0009c000000000508c019000000000005004b00000f400000c13d0000000e05600029000000000557034f000000000505043b000005160050009c00000f400000213d0000000c086000290000000d06600029000000000667034f000000000787034f000000000707043b000000000606043b144710920000040f00000010020000290000000102200039001000000002001d000000130020006c00000a6d0000413d000006df0000013d000000000001004b00000ad50000c13d0000056e01000041000000000010043f000005200100004100001449000104300000000b02000029000005130020009c00000513020080410000004002200210000005130010009c00000513010080410000006001100210000000000121019f00001449000104300000056d01000041000000000010043f0000000a01000029000000040010043f000005640100004100001449000104300000057e01000041000000000010043f000005200100004100001449000104300000056301000041000000000010043f0000001101000039000000040010043f000005640100004100001449000104300000000e0900002900000af70000013d00000020099000390000000003a4001900000000000304350000000000b904350000002007700039000000000087004b000002ee0000813d000000000471034f000000000404043b000005480040009c00000f400000213d000000000c5400190000003f04c00039000000000024004b000000000600001900000555060080410000055504400197000000000004004b000000000a000019000005550a004041000005550040009c000000000a06c01900000000000a004b00000f400000c13d000000200dc000390000000004d1034f000000000a04043b0000054800a0009c00000f420000213d0000001f04a0003900000586044001970000003f044000390000058604400197000000400b00043d000000000e4b00190000000000be004b000000000400003900000001040040390000054800e0009c00000f420000213d000000010040019000000f420000c13d0000004006c000390000004000e0043f0000000004ab043600000000066a0019000000000026004b00000f400000213d0000002006d00039000000000661034f000005860fa00198000000000df4001900000b2b0000613d000000000e06034f000000000c04001900000000e30e043c000000000c3c04360000000000dc004b00000b270000c13d0000001f0ca0019000000af00000613d0000000003f6034f0000000306c00210000000000c0d0433000000000c6c01cf000000000c6c022f000000000303043b0000010006600089000000000363022f00000000036301cf0000000003c3019f00000000003d043500000af00000013d00000002010000390000000102000039000000000012041b000000000101041a000000ff0010019000000b490000c13d000000800100043d000000400110003900000000010104330000000001010433000000000001004b00000b4d0000c13d0000056601000041000000000010043f000005200100004100001449000104300000057d01000041000000000010043f000005200100004100001449000104300000000701000039000000000101041a000005560200004100000000002004430000051601100197000f00000001001d00000004001004430000000001000414000005130010009c0000051301008041000000c00110021000000557011001c70000800202000039144714420000040f000000010020019000000c8f0000613d000000000101043b000000000001004b00000f400000613d000000400700043d00000558010000410000000001170436000e00000001001d0000000401700039000000200200003900000000002104350000002402700039000000800100043d000000400300003900000000003204350000000023010434000000640470003900000060050000390000000000540435000000c40670003900000000540304340000000000460435001000000007001d000000e403700039000000000004004b00000b7e0000613d000000000600001900000000073600190000000008650019000000000808043300000000008704350000002006600039000000000046004b00000b770000413d000000000534001900000000000504350000001f04400039000005860440019700000000020204330000001005000029000000840550003900000080064000390000000000650435000000000534001900000000430204340000000002350436000000000003004b00000b940000613d000000000500001900000000062500190000000007540019000000000707043300000000007604350000002005500039000000000035004b00000b8d0000413d000000000423001900000000000404350000001f033000390000058603300197000000000423001900000010030000290000000002340049000000640220008a00000040011000390000000001010433000000a403300039000000000023043500000000320104340000000001240436000000000002004b00000bac0000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b00000ba50000413d000000000312001900000000000304350000001f022000390000058602200197000000000112001900000010030000290000000002310049000000240220008a0000004403300039000000a00400043d0000000000230435000000003204043400000000540204340000000004410436000000000505043300000516055001970000000000540435000000400420003900000000040404330000051304400197000000400510003900000000004504350000006002200039000000000202043300000513022001970000006004100039000000000024043500000000020304330000008003100039000000a0040000390000000000430435000000a00410003900000000030204330000000000340435000000c00410003900000005053002100000000006450019000000000003004b00000c590000c13d00000000010004140000000f02000029000000040020008c00000beb0000613d00000010030000290000000002360049000005130020009c00000513020080410000006002200210000005130030009c00000513030080410000004003300210000000000232019f000005130010009c0000051301008041000000c001100210000000000112019f0000000f02000029144714420000040f0000006003100270000105130030019d0003000000010355000000010020019000000c750000613d0000001001000029000005480010009c00000f420000213d00000014010000290000058602100198000a001f001001930000001001000029000000400010043f000c00000002001d0000000e012000290000001302000029000000020220036700000bfe0000613d000000000302034f0000000e04000029000000003503043c0000000004540436000000000014004b00000bfa0000c13d0000000a03000029000000000003004b000900030030021800000c0d0000613d0000000c022003600000000003010433000000090400002900000000034301cf000000000343022f000000000202043b0000010004400089000000000242022f00000000024201cf000000000232019f000000000021043500000014020000290000000e012000290000000000010435000000100300002900000000002304350000003f01200039000205860010019b0000000201300029000000000031004b00000000020000390000000102004039000005480010009c00000f420000213d000000010020019000000f420000c13d000000400010043f0000000e01000029000005130010009c0000051301008041000000400110021000000010020000290000000002020433000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000600000001001d000000000010043f0000000801000039000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000d00000001001d0000000301100039000500000001001d000000000101041a000400000001001d000000000001004b000005470000613d0000000d010000290000000401100039000300000001001d000000000101041a000700000001001d000000ff0010019000000c550000c13d00000007010000290000ff000010019000000c790000c13d0000057001000041000000000010043f000005200100004100001449000104300000056f01000041000000000010043f00000520010000410000144900010430000000000500001900000c630000013d0000001f0870003900000586088001970000000007670019000000000007043500000000066800190000000105500039000000000035004b00000bd30000813d0000000007160049000000c00770008a00000000047404360000002002200039000000000702043300000000870704340000000006760436000000000007004b00000c5b0000613d0000000009000019000000000a690019000000000b980019000000000b0b04330000000000ba04350000002009900039000000000079004b00000c6d0000413d00000c5b0000013d0000055901000041000000000010043f000005200100004100001449000104300000000d010000290000000601100039000000000101041a001000000001001d0000055a0100004100000000001004430000000001000414000005130010009c0000051301008041000000c0011002100000055b011001c70000800b02000039144714420000040f000000010020019000000c8f0000613d000000000101043b000000100010006c00000c900000a13d0000056501000041000000000010043f00000520010000410000144900010430000000000001042f000000800100043d00000040011000390000000001010433000000400400043d0000055c020000410000000000240435000000040240003900000040030000390000000000320435000000440240003900000000310104340000000000120435001000000004001d0000006402400039000000000001004b00000ca80000613d000000000400001900000000052400190000000006430019000000000606043300000000006504350000002004400039000000000014004b00000ca10000413d000000000321001900000000000304350000001f0110003900000586011001970000000002210019000000100300002900000000013200490000002403300039000000040410008a000000000043043500000020032000390000055d0400004100000000004304350000000f03000039000000000032043500000000020004140000000f03000029000000040030008c00000cc20000c13d0000000003000415000000160330008a000000050330021000000003010003670000000102000031001600000000003d00000cdb0000013d0000001003000029000005130030009c000005130300804100000040033002100000004001100039000005130010009c00000513010080410000006001100210000000000131019f000005130020009c0000051302008041000000c002200210000000000112019f0000000f02000029144714420000040f0000000003000415000000150330008a00000005033002100000006004100270000105130040019d0003000000010355001500000000003d000000010020019000000d5e0000613d000005130240019700000586052001980000001f0620018f000000100450002900000ce50000613d000000000701034f0000001008000029000000007907043c0000000008980436000000000048004b00000ce10000c13d000000000006004b00000cf20000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f0120003900000586011001970000001004100029000000000014004b00000000010000390000000101004039000b00000004001d000005480040009c00000f420000213d000000010010019000000f420000c13d0000000b01000029000000400010043f000005500020009c00000f400000213d000000200020008c00000f400000413d00000010010000290000000001010433000005480010009c00000f400000213d000000100420002900000010011000290000001f02100039000000000042004b0000000005000019000005550500804100000555022001970000055506400197000000000762013f000000000062004b00000000020000190000055502004041000005550070009c000000000205c019000000000002004b00000f400000c13d0000000021010434000005480010009c00000f420000213d0000001f0510003900000586055001970000003f0550003900000586055001970000000b05500029000005480050009c00000f420000213d000000400050043f0000000b050000290000000005150436001000000005001d0000000005210019000000000045004b00000f400000213d000000000001004b000000100400002900000d340000613d000000000400001900000010054000290000000006240019000000000606043300000000006504350000002004400039000000000014004b00000d2c0000413d0000001004100029000000000004043500000005013002700000000b0100002f0000000d01000029000000000101041a000000010210019000000001031002700000007f0330618f000e00000003001d0000001f0030008c00000000030000390000000103002039000000000032004b00000dd20000c13d000000400300043d000800000003001d000f00200030003d000000000002004b00000d620000613d0000000d01000029000000000010043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f000000010020019000000f400000613d0000000e0000006b00000d650000613d000000000101043b00000000020000190000000f03200029000000000401041a0000000000430435000000010110003900000020022000390000000e0020006c00000d560000413d00000d650000013d0000055e01000041000000000010043f0000052001000041000014490001043000000585011001970000000f02000029000000000012043500000008030000290000000e0100002900000000001304350000003f0110003900000586021001970000000001320019000000000021004b00000000020000390000000102004039000005480010009c00000f420000213d000000010020019000000f420000c13d000000400010043f0000000f01000029000005130010009c0000051301008041000000400110021000000008020000290000000002020433000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d00000013020000290000000204200367000000000101043b000f00000001001d000000400100043d00000020021000390000000c032000290000000c0000006b00000d960000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000036004b00000d920000c13d0000000a0000006b00000da30000613d0000000c044003600000000005030433000000090600002900000000056501cf000000000565022f000000000404043b0000010006600089000000000464022f00000000046401cf000000000454019f000000000043043500000014040000290000000003420019000000000003043500000000004104350000000203100029000000000013004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f000005130020009c000005130200804100000040022002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b0000000f0010006b00000dd80000c13d0000000d010000290000000101100039000000000201041a000000010320019000000001042002700000007f0440618f000e00000004001d0000001f0040008c00000000040000390000000104002039000000000442013f000000010040019000000ddc0000613d0000056301000041000000000010043f0000002201000039000000040010043f000005640100004100001449000104300000056001000041000000000010043f00000520010000410000144900010430000000400400043d000800000004001d000f00200040003d000000000003004b00000df70000613d000000000010043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f000000010020019000000f400000613d0000000e0000006b00000dfa0000613d000000000101043b00000000020000190000000f03200029000000000401041a0000000000430435000000010110003900000020022000390000000e0020006c00000def0000413d00000dfa0000013d00000585012001970000000f02000029000000000012043500000008030000290000000e0100002900000000001304350000003f0110003900000586021001970000000001320019000000000021004b00000000020000390000000102004039000005480010009c00000f420000213d000000010020019000000f420000c13d000000400010043f0000000f01000029000005130010009c0000051301008041000000400110021000000008020000290000000002020433000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d00000012020000290000058603200198000e001f0020019300000011020000290000000204200367000000000101043b000100000001001d000000400100043d0000002002100039000f00000003001d000000000332001900000e2e0000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000036004b00000e2a0000c13d0000000e05000029000000000005004b000800030050021800000e3d0000613d0000000f044003600000000005030433000000080600002900000000056501cf000000000565022f000000000404043b0000010006600089000000000464022f00000000046401cf000000000454019f000000000043043500000012040000290000000003420019000000000003043500000000004104350000003f03400039000205860030019b0000000203100029000000000013004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f000005130020009c000005130200804100000040022002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000010010006b00000f480000c13d000000400100043d00000020021000390000000b030000290000000003030433000000000003004b00000e6f0000613d000000000400001900000000052400190000001006400029000000000606043300000000006504350000002004400039000000000034004b00000e680000413d0000000004230019000000000004043500000000003104350000003f0330003900000586043001970000000003140019000000000043004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f000005130020009c000005130200804100000040022002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d00000011020000290000000204200367000000000101043b001000000001001d000000400100043d00000020021000390000000f032000290000000f0000006b00000e9e0000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000036004b00000e9a0000c13d0000000e0000006b00000eab0000613d0000000f044003600000000005030433000000080600002900000000056501cf000000000565022f000000000404043b0000010006600089000000000464022f00000000046401cf000000000454019f000000000043043500000012040000290000000003420019000000000003043500000000004104350000000203100029000000000013004b00000000040000390000000104004039000005480030009c00000f420000213d000000010040019000000f420000c13d000000400030043f000005130020009c000005130200804100000040022002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f000000010020019000000f400000613d000000000101043b000000100010006b00000f480000c13d000001000100008a000000070110017f00000001011001bf0000000302000029000000000012041b0000000d010000290000000201100039001000000001001d000000000101041a000005160110019700000000020004110000000403000029144713800000040f0000000501000029000000000201041a0000001001000029000000000301041a000000400100043d0000006004100039000000140500002900000000005404350000006004000039000000000441043600000080061000390000000c07600029000000020500036700000013085003600000000c0000006b00000ef00000613d000000000908034f000000000a060019000000009b09043c000000000aba043600000000007a004b00000eec0000c13d0000000a0000006b00000efd0000613d0000000c088003600000000009070433000000090a0000290000000009a901cf0000000009a9022f000000000808043b000001000aa000890000000008a8022f0000000008a801cf000000000898019f00000000008704350000001408000029000000000786001900000000000704350000001f0780003900000586077001970000000006760019000000000716004900000000007404350000001204000029000000000446043600000011075003600000000f054000290000000f0000006b00000f110000613d000000000607034f0000000008040019000000006906043c0000000008980436000000000058004b00000f0d0000c13d00000516063001970000000e0000006b00000f1f0000613d0000000f037003600000000007050433000000080800002900000000078701cf000000000787022f000000000303043b0000010008800089000000000383022f00000000038301cf000000000373019f0000000000350435000000120500002900000000035400190000000000030435000000400310003900000000002304350000001f02500039000005860220019700000000021200490000000002420019000005130020009c00000513020080410000006002200210000005130010009c00000513010080410000004001100210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000800d020000390000000303000039000005620400004100000006050000291447143d0000040f000000010020019000000f400000613d0000000101000039000000000011041b0000000001000019000014480001042e000000000100001900001449000104300000056301000041000000000010043f0000004101000039000000040010043f000005640100004100001449000104300000056101000041000000000010043f000005200100004100001449000104300000001f03100039000000000023004b0000000004000019000005550400404100000555052001970000055503300197000000000653013f000000000053004b00000000030000190000055503002041000005550060009c000000000304c019000000000003004b00000f640000613d0000000203100367000000000303043b000005480030009c00000f640000213d00000020011000390000000004310019000000000024004b00000f640000213d0000000002030019000000000001042d0000000001000019000014490001043000000000430104340000000001320436000000000003004b00000f720000613d000000000200001900000000051200190000000006240019000000000606043300000000006504350000002002200039000000000032004b00000f6b0000413d000000000213001900000000000204350000001f0230003900000586022001970000000001210019000000000001042d000005880010009c00000f7d0000813d0000010001100039000000400010043f000000000001042d0000056301000041000000000010043f0000004101000039000000040010043f000005640100004100001449000104300003000000000002000000000201041a000000010320019000000001062002700000007f0660618f0000001f0060008c00000000040000390000000104002039000000000043004b00000fc20000c13d000000400500043d0000000004650436000000000003004b00000fad0000613d000100000004001d000300000006001d000200000005001d000000000010043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f000000010020019000000fce0000613d0000000306000029000000000006004b00000fb30000613d000000000201043b0000000001000019000000020500002900000001070000290000000003170019000000000402041a000000000043043500000001022000390000002001100039000000000061004b00000fa50000413d00000fb50000013d00000585012001970000000000140435000000000006004b0000002001000039000000000100603900000fb50000013d000000000100001900000002050000290000003f0110003900000586021001970000000001520019000000000021004b00000000020000390000000102004039000005480010009c00000fc80000213d000000010020019000000fc80000c13d000000400010043f0000000001050019000000000001042d0000056301000041000000000010043f0000002201000039000000040010043f000005640100004100001449000104300000056301000041000000000010043f0000004101000039000000040010043f0000056401000041000014490001043000000000010000190000144900010430000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f000000010020019000000fdf0000613d000000000101043b0000000101100039000000000101041a000000000001042d0000000001000019000014490001043000000586062001980000001f0720018f0000000208100367000000400100043d0000002003100039000000000563001900000fee0000613d000000000908034f000000000a030019000000009b09043c000000000aba043600000000005a004b00000fea0000c13d000000000007004b00000ffb0000613d000000000668034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000005230019000000000005043500000000002104350000003f0220003900000586022001970000000002210019000000000012004b00000000040000390000000104004039000005480020009c0000101d0000213d00000001004001900000101d0000c13d000000400020043f000005130030009c000005130300804100000040023002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f0000000100200190000010230000613d000000000101043b000000000001042d0000056301000041000000000010043f0000004101000039000000040010043f000005640100004100001449000104300000000001000019000014490001043000000000010004110000051601100197000000000010043f0000057c01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f0000000100200190000010380000613d000000000101043b000000000101041a000000ff001001900000103a0000613d000000000001042d000000000100001900001449000104300000054c01000041000000000010043f0000000001000411000000040010043f0000057401000041000000240010043f0000054d01000041000014490001043000000000010004110000051601100197000000000010043f0000051b01000041000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f0000000100200190000010550000613d000000000101043b000000000101041a000000ff00100190000010570000613d000000000001042d000000000100001900001449000104300000054c01000041000000000010043f0000000001000411000000040010043f0000051c01000041000000240010043f0000054d0100004100001449000104300001000000000002000100000001001d000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000107f0000613d000000000101043b00000000020004110000051602200197000000000020043f000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000107f0000613d000000000101043b000000000101041a000000ff00100190000010810000613d000000000001042d000000000100001900001449000104300000054c01000041000000000010043f0000000001000411000000040010043f0000000101000029000000240010043f0000054d0100004100001449000104300000000201000039000000000101041a000000ff001001900000108e0000c13d000000000001042d0000057d01000041000000000010043f000005200100004100001449000104300015000000000002001300000007001d001000000003001d001500000001001d000f00000006001d000000000006004b000013170000613d000000000002004b0000131b0000613d000000000a040019000000000004004b0000131f0000613d0000000301000039000000000101041a000000000021004b0000130d0000413d0000000401000039000000000101041a0000000000a1004b0000130d0000413d00000586032001980012001f0020019300000015010000290000000204100367000000400100043d0000002008100039001400000003001d0000000003380019000010b50000613d000000000904034f0000000006080019000000009709043c0000000006760436000000000036004b000010b10000c13d000a00000005001d0000001205000029000000000005004b0000000307500210000010c40000613d0000001404400360000000000503043300000000057501cf000000000575022f000000000404043b0000010006700089000000000464022f00000000046401cf000000000454019f0000000000430435000b00000007001d0000000003280019000000000003043500000000002104350000003f0320003900000586033001970000000003310019000000000013004b00000000040000390000000104004039000005480030009c000013040000213d0000000100400190000013040000c13d001100000002001d000000400030043f000005130080009c000005130800804100000040028002100000000001010433000005130010009c00000513010080410000006001100210000000000121019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039000d0000000a001d144714420000040f00000001002001900000130a0000613d000000000101043b000e00000001001d000000000010043f0000000801000039000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000130a0000613d000000000101043b0000000301100039000000000101041a000000000001004b000013230000c13d000000130000006b0000110a0000613d0000055a0100004100000000001004430000000001000414000005130010009c0000051301008041000000c0011002100000055b011001c70000800b02000039144714420000040f00000001002001900000130c0000613d000000000101043b000000130010006c000011200000c13d0000000601000039000000000101041a001300000001001d0000055a0100004100000000001004430000000001000414000005130010009c0000051301008041000000c0011002100000055b011001c70000800b02000039144714420000040f00000001002001900000130c0000613d000000000101043b0000001302000029000000000021001a0000000d0a0000290000132b0000413d001300000021001d0000001104000029000011300000013d0000055a0100004100000000001004430000000001000414000005130010009c0000051301008041000000c0011002100000055b011001c70000800b02000039144714420000040f00000001002001900000130c0000613d000000000101043b000000130010006c00000011040000290000000d0a000029000013270000813d000000400b00043d0000058b00b0009c000013040000213d0000010003b00039000000400030043f000005480040009c000013040000213d0000001f014000390000058601100197000900000001001d0000003f0110003900000586011001970000000002130019000005480020009c000013040000213d0000000001000031000000400020043f00000000004304350000001502400029000000000012004b0000130a0000213d000000020200036700000015062003600000012004b000390000001405400029000000140000006b000011510000613d000000000706034f0000000008040019000000007907043c0000000008980436000000000058004b0000114d0000c13d000000120000006b0000115e0000613d000000140660036000000000070504330000000b0800002900000000078701cf000000000787022f000000000606043b0000010008800089000000000686022f00000000068601cf000000000676019f00000000006504350000001104400029000000000004043500000000033b0436000c00000003001d0000054800a0009c000013040000213d0000001f03a0003900000586033001970000003f033000390000058604300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000005480040009c000013040000213d0000000100500190000013040000c13d000000400040043f0000000004a304360000001005a00029000000000015004b0000130a0000213d00000010022003600000058605a001980000001f06a0018f0000000001540019000011810000613d000000000702034f0000000008040019000000007907043c0000000008980436000000000018004b0000117d0000c13d000000000006004b0000118e0000613d000000000252034f0000000305600210000000000601043300000000065601cf000000000656022f000000000202043b0000010005500089000000000252022f00000000025201cf000000000262019f00000000002104350000000001a400190000000000010435000000a002b000390000000101000039000800000002001d00000000001204350000006002b000390000000f01000029000700000002001d00000000001204350000000c0100002900000000003104350000000a0100002900000516011001970000004002b00039001000000001001d000600000002001d00000000001204350000008001b00039000a00000001001d00000000000104350000055a0100004100000000001004430000000001000414000005130010009c0000051301008041000000c0011002100000055b011001c70000800b02000039000d0000000b001d144714420000040f00000001002001900000130c0000613d000000000101043b0000000d04000029000000e002400039000500000002001d00000013030000290000000000320435000000c002400039000400000002001d00000000001204350000000e01000029000000000010043f0000000801000039000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000000d020000290000130a0000613d000000000601043b00000000030204330000000054030434000005480040009c000013040000213d000000000106041a000000010210019000000001071002700000007f0770618f0000001f0070008c00000000010000390000000101002039000000000012004b000013110000c13d000000200070008c001300000006001d000d00000004001d000300000003001d000011f80000413d000100000007001d000200000005001d000000000060043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f00000001002001900000130a0000613d0000000d040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000013060000290000000205000029000011f80000813d000000000002041b0000000102200039000000000012004b000011f40000413d0000001f0040008c000012230000a13d000000000060043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f00000001002001900000130a0000613d0000000d070000290000058602700198000000000101043b0000000308000029000012950000613d000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000130600002900000000058300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b0000120f0000c13d000000000072004b000012200000813d0000000302700210000000f80220018f000005920220027f000005920220016700000000038300190000000003030433000000000223016f000000000021041b000000010170021000000001011001bf0000122e0000013d000000000004004b000012270000613d0000000001050433000012280000013d00000000010000190000000302400210000005920220027f0000059202200167000000000121016f0000000102400210000000000121019f000000000016041b0000000c0100002900000000030104330000000054030434000005480040009c000013040000213d0000000107600039000000000107041a000000010010019000000001081002700000007f0880618f0000001f0080008c00000000020000390000000102002039000000000121013f0000000100100190000013110000c13d000000200080008c000d00000007001d000c00000004001d000300000003001d000012640000413d000100000008001d000200000005001d000000000070043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f00000001002001900000130a0000613d0000000c040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000013060000290000000d070000290000000205000029000012640000813d000000000002041b0000000102200039000000000012004b000012600000413d0000001f0040008c000012910000a13d000000000070043f0000000001000414000005130010009c0000051301008041000000c0011002100000055f011001c70000801002000039144714420000040f00000001002001900000130a0000613d0000000c080000290000058602800198000000000101043b000000030a000029000012fd0000613d000000010320008a000000050330027000000000043100190000002003000039000000010440003900000013060000290000000d070000290000000005a300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b0000127c0000c13d000000000082004b00000011090000290000128e0000813d0000000302800210000000f80220018f000005920220027f00000592022001670000000003a300190000000003030433000000000223016f000000000021041b000000010180021000000001011001bf000012a20000013d000000000004004b0000129a0000613d00000000010504330000129b0000013d00000020030000390000001306000029000000000072004b000012180000413d000012200000013d000000000100001900000011090000290000000302400210000005920220027f0000059202200167000000000121016f0000000102400210000000000121019f000000000017041b0000000601000029000000000101043300000516011001970000000202600039000000000302041a0000051d03300197000000000113019f000000000012041b000000070100002900000000010104330000000302600039000000000012041b0000000a010000290000000001010433000000000001004b0000000401600039000000000201041a0000058c02200197000000010220c1bf00000008030000290000000003030433000000000003004b000001000220c1bf000000000021041b000000040100002900000000010104330000000502600039000000000012041b000000060160003900000005020000290000000002020433000000000021041b000000400100043d00000040021000390000000000920435000000400200003900000000022104360000006003100039000000140430002900000015050000290000000205500367000000140000006b000012d40000613d000000000605034f0000000007030019000000006806043c0000000007870436000000000047004b000012d00000c13d000000120000006b000012e10000613d000000140550036000000000060404330000000b0700002900000000067601cf000000000676022f000000000505043b0000010007700089000000000575022f00000000057501cf000000000565019f0000000000540435000000000393001900000000000304350000000f030000290000000000320435000005130010009c0000051301008041000000400110021000000009020000290000006002200039000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000800d0200003900000003030000390000058d040000410000000e0500002900000010060000291447143d0000040f00000001002001900000130a0000613d000000000001042d000000200300003900000013060000290000000d07000029000000000082004b0000001109000029000012860000413d0000128e0000013d0000056301000041000000000010043f0000004101000039000000040010043f0000056401000041000014490001043000000000010000190000144900010430000000000001042f0000058e01000041000000000010043f000005200100004100001449000104300000056301000041000000000010043f0000002201000039000000040010043f000005640100004100001449000104300000059101000041000000000010043f000005200100004100001449000104300000059001000041000000000010043f000005200100004100001449000104300000058f01000041000000000010043f000005200100004100001449000104300000058901000041000000000010043f000005200100004100001449000104300000058a01000041000000000010043f000005200100004100001449000104300000056301000041000000000010043f0000001101000039000000040010043f000005640100004100001449000104300002000000000002000100000002001d000200000001001d000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000137e0000613d000000000101043b00000001020000290000051602200197000100000002001d000000000020043f000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000137e0000613d000000000101043b000000000101041a000000ff001001900000137d0000613d0000000201000029000000000010043f000000200000043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000137e0000613d000000000101043b0000000102000029000000000020043f000000200010043f0000000001000414000005130010009c0000051301008041000000c00110021000000518011001c70000801002000039144714420000040f00000001002001900000137e0000613d000000000101043b000000000201041a0000058502200197000000000021041b0000000001000414000005130010009c0000051301008041000000c00110021000000519011001c70000800d02000039000000040300003900000000070004110000059304000041000000020500002900000001060000291447143d0000040f00000001002001900000137e0000613d000000000001042d000000000100001900001449000104300003000000000002000000400400043d0000004405400039000000000035043500000020034000390000056a05000041000000000053043500000516022001970000002405400039000000000025043500000044020000390000000000240435000005940040009c000014050000813d0000008002400039000000400020043f000000000404043300000000020004140000051609100197000000040090008c000013c30000c13d00000001020000390000000101000031000000000001004b000013d90000613d000005480010009c000014050000213d0000001f0410003900000586044001970000003f044000390000058604400197000000400b00043d00000000044b00190000000000b4004b00000000050000390000000105004039000005480040009c000014050000213d0000000100500190000014050000c13d000000400040043f000000000a1b043600000586031001980000001f0410018f00000000013a00190000000305000367000013b50000613d000000000605034f00000000070a0019000000006806043c0000000007870436000000000017004b000013b10000c13d000000000004004b000013db0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000013db0000013d000005130030009c00000513030080410000004001300210000005130040009c00000513040080410000006003400210000000000113019f000005130020009c0000051302008041000000c002200210000000000121019f0000000002090019000300000009001d1447143d0000040f0000000309000029000000010220018f00030000000103550000006001100270000105130010019d0000051301100197000000000001004b000013990000c13d000000600b000039000000800a00003900000000010b0433000000000002004b0000140d0000613d000000000001004b000013f80000c13d00020000000b001d00010000000a001d00000556010000410000000000100443000300000009001d00000004009004430000000001000414000005130010009c0000051301008041000000c00110021000000557011001c70000800202000039144714420000040f0000000100200190000014200000613d000000000101043b000000000001004b0000000201000029000014210000613d0000000001010433000000000001004b0000000309000029000000010a000029000014040000613d000005500010009c0000140b0000213d000000200010008c0000140b0000413d00000000010a0433000000000001004b0000000002000039000000010200c039000000000021004b0000140b0000c13d000000000001004b000014130000613d000000000001042d0000056301000041000000000010043f0000004101000039000000040010043f0000056401000041000014490001043000000000010000190000144900010430000000000001004b000014180000c13d0000056e01000041000000000010043f000005200100004100001449000104300000056c01000041000000000010043f000000040090043f000005640100004100001449000104300000051300a0009c000005130a0080410000004002a00210000005130010009c00000513010080410000006001100210000000000121019f0000144900010430000000000001042f0000056d01000041000000000010043f0000000301000029000000040010043f00000564010000410000144900010430000000000001042f000005130010009c00000513010080410000004001100210000005130020009c00000513020080410000006002200210000000000112019f0000000002000414000005130020009c0000051302008041000000c002200210000000000112019f00000519011001c70000801002000039144714420000040f00000001002001900000143b0000613d000000000101043b000000000001042d0000000001000019000014490001043000001440002104210000000102000039000000000001042d0000000002000019000000000001042d00001445002104230000000102000039000000000001042d0000000002000019000000000001042d0000144700000432000014480001042e00001449000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5020000000000000000000000000000000000004000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d7d7ffb7a348e1c6a02869081a26547b49160dd3df72d1d75a570eb9b698292eca49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000376a037b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000826f9ccb00000000000000000000000000000000000000000000000000000000aeade0e500000000000000000000000000000000000000000000000000000000d547741e00000000000000000000000000000000000000000000000000000000f961e73300000000000000000000000000000000000000000000000000000000f961e73400000000000000000000000000000000000000000000000000000000fba0ce4200000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000e55e2a5100000000000000000000000000000000000000000000000000000000aeade0e600000000000000000000000000000000000000000000000000000000b4b8bd5c00000000000000000000000000000000000000000000000000000000cb687b880000000000000000000000000000000000000000000000000000000091d14853000000000000000000000000000000000000000000000000000000009e8249c3000000000000000000000000000000000000000000000000000000009e8249c400000000000000000000000000000000000000000000000000000000a217fddf0000000000000000000000000000000000000000000000000000000091d148540000000000000000000000000000000000000000000000000000000095ccea6700000000000000000000000000000000000000000000000000000000826f9ccc000000000000000000000000000000000000000000000000000000008456cb59000000000000000000000000000000000000000000000000000000008f3b72010000000000000000000000000000000000000000000000000000000036568abd000000000000000000000000000000000000000000000000000000003f4ba839000000000000000000000000000000000000000000000000000000005c975aba000000000000000000000000000000000000000000000000000000005c975abb0000000000000000000000000000000000000000000000000000000075b238fc000000000000000000000000000000000000000000000000000000003f4ba83a0000000000000000000000000000000000000000000000000000000043ac84240000000000000000000000000000000000000000000000000000000036568abe0000000000000000000000000000000000000000000000000000000036a0f8a5000000000000000000000000000000000000000000000000000000003cf3596b0000000000000000000000000000000000000000000000000000000009249457000000000000000000000000000000000000000000000000000000002ec69ce0000000000000000000000000000000000000000000000000000000002ec69ce1000000000000000000000000000000000000000000000000000000002f2ff15d000000000000000000000000000000000000000000000000000000000924945800000000000000000000000000000000000000000000000000000000248a9ca300000000000000000000000000000000000000000000000000000000010262b40000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000002d25da6000000000000000000000000000000000000000000000000ffffffffffffffff00000000000000000000000000000000000000000000000000000000ffffffbffdffffffffffffffffffffffffffffffffffffc00000000000000000000000008d0c04386b7d7072a7dae2ec5654e4f363c9a3c90f77fe0ca47679de16102da8e2517d3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000fe4388e5c957d0d27239bb3eb6914b1ff0dfb2063457754edc8e323e5a21b001d92e233d000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000fffffffffffffedf000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffff3f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080000000000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000a960e69e00000000000000000000000000000000000000000000000000000000d611c31800000000000000000000000000000000000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000002000000000000000000000000000000040000000000000000000000003755667e000000000000000000000000000000000000000000000000000000002273637265656e5f6e616d65223a2200000000000000000000000000000000000d2030470000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000007e81c0550000000000000000000000000000000000000000000000000000000050ef3288000000000000000000000000000000000000000000000000000000004d659d99bef645e5b0b015c11fcba03d2688d63a08664047fac50bcf239a70094e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000007eced8bc00000000000000000000000000000000000000000000000000000000e3e94326000000000000000000000000000000000000000000000000000000003ee5aeb5000000000000000000000000000000000000000000000000000000007f5e1bd2adece13886d914f9b080f9d302f5252edff5e931770a71ce96d576550000000000000000000000000000000000000020000000800000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f5274afe7000000000000000000000000000000000000000000000000000000009996b315000000000000000000000000000000000000000000000000000000001425ea4200000000000000000000000000000000000000000000000000000000b3f8c0dc00000000000000000000000000000000000000000000000000000000d58597c6000000000000000000000000000000000000000000000000000000006d363c450000000000000000000000000000000000000000000000000000000062e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25881990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f6abfc86bc7e3a194c210ef1b650cb01fcf08797e66502baf25a28c11b2b394565db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d117668dfc202b000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000060000000000000000000000000aa2ef8ba434f2f6bdaad3fcc2d5c35f02b08a47173c94877259407614bc46b55947d5a84000000000000000000000000000000000000000000000000000000006697b2320000000000000000000000000000000000000000000000000000000046529ed6a1ea7eb7cecd5cda61c6509ee75f2c2d30eb86c4ca694e4fefcc3cbed93c066500000000000000000000000000000000000000000000000000000000a24a13a60000000000000000000000000000000000000000000000000000000016886f2b00000000000000000000000000000000000000000000000000000000521299a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000007965db0b00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff000000000000000000000000000000000000000000000000ffffffffffffff0023124c3900000000000000000000000000000000000000000000000000000000fb2a675200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000b9341144868ef38af420e3d220534b250d434aa3b11ef35269e46b54a7b11d9fb11b2ad800000000000000000000000000000000000000000000000000000000999bf96a000000000000000000000000000000000000000000000000000000002806db8e000000000000000000000000000000000000000000000000000000001f2a200500000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b000000000000000000000000000000000000000000000000ffffffffffffff80
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000078ae12562527b865dd1a06784a2b06dbe1a3c7af000000000000000000000000760de1fed5889052a2c01ea7823d930060d4af4d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000093a80
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x78Ae12562527B865DD1a06784a2b06dbe1A3C7AF
Arg [1] : reclaimAddress_ (address): 0x760dE1FEd5889052a2C01ea7823d930060D4Af4d
Arg [2] : initialMaxPostIdLength (uint256): 32
Arg [3] : initialMaxUsernameLength (uint256): 120
Arg [4] : initialMaxBulkOperations (uint256): 64
Arg [5] : initialDefaultExpirationDuration (uint256): 604800
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000078ae12562527b865dd1a06784a2b06dbe1a3c7af
Arg [1] : 000000000000000000000000760de1fed5889052a2c01ea7823d930060d4af4d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000078
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [5] : 0000000000000000000000000000000000000000000000000000000000093a80
Loading...
Loading
Loading...
Loading
[ 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.