Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 25 from a total of 94 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Update Metadata ... | 6715675 | 289 days ago | IN | 0 ETH | 0.00000512 | ||||
| Update Metadata ... | 6715646 | 289 days ago | IN | 0 ETH | 0.00000726 | ||||
| Update Dynamic M... | 4547790 | 315 days ago | IN | 0 ETH | 0.00001461 | ||||
| Update Dynamic M... | 4539902 | 315 days ago | IN | 0 ETH | 0.00000732 | ||||
| Update Metadata ... | 3840035 | 324 days ago | IN | 0 ETH | 0.00000835 | ||||
| Update Metadata ... | 2429135 | 340 days ago | IN | 0 ETH | 0.00000905 | ||||
| Update Dynamic M... | 2353424 | 341 days ago | IN | 0 ETH | 0.00001407 | ||||
| Update Dynamic M... | 2304821 | 342 days ago | IN | 0 ETH | 0.00000724 | ||||
| Update Dynamic M... | 2257569 | 342 days ago | IN | 0 ETH | 0.00000767 | ||||
| Update Metadata ... | 2149061 | 344 days ago | IN | 0 ETH | 0.00000823 | ||||
| Update Metadata ... | 2148857 | 344 days ago | IN | 0 ETH | 0.00000823 | ||||
| Update Metadata ... | 1845204 | 347 days ago | IN | 0 ETH | 0.00000581 | ||||
| Update Dynamic M... | 1845143 | 347 days ago | IN | 0 ETH | 0.00000717 | ||||
| Update Metadata ... | 1843682 | 347 days ago | IN | 0 ETH | 0.00000824 | ||||
| Update Metadata ... | 1843552 | 347 days ago | IN | 0 ETH | 0.00000824 | ||||
| Update Metadata ... | 1841553 | 347 days ago | IN | 0 ETH | 0.00000748 | ||||
| Update Metadata ... | 1841127 | 347 days ago | IN | 0 ETH | 0.00000744 | ||||
| Update Metadata ... | 1840248 | 347 days ago | IN | 0 ETH | 0.0000042 | ||||
| Update Metadata ... | 1839967 | 347 days ago | IN | 0 ETH | 0.00000824 | ||||
| Update Metadata ... | 1839400 | 347 days ago | IN | 0 ETH | 0.00000805 | ||||
| Update Metadata ... | 1751611 | 348 days ago | IN | 0 ETH | 0.00000747 | ||||
| Update Metadata ... | 1718854 | 349 days ago | IN | 0 ETH | 0.00000828 | ||||
| Update Metadata ... | 1557025 | 351 days ago | IN | 0 ETH | 0.00000415 | ||||
| Update Metadata ... | 1515591 | 351 days ago | IN | 0 ETH | 0.00001101 | ||||
| Update Dynamic M... | 1497962 | 351 days ago | IN | 0 ETH | 0.0000078 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 245146 | 366 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
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 Name:
CollectionMetadataRenderer
Compiler Version
v0.8.25+commit.b61c2a91
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {StringsUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";
import {IERC721MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/interfaces/IERC721MetadataUpgradeable.sol";
import {IMetadataRenderer} from "../interfaces/IMetadataRenderer.sol";
import {DynamicMetadataRenderer} from "../utils/DynamicMetadataRenderer.sol";
import {MetadataRenderAdminCheck} from "./MetadataRenderAdminCheck.sol";
/// @notice Collection metadata system
contract CollectionMetadataRenderer is IMetadataRenderer, MetadataRenderAdminCheck {
error MetadataFrozen();
/// Event to mark updated metadata information
event MetadataUpdated(address indexed target, string metadataBase, string metadataExtension, string contractURI, uint256 freezeAt);
event DynamicMetadataUpdated(address indexed target, string imageURI, string animationURI);
/// @notice Hash to mark updated provenance hash
event ProvenanceHashUpdated(address indexed target, bytes32 provenanceHash);
/// @notice Struct to store metadata info and update data
struct MetadataURIInfo {
string base;
string extension;
string contractURI;
uint256 freezeAt;
}
struct DynamicMetadataInfo {
string description;
string imageURI;
string animationURI;
}
/// @notice NFT metadata by contract
mapping(address => MetadataURIInfo) public metadataBaseByContract;
/// @notice Dynamic NFT metadata by contract
mapping(address => DynamicMetadataInfo) public dynamicMetadataInfoByContract;
/// @notice Optional provenance hashes for NFT metadata by contract
mapping(address => bytes32) public provenanceHashes;
/// @notice Standard init for collection metadata from root collection contract
/// @param metadataBase passed in for initialization
/// @param dynamicTokenData passed in for initialization
function initializeWithData(bytes memory metadataBase, bytes memory dynamicTokenData) external {
if (metadataBase.length > 0) {
(string memory initialBaseURI, string memory initialContractURI) = abi.decode(metadataBase, (string, string));
_updateMetadataDetails(msg.sender, initialBaseURI, "", initialContractURI, 0);
}
if (dynamicTokenData.length > 0) {
(string memory description, string memory imageURI, string memory animationURI) = abi.decode(dynamicTokenData, (string, string, string));
_updateDynamicMetadataInfo(msg.sender, description, imageURI, animationURI);
}
}
/// @notice Update the provenance hash (optional) for a given nft
/// @param target target address to update
/// @param provenanceHash provenance hash to set
function updateProvenanceHash(address target, bytes32 provenanceHash) external requireSenderAdmin(target) {
provenanceHashes[target] = provenanceHash;
emit ProvenanceHashUpdated(target, provenanceHash);
}
/// @notice Update metadata base URI and contract URI
/// @param target target contract to update metadata for
/// @param metadataBaseURI new base URI
/// @param newContractURI new contract URI (can be an empty string)
function updateMetadataBase(address target, string memory metadataBaseURI, string memory newContractURI) external requireSenderAdmin(target) {
_updateMetadataDetails(target, metadataBaseURI, "", newContractURI, 0);
}
/// @notice Update metadata base URI, extension, contract URI and freezing details
/// @param target target contract to update metadata for
/// @param metadataBase new base URI to update metadata with
/// @param metadataExtension new extension to append to base metadata URI
/// @param freezeAt time to freeze the contract metadata at (set to 0 to disable)
/// @param newContractURI new contract URI (can be an empty string)
function updateMetadataBaseWithDetails(
address target,
string memory metadataBase,
string memory metadataExtension,
string memory newContractURI,
uint256 freezeAt
) external requireSenderAdmin(target) {
_updateMetadataDetails(target, metadataBase, metadataExtension, newContractURI, freezeAt);
}
/// @notice Internal metadata update function
/// @param metadataBase Bbase URI to update metadata with
/// @param metadataExtension extension URI to append to base metadata URI
/// @param freezeAt timestamp to freeze metadata (set to 0 to disable freezing)
function _updateMetadataDetails(
address target,
string memory metadataBase,
string memory metadataExtension,
string memory newContractURI,
uint256 freezeAt
) internal {
uint256 contractFreezeTime = metadataBaseByContract[target].freezeAt;
if (contractFreezeTime != 0 && contractFreezeTime <= block.timestamp) {
revert MetadataFrozen();
}
metadataBaseByContract[target] = MetadataURIInfo({base: metadataBase, extension: metadataExtension, contractURI: newContractURI, freezeAt: freezeAt});
emit MetadataUpdated({
target: target,
metadataBase: metadataBase,
metadataExtension: metadataExtension,
contractURI: newContractURI,
freezeAt: freezeAt
});
}
function updateDynamicMetadataInfo(
address target,
string memory description,
string memory imageURI,
string memory animationURI
) external requireSenderAdmin(target) {
_updateDynamicMetadataInfo(target, description, imageURI, animationURI);
}
function _updateDynamicMetadataInfo(
address target,
string memory description,
string memory imageURI,
string memory animationURI
) internal {
dynamicMetadataInfoByContract[target] = DynamicMetadataInfo({
description: description,
imageURI: imageURI,
animationURI: animationURI
});
emit DynamicMetadataUpdated({target: target, imageURI: imageURI, animationURI: animationURI});
}
/// @notice A contract URI for the given collection contract
/// @dev reverts if a contract uri is not provided
/// @return contract uri for the contract metadata
function contractURI() external view override returns (string memory) {
string memory uri = metadataBaseByContract[msg.sender].contractURI;
if (bytes(uri).length == 0) revert();
return uri;
}
/// @notice A token URI for the given collection contract
/// @dev reverts if a contract uri is not set
/// @return token URI for the given token ID and contract (set by msg.sender)
function tokenURI(uint256 tokenId, bool revealed) external view override returns (string memory) {
if (!revealed) {
return dynamicTokenURI(tokenId);
}
MetadataURIInfo memory info = metadataBaseByContract[msg.sender];
if (bytes(info.base).length == 0) revert();
return string(abi.encodePacked(info.base, StringsUpgradeable.toString(tokenId), info.extension));
}
/// @notice A token URI for the given collection contract, handle when image is the same, ex, pre-reveal
/// @dev reverts if a contract uri is not set
/// @return token URI for the given token ID and contract (set by msg.sender)
function dynamicTokenURI(uint256 tokenId) public view returns (string memory) {
DynamicMetadataInfo memory info = dynamicMetadataInfoByContract[msg.sender];
address target = msg.sender;
if (bytes(info.imageURI).length == 0 && bytes(info.animationURI).length == 0) revert();
return
DynamicMetadataRenderer.createMetadata({
name: IERC721MetadataUpgradeable(target).name(),
description: info.description,
imageURI: info.imageURI,
animationURI: info.animationURI,
isEdition: false,
tokenId: tokenId
});
}
}// 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 v4.4.1 (interfaces/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../token/ERC721/extensions/IERC721MetadataUpgradeable.sol";
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IMetadataRenderer {
function tokenURI(uint256, bool) external view returns (string memory);
function contractURI() external view returns (string memory);
function initializeWithData(bytes memory metadataBase, bytes memory dynamicTokenData) external;
function updateMetadataBase(
address collection,
string memory baseURI,
string memory metadataURI
) external;
function updateMetadataBaseWithDetails(
address collection,
string memory baseURI,
string memory extension,
string memory metadataURI,
uint256 freezeAt
) external;
function dynamicTokenURI(uint256) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";
/// NFT metadata library for dynamically render metadata
library DynamicMetadataRenderer {
/// Generate metadata from storage information as base64-json blob
/// Combines the media data and metadata
/// @param name Name of NFT in metadata
/// @param description Description of NFT in metadata
/// @param imageURI URI of image to render for edition
/// @param animationURI URI of animation to render for edition
/// @param isEdition collection type
/// @param tokenId Token ID for specific token
function createMetadata(
string memory name,
string memory description,
string memory imageURI,
string memory animationURI,
bool isEdition,
uint256 tokenId
) internal pure returns (string memory) {
string memory _tokenMediaData = tokenMediaData(imageURI, animationURI);
bytes memory json = createMetadataJSON(name, description, _tokenMediaData, isEdition, tokenId);
return encodeMetadataJSON(json);
}
/// Function to create the metadata json string for the nft edition
/// @param name Name of NFT in metadata
/// @param description Description of NFT in metadata
/// @param mediaData Data for media to include in json object
/// @param isEdition different format for edition metadata
/// @param tokenId Token ID for specific token
function createMetadataJSON(
string memory name,
string memory description,
string memory mediaData,
bool isEdition,
uint256 tokenId
) internal pure returns (bytes memory) {
if (isEdition) {
return
abi.encodePacked(
'{"name": "',
name,
" #",
Strings.toString(tokenId),
'", "',
'description": "',
description,
'", "',
mediaData,
','
'"properties": {"number": ',
Strings.toString(tokenId),
', "name": "',
name,
'"}}'
);
} else {
return abi.encodePacked('{"name": "', name, " #", Strings.toString(tokenId), '", "', 'description": "', description, '", "', mediaData, "}");
}
}
function encodeContractURIJSON(
string memory name,
string memory description,
string memory imageURI,
string memory animationURI,
uint256 royaltyBPS,
address royaltyRecipient
) internal pure returns (string memory) {
bytes memory imageSpace = bytes("");
if (bytes(imageURI).length > 0) {
imageSpace = abi.encodePacked('", "image": "', imageURI);
}
bytes memory animationSpace = bytes("");
if (bytes(animationURI).length > 0) {
animationSpace = abi.encodePacked('", "animation_url": "', animationURI);
}
return
string(
encodeMetadataJSON(
abi.encodePacked(
'{"name": "',
name,
'", "description": "',
description,
// this is for opensea since they don't respect ERC2981 right now
'", "seller_fee_basis_points": ',
Strings.toString(royaltyBPS),
', "fee_recipient": "',
Strings.toHexString(uint256(uint160(royaltyRecipient)), 20),
imageSpace,
animationSpace,
'"}'
)
)
);
}
/// Encodes the argument json bytes into base64-data uri format
/// @param json Raw json to base64 and turn into a data-uri
function encodeMetadataJSON(bytes memory json) internal pure returns (string memory) {
return string(abi.encodePacked("data:application/json;base64,", Base64.encode(json)));
}
/// Generates edition metadata from storage information as base64-json blob
/// Combines the media data and metadata
/// @param imageUrl URL of image to render for edition
/// @param animationUrl URL of animation to render for edition
function tokenMediaData(string memory imageUrl, string memory animationUrl) internal pure returns (string memory) {
bool hasImage = bytes(imageUrl).length > 0;
bool hasAnimation = bytes(animationUrl).length > 0;
if (hasImage && hasAnimation) {
return string(abi.encodePacked('image": "', imageUrl, '", "animation_url": "', animationUrl, '"'));
}
if (hasImage) {
return string(abi.encodePacked('image": "', imageUrl, '"'));
}
if (hasAnimation) {
return string(abi.encodePacked('animation_url": "', animationUrl, '"'));
}
return "";
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {IERC721Collection} from "../interfaces/IERC721Collection.sol";
contract MetadataRenderAdminCheck {
error Access_OnlyAdmin();
/// @notice Modifier to require the sender to be an admin
/// @param target address that the user wants to modify
modifier requireSenderAdmin(address target) {
if (target != msg.sender && !IERC721Collection(target).isAdmin(msg.sender)) {
revert Access_OnlyAdmin();
}
_;
}
}// 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 v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721Upgradeable.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*
* _Available since v4.5._
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
// Loads the table into memory
string memory table = _TABLE;
// Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
// and split into 4 numbers of 6 bits.
// The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
// - `data.length + 2` -> Round up
// - `/ 3` -> Number of 3-bytes chunks
// - `4 *` -> 4 characters for each chunk
string memory result = new string(4 * ((data.length + 2) / 3));
/// @solidity memory-safe-assembly
assembly {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
// Prepare result pointer, jump over length
let resultPtr := add(result, 32)
// Run over the input, 3 bytes at a time
for {
let dataPtr := data
let endPtr := add(data, mload(data))
} lt(dataPtr, endPtr) {
} {
// Advance 3 bytes
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
// To write each character, shift the 3 bytes (18 bits) chunk
// 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
// and apply logical AND with 0x3F which is the number of
// the previous character in the ASCII table prior to the Base64 Table
// The result is then added to the table to get the character to write,
// and finally write it in the result pointer but with a left shift
// of 256 (1 byte) - 8 (1 ASCII char) = 248 bits
mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
}
// When data `bytes` is not exactly 3 bytes long
// it is padded with `=` characters at the end
switch mod(mload(data), 3)
case 1 {
mstore8(sub(resultPtr, 1), 0x3d)
mstore8(sub(resultPtr, 2), 0x3d)
}
case 2 {
mstore8(sub(resultPtr, 1), 0x3d)
}
}
return result;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import {IMetadataRenderer} from "../interfaces/IMetadataRenderer.sol";
/// @notice Interface for Freee Collection contract
interface IERC721Collection {
// Enums
/// @notice Phase type
enum PhaseType {
Public,
Presale,
Airdrop,
AdminMint
}
// Access errors
/// @notice Only admin can access this function
error Access_OnlyAdmin();
/// @notice Missing the given role or admin access
error Access_MissingRoleOrAdmin(bytes32 role);
/// @notice Withdraw is not allowed by this user
error Access_WithdrawNotAllowed();
/// @notice Cannot withdraw funds due to ETH send failure.
error Withdraw_FundsSendFailure();
/// @notice Call to external metadata renderer failed.
error ExternalMetadataRenderer_CallFailed();
// Sale/Purchase errors
/// @notice Sale is inactive
error Sale_Inactive();
/// @notice Presale is inactive
error Presale_Inactive();
/// @notice Presale invalid, out of range
error Presale_Invalid();
/// @notice Exceed presale stage supply
error Presale_ExceedStageSupply();
/// @notice Presale merkle root is invalid
error Presale_MerkleNotApproved();
/// @notice Wrong price for purchase
error Purchase_WrongPrice(uint256 correctPrice);
/// @notice NFT sold out
error Mint_SoldOut();
/// @notice Too many purchase for address
error Purchase_TooManyForAddress();
/// @notice Too many presale for address
error Presale_TooManyForAddress();
/// @notice Collection already revealed
error Collection_Aready_Revealed();
/// @notice Trading locked before mint out
error Collection_TradingLocked();
// Admin errors
/// @notice Presale stage out of supported range
error Setup_Presale_StageOutOfRange();
/// @notice Royalty percentage too high
error Setup_RoyaltyPercentageTooHigh(uint16 maxRoyaltyBPS);
/// @notice Unable to finalize an edition not marked as open (size set to uint64_max_value)
error Admin_UnableToFinalizeNotOpenEdition();
/// @notice Invalid admin upgrade address
error Admin_InvalidUpgradeAddress(address proposedAddress);
/// @notice invalid collection size when update
error Admin_InvalidCollectionSize();
/// @notice Event emitted for mint fee payout
/// @param mintFeeAmount amount of the mint fee
/// @param mintFeeRecipient recipient of the mint fee
/// @param success if the payout succeeded
event MintFeePayout(uint256 mintFeeAmount, address mintFeeRecipient, bool success);
/// @notice Event emitted for each sale
/// @param phase phase of the sale
/// @param to address sale was made to
/// @param quantity quantity of the minted nfts
/// @param pricePerToken price for each token
/// @param firstPurchasedTokenId first purchased token ID (to get range add to quantity for max)
/// @param presaleStage stageIndex of presale stage if applicable, else return 0
event Sale(PhaseType phase, address indexed to, uint256 indexed quantity, uint256 indexed pricePerToken, uint256 firstPurchasedTokenId, uint256 presaleStage);
/// @notice Event emitted for each sale
/// @param sender address sale was made to
/// @param tokenContract address of the token contract
/// @param tokenId first purchased token ID (to get range add to quantity for max)
/// @param quantity quantity of the minted nfts
/// @param comment caller provided comment
event MintComment(address indexed sender, address indexed tokenContract, uint256 indexed tokenId, uint256 quantity, string comment);
/// @notice Contract has been configured and published
/// @param changedBy Changed by user
event ContractStatusChanged(address indexed changedBy);
/// @notice Sales configuration has been changed
/// @dev To access new sales configuration, use getter function.
/// @param changedBy Changed by user
event PublicSaleConfigChanged(address indexed changedBy);
/// @notice Presale config changed
/// @param changedBy changed by user
event PresaleConfigChanged(address indexed changedBy);
/// @notice Collection size reduced
/// @param changedBy changed by user
/// @param newSize new collection size
event CollectionSizeReduced(address indexed changedBy, uint64 newSize);
/// @notice event emit when user change the lock trading func
/// @param changedBy changed by user
/// @param status new status
event LockTradingStatusChanged(address indexed changedBy, bool status);
/// @notice Event emitted when the royalty percentage changed
/// @param changedBy address that change the royalty
/// @param newPercentage new royalty percentage
event RoyaltyChanged(address indexed changedBy, uint256 newPercentage);
/// @notice Event emitted when the funds recipient is changed
/// @param newAddress new address for the funds recipient
/// @param changedBy address that the recipient is changed by
event FundsRecipientChanged(address indexed newAddress, address indexed changedBy);
/// @notice Event emitted when the funds are withdrawn from the minting contract
/// @param withdrawnBy address that issued the withdraw
/// @param withdrawnTo address that the funds were withdrawn to
/// @param amount amount that was withdrawn
/// @param feeRecipient user getting withdraw fee (if any)
/// @param feeAmount amount of the fee getting sent (if any)
event FundsWithdrawn(address indexed withdrawnBy, address indexed withdrawnTo, uint256 amount, address feeRecipient, uint256 feeAmount);
/// @notice Collection dynamic metadata changed
/// @param changedBy address that changed the info
event DynamicMetadataChanged(address changedBy);
/// @notice Collection has been revealed
/// @param revealedBy Revealed by user
event CollectionRevealed(address indexed revealedBy);
/// @notice Event emitted when an open mint is finalized and further minting is closed forever on the contract.
/// @param sender address sending close mint
/// @param numberOfMints number of mints the contract is finalized at
event OpenMintFinalized(address indexed sender, uint256 numberOfMints);
/// @notice Event emitted when metadata renderer is updated.
/// @param sender address of the updater
/// @param renderer new metadata renderer address
event UpdatedMetadataRenderer(address sender, IMetadataRenderer renderer);
/// @notice General configuration for NFT Minting and bookkeeping
struct Configuration {
/// @dev Metadata renderer (uint160)
IMetadataRenderer metadataRenderer;
/// @dev Max supply of collection (uint160+64 = 224)
uint64 collectionSize;
/// @dev Royalty amount in bps (uint224+16 = 240)
uint16 royaltyBPS;
/// @dev Funds recipient for sale (new slot, uint160)
address payable fundsRecipient;
/// @dev collection reveal status
bool revealed;
/// @dev lock trading before mint out
bool lockBeforeMintOut;
}
/// @notice Public sale configuration
/// @dev Uses 1 storage slot
struct PublicSaleConfiguration {
/// @dev Public sale price (max ether value > 1000 ether with this value)
uint104 publicSalePrice;
/// @dev Purchase mint limit per address (if set to 0 === unlimited mints)
uint32 maxSalePurchasePerAddress;
/// @dev uint64 type allows for dates into 292 billion years
uint64 publicSaleStart;
uint64 publicSaleEnd;
/// @dev Whether public sale is disabled
bool publicSaleDisabled;
}
/// @notice Presale stage configuration
struct PresaleConfiguration {
/// @notice Presale stage human readable name
string presaleName;
/// @notice Presale start timestamp
uint64 presaleStart;
/// @notice Presale end timestamp
uint64 presaleEnd;
/// @notice Presale price in ether
uint104 presalePrice;
/// @notice Purchase mint limit per address (if set to 0 === unlimited mints)
uint32 presaleMaxPurchasePerAddress;
/// @notice supply allocated for presale stage
uint32 presaleSupply;
/// @notice amount minted for presale stage
uint32 presaleMinted;
/// @notice Presale merkle root
bytes32 presaleMerkleRoot;
}
/// @notice Return type of specific mint counts and details per address
struct AddressMintDetails {
/// Number of presale mints for each stage from the given address
uint256[] presaleMintsByStage;
/// Number of presale mints from the given address
uint256 presaleMints;
/// Number of public mints from the given address
uint256 publicMints;
/// Number of total mints from the given address
uint256 totalMints;
}
/// @notice External purchase function (payable in eth)
/// @param quantity to purchase
/// @return first minted token ID
function purchase(uint256 quantity) external payable returns (uint256);
/// @notice External purchase presale function (takes a merkle proof and matches to root) (payable in eth)
/// @param stageIndex targetted presale stage
/// @param quantity to purchase
/// @param maxQuantity can purchase (verified by merkle root)
/// @param pricePerToken price per token allowed (verified by merkle root)
/// @param merkleProof input for merkle proof leaf verified by merkle root
/// @return first minted token ID
function purchasePresale(uint256 stageIndex, uint256 quantity, uint256 maxQuantity, uint256 pricePerToken, bytes32[] memory merkleProof) external payable returns (uint256);
/// @notice Function to return the specific sales details for a given address
/// @param minter address for minter to return mint information for
function mintedPerAddress(address minter) external view returns (AddressMintDetails memory);
/// @notice This is the opensea/public owner setting that can be set by the contract admin
function owner() external view returns (address);
/// @notice Admin function to update the public sale configuration settings
/// @param newConfig updated public stage config
function setPublicSaleConfiguration(PublicSaleConfiguration memory newConfig) external;
/// @notice Admin function to update the presale configuration settings
/// @param newConfig new presale configuration
function setPresaleConfiguration(PresaleConfiguration[] memory newConfig) external;
/// @notice Admin function to reduce collection size (cut suppy)
/// @param _newCollectionSize new collection size
function reduceSupply(uint64 _newCollectionSize) external;
/// @dev Reveal collection artworks
/// @param collectionURI collection artwork URI
/// @param extension collection artwork URI extension
function revealCollection(string memory collectionURI, string memory extension) external;
/// @notice Update the metadata renderer
/// @param newRenderer new address for renderer
/// @param metadataBase data to call to bootstrap data for the new renderer (optional)
/// @param dynamicMetadataInfo data to call to bootstrap dynamic metadata for the new renderer (optional)
function setMetadataRenderer(IMetadataRenderer newRenderer, bytes memory metadataBase, bytes memory dynamicMetadataInfo) external;
/// @notice This is an admin mint function to mint a quantity to a specific address
/// @param to address to mint to
/// @param quantity quantity to mint
/// @return the id of the first minted NFT
function adminMint(address to, uint256 quantity) external returns (uint256);
/// @notice This is an admin mint function to mint a single nft each to a list of addresses
/// @param to list of addresses to mint an NFT each to
/// @return the id of the first minted NFT
function adminMintAirdrop(address[] memory to) external returns (uint256);
/// @dev Getter for admin role associated with the contract to handle metadata
/// @return boolean if address is admin
function isAdmin(address user) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}// SPDX-License-Identifier: MIT
// 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);
}{
"viaIR": true,
"codegen": "yul",
"remappings": [
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"erc721a-upgradeable/=lib/ERC721A-Upgradeable/contracts/",
"forge-std/=lib/forge-std/src/",
"ERC721A-Upgradeable/=lib/ERC721A-Upgradeable/contracts/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/openzeppelin-contracts/contracts/"
],
"evmVersion": "cancun",
"outputSelection": {
"*": {
"*": [
"abi",
"metadata"
],
"": [
"ast"
]
}
},
"optimizer": {
"enabled": true,
"mode": "3",
"fallback_to_optimizing_for_size": false,
"disable_system_request_memoization": true
},
"metadata": {},
"libraries": {},
"detectMissingLibraries": false,
"enableEraVMExtensions": false,
"forceEVMLA": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"Access_OnlyAdmin","type":"error"},{"inputs":[],"name":"MetadataFrozen","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"string","name":"imageURI","type":"string"},{"indexed":false,"internalType":"string","name":"animationURI","type":"string"}],"name":"DynamicMetadataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"string","name":"metadataBase","type":"string"},{"indexed":false,"internalType":"string","name":"metadataExtension","type":"string"},{"indexed":false,"internalType":"string","name":"contractURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"freezeAt","type":"uint256"}],"name":"MetadataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes32","name":"provenanceHash","type":"bytes32"}],"name":"ProvenanceHashUpdated","type":"event"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dynamicMetadataInfoByContract","outputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"string","name":"animationURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"dynamicTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadataBase","type":"bytes"},{"internalType":"bytes","name":"dynamicTokenData","type":"bytes"}],"name":"initializeWithData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"metadataBaseByContract","outputs":[{"internalType":"string","name":"base","type":"string"},{"internalType":"string","name":"extension","type":"string"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"uint256","name":"freezeAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"provenanceHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"revealed","type":"bool"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"string","name":"animationURI","type":"string"}],"name":"updateDynamicMetadataInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"metadataBaseURI","type":"string"},{"internalType":"string","name":"newContractURI","type":"string"}],"name":"updateMetadataBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"metadataBase","type":"string"},{"internalType":"string","name":"metadataExtension","type":"string"},{"internalType":"string","name":"newContractURI","type":"string"},{"internalType":"uint256","name":"freezeAt","type":"uint256"}],"name":"updateMetadataBaseWithDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32","name":"provenanceHash","type":"bytes32"}],"name":"updateProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
9c4d535b00000000000000000000000000000000000000000000000000000000000000000100062d051f8ee51b55a6d72aed18f7c54f62ee1a4f834a6fb926e3f3db6d8100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x000400000000000200100000000000020000006004100270000005e60340019700030000003103550002000000010355000005e60040019d0000008004000039000000400040043f0000000100200190000000510000c13d000000040030008c00000fe70000413d000000000201043b000000e002200270000005e80020009c000000590000a13d000005e90020009c000000820000213d000005ed0020009c000003c60000613d000005ee0020009c000002380000613d000005ef0020009c00000fe70000c13d000000240030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000401100370000000000101043b000005f90010009c00000fe70000213d000000000010043f0000000101000039000000200010043f0000004001000039179217770000040f001000000001001d1792101b0000040f000d00000001001d000000100100002900000001011000391792101b0000040f000f00000001001d000000100100002900000002011000391792101b0000040f0000006002000039000000400300043d001000000003001d0000000002230436000c00000002001d000e00000001001d00000060023000390000000d0100002917920fe90000040f0000000002010019000000100120006a0000000c0300002900000000001304350000000f0100002917920fe90000040f000000000201001900000010030000290000004001300039000000000332004900000000003104350000000e0100002917920fe90000040f00000010020000290000000001210049000005e60020009c000005e6020080410000004002200210000005e60010009c000005e6010080410000006001100210000000000121019f000017930001042e0000000001000416000000000001004b00000fe70000c13d000000200100003900000100001004430000012000000443000005e701000041000017930001042e000005f00020009c000000940000a13d000005f10020009c0000028d0000613d000005f20020009c000001780000613d000005f30020009c00000fe70000c13d000000240030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000401100370000000000101043b000005f90010009c00000fe70000213d000000000010043f000000200000043f0000004001000039179217770000040f001000000001001d1792101b0000040f000f00000001001d000000100100002900000001011000391792101b0000040f000e00000001001d000000100100002900000002011000391792101b0000040f00000010020000290000000302200039000000000502041a0000000004010019000000400100043d001000000001001d0000000f020000290000000e03000029179210680000040f000000ae0000013d000005ea0020009c000004d70000613d000005eb0020009c0000026c0000613d000005ec0020009c00000fe70000c13d000000240030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000401100370000000000101043b179211070000040f0000002002000039000000400300043d001000000003001d000000ac0000013d000005f40020009c000000b80000613d000005f50020009c00000fe70000c13d000000440030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000002402100370000000000202043b000000000002004b0000000003000039000000010300c039000000000032004b00000fe70000c13d0000000401100370000000000101043b000000000002004b000004e90000c13d179211070000040f000000400300043d001000000003001d0000002002000039000000000223043617920fe90000040f00000010020000290000000001210049000005e60010009c000005e6010080410000006001100210000005e60020009c000005e6020080410000004002200210000000000121019f000017930001042e000000840030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000402100370000000000202043b001000000002001d000005f90020009c00000fe70000213d0000002402100370000000000502043b000005f80050009c00000fe70000213d0000002302500039000000000032004b00000fe70000813d0000000406500039000000000261034f000000000402043b000006150040009c00000a490000813d0000001f0740003900000616077001970000003f077000390000061607700197000006010070009c00000a490000213d0000008007700039000000400070043f000000800040043f00000000054500190000002405500039000000000035004b00000fe70000213d0000002005600039000000000651034f00000616074001980000001f0840018f000000a005700039000000e70000613d000000a009000039000000000a06034f00000000ab0a043c0000000009b90436000000000059004b000000e30000c13d000000000008004b000000f40000613d000000000676034f0000000307800210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000a00440003900000000000404350000004404100370000000000604043b000005f80060009c00000fe70000213d0000002304600039000000000034004b00000fe70000813d0000000407600039000000000471034f000000000404043b000005f80040009c00000a490000213d0000001f0540003900000616055001970000003f055000390000061605500197000000400800043d0000000005580019000f00000008001d000000000085004b00000000080000390000000108004039000005f80050009c00000a490000213d000000010080019000000a490000c13d000000400050043f0000000f05000029000000000545043600000000064600190000002406600039000000000036004b00000fe70000213d0000002006700039000000000761034f00000616084001980000001f0940018f0000000006850019000001230000613d000000000a07034f000000000b05001900000000ac0a043c000000000bcb043600000000006b004b0000011f0000c13d000000000009004b000001300000613d000000000787034f0000000308900210000000000906043300000000098901cf000000000989022f000000000707043b0000010008800089000000000787022f00000000078701cf000000000797019f0000000000760435000000000445001900000000000404350000006404100370000000000604043b000005f80060009c00000fe70000213d0000002304600039000000000034004b00000fe70000813d0000000407600039000000000471034f000000000404043b000005f80040009c00000a490000213d0000001f0540003900000616055001970000003f055000390000061605500197000000400800043d0000000005580019000e00000008001d000000000085004b00000000080000390000000108004039000005f80050009c00000a490000213d000000010080019000000a490000c13d000000400050043f0000000e05000029000000000545043600000000064600190000002406600039000000000036004b00000fe70000213d0000002003700039000000000331034f00000616024001980000001f0640018f00000000012500190000015f0000613d000000000703034f0000000008050019000000007907043c0000000008980436000000000018004b0000015b0000c13d000000000006004b0000016c0000613d000000000223034f0000000303600210000000000601043300000000063601cf000000000636022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000262019f0000000000210435000000000145001900000000000104350000000001000411000000100010006b000007690000c13d000000800200003900000010010000290000000f030000290000000e04000029179215760000040f0000000001000019000017930001042e000000440030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000006010060009c00000a490000213d0000008006600039000000400060043f000000800020043f00000000042400190000002404400039000000000034004b00000fe70000213d0000002004500039000000000541034f00000616062001980000001f0720018f000000a004600039000001a20000613d000000a008000039000000000905034f000000009a09043c0000000008a80436000000000048004b0000019e0000c13d000000000007004b000001af0000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000000a00220003900000000000204350000002402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000000400700043d0000000006670019001000000007001d000000000076004b00000000070000390000000107004039000005f80060009c00000a490000213d000000010070019000000a490000c13d000000400060043f00000010060000290000000006260436000f00000006001d00000000042400190000002404400039000000000034004b00000fe70000213d0000002003500039000000000331034f00000616042001980000001f0520018f0000000f01400029000001df0000613d000000000603034f0000000f07000029000000006806043c0000000007870436000000000017004b000001db0000c13d000000000005004b000001ec0000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000f012000290000000000010435000000800100043d000000000001004b0000064a0000c13d00000010010000290000000001010433000000000001004b0000026a0000613d000006080010009c00000fe70000213d000000600010008c00000fe70000413d0000000f020000290000000002020433000005f80020009c00000fe70000213d0000000f0110002900000010062000290000003f02600039000000000012004b0000000003000019000006090300804100000609022001970000060904100197000000000542013f000000000042004b00000000020000190000060902004041000006090050009c000000000203c019000000000002004b00000fe70000c13d00000020026000390000000003020433000005f80030009c00000a490000213d0000001f0230003900000616022001970000003f022000390000061605200197000000400200043d0000000005520019000000000025004b00000000070000390000000107004039000005f80050009c00000a490000213d000000010070019000000a490000c13d000000400050043f000000000532043600000040066000390000000007630019000000000017004b00000fe70000213d00000616083001970000001f0730018f000000000056004b000009160000813d000000000008004b000002340000613d000000000a7600190000000009750019000000200990008a000000200aa0008a000000000b890019000000000c8a0019000000000c0c04330000000000cb0435000000200880008c0000022e0000c13d000000000007004b0000092c0000613d0000000009050019000009220000013d000000440030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000402100370000000000202043b001000000002001d000005f90020009c00000fe70000213d0000002401100370000000000101043b000f00000001001d00000000010004110000001002000029000000000012004b0000054a0000c13d000000000020043f0000000201000039000000200010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b0000000f02000029000000000021041b000000400100043d0000000000210435000005e60010009c000005e60100804100000040011002100000000002000414000005e60020009c000005e602008041000000c002200210000000000112019f000005f7011001c70000800d02000039000000020300003900000600040000410000001005000029179217880000040f000000010020019000000fe70000613d0000000001000019000017930001042e0000000001000416000000000001004b00000fe70000c13d0000000001000411000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b0000000201100039000000000201041a000000010320019000000001052002700000007f0550618f0000001f0050008c00000000040000390000000104002039000000000442013f00000001004001900000052a0000613d0000061401000041000000000010043f0000002201000039000000040010043f00000602010000410000179400010430000000a40030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000402100370000000000202043b001000000002001d000005f90020009c00000fe70000213d0000002402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000006010060009c00000a490000213d0000008006600039000000400060043f000000800020043f00000000042400190000002404400039000000000034004b00000fe70000213d0000002004500039000000000541034f00000616062001980000001f0720018f000000a004600039000002bc0000613d000000a008000039000000000905034f000000009a09043c0000000008a80436000000000048004b000002b80000c13d000000000007004b000002c90000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000000a00220003900000000000204350000004402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000000400700043d0000000006670019000f00000007001d000000000076004b00000000070000390000000107004039000005f80060009c00000a490000213d000000010070019000000a490000c13d000000400060043f0000000f060000290000000006260436000e00000006001d00000000042400190000002404400039000000000034004b00000fe70000213d0000002004500039000000000541034f00000616062001980000001f0720018f0000000e04600029000002f90000613d000000000805034f0000000e09000029000000008a08043c0000000009a90436000000000049004b000002f50000c13d000000000007004b000003060000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000e0220002900000000000204350000006402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000000400700043d0000000006670019000c00000007001d000000000076004b00000000070000390000000107004039000005f80060009c00000a490000213d000000010070019000000a490000c13d000000400060043f0000000c060000290000000006260436000b00000006001d00000000042400190000002404400039000000000034004b00000fe70000213d0000002003500039000000000431034f00000616052001980000001f0620018f0000000b03500029000003360000613d000000000704034f0000000b08000029000000007907043c0000000008980436000000000038004b000003320000c13d000000000006004b000003430000613d000000000454034f0000000305600210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004304350000000b0220002900000000000204350000008401100370000000000101043b000a00000001001d0000000001000411000000100010006b000007780000c13d0000001001000029000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b0000000301100039000000000101041a000d00000001001d000000000001004b000008e80000c13d000000400100043d000d00000001001d000006010010009c00000a490000213d0000000d030000290000008001300039000000400010043f00000060023000390000000a01000029000700000002001d000000000012043500000040023000390000000c01000029000800000002001d0000000000120435000000800100003900000000021304360000000f01000029000900000002001d00000000001204350000001001000029000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b000600000001001d0000000d010000290000000001010433000500000001001d0000000021010434000400000002001d000d00000001001d000005f80010009c00000a490000213d0000000601000029000000000101041a000000010010019000000001021002700000007f0220618f000300000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000301000029000000200010008c000003b20000413d0000000601000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000d030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000003010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000003b20000813d000000000002041b0000000102200039000000000012004b000003ae0000413d0000000d010000290000001f0010008c00000a9d0000a13d0000000601000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000d02200180000000000101043b00000b660000c13d000000200300003900000b730000013d000000640030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000402100370000000000202043b001000000002001d000005f90020009c00000fe70000213d0000002402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000006010060009c00000a490000213d0000008006600039000000400060043f000000800020043f00000000042400190000002404400039000000000034004b00000fe70000213d0000002004500039000000000541034f00000616062001980000001f0720018f000000a004600039000003f50000613d000000a008000039000000000905034f000000009a09043c0000000008a80436000000000048004b000003f10000c13d000000000007004b000004020000613d000000000565034f0000000306700210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000000a00220003900000000000204350000004402100370000000000402043b000005f80040009c00000fe70000213d0000002302400039000000000032004b00000fe70000813d0000000405400039000000000251034f000000000202043b000005f80020009c00000a490000213d0000001f0620003900000616066001970000003f066000390000061606600197000000400700043d0000000006670019000f00000007001d000000000076004b00000000070000390000000107004039000005f80060009c00000a490000213d000000010070019000000a490000c13d000000400060043f0000000f060000290000000006260436000e00000006001d00000000042400190000002404400039000000000034004b00000fe70000213d0000002003500039000000000331034f00000616042001980000001f0520018f0000000e01400029000004320000613d000000000603034f0000000e07000029000000006806043c0000000007870436000000000017004b0000042e0000c13d000000000005004b0000043f0000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000000e012000290000000000010435000000400100043d000d00000001001d0000000001000411000000100010006b0000068e0000c13d0000000d01000029000006030010009c00000a490000213d0000000d010000290000002002100039000c00000002001d000000400020043f00000000000104350000001001000029000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b0000000301100039000000000101041a000b00000001001d000000000001004b0000046e0000613d000006040100004100000000001004430000000001000414000005e60010009c000005e601008041000000c00110021000000605011001c70000800b020000391792178d0000040f000000010020019000000a230000613d000000000101043b0000000b0010006b000008f60000a13d000000400100043d000b00000001001d000006010010009c00000a490000213d0000000b030000290000008001300039000000400010043f00000040023000390000000f01000029000900000002001d000000000012043500000020023000390000000d01000029000a00000002001d0000000000120435000000800100003900000000001304350000006001300039000800000001001d00000000000104350000001001000029000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b000700000001001d0000000b010000290000000001010433000500000001001d0000000021010434000600000002001d000b00000001001d000005f80010009c00000a490000213d0000000701000029000000000101041a000000010010019000000001021002700000007f0220618f000400000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000401000029000000200010008c000004c30000413d0000000701000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000b030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000004c30000813d000000000002041b0000000102200039000000000012004b000004bf0000413d0000000b010000290000001f0010008c0000096c0000a13d0000000701000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000b02200180000000000101043b00000a240000c13d000000200300003900000a310000013d000000240030008c00000fe70000413d0000000002000416000000000002004b00000fe70000c13d0000000401100370000000000101043b000005f90010009c00000fe70000213d000000000010043f0000000201000039000000200010043f0000004001000039179217770000040f000000000101041a000000800010043f000005fa01000041000017930001042e001000000001001d0000000001000411000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b000e00000001001d000000400100043d000f00000001001d000006010010009c00000a490000213d0000000f010000290000008006100039000000400060043f0000000e01000029000000000101041a000000010210019000000001041002700000007f0440618f0000001f0040008c00000000030000390000000103002039000000000032004b000002870000c13d0000000000460435000000000002004b000005c80000613d000c00000004001d000d00000006001d0000000e01000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000c07000029000000000007004b00000000020000190000000d06000029000005cf0000613d0000000f02000029000000a003200039000000000101043b00000000020000190000000004230019000000000501041a000000000054043500000001011000390000002002200039000000000072004b000005220000413d000005cf0000013d000000400400043d001000000004001d0000000004540436000000000003004b000005550000613d000e00000004001d000f00000005001d000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000f05000029000000000005004b00000000020000190000000e060000290000055a0000613d000000000101043b00000000020000190000000003260019000000000401041a000000000043043500000001011000390000002002200039000000000052004b000005420000413d0000055a0000013d000005fb03000041000000800030043f000000840010043f0000000001000414000000040020008c000005710000c13d0000000103000031000000200030008c00000020040000390000000004034019000005960000013d00000617012001970000000000140435000000000005004b000000200200003900000000020060390000003f0120003900000616011001970000001003100029000000000013004b00000000010000390000000101004039000005f80030009c00000a490000213d000000010010019000000a490000c13d0000000002030019000000400030043f00000010010000290000000001010433000000000001004b00000fe70000613d0000002001000039000f00000002001d0000000002120436000000100100002917920fe90000040f0000000f02000029000000af0000013d000005e60010009c000005e601008041000000c001100210000005fc011001c71792178d0000040f000000800a0000390000006003100270000005e603300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000005850000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000005810000c13d000000000006004b000005920000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000005aa0000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200030008c00000fe70000413d000000800200043d000000000002004b0000000003000039000000010300c039000000000032004b00000fe70000c13d000000000002004b0000001002000029000002490000c13d000005fe0200004100000000002104350000004001100210000005ff011001c700001794000104300000001f0530018f000005fd06300198000000400200043d0000000004620019000005b50000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005b10000c13d000000000005004b000005c20000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005e60020009c000005e6020080410000004002200210000000000112019f000017940001043000000617011001970000000f02000029000000a0022000390000000000120435000000000004004b000000200200003900000000020060390000003f0120003900000616021001970000000001620019000000000021004b00000000020000390000000102004039000005f80010009c00000a490000213d000000010020019000000a490000c13d000000400010043f0000000f0100002900000000056104360000000e010000290000000101100039000000000201041a000000010320019000000001062002700000007f0660618f0000001f0060008c00000000040000390000000104002039000000000442013f0000000100400190000002870000c13d000a00000005001d000000400400043d000d00000004001d000c00000006001d0000000004640436000b00000004001d000000000003004b000006090000613d000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000c05000029000000000005004b00000000020000190000000b060000290000060f0000613d000000000101043b00000000020000190000000003260019000000000401041a000000000043043500000001011000390000002002200039000000000052004b000006010000413d0000060f0000013d00000617012001970000000b0200002900000000001204350000000c0000006b000000200200003900000000020060390000003f0120003900000616021001970000000d01200029000000000021004b00000000020000390000000102004039000005f80010009c00000a490000213d000000010020019000000a490000c13d000000400010043f0000000a010000290000000d0200002900000000002104350000000e010000290000000201100039000000000201041a000000010320019000000001042002700000007f0440618f000d00000004001d0000001f0040008c00000000040000390000000104002039000000000442013f0000000100400190000002870000c13d000000400400043d000c00000004001d0000000d050000290000000004540436000b00000004001d000000000003004b0000069c0000613d000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000d05000029000000000005004b00000000020000190000000b06000029000006a20000613d000000000101043b00000000020000190000000003260019000000000401041a000000000043043500000001011000390000002002200039000000000052004b000006420000413d000006a20000013d000006080010009c00000fe70000213d000000400010008c00000fe70000413d000000a00400043d000005f80040009c00000fe70000213d000000a001100039000000bf03400039000000000013004b0000000005000019000006090500804100000609021001970000060903300197000000000623013f000000000023004b00000000030000190000060903004041000006090060009c000000000305c019000000000003004b00000fe70000c13d000000a0034000390000000003030433000005f80030009c00000a490000213d0000001f0530003900000616055001970000003f055000390000061605500197000000400600043d0000000005560019000d00000006001d000000000065004b00000000060000390000000106004039000005f80050009c00000a490000213d000000010060019000000a490000c13d000000400050043f0000000d050000290000000005350436000c00000005001d000000c0044000390000000005430019000000000015004b00000fe70000213d00000616063001970000001f0530018f0000000c0040006c0000080e0000813d000000000006004b0000068a0000613d00000000085400190000000c07500029000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c000006840000c13d000000000005004b000008240000613d0000000c070000290000081a0000013d000005fb020000410000000d0300002900000000002304350000000402300039000000000012043500000000010004140000001002000029000000040020008c000006c10000c13d0000000103000031000000200030008c00000020040000390000000004034019000006ec0000013d00000617012001970000000b0200002900000000001204350000000d0000006b000000200200003900000000020060390000003f0120003900000616021001970000000c01200029000000000021004b00000000020000390000000102004039000005f80010009c00000a490000213d000000010020019000000a490000c13d000000400010043f0000000f0300002900000040013000390000000c0200002900000000002104350000000e010000290000000301100039000000000101041a0000006002300039000000000012043500000000010304330000000023010434000000000003004b00000fe70000613d00000010030000290000060b0030009c000007100000413d000000400400003900000010030000290000060b0330012a000007190000013d0000000d02000029000005e60020009c000005e6020080410000004002200210000005e60010009c000005e601008041000000c001100210000000000121019f00000602011001c700000010020000291792178d0000040f0000006003100270000005e603300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d05700029000006db0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b000006d70000c13d000000000006004b000006e80000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000007040000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000005f80010009c00000a490000213d000000010020019000000a490000c13d000000400010043f000000200030008c00000fe70000413d0000000d020000290000000002020433000000000002004b0000000003000039000000010300c039000000000032004b00000fe70000c13d000000000002004b000008090000c13d000005fe02000041000008f80000013d0000001f0530018f000005fd06300198000000400200043d0000000004620019000005b50000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000070b0000c13d000005b50000013d00000010030000290000060d0030009c0000060c0330212a000000000400003900000020040020390000060e0030009c00000010044081bf0000060f033081970000060e0330812a000006100030009c0000000804408039000005f803308197000006100330812a000027100030008c0000000404408039000005e603308197000027100330811a000000640030008c00000002044080390000ffff0330818f000000640330811a000000090030008c000000010440203900000616064001970000005f036000390000061607300197000000400500043d0000000003570019000000000073004b00000000070000390000000107004039000005f80030009c00000a490000213d000000010070019000000a490000c13d000000400030043f00000001034000390000000003350436000000200660003900000616076001980000001f0660018f000007420000613d0000000007730019000000000800003100000002088003670000000009030019000000008a08043c0000000009a90436000000000079004b0000073e0000c13d000000000006004b000000000445001900000021044000390000001008000029000000090080008c0000000a6880011a0000000306600210000000010440008a00000000070404330000061107700197000006120660021f0000061306600197000000000676019f0000000000640435000007460000213d0000000a040000290000000004040433000000000601043300000616096001970000001f0760018f000000400100043d0000002008100039000000000082004b000007870000813d000000000009004b000007660000613d000000000b720019000000000a780019000000200aa0008a000000200bb0008a000000000c9a0019000000000d9b0019000000000d0d04330000000000dc0435000000200990008c000007600000c13d000000000007004b000007930000c13d0000079d0000013d000000400300043d000005fb020000410000000000230435000d00000003001d0000000402300039000000000012043500000000010004140000001002000029000000040020008c000008640000c13d0000000103000031000000200030008c000000200400003900000000040340190000088f0000013d000000400300043d000005fb020000410000000000230435000d00000003001d0000000402300039000000000012043500000000010004140000001002000029000000040020008c000008a60000c13d0000000103000031000000200030008c00000020040000390000000004034019000008d10000013d000000000a980019000000000009004b0000078f0000613d000000000b02001900000000bc0b04340000000008c804360000000000a8004b0000078b0000c13d000000000007004b0000079d0000613d000000000292001900000000080a00190000000307700210000000000908043300000000097901cf000000000979022f00000000020204330000010007700089000000000272022f00000000027201cf000000000292019f0000000000280435000000000216001900000020062000390000000000060435000000000505043300000616085001970000001f0750018f000000000063004b000007b40000813d000000000008004b000007b10000613d000000000a7300190000000009760019000000200990008a000000200aa0008a000000000b890019000000000c8a0019000000000c0c04330000000000cb0435000000200880008c000007ab0000c13d000000000007004b000007c00000c13d000007ca0000013d0000000009860019000000000008004b000007bc0000613d000000000a03001900000000ab0a04340000000006b60436000000000096004b000007b80000c13d000000000007004b000007ca0000613d000000000383001900000000060900190000000307700210000000000806043300000000087801cf000000000878022f00000000030304330000010007700089000000000373022f00000000037301cf000000000383019f0000000000360435000000000225001900000020052000390000000000050435000000004304043400000616073001970000001f0630018f000000000054004b000007e10000813d000000000007004b000007de0000613d00000000096400190000000008650019000000200880008a000000200990008a000000000a780019000000000b790019000000000b0b04330000000000ba0435000000200770008c000007d80000c13d000000000006004b000007ed0000c13d000007f70000013d0000000008750019000000000007004b000007e90000613d0000000009040019000000009a0904340000000005a50436000000000085004b000007e50000c13d000000000006004b000007f70000613d000000000474001900000000050800190000000306600210000000000705043300000000076701cf000000000767022f00000000040404330000010006600089000000000464022f00000000046401cf000000000474019f0000000000450435000000000223001900000020032000390000000000030435000000000212004900000000002104350000003f0220003900000616022001970000000004120019000000000024004b00000000020000390000000102004039000005f80040009c00000a490000213d000000010020019000000a490000c13d0000000003040019000000400040043f000000aa0000013d000d00000001001d0000000d01000029000006030010009c000004490000a13d00000a490000013d0000000c07600029000000000006004b000008170000613d00000000080400190000000c09000029000000008a0804340000000009a90436000000000079004b000008130000c13d000000000005004b000008240000613d00000000046400190000000305500210000000000607043300000000065601cf000000000656022f00000000040404330000010005500089000000000454022f00000000045401cf000000000464019f00000000004704350000000c033000290000000000030435000000c00300043d000005f80030009c00000fe70000213d000000bf04300039000000000014004b000000000500001900000609050080410000060904400197000000000624013f000000000024004b00000000020000190000060902004041000006090060009c000000000205c019000000000002004b00000fe70000c13d000000a0023000390000000002020433000005f80020009c00000a490000213d0000001f0420003900000616044001970000003f044000390000061604400197000000400500043d0000000004450019000b00000005001d000000000054004b00000000050000390000000105004039000005f80040009c00000a490000213d000000010050019000000a490000c13d000000400040043f0000000b040000290000000004240436000a00000004001d000000c0033000390000000004320019000000000014004b00000fe70000213d00000616042001970000001f0120018f0000000a0030006c000009790000813d000000000004004b000008600000613d00000000061300190000000a05100029000000200550008a000000200660008a0000000007450019000000000846001900000000080804330000000000870435000000200440008c0000085a0000c13d000000000001004b0000098f0000613d0000000a05000029000009850000013d0000000d02000029000005e60020009c000005e6020080410000004002200210000005e60010009c000005e601008041000000c001100210000000000121019f00000602011001c700000010020000291792178d0000040f0000006003100270000005e603300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d057000290000087e0000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b0000087a0000c13d000000000006004b0000088b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000008fe0000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000005f80010009c00000a490000213d000000010020019000000a490000c13d000000400010043f000000200030008c00000fe70000413d0000000d020000290000000002020433000000000002004b0000000003000039000000010300c039000000000032004b00000fe70000c13d000000000002004b000001710000c13d000007020000013d0000000d02000029000005e60020009c000005e6020080410000004002200210000005e60010009c000005e601008041000000c001100210000000000121019f00000602011001c700000010020000291792178d0000040f0000006003100270000005e603300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000d05700029000008c00000613d000000000801034f0000000d09000029000000008a08043c0000000009a90436000000000059004b000008bc0000c13d000000000006004b000008cd0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000090a0000613d0000001f01400039000000600210018f0000000d01200029000000000021004b00000000020000390000000102004039000005f80010009c00000a490000213d000000010020019000000a490000c13d000000400010043f000000200030008c00000fe70000413d0000000d020000290000000002020433000000000002004b0000000003000039000000010300c039000000000032004b00000fe70000c13d000000000002004b0000034b0000c13d000007020000013d000006040100004100000000001004430000000001000414000005e60010009c000005e601008041000000c00110021000000605011001c70000800b020000391792178d0000040f000000010020019000000a230000613d000000000101043b0000000d0010006b0000035d0000213d000000400100043d0000060a020000410000000000210435000005e60010009c000005e6010080410000004001100210000005ff011001c700001794000104300000001f0530018f000005fd06300198000000400200043d0000000004620019000005b50000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009050000c13d000005b50000013d0000001f0530018f000005fd06300198000000400200043d0000000004620019000005b50000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009110000c13d000005b50000013d0000000009850019000000000008004b0000091f0000613d000000000a060019000000000b05001900000000ac0a0434000000000bcb043600000000009b004b0000091b0000c13d000000000007004b0000092c0000613d00000000068600190000000307700210000000000809043300000000087801cf000000000878022f00000000060604330000010007700089000000000676022f00000000067601cf000000000686019f000000000069043500000000033500190000000000030435000000100300002900000040033000390000000003030433000005f80030009c00000fe70000213d00000010073000290000003f03700039000000000013004b000000000500001900000609050080410000060903300197000000000643013f000000000043004b00000000030000190000060903004041000006090060009c000000000305c019000000000003004b00000fe70000c13d00000020037000390000000005030433000005f80050009c00000a490000213d0000001f0350003900000616033001970000003f033000390000061606300197000000400300043d0000000006630019000000000036004b00000000080000390000000108004039000005f80060009c00000a490000213d000000010080019000000a490000c13d000000400060043f000000000653043600000040077000390000000008750019000000000018004b00000fe70000213d00000616095001970000001f0850018f000000000067004b00000aaa0000813d000000000009004b000009680000613d000000000b870019000000000a860019000000200aa0008a000000200bb0008a000000000c9a0019000000000d9b0019000000000d0d04330000000000dc0435000000200990008c000009620000c13d000000000008004b00000ac00000613d000000000a06001900000ab60000013d0000000b0000006b0000000001000019000009710000613d000000060100002900000000010104330000000b040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000a3f0000013d0000000a05400029000000000004004b000009820000613d00000000060300190000000a0700002900000000680604340000000007870436000000000057004b0000097e0000c13d000000000001004b0000098f0000613d00000000034300190000000301100210000000000405043300000000041401cf000000000414022f00000000030304330000010001100089000000000313022f00000000011301cf000000000141019f00000000001504350000000a012000290000000000010435000000400100043d000900000001001d000006030010009c00000a490000213d00000009020000290000002001200039000800000001001d000000400010043f00000000000204350000000001000411000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b0000000301100039000000000101041a000e00000001001d000000000001004b000009ba0000613d000006040100004100000000001004430000000001000414000005e60010009c000005e601008041000000c00110021000000605011001c70000800b020000391792178d0000040f000000010020019000000a230000613d000000000101043b0000000e0010006b000008f60000a13d000000400100043d000e00000001001d000006010010009c00000a490000213d0000000e030000290000008001300039000000400010043f00000040023000390000000b01000029000600000002001d000000000012043500000020023000390000000901000029000700000002001d00000000001204350000000d0100002900000000001304350000006001300039000500000001001d00000000000104350000000001000411000000000010043f000000200000043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000000101043b000400000001001d0000000e010000290000000001010433000e00000001001d0000000021010434000200000002001d000300000001001d000005f80010009c00000a490000213d0000000401000029000000000101041a000000010010019000000001021002700000007f0220618f000100000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000101000029000000200010008c00000a0f0000413d0000000401000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d00000003030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000a0f0000813d000000000002041b0000000102200039000000000012004b00000a0b0000413d00000003010000290000001f0010008c00000d230000a13d0000000401000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000303200180000000000101043b00000d590000c13d000000200200003900000d650000013d000000000001042f000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000050600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000a2a0000c13d0000000b0020006c00000a3c0000813d0000000b020000290000000302200210000000f80220018f000006180220027f000006180220016700000005033000290000000003030433000000000223016f000000000021041b0000000b01000029000000010110021000000001011001bf0000000702000029000000000012041b0000000a010000290000000001010433000a00000001001d0000000021010434000600000002001d000b00000001001d000005f80010009c00000a4f0000a13d0000061401000041000000000010043f0000004101000039000000040010043f0000060201000041000017940001043000000007010000290000000101100039000500000001001d000000000101041a000000010010019000000001021002700000007f0220618f000400000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000401000029000000200010008c00000a7c0000413d0000000501000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000b030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000a7c0000813d000000000002041b0000000102200039000000000012004b00000a780000413d0000000b010000290000001f0010008c00000a900000a13d0000000501000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000b02200180000000000101043b00000b000000c13d000000200300003900000b0d0000013d0000000b0000006b000000000100001900000a950000613d000000060100002900000000010104330000000b040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000b1b0000013d0000000d0000006b000000000100001900000aa20000613d000000040100002900000000010104330000000d040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000b810000013d000000000a960019000000000009004b00000ab30000613d000000000b070019000000000c06001900000000bd0b0434000000000cdc04360000000000ac004b00000aaf0000c13d000000000008004b00000ac00000613d0000000007970019000000030880021000000000090a043300000000098901cf000000000989022f00000000070704330000010008800089000000000787022f00000000078701cf000000000797019f00000000007a043500000000055600190000000000050435000000100500002900000060055000390000000005050433000005f80050009c00000fe70000213d00000010075000290000003f05700039000000000015004b000000000600001900000609060080410000060905500197000000000845013f000000000045004b00000000040000190000060904004041000006090080009c000000000406c019000000000004004b00000fe70000c13d00000020047000390000000005040433000005f80050009c00000a490000213d0000001f0450003900000616044001970000003f044000390000061606400197000000400400043d0000000006640019000000000046004b00000000080000390000000108004039000005f80060009c00000a490000213d000000010080019000000a490000c13d000000400060043f000000000654043600000040077000390000000008750019000000000018004b00000fe70000213d00000616085001970000001f0150018f000000000067004b00000d3d0000813d000000000008004b00000afc0000613d000000000a1700190000000009160019000000200990008a000000200aa0008a000000000b890019000000000c8a0019000000000c0c04330000000000cb0435000000200880008c00000af60000c13d000000000001004b00000d530000613d000000000906001900000d490000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000a0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000b060000c13d0000000b0020006c00000b180000813d0000000b020000290000000302200210000000f80220018f000006180220027f00000618022001670000000a033000290000000003030433000000000223016f000000000021041b0000000b01000029000000010110021000000001011001bf0000000502000029000000000012041b00000009010000290000000001010433000900000001001d0000000021010434000a00000002001d000b00000001001d000005f80010009c00000a490000213d00000007010000290000000201100039000600000001001d000000000101041a000000010010019000000001021002700000007f0220618f000500000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000501000029000000200010008c00000b520000413d0000000601000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000b030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000005010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000b520000813d000000000002041b0000000102200039000000000012004b00000b4e0000413d0000000b010000290000001f0010008c00000bcc0000a13d0000000601000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000b02200180000000000101043b00000be60000c13d000000200300003900000bf30000013d000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000050600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000b6c0000c13d0000000d0020006c00000b7e0000813d0000000d020000290000000302200210000000f80220018f000006180220027f000006180220016700000005033000290000000003030433000000000223016f000000000021041b0000000d01000029000000010110021000000001011001bf0000000602000029000000000012041b00000009010000290000000001010433000500000001001d0000000021010434000900000002001d000d00000001001d000005f80010009c00000a490000213d00000006010000290000000101100039000400000001001d000000000101041a000000010010019000000001021002700000007f0220618f000300000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000301000029000000200010008c00000bb80000413d0000000401000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d0000000d030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000003010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000bb80000813d000000000002041b0000000102200039000000000012004b00000bb40000413d0000000d010000290000001f0010008c00000bd90000a13d0000000401000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000d02200180000000000101043b00000cbd0000c13d000000200300003900000cca0000013d0000000b0000006b000000000100001900000bd10000613d0000000a0100002900000000010104330000000b040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000c010000013d0000000d0000006b000000000100001900000bde0000613d000000090100002900000000010104330000000d040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000cd80000013d000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000090600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000bec0000c13d0000000b0020006c00000bfe0000813d0000000b020000290000000302200210000000f80220018f000006180220027f000006180220016700000009033000290000000003030433000000000223016f000000000021041b0000000b01000029000000010110021000000001011001bf0000000602000029000000000012041b0000000701000029000000030110003900000008020000290000000002020433000000000021041b000000400100043d000000800200003900000000022104360000008004100039000000800300043d000000000034043500000616063001970000001f0530018f000000a004100039000000a10040008c00000c230000413d000000000006004b00000c1e0000613d000000000854001900000080075001bf000000200880008a0000000009680019000000000a670019000000000a0a04330000000000a90435000000200660008c00000c180000c13d000000000005004b00000c390000613d000000a006000039000000000704001900000c2f0000013d0000000007640019000000000006004b00000c2c0000613d000000a0080000390000000009040019000000008a0804340000000009a90436000000000079004b00000c280000c13d000000000005004b00000c390000613d000000a0066000390000000305500210000000000807043300000000085801cf000000000858022f00000000060604330000010005500089000000000656022f00000000055601cf000000000585019f0000000000570435000000000543001900000000000504350000001f0330003900000616033001970000000004430019000000000314004900000000003204350000000d020000290000000003020433000000000234043600000616053001970000001f0430018f0000000c0020006b00000c570000813d000000000005004b00000c530000613d0000000c074000290000000006420019000000200660008a000000200770008a0000000008560019000000000957001900000000090904330000000000980435000000200550008c00000c4d0000c13d000000000004004b00000c6e0000613d000000000602001900000c630000013d0000000006520019000000000005004b00000c600000613d0000000c07000029000000000802001900000000790704340000000008980436000000000068004b00000c5c0000c13d000000000004004b00000c6e0000613d000c000c0050002d0000000304400210000000000506043300000000054501cf000000000545022f0000000c0700002900000000070704330000010004400089000000000747022f00000000044701cf000000000454019f0000000000460435000000000423001900000000000404350000001f03300039000006160330019700000000022300190000000003120049000000400410003900000000003404350000000f030000290000000003030433000000000232043600000616053001970000001f0430018f0000000e0020006b00000c8d0000813d000000000005004b00000c890000613d0000000e074000290000000006420019000000200660008a000000200770008a0000000008560019000000000957001900000000090904330000000000980435000000200550008c00000c830000c13d000000000004004b00000ca40000613d000000000602001900000c990000013d0000000006520019000000000005004b00000c960000613d0000000e07000029000000000802001900000000790704340000000008980436000000000068004b00000c920000c13d000000000004004b00000ca40000613d000e000e0050002d0000000304400210000000000506043300000000054501cf000000000545022f0000000e0700002900000000070704330000010004400089000000000747022f00000000044701cf000000000454019f000000000046043500000000042300190000000000040435000000600410003900000000000404350000001f03300039000006160330019700000000021200490000000002320019000005e60020009c000005e6020080410000006002200210000005e60010009c000005e6010080410000004001100210000000000112019f0000000002000414000005e60020009c000005e602008041000000c002200210000000000112019f00000606011001c70000800d0200003900000002030000390000060704000041000002660000013d000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000050600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000cc30000c13d0000000d0020006c00000cd50000813d0000000d020000290000000302200210000000f80220018f000006180220027f000006180220016700000005033000290000000003030433000000000223016f000000000021041b0000000d01000029000000010110021000000001011001bf0000000402000029000000000012041b00000008010000290000000001010433000d00000001001d0000000021010434000800000002001d000900000001001d000005f80010009c00000a490000213d00000006010000290000000201100039000500000001001d000000000101041a000000010010019000000001021002700000007f0220618f000400000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000401000029000000200010008c00000d0f0000413d0000000501000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d00000009030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000d0f0000813d000000000002041b0000000102200039000000000012004b00000d0b0000413d00000009010000290000001f0010008c00000d300000a13d0000000501000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000902200180000000000101043b00000dbe0000c13d000000200300003900000dca0000013d000000030000006b000000000100001900000d280000613d0000000201000029000000000101043300000003040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000d730000013d000000090000006b000000000100001900000d350000613d0000000801000029000000000101043300000009040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000dd80000013d0000000009860019000000000008004b00000d460000613d000000000a070019000000000b06001900000000ac0a0434000000000bcb043600000000009b004b00000d420000c13d000000000001004b00000d530000613d00000000078700190000000301100210000000000809043300000000081801cf000000000818022f00000000070704330000010001100089000000000717022f00000000011701cf000000000181019f0000000000190435000000000156001900000000000104350000000001000411179215760000040f0000000001000019000017930001042e000000010230008a00000005022002700000000004210019000000200200003900000001044000390000000e052000290000000005050433000000000051041b00000020022000390000000101100039000000000041004b00000d5e0000c13d000000030030006c00000d700000813d00000003030000290000000303300210000000f80330018f000006180330027f00000618033001670000000e022000290000000002020433000000000232016f000000000021041b0000000301000029000000010110021000000001011001bf0000000402000029000000000012041b00000007010000290000000001010433000e00000001001d0000000021010434000300000002001d000700000001001d000005f80010009c00000a490000213d00000004010000290000000101100039000200000001001d000000000101041a000000010010019000000001021002700000007f0220618f000100000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000101000029000000200010008c00000daa0000413d0000000201000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d00000007030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000daa0000813d000000000002041b0000000102200039000000000012004b00000da60000413d00000007010000290000001f0010008c00000e8d0000a13d0000000201000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000703200180000000000101043b00000e9a0000c13d000000200200003900000ea60000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000d053000290000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000dc30000c13d000000090020006c00000dd50000813d00000009020000290000000302200210000000f80220018f000006180220027f00000618022001670000000d033000290000000003030433000000000223016f000000000021041b0000000901000029000000010110021000000001011001bf0000000502000029000000000012041b0000000601000029000000030110003900000007020000290000000002020433000000000021041b000000400100043d000000800200003900000000022104360000008004100039000000800300043d000000000034043500000616063001970000001f0530018f000000a004100039000000a10040008c00000dfa0000413d000000000006004b00000df50000613d000000000854001900000080075001bf000000200880008a0000000009680019000000000a670019000000000a0a04330000000000a90435000000200660008c00000def0000c13d000000000005004b00000e100000613d000000a006000039000000000704001900000e060000013d0000000007640019000000000006004b00000e030000613d000000a0080000390000000009040019000000008a0804340000000009a90436000000000079004b00000dff0000c13d000000000005004b00000e100000613d000000a0066000390000000305500210000000000807043300000000085801cf000000000858022f00000000060604330000010005500089000000000656022f00000000055601cf000000000585019f0000000000570435000000000543001900000000000504350000001f0330003900000616033001970000000004430019000000000314004900000000003204350000000f020000290000000003020433000000000234043600000616053001970000001f0430018f0000000e0020006b00000e2e0000813d000000000005004b00000e2a0000613d0000000e074000290000000006420019000000200660008a000000200770008a0000000008560019000000000957001900000000090904330000000000980435000000200550008c00000e240000c13d000000000004004b00000e450000613d000000000602001900000e3a0000013d0000000006520019000000000005004b00000e370000613d0000000e07000029000000000802001900000000790704340000000008980436000000000068004b00000e330000c13d000000000004004b00000e450000613d000e000e0050002d0000000304400210000000000506043300000000054501cf000000000545022f0000000e0700002900000000070704330000010004400089000000000747022f00000000044701cf000000000454019f0000000000460435000000000423001900000000000404350000001f03300039000006160330019700000000022300190000000003120049000000400410003900000000003404350000000c030000290000000003030433000000000232043600000616053001970000001f0430018f0000000b0020006b00000e640000813d000000000005004b00000e600000613d0000000b074000290000000006420019000000200660008a000000200770008a0000000008560019000000000957001900000000090904330000000000980435000000200550008c00000e5a0000c13d000000000004004b00000e7b0000613d000000000602001900000e700000013d0000000006520019000000000005004b00000e6d0000613d0000000b07000029000000000802001900000000790704340000000008980436000000000068004b00000e690000c13d000000000004004b00000e7b0000613d000b000b0050002d0000000304400210000000000506043300000000054501cf000000000545022f0000000b0700002900000000070704330000010004400089000000000747022f00000000044701cf000000000454019f00000000004604350000000004230019000000000004043500000060041000390000000a0500002900000000005404350000001f03300039000006160330019700000000021200490000000002320019000005e60020009c000005e6020080410000006002200210000005e60010009c000005e6010080410000004001100210000000000112019f000000000200041400000cb40000013d000000070000006b000000000100001900000e920000613d0000000301000029000000000101043300000007040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000eb40000013d000000010230008a00000005022002700000000004210019000000200200003900000001044000390000000e052000290000000005050433000000000051041b00000020022000390000000101100039000000000041004b00000e9f0000c13d000000070030006c00000eb10000813d00000007030000290000000303300210000000f80330018f000006180330027f00000618033001670000000e022000290000000002020433000000000232016f000000000021041b0000000701000029000000010110021000000001011001bf0000000202000029000000000012041b00000006010000290000000001010433000e00000001001d0000000021010434000600000002001d000700000001001d000005f80010009c00000a490000213d00000004010000290000000201100039000300000001001d000000000101041a000000010010019000000001021002700000007f0220618f000200000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000002870000c13d0000000201000029000000200010008c00000eeb0000413d0000000301000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d00000007030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000002010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000eeb0000813d000000000002041b0000000102200039000000000012004b00000ee70000413d00000007010000290000001f0010008c00000eff0000a13d0000000301000029000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000010020019000000fe70000613d000000200200008a0000000703200180000000000101043b00000f0c0000c13d000000200200003900000f180000013d000000070000006b000000000100001900000f040000613d0000000601000029000000000101043300000007040000290000000302400210000006180220027f0000061802200167000000000121016f0000000102400210000000000121019f00000f260000013d000000010230008a00000005022002700000000004210019000000200200003900000001044000390000000e052000290000000005050433000000000051041b00000020022000390000000101100039000000000041004b00000f110000c13d000000070030006c00000f230000813d00000007030000290000000303300210000000f80330018f000006180330027f00000618033001670000000e022000290000000002020433000000000232016f000000000021041b0000000701000029000000010110021000000001011001bf0000000302000029000000000012041b0000000401000029000000030110003900000005020000290000000002020433000000000021041b0000008002000039000000400100043d00000000022104360000000d0300002900000000030304330000008004100039000000000034043500000616063001970000001f0530018f000000a0041000390000000c0040006b00000f490000813d000000000006004b00000f450000613d0000000c085000290000000007540019000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c00000f3f0000c13d000000000005004b00000f600000613d000000000704001900000f550000013d0000000007640019000000000006004b00000f520000613d0000000c080000290000000009040019000000008a0804340000000009a90436000000000079004b00000f4e0000c13d000000000005004b00000f600000613d000c000c0060002d0000000305500210000000000607043300000000065601cf000000000656022f0000000c0800002900000000080804330000010005500089000000000858022f00000000055801cf000000000565019f0000000000570435000000000543001900000000000504350000001f03300039000006160330019700000000044300190000000003140049000000000032043500000009020000290000000003020433000000000234043600000616053001970000001f0430018f000000080020006b00000f7e0000813d000000000005004b00000f7a0000613d00000008074000290000000006420019000000200660008a000000200770008a0000000008560019000000000957001900000000090904330000000000980435000000200550008c00000f740000c13d000000000004004b00000f950000613d000000000602001900000f8a0000013d0000000006520019000000000005004b00000f870000613d0000000807000029000000000802001900000000790704340000000008980436000000000068004b00000f830000c13d000000000004004b00000f950000613d000800080050002d0000000304400210000000000506043300000000054501cf000000000545022f000000080700002900000000070704330000010004400089000000000747022f00000000044701cf000000000454019f0000000000460435000000000423001900000000000404350000001f03300039000006160330019700000000022300190000000003120049000000400410003900000000003404350000000b030000290000000003030433000000000232043600000616053001970000001f0430018f0000000a0020006b00000fb40000813d000000000005004b00000fb00000613d0000000a074000290000000006420019000000200660008a000000200770008a0000000008560019000000000957001900000000090904330000000000980435000000200550008c00000faa0000c13d000000000004004b00000fcb0000613d000000000602001900000fc00000013d0000000006520019000000000005004b00000fbd0000613d0000000a07000029000000000802001900000000790704340000000008980436000000000068004b00000fb90000c13d000000000004004b00000fcb0000613d000a000a0050002d0000000304400210000000000506043300000000054501cf000000000545022f0000000a0700002900000000070704330000010004400089000000000747022f00000000044701cf000000000454019f000000000046043500000000042300190000000000040435000000600410003900000000000404350000001f03300039000006160330019700000000021200490000000002320019000005e60020009c000005e6020080410000006002200210000005e60010009c000005e6010080410000004001100210000000000112019f0000000002000414000005e60020009c000005e602008041000000c002200210000000000112019f00000606011001c70000800d02000039000000020300003900000607040000410000000005000411179217880000040f0000000100200190000001f10000c13d000000000100001900001794000104300000000043010434000000000132043600000616063001970000001f0530018f000000000014004b00000fff0000813d000000000006004b00000ffb0000613d00000000085400190000000007510019000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c00000ff50000c13d000000000005004b000010150000613d00000000070100190000100b0000013d0000000007610019000000000006004b000010080000613d00000000080400190000000009010019000000008a0804340000000009a90436000000000079004b000010040000c13d000000000005004b000010150000613d00000000046400190000000305500210000000000607043300000000065601cf000000000656022f00000000040404330000010005500089000000000454022f00000000045401cf000000000464019f0000000000470435000000000431001900000000000404350000001f0330003900000616023001970000000001210019000000000001042d0003000000000002000000000201041a000000010320019000000001062002700000007f0660618f0000001f0060008c00000000040000390000000104002039000000000043004b0000105a0000c13d000000400500043d0000000004650436000000000003004b000010450000613d000100000004001d000300000006001d000200000005001d000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000010660000613d0000000306000029000000000006004b0000104b0000613d000000000201043b0000000001000019000000020500002900000001070000290000000003170019000000000402041a000000000043043500000001022000390000002001100039000000000061004b0000103d0000413d0000104d0000013d00000617012001970000000000140435000000000006004b000000200100003900000000010060390000104d0000013d000000000100001900000002050000290000003f0110003900000616021001970000000001520019000000000021004b00000000020000390000000102004039000005f80010009c000010600000213d0000000100200190000010600000c13d000000400010043f0000000001050019000000000001042d0000061401000041000000000010043f0000002201000039000000040010043f000006020100004100001794000104300000061401000041000000000010043f0000004101000039000000040010043f000006020100004100001794000104300000000001000019000017940001043000000080060000390000000006610436000000800810003900000000970204340000000000780435000006160b7001970000001f0a70018f000000a008100039000000000089004b000010820000813d00000000000b004b0000107e0000613d000000000da90019000000000ca80019000000200cc0008a000000200dd0008a000000000ebc0019000000000fbd0019000000000f0f04330000000000fe0435000000200bb0008c000010780000c13d00000000000a004b000010980000613d000000000c0800190000108e0000013d000000000cb8001900000000000b004b0000108b0000613d000000000d090019000000000e08001900000000df0d0434000000000efe04360000000000ce004b000010870000c13d00000000000a004b000010980000613d0000000009b90019000000030aa00210000000000b0c0433000000000bab01cf000000000bab022f0000000009090433000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f00000000009c0435000000000987001900000000000904350000001f0770003900000616077001970000000008870019000000000718004900000000007604350000000076030434000000000368043600000616096001970000001f0860018f000000000037004b000010b50000813d000000000009004b000010b10000613d000000000b870019000000000a830019000000200aa0008a000000200bb0008a000000000c9a0019000000000d9b0019000000000d0d04330000000000dc0435000000200990008c000010ab0000c13d000000000008004b000010cb0000613d000000000a030019000010c10000013d000000000a930019000000000009004b000010be0000613d000000000b070019000000000c03001900000000bd0b0434000000000cdc04360000000000ac004b000010ba0000c13d000000000008004b000010cb0000613d0000000007970019000000030880021000000000090a043300000000098901cf000000000989022f00000000070704330000010008800089000000000787022f00000000078701cf000000000797019f00000000007a0435000000000736001900000000000704350000001f06600039000006160660019700000000033600190000000006130049000000400710003900000000006704350000000064040434000000000343043600000616084001970000001f0740018f000000000036004b000010e90000813d000000000008004b000010e50000613d000000000a7600190000000009730019000000200990008a000000200aa0008a000000000b890019000000000c8a0019000000000c0c04330000000000cb0435000000200880008c000010df0000c13d000000000007004b000010ff0000613d0000000009030019000010f50000013d0000000009830019000000000008004b000010f20000613d000000000a060019000000000b03001900000000ac0a0434000000000bcb043600000000009b004b000010ee0000c13d000000000007004b000010ff0000613d00000000068600190000000307700210000000000809043300000000087801cf000000000878022f00000000060604330000010007700089000000000676022f00000000067601cf000000000686019f000000000069043500000000063400190000000000060435000000600110003900000000005104350000001f0140003900000616011001970000000001310019000000000001042d0007000000000002000600000001001d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f00000001002001900000154a0000613d000000000601043b000000400b00043d0000061900b0009c000015440000813d0000006007b00039000000400070043f000000000106041a000000010210019000000001041002700000007f0440618f0000001f0040008c00000000030000390000000103002039000000000032004b0000154c0000c13d0000000000470435000000000002004b00070000000b001d000400000006001d000011470000613d000300000004001d000500000007001d000000000060043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000070b00002900000001002001900000154a0000613d0000000308000029000000000008004b0000114e0000613d0000008002b00039000000000301043b0000000001000019000000040600002900000005070000290000000004120019000000000503041a000000000054043500000001033000390000002001100039000000000081004b0000113f0000413d000011510000013d00000617011001970000008002b000390000000000120435000000000004004b00000020010000390000000001006039000011510000013d0000000001000019000000040600002900000005070000290000003f01100039000000200f00008a0000000002f1016f0000000001720019000000000021004b00000000020000390000000102004039000005f80010009c000015440000213d0000000100200190000015440000c13d000000400010043f000000000c7b04360000000101600039000000000201041a000000010320019000000001072002700000007f0770618f0000001f0070008c00000000040000390000000104002039000000000442013f00000001004001900000154c0000c13d000000400500043d0000000004750436000000000003004b00050000000c001d0000118e0000613d000100000004001d000300000007001d000200000005001d000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f000000050c000029000000070b000029000000200f00008a00000001002001900000154a0000613d0000000307000029000000000007004b000011940000613d000000000201043b00000000010000190000000406000029000000020500002900000001080000290000000003180019000000000402041a000000000043043500000001022000390000002001100039000000000071004b000011860000413d000011970000013d00000617012001970000000000140435000000000007004b00000020010000390000000001006039000011970000013d0000000001000019000000040600002900000002050000290000003f011000390000000002f1016f0000000001520019000000000021004b00000000020000390000000102004039000005f80010009c000015440000213d0000000100200190000015440000c13d000000400010043f00000000005c04350000000201600039000000000201041a000000010320019000000001062002700000007f0660618f0000001f0060008c00000000040000390000000104002039000000000442013f00000001004001900000154c0000c13d000000400500043d0000000004650436000000000003004b000011d10000613d000200000004001d000300000006001d000000000010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c70000801002000039000400000005001d1792178d0000040f0000000405000029000000050c000029000000070b000029000000200f00008a00000001002001900000154a0000613d0000000306000029000000000006004b000011d70000613d000000000201043b000000000100001900000002070000290000000003170019000000000402041a000000000043043500000001022000390000002001100039000000000061004b000011c90000413d000011d80000013d00000617012001970000000000140435000000000006004b00000020010000390000000001006039000011d80000013d00000000010000190000003f011000390000000002f1016f0000000001520019000000000021004b00000000020000390000000102004039000005f80010009c000015440000213d0000000100200190000015440000c13d000000400010043f000000400db0003900000000005d043500000000010c04330000000001010433000000000001004b000011ec0000c13d0000000001050433000000000001004b0000154a0000613d000000400900043d0000061a01000041000000000019043500000000010004140000000002000411000000040020008c000011f60000c13d000000030100036700000001030000310000120d0000013d00040000000d001d000005e60090009c000300000009001d000005e60300004100000000030940190000004003300210000005e60010009c000005e601008041000000c001100210000000000131019f000005ff011001c71792178d0000040f0000006003100270000105e60030019d000005e60330019700030000000103550000000100200190000015580000613d000000200f00008a000000070b000029000000050c000029000000040d00002900000003090000290000000004f301700000001f0530018f0000000002490019000012170000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b000012130000c13d000000000005004b000012240000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f013000390000000001f1016f0000000005910019000000000015004b00000000010000390000000101004039000005f80050009c000015440000213d0000000100100190000015440000c13d000000400050043f000006080030009c0000154a0000213d000000200030008c0000154a0000413d0000000001090433000005f80010009c0000154a0000213d000000000393001900000000019100190000001f02100039000000000032004b0000000004000019000006090400804100000609022001970000060906300197000000000762013f000000000062004b00000000020000190000060902004041000006090070009c000000000204c019000000000002004b0000154a0000c13d0000000021010434000005f80010009c000015440000213d0000001f041000390000000004f4016f0000003f044000390000000004f4016f0000000004540019000005f80040009c000015440000213d000000400040043f00000000041504360000000006210019000000000036004b0000154a0000213d0000000006f1016f0000001f0310018f000000000042004b000012690000813d000000000006004b000012650000613d00000000083200190000000007340019000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c0000125f0000c13d000000000003004b0000127f0000613d0000000007040019000012750000013d0000000007640019000000000006004b000012720000613d00000000080200190000000009040019000000008a0804340000000009a90436000000000079004b0000126e0000c13d000000000003004b0000127f0000613d00000000026200190000000303300210000000000607043300000000063601cf000000000636022f00000000020204330000010003300089000000000232022f00000000023201cf000000000262019f000000000027043500000000011400190000000000010435000000400200043d00000000030b043300000000080d0433000000006a08043400000000090c0433000000007b09043400000000000b004b0000002001200039000700000003001d000012a50000613d00000000000a004b000012a50000613d0000061d0a0000410000000000a104350000000009090433000000000cf9016f0000001f0b90018f000000290a2000390000000000a7004b000012bf0000813d00000000000c004b000012a10000613d000000000eb70019000000000dba0019000000200dd0008a000000200ee0008a000000000fcd00190000000003ce0019000000000303043300000000003f0435000000200cc0008c0000129b0000c13d00000000000b004b000000200f00008a000012cb0000c13d000012d50000013d00000000000b004b0000130d0000613d0000061d0300004100000000003104350000000006090433000000000af6016f0000001f0960018f0000002908200039000000000087004b000013270000813d00000000000a004b000012bb0000613d0000000003970019000000000b980019000000200bb0008a000000200c30008a0000000003ab0019000000000dac0019000000000d0d04330000000000d30435000000200aa0008c000012b50000c13d000000000009004b0000133d0000613d000000000b080019000013330000013d000000000dca001900000000000c004b000012c70000613d000000000e07001900000000e30e0434000000000a3a04360000000000da004b000012c30000c13d00000000000b004b000012d50000613d0000000007c70019000000000a0d00190000000303b00210000000000b0a0433000000000b3b01cf000000000b3b022f00000000070704330000010003300089000000000737022f00000000033701cf0000000003b3019f00000000003a0435000000000729001900000029037000390000061e0900004100000000009304350000000008080433000000000bf8016f0000001f0a80018f0000003e09700039000000000096004b000012ee0000813d00000000000b004b000012eb0000613d0000000003a60019000000000ca90019000000200cc0008a000000200d30008a0000000003bc0019000000000ebd0019000000000e0e04330000000000e30435000000200bb0008c000012e50000c13d00000000000a004b000012fa0000c13d000013040000013d000000000cb9001900000000000b004b000012f60000613d000000000d06001900000000d30d043400000000093904360000000000c9004b000012f20000c13d00000000000a004b000013040000613d0000000006b6001900000000090c00190000000303a00210000000000a090433000000000a3a01cf000000000a3a022f00000000060604330000010003300089000000000636022f00000000033601cf0000000003a3019f000000000039043500000000037800190000003e063000390000061c07000041000000000076043500000000032300490000001f0630003900000000006204350000005e03300039000013650000013d00000000000a004b000013440000613d0000061b0300004100000000003104350000000007080433000000000af7016f0000001f0970018f0000003108200039000000000086004b000013490000813d00000000000a004b000013230000613d0000000003960019000000000b980019000000200bb0008a000000200c30008a0000000003ab0019000000000dac0019000000000d0d04330000000000d30435000000200aa0008c0000131d0000c13d000000000009004b0000135f0000613d000000000b080019000013550000013d000000000ba8001900000000000a004b000013300000613d000000000c070019000000000d08001900000000c30c0434000000000d3d04360000000000bd004b0000132c0000c13d000000000009004b0000133d0000613d0000000007a70019000000030390021000000000090b043300000000093901cf000000000939022f00000000070704330000010003300089000000000737022f00000000033701cf000000000393019f00000000003b043500000000038600190000061c0700004100000000007304350000000a0360003900000000003204350000004903600039000013650000013d000006030020009c000015440000213d000000400010043f00000000000204350000136f0000013d000000000ba8001900000000000a004b000013520000613d000000000c060019000000000d08001900000000c30c0434000000000d3d04360000000000bd004b0000134e0000c13d000000000009004b0000135f0000613d0000000006a60019000000030390021000000000090b043300000000093901cf000000000939022f00000000060604330000010003300089000000000636022f00000000033601cf000000000393019f00000000003b043500000000038700190000061c0600004100000000006304350000001203700039000000000032043500000051037000390000000003f3016f0000000006230019000000000036004b00000000070000390000000107004039000005f80060009c000015440000213d0000000100700190000015440000c13d000000400060043f00000006080000290000060b0080009c0000004007000039000013750000413d0000060b0880012a0000137d0000013d0000060d0080009c0000060c0880212a000000000700003900000020070020390000060e0080009c00000010077081bf0000060f038081970000060e0830812a000006100080009c0000000807708039000005f803808197000006100830812a000027100080008c0000000407708039000005e603808197000027100830811a000000640080008c00000002077080390000ffff0380818f000000640830811a000000090080008c00000001077020390000000008f7016f0000005f038000390000000003f3016f000000400a00043d0000000009a30019000000000039004b000000000b000039000000010b004039000005f80090009c000015440000213d0000000100b00190000015440000c13d000000400090043f000000010370003900000000093a04360000002003800039000000000cf301700000001f0b30018f00000000030000310000000208300367000013a70000613d000000000cc90019000000000d08034f000000000e09001900000000d30d043c000000000e3e04360000000000ce004b000013a30000c13d00000000000b004b000000060600002900000000037a00190000002107300039000000090060008c0000000a3660011a0000000303300210000000010770008a000000000b070433000006110bb00197000006120330021f00000613033001970000000003b3019f0000000000370435000013ab0000213d000000400700043d00000020037000390000061f0b0000410000000000b304350000000005050433000000000df5016f0000001f0c50018f0000002a0b7000390000000000b4004b000013d00000813d00000000000d004b000013cc0000613d0000000003c40019000000000ecb0019000000200ee0008a000000200f30008a0000000003de00190000000006df001900000000060604330000000000630435000000200dd0008c000013c60000c13d00000000000c004b000000200f00008a000013dd0000c13d000013e70000013d000000000edb001900000000000d004b000013d80000613d000000000f04001900000000f30f0434000000000b3b04360000000000eb004b000013d40000c13d00000000000c004b000000200f00008a000013e70000613d0000000004d40019000000000b0e00190000000303c0021000000000060b043300000000063601cf000000000636022f00000000040404330000010003300089000000000434022f00000000033401cf000000000363019f00000000003b043500000000047500190000002a034000390000062005000041000000000053043500000000050a0433000000000cf5016f0000001f0b50018f0000002c0a4000390000000000a9004b000014000000813d00000000000c004b000013fd0000613d0000000003b900190000000006ba0019000000200d60008a000000200e30008a0000000003cd00190000000006ce001900000000060604330000000000630435000000200cc0008c000013f70000c13d00000000000b004b0000140c0000c13d000014160000013d000000000dca001900000000000c004b000014080000613d000000000e09001900000000e30e0434000000000a3a04360000000000da004b000014040000c13d00000000000b004b000014160000613d0000000009c90019000000000a0d00190000000303b0021000000000060a043300000000063601cf000000000636022f00000000090904330000010003300089000000000939022f00000000033901cf000000000363019f00000000003a043500000000044500190000002c034000390000062105000041000000000053043500000030034000390000062205000041000000000053043500000007030000290000000053030434000000000bf3016f0000001f0a30018f0000003f09400039000000000095004b000014330000813d00000000000b004b000014300000613d0000000006a50019000000000ca90019000000200cc0008a000000200d60008a0000000006bc0019000000000ebd0019000000000e0e04330000000000e60435000000200bb0008c0000142a0000c13d00000000000a004b0000143f0000c13d000014490000013d000000000cb9001900000000000b004b0000143b0000613d000000000d05001900000000d60d043400000000096904360000000000c9004b000014370000c13d00000000000a004b000014490000613d0000000005b5001900000000090c00190000000306a00210000000000a090433000000000a6a01cf000000000a6a022f00000000050504330000010006600089000000000565022f00000000056501cf0000000005a5019f000000000059043500000000034300190000003f043000390000062105000041000000000054043500000000020204330000000009f2016f0000001f0520018f0000004304300039000000000041004b000014620000813d000000000009004b0000145f0000613d0000000006510019000000000a540019000000200aa0008a000000200b60008a00000000069a0019000000000c9b0019000000000c0c04330000000000c60435000000200990008c000014590000c13d000000000005004b0000146e0000c13d000014780000013d000000000a940019000000000009004b0000146a0000613d000000000b01001900000000b60b043400000000046404360000000000a4004b000014660000c13d000000000005004b000014780000613d000000000191001900000000040a00190000000305500210000000000604043300000000065601cf000000000656022f00000000010104330000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000000000132001900000043021000390000062303000041000000000032043500000000017100490000002402100039000000000027043500000063011000390000000001f1016f0000000003710019000000000013004b00000000010000390000000101004039000005f80030009c000015440000213d0000000100100190000015440000c13d000000400030043f0000000001070433000000000001004b000014f80000613d000006240030009c000015440000213d0000006001300039000000400010043f000000400130003900000625020000410000000000210435000000200130003900000626020000410000000000210435000000400100003900000000001304350000000001070433000006270010009c000015520000813d000006280010009c000015440000213d0000000201100039000000030110011a00000002021002100000001f012000390000000004f1016f0000003f014000390000000005f1016f000000400100043d0000000005510019000000000015004b00000000060000390000000106004039000005f80050009c000015440000213d0000000100600190000015440000c13d000000400050043f0000000002210436000000000004004b000014b80000613d00000000044200190000000005020019000000008608043c0000000005650436000000000045004b000014b40000c13d00000000060704330000000005760019000000000075004b0000000004020019000014ec0000a13d0000000103300039000000000607001900000000040200190000000306600039000000000806043300000012098002700000003f0990018f00000000093900190000000009090433000000f809900210000000000a040433000006110aa0019700000000099a019f00000000009404350000000c098002700000003f0990018f00000000093900190000000009090433000000f809900210000000010a400039000000000b0a0433000006110bb0019700000000099b019f00000000009a043500000006098002700000003f0990018f00000000093900190000000009090433000000f809900210000000020a400039000000000b0a0433000006110bb0019700000000099b019f00000000009a04350000003f0880018f00000000083800190000000008080433000000f8088002100000000309400039000000000a090433000006110aa0019700000000088a019f00000000008904350000000404400039000000000056004b000014c00000413d0000000006070433000000033060011a000000020030008c000014fe0000613d000000010030008c000015030000c13d000000010340008a0000000005030433000006110550019700000629055001c70000000000530435000000020340008a000014ff0000013d000006030030009c000015440000213d0000002002300039000000400020043f0000000000030435000015040000013d000000010340008a0000000004030433000006110440019700000629044001c700000000004304350000000003010019000000400100043d00000020041000390000062a05000041000000000054043500000000030304330000000006f3016f0000001f0530018f0000003d04100039000000000042004b0000151e0000813d000000000006004b0000151a0000613d00000000085200190000000007540019000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c000015140000c13d000000000005004b00000000070400190000152a0000c13d000015340000013d0000000007640019000000000006004b000015270000613d00000000080200190000000009040019000000008a0804340000000009a90436000000000079004b000015230000c13d000000000005004b000015340000613d00000000026200190000000305500210000000000607043300000000065601cf000000000656022f00000000020204330000010005500089000000000252022f00000000025201cf000000000262019f0000000000270435000000000234001900000000000204350000001d0230003900000000002104350000005c023000390000000003f2016f0000000002130019000000000032004b00000000030000390000000103004039000005f80020009c000015440000213d0000000100300190000015440000c13d000000400020043f000000000001042d0000061401000041000000000010043f0000004101000039000000040010043f00000602010000410000179400010430000000000100001900001794000104300000061401000041000000000010043f0000002201000039000000040010043f000006020100004100001794000104300000061401000041000000000010043f0000001101000039000000040010043f000006020100004100001794000104300000001f0530018f000005fd06300198000000400200043d0000000004620019000015630000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000155f0000c13d000000000005004b000015700000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000005e60020009c000005e6020080410000004002200210000000000121019f0000179400010430000a000000000002000a00000004001d000900000003001d000000400500043d000006190050009c0000176a0000813d0000006003500039000000400030043f00000040045000390000000a03000029000600000004001d0000000000340435000800000005001d00000000032504360000000902000029000700000003001d0000000000230435000005f901100197000400000001001d000000000010043f0000000101000039000000200010043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f6011001c700008010020000391792178d0000040f0000000100200190000017680000613d000000000401043b000000080100002900000000030104330000000065030434000005f80050009c0000176a0000213d000000000104041a000000010210019000000001071002700000007f0770618f0000001f0070008c00000000010000390000000101002039000000000012004b000017700000c13d000000200070008c000800000004001d000500000005001d000300000003001d000015c80000413d000100000007001d000200000006001d000000000040043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000017680000613d00000005050000290000001f025000390000000502200270000000200050008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000008040000290000000206000029000015c80000813d000000000002041b0000000102200039000000000012004b000015c40000413d0000001f0050008c000015f30000a13d000000000040043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000017680000613d00000005060000290000061602600198000000000101043b0000000307000029000015f70000613d000000010320008a000000050330027000000000043100190000002003000039000000010440003900000000057300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000015de0000c13d000000000062004b000015ef0000813d0000000302600210000000f80220018f000006180220027f000006180220016700000000037300190000000003030433000000000223016f000000000021041b000000010160021000000001011001bf0000000804000029000016020000013d000000000005004b000015fb0000613d0000000001060433000015fc0000013d0000002003000039000000000062004b000015e70000413d000015ef0000013d00000000010000190000000302500210000006180220027f0000061802200167000000000121016f0000000102500210000000000121019f000000000014041b000000070100002900000000030104330000000076030434000005f80060009c0000176a0000213d0000000105400039000000000105041a000000010010019000000001081002700000007f0880618f0000001f0080008c00000000020000390000000102002039000000000121013f0000000100100190000017700000c13d000000200080008c000700000005001d000500000006001d000300000003001d000016380000413d000100000008001d000200000007001d000000000050043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000017680000613d00000005060000290000001f026000390000000502200270000000200060008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b000000080400002900000007050000290000000207000029000016380000813d000000000002041b0000000102200039000000000012004b000016340000413d0000001f0060008c000016640000a13d000000000050043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000017680000613d00000005060000290000061602600198000000000101043b0000000307000029000016d40000613d000000010320008a000000050330027000000000043100190000002003000039000000010440003900000000057300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b0000164e0000c13d000000000062004b0000165f0000813d0000000302600210000000f80220018f000006180220027f000006180220016700000000037300190000000003030433000000000223016f000000000021041b000000010160021000000001011001bf000000080400002900000007050000290000166f0000013d000000000006004b000016680000613d0000000001070433000016690000013d00000000010000190000000302600210000006180220027f0000061802200167000000000121016f0000000102600210000000000121019f000000000015041b000000060100002900000000030104330000000075030434000005f80050009c0000176a0000213d0000000206400039000000000106041a000000010010019000000001041002700000007f0440618f0000001f0040008c00000000020000390000000102002039000000000121013f0000000100100190000017700000c13d000000200040008c000700000006001d000800000005001d000600000003001d000016a40000413d000300000004001d000500000007001d000000000060043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000017680000613d00000008050000290000001f025000390000000502200270000000200050008c0000000002004019000000000301043b00000003010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000007060000290000000507000029000016a40000813d000000000002041b0000000102200039000000000012004b000016a00000413d0000001f0050008c000016d00000a13d000000000060043f0000000001000414000005e60010009c000005e601008041000000c001100210000005f7011001c700008010020000391792178d0000040f0000000100200190000017680000613d000000200c00008a00000008070000290000000002c70170000000000101043b0000000608000029000016d80000613d000000010320008a0000000503300270000000000431001900000020030000390000000104400039000000070600002900000000058300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000016bc0000c13d000000000072004b000016cd0000813d0000000302700210000000f80220018f000006180220027f000006180220016700000000038300190000000003030433000000000223016f000000000021041b000000010170021000000001011001bf000016e50000013d000000000005004b000016dd0000613d0000000001070433000016de0000013d0000002003000039000000000062004b000016570000413d0000165f0000013d00000020030000390000000706000029000000000072004b000016c50000413d000016cd0000013d0000000001000019000000200c00008a0000000302500210000006180220027f0000061802200167000000000121016f0000000102500210000000000121019f000000000016041b0000004002000039000000400100043d000000000221043600000040041000390000000903000029000000005303043400000000003404350000000007c3016f0000001f0630018f0000006004100039000000000045004b000017020000813d000000000007004b000016fe0000613d00000000096500190000000008640019000000200880008a000000200990008a000000000a780019000000000b790019000000000b0b04330000000000ba0435000000200770008c000016f80000c13d000000000006004b000017180000613d00000000080400190000170e0000013d0000000008740019000000000007004b0000170b0000613d0000000009050019000000000a040019000000009b090434000000000aba043600000000008a004b000017070000c13d000000000006004b000017180000613d00000000057500190000000306600210000000000708043300000000076701cf000000000767022f00000000050504330000010006600089000000000565022f00000000056501cf000000000575019f0000000000580435000000000543001900000000000504350000001f033000390000000003c3016f0000000005430019000000000315004900000000003204350000000a02000029000000004302043400000000023504360000000006c3016f0000001f0b30018f000000000024004b000017370000813d000000000006004b000017320000613d0000000008b400190000000007b20019000000200770008a000000200880008a0000000009670019000000000a680019000000000a0a04330000000000a90435000000200660008c0000172c0000c13d00000000000b004b00000004050000290000174e0000613d0000000007020019000017440000013d0000000007620019000000000006004b000017400000613d00000000080400190000000009020019000000008a0804340000000009a90436000000000079004b0000173c0000c13d00000000000b004b00000004050000290000174e0000613d00000000046400190000000308b00210000000000607043300000000068601cf000000000686022f00000000040404330000010008800089000000000484022f00000000048401cf000000000464019f0000000000470435000000000423001900000000000404350000001f033000390000000003c3016f00000000021200490000000002320019000005e60020009c000005e6020080410000006002200210000005e60010009c000005e6010080410000004001100210000000000112019f0000000002000414000005e60020009c000005e602008041000000c002200210000000000121019f00000606011001c70000800d0200003900000002030000390000062b04000041179217880000040f0000000100200190000017680000613d000000000001042d000000000100001900001794000104300000061401000041000000000010043f0000004101000039000000040010043f000006020100004100001794000104300000061401000041000000000010043f0000002201000039000000040010043f00000602010000410000179400010430000000000001042f000005e60010009c000005e60100804100000060011002100000000002000414000005e60020009c000005e602008041000000c002200210000000000112019f00000606011001c700008010020000391792178d0000040f0000000100200190000017860000613d000000000101043b000000000001042d000000000100001900001794000104300000178b002104210000000102000039000000000001042d0000000002000019000000000001042d00001790002104230000000102000039000000000001042d0000000002000019000000000001042d0000179200000432000017930001042e000017940001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000af806d5500000000000000000000000000000000000000000000000000000000de5af49a00000000000000000000000000000000000000000000000000000000de5af49b00000000000000000000000000000000000000000000000000000000e8a3d48500000000000000000000000000000000000000000000000000000000ea58a14d00000000000000000000000000000000000000000000000000000000af806d5600000000000000000000000000000000000000000000000000000000cc1306db00000000000000000000000000000000000000000000000000000000d644beac0000000000000000000000000000000000000000000000000000000042495a940000000000000000000000000000000000000000000000000000000042495a95000000000000000000000000000000000000000000000000000000006bbde0010000000000000000000000000000000000000000000000000000000091074f98000000000000000000000000000000000000000000000000000000000bafbe0800000000000000000000000000000000000000000000000000000000301a326002000000000000000000000000000000000000400000000000000000000000000200000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000002000000080000000000000000024d7806c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000000000000000000000000000ffffffe002bd6bd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f2e078c4022bfd6c56addd06540a4a5dd4252b6b2c424b6840c184063f48fc27000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdf796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000000000000000000000000000005eff125d5659803f33dbda215d6e8bfe0a404fd213a9ecb5e61973ee16cb17e77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000eef043fe000000000000000000000000000000000000000000000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffa006fdde0300000000000000000000000000000000000000000000000000000000616e696d6174696f6e5f75726c223a20220000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000696d616765223a20220000000000000000000000000000000000000000000000222c2022616e696d6174696f6e5f75726c223a202200000000000000000000007b226e616d65223a2022000000000000000000000000000000000000000000002023000000000000000000000000000000000000000000000000000000000000222c2022000000000000000000000000000000000000000000000000000000006465736372697074696f6e223a202200000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000bffffffffffffffd3d00000000000000000000000000000000000000000000000000000000000000646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000aeb55777aebd643816b537b1251e9b2d6ec76dacb36ac8991ec89c41953fd7e0893c0aad7a3881138b31853542bae1f779185ce776fd20c425697b1c7906734d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.