Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
251557 | 76 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
TokenERC1155
Compiler Version
v0.8.23+commit.f704f362
ZkSolc Version
v1.5.4
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; /// @author thirdweb // $$\ $$\ $$\ $$\ $$\ // $$ | $$ | \__| $$ | $$ | // $$$$$$\ $$$$$$$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\ $$$$$$$\ // \_$$ _| $$ __$$\ $$ |$$ __$$\ $$ __$$ |$$ | $$ | $$ |$$ __$$\ $$ __$$\ // $$ | $$ | $$ |$$ |$$ | \__|$$ / $$ |$$ | $$ | $$ |$$$$$$$$ |$$ | $$ | // $$ |$$\ $$ | $$ |$$ |$$ | $$ | $$ |$$ | $$ | $$ |$$ ____|$$ | $$ | // \$$$$ |$$ | $$ |$$ |$$ | \$$$$$$$ |\$$$$$\$$$$ |\$$$$$$$\ $$$$$$$ | // \____/ \__| \__|\__|\__| \_______| \_____\____/ \_______|\_______/ // Interface import { ITokenERC1155 } from "../interface/token/ITokenERC1155.sol"; import "../../infra/interface/IThirdwebContract.sol"; import "../../extension/interface/IPlatformFee.sol"; import "../../extension/interface/IPrimarySale.sol"; import "../../extension/interface/IRoyalty.sol"; import "../../extension/interface/IOwnable.sol"; import "../../extension/NFTMetadata.sol"; // Token import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol"; // Signature utils import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol"; // Access Control + security import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; // Utils import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; import "../../extension/Multicall.sol"; import "../../lib/CurrencyTransferLib.sol"; import "../../lib/FeeType.sol"; import "../../external-deps/openzeppelin/metatx/ERC2771ContextUpgradeable.sol"; // Helper interfaces import "@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol"; contract TokenERC1155 is Initializable, IThirdwebContract, IOwnable, IRoyalty, IPrimarySale, IPlatformFee, EIP712Upgradeable, ReentrancyGuardUpgradeable, ERC2771ContextUpgradeable, Multicall, AccessControlEnumerableUpgradeable, ERC1155Upgradeable, ITokenERC1155, NFTMetadata { using ECDSAUpgradeable for bytes32; using StringsUpgradeable for uint256; bytes32 private constant MODULE_TYPE = bytes32("TokenERC1155"); uint256 private constant VERSION = 1; // Token name string public name; // Token symbol string public symbol; bytes32 private constant TYPEHASH = keccak256( "MintRequest(address to,address royaltyRecipient,uint256 royaltyBps,address primarySaleRecipient,uint256 tokenId,string uri,uint256 quantity,uint256 pricePerToken,address currency,uint128 validityStartTimestamp,uint128 validityEndTimestamp,bytes32 uid)" ); /// @dev Only TRANSFER_ROLE holders can have tokens transferred from or to them, during restricted transfers. bytes32 private constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE"); /// @dev Only MINTER_ROLE holders can sign off on `MintRequest`s. bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE"); /// @dev Only METADATA_ROLE holders can update NFT metadata. bytes32 private constant METADATA_ROLE = keccak256("METADATA_ROLE"); /// @dev Max bps in the thirdweb system uint256 private constant MAX_BPS = 10_000; /// @dev Owner of the contract (purpose: OpenSea compatibility, etc.) address private _owner; /// @dev The next token ID of the NFT to mint. uint256 public nextTokenIdToMint; /// @dev The adress that receives all primary sales value. address public primarySaleRecipient; /// @dev The adress that receives all primary sales value. address public platformFeeRecipient; /// @dev The recipient of who gets the royalty. address private royaltyRecipient; /// @dev The percentage of royalty how much royalty in basis points. uint128 private royaltyBps; /// @dev The % of primary sales collected by the contract as fees. uint128 private platformFeeBps; /// @dev The flat amount collected by the contract as fees on primary sales. uint256 private flatPlatformFee; /// @dev Fee type variants: percentage fee and flat fee PlatformFeeType private platformFeeType; /// @dev Contract level metadata. string public contractURI; /// @dev Mapping from mint request UID => whether the mint request is processed. mapping(bytes32 => bool) private minted; /// @dev Token ID => total circulating supply of tokens with that ID. mapping(uint256 => uint256) public totalSupply; /// @dev Token ID => the address of the recipient of primary sales. mapping(uint256 => address) public saleRecipientForToken; /// @dev Token ID => royalty recipient and bps for token mapping(uint256 => RoyaltyInfo) private royaltyInfoForToken; constructor() initializer {} /// @dev Initializes the contract, like a constructor. function initialize( address _defaultAdmin, string memory _name, string memory _symbol, string memory _contractURI, address[] memory _trustedForwarders, address _primarySaleRecipient, address _royaltyRecipient, uint128 _royaltyBps, uint128 _platformFeeBps, address _platformFeeRecipient ) external initializer { // Initialize inherited contracts, most base-like -> most derived. __ReentrancyGuard_init(); __EIP712_init("TokenERC1155", "1"); __ERC2771Context_init(_trustedForwarders); __ERC1155_init(""); // Initialize this contract's state. name = _name; symbol = _symbol; royaltyRecipient = _royaltyRecipient; royaltyBps = _royaltyBps; platformFeeRecipient = _platformFeeRecipient; primarySaleRecipient = _primarySaleRecipient; contractURI = _contractURI; require(_platformFeeBps <= MAX_BPS, "exceeds MAX_BPS"); platformFeeBps = _platformFeeBps; // Fee type Bps by default platformFeeType = PlatformFeeType.Bps; _owner = _defaultAdmin; _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin); _setupRole(MINTER_ROLE, _defaultAdmin); _setupRole(TRANSFER_ROLE, _defaultAdmin); _setupRole(TRANSFER_ROLE, address(0)); _setupRole(METADATA_ROLE, _defaultAdmin); _setRoleAdmin(METADATA_ROLE, METADATA_ROLE); emit PrimarySaleRecipientUpdated(_primarySaleRecipient); emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); emit DefaultRoyalty(_royaltyRecipient, _royaltyBps); } /// ===== Public functions ===== /// @dev Returns the module type of the contract. function contractType() external pure returns (bytes32) { return MODULE_TYPE; } /// @dev Returns the version of the contract. function contractVersion() external pure returns (uint8) { return uint8(VERSION); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return hasRole(DEFAULT_ADMIN_ROLE, _owner) ? _owner : address(0); } /// @dev Verifies that a mint request is signed by an account holding MINTER_ROLE (at the time of the function call). function verify(MintRequest calldata _req, bytes calldata _signature) public view returns (bool, address) { address signer = recoverAddress(_req, _signature); return (!minted[_req.uid] && hasRole(MINTER_ROLE, signer), signer); } /// @dev Returns the URI for a tokenId function uri(uint256 _tokenId) public view override returns (string memory) { return _tokenURI[_tokenId]; } /// @dev Lets an account with MINTER_ROLE mint an NFT. function mintTo( address _to, uint256 _tokenId, string calldata _uri, uint256 _amount ) external nonReentrant onlyRole(MINTER_ROLE) { uint256 tokenIdToMint; if (_tokenId == type(uint256).max) { tokenIdToMint = nextTokenIdToMint; nextTokenIdToMint += 1; } else { require(_tokenId < nextTokenIdToMint, "invalid id"); tokenIdToMint = _tokenId; } // `_mintTo` is re-used. `mintTo` just adds a minter role check. _mintTo(_to, _uri, tokenIdToMint, _amount); } /// ===== External functions ===== /// @dev See EIP-2981 function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view virtual returns (address receiver, uint256 royaltyAmount) { (address recipient, uint256 bps) = getRoyaltyInfoForToken(tokenId); receiver = recipient; royaltyAmount = (salePrice * bps) / MAX_BPS; } /// @dev Mints an NFT according to the provided mint request. function mintWithSignature(MintRequest calldata _req, bytes calldata _signature) external payable nonReentrant { address signer = verifyRequest(_req, _signature); address receiver = _req.to; uint256 tokenIdToMint; if (_req.tokenId == type(uint256).max) { tokenIdToMint = nextTokenIdToMint; nextTokenIdToMint += 1; } else { require(_req.tokenId < nextTokenIdToMint, "invalid id"); tokenIdToMint = _req.tokenId; } if (_req.royaltyRecipient != address(0)) { royaltyInfoForToken[tokenIdToMint] = RoyaltyInfo({ recipient: _req.royaltyRecipient, bps: _req.royaltyBps }); } _mintTo(receiver, _req.uri, tokenIdToMint, _req.quantity); collectPrice(_req); emit TokensMintedWithSignature(signer, receiver, tokenIdToMint, _req); } // ===== Setter functions ===== /// @dev Lets a module admin set the default recipient of all primary sales. function setPrimarySaleRecipient(address _saleRecipient) external onlyRole(DEFAULT_ADMIN_ROLE) { primarySaleRecipient = _saleRecipient; emit PrimarySaleRecipientUpdated(_saleRecipient); } /// @dev Lets a module admin update the royalty bps and recipient. function setDefaultRoyaltyInfo( address _royaltyRecipient, uint256 _royaltyBps ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_royaltyBps <= MAX_BPS, "exceed royalty bps"); royaltyRecipient = _royaltyRecipient; royaltyBps = uint128(_royaltyBps); emit DefaultRoyalty(_royaltyRecipient, _royaltyBps); } /// @dev Lets a module admin set the royalty recipient for a particular token Id. function setRoyaltyInfoForToken( uint256 _tokenId, address _recipient, uint256 _bps ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_bps <= MAX_BPS, "exceed royalty bps"); royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps }); emit RoyaltyForToken(_tokenId, _recipient, _bps); } /// @dev Lets a module admin update the fees on primary sales. function setPlatformFeeInfo( address _platformFeeRecipient, uint256 _platformFeeBps ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_platformFeeBps <= MAX_BPS, "exceeds MAX_BPS"); platformFeeBps = uint64(_platformFeeBps); platformFeeRecipient = _platformFeeRecipient; emit PlatformFeeInfoUpdated(_platformFeeRecipient, _platformFeeBps); } /// @dev Lets a module admin set a flat fee on primary sales. function setFlatPlatformFeeInfo( address _platformFeeRecipient, uint256 _flatFee ) external onlyRole(DEFAULT_ADMIN_ROLE) { flatPlatformFee = _flatFee; platformFeeRecipient = _platformFeeRecipient; emit FlatPlatformFeeUpdated(_platformFeeRecipient, _flatFee); } /// @dev Lets a module admin set a flat fee on primary sales. function setPlatformFeeType(PlatformFeeType _feeType) external onlyRole(DEFAULT_ADMIN_ROLE) { platformFeeType = _feeType; emit PlatformFeeTypeUpdated(_feeType); } /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin. function setOwner(address _newOwner) external onlyRole(DEFAULT_ADMIN_ROLE) { require(hasRole(DEFAULT_ADMIN_ROLE, _newOwner), "new owner not module admin."); address _prevOwner = _owner; _owner = _newOwner; emit OwnerUpdated(_prevOwner, _newOwner); } /// @dev Lets a module admin set the URI for contract-level metadata. function setContractURI(string calldata _uri) external onlyRole(DEFAULT_ADMIN_ROLE) { contractURI = _uri; } /// ===== Getter functions ===== /// @dev Returns the platform fee bps and recipient. function getPlatformFeeInfo() external view returns (address, uint16) { return (platformFeeRecipient, uint16(platformFeeBps)); } /// @dev Returns the flat platform fee and recipient. function getFlatPlatformFeeInfo() external view returns (address, uint256) { return (platformFeeRecipient, flatPlatformFee); } /// @dev Returns the platform fee type. function getPlatformFeeType() external view returns (PlatformFeeType) { return platformFeeType; } /// @dev Returns default royalty info. function getDefaultRoyaltyInfo() external view returns (address, uint16) { return (royaltyRecipient, uint16(royaltyBps)); } /// @dev Returns the royalty recipient for a particular token Id. function getRoyaltyInfoForToken(uint256 _tokenId) public view returns (address, uint16) { RoyaltyInfo memory royaltyForToken = royaltyInfoForToken[_tokenId]; return royaltyForToken.recipient == address(0) ? (royaltyRecipient, uint16(royaltyBps)) : (royaltyForToken.recipient, uint16(royaltyForToken.bps)); } /// ===== Internal functions ===== /// @dev Mints an NFT to `to` function _mintTo(address _to, string calldata _uri, uint256 _tokenId, uint256 _amount) internal { if (bytes(_tokenURI[_tokenId]).length == 0) { _setTokenURI(_tokenId, _uri); } _mint(_to, _tokenId, _amount, ""); emit TokensMinted(_to, _tokenId, _tokenURI[_tokenId], _amount); } /// @dev Returns the address of the signer of the mint request. function recoverAddress(MintRequest calldata _req, bytes calldata _signature) internal view returns (address) { return _hashTypedDataV4(keccak256(_encodeRequest(_req))).recover(_signature); } /// @dev Resolves 'stack too deep' error in `recoverAddress`. function _encodeRequest(MintRequest calldata _req) internal pure returns (bytes memory) { return bytes.concat( abi.encode( TYPEHASH, _req.to, _req.royaltyRecipient, _req.royaltyBps, _req.primarySaleRecipient, _req.tokenId, keccak256(bytes(_req.uri)) ), abi.encode( _req.quantity, _req.pricePerToken, _req.currency, _req.validityStartTimestamp, _req.validityEndTimestamp, _req.uid ) ); } /// @dev Verifies that a mint request is valid. function verifyRequest(MintRequest calldata _req, bytes calldata _signature) internal returns (address) { (bool success, address signer) = verify(_req, _signature); require(success, "invalid signature"); require( _req.validityStartTimestamp <= block.timestamp && _req.validityEndTimestamp >= block.timestamp, "request expired" ); require(_req.to != address(0), "recipient undefined"); require(_req.quantity > 0, "zero quantity"); minted[_req.uid] = true; return signer; } /// @dev Collects and distributes the primary sale value of tokens being claimed. function collectPrice(MintRequest calldata _req) internal { if (_req.pricePerToken == 0) { require(msg.value == 0, "!Value"); return; } uint256 totalPrice = _req.pricePerToken * _req.quantity; uint256 platformFees = platformFeeType == PlatformFeeType.Flat ? flatPlatformFee : ((totalPrice * platformFeeBps) / MAX_BPS); require(totalPrice >= platformFees, "price less than platform fee"); if (_req.currency == CurrencyTransferLib.NATIVE_TOKEN) { require(msg.value == totalPrice, "must send total price."); } else { require(msg.value == 0, "msg value not zero"); } address saleRecipient = _req.primarySaleRecipient == address(0) ? primarySaleRecipient : _req.primarySaleRecipient; CurrencyTransferLib.transferCurrency(_req.currency, _msgSender(), platformFeeRecipient, platformFees); CurrencyTransferLib.transferCurrency(_req.currency, _msgSender(), saleRecipient, totalPrice - platformFees); } /// ===== Low-level overrides ===== /// @dev Lets a token owner burn the tokens they own (i.e. destroy for good) function burn(address account, uint256 id, uint256 value) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved." ); _burn(account, id, value); } /// @dev Lets a token owner burn multiple tokens they own at once (i.e. destroy for good) function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved." ); _burnBatch(account, ids, values); } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); // if transfer is restricted on the contract, we still want to allow burning and minting if (!hasRole(TRANSFER_ROLE, address(0)) && from != address(0) && to != address(0)) { require(hasRole(TRANSFER_ROLE, from) || hasRole(TRANSFER_ROLE, to), "restricted to TRANSFER_ROLE holders."); } if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { totalSupply[ids[i]] -= amounts[i]; } } } function supportsInterface( bytes4 interfaceId ) public view virtual override(AccessControlEnumerableUpgradeable, ERC1155Upgradeable, IERC165Upgradeable, IERC165) returns (bool) { return super.supportsInterface(interfaceId) || interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC2981Upgradeable).interfaceId; } /// @dev Returns whether metadata can be set in the given execution context. function _canSetMetadata() internal view virtual override returns (bool) { return hasRole(METADATA_ROLE, _msgSender()); } /// @dev Returns whether metadata can be frozen in the given execution context. function _canFreezeMetadata() internal view virtual override returns (bool) { return hasRole(METADATA_ROLE, _msgSender()); } function _msgSender() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable, Multicall) returns (address sender) { return ERC2771ContextUpgradeable._msgSender(); } function _msgData() internal view virtual override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (bytes calldata) { return ERC2771ContextUpgradeable._msgData(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControlEnumerableUpgradeable.sol"; import "./AccessControlUpgradeable.sol"; import "../utils/structs/EnumerableSetUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { function __AccessControlEnumerable_init() internal onlyInitializing { } function __AccessControlEnumerable_init_unchained() internal onlyInitializing { } using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControlUpgradeable.sol"; import "../utils/ContextUpgradeable.sol"; import "../utils/StringsUpgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol"; import "../proxy/utils/Initializable.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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(account), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControlUpgradeable.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.0; interface IERC5267Upgradeable { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _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 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // 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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155Upgradeable.sol"; import "./IERC1155ReceiverUpgradeable.sol"; import "./extensions/IERC1155MetadataURIUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../utils/introspection/ERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155Upgradeable.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @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, it is bubbled up by this * function (like regular Solidity function calls). * * 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. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @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`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/MathUpgradeable.sol"; import "./math/SignedMathUpgradeable.sol"; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = MathUpgradeable.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../StringsUpgradeable.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.8; import "./ECDSAUpgradeable.sol"; import "../../interfaces/IERC5267Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. * * _Available since v3.4._ * * @custom:storage-size 52 */ abstract contract EIP712Upgradeable is Initializable, IERC5267Upgradeable { bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /// @custom:oz-renamed-from _HASHED_NAME bytes32 private _hashedName; /// @custom:oz-renamed-from _HASHED_VERSION bytes32 private _hashedVersion; string private _name; string private _version; /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal onlyInitializing { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing { _name = name; _version = version; // Reset prior values in storage if upgrading _hashedName = 0; _hashedVersion = 0; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(); } function _buildDomainSeparator() private view returns (bytes32) { return keccak256(abi.encode(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev See {EIP-5267}. * * _Available since v4.9._ */ function eip712Domain() public view virtual override returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized // and the EIP712 domain is not reliable, as it will be missing name and version. require(_hashedName == 0 && _hashedVersion == 0, "EIP712: Uninitialized"); return ( hex"0f", // 01111 _EIP712Name(), _EIP712Version(), block.chainid, address(this), bytes32(0), new uint256[](0) ); } /** * @dev The name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712Name() internal virtual view returns (string memory) { return _name; } /** * @dev The version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712Version() internal virtual view returns (string memory) { return _version; } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead. */ function _EIP712NameHash() internal view returns (bytes32) { string memory name = _EIP712Name(); if (bytes(name).length > 0) { return keccak256(bytes(name)); } else { // If the name is empty, the contract may have been upgraded without initializing the new storage. // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design. bytes32 hashedName = _hashedName; if (hashedName != 0) { return hashedName; } else { return keccak256(""); } } } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead. */ function _EIP712VersionHash() internal view returns (bytes32) { string memory version = _EIP712Version(); if (bytes(version).length > 0) { return keccak256(bytes(version)); } else { // If the version is empty, the contract may have been upgraded without initializing the new storage. // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design. bytes32 hashedVersion = _hashedVersion; if (hashedVersion != 0) { return hashedVersion; } else { return keccak256(""); } } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; // EIP-712 is Final as of 2022-08-11. This file is deprecated. import "./EIP712Upgradeable.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * 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 * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * 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: Apache-2.0 pragma solidity ^0.8.0; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; import "./IERC165.sol"; import "./IERC721.sol"; interface IERC4906 is IERC165 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../lib/Address.sol"; import "./interface/IMulticall.sol"; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ contract Multicall is IMulticall { /** * @notice Receives and executes a batch of function calls on this contract. * @dev Receives and executes a batch of function calls on this contract. * * @param data The bytes data that makes up the batch of function calls to execute. * @return results The bytes data that makes up the result of the batch of function calls executed. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results) { results = new bytes[](data.length); address sender = _msgSender(); bool isForwarder = msg.sender != sender; for (uint256 i = 0; i < data.length; i++) { if (isForwarder) { results[i] = Address.functionDelegateCall(address(this), abi.encodePacked(data[i], sender)); } else { results[i] = Address.functionDelegateCall(address(this), data[i]); } } return results; } /// @notice Returns the sender in the given execution context. function _msgSender() internal view virtual returns (address) { return msg.sender; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "./interface/INFTMetadata.sol"; abstract contract NFTMetadata is INFTMetadata { /// @dev The sender is not authorized to perform the action error NFTMetadataUnauthorized(); /// @dev Invalid token metadata url error NFTMetadataInvalidUrl(); /// @dev the nft metadata is frozen error NFTMetadataFrozen(uint256 tokenId); bool public uriFrozen; mapping(uint256 => string) internal _tokenURI; /// @notice Returns the metadata URI for a given NFT. function _getTokenURI(uint256 _tokenId) internal view virtual returns (string memory) { return _tokenURI[_tokenId]; } /// @notice Sets the metadata URI for a given NFT. function _setTokenURI(uint256 _tokenId, string memory _uri) internal virtual { if (bytes(_uri).length == 0) { revert NFTMetadataInvalidUrl(); } _tokenURI[_tokenId] = _uri; emit MetadataUpdate(_tokenId); } /// @notice Sets the metadata URI for a given NFT. function setTokenURI(uint256 _tokenId, string memory _uri) public virtual { if (!_canSetMetadata()) { revert NFTMetadataUnauthorized(); } if (uriFrozen) { revert NFTMetadataFrozen(_tokenId); } _setTokenURI(_tokenId, _uri); } function freezeMetadata() public virtual { if (!_canFreezeMetadata()) { revert NFTMetadataUnauthorized(); } uriFrozen = true; emit MetadataFrozen(); } /// @dev Returns whether metadata can be set in the given execution context. function _canSetMetadata() internal view virtual returns (bool); function _canFreezeMetadata() internal view virtual returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @author thirdweb /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ interface IMulticall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "../../eip/interface/IERC4906.sol"; interface INFTMetadata is IERC4906 { /// @dev This event emits when the metadata of all tokens are frozen. /// While not currently supported by marketplaces, this event allows /// future indexing if desired. event MetadataFrozen(); /// @notice Sets the metadata URI for a given NFT. function setTokenURI(uint256 _tokenId, string memory _uri) external; /// @notice Freezes the metadata URI for a given NFT. function freezeMetadata() external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ interface IOwnable { /// @dev Returns the owner of the contract. function owner() external view returns (address); /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin. function setOwner(address _newOwner) external; /// @dev Emitted when a new Owner is set. event OwnerUpdated(address indexed prevOwner, address indexed newOwner); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `PlatformFee` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of platform fee and the platform fee basis points, and lets the inheriting contract perform conditional logic * that uses information about platform fees, if desired. */ interface IPlatformFee { /// @dev Fee type variants: percentage fee and flat fee enum PlatformFeeType { Bps, Flat } /// @dev Returns the platform fee bps and recipient. function getPlatformFeeInfo() external view returns (address, uint16); /// @dev Lets a module admin update the fees on primary sales. function setPlatformFeeInfo(address _platformFeeRecipient, uint256 _platformFeeBps) external; /// @dev Emitted when fee on primary sales is updated. event PlatformFeeInfoUpdated(address indexed platformFeeRecipient, uint256 platformFeeBps); /// @dev Emitted when the flat platform fee is updated. event FlatPlatformFeeUpdated(address platformFeeRecipient, uint256 flatFee); /// @dev Emitted when the platform fee type is updated. event PlatformFeeTypeUpdated(PlatformFeeType feeType); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `Primary` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of primary sales, and lets the inheriting contract perform conditional logic that uses information about * primary sales, if desired. */ interface IPrimarySale { /// @dev The adress that receives all primary sales value. function primarySaleRecipient() external view returns (address); /// @dev Lets a module admin set the default recipient of all primary sales. function setPrimarySaleRecipient(address _saleRecipient) external; /// @dev Emitted when a new sale recipient is set. event PrimarySaleRecipientUpdated(address indexed recipient); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../../eip/interface/IERC2981.sol"; /** * Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic * that uses information about royalty fees, if desired. * * The `Royalty` contract is ERC2981 compliant. */ interface IRoyalty is IERC2981 { struct RoyaltyInfo { address recipient; uint256 bps; } /// @dev Returns the royalty recipient and fee bps. function getDefaultRoyaltyInfo() external view returns (address, uint16); /// @dev Lets a module admin update the royalty bps and recipient. function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external; /// @dev Lets a module admin set the royalty recipient for a particular token Id. function setRoyaltyInfoForToken(uint256 tokenId, address recipient, uint256 bps) external; /// @dev Returns the royalty recipient for a particular token Id. function getRoyaltyInfoForToken(uint256 tokenId) external view returns (address, uint16); /// @dev Emitted when royalty info is updated. event DefaultRoyalty(address indexed newRoyaltyRecipient, uint256 newRoyaltyBps); /// @dev Emitted when royalty recipient for tokenId is set event RoyaltyForToken(uint256 indexed tokenId, address indexed royaltyRecipient, uint256 royaltyBps); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (metatx/ERC2771Context.sol) pragma solidity ^0.8.11; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @dev Context variant with ERC2771 support. */ abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable { mapping(address => bool) private _trustedForwarder; function __ERC2771Context_init(address[] memory trustedForwarder) internal onlyInitializing { __Context_init_unchained(); __ERC2771Context_init_unchained(trustedForwarder); } function __ERC2771Context_init_unchained(address[] memory trustedForwarder) internal onlyInitializing { for (uint256 i = 0; i < trustedForwarder.length; i++) { _trustedForwarder[trustedForwarder[i]] = true; } } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return _trustedForwarder[forwarder]; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../../../../../eip/interface/IERC20.sol"; import { Address } from "../../../../../lib/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; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @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, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; interface IThirdwebContract { /// @dev Returns the module type of the contract. function contractType() external pure returns (bytes32); /// @dev Returns the version of the contract. function contractVersion() external pure returns (uint8); /// @dev Returns the metadata URI of the contract. function contractURI() external view returns (string memory); /** * @dev Sets contract URI for the storefront-level metadata of the contract. * Only module admin can call this function. */ function setContractURI(string calldata _uri) external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; interface IWETH { function deposit() external payable; function withdraw(uint256 amount) external; function transfer(address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.1; /// @author thirdweb, OpenZeppelin Contracts (v4.9.0) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @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, it is bubbled up by this * function (like regular Solidity function calls). * * 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. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @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`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb // Helper interfaces import { IWETH } from "../infra/interface/IWETH.sol"; import { SafeERC20, IERC20 } from "../external-deps/openzeppelin/token/ERC20/utils/SafeERC20.sol"; library CurrencyTransferLib { using SafeERC20 for IERC20; error CurrencyTransferLibMismatchedValue(uint256 expected, uint256 actual); error CurrencyTransferLibFailedNativeTransfer(address recipient, uint256 value); /// @dev The address interpreted as native token of the chain. address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /// @dev Transfers a given amount of currency. function transferCurrency(address _currency, address _from, address _to, uint256 _amount) internal { if (_amount == 0) { return; } if (_currency == NATIVE_TOKEN) { safeTransferNativeToken(_to, _amount); } else { safeTransferERC20(_currency, _from, _to, _amount); } } /// @dev Transfers a given amount of currency. (With native token wrapping) function transferCurrencyWithWrapper( address _currency, address _from, address _to, uint256 _amount, address _nativeTokenWrapper ) internal { if (_amount == 0) { return; } if (_currency == NATIVE_TOKEN) { if (_from == address(this)) { // withdraw from weth then transfer withdrawn native token to recipient IWETH(_nativeTokenWrapper).withdraw(_amount); safeTransferNativeTokenWithWrapper(_to, _amount, _nativeTokenWrapper); } else if (_to == address(this)) { // store native currency in weth if (_amount != msg.value) { revert CurrencyTransferLibMismatchedValue(msg.value, _amount); } IWETH(_nativeTokenWrapper).deposit{ value: _amount }(); } else { safeTransferNativeTokenWithWrapper(_to, _amount, _nativeTokenWrapper); } } else { safeTransferERC20(_currency, _from, _to, _amount); } } /// @dev Transfer `amount` of ERC20 token from `from` to `to`. function safeTransferERC20(address _currency, address _from, address _to, uint256 _amount) internal { if (_from == _to) { return; } if (_from == address(this)) { IERC20(_currency).safeTransfer(_to, _amount); } else { IERC20(_currency).safeTransferFrom(_from, _to, _amount); } } /// @dev Transfers `amount` of native token to `to`. function safeTransferNativeToken(address to, uint256 value) internal { // solhint-disable avoid-low-level-calls // slither-disable-next-line low-level-calls (bool success, ) = to.call{ value: value }(""); if (!success) { revert CurrencyTransferLibFailedNativeTransfer(to, value); } } /// @dev Transfers `amount` of native token to `to`. (With native token wrapping) function safeTransferNativeTokenWithWrapper(address to, uint256 value, address _nativeTokenWrapper) internal { // solhint-disable avoid-low-level-calls // slither-disable-next-line low-level-calls (bool success, ) = to.call{ value: value }(""); if (!success) { IWETH(_nativeTokenWrapper).deposit{ value: value }(); IERC20(_nativeTokenWrapper).safeTransfer(to, value); } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; /// @author thirdweb library FeeType { uint256 internal constant PRIMARY_SALE = 0; uint256 internal constant MARKET_SALE = 1; uint256 internal constant SPLIT = 2; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.11; import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol"; /** * `SignatureMint1155` is an ERC 1155 contract. It lets anyone mint NFTs by producing a mint request * and a signature (produced by an account with MINTER_ROLE, signing the mint request). */ interface ITokenERC1155 is IERC1155Upgradeable { /** * @notice The body of a request to mint NFTs. * * @param to The receiver of the NFTs to mint. * @param royaltyRecipient The recipient of the minted NFT's secondary sales royalties. * @param primarySaleRecipient The recipient of the minted NFT's primary sales proceeds. * @param tokenId Optional: specify only if not first mint. * @param uri The URI of the NFT to mint. * @param quantity The quantity of NFTs to mint. * @param pricePerToken Price to pay for minting with the signature. * @param currency The currency in which the price per token must be paid. * @param validityStartTimestamp The unix timestamp after which the request is valid. * @param validityEndTimestamp The unix timestamp after which the request expires. * @param uid A unique identifier for the request. */ struct MintRequest { address to; address royaltyRecipient; uint256 royaltyBps; address primarySaleRecipient; uint256 tokenId; string uri; uint256 quantity; uint256 pricePerToken; address currency; uint128 validityStartTimestamp; uint128 validityEndTimestamp; bytes32 uid; } /// @dev Emitted when an account with MINTER_ROLE mints an NFT. event TokensMinted(address indexed mintedTo, uint256 indexed tokenIdMinted, string uri, uint256 quantityMinted); /// @dev Emitted when tokens are minted. event TokensMintedWithSignature( address indexed signer, address indexed mintedTo, uint256 indexed tokenIdMinted, MintRequest mintRequest ); /** * @notice Verifies that a mint request is signed by an account holding * MINTER_ROLE (at the time of the function call). * * @param req The mint request. * @param signature The signature produced by an account signing the mint request. * * returns (success, signer) Result of verification and the recovered address. */ function verify( MintRequest calldata req, bytes calldata signature ) external view returns (bool success, address signer); /** * @notice Lets an account with MINTER_ROLE mint an NFT. * * @param to The address to mint the NFT to. * @param tokenId The tokenId of the NFTs to mint * @param uri The URI to assign to the NFT. * @param amount The number of copies of the NFT to mint. * */ function mintTo(address to, uint256 tokenId, string calldata uri, uint256 amount) external; /** * @notice Mints an NFT according to the provided mint request. * * @param req The mint request. * @param signature he signature produced by an account signing the mint request. */ function mintWithSignature(MintRequest calldata req, bytes calldata signature) external payable; }
{ "compilationTarget": { "contracts/prebuilts/token/TokenERC1155.sol": "TokenERC1155" }, "evmVersion": "paris", "libraries": {}, "metadata": { "bytecodeHash": "ipfs" }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"CurrencyTransferLibFailedNativeTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTMetadataFrozen","type":"error"},{"inputs":[],"name":"NFTMetadataInvalidUrl","type":"error"},{"inputs":[],"name":"NFTMetadataUnauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRoyaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"DefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"platformFeeRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"flatFee","type":"uint256"}],"name":"FlatPlatformFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[],"name":"MetadataFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"platformFeeRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeBps","type":"uint256"}],"name":"PlatformFeeInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum IPlatformFee.PlatformFeeType","name":"feeType","type":"uint8"}],"name":"PlatformFeeTypeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"PrimarySaleRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"royaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyBps","type":"uint256"}],"name":"RoyaltyForToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenIdMinted","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"uint256","name":"quantityMinted","type":"uint256"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenIdMinted","type":"uint256"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyBps","type":"uint256"},{"internalType":"address","name":"primarySaleRecipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint128","name":"validityStartTimestamp","type":"uint128"},{"internalType":"uint128","name":"validityEndTimestamp","type":"uint128"},{"internalType":"bytes32","name":"uid","type":"bytes32"}],"indexed":false,"internalType":"struct ITokenERC1155.MintRequest","name":"mintRequest","type":"tuple"}],"name":"TokensMintedWithSignature","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractType","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDefaultRoyaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFlatPlatformFeeInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformFeeInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformFeeType","outputs":[{"internalType":"enum IPlatformFee.PlatformFeeType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRoyaltyInfoForToken","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_defaultAdmin","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"address[]","name":"_trustedForwarders","type":"address[]"},{"internalType":"address","name":"_primarySaleRecipient","type":"address"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint128","name":"_royaltyBps","type":"uint128"},{"internalType":"uint128","name":"_platformFeeBps","type":"uint128"},{"internalType":"address","name":"_platformFeeRecipient","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyBps","type":"uint256"},{"internalType":"address","name":"primarySaleRecipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint128","name":"validityStartTimestamp","type":"uint128"},{"internalType":"uint128","name":"validityEndTimestamp","type":"uint128"},{"internalType":"bytes32","name":"uid","type":"bytes32"}],"internalType":"struct ITokenERC1155.MintRequest","name":"_req","type":"tuple"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenIdToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primarySaleRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"saleRecipientForToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"}],"name":"setDefaultRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformFeeRecipient","type":"address"},{"internalType":"uint256","name":"_flatFee","type":"uint256"}],"name":"setFlatPlatformFeeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformFeeRecipient","type":"address"},{"internalType":"uint256","name":"_platformFeeBps","type":"uint256"}],"name":"setPlatformFeeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IPlatformFee.PlatformFeeType","name":"_feeType","type":"uint8"}],"name":"setPlatformFeeType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_saleRecipient","type":"address"}],"name":"setPrimarySaleRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"setRoyaltyInfoForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyBps","type":"uint256"},{"internalType":"address","name":"primarySaleRecipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint128","name":"validityStartTimestamp","type":"uint128"},{"internalType":"uint128","name":"validityEndTimestamp","type":"uint128"},{"internalType":"bytes32","name":"uid","type":"bytes32"}],"internalType":"struct ITokenERC1155.MintRequest","name":"_req","type":"tuple"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
d76fad23a3976fdae3844834893d9f299989c96a548fe621d4a8b867efc61c932b323de301000bcd3deed93a0e87fa9f93b002daafba91a2f808b8f949657e0b45e6484b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x000400000000000200180000000000020000000003010019000000600330027000000abd0030019d00000abd04300197000300000041035500020000000103550000000100200190000000390000c13d0000008002000039000000400020043f000000040040008c0000005c0000413d000000000201043b000000e00220027000000ac80020009c000000810000a13d00000ac90020009c000000a80000a13d00000aca0020009c000000ee0000213d00000ad40020009c000002560000a13d00000ad50020009c000003ae0000213d00000ad80020009c000005c60000613d00000ad90020009c0000005c0000c13d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000002402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000000401100370000000000101043b000d00000001001d000000000010043f000000fd01000039000000200010043f000000400200003900000000010000192af12ab60000040f0000000101100039000000000101041a2af123910000040f0000000d010000290000000e020000292af1251c0000040f000000000100001900002af20001042e0000008001000039000000400010043f0000000002000416000000000002004b0000005c0000c13d0000000004000415000000170440008a0000000504400210000000000200041a0000ff00032001900000005e0000c13d0000000004000415000000160440008a0000000504400210000000ff002001900000005e0000c13d00000ac40220019700000001022001bf000000000020041b0000000103000039000000000031043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d0200003900000ac6040000412af12ae20000040f0000000100200190000000da0000c13d000000000100001900002af300010430000e00000004001d000c00000003001d000d00000002001d00000abe01000041000000000010044300000000010004100000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f00000001002001900000163e0000613d000000000101043b000000000001004b000000df0000c13d0000000d02000029000000ff0120018f000000010010008c0000000e010000290000000501100270000000000100003f000000010100603f000000e20000c13d00000ba70120019700000001011001bf000000000010041b0000000c0000006b000000da0000c13d000000400100043d0000000d02000029000000490000013d00000aee0020009c000000bc0000213d00000b000020009c000001980000a13d00000b010020009c000002130000a13d00000b020020009c0000030b0000213d00000b050020009c0000042d0000613d00000b060020009c0000005c0000c13d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b2af11faf0000040f00000024030000390000000203300367000000000303043b000e00000001001d0000ffff0220018f00000000010300192af11fa10000040f000027100110011a000000400200043d000000200320003900000000001304350000000e0100002900000b1101100197000000000012043500000abd0020009c00000abd02008041000000400120021000000b47011001c700002af20001042e00000add0020009c000001600000a13d00000ade0020009c000001d40000a13d00000adf0020009c000002fd0000213d00000ae20020009c000003fa0000613d00000ae30020009c0000005c0000c13d0000000001000416000000000001004b0000005c0000c13d0000019c01000039000000000101041a0000019b02000039000000000202041a00000b1102200197000000800020043f000005d00000013d00000aef0020009c000001be0000a13d00000af00020009c000002280000a13d00000af10020009c0000039b0000213d00000af40020009c000004320000613d00000af50020009c0000005c0000c13d0000000001000416000000000001004b0000005c0000c13d0000019701000039000000000101041a00000b1101100197000e00000001001d000000000010043f00000b3601000041000000200010043f000000400200003900000000010000192af12ab60000040f000000000101041a000000ff001001900000000e010000290000000001006019000000800010043f00000b170100004100002af20001042e00000020010000390000010000100443000001200000044300000ac70100004100002af20001042e0000000e010000290000000501100270000000000100003f00000ac001000041000000800010043f0000002001000039000000840010043f0000002e01000039000000a40010043f00000ac101000041000000c40010043f00000ac201000041000000e40010043f00000ac30100004100002af30001043000000acb0020009c0000028f0000a13d00000acc0020009c000003be0000213d00000acf0020009c000005d40000613d00000ad00020009c0000005c0000c13d000000a40040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002402100370000000000202043b000800000002001d00000b110020009c0000005c0000213d0000008402100370000000000302043b00000b180030009c0000005c0000213d0000002302300039000000000042004b0000005c0000813d0000000405300039000000000251034f000000000202043b00000b180020009c00000b100000213d0000001f0620003900000ba8066001970000003f0660003900000ba80660019700000b190060009c00000b100000213d00000024033000390000008006600039000000400060043f000000800020043f0000000003320019000000000043004b0000005c0000213d0000002003500039000000000331034f00000ba8042001980000001f0520018f000000a0014000390000012a0000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000001260000c13d000000000005004b000001370000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a00120003900000000000104350000000001000411000700000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000001510000613d000000140100008a00000000011000310000000201100367000000000101043b00000060011002700000000e0110014f00000b110010019800000f620000c13d000000080000006b00000fbb0000c13d000000400100043d000000640210003900000b96030000410000000000320435000000440210003900000b970300004100000000003204350000002402100039000000250300003900000c150000013d00000ae70020009c000002070000213d00000aeb0020009c000007b80000613d00000aec0020009c000007920000613d00000aed0020009c0000005c0000c13d000000440040008c0000005c0000413d0000000402100370000000000202043b000e00000002001d00000b180020009c0000005c0000213d0000000e0240006a00000b5b0020009c0000005c0000213d000001840020008c0000005c0000413d0000002402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d0000000403200039000000000131034f000000000301043b00000b180030009c0000005c0000213d00000024022000390000000001230019000000000041004b0000005c0000213d0000003504000039000000000104041a000000020010008c000001fd0000613d0000000e0100002900000004011000390000000205000039000000000054041b000d00000001001d2af11fd90000040f000c00000002001d000000000001004b00000d790000c13d000000400100043d000000440210003900000b7603000041000000000032043500000024021000390000001103000039000008260000013d00000b0a0020009c000002a30000213d00000b0e0020009c00000a530000613d00000b0f0020009c000009be0000613d00000b100020009c0000005c0000c13d0000000001000416000000000001004b0000005c0000c13d0000019503000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000054004b00000a4d0000c13d000000800010043f000000000004004b00000aff0000613d000000000030043f000000000001004b00000b390000613d00000b2d0200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b000001b50000413d00000be80000013d00000af90020009c000002cc0000213d00000afd0020009c00000a670000613d00000afe0020009c000009d30000613d00000aff0020009c0000005c0000c13d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b2af11faf0000040f0000ffff0220018f000000400300043d0000002004300039000000000024043500000b1101100197000004070000013d00000ae40020009c0000075c0000613d00000ae50020009c000007010000613d00000ae60020009c0000005c0000c13d000000840040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002402100370000000000202043b000d00000002001d0000004402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d0000000403200039000000000131034f000000000101043b000c00000001001d00000b180010009c0000005c0000213d0000002402200039000b00000002001d0000000c01200029000000000041004b0000005c0000213d0000003502000039000000000102041a000000020010008c00000cc00000c13d00000ac001000041000000800010043f0000002001000039000000840010043f0000001f01000039000000a40010043f00000b7701000041000000c40010043f00000b780100004100002af30001043000000ae80020009c000007f40000613d00000ae90020009c000007b10000613d00000aea0020009c0000005c0000c13d0000000001000416000000000001004b0000005c0000c13d000000800000043f00000b170100004100002af20001042e00000b070020009c0000086c0000613d00000b080020009c0000080f0000613d00000b090020009c0000005c0000c13d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000000000010043f000000fd01000039000000200010043f000000400200003900000000010000192af12ab60000040f000000010110003900000a3a0000013d00000af60020009c000008da0000613d00000af70020009c000008310000613d00000af80020009c0000005c0000c13d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002401100370000000000101043b000d00000001001d2af122c80000040f0000019d010000390000000d04000029000000000041041b0000019a01000039000000000201041a00000b32022001970000000e03000029000000000232019f000000000021041b000000400100043d00000020021000390000000000420435000000000031043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b12011001c70000800d02000039000000010300003900000b7d040000410000042c0000013d00000ada0020009c00000a2d0000613d00000adb0020009c0000084b0000613d00000adc0020009c0000005c0000c13d0000000001000416000000000001004b0000005c0000c13d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000002760000613d000000140100008a00000000011000310000000201100367000000000101043b000000600110027000000b1101100197000000000010043f00000b4401000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000b870000c13d000000400100043d00000b9c02000041000000000021043500000abd0010009c00000abd01008041000000400110021000000b9d011001c700002af30001043000000ad10020009c00000a3e0000613d00000ad20020009c000008520000613d00000ad30020009c0000005c0000c13d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000000000010043f000001a201000039000000200010043f000000400200003900000000010000192af12ab60000040f00000a960000013d00000b0b0020009c00000a920000613d00000b0c0020009c000009d80000613d00000b0d0020009c0000005c0000c13d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000e00000001001d00000b110010009c0000005c0000213d2af122c80000040f0000000e01000029000000000010043f00000b3601000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000b950000c13d000000400100043d000000440210003900000b9f03000041000000000032043500000024021000390000001b03000039000008260000013d00000afa0020009c00000a9b0000613d00000afb0020009c00000a170000613d00000afc0020009c0000005c0000c13d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002401100370000000000101043b000d00000001001d2af122c80000040f0000000d03000029000027110030008c000008080000813d0000019b01000039000000000201041a00000b32022001970000000e05000029000000000252019f000000000021041b0000019c01000039000000000201041a00000b3302200197000000000232019f000000000021041b000000400100043d000000000031043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000020300003900000b410400004100000b310000013d00000ae00020009c0000040d0000613d00000ae10020009c0000005c0000c13d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000000000010043f000001a10100003900000a360000013d00000b030020009c000004770000613d00000b040020009c0000005c0000c13d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d0000002401100370000000000101043b000d00000001001d00000b110010009c0000005c0000213d0000000e01000029000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000101100039000000000101041a2af123910000040f0000000e01000029000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000d02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000003900000c13d0000000e01000029000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000d02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000001000411000c00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000003810000613d000000140100008a00000000011000310000000201100367000000000101043b000c006000100278000000000100041400000abd0010009c00000abd01008041000000c0011002100000000c0200002900000b110720019700000b37011001c70000800d02000039000000040300003900000b38040000410000000e050000290000000d060000292af12ae20000040f00000001002001900000005c0000613d0000000e01000029000000000010043f0000012f01000039000000200010043f000000400200003900000000010000192af12ab60000040f0000000d020000292af129600000040f000000000100001900002af20001042e00000af20020009c000005ad0000613d00000af30020009c0000005c0000c13d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000002402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000000401100370000000000101043b000000000010043f000000fd01000039000008620000013d00000ad60020009c000005d90000613d00000ad70020009c0000005c0000c13d0000000001000416000000000001004b0000005c0000c13d0000019d01000039000000000101041a0000019a02000039000000000202041a00000b1102200197000000800020043f000000a00010043f00000b1e0100004100002af20001042e00000acd0020009c000006f30000613d00000ace0020009c0000005c0000c13d000000640040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000800000002001d00000b110020009c0000005c0000213d0000004402100370000000000202043b000500000002001d0000002401100370000000000101043b000700000001001d0000000001000411000600000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000003ea0000613d000000140100008a00000000011000310000000201100367000000000101043b000000600110027000000b11011001970000000802000029000000000012004b00000b450000c13d000000000002004b00000c200000c13d000000400100043d000000640210003900000b83030000410000000000320435000000440210003900000b840300004100000000003204350000002402100039000000230300003900000c150000013d0000000001000416000000000001004b0000005c0000c13d00000000010400192af11f4a0000040f2af11fd90000040f00000b1102200197000000400300043d00000020043000390000000000240435000000000001004b0000000001000039000000010100c039000000000013043500000abd0030009c00000abd03008041000000400130021000000b47011001c700002af20001042e000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000e00000001001d000000010010008c0000005c0000213d2af122c80000040f0000019e01000039000000000201041a00000ba7022001970000000e03000029000000000232019f000000000021041b000000400100043d000000000031043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000010300003900000b460400004100000b310000013d0000000001000416000000000001004b0000005c0000c13d000001930100003900000a260000013d0000000001000416000000000001004b0000005c0000c13d0000000101000039000000000101041a000000000001004b00000af50000c13d0000000201000039000000000101041a000000000001004b00000af50000c13d2af11eaa0000040f000b00000001001d2af11ee40000040f000c00000001001d000000400100043d000d00000001001d2af11e8d0000040f0000000d010000290000000000010435000000e001000039000000400300043d000e00000003001d0000002002300039000000000012043500000b7b010000410000000000130435000000e0023000390000000b010000292af11f2b0000040f00000000020100190000000e030000290000000001320049000000400330003900000000001304350000000c010000292af11f2b0000040f000c00000001001d0000800b0100003900000004030000390000000004000415000000180440008a000000050440021000000b7c020000412af12acb0000040f0000000e04000029000000c0054000390000000c020000290000000003420049000000000035043500000000050004100000008003400039000000000053043500000060034000390000000000130435000000a00140003900000000000104350000000d010000292af11f3d0000040f0000000e02000029000000000121004900000abd0020009c00000abd02008041000000400220021000000abd0010009c00000abd010080410000006001100210000000000121019f00002af20001042e000000a40040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002402100370000000000202043b000d00000002001d00000b110020009c0000005c0000213d0000004402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d0000000403200039000000000331034f000000000503043b00000b180050009c00000b100000213d00000005035002100000003f0630003900000b1f0660019700000b190060009c00000b100000213d0000008006600039000000400060043f000000800050043f00000024022000390000000003230019000000000043004b0000005c0000213d000000000005004b000004a80000613d0000008005000039000000000621034f000000000606043b000000200550003900000000006504350000002002200039000000000032004b000004a10000413d0000006402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b000000000500001900000b530500804100000b5303300197000000000003004b000000000600001900000b530600404100000b530030009c000000000605c019000000000006004b0000005c0000c13d0000000403200039000000000331034f000000000303043b00000b180030009c00000b100000213d00000005053002100000003f0650003900000b1f06600197000000400700043d0000000006670019000c00000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d000000400060043f0000000c060000290000000006360436000a00000006001d00000024022000390000000005250019000000000045004b0000005c0000213d000000000003004b000004dc0000613d0000000c03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000052004b000004d50000413d0000008402100370000000000302043b00000b180030009c0000005c0000213d0000002302300039000000000042004b000000000500001900000b530500804100000b5302200197000000000002004b000000000600001900000b530600404100000b530020009c000000000605c019000000000006004b0000005c0000c13d0000000405300039000000000251034f000000000202043b00000b180020009c00000b100000213d0000001f0620003900000ba8066001970000003f0660003900000ba806600197000000400700043d0000000006670019000400000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d0000002403300039000000400060043f00000004060000290000000006260436000600000006001d0000000003320019000000000043004b0000005c0000213d0000002003500039000000000331034f00000ba8042001980000001f0520018f0000000601400029000005130000613d000000000603034f0000000607000029000000006806043c0000000007870436000000000017004b0000050f0000c13d000000000005004b000005200000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000060120002900000000000104350000000001000411000300000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000000010004110000053a0000613d000000140100008a00000000011000310000000201100367000000000101043b00000060011002700000000e0200002900080b110020019b00000b1101100197000000080010006b000012370000c13d0000000c010000290000000001010433000000800200043d000000000012004b000011960000c13d0000000d0100002900050b110010019c000001560000613d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000055d0000613d000000140100008a00000000011000310000000201100367000000000101043b0003006000100278000000000000043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000080000006b000014990000613d000000000101041a000000ff00100190000014990000c13d00000b3c01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000802000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000005ab0000c13d00000b3c01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000502000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000101f0000613d000000800100043d000014c20000013d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000000000020043f0000012f02000039000000200020043f0000002401100370000000000101043b000e00000001001d000000400200003900000000010000192af12ab60000040f0000000e020000292af129450000040f0000000302200210000000000101041a000000000121022f00000b1101100197000000ff0020008c000000000100201900000a600000013d0000000001000416000000000001004b0000005c0000c13d0000019c01000039000000000101041a0000019a02000039000000000202041a00000b1102200197000000800020043f00000080011002700000ffff0110018f000000a00010043f00000b1e0100004100002af20001042e0000000001000416000000000001004b0000005c0000c13d0000019a0100003900000a960000013d000001440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002402100370000000000302043b00000b180030009c0000005c0000213d0000002302300039000000000042004b0000005c0000813d0000000405300039000000000251034f000000000202043b00000b180020009c00000b100000213d0000001f0620003900000ba8066001970000003f0660003900000ba80660019700000b190060009c00000b100000213d00000024033000390000008006600039000000400060043f000000800020043f0000000003320019000000000043004b0000005c0000213d0000002003500039000000000531034f00000ba8062001980000001f0720018f000000a003600039000006080000613d000000a008000039000000000905034f000000009a09043c0000000008a80436000000000038004b000006040000c13d000000000007004b000006150000613d000000000565034f0000000306700210000000000703043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000530435000000a00220003900000000000204350000004402100370000000000302043b00000b180030009c0000005c0000213d0000002302300039000000000042004b0000005c0000813d0000000405300039000000000251034f000000000202043b00000b180020009c00000b100000213d0000001f0620003900000ba8066001970000003f0660003900000ba806600197000000400700043d0000000006670019000d00000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d0000002403300039000000400060043f0000000d060000290000000006260436000c00000006001d0000000003320019000000000043004b0000005c0000213d0000002003500039000000000531034f00000ba8062001980000001f0720018f0000000c03600029000006450000613d000000000805034f0000000c09000029000000008a08043c0000000009a90436000000000039004b000006410000c13d000000000007004b000006520000613d000000000565034f0000000306700210000000000703043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005304350000000c0220002900000000000204350000006402100370000000000302043b00000b180030009c0000005c0000213d0000002302300039000000000042004b0000005c0000813d0000000405300039000000000251034f000000000202043b00000b180020009c00000b100000213d0000001f0620003900000ba8066001970000003f0660003900000ba806600197000000400700043d0000000006670019000b00000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d0000002403300039000000400060043f0000000b060000290000000006260436000a00000006001d0000000003320019000000000043004b0000005c0000213d0000002003500039000000000531034f00000ba8062001980000001f0720018f0000000a03600029000006820000613d000000000805034f0000000a09000029000000008a08043c0000000009a90436000000000039004b0000067e0000c13d000000000007004b0000068f0000613d000000000565034f0000000306700210000000000703043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005304350000000a0220002900000000000204350000008402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d0000000403200039000000000331034f000000000303043b00000b180030009c00000b100000213d00000005053002100000003f0650003900000b1f06600197000000400700043d0000000006670019000800000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d000000400060043f00000008060000290000000006360436000700000006001d00000024022000390000000005250019000000000045004b0000005c0000213d000000000003004b000006be0000613d0000000803000029000000000421034f000000000404043b00000b110040009c0000005c0000213d000000200330003900000000004304350000002002200039000000000052004b000006b50000413d000000a402100370000000000202043b000600000002001d00000b110020009c0000005c0000213d000000c402100370000000000202043b001300000002001d000500000002001d00000b110020009c0000005c0000213d000000e402100370000000000202043b000400000002001d00000b200020009c0000005c0000213d0000010402100370000000000202043b00000b200020009c0000005c0000213d0000012401100370000000000101043b000300000001001d00000b110010009c0000005c0000213d000000000100041a000900000001001d0001ff0000100194000015de0000c13d0000000001000415000000110110008a00020005001002180000000901000029000000ff00100190001100000000003d001100010000603d000015e20000c13d000000090100002900000ac40110019700000101011001bf000000000010041b0000ff0000100190000016020000c13d000000400100043d000000640210003900000b42030000410000000000320435000000440210003900000b4303000041000000000032043500000024021000390000002b0300003900000c150000013d0000000001000416000000000001004b0000005c0000c13d0000019e01000039000000000101041a000000ff0110018f000000010010008c00000a980000a13d00000b6b01000041000000000010043f0000002101000039000000040010043f00000b6c0100004100002af300010430000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000c00000002001d00000b180020009c0000005c0000213d0000000c020000290000002302200039000000000042004b0000005c0000813d0000000c020000290000000402200039000000000121034f000000000101043b000b00000001001d00000b180010009c0000005c0000213d0000000b0100002900000005011002100000000c0200002900000024032000390000000002310019000000000042004b0000005c0000213d0000003f0210003900000b1f0220019700000b190020009c00000b100000213d000900000003001d0000008002200039000000400020043f0000000b02000029000000800020043f000000000002004b0000072f0000613d00000060020000390000000003000019000000a00430003900000000002404350000002003300039000000000013004b0000072a0000413d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000000090a0000290000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000007470000613d000000140100008a00000000011000310000000201100367000000000101043b00000060011002700000000b0000006b00000d930000c13d000000400100043d00000020020000390000000003210436000000800200043d0000000000230435000000400310003900000005042002100000000007340019000000000002004b00000f460000c13d000000000217004900000abd0020009c00000abd02008041000000600220021000000abd0010009c00000abd010080410000004001100210000000000112019f00002af20001042e000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002401100370000000000201043b000000000002004b0000000001000039000000010100c039000d00000002001d000000000012004b0000005c0000c13d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000007850000613d000000140100008a00000000011000310000000201100367000000000101043b000000600110027000000b11021001970000000e0020006c00000c8b0000c13d000000400100043d000000640210003900000b58030000410000000000320435000000440210003900000b590300004100000000003204350000002402100039000000290300003900000c150000013d0000000001000416000000000001004b0000005c0000c13d0000019603000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000552013f000000010050019000000a4d0000c13d000000800010043f000000000004004b00000aff0000613d000000000030043f000000000001004b00000b390000613d00000b300200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b000007a80000413d00000be80000013d0000000001000416000000000001004b0000005c0000c13d0000000101000039000000800010043f00000b170100004100002af20001042e000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d000d00040020003d0000000d01100360000000000101043b000e00000001001d00000b180010009c0000005c0000213d0000002402200039000c00000002001d0000000e01200029000000000041004b0000005c0000213d2af122c80000040f0000019f01000039000000000301041a000000010030019000000001023002700000007f0220618f0000001f0020008c00000000040000390000000104002039000000000343013f000000010030019000000a4d0000c13d000000200020008c0000000e05000029000007ed0000413d000000000010043f0000001f03500039000000050330027000000b340330009a000000200050008c00000b1d030040410000001f02200039000000050220027000000b340220009a000000000023004b000007ed0000813d000000000003041b0000000103300039000000000023004b000007e90000413d0000001f0050008c00000d6c0000a13d00000ba80350019800000f280000c13d00000b1d02000041000000000400001900000f340000013d000000640040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d0000002402100370000000000202043b000d00000002001d00000b110020009c0000005c0000213d0000004401100370000000000101043b000c00000001001d2af122c80000040f0000000c01000029000027100010008c00000b0c0000a13d000000400100043d000000440210003900000b8503000041000000000032043500000024021000390000001203000039000008260000013d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002401100370000000000101043b000d00000001001d2af122c80000040f0000000d04000029000027110040008c00000b160000413d000000400100043d000000440210003900000b9903000041000000000032043500000024021000390000000f03000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b50011001c700002af300010430000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000e00000001001d00000b110010009c0000005c0000213d2af122c80000040f0000019901000039000000000201041a00000b32022001970000000e05000029000000000252019f000000000021041b000000000100041400000abd0010009c00000abd01008041000000c00110021000000b37011001c70000800d02000039000000020300003900000b3f0400004100000b310000013d0000000001000416000000000001004b0000005c0000c13d00000b2201000041000000800010043f00000b170100004100002af20001042e000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b00000b110020009c0000005c0000213d0000002401100370000000000101043b000e00000001001d00000b110010009c0000005c0000213d000000000020043f0000016201000039000000200010043f000000400200003900000000010000192af12ab60000040f0000000e02000029000000000020043f000000200010043f0000000001000019000000400200003900000a250000013d000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d0000002402100370000000000302043b00000b180030009c0000005c0000213d0000002302300039000000000042004b0000005c0000813d0000000405300039000000000251034f000000000202043b00000b9a0020009c00000b100000813d0000001f0720003900000ba8077001970000003f0770003900000ba80770019700000b190070009c00000b100000213d00000024033000390000008007700039000000400070043f000000800020043f0000000003320019000000000043004b0000005c0000213d0000002003500039000000000331034f00000ba8042001980000001f0520018f000000a001400039000008990000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000008950000c13d000000000005004b000008a60000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a00120003900000000000104350000000001000411000d00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000008bf0000613d000000140100008a00000000011000310000000201100367000000000101043b000d0060001002780000000d0100002900000b1101100197000000000010043f00000b4401000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000002870000613d0000019301000039000000000101041a000000ff0010019000000fb00000c13d00000080020000390000000e010000292af124730000040f000000000100001900002af20001042e000000640040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b000e00000002001d00000b110020009c0000005c0000213d0000002402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d0000000403200039000000000331034f000000000503043b00000b180050009c00000b100000213d00000005035002100000003f0630003900000b1f0660019700000b190060009c00000b100000213d0000008006600039000000400060043f000000800050043f00000024022000390000000003230019000000000043004b0000005c0000213d000000000005004b000009060000613d0000008005000039000000000621034f000000000606043b000000200550003900000000006504350000002002200039000000000032004b000008ff0000413d0000004402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b000000000500001900000b530500804100000b5303300197000000000003004b000000000600001900000b530600404100000b530030009c000000000605c019000000000006004b0000005c0000c13d0000000403200039000000000331034f000000000303043b00000b180030009c00000b100000213d00000005053002100000003f0650003900000b1f06600197000000400700043d0000000006670019000c00000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d000000400060043f0000000c060000290000000006360436000b00000006001d00000024022000390000000005250019000000000045004b0000005c0000213d000000000003004b0000093a0000613d0000000c03000029000000000421034f000000000404043b000000200330003900000000004304350000002002200039000000000052004b000009330000413d0000000001000411000800000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000009520000613d000000140100008a00000000011000310000000201100367000000000101043b00000060011002700000000e02000029000a0b110020019b00000b11011001970000000a0010006b000010e60000c13d0000000a0000006b000003f00000613d0000000c010000290000000001010433000000800200043d000000000012004b000011960000c13d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000009740000613d000000140100008a00000000011000310000000201100367000000000101043b0008006000100278000000400100043d00000b140010009c00000b100000213d0000002002100039000000400020043f0000000000010435000000000000043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000800100043d000000000001004b000013130000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000004004b0000099a0000613d000000800500003900000000060000190000002005500039000000000705043300000000037304360000000106600039000000000046004b000009940000413d000000080400002900000b1105400197000000000413004900000000004204350000000c0200002900000000040204330000000002430436000000000004004b000009ab0000613d00000000030000190000000c070000290000002007700039000000000607043300000000026204360000000103300039000000000043004b000009a50000413d000000000212004900000abd0020009c00000abd02008041000000600220021000000abd0010009c00000abd010080410000004001100210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000121019f00000b37011001c70000800d02000039000000040300003900000b82040000410000000a060000290000118e0000013d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000201043b00000b1b002001980000005c0000c13d000000010100003900000ba00020009c00000b3b0000213d00000ba40020009c00000a980000613d00000ba50020009c00000a980000613d00000ba60020009c000000000100c019000000800010043f00000b170100004100002af20001042e0000000001000416000000000001004b0000005c0000c13d000001980100003900000a3a0000013d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000000000010043f0000019401000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a000000010320019000000001062002700000007f0660618f0000001f0060008c00000000040000390000000104002039000000000442013f000000010040019000000a4d0000c13d000000400500043d0000000004650436000000000003004b000e00000005001d00000bfc0000613d000c00000004001d000d00000006001d000000000010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d0000000d06000029000000000006004b00000000020000190000000e050000290000000c0700002900000c010000613d000000000101043b00000000020000190000000003270019000000000401041a000000000043043500000001011000390000002002200039000000000062004b00000a0f0000413d00000c010000013d000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b00000b110010009c0000005c0000213d000000000010043f0000009901000039000000200010043f000000400200003900000000010000192af12ab60000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f00000b170100004100002af20001042e000000240040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000401100370000000000101043b000000000010043f0000012f01000039000000200010043f000000400200003900000000010000192af12ab60000040f000000000101041a000000800010043f00000b170100004100002af20001042e0000000001000416000000000001004b0000005c0000c13d0000019f03000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f000000010060019000000b030000613d00000b6b01000041000000000010043f0000002201000039000000040010043f00000b6c0100004100002af300010430000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000302043b00000b110030009c0000005c0000213d0000002401100370000000000201043b00000000010300192af11f6c0000040f000000400200043d000000000012043500000abd0020009c00000abd02008041000000400120021000000b79011001c700002af20001042e000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000002401100370000000000101043b000e00000001001d00000b110010009c0000005c0000213d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000000000100041100000a880000613d000000140100008a00000000011000310000000201100367000000000101043b00000060011002700000000e02000029000000000121013f00000b110010019800000c0c0000c13d00000004010000390000000201100367000000000101043b2af1251c0000040f000000000100001900002af20001042e0000000001000416000000000001004b0000005c0000c13d0000019901000039000000000101041a00000b1101100197000000800010043f00000b170100004100002af20001042e000000440040008c0000005c0000413d0000000002000416000000000002004b0000005c0000c13d0000000402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b0000005c0000813d0000000403200039000000000331034f000000000503043b00000b180050009c00000b100000213d00000005035002100000003f0630003900000b1f0660019700000b190060009c00000b100000213d0000008006600039000000400060043f000000800050043f00000024022000390000000003230019000000000043004b0000005c0000213d000000000005004b00000ac40000613d0000008005000039000000000621034f000000000606043b00000b110060009c0000005c0000213d000000200550003900000000006504350000002002200039000000000032004b00000abb0000413d0000002402100370000000000202043b00000b180020009c0000005c0000213d0000002303200039000000000043004b000000000500001900000b530500804100000b5303300197000000000003004b000000000600001900000b530600404100000b530030009c000000000605c019000000000006004b0000005c0000c13d0000000403200039000000000331034f000000000303043b00000b180030009c00000b100000213d00000005053002100000003f0650003900000b1f06600197000000400700043d0000000006670019000b00000007001d000000000076004b0000000007000039000000010700403900000b180060009c00000b100000213d000000010070019000000b100000c13d000000400060043f0000000b060000290000000006360436000a00000006001d00000024022000390000000005250019000000000045004b0000005c0000213d000000000003004b000010460000c13d000000800200043d000000000002004b0000000002000019000010550000613d0000107b0000013d00000ac001000041000000800010043f0000002001000039000000840010043f0000001501000039000000a40010043f00000b7a01000041000000c40010043f00000b780100004100002af30001043000000ba702200197000000a00020043f000000000001004b00000b090000013d000000800010043f000000000005004b00000b360000c13d00000ba701200197000000a00010043f000000000004004b000000c001000039000000a00100603900000be90000013d000000400100043d000b00000001001d00000b130010009c00000ba80000a13d00000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af300010430000000800140021000000b98011001970000019c02000039000000000302041a00000b2003300197000000000113019f000000000012041b0000019a01000039000000000201041a00000b32022001970000000e05000029000000000252019f000000000021041b000000400100043d000000000041043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000020300003900000b40040000412af12ae20000040f00000001002001900000005c0000613d000000000100001900002af20001042e000000000030043f000000020020008c00000bde0000813d000000a00100003900000be90000013d00000ba10020009c00000a980000613d00000ba20020009c00000a980000613d00000ba30020009c00000a980000613d0000000001000019000000800010043f00000b170100004100002af20001042e0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000e00000001001d00000b5d0000613d000000140100008a00000000011000310000000201100367000000000101043b000e0060001002780000000801000029000000000010043f0000016201000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e0200002900000b1102200197000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000802000029000003ee0000c13d000000400100043d000000640210003900000b7e030000410000000000320435000000440210003900000b7f03000041000000000032043500000024021000390000002a0300003900000c150000013d0000019301000039000000000201041a00000ba70220019700000001022001bf000000000021041b000000000100041400000abd0010009c00000abd01008041000000c00110021000000b37011001c70000800d02000039000000010300003900000b45040000410000042c0000013d0000019701000039000000000201041a00000b32032001970000000e06000029000000000363019f000000000031041b000000000100041400000b110520019700000abd0010009c00000abd01008041000000c00110021000000b37011001c70000800d02000039000000030300003900000b9e040000412af12ae20000040f00000001002001900000005c0000613d00000b340000013d0000000b020000290000004001200039000000400010043f0000000d0100002900000000021204360000000c01000029000a00000002001d00000000001204350000000e01000029000000000010043f000001a301000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d0000000b02000029000000000202043300000b1102200197000000000101043b000000000301041a00000b3203300197000000000223019f000000000021041b00000001011000390000000a020000290000000002020433000000000021041b000000400100043d0000000c02000029000000000021043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000030300003900000b5a040000410000000e050000290000000d060000292af12ae20000040f00000001002001900000005c0000613d00000b340000013d00000b1d0200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b00000be00000413d000000c001300039000000800210008a00000080010000392af11e980000040f0000002001000039000000400200043d000e00000002001d000000000212043600000080010000392af11f2b0000040f0000000e02000029000000000121004900000abd0010009c00000abd01008041000000600110021000000abd0020009c00000abd020080410000004002200210000000000121019f00002af20001042e00000ba7012001970000000000140435000000000006004b00000020020000390000000002006039000000200220003900000000010500192af11e980000040f0000002001000039000000400200043d000d00000002001d00000000021204360000000e010000292af11f2b0000040f0000000d0200002900000bf30000013d000000400100043d000000640210003900000b8b030000410000000000320435000000440210003900000b8c03000041000000000032043500000024021000390000002f03000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b21011001c700002af3000104300000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000c360000613d000000140100008a00000000011000310000000201100367000000000101043b0006006000100278000000400100043d000c00000001001d00000b130010009c00000b100000213d0000000c020000290000004001200039000000400010043f000000010100003900000000031204360000000702000029000a00000003001d0000000000230435000000400200043d000b00000002001d00000b130020009c00000b100000213d0000000b030000290000004002300039000000400020043f00000000021304360000000501000029000900000002001d0000000000120435000000400100043d00000b140010009c00000b100000213d0000002002100039000000400020043f0000000000010435000000000000043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d0000000c010000290000000001010433000000000001004b000010820000c13d0000000701000029000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000802000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000e0005001000740000115c0000813d000000400100043d000000640210003900000b80030000410000000000320435000000440210003900000b810300004100000000003204350000002402100039000000240300003900000c150000013d000c00000002001d000000000020043f0000016201000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba7022001970000000d04000029000000ff0340018f000000000232019f000000000021041b000000400100043d000000000041043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000030300003900000b57040000410000000c050000290000000e060000292af12ae20000040f00000001002001900000005c0000613d00000b340000013d0000000201000039000000000012041b0000000001000411000a00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000cd90000613d000000140100008a00000000011000310000000201100367000000000101043b000a0060001002780000000a0100002900000b1101100197000a00000001001d000000000010043f00000b4801000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000fa30000c13d000000400200043d00000b490020009c00000b100000213d0000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000203300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b00000cf70000c13d000000000401043300000b4a0440019700000b4b044001c700000000004104350000002104200039000000000504043300000b4a0550019700000b4c055001c7000000000054043500000029040000390000000a0600002900000000050600190000000006020433000000000046004b000015c70000a13d0000000006140019000000000706043300000b4a077001970000000308500210000000780880018f00000b4d0880021f00000b4e08800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c00000d060000213d000000100050008c000010d40000813d000000400400043d000e00000004001d00000b190040009c00000b100000213d0000000e060000290000008004600039000000400040043f00000042050000390000000005560436000d00000005001d000000003603043c0000000005650436000000000045004b00000d230000c13d0000000d09000029000000000309043300000b4a0330019700000b4b033001c700000000003904350000000e080000290000002103800039000000000403043300000b4a0440019700000b4c044001c7000000000043043500000b3b05000041000000410300003900000000040500190000000005080433000000000035004b000015c70000a13d0000000005390019000000000605043300000b4a066001970000000307400210000000780770018f00000b4d0770021f00000b4e07700197000000000676019f00000000006504350000000405400270000000010330008a000000010030008c00000d340000213d000000100040008c000010d40000813d000000400500043d000c00000005001d000000200350003900000b510400004100000000004304350000000003020433000b00000003001d00000037025000392af11f1e0000040f0000000b020000290000000c01200029000000370210003900000b5203000041000000000032043500000048021000390000000e010000290000000003010433000e00000003001d0000000d010000292af11f1e0000040f0000000e020000290000000b0320002900000028023000390000000c01000029000000000021043500000048023000392af11e980000040f00000ac001000041000000400300043d000e00000003001d000000000013043500000020010000390000000402300039000000000012043500000024023000390000000c01000029000010c90000013d000000000005004b000000000200001900000d730000613d0000000d0200002900000020022000390000000202200367000000000202043b000000030350021000000ba90330027f00000ba903300167000000000332016f000000010250021000000f420000013d0000000e010000290000012401100039000a00000001001d0000000201100367000000000101043b000b00000001001d00000b200010009c0000005c0000213d00000b5c010000410000000000100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000b5d011001c70000800b020000392af12ae70000040f00000001002001900000163e0000613d000000000201043b0000000b0020006b000010260000a13d000000400100043d000000440210003900000b7503000041000008230000013d0008006000100218000a0b110010019b000000200b00008a000000000d00001900000000020000310000000c0320006a000000050ed002100000000004ae00190000000201000367000000000541034f000000430430008a000000000305043b00000000050004110000000a0050006c00000e030000c13d000000000043004b000000000500001900000b530500804100000b530440019700000b5306300197000000000746013f000000000046004b000000000400001900000b530400404100000b530070009c000000000405c019000000000004004b0000005c0000c13d0000000004a30019000000000341034f000000000303043b00000b180030009c0000005c0000213d0000000005320049000000200640003900000b530450019700000b5307600197000000000847013f000000000047004b000000000400001900000b5304004041000000000056004b000000000500001900000b530500204100000b530080009c000000000405c019000000000004004b0000005c0000c13d0000001f043000390000000004b4016f0000003f044000390000000005b4016f000000400400043d0000000005540019000000000045004b0000000007000039000000010700403900000b180050009c00000b100000213d000000010070019000000b100000c13d000000400050043f00000000053404360000000007630019000000000027004b0000005c0000213d000000000261034f0000000006b30170000000000165001900000ddf0000613d000000000702034f0000000008050019000000007907043c0000000008980436000000000018004b00000ddb0000c13d0000001f0730019000000dec0000613d000000000262034f0000000306700210000000000701043300000000076701cf000000000767022f000000000202043b0000010006600089000000000262022f00000000026201cf000000000272019f000000000021043500000000013500190000000000010435000000400c00043d00000b4900c0009c00000b100000213d0000006001c00039000000400010043f0000004001c0003900000b540200004100000000002104350000002001c0003900000b55020000410000000000210435000000270100003900000000001c0435000000000204043300000000010004140000000003000410000000040030008c00000eb70000c13d0000000103000031000000010200003900000ed10000013d000000000043004b000000000500001900000b530500804100000b530440019700000b5306300197000000000746013f000000000046004b000000000400001900000b530400404100000b530070009c000000000405c019000000000004004b0000005c0000c13d0000000004a30019000000000341034f000000000303043b00000b180030009c0000005c0000213d0000000005320049000000200240003900000b530450019700000b5306200197000000000746013f000000000046004b000000000400001900000b5304004041000000000052004b000000000500001900000b530500204100000b530070009c000000000405c019000000000004004b0000005c0000c13d000000000521034f0000000006b30170000000400200043d0000002001200039000000000461001900000e300000613d000000000705034f0000000008010019000000007907043c0000000008980436000000000048004b00000e2c0000c13d0000001f0730019000000e3d0000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000004310019000000080500002900000000005404350000001404300039000000000042043500000053033000390000000003b3016f000000000f32001900000000002f004b0000000003000039000000010300403900000b1800f0009c00000b100000213d000000010030019000000b100000c13d0000004000f0043f00000b4900f0009c00000b100000213d0000006003f00039000000400030043f0000004003f0003900000b540400004100000000004304350000002003f0003900000b55040000410000000000430435000000270300003900000000003f0435000000000302043300000000020004140000000004000410000000040040008c00000e610000c13d0000000103000031000000010200003900000e7b0000013d00000abd0010009c00000abd01008041000000400110021000000abd0030009c00000abd030080410000006003300210000000000113019f00000abd0020009c00000abd02008041000000c002200210000000000112019f0000000002000410000e0000000d001d000d0000000e001d00070000000f001d2af12aec0000040f000000070f0000290000000d0e0000290000000e0d000029000000200b00008a000000090a000029000000010220018f0003000000010355000000600110027000010abd0010019d00000abd03100197000000000003004b000000800c000039000000600400003900000ea90000613d00000b180030009c00000b100000213d0000001f013000390000000001b1016f0000003f011000390000000001b1016f000000400500043d0000000001150019000000000051004b0000000004000039000000010400403900000b180010009c00000b100000213d000000010040019000000b100000c13d000000400010043f0000000001050019000000000c3504360000000005b3017000000000045c0019000000030600036700000e9b0000613d000000000706034f00000000080c0019000000007907043c0000000008980436000000000048004b00000e970000c13d0000001f0330019000000ea80000613d000000000556034f0000000303300210000000000604043300000000063601cf000000000636022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000363019f000000000034043500000000040100190000000003040433000000000002004b000010b70000613d000000000003004b00000f1c0000c13d000700000004001d000d0000000e001d000e0000000d001d00000abe01000041000000000010044300000000010004100000000400100443000000000100041400000f0c0000013d00000abd0050009c00000abd05008041000000400350021000000abd0020009c00000abd020080410000006002200210000000000232019f00000abd0010009c00000abd01008041000000c001100210000000000121019f0000000002000410000e0000000d001d000d0000000e001d00070000000c001d2af12aec0000040f000000070c0000290000000d0e0000290000000e0d000029000000200b00008a000000090a000029000000010220018f0003000000010355000000600110027000010abd0010019d00000abd03100197000000000003004b000000800f000039000000600400003900000eff0000613d00000b180030009c00000b100000213d0000001f013000390000000001b1016f0000003f011000390000000001b1016f000000400500043d0000000001150019000000000051004b0000000004000039000000010400403900000b180010009c00000b100000213d000000010040019000000b100000c13d000000400010043f0000000001050019000000000f3504360000000005b3017000000000045f0019000000030600036700000ef10000613d000000000706034f00000000080f0019000000007907043c0000000008980436000000000048004b00000eed0000c13d0000001f0330019000000efe0000613d000000000556034f0000000303300210000000000604043300000000063601cf000000000636022f000000000505043b0000010003300089000000000535022f00000000033501cf000000000363019f000000000034043500000000040100190000000003040433000000000002004b000010be0000613d000000000003004b00000f1c0000c13d000700000004001d000d0000000e001d000e0000000d001d00000abe01000041000000000010044300000000010004100000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f00000001002001900000163e0000613d000000000101043b000000000001004b000000090a000029000000200b00008a0000000e0d0000290000000d0e0000290000000704000029000010df0000613d000000800100043d0000000000d1004b000015c70000a13d000000a001e000390000000000410435000000800100043d0000000000d1004b000015c70000a13d000000010dd000390000000b00d0006c00000d970000413d000007490000013d00000b1d02000041000000020500036700000000040000190000000c070000290000000006740019000000000665034f000000000606043b000000000062041b00000001022000390000002004400039000000000034004b00000f2c0000413d0000000e06000029000000000063004b00000f400000813d0000000303600210000000f80330018f00000ba90330027f00000ba9033001670000000c044000290000000204400367000000000404043b000000000334016f000000000032041b00000001020000390000000103600210000000000223019f000000000021041b000000000100001900002af20001042e000000a004000039000000000600001900000f510000013d0000001f0980003900000ba8099001970000000008780019000000000008043500000000077900190000000106600039000000000026004b000007530000813d0000000008170049000000400880008a0000000003830436000000004804043400000000980804340000000007870436000000000008004b00000f490000613d000000000a000019000000000b7a0019000000000ca90019000000000c0c04330000000000cb0435000000200aa0003900000000008a004b00000f5a0000413d00000f490000013d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000d00000001001d00000f7a0000613d000000140100008a00000000011000310000000201100367000000000101043b000d0060001002780000000e01000029000000000010043f0000016201000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000d0200002900000b1102200197000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000001540000c13d000000400100043d000000640210003900000b8d030000410000000000320435000000440210003900000b8e03000041000000000032043500000024021000390000002e0300003900000c150000013d0000019802000039000000000102041a000000010300008a0000000d0030006b0000103d0000c13d000000010310003a000010a80000c13d00000b6b01000041000000000010043f0000001101000039000000040010043f00000b6c0100004100002af300010430000000400100043d00000b9b02000041000000000021043500000004021000390000000e03000029000000000032043500000abd0010009c00000abd01008041000000400110021000000b6c011001c700002af3000104300000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000000fd10000613d000000140100008a00000000011000310000000201100367000000000101043b0007006000100278000000400100043d000c00000001001d00000b130010009c00000b100000213d00000002010003670000004402100370000000000302043b0000000c040000290000004002400039000000400020043f00000001020000390000000004240436000a00000004001d0000000000340435000000400300043d000b00000003001d00000b130030009c00000b100000213d0000006401100370000000000101043b0000000b040000290000004003400039000000400030043f0000000002240436000900000002001d0000000000120435000000000000043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000011ad0000c13d0000000e0000006b000011af0000613d0000000e01000029000000000010043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000011b40000c13d0000000801000029000000000010043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000011b40000c13d000000400100043d000000640210003900000b91030000410000000000320435000000440210003900000b920300004100000c870000013d0000000a0100002900000020031000390000000201000367000000000431034f000000000404043b00000b200040009c0000005c0000213d000000000024004b00000d8f0000413d000b0140003000920000000b02100360000000000202043b00000b110020009c0000005c0000213d000000000002004b000011a00000c13d000000400100043d000000440210003900000b7403000041000000000032043500000024021000390000001303000039000008260000013d0000000d0010006b000010aa0000413d000000400100043d000000440210003900000b5e03000041000000000032043500000024021000390000000a03000039000008260000013d0000000b03000029000000000621034f000000000606043b000000200330003900000000006304350000002002200039000000000052004b000010470000413d0000000b020000290000000002020433000000800300043d000000000023004b0000107b0000c13d00000b180020009c00000b100000213d00000005032002100000003f0530003900000b8806500197000000400500043d000900000005001d0000000005560019000000000065004b0000000006000039000000010600403900000b180050009c00000b100000213d000000010060019000000b100000c13d000000400050043f00000009050000290000000002250436000800000002001d0000001f0230018f000000000003004b000010700000613d000000000141034f00000008040000290000000003340019000000001501043c0000000004540436000000000034004b0000106c0000c13d000000000002004b000000800100043d000000000001004b000011260000c13d000000400200043d000e00000002001d0000002001000039000000000212043600000009010000292af11f3d0000040f00000bf20000013d000000400100043d000000640210003900000b86030000410000000000320435000000440210003900000b87030000410000078e0000013d00000000030000190000000b020000290000000002020433000000000032004b000015c70000a13d000000000031004b000015c70000a13d000d00000003001d000000050130021000000009021000290000000002020433000e00000002001d0000000a011000290000000001010433000000000010043f000001a101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a0000000e0220006c00000faa0000413d000000000021041b0000000d0300002900000001033000390000000c010000290000000001010433000000000013004b000010830000413d00000c630000013d000000000032041b000d00000001001d00000064010000390000000201100367000000000501043b0000000e010000290000000b020000290000000c030000290000000d040000292af126180000040f00000001010000390000003502000039000000000012041b000000000100001900002af20001042e00000000010f0019000000000003004b000010c10000613d00000abd00c0009c00000abd0c0080410000004001c00210000011210000013d00000000010c0019000000000003004b0000111e0000c13d000000400400043d000e00000004001d00000ac002000041000000000024043500000004034000390000002002000039000000000023043500000024024000392af11f2b0000040f0000000e02000029000000000121004900000abd0010009c00000abd0100804100000abd0020009c00000abd0200804100000060011002100000004002200210000000000121019f00002af300010430000000400100043d000000440210003900000b4f03000041000000000032043500000ac002000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000082b0000013d000000400100043d000000440210003900000b5603000041000000000032043500000024021000390000001d03000039000008260000013d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000e00000001001d000010fe0000613d000000140100008a00000000011000310000000201100367000000000101043b000e0060001002780000000a01000029000000000010043f0000016201000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e0200002900000b1102200197000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff00100190000009570000c13d00000b7d0000013d00000abd00f0009c00000abd0f0080410000004001f0021000000abd0030009c00000abd030080410000006002300210000000000112019f00002af30001043000000000030000190000000b010000290000000001010433000000000031004b000015c70000a13d000d00000003001d0000000503300210000000a0013000390000000001010433000e0b110010019c0000801002000039000012070000613d000c00000003001d0000000a013000290000000001010433000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c72af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000090200002900000000020204330000000d03000029000000000032004b000015c70000a13d0000000c040000290000000802400029000000000101043b000000000101041a00000000001204350000000103300039000000800100043d000000000013004b000011270000413d000010740000013d0000000701000029000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000802000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000021041b000000400100043d0000002002100039000000050300002900000000003204350000000702000029000000000021043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f000000060200002900000b110520019700000b12011001c70000800d02000039000000040300003900000b1604000041000000080600002900000000070000192af12ae20000040f00000001002001900000005c0000613d000000400100043d2af11e8d0000040f000000000100001900002af20001042e000000400100043d000000640210003900000b8f030000410000000000320435000000440210003900000b900300004100000000003204350000002402100039000000280300003900000c150000013d0000000b02000029000000c002200039000000000321034f000000000303043b000000000003004b000011df0000c13d000000400100043d000000440210003900000b7303000041000000000032043500000024021000390000000d03000039000008260000013d0000000e0000006b000011b40000c13d0000000c010000290000000001010433000000000001004b000e00000000001d0000120e0000c13d00000044010000390000000201100367000000000101043b000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000301041a00000002010003670000006402100370000000000202043b000d00000003001d000000000023004b0000126f0000813d000000400100043d000000640210003900000b93030000410000000000320435000000440210003900000b940300004100000b830000013d000000a002200039000000000121034f000000000101043b000000000010043f000001a001000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b00000002010003670000000b02100360000000000202043b000a00000002001d00000b110020009c0000005c0000213d0000019804000039000000000304041a0000000b020000290000008002200039000000000521034f000000000605043b000b00000006001d00000ba90060009c000013850000c13d000000010530003a00000faa0000613d000000000054041b000b00000003001d000013870000013d000000400100043d000000640210003900000b89030000410000000000320435000000440210003900000b8a0300004100000b830000013d00000000030000190000000b020000290000000002020433000000000032004b000015c70000a13d000000000031004b000015c70000a13d000e00000003001d000000050130021000000009021000290000000002020433000d00000002001d0000000a011000290000000001010433000000000010043f000001a101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a0000000d03000029000000000032001a00000faa0000413d0000000002320019000000000021041b0000000e0300002900000001033000390000000c010000290000000001010433000000000013004b0000120f0000413d000e00000000001d000011b40000013d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000e00000001001d0000124f0000613d000000140100008a00000000011000310000000201100367000000000101043b000e0060001002780000000801000029000000000010043f0000016201000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e0200002900000b1102200197000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000053f0000c13d00000f990000013d0000004401100370000000000101043b000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f00000064010000390000000201100367000000000101043b000c00000001001d000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d0000000c030000290000000d02300069000000000101043b000000000021041b00000044010000390000000201100367000000000101043b000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000802000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d00000002030003670000006402300370000000000202043b000000000101043b000000000401041a000000000024001a00000faa0000413d0000000004240019000000000041041b0000004401300370000000000101043b000000400300043d00000020043000390000000000240435000000000013043500000abd0030009c00000abd030080410000004001300210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f000000070200002900000b110520019700000b12011001c70000800d02000039000000040300003900000b1604000041000d00000005001d0000000e0600002900000008070000292af12ae20000040f00000001002001900000005c0000613d00000abe01000041000000000010044300000008010000290000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f00000001002001900000163e0000613d000000000101043b000000000001004b00000b340000613d000000400400043d00000024014000390000000e02000029000000000021043500000b1a01000041000000000014043500000004014000390000000d02000029000000000021043500000002010003670000004402100370000000000202043b000000440340003900000000002304350000006401100370000000000101043b0000008402400039000000a003000039000000000032043500000064024000390000000000120435000000a402400039000000800100043d0000000000120435000c00000004001d000000c402400039000000000001004b000013050000613d00000000030000190000000004230019000000a005300039000000000505043300000000005404350000002003300039000000000013004b000012fe0000413d0000000002210019000000000002043500000000020004140000000803000029000000040030008c000016460000c13d0000000005000415000000100550008a00000005055002100000000103000031000000200030008c000000200400003900000000040340190000167b0000013d00000000030000190000000c020000290000000001020433000000000031004b000015c70000a13d000d00000003001d00000005013002100000000b021000290000000002020433000e00000002001d000000a0011000390000000001010433000000000010043f000001a101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a0000000e0220006c00000faa0000413d000000000021041b0000000d030000290000000103300039000000800100043d000000000013004b0000000c02000029000013150000413d000000000001004b000009890000613d00000000020000190000000c010000290000000001010433000000000021004b000015c70000a13d000900000002001d0000000501200210000000a00210003900000000030204330000000b011000290000000001010433000e00000001001d000d00000003001d000000000030043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000a02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000e000e0010007400000c810000413d0000000d01000029000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000a02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000021041b00000009020000290000000102200039000000800100043d000000000012004b000013390000413d000009890000013d0000000b0030006b0000103f0000813d00090060002000920000000902100360000000000202043b00000b110020009c0000005c0000213d000000000002004b000013b60000613d000000400300043d000800000003001d00000b130030009c00000b100000213d00000008040000290000004003400039000000400030043f00000000032404360000000e020000290000004402200039000000000121034f000000000101043b000700000003001d00000000001304350000000b01000029000000000010043f000001a301000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d0000000802000029000000000202043300000b1102200197000000000101043b000000000301041a00000b3203300197000000000223019f000000000021041b000000010110003900000007020000290000000002020433000000000021041b0000000201000367000000090200002900000080022000390000000008020019000000000221034f000000000302043b00000000020000310000000e0420006a000000230440008a00000b530540019700000b5306300197000000000756013f000000000056004b000000000500001900000b5305004041000000000043004b000000000400001900000b530400804100000b530070009c000000000504c019000000000005004b0000005c0000c13d0000000d04300029000000000341034f000000000303043b00000b180030009c0000005c0000213d0000000005320049000000200240003900000b530450019700000b5306200197000000000746013f000000000046004b000000000400001900000b5304004041000000000052004b000000000500001900000b530500204100000b530070009c000000000405c019000000000004004b0000005c0000c13d000900000008001d0000002004800039000000000141034f000000000501043b0000000a010000290000000b040000292af126180000040f0000000901000029000900400010003d00000002010003670000000902100360000000000302043b000000000003004b000015cd0000c13d0000000001000416000000000001004b0000163f0000c13d000000400100043d000000200200003900000000042104360000000902000029000000e00320008a0000000202000367000000000532034f000000000505043b00000b110050009c0000005c0000213d00000000005404350000002003300039000000000432034f000000000404043b00000b110040009c0000005c0000213d000000400510003900000000004504350000002004300039000000000442034f000000000404043b000000600510003900000000004504350000004003300039000000000432034f000000000404043b00000b110040009c0000005c0000213d000000800510003900000000004504350000002004300039000000000442034f000000000404043b000000a005100039000000000045043500000000050000310000000e0450006a000000230640008a0000004004300039000000000342034f000000000303043b00000b530730019700000b5308600197000000000987013f000000000087004b000000000700001900000b5307004041000000000063004b000000000600001900000b530600804100000b530090009c000000000706c019000000000007004b0000005c0000c13d0000000d06300029000000000362034f000000000303043b00000b180030009c0000005c0000213d0000000007350049000000200560003900000b530670019700000b5308500197000000000968013f000000000068004b000000000600001900000b5306004041000000000075004b000000000700001900000b530700204100000b530090009c000000000607c019000000000006004b0000005c0000c13d000000c00610003900000180070000390000000000760435000001a0061000390000000000360435000000000852034f00000ba8093001980000001f0a30018f000001c00610003900000000079600190000144b0000613d000000000b08034f000000000c06001900000000bd0b043c000000000cdc043600000000007c004b000014470000c13d00000000000a004b000014580000613d000000000898034f0000000309a00210000000000a070433000000000a9a01cf000000000a9a022f000000000808043b0000010009900089000000000898022f00000000089801cf0000000008a8019f0000000000870435000000000636001900000000000604350000002006400039000000000662034f000000000606043b000000e00710003900000000006704350000004006400039000000000662034f000000000606043b000001000710003900000000006704350000006004400039000000000642034f000000000606043b00000b110060009c0000005c0000213d000001200710003900000000006704350000002004400039000000000642034f000000000606043b00000b200060009c0000005c0000213d000001400710003900000000006704350000002004400039000000000642034f000000000606043b00000b200060009c0000005c0000213d000001600710003900000000006704350000002004400039000000000242034f000000000202043b000001800410003900000000002404350000001f0230003900000ba802200197000000600320021000000b6e0330009a00000b6f0020009c00000b700300804100000abd0010009c00000abd010080410000004001100210000000000113019f000000000200041400000abd0020009c00000abd02008041000000c00220021000000000012100190000000c0200002900000b110520019700000b710110009a0000800d02000039000000040300003900000b72040000410000000a060000290000000b070000292af12ae20000040f0000000100200190000010b20000c13d0000005c0000013d000000800100043d000000080000006b000014c20000c13d000000000001004b000014c40000613d00000000020000190000000c010000290000000001010433000000000021004b000015c70000a13d000e00000002001d00000005012002100000000a021000290000000002020433000b00000002001d000000a0011000390000000001010433000000000010043f000001a101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a0000000b03000029000000000032001a00000faa0000413d0000000002320019000000000021041b0000000e020000290000000102200039000000800100043d000000000012004b0000149f0000413d000000000001004b0000155a0000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000004004b000014d50000613d000000800500003900000000060000190000002005500039000000000705043300000000037304360000000106600039000000000046004b000014cf0000413d0000000304000029000e0b110040019b000000000413004900000000004204350000000c0200002900000000040204330000000002430436000000000004004b000014e60000613d00000000030000190000000c050000290000002005500039000000000605043300000000026204360000000103300039000000000043004b000014e00000413d000000000212004900000abd0020009c00000abd02008041000000600220021000000abd0010009c00000abd010080410000004001100210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000121019f00000b37011001c70000800d02000039000000040300003900000b82040000410000000e05000029000000080600002900000005070000292af12ae20000040f00000001002001900000005c0000613d00000abe0100004100000000001004430000000d010000290000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f00000001002001900000163e0000613d000000000101043b000000000001004b00000b340000613d000000400300043d0000004401300039000000a002000039000000000021043500000024013000390000000802000029000000000021043500000b9501000041000000000013043500000004013000390000000e020000290000000000210435000000a401300039000000800200043d0000000000210435000d00000003001d000000c401300039000000000002004b000015280000613d000000800300003900000000040000190000002003300039000000000503043300000000015104360000000104400039000000000024004b000015220000413d0000000d030000290000000002310049000000040220008a000000640330003900000000002304350000000c0200002900000000020204330000000001210436000000000002004b0000153b0000613d00000000030000190000000c040000290000002004400039000c00000004001d000000000404043300000000014104360000000103300039000000000023004b000015330000413d0000000d030000290000000002310049000000040220008a00000084033000390000000000230435000000040200002900000000020204330000000001210436000000000002004b0000154d0000613d000000000300001900000000041300190000000605300029000000000505043300000000005404350000002003300039000000000023004b000015460000413d0000000003120019000000000003043500000000030004140000000504000029000000040040008c000016a10000c13d0000000005000415000000150550008a00000005055002100000000104000031000000200040008c0000002004008039000016d80000013d000e00000000001d0000000c0100002900000000010104330000000e0010006c000015c70000a13d0000000e010000290000000501100210000000a00210003900000000030204330000000a011000290000000001010433000b00000001001d000900000003001d000000000030043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000802000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a0007000b00100074000011d80000413d0000000901000029000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000802000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000702000029000000000021041b0000000901000029000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000502000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a0000000b0020002a00000faa0000413d0000000b02200029000000000021041b0000000e02000029000e00010020003d000000800100043d0000000e0010006b0000155b0000413d000014c40000013d00000b6b01000041000000000010043f0000003201000039000000040010043f00000b6c0100004100002af3000104300000000e02000029000000c402200039000000000421034f000000000404043b00080000003400ad00000008033000f9000000000043004b00000faa0000c13d0000019e03000039000000000303041a000000ff0330018f000000010030008c000006fb0000213d0000170f0000c13d0000019d03000039000000000303041a000017190000013d0000000001000415000000120110008a0002000500100218001200000000003d00000abe01000041000000000010044300000000010004100000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f00000001002001900000163e0000613d000000000101043b000000000001004b000016970000c13d0000000901000029000000ff0110018f000000010010008c00000002010000290000000501100270000000000100003f000000010100603f0000169a0000c13d000000010000006b000006e30000613d000001000100008a000000090110017f00000001011001bf000000000010041b0000ff0000100190000006e90000613d00000001020000390000003501000039000000000021041b000000400500043d00000b130050009c00000b100000213d0000004001500039000000400010043f0000000c01000039000000000615043600000b22010000410000000000160435000000400100043d00000b130010009c00000b100000213d0000004002100039000000400020043f0000000102000039000000000221043600000b23030000410000000000320435000000000405043300000b180040009c00000b100000213d0000000303000039000000000803041a000000010080019000000001078002700000007f0770618f0000001f0070008c00000000090000390000000109002039000000000898013f000000010080019000000a4d0000c13d000000200070008c000016360000413d000000000030043f0000001f08400039000000050880027000000b240880009a000000200040008c00000b25080040410000001f07700039000000050770027000000b240770009a000000000078004b000016360000813d000000000008041b0000000108800039000000000078004b000016320000413d0000001f0040008c000017dd0000a13d000000000030043f00000ba808400198000017ff0000c13d000000200700003900000b25060000410000180b0000013d000000000001042f000000400100043d000000440210003900000b6d03000041000000000032043500000024021000390000000603000039000008260000013d0000001f0110003900000ba801100197000000c40110003900000abd0010009c00000abd0100804100000060011002100000000c0300002900000abd0030009c00000abd030080410000004003300210000000000131019f00000abd0020009c00000abd02008041000000c002200210000000000112019f00000008020000292af12ae20000040f0000000003010019000000600330027000000abd03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000c05700029000016670000613d000000000801034f0000000c09000029000000008a08043c0000000009a90436000000000059004b000016630000c13d000000000006004b000016740000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000000050004150000000f0550008a00000005055002100000000100200190000016f50000613d0000001f01400039000000600110018f0000000c02100029000000000012004b00000000010000390000000101004039000000000402001900000b180020009c00000b100000213d000000010010019000000b100000c13d000000400040043f000000200030008c0000005c0000413d0000000c01000029000000000101043300000b1b001001980000005c0000c13d0000000502500270000000000201001f00000b1c0110019700000b1a0010009c00000b340000613d00000ac001000041000e00000004001d00000000001404350000000401400039000016f30000013d00000002010000290000000501100270000000000100003f000000400100043d000000640210003900000ac2030000410000000000320435000000440210003900000ac10300004100000f9f0000013d0000001f0220003900000ba8022001970000000d040000290000000001410049000000000121001900000abd0010009c00000abd01008041000000600110021000000abd0040009c00000abd0200004100000000020440190000004002200210000000000121019f00000abd0030009c00000abd03008041000000c002300210000000000112019f00000005020000292af12ae20000040f0000000003010019000000600330027000000abd03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d05700029000016c40000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b000016c00000c13d000000000006004b000016d10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000005000415000000140550008a00000005055002100000000100200190000017370000613d0000001f01400039000000600110018f0000000d02100029000000000012004b00000000010000390000000101004039000000000302001900000b180020009c00000b100000213d000000010010019000000b100000c13d000000400030043f000000200040008c0000005c0000413d0000000d01000029000000000101043300000b1b001001980000005c0000c13d0000000502500270000000000201001f00000b1c0110019700000b950010009c00000b340000613d00000ac001000041000e00000003001d000000000013043500000004013000392af1292b0000040f000017720000013d000000040230008c0000176c0000413d000000000400043d00000b1b04400197000000000501043b00000b1c05500197000000000445019f000000000040043f00000b1c0440019700000ac00040009c0000176c0000c13d000000440030008c0000176c0000413d000000040510037000000ba8062001980000001f0720018f000000400400043d0000000001640019000017500000613d000000000805034f0000000009040019000000008a08043c0000000009a90436000000000019004b0000170a0000c13d000017500000013d0000019c03000039000000000303041a000000800430027000000008034000b9000000080000006b000017180000613d00000008053000fa000000000045004b00000faa0000c13d000027100330011a000700000003001d00000007040000290006000800400073000017240000813d000000400100043d000000440210003900000b6a03000041000000000032043500000024021000390000001c03000039000008260000013d000400400020003d0000000402100360000000000202043b000500000002001d00000b110020009c0000005c0000213d0000000002000416000000050300002900000b5f0030009c0000177c0000c13d000000080020006c0000177e0000613d000000400100043d000000440210003900000b6103000041000000000032043500000024021000390000001603000039000008260000013d000000040230008c0000176c0000413d000000000400043d00000b1b04400197000000000501043b00000b1c05500197000000000445019f000000000040043f000000440030008c0000176c0000413d00000b1c0440019700000ac00040009c0000176c0000c13d000000040510037000000ba8062001980000001f0720018f000000400400043d0000000001640019000017500000613d000000000805034f0000000009040019000000008a08043c0000000009a90436000000000019004b0000174c0000c13d000000000007004b0000175d0000613d000000000565034f0000000306700210000000000701043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000510435000000000504043300000b180050009c0000176c0000213d0000002401500039000000000031004b0000176c0000213d0000000001450019000000000301043300000b180030009c0000176c0000213d000000000224001900000000063100190000002006600039000000000026004b000017e80000a13d000000400200043d000e00000002001d00000ac001000041000000000012043500000004012000392af129380000040f0000000e02000029000000000121004900000abd0010009c00000abd01008041000000600110021000000abd0020009c00000abd020080410000004002200210000000000121019f00002af300010430000000000002004b000017d90000c13d0000000402000029000000a00220008a000000000121034f000000000101043b000300000001001d00000b110010009c0000005c0000213d000000030000006b0000178a0000c13d0000019901000039000000000101041a00030b110010019b0000000001000411000200000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000000001000411000017a20000613d000000140100008a00000000011000310000000201100367000000000101043b0000006001100270000000070000006b0000193e0000613d0000019a02000039000000000202041a00010b110020019b000000050200002900000b5f0020009c0000183f0000c13d00000000010004140000000102000029000000040020008c000018600000c13d00000001010000320000193e0000613d00000b180010009c00000b100000213d0000001f0310003900000ba8033001970000003f0330003900000ba804300197000000400300043d0000000004430019000000000034004b0000000005000039000000010500403900000b180040009c00000b100000213d000000010050019000000b100000c13d000000400040043f000000000513043600000ba8021001980000001f0310018f00000000012500190000000304000367000017cb0000613d000000000604034f000000006706043c0000000005750436000000000015004b000017c70000c13d000000000003004b0000193e0000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f00000000002104350000193e0000013d000000400100043d000000440210003900000b60030000410000080b0000013d000000000004004b0000000005000019000017e10000613d0000000005060433000000030640021000000ba90660027f00000ba906600167000000000565016f0000000104400210000000000445019f000018170000013d00000000023500190000003f0220003900000ba8022001970000000004420019000000000024004b00000000020000390000000102004039000000000304001900000b180040009c00000b100000213d000000010020019000000b100000c13d000000400030043f000000000001004b0000176c0000613d00000ac0020000410000000004030019000e00000004001d0000000000240435000000040240003900000020030000390000000000320435000010c80000013d00000b25060000410000002007000039000000010980008a000000050990027000000b260990009a000000000a570019000000000a0a04330000000000a6041b00000020077000390000000106600039000000000096004b000018040000c13d000000000048004b000018150000813d0000000308400210000000f80880018f00000ba90880027f00000ba90880016700000000055700190000000005050433000000000585016f000000000056041b000000010440021000000001044001bf000000000043041b000000000401043300000b180040009c00000b100000213d0000000403000039000000000603041a000000010060019000000001056002700000007f0550618f0000001f0050008c00000000070000390000000107002039000000000676013f000000010060019000000a4d0000c13d000000200050008c000018370000413d000000000030043f0000001f06400039000000050660027000000b270660009a000000200040008c00000b28060040410000001f05500039000000050550027000000b270550009a000000000056004b000018370000813d000000000006041b0000000106600039000000000056004b000018330000413d0000001f0040008c000018550000a13d000000000030043f00000ba806400198000018a40000c13d000000200500003900000b2802000041000018b00000013d00000b1101100197000000010010006c0000193e0000613d000000400200043d0000004403200039000000240420003900000020052000390000000006000410000000000061004b0000192d0000c13d00000b6401000041000000000015043500000001010000290000000000140435000000070100002900000000001304350000004401000039000000000012043500000b190020009c00000b100000213d00000080010000390000193a0000013d000000000004004b0000000001000019000018590000613d0000000001020433000000030240021000000ba90220027f00000ba902200167000000000121016f0000000102400210000000000121019f000018bc0000013d00000abd0010009c00000abd01008041000000c00110021000000b37011001c700008009020000390000000703000029000000010400002900000000050000192af12ae20000040f00030000000103550000000003010019000000600330027000010abd0030019d00000abd03300198000018940000613d0000001f0430003900000b65044001970000003f0440003900000b6604400197000000400500043d0000000004450019000000000054004b0000000006000039000000010600403900000b180040009c00000b100000213d000000010060019000000b100000c13d000000400040043f0000001f0430018f000000000635043600000b67053001980000000003560019000018870000613d000000000701034f000000007807043c0000000006860436000000000036004b000018830000c13d000000000004004b000018940000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000193e0000c13d000000400100043d00000024021000390000000703000029000000000032043500000b6802000041000000000021043500000004021000390000000103000029000000000032043500000abd0010009c00000abd01008041000000400110021000000b69011001c700002af30001043000000b28020000410000002005000039000000010760008a000000050770027000000b290770009a00000000081500190000000008080433000000000082041b00000020055000390000000102200039000000000072004b000018a90000c13d000000000046004b000018ba0000813d0000000306400210000000f80660018f00000ba90660027f00000ba90660016700000000011500190000000001010433000000000161016f000000000012041b000000010140021000000001011001bf000000000013041b0000000101000039000000000001041b0000000201000039000000000001041b000000000100041a0000ff0000100190000006e90000613d00000008010000290000000001010433000000000001004b000018e50000613d000900000000001d000000090100002900000005011002100000000701100029000000000101043300000b1101100197000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000902000029000900010020003d00000008010000290000000001010433000000090010006b000018c90000413d000000400100043d00000b140010009c00000b100000213d0000002002100039000000400020043f0000000000010435000000000100041a0000ff0000100190000006e90000613d0000016301000039000000000301041a000000010030019000000001023002700000007f0220618f0000001f0020008c00000000040000390000000104002039000000000343013f000000010030019000000a4d0000c13d000000200020008c000019040000413d000000000010043f00000b2a030000410000001f02200039000000050220027000000b2b0220009a000000000003041b0000000103300039000000000023004b000019000000413d000000000001041b000000800200043d00000b180020009c00000b100000213d0000019501000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f000000010040019000000a4d0000c13d000000200030008c000019240000413d000000000010043f0000001f04200039000000050440027000000b2c0440009a000000200020008c00000b2d040040410000001f03300039000000050330027000000b2c0330009a000000000034004b000019240000813d000000000004041b0000000104400039000000000034004b000019200000413d0000001f0020008c0000000103200210000019f70000a13d000000000010043f00000ba80620019800001a010000c13d000000200500003900000b2d0400004100001a0d0000013d00000b620600004100000000006504350000000000140435000000010100002900000000001304350000006401200039000000070300002900000000003104350000006401000039000000000012043500000b630020009c00000b100000213d000000a0010000390000000001210019000000400010043f00000005010000292af129a50000040f00000004010000290000000201100367000000000101043b000500000001001d00000b110010009c0000005c0000213d0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff001001900000195a0000613d000000140100008a00000000011000310000000201100367000000000101043b00020060001002780000000702000029000000080020006b000013f00000613d000000050100002900000b5f0010009c0000198f0000c13d00000000010004140000000302000029000000040020008c000019a60000c13d0000000101000032000013f00000613d00000b180010009c00000b100000213d0000001f0310003900000ba8033001970000003f0330003900000ba804300197000000400300043d0000000004430019000000000034004b0000000005000039000000010500403900000b180040009c00000b100000213d000000010050019000000b100000c13d000000400040043f000000000513043600000ba8021001980000001f0310018f00000000012500190000000304000367000019810000613d000000000604034f000000006706043c0000000005750436000000000015004b0000197d0000c13d000000000003004b000013f00000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000013f00000013d000000020100002900000b1101100197000000030010006c000013f00000613d000000400200043d0000004403200039000000240420003900000020052000390000000006000410000000000061004b000019e50000c13d00000b6401000041000000000015043500000003010000290000000000140435000000060100002900000000001304350000004401000039000000000012043500000b190020009c00000b100000213d0000008001000039000019f20000013d00000abd0010009c00000abd01008041000000c00110021000000b37011001c700008009020000390000000603000029000000030400002900000000050000192af12ae20000040f00030000000103550000000003010019000000600330027000010abd0030019d00000abd03300198000019da0000613d0000001f0430003900000b65044001970000003f0440003900000b6604400197000000400500043d0000000004450019000000000054004b0000000006000039000000010600403900000b180040009c00000b100000213d000000010060019000000b100000c13d000000400040043f0000001f0430018f000000000635043600000b67053001980000000003560019000019cd0000613d000000000701034f000000007807043c0000000006860436000000000036004b000019c90000c13d000000000004004b000019da0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000013f00000c13d000000400100043d00000024021000390000000603000029000000000032043500000b68020000410000000000210435000000040210003900000003030000290000189e0000013d00000b620600004100000000006504350000000000140435000000030100002900000000001304350000006401200039000000060300002900000000003104350000006401000039000000000012043500000b630020009c00000b100000213d000000a0010000390000000001210019000000400010043f00000005010000292af129a50000040f000013f00000013d000000000002004b0000000004000019000019fb0000613d000000a00400043d000000030220021000000ba90220027f00000ba902200167000000000224016f000000000232019f00001a180000013d00000b2d040000410000002005000039000000010760008a000000050770027000000b2e0770009a00000080085000390000000008080433000000000084041b00000020055000390000000104400039000000000074004b00001a060000c13d000000000026004b00001a170000813d0000000302200210000000f80220018f00000ba90220027f00000ba90220016700000080055000390000000005050433000000000225016f000000000024041b00000001023001bf000000000021041b0000000d01000029000000000201043300000b180020009c00000b100000213d0000019601000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f000000010040019000000a4d0000c13d000000200030008c00001a390000413d000000000010043f0000001f04200039000000050440027000000b2f0440009a000000200020008c00000b30040040410000001f03300039000000050330027000000b2f0330009a000000000034004b00001a390000813d000000000004041b0000000104400039000000000034004b00001a350000413d0000001f0020008c00001a410000a13d000000000010043f00000ba80520019800001a4d0000c13d000000200400003900000b300300004100001a590000013d000000000002004b000000000300001900001a460000613d0000000c030000290000000003030433000000030420021000000ba90440027f00000ba904400167000000000343016f0000000102200210000000000223019f00001a650000013d00000b30030000410000002004000039000000010650008a000000050660027000000b310660009a0000000d074000290000000007070433000000000073041b00000020044000390000000103300039000000000063004b00001a520000c13d000000000025004b00001a630000813d0000000305200210000000f80550018f00000ba90550027f00000ba9055001670000000d044000290000000004040433000000000454016f000000000043041b000000010220021000000001022001bf000000000021041b000000050100002900000b11011001970000019b02000039000000000302041a00000b3203300197000000000113019f000000000012041b0000000401000029000d0b200010019b0000019c01000039000000000201041a00000b33022001970000000d022001af000000000021041b0000000302000029000c0b110020019b0000019a02000039000000000302041a00000b32033001970000000c033001af000000000032041b000000060200002900090b110020019b0000019902000039000000000302041a00000b320330019700000009033001af000000000032041b0000000b02000029000000000302043300000b180030009c00000b100000213d0000019f02000039000000000502041a000000010050019000000001045002700000007f0440618f0000001f0040008c00000000060000390000000106002039000000000565013f000000010050019000000a4d0000c13d000000200040008c00001aa20000413d000000000020043f0000001f05300039000000050550027000000b340550009a000000200030008c00000b1d050040410000001f04400039000000050440027000000b340440009a000000000045004b00001aa20000813d000000000005041b0000000105500039000000000045004b00001a9e0000413d0000001f0030008c000000010430021000001aab0000a13d000000000020043f00000ba80730019800001ab60000c13d000000200600003900000b1d0500004100001ac20000013d000000000003004b000000000500001900001ab00000613d0000000a050000290000000005050433000000030330021000000ba90330027f00000ba903300167000000000335016f000000000343019f00001acd0000013d00000b1d050000410000002006000039000000010870008a000000050880027000000b350880009a0000000b096000290000000009090433000000000095041b00000020066000390000000105500039000000000085004b00001abb0000c13d000000000037004b00001acc0000813d0000000303300210000000f80330018f00000ba90330027f00000ba9033001670000000b066000290000000006060433000000000336016f000000000035041b00000001034001bf000000000032041b00000104020000390000000202200367000000000202043b00000b2003200197000027100030008c000008200000213d0000008002200210000000000301041a00000b2003300197000000000223019f000000000021041b0000019e01000039000000000201041a00000ba702200197000000000021041b0000000e0100002900000b11031001970000019701000039000000000201041a00000b3202200197000000000232019f000000000021041b000e00000003001d000000000030043f00000b3601000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001b390000c13d000000000000043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000001000411000b00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001b2a0000613d000000140100008a00000000011000310000000201100367000000000101043b000b006000100278000000000100041400000abd0010009c00000abd010080410000000b0200002900000b1107200197000000c00110021000000b37011001c70000800d02000039000000040300003900000b380400004100000000050000190000000e060000292af12ae20000040f00000001002001900000005c0000613d0000000e01000029000000000010043f00000b3901000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000000001004b00001b720000c13d00000b3a01000041000000000201041a000b00000002001d00000b180020009c00000b100000213d0000000b020000290000000102200039000000000021041b000000000010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000b011000290000000e02000029000000000021041b00000b3a01000041000000000101041a000b00000001001d000000000020043f00000b3901000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000b02000029000000000021041b00000b3b01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001bd50000c13d00000b3b01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000001000411000b00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001bc60000613d000000140100008a00000000011000310000000201100367000000000101043b000b006000100278000000000100041400000abd0010009c00000abd01008041000000c0011002100000000b0200002900000b110720019700000b37011001c70000800d02000039000000040300003900000b380400004100000b3b050000410000000e060000292af12ae20000040f00000001002001900000005c0000613d00000b3b01000041000000000010043f0000012f01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000201043b0000000e01000029000000000010043f000b00000002001d0000000101200039000800000001001d000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000000001004b00001c1f0000c13d0000000b01000029000000000101041a000a00000001001d00000b180010009c00000b100000213d0000000a0100002900000001011000390000000b02000029000000000012041b000000000020043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000a011000290000000e02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000801000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000b02000029000000000021041b00000b3c01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001c820000c13d00000b3c01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000001000411000b00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001c730000613d000000140100008a00000000011000310000000201100367000000000101043b000b006000100278000000000100041400000abd0010009c00000abd01008041000000c0011002100000000b0200002900000b110720019700000b37011001c70000800d02000039000000040300003900000b380400004100000b3c050000410000000e060000292af12ae20000040f00000001002001900000005c0000613d00000b3c01000041000000000010043f0000012f01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000201043b0000000e01000029000000000010043f000b00000002001d0000000101200039000800000001001d000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000000001004b00001ccc0000c13d0000000b01000029000000000101041a000a00000001001d00000b180010009c00000b100000213d0000000a0100002900000001011000390000000b02000029000000000012041b000000000020043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000a011000290000000e02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000801000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000b02000029000000000021041b00000b3c01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000000043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001d2d0000c13d00000b3c01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000000043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000001000411000b00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001d1e0000613d000000140100008a00000000011000310000000201100367000000000101043b000b006000100278000000000100041400000abd0010009c00000abd010080410000000b0200002900000b1107200197000000c00110021000000b37011001c70000800d02000039000000040300003900000b380400004100000b3c0500004100000000060000192af12ae20000040f00000001002001900000005c0000613d00000b3c01000041000000000010043f0000012f01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000000043f000b00000001001d0000000101100039000800000001001d000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000000001004b00001d750000c13d0000000b01000029000000000101041a000a00000001001d00000b180010009c00000b100000213d0000000a0100002900000001011000390000000b02000029000000000012041b000000000020043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000a01100029000000000001041b0000000b01000029000000000101041a000b00000001001d000000000000043f0000000801000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000b02000029000000000021041b00000b3d01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001dd80000c13d00000b3d01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000e02000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000201041a00000ba70220019700000001022001bf000000000021041b0000000001000411000b00000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000ff0010019000001dc90000613d000000140100008a00000000011000310000000201100367000000000101043b000b006000100278000000000100041400000abd0010009c00000abd01008041000000c0011002100000000b0200002900000b110720019700000b37011001c70000800d02000039000000040300003900000b380400004100000b3d050000410000000e060000292af12ae20000040f00000001002001900000005c0000613d00000b3d01000041000000000010043f0000012f01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000201043b0000000e01000029000000000010043f000b00000002001d0000000101200039000800000001001d000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b000000000101041a000000000001004b00001e220000c13d0000000b01000029000000000101041a000a00000001001d00000b180010009c00000b100000213d0000000a0100002900000001011000390000000b02000029000000000012041b000000000020043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000a011000290000000e02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000801000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000b02000029000000000021041b00000b3d01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000005c0000613d000000000101043b0000000101100039000000000601041a00000b3d02000041000000000021041b000000400100043d000e00000001001d000000000100041400000abd0010009c00000abd01008041000000c00110021000000b37011001c70000800d02000039000000040300003900000b3e0400004100000b3d0500004100000b3d070000412af12ae20000040f00000001002001900000005c0000613d000000000100041400000abd0010009c00000abd01008041000000c00110021000000b37011001c70000800d02000039000000020300003900000b3f0400004100000009050000292af12ae20000040f00000001002001900000005c0000613d00000104010000390000000201100367000000000101043b00000b20011001970000000e02000029000000000012043500000abd0020009c00000abd020080410000004001200210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000020300003900000b40040000410000000c050000292af12ae20000040f00000001002001900000005c0000613d000000400100043d0000000d02000029000000000021043500000b1102000041000000130520017f00000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000020300003900000b41040000412af12ae20000040f00000001002001900000005c0000613d000000010000006b00000b340000c13d000000000200041a00000baa01200197000000000010041b000000400100043d0000000103000039000000000031043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d0200003900000ac6040000410000042c0000013d00000bab0010009c00001e920000813d0000002001100039000000400010043f000000000001042d00000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300000001f0220003900000ba8022001970000000001120019000000000021004b0000000002000039000000010200403900000b180010009c00001ea40000213d000000010020019000001ea40000c13d000000400010043f000000000001042d00000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300000000305000039000000000405041a000000010640019000000001024002700000007f0220618f0000001f0020008c00000000010000390000000101002039000000000016004b00001ed80000c13d000000400100043d0000000003210436000000000006004b00001ec50000613d000000000050043f000000000002004b00001ecb0000613d00000b250500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000024004b00001ebd0000413d00001ecc0000013d00000ba7044001970000000000430435000000000002004b0000002004000039000000000400603900001ecc0000013d00000000040000190000003f0240003900000ba8032001970000000002130019000000000032004b0000000003000039000000010300403900000b180020009c00001ede0000213d000000010030019000001ede0000c13d000000400020043f000000000001042d00000b6b01000041000000000010043f0000002201000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300000000405000039000000000405041a000000010640019000000001024002700000007f0220618f0000001f0020008c00000000010000390000000101002039000000000016004b00001f120000c13d000000400100043d0000000003210436000000000006004b00001eff0000613d000000000050043f000000000002004b00001f050000613d00000b280500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000024004b00001ef70000413d00001f060000013d00000ba7044001970000000000430435000000000002004b0000002004000039000000000400603900001f060000013d00000000040000190000003f0240003900000ba8032001970000000002130019000000000032004b0000000003000039000000010300403900000b180020009c00001f180000213d000000010030019000001f180000c13d000000400020043f000000000001042d00000b6b01000041000000000010043f0000002201000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af300010430000000000003004b00001f280000613d000000000400001900000000052400190000000006140019000000000606043300000000006504350000002004400039000000000034004b00001f210000413d00000000012300190000000000010435000000000001042d00000000430104340000000001320436000000000003004b00001f370000613d000000000200001900000000051200190000000006240019000000000606043300000000006504350000002002200039000000000032004b00001f300000413d000000000213001900000000000204350000001f0230003900000ba8022001970000000001210019000000000001042d000000000301001900000000040304330000000001420436000000000004004b00001f490000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b00001f430000413d000000000001042d00000b5b0010009c00001f6a0000213d000000430010008c00001f6a0000a13d00000002020003670000000403200370000000000403043b00000b180040009c00001f6a0000213d000000000341004900000b5b0030009c00001f6a0000213d000001840030008c00001f6a0000413d0000002403200370000000000503043b00000b180050009c00001f6a0000213d0000002303500039000000000013004b00001f6a0000813d0000000403500039000000000232034f000000000302043b00000b180030009c00001f6a0000213d00000024025000390000000005230019000000000015004b00001f6a0000213d0000000401400039000000000001042d000000000100001900002af300010430000100000000000200010b110010019c00001f8d0000613d000000000020043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f000000010020019000001f8b0000613d000000000101043b0000000102000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f000000010020019000001f8b0000613d000000000101043b000000000101041a000000000001042d000000000100001900002af300010430000000400100043d000000640210003900000b89030000410000000000320435000000440210003900000b8a03000041000000000032043500000024021000390000002a03000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b21011001c700002af300010430000000000301001900000000013200a9000000000003004b00001fa80000613d00000000033100d9000000000023004b00001fa90000c13d000000000001042d00000b6b01000041000000000010043f0000001101000039000000040010043f00000b6c0100004100002af300010430000000000010043f000001a301000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f000000010020019000001fd10000613d000000400200043d00000bac0020009c00001fd30000813d000000000301043b0000004001200039000000400010043f000000000103041a00000b110110019800000000041204360000000102300039000000000202041a000000000024043500001fca0000613d0000ffff0220018f000000000001042d0000019c01000039000000000201041a0000019b01000039000000000101041a00000b11011001970000ffff0220018f000000000001042d000000000100001900002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300007000000000002000700000003001d000600000002001d0000000202000367000000000312034f000000000903043b00000bad0090009c000022670000813d0000002003100039000000000432034f000000000c04043b00000b1100c0009c000022670000213d0000004003300039000000000432034f000000000a04043b00000b1100a0009c000022670000213d000000400b3000390000000003b2034f000000000303043b000000000400003100000000051400490000001f0550008a00000b530650019700000b5307300197000000000867013f000000000067004b000000000600001900000b5306004041000000000053004b000000000500001900000b530500804100000b530080009c000000000605c019000000000006004b000022670000c13d0000000003130019000000000132034f000000000101043b00000b180010009c000022670000213d0000000005140049000000200630003900000b530350019700000b5307600197000000000837013f000000000037004b000000000300001900000b5303004041000000000056004b000000000500001900000b530500204100000b530080009c000000000305c019000000000003004b000022670000c13d0000001f0310003900000ba8033001970000003f0330003900000ba805300197000000400300043d0000000005530019000000000035004b0000000007000039000000010700403900000b180050009c000022690000213d0000000100700190000022690000c13d000000400050043f00000000051304360000000007610019000000000047004b000022670000213d00040000000a001d000500000009001d000000000462034f00000ba8061001980000001f0710018f0000000002650019000020310000613d000000000804034f0000000009050019000000008a08043c0000000009a90436000000000029004b0000202d0000c13d00020000000c001d00030000000b001d000000000007004b000020400000613d000000000464034f0000000306700210000000000702043300000000076701cf000000000767022f000000000404043b0000010006600089000000000464022f00000000046401cf000000000474019f00000000004204350000000001150019000000000001043500000abd0050009c00000abd050080410000004001500210000000000203043300000abd0020009c00000abd020080410000006002200210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c700008010020000392af12ae70000040f00000001002001900000000503000029000000040700002900000003080000290000000204000029000022670000613d000000000501043b000000400200043d0000006001200039000000000041043500000040012000390000000000310435000000200120003900000bae030000410000000000310435000000600380008a0000000204000367000000000334034f000000000303043b000000a006200039000000000076043500000080062000390000000000360435000000200380008a000000000634034f000000000606043b000000e0072000390000000000570435000000c0052000390000000000650435000000e005000039000000000052043500000baf0020009c000022690000213d0000008005300039000000000654034f0000010003200039000000400030043f000000000606043b00000b110060009c000022670000213d0000002005500039000000000754034f000000000707043b00000b200070009c000022670000213d0000002009500039000000000594034f000000000805043b00000b200080009c000022670000213d0000002005900039000000000554034f000000000b05043b000000800590008a000000000554034f000000000a05043b00000120052000390000000000a50435000000600990008a000000000494034f000000000404043b000001a0092000390000000000890435000001800820003900000000007804350000016007200039000000000067043500000140062000390000000000460435000001c00420003900020000000b001d0000000000b40435000000c004000039000000000043043500000bb00020009c000022690000213d000001e004200039000000400040043f00000200062000390000000002020433000000000002004b000020ad0000613d000000000700001900000000086700190000000009170019000000000909043300000000009804350000002007700039000000000027004b000020a60000413d000000000162001900000000000104350000000003030433000000000003004b000020ba0000613d000000000700001900000000081700190000000009570019000000000909043300000000009804350000002007700039000000000037004b000020b30000413d00000000011300190000000000010435000000000132001900000000001404350000003f0110003900000ba8021001970000000001420019000000000021004b0000000002000039000000010200403900000b180010009c000022690000213d0000000100200190000022690000c13d000000400010043f00000abd0060009c00000abd060080410000004001600210000000000204043300000abd0020009c00000abd020080410000006002200210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c700008010020000392af12ae70000040f0000000100200190000022670000613d0000000305000039000000000405041a000000010640019000000001024002700000007f0220618f000000400300043d000000000101043b000400000001001d0000001f0020008c00000000010000390000000101002039000000000016004b0000226f0000c13d0000000001230436000000000006004b000020f80000613d000000000050043f000000000002004b000020fe0000613d00000b250500004100000000040000190000000006410019000000000705041a000000000076043500000001055000390000002004400039000000000024004b000020f00000413d000020ff0000013d00000ba7044001970000000000410435000000000002004b00000020040000390000000004006039000020ff0000013d00000000040000190000003f0240003900000ba8042001970000000002340019000000000042004b0000000004000039000000010400403900000b180020009c000022690000213d0000000100400190000022690000c13d000000400020043f0000000003030433000000000003004b000021210000613d00000abd0030009c00000abd03008041000000600230021000000abd0010009c00000abd010080410000004001100210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c700008010020000392af12ae70000040f0000000100200190000022670000613d000000400200043d000000000801043b000021250000013d0000000101000039000000000801041a000000000008004b00000bb1080060410000000405000039000000000405041a000000010640019000000001034002700000007f0330618f0000001f0030008c00000000010000390000000101002039000000000114013f00000001001001900000226f0000c13d0000000001320436000000000006004b000021400000613d000000000050043f000000000003004b000021460000613d00000b280500004100000000040000190000000006410019000000000705041a000000000076043500000001055000390000002004400039000000000034004b000021380000413d000021470000013d00000ba7044001970000000000410435000000000003004b00000020040000390000000004006039000021470000013d00000000040000190000003f0340003900000ba8033001970000000004230019000000000034004b0000000003000039000000010300403900000b180040009c000022690000213d0000000100300190000022690000c13d000000400040043f0000000002020433000000000002004b0000216b0000613d000500000008001d00000abd0020009c00000abd02008041000000600220021000000abd0010009c00000abd010080410000004001100210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c700008010020000392af12ae70000040f0000000100200190000022670000613d000000400400043d000000000101043b00000005080000290000216f0000013d0000000201000039000000000101041a000000000001004b00000bb101006041000500000004001d0000006002400039000000000012043500000040014000390000000000810435000000200240003900000bb201000041000300000002001d000000000012043500000b7c010000410000000000100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000b5d011001c70000800b020000392af12ae70000040f0000000100200190000022750000613d000000000101043b0000000504000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a001000039000000000014043500000bb30040009c0000000003040019000022690000213d000000c001300039000100000001001d000000400010043f000000030100002900000abd0010009c00000abd010080410000004001100210000000000203043300000abd0020009c00000abd020080410000006002200210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c700008010020000392af12ae70000040f0000000100200190000022670000613d000000000101043b00000bb402000041000000010400002900000000002404350000000505000029000000e20250003900000004030000290000000000320435000000c202500039000000000012043500000abd0040009c00000abd040080410000004001400210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000121019f00000bb5011001c700008010020000392af12ae70000040f0000000100200190000022670000613d0000000003000031000000000101043b000000070200002900000b180020009c000022690000213d00000007020000290000001f0220003900000ba8022001970000003f0220003900000ba804200197000000400200043d0000000004420019000000000024004b0000000005000039000000010500403900000b180040009c000022690000213d0000000100500190000022690000c13d000000400040043f000000070500002900000000045204360000000605500029000000000035004b000022670000213d000000070300002900000ba8053001980000001f0630018f000000060300002900000002073003670000000003540019000021e20000613d000000000807034f0000000009040019000000008a08043c0000000009a90436000000000039004b000021de0000c13d000000000006004b000021ef0000613d000000000557034f0000000306600210000000000703043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000053043500000007034000290000000000030435000000400300043d0000000005020433000000410050008c000022760000c13d0000004005200039000000000505043300000bb70050009c000022860000213d0000006002200039000000000202043300000000040404330000006006300039000000000056043500000040053000390000000000450435000000f802200270000000200430003900000000002404350000000000130435000000000000043f00000abd0030009c00000abd030080410000004001300210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000bb8011001c700000001020000392af12ae70000040f0000000003010019000000600330027000000abd03300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000221f0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b0000221b0000c13d000000000005004b0000222c0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000022990000613d000000000100043d000700000001001d00060b110010019c000022b70000613d0000000201000029000000000010043f000001a001000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000022670000613d000000000101043b000000000101041a000000ff001001900000000001000019000022480000613d0000000702000029000000000001042d00000b3b01000041000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000022670000613d000000000101043b0000000602000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000022670000613d000000000101043b000000000101041a000000ff0110018f0000000702000029000000000001042d000000000100001900002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000002201000039000000040010043f00000b6c0100004100002af300010430000000000001042f000000440130003900000bb602000041000000000021043500000024013000390000001f02000039000000000021043500000ac001000041000000000013043500000004013000390000002002000039000000000021043500000abd0030009c00000abd03008041000000400130021000000b50011001c700002af300010430000000640130003900000bba020000410000000000210435000000440130003900000bbb02000041000000000021043500000024013000390000002202000039000000000021043500000ac001000041000000000013043500000004013000390000002002000039000000000021043500000abd0030009c00000abd03008041000000400130021000000b21011001c700002af3000104300000001f0530018f00000b6706300198000000400200043d0000000004620019000022a40000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000022a00000c13d000000000005004b000022b10000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000600130021000000abd0020009c00000abd020080410000004002200210000000000112019f00002af300010430000000400100043d000000440210003900000bb903000041000000000032043500000024021000390000001803000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b50011001c700002af30001043000040000000000020000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000022f30000613d000000000101043b000000000101041a000000ff001001900000000001000411000022e00000613d000000140100008a00000000011000310000000201100367000000000101043b000000600110027000000b1101100197000400000001001d000000000010043f00000b3601000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000022f30000613d000000000101043b000000000101041a000000ff00100190000022f50000613d000000000001042d000000000100001900002af300010430000000400200043d00000bbc0020009c000022fe0000413d00000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000203300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b000023060000c13d000000000401043300000b4a0440019700000b4b044001c700000000004104350000002104200039000000000504043300000b4a0550019700000b4c055001c700000000005404350000002904000039000000040600002900000000050600190000000006020433000000000046004b0000237c0000a13d0000000006140019000000000706043300000b4a077001970000000308500210000000780880018f00000b4d0880021f00000b4e08800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000023150000213d000000400700043d000000100050008c000023820000813d00000b190070009c000022f80000213d00000000060700190000008004600039000000400040043f000000420500003900000000055604360000000008050019000000003603043c0000000005650436000000000045004b000023310000c13d000000000308043300000b4a0330019700000b4b033001c7000000000038043500000000060700190000002103600039000000000403043300000b4a0440019700000b4c044001c7000000000043043500000041030000390000000004060433000000000034004b0000237c0000a13d0000000004830019000000000504043300000b4a0550019700000b4b055001c70000000000540435000000010330008a000000010030008c000023400000213d000000400500043d000400000005001d000000200350003900000b510400004100000000004304350000000003020433000300000003001d0000003702500039000100000006001d000200000008001d2af11f1e0000040f00000003020000290000000401200029000000370210003900000b52030000410000000000320435000000480210003900000001010000290000000003010433000100000003001d00000002010000292af11f1e0000040f0000000102000029000000030320002900000028023000390000000401000029000000000021043500000048023000392af11e980000040f00000ac001000041000000400300043d000300000003001d0000000000130435000000200100003900000004023000390000000000120435000000240230003900000004010000292af11f2b0000040f0000000302000029000000000121004900000abd0010009c00000abd0100804100000abd0020009c00000abd0200804100000060011002100000004002200210000000000121019f00002af30001043000000b6b01000041000000000010043f0000003201000039000000040010043f00000b6c0100004100002af300010430000000440170003900000b4f02000041000000000021043500000ac00100004100000000001704350000002401700039000000200200003900000000002104350000000401700039000000000021043500000abd0070009c00000abd07008041000000400170021000000b50011001c700002af3000104300004000000000002000300000001001d0000000001000411000400000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000023cb0000613d000000000101043b000000000101041a000000ff00100190000023aa0000613d000000140100008a00000000011000310000000201100367000000000101043b00040060001002780000000301000029000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000023cb0000613d000000000101043b000000040200002900000b1102200197000400000002001d000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000023cb0000613d000000000101043b000000000101041a000000ff00100190000023cd0000613d000000000001042d000000000100001900002af300010430000000400200043d00000bbc0020009c000023d60000413d00000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000203300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b000023de0000c13d000000000401043300000b4a0440019700000b4b044001c700000000004104350000002104200039000000000504043300000b4a0550019700000b4c055001c700000000005404350000002904000039000000040600002900000000050600190000000006020433000000000046004b0000245d0000a13d0000000006140019000000000706043300000b4a077001970000000308500210000000780880018f00000b4d0880021f00000b4e08800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000023ed0000213d000000100050008c000024630000813d000000400400043d000400000004001d00000b190040009c000023d00000213d00000004060000290000008004600039000000400040043f00000042050000390000000005560436000200000005001d000000003603043c0000000005650436000000000045004b0000240a0000c13d0000000209000029000000000309043300000b4a0330019700000b4b033001c7000000000039043500000004080000290000002103800039000000000403043300000b4a0440019700000b4c044001c700000000004304350000004103000039000000030500002900000000040500190000000005080433000000000035004b0000245d0000a13d0000000005930019000000000605043300000b4a066001970000000307400210000000780770018f00000b4d0770021f00000b4e07700197000000000667019f00000000006504350000000405400270000000010330008a000000010030008c0000241b0000213d000000100040008c000024630000813d000000400500043d000300000005001d000000200350003900000b510400004100000000004304350000000003020433000100000003001d00000037025000392af11f1e0000040f00000001020000290000000301200029000000370210003900000b52030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d00000002010000292af11f1e0000040f0000000402000029000000010320002900000028023000390000000301000029000000000021043500000048023000392af11e980000040f00000ac001000041000000400300043d000400000003001d0000000000130435000000200100003900000004023000390000000000120435000000240230003900000003010000292af11f2b0000040f0000000402000029000000000121004900000abd0010009c00000abd0100804100000abd0020009c00000abd0200804100000060011002100000004002200210000000000121019f00002af30001043000000b6b01000041000000000010043f0000003201000039000000040010043f00000b6c0100004100002af300010430000000400100043d000000440210003900000b4f03000041000000000032043500000ac00200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000000000032043500000abd0010009c00000abd01008041000000400110021000000b50011001c700002af3000104300006000000000002000600000002001d0000000032020434000200000003001d000000000002004b000025080000613d000500000001001d000000000010043f0000019401000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000025060000613d000000000601043b0000000601000029000000000401043300000b9a0040009c000025100000813d000000000106041a000000010210019000000001031002700000007f0330618f0000001f0030008c00000000010000390000000101002039000000000012004b000025160000c13d000000200030008c000300000006001d000400000004001d000024b50000413d000100000003001d000000000060043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000100200190000025060000613d00000004040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000000306000029000024b50000813d000000000002041b0000000102200039000000000012004b000024b10000413d0000001f0040008c000024e00000a13d000000000060043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000100200190000025060000613d000000040800002900000ba802800198000000000101043b000025000000613d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000306000029000000060700002900000000057300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000024cc0000c13d000000000082004b000024dd0000813d0000000302800210000000f80220018f00000ba90220027f00000ba90220016700000000037300190000000003030433000000000223016f000000000021041b000000010180021000000001011001bf000024ec0000013d000000000004004b000024e50000613d00000002010000290000000001010433000024e60000013d0000000001000019000000030240021000000ba90220027f00000ba902200167000000000121016f0000000102400210000000000121019f000000000016041b000000400100043d0000000502000029000000000021043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000010300003900000bbd040000412af12ae20000040f0000000100200190000025060000613d000000000001042d000000200300003900000003060000290000000607000029000000000082004b000024d50000413d000024dd0000013d000000000100001900002af300010430000000400100043d00000bbe02000041000000000021043500000abd0010009c00000abd01008041000000400110021000000b9d011001c700002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000002201000039000000040010043f00000b6c0100004100002af3000104300006000000000002000600000002001d000500000001001d000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b000000060200002900000b1102200197000600000002001d000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b000000000101041a000000ff00100190000025810000613d0000000501000029000000000010043f000000fd01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b0000000602000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b000000000201041a00000ba702200197000000000021041b0000000001000411000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b000000000101041a000000ff001001900000000002000411000025730000613d000000140100008a00000000011000310000000201100367000000000101043b0000006002100270000000000100041400000abd0010009c00000abd01008041000000c00110021000000b110720019700000b37011001c70000800d02000039000000040300003900000bbf04000041000000050500002900000006060000292af12ae20000040f0000000100200190000026040000613d0000000501000029000000000010043f0000012f01000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000201043b0000000601000029000000000010043f000500000002001d0000000101200039000300000001001d000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d0000000503000029000000000101043b000000000101041a000000000001004b000026030000613d000000000203041a000000000002004b000026060000613d000000000012004b000400000001001d000025e30000613d000200000002001d000000000030043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000100200190000026040000613d00000004020000290001000100200092000000000101043b0000000504000029000000000204041a000000010020006c00000000030400190000260c0000a13d0000000202000029000000010220008a0000000001120019000000000101041a000200000001001d000000000030043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b00000001011000290000000202000029000000000021041b000000000020043f0000000301000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b0000000402000029000000000021041b0000000503000029000000000103041a000400000001001d000000000001004b000026120000613d000000000030043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000100200190000026040000613d0000000402000029000000010220008a000000000101043b0000000001210019000000000001041b0000000501000029000000000021041b0000000601000029000000000010043f0000000301000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000026040000613d000000000101043b000000000001041b000000000001042d000000000100001900002af30001043000000b6b01000041000000000010043f0000001101000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000003201000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000003101000039000000040010043f00000b6c0100004100002af300010430000f000000000002000600000005001d000d00000003001d000c00000002001d000400000001001d000700000004001d000000000040043f0000019401000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000d0a0000290000000100200190000028870000613d000000000101043b000000000101041a000000010210019000000001011002700000007f0110618f0000001f0010008c00000000030000390000000103002039000000000032004b0000288f0000c13d000000000001004b000026f30000c13d00000b9a00a0009c000029250000813d0000001f01a0003900000ba8011001970000003f0110003900000ba801100197000000400800043d0000000001180019000000000081004b0000000002000039000000010200403900000b180010009c000029250000213d0000000100200190000029250000c13d000000400010043f0000000009a804360000000c01a00029000000000010007c000028870000213d00000ba802a001980000001f03a0018f0000000c0100002900000002041003670000000001290019000026570000613d000000000504034f0000000006090019000000005705043c0000000006760436000000000016004b000026530000c13d000000000003004b000026640000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000c00000009001d0000000001a900190000000000010435000d00000008001d0000000001080433000000000001004b000028b00000613d0000000701000029000000000010043f0000019401000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000000d020000290000000c05000029000028870000613d000000000701043b000000000402043300000b180040009c000029250000213d000000000107041a000000010010019000000001031002700000007f0330618f0000001f0030008c00000000020000390000000102002039000000000121013f00000001001001900000288f0000c13d000000200030008c000b00000007001d000a00000004001d000026aa0000413d000900000003001d000000000070043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000c050000290000000100200190000028870000613d0000000a040000290000001f024000390000000502200270000000200040008c0000000002004019000000000301043b00000009010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000000b07000029000026aa0000813d000000000002041b0000000102200039000000000012004b000026a60000413d0000001f0040008c000026d50000a13d000000000070043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000d060000290000000100200190000028870000613d0000000a0800002900000ba802800198000000000101043b000028820000613d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000b0700002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000026c10000c13d000000000082004b000026d20000813d0000000302800210000000f80220018f00000ba90220027f00000ba90220016700000000036300190000000003030433000000000223016f000000000021041b000000010180021000000001011001bf000026e00000013d000000000004004b000026d90000613d0000000001050433000026da0000013d0000000001000019000000030240021000000ba90220027f00000ba902200167000000000121016f0000000102400210000000000121019f000000000017041b000000400100043d0000000702000029000000000021043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000ac5011001c70000800d02000039000000010300003900000bbd040000412af12ae20000040f0000000100200190000028870000613d000000400100043d000300000001001d00000b140010009c000029250000213d00000003020000290000002001200039000100000001001d000000400010043f0000000000020435000000040100002900050b110010019c000028950000613d0000000001000411000200000001001d000000000010043f0000009901000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000028870000613d000000000101043b000000000101041a000000ff00100190000027160000613d000000140100008a00000000011000310000000201100367000000000101043b0002006000100278000000400300043d00000b130030009c000029250000213d0000004001300039000000400010043f000000010100003900000000041304360000000702000029000900000004001d0000000000240435000000400400043d00000b130040009c000029250000213d000b00000003001d0000004002400039000000400020043f000a00000004001d00000000021404360000000601000029000800000002001d0000000000120435000000000000043f00000b1501000041000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000028870000613d0000000b010000290000000001010433000000000001004b0000000a01000029000027610000613d00000000020000190000000001010433000000000021004b000028890000a13d000d00000002001d0000000501200210000000090210002900000008011000290000000001010433000c00000001001d0000000001020433000000000010043f000001a101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000028870000613d000000000101043b000000000201041a0000000c04000029000000000042001a0000000b03000029000028fd0000413d0000000002420019000000000021041b0000000d0200002900000001022000390000000001030433000000000012004b0000000a010000290000273d0000413d0000000701000029000000000010043f0000016101000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000028870000613d000000000101043b0000000502000029000000000020043f000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000028870000613d000000000101043b000000000201041a000000060020002a000028fd0000413d00000006030000290000000002320019000000000021041b000000400100043d000000200210003900000000003204350000000702000029000000000021043500000abd0010009c00000abd010080410000004001100210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f000000020200002900000b110520019700000b12011001c70000800d02000039000000040300003900000b1604000041000d00000005001d000000000600001900000005070000292af12ae20000040f0000000100200190000028870000613d00000abe01000041000000000010044300000004010000290000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f0000000100200190000028a90000613d000000000101043b000000000001004b0000000106000029000028250000613d000000400b00043d0000008401b00039000000a00200003900000000002104350000006401b00039000000060200002900000000002104350000004401b000390000000702000029000000000021043500000b1a0100004100000000001b04350000000401b000390000000d0200002900000000002104350000002401b00039000000000001043500000003010000290000000001010433000000a402b000390000000000120435000000c402b00039000000000001004b000027cc0000613d000000000300001900000000042300190000000005360019000000000505043300000000005404350000002003300039000000000013004b000027c50000413d0000000002210019000000000002043500000000040004140000000502000029000000040020008c000027da0000c13d00000000050004150000000f0550008a00000005055002100000000103000031000000200030008c00000020040000390000000004034019000028100000013d0000001f0110003900000ba801100197000000c40110003900000abd0010009c00000abd01008041000000600110021000000abd00b0009c00000abd0300004100000000030b40190000004003300210000000000131019f00000abd0040009c00000abd04008041000000c003400210000000000113019f000d0000000b001d2af12ae20000040f0000000d0b0000290000000003010019000000600330027000000abd03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000027fc0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000027f80000c13d000000000006004b000028090000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000000050004150000000e0550008a00000005055002100000000100200190000028b80000613d0000001f01400039000000600110018f0000000004b10019000000000014004b0000000001000039000000010100403900000b180040009c000029250000213d0000000100100190000029250000c13d000000400040043f000000200030008c000028870000413d00000000010b043300000b1b00100198000028870000c13d0000000502500270000000000201001f00000b1c0110019700000b1a0010009c000028aa0000c13d0000000701000029000000000010043f0000019401000039000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f0000000100200190000028870000613d000000000101043b000000400600043d00000040020000390000000007260436000000000201041a000000010320019000000001052002700000007f0550618f0000001f0050008c00000000040000390000000104002039000000000442013f00000001004001900000288f0000c13d00000040046000390000000000540435000000000003004b000028610000613d000b00000005001d000c00000007001d000d00000006001d000000000010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f0000000100200190000028870000613d0000000b08000029000000000008004b0000000d060000290000000c07000029000028680000613d0000006002600039000000000301043b00000000010000190000000004120019000000000503041a000000000054043500000001033000390000002001100039000000000081004b000028590000413d000028690000013d00000ba70120019700000060026000390000000000120435000000000005004b00000020010000390000000001006039000028690000013d00000000010000190000000602000029000000000027043500000abd0060009c00000abd060080410000004002600210000000600110003900000abd0010009c00000abd010080410000006001100210000000000121019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c70000800d02000039000000030300003900000bc004000041000000050500002900000007060000292af12ae20000040f0000000100200190000028870000613d000000000001042d00000020030000390000000b07000029000000000082004b000026ca0000413d000026d20000013d000000000100001900002af30001043000000b6b01000041000000000010043f0000003201000039000000040010043f00000b6c0100004100002af30001043000000b6b01000041000000000010043f0000002201000039000000040010043f00000b6c0100004100002af300010430000000400100043d000000640210003900000bc1030000410000000000320435000000440210003900000bc203000041000000000032043500000024021000390000002103000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b21011001c700002af300010430000000000001042f00000ac00100004100000000001404350000000401400039000d00000004001d2af1292b0000040f000028f30000013d000000400100043d00000bbe02000041000000000021043500000abd0010009c00000abd01008041000000400110021000000b9d011001c700002af300010430000000040230008c000028ed0000413d000000000400043d00000b1b04400197000000000501043b00000b1c05500197000000000445019f000000000040043f000000440030008c000028ed0000413d00000b1c0440019700000ac00040009c000028ed0000c13d000000040510037000000ba8062001980000001f0720018f000000400400043d0000000001640019000028d10000613d000000000805034f0000000009040019000000008a08043c0000000009a90436000000000019004b000028cd0000c13d000000000007004b000028de0000613d000000000565034f0000000306700210000000000701043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000510435000000000504043300000b180050009c000028ed0000213d0000002401500039000000000031004b000028ed0000213d0000000001450019000000000301043300000b180030009c000028ed0000213d000000000224001900000000063100190000002006600039000000000026004b000029030000a13d000000400200043d000d00000002001d00000ac001000041000000000012043500000004012000392af129380000040f0000000d02000029000000000121004900000abd0010009c00000abd01008041000000600110021000000abd0020009c00000abd020080410000004002200210000000000121019f00002af30001043000000b6b01000041000000000010043f0000001101000039000000040010043f00000b6c0100004100002af30001043000000000023500190000003f0220003900000ba8022001970000000004420019000000000024004b00000000020000390000000102004039000000000304001900000b180040009c000029250000213d0000000100200190000029250000c13d000000400030043f000000000001004b000028ed0000613d00000ac0020000410000000004030019000d00000004001d000000000024043500000004024000390000002003000039000000000032043500000024024000392af11f2b0000040f0000000d02000029000000000121004900000abd0010009c00000abd0100804100000abd0020009c00000abd0200804100000060011002100000004002200210000000000121019f00002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af300010430000000600210003900000bc3030000410000000000320435000000400210003900000bc4030000410000000000320435000000200210003900000028030000390000000000320435000000200200003900000000002104350000008001100039000000000001042d000000600210003900000bc5030000410000000000320435000000400210003900000bc6030000410000000000320435000000200210003900000034030000390000000000320435000000200200003900000000002104350000008001100039000000000001042d0001000000000002000000000301041a000100000002001d000000000023004b000029580000a13d000000000010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000295e0000613d000000000101043b00000001011000290000000002000019000000000001042d00000b6b01000041000000000010043f0000003201000039000000040010043f00000b6c0100004100002af300010430000000000100001900002af3000104300004000000000002000300000002001d000000000020043f000400000001001d0000000101100039000200000001001d000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000299d0000613d000000000101043b000000000101041a000000000001004b000029750000613d000000000001042d0000000402000029000000000102041a00000b9a0010009c0000299f0000813d000100000001001d0000000101100039000000000012041b000000000020043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000ac5011001c700008010020000392af12ae70000040f00000001002001900000299d0000613d000000000101043b00000001011000290000000302000029000000000021041b0000000401000029000000000101041a000400000001001d000000000020043f0000000201000029000000200010043f000000000100041400000abd0010009c00000abd01008041000000c00110021000000b12011001c700008010020000392af12ae70000040f00000001002001900000299d0000613d000000000101043b0000000402000029000000000021041b000000000001042d000000000100001900002af30001043000000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af3000104300004000000000002000000400400043d00000bac0040009c00002a690000813d00000b11051001970000004001400039000000400010043f000000200140003900000bc70300004100000000003104350000002001000039000000000014043500000000230204340000000001000414000000040050008c000029e00000c13d000000010100003200002a1c0000613d00000b180010009c00002a690000213d0000001f0310003900000ba8033001970000003f0330003900000ba803300197000000400a00043d00000000033a00190000000000a3004b0000000004000039000000010400403900000b180030009c00002a690000213d000000010040019000002a690000c13d000000400030043f00000000051a043600000ba8021001980000001f0310018f00000000012500190000000304000367000029d20000613d000000000604034f000000006706043c0000000005750436000000000015004b000029ce0000c13d000000000003004b00002a1d0000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f000000000021043500002a1d0000013d000200000004001d00000abd0030009c00000abd03008041000000600330021000000abd0020009c00000abd020080410000004002200210000000000223019f00000abd0010009c00000abd01008041000000c001100210000000000112019f000100000005001d00000000020500192af12ae20000040f00030000000103550000000003010019000000600330027000010abd0030019d00000abd0430019800002a340000613d0000001f0340003900000b65033001970000003f0330003900000b6603300197000000400a00043d00000000033a00190000000000a3004b0000000005000039000000010500403900000b180030009c00002a690000213d000000010050019000002a690000c13d000000400030043f0000001f0540018f00000000034a043600000b6706400198000000000463001900002a0e0000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b00002a0a0000c13d000000000005004b00002a360000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500002a360000013d000000600a0000390000000002000415000000040220008a000000050220021000000000010a0433000000000001004b00002a3e0000c13d00020000000a001d00000abe01000041000000000010044300000004010000390000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f000000010020019000002a9b0000613d0000000002000415000000040220008a00002a510000013d000000600a000039000000800300003900000000010a0433000000010020019000002a850000613d0000000002000415000000030220008a0000000502200210000000000001004b00002a410000613d000000050220027000000000020a001f00002a5b0000013d00020000000a001d00000abe01000041000000000010044300000001010000290000000400100443000000000100041400000abd0010009c00000abd01008041000000c00110021000000abf011001c700008002020000392af12ae70000040f000000010020019000002a9b0000613d0000000002000415000000030220008a0000000502200210000000000101043b000000000001004b000000020a00002900002a9c0000613d00000000010a0433000000050220027000000000020a001f000000000001004b00002a680000613d00000b5b0010009c00002a6f0000213d000000200010008c00002a6f0000413d0000002001a000390000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00002a6f0000c13d000000000001004b00002a710000613d000000000001042d00000b6b01000041000000000010043f0000004101000039000000040010043f00000b6c0100004100002af300010430000000000100001900002af300010430000000400100043d000000640210003900000bc8030000410000000000320435000000440210003900000bc903000041000000000032043500000024021000390000002a03000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b21011001c700002af300010430000000000001004b00002aad0000c13d000000400300043d000100000003001d00000ac0010000410000000000130435000000040130003900000020020000390000000000210435000000240230003900000002010000292af11f2b0000040f0000000102000029000000000121004900000abd0010009c00000abd0100804100000abd0020009c00000abd0200804100000060011002100000004002200210000000000121019f00002af300010430000000000001042f000000400100043d000000440210003900000b5603000041000000000032043500000024021000390000001d03000039000000000032043500000ac002000041000000000021043500000004021000390000002003000039000000000032043500000abd0010009c00000abd01008041000000400110021000000b50011001c700002af30001043000000abd0030009c00000abd03008041000000400230021000000abd0010009c00000abd010080410000006001100210000000000121019f00002af300010430000000000001042f00000abd0010009c00000abd01008041000000400110021000000abd0020009c00000abd020080410000006002200210000000000112019f000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000b37011001c700008010020000392af12ae70000040f000000010020019000002ac90000613d000000000101043b000000000001042d000000000100001900002af30001043000000000050100190000000000200443000000040030008c00002ad20000a13d00000005014002700000000001010031000000040010044300000abd0030009c00000abd030080410000006001300210000000000200041400000abd0020009c00000abd02008041000000c002200210000000000112019f00000bca011001c700000000020500192af12ae70000040f000000010020019000002ae10000613d000000000101043b000000000001042d000000000001042f00002ae5002104210000000102000039000000000001042d0000000002000019000000000001042d00002aea002104230000000102000039000000000001042d0000000002000019000000000001042d00002aef002104250000000102000039000000000001042d0000000002000019000000000001042d00002af10000043200002af20001042e00002af30001043000000000000000000000000000000000000000000000000000000000ffffffff1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65640000000000000000000000000000000000000000000000000000000000000000000000000084000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000002000000000000000000000000000000000000200000000000000000000000007f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000938e3d7a00000000000000000000000000000000000000000000000000000000ca15c87200000000000000000000000000000000000000000000000000000000e8a3d48400000000000000000000000000000000000000000000000000000000eb13554e00000000000000000000000000000000000000000000000000000000f28083c200000000000000000000000000000000000000000000000000000000f28083c300000000000000000000000000000000000000000000000000000000f5298aca00000000000000000000000000000000000000000000000000000000eb13554f00000000000000000000000000000000000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000e8a3d48500000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000ea500d6900000000000000000000000000000000000000000000000000000000d45573f500000000000000000000000000000000000000000000000000000000e159163300000000000000000000000000000000000000000000000000000000e159163400000000000000000000000000000000000000000000000000000000e57553da00000000000000000000000000000000000000000000000000000000d45573f600000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000ca15c87300000000000000000000000000000000000000000000000000000000cb2ef6f700000000000000000000000000000000000000000000000000000000d111515d00000000000000000000000000000000000000000000000000000000a22cb46400000000000000000000000000000000000000000000000000000000b17cd86e00000000000000000000000000000000000000000000000000000000b6f10c7800000000000000000000000000000000000000000000000000000000b6f10c7900000000000000000000000000000000000000000000000000000000bd85b03900000000000000000000000000000000000000000000000000000000b17cd86f00000000000000000000000000000000000000000000000000000000b24f2d3900000000000000000000000000000000000000000000000000000000a22cb46500000000000000000000000000000000000000000000000000000000ac9650d800000000000000000000000000000000000000000000000000000000b03f4528000000000000000000000000000000000000000000000000000000009bcf7a14000000000000000000000000000000000000000000000000000000009bcf7a1500000000000000000000000000000000000000000000000000000000a0a8e46000000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000938e3d7b0000000000000000000000000000000000000000000000000000000095d89b410000000000000000000000000000000000000000000000000000000098a6e9930000000000000000000000000000000000000000000000000000000036568abd000000000000000000000000000000000000000000000000000000006b20c4530000000000000000000000000000000000000000000000000000000084b0196d000000000000000000000000000000000000000000000000000000009010d07b000000000000000000000000000000000000000000000000000000009010d07c0000000000000000000000000000000000000000000000000000000091d148540000000000000000000000000000000000000000000000000000000084b0196e000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000006b20c454000000000000000000000000000000000000000000000000000000006f4f2837000000000000000000000000000000000000000000000000000000007e54523c000000000000000000000000000000000000000000000000000000004e1273f3000000000000000000000000000000000000000000000000000000004e1273f400000000000000000000000000000000000000000000000000000000572b6c0500000000000000000000000000000000000000000000000000000000600dd5ea0000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000003b1475a7000000000000000000000000000000000000000000000000000000004cc157df00000000000000000000000000000000000000000000000000000000162094c300000000000000000000000000000000000000000000000000000000274e4a1c000000000000000000000000000000000000000000000000000000002eb2c2d5000000000000000000000000000000000000000000000000000000002eb2c2d6000000000000000000000000000000000000000000000000000000002f2ff15d00000000000000000000000000000000000000000000000000000000274e4a1d000000000000000000000000000000000000000000000000000000002a55205a00000000000000000000000000000000000000000000000000000000162094c4000000000000000000000000000000000000000000000000000000001e7ac48800000000000000000000000000000000000000000000000000000000248a9ca300000000000000000000000000000000000000000000000000000000079fe40d00000000000000000000000000000000000000000000000000000000079fe40e000000000000000000000000000000000000000000000000000000000e89341c0000000000000000000000000000000000000000000000000000000013af40350000000000000000000000000000000000000000000000000000000000fdd58e0000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffffdfddbe7551d92310b6243b2363659197d9a8d2fa76b783e9f2b9bd0353b8ab36e3c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f620000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff7ff23a6e610000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000393a60fc9175593e1a78e765b331de118c5f3515197c300f7c46d515f7ce93cf00000000000000000000000000000000000000400000008000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000084000000000000000000000000546f6b656e45524331313535000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000003da8a5f161a6c3ff06a60736d0ed24d7963cc6a5c4fafd2fa1dae9bb908e07a5c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b3da8a5f161a6c3ff06a60736d0ed24d7963cc6a5c4fafd2fa1dae9bb908e07a475ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e658a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e64b0f3e90519fd0de3100ca1a24094c0a25e5cbf467d74a2603172b5a5204555b34f0c16fae602f21ceff35e5dbf6b3f5da1a340b9828b5d9fce8d4a5adfbaaa4dabfcb23569e49e43d5ceb833f3e67989d6ea4bd8dc129beaac9b0e85d1d6989054034dca961b61bc2a3147cc0c1986762915b42723ed64155364f17a2e296770abfcb23569e49e43d5ceb833f3e67989d6ea4bd8dc129beaac9b0e85d1d6988f7d70125ff5b49b14caefe49207093d68e84e159451a22fc2c22525721f561835828feda00a4b64eb35101b6df8f6c29717b1ea6bae5dd03d3ddada8de0a9e7cb7d70125ff5b49b14caefe49207093d68e84e159451a22fc2c22525721f561834ffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000c6c59f036e8aa6c1e587189a4cce21ee73a0caeae683cff083b92aea08316c31c6c59f036e8aa6c1e587189a4cce21ee73a0caeae683cff083b92aea08316c30c34a738ec333e394a3927794cadc6dd0eb7d9eed0999d1e55021ea223ac362cc02000000000000000000000000000000000000000000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0de9104285c6851efcbc5e0e70440200efbdcab556a1c8784776780f8bb44f2932e9104285c6851efcbc5e0e70440200efbdcab556a1c8784776780f8bb44f29319f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c6bd6b5318a46e5fff572d5e4258a20774aab40cc35ac7680654b9081fcc82f80bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff299d17e95023f496e0ffc4909cff1a61f74bb5eb18de6f900f4155bfa1b3b333e2497bd806ec41a6e0dd992c29a72efc0ef8fec9092d1978fd4a1e00b2f1830490d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb6e697469616c697a696e67000000000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069373b8cebd8b3f073a2f76de209acd3f968c354df0241e7f1c7fce7612e30f042eef043febddf4e1d1cf1f72ff1407b84e036e805aa0934418cb82095da8d7164d246da9440709ce0dd3f4fd669abc85ada012ab9774b8ecdcc5059ba1486b9c1000000000000000000000000000000000000004000000000000000000000000078bdf2507cfc008d301053cf258f06d9bab3737229913b45a470c231417160e5000000000000000000000000000000000000000000000000ffffffffffffff9f00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3000000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000030313233343536373839616263646566000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000537472696e67733a20686578206c656e67746820696e73756666696369656e740000000000000000000000000000000000000064000000000000000000000000416363657373436f6e74726f6c3a206163636f756e7420000000000000000000206973206d697373696e6720726f6c65200000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000206661696c656400000000000000000000000000000000000000000000000000416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000017307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3120666f722073656c660000000000000000000000000000000000000000000000455243313135353a2073657474696e6720617070726f76616c207374617475737365cf4122f072a3365c20d54eff9b38d73c096c28e1892ec8f5b0e403a0f12d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000696e76616c696420696400000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6d73672076616c7565206e6f74207a65726f00000000000000000000000000006d7573742073656e6420746f74616c2070726963652e0000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5fa9059cbb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000003ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0bfb89d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000007072696365206c657373207468616e20706c6174666f726d20666565000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000002156616c75650000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffe4000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffe4000000000000000000000000000000000ffffffff000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000000b35afaf155daeef41cc46df86f058df2855c57d30ab134647a6b587e7cc8c397a65726f207175616e7469747900000000000000000000000000000000000000726563697069656e7420756e646566696e6564000000000000000000000000007265717565737420657870697265640000000000000000000000000000000000696e76616c6964207369676e61747572650000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00000000000000000000000000000000000000006400000080000000000000000000000000000000000000000000000000000000200000000000000000000000004549503731323a20556e696e697469616c697a656400000000000000000000000f000000000000000000000000000000000000000000000000000000000000009a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670bf8086cee80709bd44c82f89dbca54115ebd05e840a88ab81df9cf5be9754eb6320617070726f7665642e00000000000000000000000000000000000000000000455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f72616e636500000000000000000000000000000000000000000000000000000000455243313135353a206275726e20616d6f756e7420657863656564732062616c4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6573730000000000000000000000000000000000000000000000000000000000455243313135353a206275726e2066726f6d20746865207a65726f206164647265786365656420726f79616c7479206270730000000000000000000000000000206d69736d617463680000000000000000000000000000000000000000000000455243313135353a206163636f756e747320616e6420696473206c656e67746800000000000000000000000000000000000000000000003fffffffffffffffe0616c6964206f776e657200000000000000000000000000000000000000000000455243313135353a2061646472657373207a65726f206973206e6f742061207620726f6c657320666f722073656c660000000000000000000000000000000000416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63656572206f7220617070726f766564000000000000000000000000000000000000455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e6d69736d61746368000000000000000000000000000000000000000000000000455243313135353a2069647320616e6420616d6f756e7473206c656e677468206572732e000000000000000000000000000000000000000000000000000000007265737472696374656420746f205452414e534645525f524f4c4520686f6c6472207472616e7366657200000000000000000000000000000000000000000000455243313135353a20696e73756666696369656e742062616c616e636520666fbc197c81000000000000000000000000000000000000000000000000000000006472657373000000000000000000000000000000000000000000000000000000455243313135353a207472616e7366657220746f20746865207a65726f2061640000000000000000ffffffffffffffff0000000000000000000000000000000065786365656473204d41585f4250530000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000093dafeb700000000000000000000000000000000000000000000000000000000631304dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000008292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d766e6577206f776e6572206e6f74206d6f64756c652061646d696e2e00000000005a05180effffffffffffffffffffffffffffffffffffffffffffffffffffffff5a05180f000000000000000000000000000000000000000000000000000000007965db0b00000000000000000000000000000000000000000000000000000000d9b67a260000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000000e89341c000000000000000000000000000000000000000000000000000000002a55205a00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff000000000000000000000000000000000000000000000000ffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffffc00000000000000000000000010000000000000000000000000000000000000000c7a95ef88f83fa833ccfce325157b7111633b181b6a27181b86415d8d501134d000000000000000000000000000000000000000000000000fffffffffffffeff000000000000000000000000000000000000000000000000fffffffffffffe1fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f1901000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000004200000000000000000000000045434453413a20696e76616c6964207369676e6174757265206c656e677468007fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0000000000000000000000000000000000000008000000000000000000000000045434453413a20696e76616c6964207369676e61747572650000000000000000756500000000000000000000000000000000000000000000000000000000000045434453413a20696e76616c6964207369676e6174757265202773272076616c000000000000000000000000000000000000000000000000ffffffffffffffa0f8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a094836b00000000000000000000000000000000000000000000000000000000f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b04133ee4cb027e1c5fce5e3481289278a93bd16a65a3b65b428a6d239e706bfb7300000000000000000000000000000000000000000000000000000000000000455243313135353a206d696e7420746f20746865207a65726f206164647265736420746f6b656e73000000000000000000000000000000000000000000000000455243313135353a204552433131353552656365697665722072656a65637465526563656976657220696d706c656d656e746572000000000000000000000000455243313135353a207472616e7366657220746f206e6f6e2d455243313135355361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646f742073756363656564000000000000000000000000000000000000000000005361666545524332303a204552433230206f7065726174696f6e20646964206e02000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1646970667358221220d1bc283dbf518a067757bd7567c5f12765968adf713256ced845c3f6ed501907002a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ 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.