Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RMRKTokenAttributesRepository
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.21;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
import {IERC7508} from "./IERC7508.sol";
/**
* @title RMRKTokenAttributesRepository
* @author RMRK team
* @notice Smart contract of the RMRK Token property repository module.
*/
contract RMRKTokenAttributesRepository is IERC7508, Context {
bytes32 public immutable DOMAIN_SEPARATOR =
keccak256(
abi.encode(
"ERC-7508: Public On-Chain NFT Attributes Repository",
"1",
block.chainid,
address(this)
)
);
bytes32 public immutable SET_UINT_ATTRIBUTE_TYPEHASH =
keccak256(
"setUintAttribute(address collection,uint256 tokenId,string memory key,uint256 value)"
);
bytes32 public immutable SET_INT_ATTRIBUTE_TYPEHASH =
keccak256(
"setUintAttribute(address collection,uint256 tokenId,string memory key,int256 value)"
);
bytes32 public immutable SET_STRING_ATTRIBUTE_TYPEHASH =
keccak256(
"setStringAttribute(address collection,uint256 tokenId,string memory key,string memory value)"
);
bytes32 public immutable SET_BOOL_ATTRIBUTE_TYPEHASH =
keccak256(
"setBoolAttribute(address collection,uint256 tokenId,string memory key,bool value)"
);
bytes32 public immutable SET_BYTES_ATTRIBUTE_TYPEHASH =
keccak256(
"setBytesAttribute(address collection,uint256 tokenId,string memory key,bytes memory value)"
);
bytes32 public immutable SET_ADDRESS_ATTRIBUTE_TYPEHASH =
keccak256(
"setAddressAttribute(address collection,uint256 tokenId,string memory key,address value)"
);
mapping(address collection => mapping(uint256 parameterId => AccessType accessType))
private _parameterAccessType;
mapping(address collection => mapping(uint256 parameterId => address specificAddress))
private _parameterSpecificAddress;
mapping(address collection => OwnerSetting setting) private _ownerSettings;
mapping(address collection => mapping(address collaborator => bool isCollaborator))
private _collaborators;
// For keys, we use a mapping from strings to IDs.
// The purpose is to store unique string keys only once, since they are more expensive.
mapping(string key => uint256 id) private _keysToIds;
uint256 private _nextKeyId;
mapping(address collection => string attributesMetadataURI)
private _attributesMetadataURIs;
mapping(address collection => mapping(uint256 => mapping(uint256 => address)))
private _addressValues;
mapping(address collection => mapping(uint256 => mapping(uint256 => bytes)))
private _bytesValues;
mapping(address collection => mapping(uint256 => mapping(uint256 => uint256)))
private _uintValues;
mapping(address collection => mapping(uint256 => mapping(uint256 => int256)))
private _intValues;
mapping(address collection => mapping(uint256 => mapping(uint256 => bool)))
private _boolValues;
mapping(address collection => mapping(uint256 => mapping(uint256 => string)))
private _stringValues;
struct OwnerSetting {
bool registered;
bool useOwnable;
address owner;
}
/// Used to signal that the length of the arrays is not equal.
error LengthsMismatch();
/// Used to signal that the smart contract interacting with the repository does not implement Ownable pattern.
error OwnableNotImplemented();
/// Used to signal that the caller is not the owner of the collection.
error NotCollectionOwner();
/// Used to signal that the collaborator and collaborator rights array are not of equal length.
error CollaboratorArraysNotEqualLength();
/// Used to signal that the collection is not registered in the repository yet.
error CollectionNotRegistered();
/// Used to signal that the caller is not aa collaborator of the collection.
error NotCollectionCollaborator();
/// Used to signal that the caller is not the owner or a collaborator of the collection.
error NotCollectionOwnerOrCollaborator();
/// Used to signal that the caller is not the owner of the token.
error NotTokenOwner();
/// Used to signal that the caller is not the specific address allowed to manage the attribute.
error NotSpecificAddress();
/// Used to signal that the presigned message's signature is invalid.
error InvalidSignature();
/// Used to signal that the presigned message's deadline has expired.
error ExpiredDeadline();
// ------------------- MODIFIERS -------------------
/**
* @notice Modifier to check if the collection is registered.
* @param collection Address of the collection.
*/
modifier onlyRegisteredCollection(address collection) {
if (!_ownerSettings[collection].registered) {
revert CollectionNotRegistered();
}
_;
}
/**
* @notice Modifier to check if the caller is the owner of the collection.
* @param collection Address of the collection.
*/
modifier onlyOwner(address collection) {
if (_ownerSettings[collection].useOwnable) {
if (Ownable(collection).owner() != _msgSender()) {
revert NotCollectionOwner();
}
} else if (_ownerSettings[collection].owner != _msgSender()) {
revert NotCollectionOwner();
}
_;
}
/**
* @inheritdoc IERC165
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual returns (bool) {
return
interfaceId == type(IERC7508).interfaceId ||
interfaceId == type(IERC165).interfaceId;
}
// ------------------- ACCESS CONTROL -------------------
/**
* @inheritdoc IERC7508
*/
function isCollaborator(
address collaborator,
address collection
) external view returns (bool isCollaborator_) {
isCollaborator_ = _collaborators[collection][collaborator];
}
/**
* @inheritdoc IERC7508
*/
function isSpecificAddress(
address specificAddress,
address collection,
string memory key
) external view returns (bool isSpecificAddress_) {
isSpecificAddress_ =
_parameterSpecificAddress[collection][_keysToIds[key]] ==
specificAddress;
}
/**
* @inheritdoc IERC7508
*/
function registerAccessControl(
address collection,
address owner,
bool useOwnable
) external {
(bool ownableSuccess, bytes memory ownableReturn) = collection.call(
abi.encodeWithSignature("owner()")
);
if (address(uint160(uint256(bytes32(ownableReturn)))) == address(0)) {
revert OwnableNotImplemented();
}
if (
ownableSuccess &&
address(uint160(uint256(bytes32(ownableReturn)))) != _msgSender()
) {
revert NotCollectionOwner();
}
_ownerSettings[collection] = OwnerSetting({
registered: true,
owner: owner,
useOwnable: useOwnable
});
emit AccessControlRegistration(
collection,
owner,
_msgSender(),
useOwnable
);
}
/**
* @inheritdoc IERC7508
*/
function manageAccessControl(
address collection,
string memory key,
AccessType accessType,
address specificAddress
) external onlyRegisteredCollection(collection) onlyOwner(collection) {
uint256 parameterId = _getIdForKey(key);
_parameterAccessType[collection][parameterId] = accessType;
_parameterSpecificAddress[collection][parameterId] = specificAddress;
emit AccessControlUpdate(collection, key, accessType, specificAddress);
}
/**
* @inheritdoc IERC7508
*/
function manageCollaborators(
address collection,
address[] memory collaboratorAddresses,
bool[] memory collaboratorAddressAccess
) external onlyRegisteredCollection(collection) onlyOwner(collection) {
uint256 length = collaboratorAddresses.length;
if (length != collaboratorAddressAccess.length) {
revert CollaboratorArraysNotEqualLength();
}
for (uint256 i; i < length; ) {
_collaborators[collection][
collaboratorAddresses[i]
] = collaboratorAddressAccess[i];
emit CollaboratorUpdate(
collection,
collaboratorAddresses[i],
collaboratorAddressAccess[i]
);
unchecked {
++i;
}
}
}
// ------------------- METADATA URI -------------------
/**
* @inheritdoc IERC7508
*/
function getAttributesMetadataURIForCollection(
address collection
) external view returns (string memory attributesMetadataURI) {
attributesMetadataURI = _attributesMetadataURIs[collection];
}
/**
* @inheritdoc IERC7508
*/
function setAttributesMetadataURIForCollection(
address collection,
string memory attributesMetadataURI
) external onlyOwner(collection) {
_attributesMetadataURIs[collection] = attributesMetadataURI;
emit MetadataURIUpdated(collection, attributesMetadataURI);
}
// ------------------- GETTERS -------------------
/**
* @inheritdoc IERC7508
*/
function getAddressAttribute(
address collection,
uint256 tokenId,
string memory key
) public view returns (address attribute) {
attribute = _addressValues[collection][tokenId][_keysToIds[key]];
}
/**
* @inheritdoc IERC7508
*/
function getBoolAttribute(
address collection,
uint256 tokenId,
string memory key
) public view returns (bool attribute) {
attribute = _boolValues[collection][tokenId][_keysToIds[key]];
}
/**
* @inheritdoc IERC7508
*/
function getBytesAttribute(
address collection,
uint256 tokenId,
string memory key
) public view returns (bytes memory attribute) {
attribute = _bytesValues[collection][tokenId][_keysToIds[key]];
}
/**
* @inheritdoc IERC7508
*/
function getUintAttribute(
address collection,
uint256 tokenId,
string memory key
) public view returns (uint256 attribute) {
attribute = _uintValues[collection][tokenId][_keysToIds[key]];
}
/**
* @inheritdoc IERC7508
*/
function getStringAttribute(
address collection,
uint256 tokenId,
string memory key
) public view returns (string memory attribute) {
attribute = _stringValues[collection][tokenId][_keysToIds[key]];
}
/**
* @inheritdoc IERC7508
*/
function getIntAttribute(
address collection,
uint256 tokenId,
string memory key
) public view returns (int256 attribute) {
attribute = _intValues[collection][tokenId][_keysToIds[key]];
}
// ------------------- BATCH GETTERS -------------------
/**
* @inheritdoc IERC7508
*/
function getAddressAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) public view returns (address[] memory attributes) {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributeKeys.length
);
attributes = new address[](loopLength);
for (uint256 i; i < loopLength; ) {
attributes[i] = getAddressAttribute(
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
multipleAttributes ? attributeKeys[i] : attributeKeys[0]
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function getBoolAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) public view returns (bool[] memory attributes) {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributeKeys.length
);
attributes = new bool[](loopLength);
for (uint256 i; i < loopLength; ) {
attributes[i] = getBoolAttribute(
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
multipleAttributes ? attributeKeys[i] : attributeKeys[0]
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function getBytesAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) public view returns (bytes[] memory attributes) {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributeKeys.length
);
attributes = new bytes[](loopLength);
for (uint256 i; i < loopLength; ) {
attributes[i] = getBytesAttribute(
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
multipleAttributes ? attributeKeys[i] : attributeKeys[0]
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function getIntAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) public view returns (int256[] memory attributes) {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributeKeys.length
);
attributes = new int256[](loopLength);
for (uint256 i; i < loopLength; ) {
attributes[i] = getIntAttribute(
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
multipleAttributes ? attributeKeys[i] : attributeKeys[0]
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function getStringAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) public view returns (string[] memory attributes) {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributeKeys.length
);
attributes = new string[](loopLength);
for (uint256 i; i < loopLength; ) {
attributes[i] = getStringAttribute(
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
multipleAttributes ? attributeKeys[i] : attributeKeys[0]
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function getUintAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) public view returns (uint256[] memory attributes) {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributeKeys.length
);
attributes = new uint256[](loopLength);
for (uint256 i; i < loopLength; ) {
attributes[i] = getUintAttribute(
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
multipleAttributes ? attributeKeys[i] : attributeKeys[0]
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function getAttributes(
address collection,
uint256 tokenId,
string[] memory addressKeys,
string[] memory boolKeys,
string[] memory bytesKeys,
string[] memory intKeys,
string[] memory stringKeys,
string[] memory uintKeys
)
external
view
returns (
address[] memory addressAttributes,
bool[] memory boolAttributes,
bytes[] memory bytesAttributes,
int256[] memory intAttributes,
string[] memory stringAttributes,
uint256[] memory uintAttributes
)
{
// WARNING: This implementation is a bit inneficient and differs slightly from the ERC one, to avoid stack too deep errors without using via-IR flag which would affect all other contracts in the package. This is not relevant since you should only need the interface to interact with the actual repo on each network anyway.
stringAttributes = new string[](stringKeys.length);
for (uint256 i; i < stringKeys.length; ) {
stringAttributes[i] = getStringAttribute(
collection,
tokenId,
stringKeys[i]
);
unchecked {
++i;
}
}
uintAttributes = new uint256[](uintKeys.length);
for (uint256 i; i < uintKeys.length; ) {
uintAttributes[i] = getUintAttribute(
collection,
tokenId,
uintKeys[i]
);
unchecked {
++i;
}
}
intAttributes = new int256[](intKeys.length);
for (uint256 i; i < intKeys.length; ) {
intAttributes[i] = getIntAttribute(collection, tokenId, intKeys[i]);
unchecked {
++i;
}
}
boolAttributes = new bool[](boolKeys.length);
for (uint256 i; i < boolKeys.length; ) {
boolAttributes[i] = getBoolAttribute(
collection,
tokenId,
boolKeys[i]
);
unchecked {
++i;
}
}
addressAttributes = new address[](addressKeys.length);
for (uint256 i; i < addressKeys.length; ) {
addressAttributes[i] = getAddressAttribute(
collection,
tokenId,
addressKeys[i]
);
unchecked {
++i;
}
}
bytesAttributes = new bytes[](bytesKeys.length);
for (uint256 i; i < bytesKeys.length; ) {
bytesAttributes[i] = getBytesAttribute(
collection,
tokenId,
bytesKeys[i]
);
unchecked {
++i;
}
}
}
// ------------------- PREPARE PRESIGNED MESSAGES -------------------
/**
* @inheritdoc IERC7508
*/
function prepareMessageToPresignAddressAttribute(
address collection,
uint256 tokenId,
string memory key,
address value,
uint256 deadline
) public view returns (bytes32 message) {
message = keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_ADDRESS_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
);
}
/**
* @inheritdoc IERC7508
*/
function prepareMessageToPresignBoolAttribute(
address collection,
uint256 tokenId,
string memory key,
bool value,
uint256 deadline
) public view returns (bytes32 message) {
message = keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_BOOL_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
);
}
/**
* @inheritdoc IERC7508
*/
function prepareMessageToPresignBytesAttribute(
address collection,
uint256 tokenId,
string memory key,
bytes memory value,
uint256 deadline
) public view returns (bytes32 message) {
message = keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_BYTES_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
);
}
/**
* @inheritdoc IERC7508
*/
function prepareMessageToPresignIntAttribute(
address collection,
uint256 tokenId,
string memory key,
int256 value,
uint256 deadline
) public view returns (bytes32 message) {
message = keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_UINT_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
);
}
/**
* @inheritdoc IERC7508
*/
function prepareMessageToPresignStringAttribute(
address collection,
uint256 tokenId,
string memory key,
string memory value,
uint256 deadline
) public view returns (bytes32 message) {
message = keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_STRING_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
);
}
/**
* @inheritdoc IERC7508
*/
function prepareMessageToPresignUintAttribute(
address collection,
uint256 tokenId,
string memory key,
uint256 value,
uint256 deadline
) public view returns (bytes32 message) {
message = keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_UINT_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
);
}
// ------------------- SETTERS -------------------
/**
* @inheritdoc IERC7508
*/
function setAddressAttribute(
address collection,
uint256 tokenId,
string memory key,
address value
) external {
_setAddressAttribute(_msgSender(), collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function setBoolAttribute(
address collection,
uint256 tokenId,
string memory key,
bool value
) external {
_setBoolAttribute(_msgSender(), collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function setBytesAttribute(
address collection,
uint256 tokenId,
string memory key,
bytes memory value
) external {
_setBytesAttribute(_msgSender(), collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function setIntAttribute(
address collection,
uint256 tokenId,
string memory key,
int256 value
) external {
_setIntAttribute(_msgSender(), collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function setStringAttribute(
address collection,
uint256 tokenId,
string memory key,
string memory value
) external {
_setStringAttribute(_msgSender(), collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function setUintAttribute(
address collection,
uint256 tokenId,
string memory key,
uint256 value
) external {
_setUintAttribute(_msgSender(), collection, tokenId, key, value);
}
// ------------------- BATCH SETTERS -------------------
/**
* @inheritdoc IERC7508
*/
function setAddressAttributes(
address[] memory collections,
uint256[] memory tokenIds,
AddressAttribute[] memory attributes
) external {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributes.length
);
for (uint256 i; i < loopLength; ) {
AddressAttribute memory attribute = multipleAttributes
? attributes[i]
: attributes[0];
_setAddressAttribute(
_msgSender(),
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
attribute.key,
attribute.value
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function setBoolAttributes(
address[] memory collections,
uint256[] memory tokenIds,
BoolAttribute[] memory attributes
) external {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributes.length
);
for (uint256 i; i < loopLength; ) {
BoolAttribute memory attribute = multipleAttributes
? attributes[i]
: attributes[0];
_setBoolAttribute(
_msgSender(),
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
attribute.key,
attribute.value
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function setBytesAttributes(
address[] memory collections,
uint256[] memory tokenIds,
BytesAttribute[] memory attributes
) external {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributes.length
);
for (uint256 i; i < loopLength; ) {
BytesAttribute memory attribute = multipleAttributes
? attributes[i]
: attributes[0];
_setBytesAttribute(
_msgSender(),
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
attribute.key,
attribute.value
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function setIntAttributes(
address[] memory collections,
uint256[] memory tokenIds,
IntAttribute[] memory attributes
) external {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributes.length
);
for (uint256 i; i < loopLength; ) {
IntAttribute memory attribute = multipleAttributes
? attributes[i]
: attributes[0];
_setIntAttribute(
_msgSender(),
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
attribute.key,
attribute.value
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function setStringAttributes(
address[] memory collections,
uint256[] memory tokenIds,
StringAttribute[] memory attributes
) external {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributes.length
);
for (uint256 i; i < loopLength; ) {
StringAttribute memory attribute = multipleAttributes
? attributes[i]
: attributes[0];
_setStringAttribute(
_msgSender(),
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
attribute.key,
attribute.value
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function setUintAttributes(
address[] memory collections,
uint256[] memory tokenIds,
UintAttribute[] memory attributes
) external {
(
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
) = _checkIfMultipleCollectionsAndTokens(
collections,
tokenIds,
attributes.length
);
for (uint256 i; i < loopLength; ) {
UintAttribute memory attribute = multipleAttributes
? attributes[i]
: attributes[0];
_setUintAttribute(
_msgSender(),
multipleCollections ? collections[i] : collections[0],
multipleTokens ? tokenIds[i] : tokenIds[0],
attribute.key,
attribute.value
);
unchecked {
++i;
}
}
}
/**
* @inheritdoc IERC7508
*/
function setAttributes(
address collection,
uint256 tokenId,
AddressAttribute[] memory addressAttributes,
BoolAttribute[] memory boolAttributes,
BytesAttribute[] memory bytesAttributes,
IntAttribute[] memory intAttributes,
StringAttribute[] memory stringAttributes,
UintAttribute[] memory uintAttributes
) external {
uint256 length = stringAttributes.length;
for (uint256 i; i < length; ) {
_setStringAttribute(
_msgSender(),
collection,
tokenId,
stringAttributes[i].key,
stringAttributes[i].value
);
unchecked {
++i;
}
}
length = uintAttributes.length;
for (uint256 i; i < length; ) {
_setUintAttribute(
_msgSender(),
collection,
tokenId,
uintAttributes[i].key,
uintAttributes[i].value
);
unchecked {
++i;
}
}
length = intAttributes.length;
for (uint256 i; i < length; ) {
_setIntAttribute(
_msgSender(),
collection,
tokenId,
intAttributes[i].key,
intAttributes[i].value
);
unchecked {
++i;
}
}
length = boolAttributes.length;
for (uint256 i; i < length; ) {
_setBoolAttribute(
_msgSender(),
collection,
tokenId,
boolAttributes[i].key,
boolAttributes[i].value
);
unchecked {
++i;
}
}
length = addressAttributes.length;
for (uint256 i; i < length; ) {
_setAddressAttribute(
_msgSender(),
collection,
tokenId,
addressAttributes[i].key,
addressAttributes[i].value
);
unchecked {
++i;
}
}
length = bytesAttributes.length;
for (uint256 i; i < length; ) {
_setBytesAttribute(
_msgSender(),
collection,
tokenId,
bytesAttributes[i].key,
bytesAttributes[i].value
);
unchecked {
++i;
}
}
}
// ------------------- PRESIGNED SETTERS -------------------
/**
* @inheritdoc IERC7508
*/
function presignedSetAddressAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
address value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_ADDRESS_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
)
)
);
_checkDeadlineAndSigner(setter, deadline, digest, v, r, s);
_setAddressAttribute(setter, collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function presignedSetBoolAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
bool value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_BOOL_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
)
)
);
_checkDeadlineAndSigner(setter, deadline, digest, v, r, s);
_setBoolAttribute(setter, collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function presignedSetBytesAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
bytes memory value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_BYTES_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
)
)
);
_checkDeadlineAndSigner(setter, deadline, digest, v, r, s);
_setBytesAttribute(setter, collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function presignedSetIntAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
int256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_UINT_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
)
)
);
_checkDeadlineAndSigner(setter, deadline, digest, v, r, s);
_setIntAttribute(setter, collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function presignedSetStringAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
string memory value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_STRING_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
)
)
);
_checkDeadlineAndSigner(setter, deadline, digest, v, r, s);
_setStringAttribute(setter, collection, tokenId, key, value);
}
/**
* @inheritdoc IERC7508
*/
function presignedSetUintAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
keccak256(
abi.encode(
DOMAIN_SEPARATOR,
SET_UINT_ATTRIBUTE_TYPEHASH,
collection,
tokenId,
key,
value,
deadline
)
)
)
);
_checkDeadlineAndSigner(setter, deadline, digest, v, r, s);
_setUintAttribute(setter, collection, tokenId, key, value);
}
// ------------------- HELPERS -------------------
function _checkDeadlineAndSigner(
address setter,
uint256 deadline,
bytes32 digest,
uint8 v,
bytes32 r,
bytes32 s
) internal view {
if (block.timestamp > deadline) {
revert ExpiredDeadline();
}
address signer = ecrecover(digest, v, r, s);
if (signer != setter) {
revert InvalidSignature();
}
}
function _checkIfMultipleCollectionsAndTokens(
address[] memory collections,
uint256[] memory tokenIds,
uint256 attributesLength
)
internal
pure
returns (
bool multipleCollections,
bool multipleTokens,
bool multipleAttributes,
uint256 loopLength
)
{
multipleCollections = collections.length != 1;
multipleTokens = tokenIds.length != 1;
multipleAttributes = attributesLength != 1;
if (
(multipleCollections &&
multipleAttributes &&
collections.length != attributesLength) ||
(multipleTokens &&
multipleAttributes &&
tokenIds.length != attributesLength) ||
(multipleCollections &&
multipleTokens &&
collections.length != tokenIds.length)
) {
revert LengthsMismatch();
}
if (multipleCollections) {
loopLength = collections.length;
} else if (multipleTokens) {
loopLength = tokenIds.length;
} else {
loopLength = attributesLength;
}
}
/**
* @notice Function to check if the caller is authorized to mamage a given parameter.
* @param collection The address of the collection.
* @param key Key of the attribute.
* @param tokenId The ID of the token.
*/
function _checkOnlyAuthorizedCaller(
address caller,
address collection,
string memory key,
uint256 tokenId
) private view {
AccessType accessType = _parameterAccessType[collection][
_keysToIds[key]
];
if (
accessType == AccessType.Owner &&
((_ownerSettings[collection].useOwnable &&
Ownable(collection).owner() != caller) ||
(!_ownerSettings[collection].useOwnable &&
_ownerSettings[collection].owner != caller))
) {
revert NotCollectionOwner();
} else if (
accessType == AccessType.Collaborator &&
!_collaborators[collection][caller]
) {
revert NotCollectionCollaborator();
} else if (
accessType == AccessType.OwnerOrCollaborator &&
((_ownerSettings[collection].useOwnable &&
Ownable(collection).owner() != caller) ||
(!_ownerSettings[collection].useOwnable &&
_ownerSettings[collection].owner != caller)) &&
!_collaborators[collection][caller]
) {
revert NotCollectionOwnerOrCollaborator();
} else if (
accessType == AccessType.TokenOwner &&
IERC721(collection).ownerOf(tokenId) != caller
) {
revert NotTokenOwner();
} else if (
accessType == AccessType.SpecificAddress &&
!(_parameterSpecificAddress[collection][_keysToIds[key]] == caller)
) {
revert NotSpecificAddress();
}
}
/**
* @notice Used to get the Id for a key. If the key does not exist, a new ID is created.
* IDs are shared among all tokens and types
* @dev The ID of 0 is not used as it represents the default value.
* @param key The attribute key
* @return keyID The ID of the key
*/
function _getIdForKey(string memory key) internal returns (uint256 keyID) {
if (_keysToIds[key] == 0) {
_nextKeyId++;
_keysToIds[key] = _nextKeyId;
keyID = _nextKeyId;
} else {
keyID = _keysToIds[key];
}
}
function _setAddressAttribute(
address caller,
address collection,
uint256 tokenId,
string memory key,
address value
) internal {
_checkOnlyAuthorizedCaller(caller, collection, key, tokenId);
_addressValues[collection][tokenId][_getIdForKey(key)] = value;
emit AddressAttributeUpdated(collection, tokenId, key, value);
}
function _setBoolAttribute(
address caller,
address collection,
uint256 tokenId,
string memory key,
bool value
) internal {
_checkOnlyAuthorizedCaller(caller, collection, key, tokenId);
_boolValues[collection][tokenId][_getIdForKey(key)] = value;
emit BoolAttributeUpdated(collection, tokenId, key, value);
}
function _setBytesAttribute(
address caller,
address collection,
uint256 tokenId,
string memory key,
bytes memory value
) internal {
_checkOnlyAuthorizedCaller(caller, collection, key, tokenId);
_bytesValues[collection][tokenId][_getIdForKey(key)] = value;
emit BytesAttributeUpdated(collection, tokenId, key, value);
}
function _setIntAttribute(
address caller,
address collection,
uint256 tokenId,
string memory key,
int256 value
) internal {
_checkOnlyAuthorizedCaller(caller, collection, key, tokenId);
_intValues[collection][tokenId][_getIdForKey(key)] = value;
emit IntAttributeUpdated(collection, tokenId, key, value);
}
function _setStringAttribute(
address caller,
address collection,
uint256 tokenId,
string memory key,
string memory value
) internal {
_checkOnlyAuthorizedCaller(caller, collection, key, tokenId);
_stringValues[collection][tokenId][_getIdForKey(key)] = value;
emit StringAttributeUpdated(collection, tokenId, key, value);
}
function _setUintAttribute(
address caller,
address collection,
uint256 tokenId,
string memory key,
uint256 value
) internal {
_checkOnlyAuthorizedCaller(caller, collection, key, tokenId);
_uintValues[collection][tokenId][_getIdForKey(key)] = value;
emit UintAttributeUpdated(collection, tokenId, key, value);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* 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 v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.21;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @title ERC-7508 Public On-Chain NFT Attributes Repository
* @author RMRK team
* @notice Interface smart contract of Dynamic On-Chain Token Attributes Repository
*/
interface IERC7508 is IERC165 {
/**
* @notice A list of supported access types.
* @return The `Owner` type, where only the owner can manage the parameter.
* @return The `Collaborator` type, where only the collaborators can manage the parameter.
* @return The `OwnerOrCollaborator` type, where only the owner or collaborators can manage the parameter.
* @return The `TokenOwner` type, where only the token owner can manage the parameters of their tokens.
* @return The `SpecificAddress` type, where only specific addresses can manage the parameter.
*/
enum AccessType {
Owner,
Collaborator,
OwnerOrCollaborator,
TokenOwner,
SpecificAddress
}
/**
* @notice Structure used to represent an address attribute.
* @return key The key of the attribute
* @return value The value of the attribute
*/
struct AddressAttribute {
string key;
address value;
}
/**
* @notice Structure used to represent a boolean attribute.
* @return key The key of the attribute
* @return value The value of the attribute
*/
struct BoolAttribute {
string key;
bool value;
}
/**
* @notice Structure used to represent a bytes attribute.
* @return key The key of the attribute
* @return value The value of the attribute
*/
struct BytesAttribute {
string key;
bytes value;
}
/**
* @notice Structure used to represent an int attribute.
* @return key The key of the attribute
* @return value The value of the attribute
*/
struct IntAttribute {
string key;
int256 value;
}
/**
* @notice Structure used to represent a string attribute.
* @return key The key of the attribute
* @return value The value of the attribute
*/
struct StringAttribute {
string key;
string value;
}
/**
* @notice Structure used to represent an uint attribute.
* @return key The key of the attribute
* @return value The value of the attribute
*/
struct UintAttribute {
string key;
uint256 value;
}
/**
* @notice Used to notify listeners that a new collection has been registered to use the repository.
* @param collection Address of the collection
* @param owner Address of the owner of the collection; the addess authorized to manage the access control
* @param registeringAddress Address that registered the collection
* @param useOwnable A boolean value indicating whether the collection uses the Ownable extension to verify the
* owner (`true`) or not (`false`)
*/
event AccessControlRegistration(
address indexed collection,
address indexed owner,
address indexed registeringAddress,
bool useOwnable
);
/**
* @notice Used to notify listeners that the access control settings for a specific parameter have been updated.
* @param collection Address of the collection
* @param key The name of the parameter for which the access control settings have been updated
* @param accessType The AccessType of the parameter for which the access control settings have been updated
* @param specificAddress The specific addresses that has been updated
*/
event AccessControlUpdate(
address indexed collection,
string key,
AccessType accessType,
address specificAddress
);
/**
* @notice Used to notify listeners that the metadata URI for a collection has been updated.
* @param collection Address of the collection
* @param attributesMetadataURI The new attributes metadata URI
*/
event MetadataURIUpdated(
address indexed collection,
string attributesMetadataURI
);
/**
* @notice Used to notify listeners that a new collaborator has been added or removed.
* @param collection Address of the collection
* @param collaborator Address of the collaborator
* @param isCollaborator A boolean value indicating whether the collaborator has been added (`true`) or removed
* (`false`)
*/
event CollaboratorUpdate(
address indexed collection,
address indexed collaborator,
bool isCollaborator
);
/**
* @notice Used to notify listeners that an address attribute has been updated.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @param value The new value of the attribute
*/
event AddressAttributeUpdated(
address indexed collection,
uint256 indexed tokenId,
string key,
address value
);
/**
* @notice Used to notify listeners that a boolean attribute has been updated.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @param value The new value of the attribute
*/
event BoolAttributeUpdated(
address indexed collection,
uint256 indexed tokenId,
string key,
bool value
);
/**
* @notice Used to notify listeners that a bytes attribute has been updated.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @param value The new value of the attribute
*/
event BytesAttributeUpdated(
address indexed collection,
uint256 indexed tokenId,
string key,
bytes value
);
/**
* @notice Used to notify listeners that an int attribute has been updated.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @param value The new value of the attribute
*/
event IntAttributeUpdated(
address indexed collection,
uint256 indexed tokenId,
string key,
int256 value
);
/**
* @notice Used to notify listeners that a string attribute has been updated.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @param value The new value of the attribute
*/
event StringAttributeUpdated(
address indexed collection,
uint256 indexed tokenId,
string key,
string value
);
/**
* @notice Used to notify listeners that an uint attribute has been updated.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @param value The new value of the attribute
*/
event UintAttributeUpdated(
address indexed collection,
uint256 indexed tokenId,
string key,
uint256 value
);
// ------------------- ACCESS CONTROL -------------------
/**
* @notice Used to check if the specified address is listed as a collaborator of the given collection's parameter.
* @param collaborator Address to be checked.
* @param collection Address of the collection.
* @return isCollaborator_ Boolean value indicating if the address is a collaborator of the given collection's (`true`) or not
* (`false`).
*/
function isCollaborator(
address collaborator,
address collection
) external view returns (bool isCollaborator_);
/**
* @notice Used to check if the specified address is listed as a specific address of the given collection's
* parameter.
* @param specificAddress Address to be checked.
* @param collection Address of the collection.
* @param key The key of the attribute
* @return isSpecificAddress_ Boolean value indicating if the address is a specific address of the given collection's parameter
* (`true`) or not (`false`).
*/
function isSpecificAddress(
address specificAddress,
address collection,
string memory key
) external view returns (bool isSpecificAddress_);
/**
* @notice Used to register a collection to use the RMRK token attributes repository.
* @dev If the collection does not implement the Ownable interface, the `useOwnable` value must be set to `false`.
* @dev Emits an {AccessControlRegistration} event.
* @param collection The address of the collection that will use the RMRK token attributes repository.
* @param owner The address of the owner of the collection.
* @param useOwnable The boolean value to indicate if the collection implements the Ownable interface and whether it
* should be used to validate that the caller is the owner (`true`) or to use the manually set owner address
* (`false`).
*/
function registerAccessControl(
address collection,
address owner,
bool useOwnable
) external;
/**
* @notice Used to manage the access control settings for a specific parameter.
* @dev Only the `owner` of the collection can call this function.
* @dev The possible `accessType` values are:
* [
* Owner,
* Collaborator,
* OwnerOrCollaborator,
* TokenOwner,
* SpecificAddress,
* ]
* @dev Emits an {AccessControlUpdated} event.
* @param collection The address of the collection being managed.
* @param key The key of the attribute
* @param accessType The type of access control to be applied to the parameter.
* @param specificAddress The address to be added as a specific addresses allowed to manage the given
* parameter.
*/
function manageAccessControl(
address collection,
string memory key,
AccessType accessType,
address specificAddress
) external;
/**
* @notice Used to manage the collaborators of a collection.
* @dev The `collaboratorAddresses` and `collaboratorAddressAccess` arrays must be of the same length.
* @dev Emits a {CollaboratorUpdate} event.
* @param collection The address of the collection
* @param collaboratorAddresses The array of collaborator addresses being managed
* @param collaboratorAddressAccess The array of boolean values indicating if the collaborator address should
* receive the permission (`true`) or not (`false`).
*/
function manageCollaborators(
address collection,
address[] memory collaboratorAddresses,
bool[] memory collaboratorAddressAccess
) external;
// ------------------- METADATA URI -------------------
/**
* @notice Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes.
* @param collection Address of the collection
* @return attributesMetadataURI The URI of the attributes metadata
*/
function getAttributesMetadataURIForCollection(
address collection
) external view returns (string memory attributesMetadataURI);
/**
* @notice Used to set the metadata URI for a collection, which contains all the information about the collection attributes.
* @dev Emits a {MetadataURIUpdated} event.
* @param collection Address of the collection
* @param attributesMetadataURI The URI of the attributes metadata
*/
function setAttributesMetadataURIForCollection(
address collection,
string memory attributesMetadataURI
) external;
// ------------------- GETTERS -------------------
/**
* @notice Used to retrieve the address type token attributes.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @return attribute The value of the address attribute
*/
function getAddressAttribute(
address collection,
uint256 tokenId,
string memory key
) external view returns (address attribute);
/**
* @notice Used to retrieve the bool type token attributes.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @return attribute The value of the bool attribute
*/
function getBoolAttribute(
address collection,
uint256 tokenId,
string memory key
) external view returns (bool attribute);
/**
* @notice Used to retrieve the bytes type token attributes.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @return attribute The value of the bytes attribute
*/
function getBytesAttribute(
address collection,
uint256 tokenId,
string memory key
) external view returns (bytes memory attribute);
/**
* @notice Used to retrieve the uint type token attributes.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @return attribute The value of the uint attribute
*/
function getUintAttribute(
address collection,
uint256 tokenId,
string memory key
) external view returns (uint256 attribute);
/**
* @notice Used to retrieve the string type token attributes.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @return attribute The value of the string attribute
*/
function getStringAttribute(
address collection,
uint256 tokenId,
string memory key
) external view returns (string memory attribute);
/**
* @notice Used to retrieve the int type token attributes.
* @param collection The collection address
* @param tokenId The token ID
* @param key The key of the attribute
* @return attribute The value of the uint attribute
*/
function getIntAttribute(
address collection,
uint256 tokenId,
string memory key
) external view returns (int256 attribute);
// ------------------- BATCH GETTERS -------------------
/**
* @notice Used to get multiple address parameter values for a token.
* @dev The `AddressAttribute` struct contains the following fields:
* [
* string key,
* address value
* ]
* @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributeKeys An array of address keys to retrieve
* @return attributes An array of addresses, in the same order as the attribute keys
*/
function getAddressAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) external view returns (address[] memory attributes);
/**
* @notice Used to get multiple bool parameter values for a token.
* @dev The `BoolAttribute` struct contains the following fields:
* [
* string key,
* bool value
* ]
* @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributeKeys An array of bool keys to retrieve
* @return attributes An array of bools, in the same order as the attribute keys
*/
function getBoolAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) external view returns (bool[] memory attributes);
/**
* @notice Used to get multiple bytes parameter values for a token.
* @dev The `BytesAttribute` struct contains the following fields:
* [
* string key,
* bytes value
* ]
* @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributeKeys An array of bytes keys to retrieve
* @return attributes An array of bytes, in the same order as the attribute keys
*/
function getBytesAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) external view returns (bytes[] memory attributes);
/**
* @notice Used to get multiple int parameter values for a token.
* @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributeKeys An array of int keys to retrieve
* @return attributes An array of ints, in the same order as the attribute keys
*/
function getIntAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) external view returns (int256[] memory attributes);
/**
* @notice Used to get multiple sting parameter values for a token.
* @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributeKeys An array of string keys to retrieve
* @return attributes An array of strings, in the same order as the attribute keys
*/
function getStringAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) external view returns (string[] memory attributes);
/**
* @notice Used to get multiple uint parameter values for a token.
* @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributeKeys An array of uint keys to retrieve
* @return attributes An array of uints, in the same order as the attribute keys
*/
function getUintAttributes(
address[] memory collections,
uint256[] memory tokenIds,
string[] memory attributeKeys
) external view returns (uint256[] memory attributes);
/**
* @notice Used to retrieve multiple token attributes of any type at once.
* @dev The `StringAttribute`, `UintAttribute`, `IntAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists
* to the following fields (where `value` is of the appropriate type):
* [
* key,
* value,
* ]
* @param collection The collection address
* @param tokenId The token ID
* @param addressKeys An array of address type attribute keys to retrieve
* @param boolKeys An array of bool type attribute keys to retrieve
* @param bytesKeys An array of bytes type attribute keys to retrieve
* @param intKeys An array of int type attribute keys to retrieve
* @param stringKeys An array of string type attribute keys to retrieve
* @param uintKeys An array of uint type attribute keys to retrieve
* @return addressAttributes An array of addresses, in the same order as the addressKeys
* @return boolAttributes An array of bools, in the same order as the boolKeys
* @return bytesAttributes An array of bytes, in the same order as the bytesKeys
* @return intAttributes An array of ints, in the same order as the intKeys
* @return stringAttributes An array of strings, in the same order as the stringKeys
* @return uintAttributes An array of uints, in the same order as the uintKeys
*/
function getAttributes(
address collection,
uint256 tokenId,
string[] memory addressKeys,
string[] memory boolKeys,
string[] memory bytesKeys,
string[] memory intKeys,
string[] memory stringKeys,
string[] memory uintKeys
)
external
view
returns (
address[] memory addressAttributes,
bool[] memory boolAttributes,
bytes[] memory bytesAttributes,
int256[] memory intAttributes,
string[] memory stringAttributes,
uint256[] memory uintAttributes
);
// ------------------- PREPARE PRESIGNED MESSAGES -------------------
/**
* @notice Used to retrieve the message to be signed for submitting a presigned address attribute change.
* @param collection The address of the collection smart contract of the token receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction after which the message is invalid
* @return message Raw message to be signed by the authorized account
*/
function prepareMessageToPresignAddressAttribute(
address collection,
uint256 tokenId,
string memory key,
address value,
uint256 deadline
) external view returns (bytes32 message);
/**
* @notice Used to retrieve the message to be signed for submitting a presigned bool attribute change.
* @param collection The address of the collection smart contract of the token receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction after which the message is invalid
* @return message Raw message to be signed by the authorized account
*/
function prepareMessageToPresignBoolAttribute(
address collection,
uint256 tokenId,
string memory key,
bool value,
uint256 deadline
) external view returns (bytes32 message);
/**
* @notice Used to retrieve the message to be signed for submitting a presigned bytes attribute change.
* @param collection The address of the collection smart contract of the token receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction after which the message is invalid
* @return message Raw message to be signed by the authorized account
*/
function prepareMessageToPresignBytesAttribute(
address collection,
uint256 tokenId,
string memory key,
bytes memory value,
uint256 deadline
) external view returns (bytes32 message);
/**
* @notice Used to retrieve the message to be signed for submitting a presigned int attribute change.
* @param collection The address of the collection smart contract of the token receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction after which the message is invalid
* @return message Raw message to be signed by the authorized account
*/
function prepareMessageToPresignIntAttribute(
address collection,
uint256 tokenId,
string memory key,
int256 value,
uint256 deadline
) external view returns (bytes32 message);
/**
* @notice Used to retrieve the message to be signed for submitting a presigned string attribute change.
* @param collection The address of the collection smart contract of the token receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction after which the message is invalid
* @return message Raw message to be signed by the authorized account
*/
function prepareMessageToPresignStringAttribute(
address collection,
uint256 tokenId,
string memory key,
string memory value,
uint256 deadline
) external view returns (bytes32 message);
/**
* @notice Used to retrieve the message to be signed for submitting a presigned uint attribute change.
* @param collection The address of the collection smart contract of the token receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction after which the message is invalid
* @return message Raw message to be signed by the authorized account
*/
function prepareMessageToPresignUintAttribute(
address collection,
uint256 tokenId,
string memory key,
uint256 value,
uint256 deadline
) external view returns (bytes32 message);
// ------------------- SETTERS -------------------
/**
* @notice Used to set an address attribute.
* @dev Emits a {AddressAttributeUpdated} event.
* @param collection Address of the collection receiving the attribute
* @param tokenId The token ID
* @param key The attribute key
* @param value The attribute value
*/
function setAddressAttribute(
address collection,
uint256 tokenId,
string memory key,
address value
) external;
/**
* @notice Used to set a boolean attribute.
* @dev Emits a {BoolAttributeUpdated} event.
* @param collection Address of the collection receiving the attribute
* @param tokenId The token ID
* @param key The attribute key
* @param value The attribute value
*/
function setBoolAttribute(
address collection,
uint256 tokenId,
string memory key,
bool value
) external;
/**
* @notice Used to set an bytes attribute.
* @dev Emits a {BytesAttributeUpdated} event.
* @param collection Address of the collection receiving the attribute
* @param tokenId The token ID
* @param key The attribute key
* @param value The attribute value
*/
function setBytesAttribute(
address collection,
uint256 tokenId,
string memory key,
bytes memory value
) external;
/**
* @notice Used to set a signed number attribute.
* @dev Emits a {IntAttributeUpdated} event.
* @param collection Address of the collection receiving the attribute
* @param tokenId The token ID
* @param key The attribute key
* @param value The attribute value
*/
function setIntAttribute(
address collection,
uint256 tokenId,
string memory key,
int256 value
) external;
/**
* @notice Used to set a string attribute.
* @dev Emits a {StringAttributeUpdated} event.
* @param collection Address of the collection receiving the attribute
* @param tokenId The token ID
* @param key The attribute key
* @param value The attribute value
*/
function setStringAttribute(
address collection,
uint256 tokenId,
string memory key,
string memory value
) external;
/**
* @notice Used to set an unsigned number attribute.
* @dev Emits a {UintAttributeUpdated} event.
* @param collection Address of the collection receiving the attribute
* @param tokenId The token ID
* @param key The attribute key
* @param value The attribute value
*/
function setUintAttribute(
address collection,
uint256 tokenId,
string memory key,
uint256 value
) external;
// ------------------- BATCH SETTERS -------------------
/**
* @notice Sets multiple address attributes for a token at once.
* @dev The `AddressAttribute` struct contains the following fields:
* [
* string key,
* address value
* ]
* @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributes An array of `AddressAttribute` structs to be assigned to the given token
*/
function setAddressAttributes(
address[] memory collections,
uint256[] memory tokenIds,
AddressAttribute[] memory attributes
) external;
/**
* @notice Sets multiple bool attributes for a token at once.
* @dev The `BoolAttribute` struct contains the following fields:
* [
* string key,
* bool value
* ]
* @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributes An array of `BoolAttribute` structs to be assigned to the given token
*/
function setBoolAttributes(
address[] memory collections,
uint256[] memory tokenIds,
BoolAttribute[] memory attributes
) external;
/**
* @notice Sets multiple bytes attributes for a token at once.
* @dev The `BytesAttribute` struct contains the following fields:
* [
* string key,
* bytes value
* ]
* @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributes An array of `BytesAttribute` structs to be assigned to the given token
*/
function setBytesAttributes(
address[] memory collections,
uint256[] memory tokenIds,
BytesAttribute[] memory attributes
) external;
/**
* @notice Sets multiple int attributes for a token at once.
* @dev The `UintAttribute` struct contains the following fields:
* [
* string key,
* int value
* ]
* @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributes An array of `IntAttribute` structs to be assigned to the given token
*/
function setIntAttributes(
address[] memory collections,
uint256[] memory tokenIds,
IntAttribute[] memory attributes
) external;
/**
* @notice Sets multiple string attributes for a token at once.
* @dev The `StringAttribute` struct contains the following fields:
* [
* string key,
* string value
* ]
* @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributes An array of `StringAttribute` structs to be assigned to the given token
*/
function setStringAttributes(
address[] memory collections,
uint256[] memory tokenIds,
StringAttribute[] memory attributes
) external;
/**
* @notice Sets multiple uint attributes for a token at once.
* @dev The `UintAttribute` struct contains the following fields:
* [
* string key,
* uint value
* ]
* @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address.
* @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID.
* @param attributes An array of `UintAttribute` structs to be assigned to the given token
*/
function setUintAttributes(
address[] memory collections,
uint256[] memory tokenIds,
UintAttribute[] memory attributes
) external;
/**
* @notice Sets multiple attributes of multiple types for a token at the same time.
* @dev Emits a separate event for each attribute set.
* @dev The `StringAttribute`, `UintAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists
* to the following fields (where `value` is of the appropriate type):
* [
* key,
* value,
* ]
* @param collection The address of the collection
* @param tokenId The token ID
* @param addressAttributes An array of `AddressAttribute` structs containing address attributes to set
* @param boolAttributes An array of `BoolAttribute` structs containing bool attributes to set
* @param bytesAttributes An array of `BytesAttribute` structs containing bytes attributes to set
* @param intAttributes An array of `IntAttribute` structs containing int attributes to set
* @param stringAttributes An array of `StringAttribute` structs containing string attributes to set
* @param uintAttributes An array of `UintAttribute` structs containing uint attributes to set
*/
function setAttributes(
address collection,
uint256 tokenId,
AddressAttribute[] memory addressAttributes,
BoolAttribute[] memory boolAttributes,
BytesAttribute[] memory bytesAttributes,
IntAttribute[] memory intAttributes,
StringAttribute[] memory stringAttributes,
UintAttribute[] memory uintAttributes
) external;
// ------------------- PRESIGNED SETTERS -------------------
/**
* @notice Used to set the address attribute on behalf of an authorized account.
* @dev Emits a {AddressAttributeUpdated} event.
* @param setter Address of the account that presigned the attribute change
* @param collection Address of the collection receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction
* @param v `v` value of an ECDSA signature of the presigned message
* @param r `r` value of an ECDSA signature of the presigned message
* @param s `s` value of an ECDSA signature of the presigned message
*/
function presignedSetAddressAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
address value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @notice Used to set the bool attribute on behalf of an authorized account.
* @dev Emits a {BoolAttributeUpdated} event.
* @param setter Address of the account that presigned the attribute change
* @param collection Address of the collection receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction
* @param v `v` value of an ECDSA signature of the presigned message
* @param r `r` value of an ECDSA signature of the presigned message
* @param s `s` value of an ECDSA signature of the presigned message
*/
function presignedSetBoolAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
bool value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @notice Used to set the bytes attribute on behalf of an authorized account.
* @dev Emits a {BytesAttributeUpdated} event.
* @param setter Address of the account that presigned the attribute change
* @param collection Address of the collection receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction
* @param v `v` value of an ECDSA signature of the presigned message
* @param r `r` value of an ECDSA signature of the presigned message
* @param s `s` value of an ECDSA signature of the presigned message
*/
function presignedSetBytesAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
bytes memory value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @notice Used to set the int attribute on behalf of an authorized account.
* @dev Emits a {IntAttributeUpdated} event.
* @param setter Address of the account that presigned the attribute change
* @param collection Address of the collection receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction
* @param v `v` value of an ECDSA signature of the presigned message
* @param r `r` value of an ECDSA signature of the presigned message
* @param s `s` value of an ECDSA signature of the presigned message
*/
function presignedSetIntAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
int256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @notice Used to set the string attribute on behalf of an authorized account.
* @dev Emits a {StringAttributeUpdated} event.
* @param setter Address of the account that presigned the attribute change
* @param collection Address of the collection receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction
* @param v `v` value of an ECDSA signature of the presigned message
* @param r `r` value of an ECDSA signature of the presigned message
* @param s `s` value of an ECDSA signature of the presigned message
*/
function presignedSetStringAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
string memory value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @notice Used to set the uint attribute on behalf of an authorized account.
* @dev Emits a {UintAttributeUpdated} event.
* @param setter Address of the account that presigned the attribute change
* @param collection Address of the collection receiving the attribute
* @param tokenId The ID of the token receiving the attribute
* @param key The attribute key
* @param value The attribute value
* @param deadline The deadline timestamp for the presigned transaction
* @param v `v` value of an ECDSA signature of the presigned message
* @param r `r` value of an ECDSA signature of the presigned message
* @param s `s` value of an ECDSA signature of the presigned message
*/
function presignedSetUintAttribute(
address setter,
address collection,
uint256 tokenId,
string memory key,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
}{
"remappings": [
"@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
"@rmrk-team/evm-contracts/=contracts/",
"hardhat/=node_modules/hardhat/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "london",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"CollaboratorArraysNotEqualLength","type":"error"},{"inputs":[],"name":"CollectionNotRegistered","type":"error"},{"inputs":[],"name":"ExpiredDeadline","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"LengthsMismatch","type":"error"},{"inputs":[],"name":"NotCollectionCollaborator","type":"error"},{"inputs":[],"name":"NotCollectionOwner","type":"error"},{"inputs":[],"name":"NotCollectionOwnerOrCollaborator","type":"error"},{"inputs":[],"name":"NotSpecificAddress","type":"error"},{"inputs":[],"name":"NotTokenOwner","type":"error"},{"inputs":[],"name":"OwnableNotImplemented","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"registeringAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"useOwnable","type":"bool"}],"name":"AccessControlRegistration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"enum IERC7508.AccessType","name":"accessType","type":"uint8"},{"indexed":false,"internalType":"address","name":"specificAddress","type":"address"}],"name":"AccessControlUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"AddressAttributeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"BoolAttributeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"BytesAttributeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"collaborator","type":"address"},{"indexed":false,"internalType":"bool","name":"isCollaborator","type":"bool"}],"name":"CollaboratorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"int256","name":"value","type":"int256"}],"name":"IntAttributeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"string","name":"attributesMetadataURI","type":"string"}],"name":"MetadataURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"StringAttributeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"UintAttributeUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_ADDRESS_ATTRIBUTE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_BOOL_ATTRIBUTE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_BYTES_ATTRIBUTE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_INT_ATTRIBUTE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_STRING_ATTRIBUTE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_UINT_ATTRIBUTE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getAddressAttribute","outputs":[{"internalType":"address","name":"attribute","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"attributeKeys","type":"string[]"}],"name":"getAddressAttributes","outputs":[{"internalType":"address[]","name":"attributes","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string[]","name":"addressKeys","type":"string[]"},{"internalType":"string[]","name":"boolKeys","type":"string[]"},{"internalType":"string[]","name":"bytesKeys","type":"string[]"},{"internalType":"string[]","name":"intKeys","type":"string[]"},{"internalType":"string[]","name":"stringKeys","type":"string[]"},{"internalType":"string[]","name":"uintKeys","type":"string[]"}],"name":"getAttributes","outputs":[{"internalType":"address[]","name":"addressAttributes","type":"address[]"},{"internalType":"bool[]","name":"boolAttributes","type":"bool[]"},{"internalType":"bytes[]","name":"bytesAttributes","type":"bytes[]"},{"internalType":"int256[]","name":"intAttributes","type":"int256[]"},{"internalType":"string[]","name":"stringAttributes","type":"string[]"},{"internalType":"uint256[]","name":"uintAttributes","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"getAttributesMetadataURIForCollection","outputs":[{"internalType":"string","name":"attributesMetadataURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getBoolAttribute","outputs":[{"internalType":"bool","name":"attribute","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"attributeKeys","type":"string[]"}],"name":"getBoolAttributes","outputs":[{"internalType":"bool[]","name":"attributes","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getBytesAttribute","outputs":[{"internalType":"bytes","name":"attribute","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"attributeKeys","type":"string[]"}],"name":"getBytesAttributes","outputs":[{"internalType":"bytes[]","name":"attributes","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getIntAttribute","outputs":[{"internalType":"int256","name":"attribute","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"attributeKeys","type":"string[]"}],"name":"getIntAttributes","outputs":[{"internalType":"int256[]","name":"attributes","type":"int256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getStringAttribute","outputs":[{"internalType":"string","name":"attribute","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"attributeKeys","type":"string[]"}],"name":"getStringAttributes","outputs":[{"internalType":"string[]","name":"attributes","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getUintAttribute","outputs":[{"internalType":"uint256","name":"attribute","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"attributeKeys","type":"string[]"}],"name":"getUintAttributes","outputs":[{"internalType":"uint256[]","name":"attributes","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collaborator","type":"address"},{"internalType":"address","name":"collection","type":"address"}],"name":"isCollaborator","outputs":[{"internalType":"bool","name":"isCollaborator_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"specificAddress","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"string","name":"key","type":"string"}],"name":"isSpecificAddress","outputs":[{"internalType":"bool","name":"isSpecificAddress_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"string","name":"key","type":"string"},{"internalType":"enum IERC7508.AccessType","name":"accessType","type":"uint8"},{"internalType":"address","name":"specificAddress","type":"address"}],"name":"manageAccessControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address[]","name":"collaboratorAddresses","type":"address[]"},{"internalType":"bool[]","name":"collaboratorAddressAccess","type":"bool[]"}],"name":"manageCollaborators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"prepareMessageToPresignAddressAttribute","outputs":[{"internalType":"bytes32","name":"message","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"prepareMessageToPresignBoolAttribute","outputs":[{"internalType":"bytes32","name":"message","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"prepareMessageToPresignBytesAttribute","outputs":[{"internalType":"bytes32","name":"message","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"prepareMessageToPresignIntAttribute","outputs":[{"internalType":"bytes32","name":"message","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"prepareMessageToPresignStringAttribute","outputs":[{"internalType":"bytes32","name":"message","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"prepareMessageToPresignUintAttribute","outputs":[{"internalType":"bytes32","name":"message","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"presignedSetAddressAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"presignedSetBoolAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"presignedSetBytesAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"presignedSetIntAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"presignedSetStringAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"presignedSetUintAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"useOwnable","type":"bool"}],"name":"registerAccessControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"name":"setAddressAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct IERC7508.AddressAttribute[]","name":"attributes","type":"tuple[]"}],"name":"setAddressAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct IERC7508.AddressAttribute[]","name":"addressAttributes","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct IERC7508.BoolAttribute[]","name":"boolAttributes","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct IERC7508.BytesAttribute[]","name":"bytesAttributes","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct IERC7508.IntAttribute[]","name":"intAttributes","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct IERC7508.StringAttribute[]","name":"stringAttributes","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct IERC7508.UintAttribute[]","name":"uintAttributes","type":"tuple[]"}],"name":"setAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"string","name":"attributesMetadataURI","type":"string"}],"name":"setAttributesMetadataURIForCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBoolAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct IERC7508.BoolAttribute[]","name":"attributes","type":"tuple[]"}],"name":"setBoolAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"setBytesAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct IERC7508.BytesAttribute[]","name":"attributes","type":"tuple[]"}],"name":"setBytesAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"name":"setIntAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct IERC7508.IntAttribute[]","name":"attributes","type":"tuple[]"}],"name":"setIntAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setStringAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct IERC7508.StringAttribute[]","name":"attributes","type":"tuple[]"}],"name":"setStringAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setUintAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct IERC7508.UintAttribute[]","name":"attributes","type":"tuple[]"}],"name":"setUintAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806101808181526033610200527f4552432d373530383a205075626c6963204f6e2d436861696e204e4654204174610220527f7472696275746573205265706f7369746f7279000000000000000000000000006102405260e06101a0819052600161026052603160f81b61028052466101c052306101e0526101206101608190526102a0604052918290209092527f20772140fdb3d071eaa7b3c498d767632d85382eadebf1c930637df53bdb772f60a0527fd6894c18c4d0255a2eb79703e3188bebbf84a0508aa8f3b08916dbe9cf4706f060c0527f62f1fea563417698e0150e612482a1413def1f1206fd1c85981ff0bd9ffb5f889091527fb44b995c45c2bef12a1ba33bc54e45cbbdd566df618a1d8d769adc7f90212114610100527f8d7561f54c33dc0cf43c405f24523cfbf86f6c991e371994b70c7f65bf87406e90527fb6d8284afd9120a0a19f8dd4bb0119595e5fb90b1c0a48c239b3e001105fdf4b6101405234801561017357600080fd5b5060805160a05160c05160e051610100516101205161014051615369610268600039600081816106600152818161206f01526129e20152600081816105d901528181611d5101526129830152600081816107f0015281816121d00152612dff0152600081816106ad01528181610ea901526113dc01526000610639015260008181610817015281816115ac01528181611e09015261243901526000818161046a01528181610e88015281816113bb0152818161158b01528181611d3001528181611de80152818161204e015281816121af0152818161241801528181612962015281816129c10152612dde01526153696000f3fe608060405234801561001057600080fd5b50600436106103255760003560e01c806369a2b5f1116101b8578063b8f4e18a11610104578063cedb3f89116100a2578063e482c4a21161007c578063e482c4a2146107eb578063e7bc745414610812578063ed20867214610839578063f891efa61461070857600080fd5b8063cedb3f89146107b2578063dacdb1a2146107c5578063e3698a9c146107d857600080fd5b8063bf65cf66116100de578063bf65cf6614610766578063c034868c14610779578063c58281bc1461078c578063cc9cc3721461079f57600080fd5b8063b8f4e18a1461071b578063b9fea13914610740578063bcbf00261461075357600080fd5b80638c79e5f6116101715780639ccf774f1161014b5780639ccf774f146106cf578063acb80ac8146106e2578063ad965b35146106f5578063b43c50e21461070857600080fd5b80638c79e5f61461068257806399ce1b6a1461069557806399d58b18146106a857600080fd5b806369a2b5f1146105d45780636a97da2b146105fb578063700a9fe21461060e5780637821d1551461062157806386d86ae214610634578063890d6d5d1461065b57600080fd5b80633806d3841161027757806358d7ac36116102305780635e63d0191161020a5780635e63d0191461057b578063622a61e11461058e578063649dde6a146105a15780636592caf6146105b457600080fd5b806358d7ac36146105355780635d1d61b6146105485780635d5443c91461056857600080fd5b80633806d3841461048c5780633b4afbe5146104ac578063473dc551146104e95780634a70d109146104fc57806350fc17281461050f57806355c930461461052257600080fd5b806314ac5b39116102e45780631b8bfea3116102be5780631b8bfea31461042c5780631bc69cca1461043f5780632d793515146104525780633644e5151461046557600080fd5b806314ac5b39146103d95780631785d515146103f957806319c4fb5d1461041957600080fd5b8062137cbb1461032a57806274b0571461033f57806301ffc9a71461035257806305c559421461037a578063062d49aa1461038d5780630c7af259146103ae575b600080fd5b61033d61033836600461395a565b61084c565b005b61033d61034d3660046139a9565b6109b5565b610365610360366004613a21565b610bc0565b60405190151581526020015b60405180910390f35b61033d610388366004613af9565b610bf7565b6103a061039b366004613bcb565b610e84565b604051908152602001610371565b6103c16103bc366004613c52565b610f04565b6040516001600160a01b039091168152602001610371565b6103ec6103e7366004613d84565b610f6b565b6040516103719190613e3e565b61040c610407366004613d84565b6110c6565b6040516103719190613e81565b61033d610427366004613e94565b611210565b6103a061043a366004613c52565b611223565b61033d61044d366004613efd565b611280565b61033d610460366004613f5d565b61128d565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61049f61049a366004613c52565b61129a565b604051610371919061400d565b6103656104ba366004614020565b6001600160a01b0390811660009081526003602090815260408083209490931682529290925290205460ff1690565b6103a06104f7366004613c52565b611381565b61033d61050a36600461406a565b6113b7565b61033d61051d3660046141e8565b61147b565b61033d610530366004614265565b611587565b61049f610543366004613c52565b61163f565b61055b610556366004613d84565b611677565b6040516103719190614323565b61033d610576366004614687565b6117ce565b610365610589366004614797565b611a00565b61036561059c366004613c52565b611a75565b61033d6105af3660046147e2565b611ad6565b6105c76105c2366004613d84565b611bd8565b60405161037191906148b4565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61033d61060936600461406a565b611d2c565b61033d61061c366004614265565b611de4565b61033d61062f3660046141e8565b611e9c565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61049f6106903660046148c7565b611f9e565b6103a06106a33660046148e4565b61204a565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61033d6106dd366004614957565b6120a9565b61033d6106f03660046149d4565b6121ab565b61033d610703366004614a60565b612263565b6103a0610716366004614aa7565b612414565b61072e610729366004614b11565b612473565b60405161037196959493929190614c11565b61040c61074e366004613d84565b612821565b6103a0610761366004613bcb565b61295e565b61033d610774366004614c93565b6129bd565b6105c7610787366004613d84565b612a75565b61033d61079a366004614d0c565b612bbc565b61033d6107ad366004614d8b565b612bc9565b61033d6107c0366004614d0c565b612ccb565b61033d6107d3366004614e08565b612cd8565b6103a06107e6366004614e85565b612dda565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61033d610847366004613efd565b612e39565b6001600160a01b0382166000908152600260205260409020548290610100900460ff161561090c57336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e09190614ee5565b6001600160a01b031614610907576040516327ecd79f60e11b815260040160405180910390fd5b61094c565b6001600160a01b0381811660009081526002602052604090205462010000900416331461094c576040516327ecd79f60e11b815260040160405180910390fd5b6001600160a01b038316600090815260066020526040902061096e8382614f8b565b50826001600160a01b03167f1b460238cb695fc31c141a22bca8cea3e92a6fa4ded4ccee2a33f9972f2eece0836040516109a8919061400d565b60405180910390a2505050565b6001600160a01b038416600090815260026020526040902054849060ff166109f057604051632a5cc95960e21b815260040160405180910390fd5b6001600160a01b0385166000908152600260205260409020548590610100900460ff1615610ab057336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a849190614ee5565b6001600160a01b031614610aab576040516327ecd79f60e11b815260040160405180910390fd5b610af0565b6001600160a01b03818116600090815260026020526040902054620100009004163314610af0576040516327ecd79f60e11b815260040160405180910390fd5b6000610afb86612e46565b6001600160a01b03881660009081526020818152604080832084845290915290208054919250869160ff19166001836004811115610b3b57610b3b61504a565b02179055506001600160a01b0387811660008181526001602090815260408083208684529091529081902080546001600160a01b0319169388169390931790925590517f97d2a2ba740da24a4e4a4e94fd62999fa5917e0df31c996b0305550a292673a990610baf90899089908990615060565b60405180910390a250505050505050565b60006001600160e01b0319821663042440d560e31b1480610bf157506001600160e01b031982166301ffc9a760e01b145b92915050565b6001600160a01b038316600090815260026020526040902054839060ff16610c3257604051632a5cc95960e21b815260040160405180910390fd5b6001600160a01b0384166000908152600260205260409020548490610100900460ff1615610cf257336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190614ee5565b6001600160a01b031614610ced576040516327ecd79f60e11b815260040160405180910390fd5b610d32565b6001600160a01b03818116600090815260026020526040902054620100009004163314610d32576040516327ecd79f60e11b815260040160405180910390fd5b835183518114610d5557604051630b13873760e01b815260040160405180910390fd5b60005b81811015610e7b57848181518110610d7257610d726150b2565b602002602001015160036000896001600160a01b03166001600160a01b031681526020019081526020016000206000888481518110610db357610db36150b2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550858181518110610e0457610e046150b2565b60200260200101516001600160a01b0316876001600160a01b03167f5ce2cdea67a188cbf267b966a3a0d897f902c098d0b718269e43dd3cd618761a878481518110610e5257610e526150b2565b6020026020010151604051610e6b911515815260200190565b60405180910390a3600101610d58565b50505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008787878787604051602001610ee397969594939291906150c8565b60405160208183030381529060405280519060200120905095945050505050565b6001600160a01b038316600090815260076020908152604080832085845290915280822090518290600490610f3a908690615122565b90815260408051602092819003830190205483529082019290925201600020546001600160a01b0316949350505050565b6060600080600080610f7f88888851612ed6565b9350935093509350806001600160401b03811115610f9f57610f9f61387d565b604051908082528060200260200182016040528015610fc8578160200160208202803683370190505b50945060005b818110156110ba5761109085610ffe5789600081518110610ff157610ff16150b2565b6020026020010151611019565b898281518110611010576110106150b2565b60200260200101515b8561103e5789600081518110611031576110316150b2565b6020026020010151611059565b898381518110611050576110506150b2565b60200260200101515b8561107e5789600081518110611071576110716150b2565b6020026020010151611a75565b898481518110611071576110716150b2565b8682815181106110a2576110a26150b2565b91151560209283029190910190910152600101610fce565b50505050509392505050565b60606000806000806110da88888851612ed6565b9350935093509350806001600160401b038111156110fa576110fa61387d565b604051908082528060200260200182016040528015611123578160200160208202803683370190505b50945060005b818110156110ba576111eb85611159578960008151811061114c5761114c6150b2565b6020026020010151611174565b89828151811061116b5761116b6150b2565b60200260200101515b85611199578960008151811061118c5761118c6150b2565b60200260200101516111b4565b8983815181106111ab576111ab6150b2565b60200260200101515b856111d957896000815181106111cc576111cc6150b2565b6020026020010151611223565b8984815181106111cc576111cc6150b2565b8682815181106111fd576111fd6150b2565b6020908102919091010152600101611129565b61121d3385858585612f85565b50505050565b6001600160a01b038316600090815260096020908152604080832085845290915280822090518290600490611259908690615122565b90815260200160405180910390205481526020019081526020016000205490509392505050565b61121d338585858561302f565b61121d33858585856130b7565b6001600160a01b03831660009081526008602090815260408083208584529091528082209051606092906004906112d2908690615122565b908152602001604051809103902054815260200190815260200160002080546112fa90614f02565b80601f016020809104026020016040519081016040528092919081815260200182805461132690614f02565b80156113735780601f1061134857610100808354040283529160200191611373565b820191906000526020600020905b81548152906001019060200180831161135657829003601f168201915b505050505090509392505050565b6001600160a01b0383166000908152600a6020908152604080832085845290915280822090518290600490611259908690615122565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a8a60405160200161141697969594939291906150c8565b6040516020818303038152906040528051906020012060405160200161143c919061513e565b6040516020818303038152906040528051906020012090506114628a8683878787613152565b61146f8a8a8a8a8a613205565b50505050505050505050565b60008060008061148d87878751612ed6565b935093509350935060005b8181101561157d576000836114c757866000815181106114ba576114ba6150b2565b60200260200101516114e2565b8682815181106114d9576114d96150b2565b60200260200101515b9050611574338761150d578a600081518110611500576115006150b2565b6020026020010151611528565b8a848151811061151f5761151f6150b2565b60200260200101515b8761154d578a600081518110611540576115406150b2565b6020026020010151611568565b8a858151811061155f5761155f6150b2565b60200260200101515b84516020860151613296565b50600101611498565b5050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a8a6040516020016115e6979695949392919061516f565b6040516020818303038152906040528051906020012060405160200161160c919061513e565b6040516020818303038152906040528051906020012090506116328a8683878787613152565b61146f8a8a8a8a8a61302f565b6001600160a01b0383166000908152600c602090815260408083208584529091528082209051606092906004906112d2908690615122565b606060008060008061168b88888851612ed6565b9350935093509350806001600160401b038111156116ab576116ab61387d565b6040519080825280602002602001820160405280156116d4578160200160208202803683370190505b50945060005b818110156110ba5761179c8561170a57896000815181106116fd576116fd6150b2565b6020026020010151611725565b89828151811061171c5761171c6150b2565b60200260200101515b8561174a578960008151811061173d5761173d6150b2565b6020026020010151611765565b89838151811061175c5761175c6150b2565b60200260200101515b8561178a578960008151811061177d5761177d6150b2565b6020026020010151610f04565b89848151811061177d5761177d6150b2565b8682815181106117ae576117ae6150b2565b6001600160a01b03909216602092830291909101909101526001016116da565b815160005b8181101561182a57611822338b8b8785815181106117f3576117f36150b2565b602002602001015160000151888681518110611811576118116150b2565b602002602001015160200151613205565b6001016117d3565b5050805160005b8181101561188857611880338b8b868581518110611851576118516150b2565b60200260200101516000015187868151811061186f5761186f6150b2565b602002602001015160200151613296565b600101611831565b5050825160005b818110156118e6576118de338b8b8885815181106118af576118af6150b2565b6020026020010151600001518986815181106118cd576118cd6150b2565b60200260200101516020015161302f565b60010161188f565b5050845160005b818110156119445761193c338b8b8a858151811061190d5761190d6150b2565b6020026020010151600001518b868151811061192b5761192b6150b2565b602002602001015160200151612f85565b6001016118ed565b5050855160005b818110156119a25761199a338b8b8b858151811061196b5761196b6150b2565b6020026020010151600001518c8681518110611989576119896150b2565b6020026020010151602001516130b7565b60010161194b565b5050835160005b8181101561146f576119f8338b8b8985815181106119c9576119c96150b2565b6020026020010151600001518a86815181106119e7576119e76150b2565b60200260200101516020015161331e565b6001016119a9565b6000836001600160a01b031660016000856001600160a01b03166001600160a01b031681526020019081526020016000206000600485604051611a439190615122565b90815260408051602092819003830190205483529082019290925201600020546001600160a01b031614949350505050565b6001600160a01b0383166000908152600b6020908152604080832085845290915280822090518290600490611aab908690615122565b908152604080516020928190038301902054835290820192909252016000205460ff16949350505050565b600080600080611ae887878751612ed6565b935093509350935060005b8181101561157d57600083611b225786600081518110611b1557611b156150b2565b6020026020010151611b3d565b868281518110611b3457611b346150b2565b60200260200101515b9050611bcf3387611b68578a600081518110611b5b57611b5b6150b2565b6020026020010151611b83565b8a8481518110611b7a57611b7a6150b2565b60200260200101515b87611ba8578a600081518110611b9b57611b9b6150b2565b6020026020010151611bc3565b8a8581518110611bba57611bba6150b2565b60200260200101515b845160208601516130b7565b50600101611af3565b6060600080600080611bec88888851612ed6565b9350935093509350806001600160401b03811115611c0c57611c0c61387d565b604051908082528060200260200182016040528015611c3f57816020015b6060815260200190600190039081611c2a5790505b50945060005b818110156110ba57611d0785611c755789600081518110611c6857611c686150b2565b6020026020010151611c90565b898281518110611c8757611c876150b2565b60200260200101515b85611cb55789600081518110611ca857611ca86150b2565b6020026020010151611cd0565b898381518110611cc757611cc76150b2565b60200260200101515b85611cf55789600081518110611ce857611ce86150b2565b602002602001015161163f565b898481518110611ce857611ce86150b2565b868281518110611d1957611d196150b2565b6020908102919091010152600101611c45565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a8a604051602001611d8b97969594939291906150c8565b60405160208183030381529060405280519060200120604051602001611db1919061513e565b604051602081830303815290604052805190602001209050611dd78a8683878787613152565b61146f8a8a8a8a8a61331e565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a8a604051602001611e43979695949392919061516f565b60405160208183030381529060405280519060200120604051602001611e69919061513e565b604051602081830303815290604052805190602001209050611e8f8a8683878787613152565b61146f8a8a8a8a8a613296565b600080600080611eae87878751612ed6565b935093509350935060005b8181101561157d57600083611ee85786600081518110611edb57611edb6150b2565b6020026020010151611f03565b868281518110611efa57611efa6150b2565b60200260200101515b9050611f953387611f2e578a600081518110611f2157611f216150b2565b6020026020010151611f49565b8a8481518110611f4057611f406150b2565b60200260200101515b87611f6e578a600081518110611f6157611f616150b2565b6020026020010151611f89565b8a8581518110611f8057611f806150b2565b60200260200101515b8451602086015161302f565b50600101611eb9565b6001600160a01b0381166000908152600660205260409020805460609190611fc590614f02565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff190614f02565b801561203e5780601f106120135761010080835404028352916020019161203e565b820191906000526020600020905b81548152906001019060200180831161202157829003601f168201915b50505050509050919050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008787878787604051602001610ee397969594939291906151b8565b6000806000806120bb87878751612ed6565b935093509350935060005b8181101561157d576000836120f557866000815181106120e8576120e86150b2565b6020026020010151612110565b868281518110612107576121076150b2565b60200260200101515b90506121a2338761213b578a60008151811061212e5761212e6150b2565b6020026020010151612156565b8a848151811061214d5761214d6150b2565b60200260200101515b8761217b578a60008151811061216e5761216e6150b2565b6020026020010151612196565b8a858151811061218d5761218d6150b2565b60200260200101515b8451602086015161331e565b506001016120c6565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a8a60405160200161220a9796959493929190615201565b60405160208183030381529060405280519060200120604051602001612230919061513e565b6040516020818303038152906040528051906020012090506122568a8683878787613152565b61146f8a8a8a8a8a612f85565b60408051600481526024810182526020810180516001600160e01b0316638da5cb5b60e01b179052905160009182916001600160a01b038716916122a691615122565b6000604051808303816000865af19150503d80600081146122e3576040519150601f19603f3d011682016040523d82523d6000602084013e6122e8565b606091505b50909250905060006122f98261524a565b6001600160a01b03160361232057604051632384b66d60e01b815260040160405180910390fd5b81801561233e5750336123328261524a565b6001600160a01b031614155b1561235c576040516327ecd79f60e11b815260040160405180910390fd5b604080516060810182526001815284151560208083018281526001600160a01b038981168587018181528c83166000818152600287528990209751885495519251909416620100000262010000600160b01b03199215156101000261ff00199515159590951661ffff19909616959095179390931716929092179094559351918252339392917f961c9ccd18ff75f83e58597107ced585c08a0514de45947c8aa7a0d5fdf67d18910160405180910390a45050505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008787878787604051602001610ee3979695949392919061516f565b60608060608060608087516001600160401b038111156124955761249561387d565b6040519080825280602002602001820160405280156124c857816020015b60608152602001906001900390816124b35790505b50915060005b8851811015612513576124ee8f8f8b8481518110611ce857611ce86150b2565b838281518110612500576125006150b2565b60209081029190910101526001016124ce565b5086516001600160401b0381111561252d5761252d61387d565b604051908082528060200260200182016040528015612556578160200160208202803683370190505b50905060005b87518110156125a15761257c8f8f8a84815181106111cc576111cc6150b2565b82828151811061258e5761258e6150b2565b602090810291909101015260010161255c565b5088516001600160401b038111156125bb576125bb61387d565b6040519080825280602002602001820160405280156125e4578160200160208202803683370190505b50925060005b895181101561263c576126178f8f8c848151811061260a5761260a6150b2565b6020026020010151611381565b848281518110612629576126296150b2565b60209081029190910101526001016125ea565b508a516001600160401b038111156126565761265661387d565b60405190808252806020026020018201604052801561267f578160200160208202803683370190505b50945060005b8b518110156126cf576126a58f8f8e8481518110611071576110716150b2565b8682815181106126b7576126b76150b2565b91151560209283029190910190910152600101612685565b508b516001600160401b038111156126e9576126e961387d565b604051908082528060200260200182016040528015612712578160200160208202803683370190505b50955060005b8c5181101561276a576127388f8f8f848151811061177d5761177d6150b2565b87828151811061274a5761274a6150b2565b6001600160a01b0390921660209283029190910190910152600101612718565b5089516001600160401b038111156127845761278461387d565b6040519080825280602002602001820160405280156127b757816020015b60608152602001906001900390816127a25790505b50935060005b8a5181101561280f576127ea8f8f8d84815181106127dd576127dd6150b2565b602002602001015161129a565b8582815181106127fc576127fc6150b2565b60209081029190910101526001016127bd565b50985098509850985098509892505050565b606060008060008061283588888851612ed6565b9350935093509350806001600160401b038111156128555761285561387d565b60405190808252806020026020018201604052801561287e578160200160208202803683370190505b50945060005b818110156110ba57612939856128b457896000815181106128a7576128a76150b2565b60200260200101516128cf565b8982815181106128c6576128c66150b2565b60200260200101515b856128f457896000815181106128e7576128e76150b2565b602002602001015161290f565b898381518110612906576129066150b2565b60200260200101515b85612927578960008151811061260a5761260a6150b2565b89848151811061260a5761260a6150b2565b86828151811061294b5761294b6150b2565b6020908102919091010152600101612884565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008787878787604051602001610ee397969594939291906150c8565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a8a8a8a604051602001612a1c97969594939291906151b8565b60405160208183030381529060405280519060200120604051602001612a42919061513e565b604051602081830303815290604052805190602001209050612a688a8683878787613152565b61146f8a8a8a8a8a6130b7565b6060600080600080612a8988888851612ed6565b9350935093509350806001600160401b03811115612aa957612aa961387d565b604051908082528060200260200182016040528015612adc57816020015b6060815260200190600190039081612ac75790505b50945060005b818110156110ba57612b9785612b125789600081518110612b0557612b056150b2565b6020026020010151612b2d565b898281518110612b2457612b246150b2565b60200260200101515b85612b525789600081518110612b4557612b456150b2565b6020026020010151612b6d565b898381518110612b6457612b646150b2565b60200260200101515b85612b8557896000815181106127dd576127dd6150b2565b8984815181106127dd576127dd6150b2565b868281518110612ba957612ba96150b2565b6020908102919091010152600101612ae2565b61121d338585858561331e565b600080600080612bdb87878751612ed6565b935093509350935060005b8181101561157d57600083612c155786600081518110612c0857612c086150b2565b6020026020010151612c30565b868281518110612c2757612c276150b2565b60200260200101515b9050612cc23387612c5b578a600081518110612c4e57612c4e6150b2565b6020026020010151612c76565b8a8481518110612c6d57612c6d6150b2565b60200260200101515b87612c9b578a600081518110612c8e57612c8e6150b2565b6020026020010151612cb6565b8a8581518110612cad57612cad6150b2565b60200260200101515b84516020860151612f85565b50600101612be6565b61121d3385858585613205565b600080600080612cea87878751612ed6565b935093509350935060005b8181101561157d57600083612d245786600081518110612d1757612d176150b2565b6020026020010151612d3f565b868281518110612d3657612d366150b2565b60200260200101515b9050612dd13387612d6a578a600081518110612d5d57612d5d6150b2565b6020026020010151612d85565b8a8481518110612d7c57612d7c6150b2565b60200260200101515b87612daa578a600081518110612d9d57612d9d6150b2565b6020026020010151612dc5565b8a8581518110612dbc57612dbc6150b2565b60200260200101515b84516020860151613205565b50600101612cf5565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008787878787604051602001610ee39796959493929190615201565b61121d3385858585613296565b6000600482604051612e589190615122565b908152602001604051809103902054600003612eaf5760058054906000612e7e8361526e565b9190505550600554600483604051612e969190615122565b9081526040519081900360200190205550600554919050565b600482604051612ebf9190615122565b90815260200160405180910390205490505b919050565b8251825160019182148015929182141591841415906000908490612ef75750815b8015612f04575084875114155b80612f215750828015612f145750815b8015612f21575084865114155b80612f3f5750838015612f315750825b8015612f3f57508551875114155b15612f5d5760405163586cb9e160e01b815260040160405180910390fd5b8315612f6b57508551612f7c565b8215612f7957508451612f7c565b50835b93509350935093565b612f91858584866133af565b6001600160a01b0384166000908152600b6020908152604080832086845290915281208291612fbf85612e46565b815260200190815260200160002060006101000a81548160ff02191690831515021790555082846001600160a01b03167ffc6eac6df20a61ff9d8ec7453e452ca73931f2cb16944e9dc884b4a8d64239148484604051613020929190615295565b60405180910390a35050505050565b61303b858584866133af565b6001600160a01b0384166000908152600a602090815260408083208684529091528120829161306985612e46565b81526020019081526020016000208190555082846001600160a01b03167f0c10bed87f43a5875a921aa58c1428dcdefe61e5ed5c58bc96d7961ab34d4b9a84846040516130209291906152b9565b6130c3858584866133af565b6001600160a01b0384166000908152600760209081526040808320868452909152812082916130f185612e46565b81526020810191909152604090810160002080546001600160a01b0319166001600160a01b039384161790555184918616907f78ab16f2d097b9728046fb602022fccefef4ec306810b9e8b6fd618e91c122149061302090869086906152db565b844211156131735760405163f87d927160e01b815260040160405180910390fd5b6040805160008082526020820180845287905260ff861692820192909252606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156131c7573d6000803e3d6000fd5b505050602060405103519050866001600160a01b0316816001600160a01b031614610e7b57604051638baa579f60e01b815260040160405180910390fd5b613211858584866133af565b6001600160a01b0384166000908152600c602090815260408083208684529091528120829161323f85612e46565b815260200190815260200160002090816132599190614f8b565b5082846001600160a01b03167f11e1b2f69159e4bf02488e2c90bf30e6075a4bf57a39ce63ba83d10a96777c038484604051613020929190615305565b6132a2858584866133af565b6001600160a01b0384166000908152600960209081526040808320868452909152812082916132d085612e46565b81526020019081526020016000208190555082846001600160a01b03167f2b529d8c80cbea7dc71690ffd099111430f1e30963439b4659e9a1ec3fba578584846040516130209291906152b9565b61332a858584866133af565b6001600160a01b03841660009081526008602090815260408083208684529091528120829161335885612e46565b815260200190815260200160002090816133729190614f8b565b5082846001600160a01b03167f3e7f7fe71b156da17053b2814558642d261b19433ae77e083aac01f074124f378484604051613020929190615305565b6001600160a01b038316600090815260208190526040808220905182906004906133da908790615122565b9081526040805160209281900383019020548352908201929092520160009081205460ff1691508160048111156134135761341361504a565b14801561351257506001600160a01b038416600090815260026020526040902054610100900460ff1680156134bb5750846001600160a01b0316846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134af9190614ee5565b6001600160a01b031614155b8061351257506001600160a01b038416600090815260026020526040902054610100900460ff1615801561351257506001600160a01b03848116600090815260026020526040902054620100009004811690861614155b15613530576040516327ecd79f60e11b815260040160405180910390fd5b60018160048111156135445761354461504a565b14801561357757506001600160a01b0380851660009081526003602090815260408083209389168352929052205460ff16155b1561359557604051637dc99f8960e11b815260040160405180910390fd5b60028160048111156135a9576135a961504a565b1480156136a857506001600160a01b038416600090815260026020526040902054610100900460ff1680156136515750846001600160a01b0316846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613621573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136459190614ee5565b6001600160a01b031614155b806136a857506001600160a01b038416600090815260026020526040902054610100900460ff161580156136a857506001600160a01b03848116600090815260026020526040902054620100009004811690861614155b80156136da57506001600160a01b0380851660009081526003602090815260408083209389168352929052205460ff16155b156136f8576040516302da8d6360e31b815260040160405180910390fd5b600381600481111561370c5761370c61504a565b14801561378e57506040516331a9108f60e11b8152600481018390526001600160a01b038087169190861690636352211e90602401602060405180830381865afa15801561375e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137829190614ee5565b6001600160a01b031614155b156137ac576040516359dc379f60e01b815260040160405180910390fd5b60048160048111156137c0576137c061504a565b1480156138355750846001600160a01b031660016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006004866040516138099190615122565b90815260408051602092819003830190205483529082019290925201600020546001600160a01b031614155b15613853576040516370e2142360e11b815260040160405180910390fd5b5050505050565b6001600160a01b038116811461386f57600080fd5b50565b8035612ed18161385a565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156138b5576138b561387d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156138e3576138e361387d565b604052919050565b600082601f8301126138fc57600080fd5b81356001600160401b038111156139155761391561387d565b613928601f8201601f19166020016138bb565b81815284602083860101111561393d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561396d57600080fd5b82356139788161385a565b915060208301356001600160401b0381111561399357600080fd5b61399f858286016138eb565b9150509250929050565b600080600080608085870312156139bf57600080fd5b84356139ca8161385a565b935060208501356001600160401b038111156139e557600080fd5b6139f1878288016138eb565b935050604085013560058110613a0657600080fd5b91506060850135613a168161385a565b939692955090935050565b600060208284031215613a3357600080fd5b81356001600160e01b031981168114613a4b57600080fd5b9392505050565b60006001600160401b03821115613a6b57613a6b61387d565b5060051b60200190565b600082601f830112613a8657600080fd5b81356020613a9b613a9683613a52565b6138bb565b82815260059290921b84018101918181019086841115613aba57600080fd5b8286015b84811015613ade578035613ad18161385a565b8352918301918301613abe565b509695505050505050565b80358015158114612ed157600080fd5b600080600060608486031215613b0e57600080fd5b8335613b198161385a565b92506020848101356001600160401b0380821115613b3657600080fd5b613b4288838901613a75565b94506040870135915080821115613b5857600080fd5b508501601f81018713613b6a57600080fd5b8035613b78613a9682613a52565b81815260059190911b82018301908381019089831115613b9757600080fd5b928401925b82841015613bbc57613bad84613ae9565b82529284019290840190613b9c565b80955050505050509250925092565b600080600080600060a08688031215613be357600080fd5b8535613bee8161385a565b94506020860135935060408601356001600160401b0380821115613c1157600080fd5b613c1d89838a016138eb565b94506060880135915080821115613c3357600080fd5b50613c40888289016138eb565b95989497509295608001359392505050565b600080600060608486031215613c6757600080fd5b8335613c728161385a565b92506020840135915060408401356001600160401b03811115613c9457600080fd5b613ca0868287016138eb565b9150509250925092565b600082601f830112613cbb57600080fd5b81356020613ccb613a9683613a52565b82815260059290921b84018101918181019086841115613cea57600080fd5b8286015b84811015613ade5780358352918301918301613cee565b600082601f830112613d1657600080fd5b81356020613d26613a9683613a52565b82815260059290921b84018101918181019086841115613d4557600080fd5b8286015b84811015613ade5780356001600160401b03811115613d685760008081fd5b613d768986838b01016138eb565b845250918301918301613d49565b600080600060608486031215613d9957600080fd5b83356001600160401b0380821115613db057600080fd5b613dbc87838801613a75565b94506020860135915080821115613dd257600080fd5b613dde87838801613caa565b93506040860135915080821115613df457600080fd5b50613ca086828701613d05565b600081518084526020808501945080840160005b83811015613e33578151151587529582019590820190600101613e15565b509495945050505050565b602081526000613a4b6020830184613e01565b600081518084526020808501945080840160005b83811015613e3357815187529582019590820190600101613e65565b602081526000613a4b6020830184613e51565b60008060008060808587031215613eaa57600080fd5b8435613eb58161385a565b93506020850135925060408501356001600160401b03811115613ed757600080fd5b613ee3878288016138eb565b925050613ef260608601613ae9565b905092959194509250565b60008060008060808587031215613f1357600080fd5b8435613f1e8161385a565b93506020850135925060408501356001600160401b03811115613f4057600080fd5b613f4c878288016138eb565b949793965093946060013593505050565b60008060008060808587031215613f7357600080fd5b8435613f7e8161385a565b93506020850135925060408501356001600160401b03811115613fa057600080fd5b613fac878288016138eb565b9250506060850135613a168161385a565b60005b83811015613fd8578181015183820152602001613fc0565b50506000910152565b60008151808452613ff9816020860160208601613fbd565b601f01601f19169290920160200192915050565b602081526000613a4b6020830184613fe1565b6000806040838503121561403357600080fd5b823561403e8161385a565b9150602083013561404e8161385a565b809150509250929050565b803560ff81168114612ed157600080fd5b60008060008060008060008060006101208a8c03121561408957600080fd5b89356140948161385a565b985060208a01356140a48161385a565b975060408a0135965060608a01356001600160401b03808211156140c757600080fd5b6140d38d838e016138eb565b975060808c01359150808211156140e957600080fd5b506140f68c828d016138eb565b95505060a08a0135935061410c60c08b01614059565b925060e08a013591506101008a013590509295985092959850929598565b600082601f83011261413b57600080fd5b8135602061414b613a9683613a52565b82815260059290921b8401810191818101908684111561416a57600080fd5b8286015b84811015613ade5780356001600160401b038082111561418e5760008081fd5b908801906040828b03601f19018113156141a85760008081fd5b6141b0613893565b87840135838111156141c25760008081fd5b6141d08d8a838801016138eb565b8252509201358683015250835291830191830161416e565b6000806000606084860312156141fd57600080fd5b83356001600160401b038082111561421457600080fd5b61422087838801613a75565b9450602086013591508082111561423657600080fd5b61424287838801613caa565b9350604086013591508082111561425857600080fd5b50613ca08682870161412a565b60008060008060008060008060006101208a8c03121561428457600080fd5b893561428f8161385a565b985060208a013561429f8161385a565b975060408a0135965060608a01356001600160401b038111156142c157600080fd5b6142cd8c828d016138eb565b96505060808a0135945060a08a0135935061410c60c08b01614059565b600081518084526020808501945080840160005b83811015613e335781516001600160a01b0316875295820195908201906001016142fe565b602081526000613a4b60208301846142ea565b600082601f83011261434757600080fd5b81356020614357613a9683613a52565b82815260059290921b8401810191818101908684111561437657600080fd5b8286015b84811015613ade5780356001600160401b038082111561439a5760008081fd5b908801906040828b03601f19018113156143b45760008081fd5b6143bc613893565b87840135838111156143ce5760008081fd5b6143dc8d8a838801016138eb565b82525092810135926143ed8461385a565b808801939093525050835291830191830161437a565b600082601f83011261441457600080fd5b81356020614424613a9683613a52565b82815260059290921b8401810191818101908684111561444357600080fd5b8286015b84811015613ade5780356001600160401b03808211156144675760008081fd5b908801906040828b03601f19018113156144815760008081fd5b614489613893565b878401358381111561449b5760008081fd5b6144a98d8a838801016138eb565b8252506144b7828501613ae9565b818901528652505050918301918301614447565b600082601f8301126144dc57600080fd5b813560206144ec613a9683613a52565b82815260059290921b8401810191818101908684111561450b57600080fd5b8286015b84811015613ade5780356001600160401b038082111561452f5760008081fd5b908801906040828b03601f19018113156145495760008081fd5b614551613893565b87840135838111156145635760008081fd5b6145718d8a838801016138eb565b8252509083013590828211156145875760008081fd5b6145958c89848701016138eb565b81890152865250505091830191830161450f565b600082601f8301126145ba57600080fd5b813560206145ca613a9683613a52565b82815260059290921b840181019181810190868411156145e957600080fd5b8286015b84811015613ade5780356001600160401b038082111561460d5760008081fd5b908801906040828b03601f19018113156146275760008081fd5b61462f613893565b87840135838111156146415760008081fd5b61464f8d8a838801016138eb565b8252509083013590828211156146655760008081fd5b6146738c89848701016138eb565b8189015286525050509183019183016145ed565b600080600080600080600080610100898b0312156146a457600080fd5b6146ad89613872565b97506020890135965060408901356001600160401b03808211156146d057600080fd5b6146dc8c838d01614336565b975060608b01359150808211156146f257600080fd5b6146fe8c838d01614403565b965060808b013591508082111561471457600080fd5b6147208c838d016144cb565b955060a08b013591508082111561473657600080fd5b6147428c838d0161412a565b945060c08b013591508082111561475857600080fd5b6147648c838d016145a9565b935060e08b013591508082111561477a57600080fd5b506147878b828c0161412a565b9150509295985092959890939650565b6000806000606084860312156147ac57600080fd5b83356147b78161385a565b925060208401356147c78161385a565b915060408401356001600160401b03811115613c9457600080fd5b6000806000606084860312156147f757600080fd5b83356001600160401b038082111561480e57600080fd5b61481a87838801613a75565b9450602086013591508082111561483057600080fd5b61483c87838801613caa565b9350604086013591508082111561485257600080fd5b50613ca086828701614336565b600081518084526020808501808196508360051b8101915082860160005b858110156148a7578284038952614895848351613fe1565b9885019893509084019060010161487d565b5091979650505050505050565b602081526000613a4b602083018461485f565b6000602082840312156148d957600080fd5b8135613a4b8161385a565b600080600080600060a086880312156148fc57600080fd5b85356149078161385a565b94506020860135935060408601356001600160401b0381111561492957600080fd5b614935888289016138eb565b93505060608601356149468161385a565b949793965091946080013592915050565b60008060006060848603121561496c57600080fd5b83356001600160401b038082111561498357600080fd5b61498f87838801613a75565b945060208601359150808211156149a557600080fd5b6149b187838801613caa565b935060408601359150808211156149c757600080fd5b50613ca0868287016144cb565b60008060008060008060008060006101208a8c0312156149f357600080fd5b89356149fe8161385a565b985060208a0135614a0e8161385a565b975060408a0135965060608a01356001600160401b03811115614a3057600080fd5b614a3c8c828d016138eb565b965050614a4b60808b01613ae9565b945060a08a0135935061410c60c08b01614059565b600080600060608486031215614a7557600080fd5b8335614a808161385a565b92506020840135614a908161385a565b9150614a9e60408501613ae9565b90509250925092565b600080600080600060a08688031215614abf57600080fd5b8535614aca8161385a565b94506020860135935060408601356001600160401b03811115614aec57600080fd5b614af8888289016138eb565b9598949750949560608101359550608001359392505050565b600080600080600080600080610100898b031215614b2e57600080fd5b614b3789613872565b97506020890135965060408901356001600160401b0380821115614b5a57600080fd5b614b668c838d01613d05565b975060608b0135915080821115614b7c57600080fd5b614b888c838d01613d05565b965060808b0135915080821115614b9e57600080fd5b614baa8c838d01613d05565b955060a08b0135915080821115614bc057600080fd5b614bcc8c838d01613d05565b945060c08b0135915080821115614be257600080fd5b614bee8c838d01613d05565b935060e08b0135915080821115614c0457600080fd5b506147878b828c01613d05565b60c081526000614c2460c08301896142ea565b8281036020840152614c368189613e01565b90508281036040840152614c4a818861485f565b90508281036060840152614c5e8187613e51565b90508281036080840152614c72818661485f565b905082810360a0840152614c868185613e51565b9998505050505050505050565b60008060008060008060008060006101208a8c031215614cb257600080fd5b8935614cbd8161385a565b985060208a0135614ccd8161385a565b975060408a0135965060608a01356001600160401b03811115614cef57600080fd5b614cfb8c828d016138eb565b96505060808a0135614a4b8161385a565b60008060008060808587031215614d2257600080fd5b8435614d2d8161385a565b93506020850135925060408501356001600160401b0380821115614d5057600080fd5b614d5c888389016138eb565b93506060870135915080821115614d7257600080fd5b50614d7f878288016138eb565b91505092959194509250565b600080600060608486031215614da057600080fd5b83356001600160401b0380821115614db757600080fd5b614dc387838801613a75565b94506020860135915080821115614dd957600080fd5b614de587838801613caa565b93506040860135915080821115614dfb57600080fd5b50613ca086828701614403565b600080600060608486031215614e1d57600080fd5b83356001600160401b0380821115614e3457600080fd5b614e4087838801613a75565b94506020860135915080821115614e5657600080fd5b614e6287838801613caa565b93506040860135915080821115614e7857600080fd5b50613ca0868287016145a9565b600080600080600060a08688031215614e9d57600080fd5b8535614ea88161385a565b94506020860135935060408601356001600160401b03811115614eca57600080fd5b614ed6888289016138eb565b93505061494660608701613ae9565b600060208284031215614ef757600080fd5b8151613a4b8161385a565b600181811c90821680614f1657607f821691505b602082108103614f3657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115614f8657600081815260208120601f850160051c81016020861015614f635750805b601f850160051c820191505b81811015614f8257828155600101614f6f565b5050505b505050565b81516001600160401b03811115614fa457614fa461387d565b614fb881614fb28454614f02565b84614f3c565b602080601f831160018114614fed5760008415614fd55750858301515b600019600386901b1c1916600185901b178555614f82565b600085815260208120601f198616915b8281101561501c57888601518255948401946001909101908401614ffd565b508582101561503a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b6060815260006150736060830186613fe1565b90506005841061509357634e487b7160e01b600052602160045260246000fd5b60208201939093526001600160a01b0391909116604090910152919050565b634e487b7160e01b600052603260045260246000fd5b87815286602082015260018060a01b038616604082015284606082015260e0608082015260006150fb60e0830186613fe1565b82810360a084015261510d8186613fe1565b9150508260c083015298975050505050505050565b60008251615134818460208701613fbd565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b87815286602082015260018060a01b038616604082015284606082015260e0608082015260006151a260e0830186613fe1565b60a08301949094525060c0015295945050505050565b878152866020820152600060018060a01b03808816604084015286606084015260e060808401526151ec60e0840187613fe1565b941660a08301525060c0015295945050505050565b87815286602082015260018060a01b038616604082015284606082015260e06080820152600061523460e0830186613fe1565b93151560a08301525060c0015295945050505050565b80516020808301519190811015614f365760001960209190910360031b1b16919050565b60006001820161528e57634e487b7160e01b600052601160045260246000fd5b5060010190565b6040815260006152a86040830185613fe1565b905082151560208301529392505050565b6040815260006152cc6040830185613fe1565b90508260208301529392505050565b6040815260006152ee6040830185613fe1565b905060018060a01b03831660208301529392505050565b6040815260006153186040830185613fe1565b828103602084015261532a8185613fe1565b9594505050505056fea264697066735822122050cecf49729830824fd5f0a36c5b59bffc6aae7bc56966509393f935f4d1652464736f6c63430008150033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103255760003560e01c806369a2b5f1116101b8578063b8f4e18a11610104578063cedb3f89116100a2578063e482c4a21161007c578063e482c4a2146107eb578063e7bc745414610812578063ed20867214610839578063f891efa61461070857600080fd5b8063cedb3f89146107b2578063dacdb1a2146107c5578063e3698a9c146107d857600080fd5b8063bf65cf66116100de578063bf65cf6614610766578063c034868c14610779578063c58281bc1461078c578063cc9cc3721461079f57600080fd5b8063b8f4e18a1461071b578063b9fea13914610740578063bcbf00261461075357600080fd5b80638c79e5f6116101715780639ccf774f1161014b5780639ccf774f146106cf578063acb80ac8146106e2578063ad965b35146106f5578063b43c50e21461070857600080fd5b80638c79e5f61461068257806399ce1b6a1461069557806399d58b18146106a857600080fd5b806369a2b5f1146105d45780636a97da2b146105fb578063700a9fe21461060e5780637821d1551461062157806386d86ae214610634578063890d6d5d1461065b57600080fd5b80633806d3841161027757806358d7ac36116102305780635e63d0191161020a5780635e63d0191461057b578063622a61e11461058e578063649dde6a146105a15780636592caf6146105b457600080fd5b806358d7ac36146105355780635d1d61b6146105485780635d5443c91461056857600080fd5b80633806d3841461048c5780633b4afbe5146104ac578063473dc551146104e95780634a70d109146104fc57806350fc17281461050f57806355c930461461052257600080fd5b806314ac5b39116102e45780631b8bfea3116102be5780631b8bfea31461042c5780631bc69cca1461043f5780632d793515146104525780633644e5151461046557600080fd5b806314ac5b39146103d95780631785d515146103f957806319c4fb5d1461041957600080fd5b8062137cbb1461032a57806274b0571461033f57806301ffc9a71461035257806305c559421461037a578063062d49aa1461038d5780630c7af259146103ae575b600080fd5b61033d61033836600461395a565b61084c565b005b61033d61034d3660046139a9565b6109b5565b610365610360366004613a21565b610bc0565b60405190151581526020015b60405180910390f35b61033d610388366004613af9565b610bf7565b6103a061039b366004613bcb565b610e84565b604051908152602001610371565b6103c16103bc366004613c52565b610f04565b6040516001600160a01b039091168152602001610371565b6103ec6103e7366004613d84565b610f6b565b6040516103719190613e3e565b61040c610407366004613d84565b6110c6565b6040516103719190613e81565b61033d610427366004613e94565b611210565b6103a061043a366004613c52565b611223565b61033d61044d366004613efd565b611280565b61033d610460366004613f5d565b61128d565b6103a07f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb181565b61049f61049a366004613c52565b61129a565b604051610371919061400d565b6103656104ba366004614020565b6001600160a01b0390811660009081526003602090815260408083209490931682529290925290205460ff1690565b6103a06104f7366004613c52565b611381565b61033d61050a36600461406a565b6113b7565b61033d61051d3660046141e8565b61147b565b61033d610530366004614265565b611587565b61049f610543366004613c52565b61163f565b61055b610556366004613d84565b611677565b6040516103719190614323565b61033d610576366004614687565b6117ce565b610365610589366004614797565b611a00565b61036561059c366004613c52565b611a75565b61033d6105af3660046147e2565b611ad6565b6105c76105c2366004613d84565b611bd8565b60405161037191906148b4565b6103a07f8d7561f54c33dc0cf43c405f24523cfbf86f6c991e371994b70c7f65bf87406e81565b61033d61060936600461406a565b611d2c565b61033d61061c366004614265565b611de4565b61033d61062f3660046141e8565b611e9c565b6103a07fd6894c18c4d0255a2eb79703e3188bebbf84a0508aa8f3b08916dbe9cf4706f081565b6103a07fb6d8284afd9120a0a19f8dd4bb0119595e5fb90b1c0a48c239b3e001105fdf4b81565b61049f6106903660046148c7565b611f9e565b6103a06106a33660046148e4565b61204a565b6103a07f62f1fea563417698e0150e612482a1413def1f1206fd1c85981ff0bd9ffb5f8881565b61033d6106dd366004614957565b6120a9565b61033d6106f03660046149d4565b6121ab565b61033d610703366004614a60565b612263565b6103a0610716366004614aa7565b612414565b61072e610729366004614b11565b612473565b60405161037196959493929190614c11565b61040c61074e366004613d84565b612821565b6103a0610761366004613bcb565b61295e565b61033d610774366004614c93565b6129bd565b6105c7610787366004613d84565b612a75565b61033d61079a366004614d0c565b612bbc565b61033d6107ad366004614d8b565b612bc9565b61033d6107c0366004614d0c565b612ccb565b61033d6107d3366004614e08565b612cd8565b6103a06107e6366004614e85565b612dda565b6103a07fb44b995c45c2bef12a1ba33bc54e45cbbdd566df618a1d8d769adc7f9021211481565b6103a07f20772140fdb3d071eaa7b3c498d767632d85382eadebf1c930637df53bdb772f81565b61033d610847366004613efd565b612e39565b6001600160a01b0382166000908152600260205260409020548290610100900460ff161561090c57336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e09190614ee5565b6001600160a01b031614610907576040516327ecd79f60e11b815260040160405180910390fd5b61094c565b6001600160a01b0381811660009081526002602052604090205462010000900416331461094c576040516327ecd79f60e11b815260040160405180910390fd5b6001600160a01b038316600090815260066020526040902061096e8382614f8b565b50826001600160a01b03167f1b460238cb695fc31c141a22bca8cea3e92a6fa4ded4ccee2a33f9972f2eece0836040516109a8919061400d565b60405180910390a2505050565b6001600160a01b038416600090815260026020526040902054849060ff166109f057604051632a5cc95960e21b815260040160405180910390fd5b6001600160a01b0385166000908152600260205260409020548590610100900460ff1615610ab057336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a849190614ee5565b6001600160a01b031614610aab576040516327ecd79f60e11b815260040160405180910390fd5b610af0565b6001600160a01b03818116600090815260026020526040902054620100009004163314610af0576040516327ecd79f60e11b815260040160405180910390fd5b6000610afb86612e46565b6001600160a01b03881660009081526020818152604080832084845290915290208054919250869160ff19166001836004811115610b3b57610b3b61504a565b02179055506001600160a01b0387811660008181526001602090815260408083208684529091529081902080546001600160a01b0319169388169390931790925590517f97d2a2ba740da24a4e4a4e94fd62999fa5917e0df31c996b0305550a292673a990610baf90899089908990615060565b60405180910390a250505050505050565b60006001600160e01b0319821663042440d560e31b1480610bf157506001600160e01b031982166301ffc9a760e01b145b92915050565b6001600160a01b038316600090815260026020526040902054839060ff16610c3257604051632a5cc95960e21b815260040160405180910390fd5b6001600160a01b0384166000908152600260205260409020548490610100900460ff1615610cf257336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190614ee5565b6001600160a01b031614610ced576040516327ecd79f60e11b815260040160405180910390fd5b610d32565b6001600160a01b03818116600090815260026020526040902054620100009004163314610d32576040516327ecd79f60e11b815260040160405180910390fd5b835183518114610d5557604051630b13873760e01b815260040160405180910390fd5b60005b81811015610e7b57848181518110610d7257610d726150b2565b602002602001015160036000896001600160a01b03166001600160a01b031681526020019081526020016000206000888481518110610db357610db36150b2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550858181518110610e0457610e046150b2565b60200260200101516001600160a01b0316876001600160a01b03167f5ce2cdea67a188cbf267b966a3a0d897f902c098d0b718269e43dd3cd618761a878481518110610e5257610e526150b2565b6020026020010151604051610e6b911515815260200190565b60405180910390a3600101610d58565b50505050505050565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f62f1fea563417698e0150e612482a1413def1f1206fd1c85981ff0bd9ffb5f888787878787604051602001610ee397969594939291906150c8565b60405160208183030381529060405280519060200120905095945050505050565b6001600160a01b038316600090815260076020908152604080832085845290915280822090518290600490610f3a908690615122565b90815260408051602092819003830190205483529082019290925201600020546001600160a01b0316949350505050565b6060600080600080610f7f88888851612ed6565b9350935093509350806001600160401b03811115610f9f57610f9f61387d565b604051908082528060200260200182016040528015610fc8578160200160208202803683370190505b50945060005b818110156110ba5761109085610ffe5789600081518110610ff157610ff16150b2565b6020026020010151611019565b898281518110611010576110106150b2565b60200260200101515b8561103e5789600081518110611031576110316150b2565b6020026020010151611059565b898381518110611050576110506150b2565b60200260200101515b8561107e5789600081518110611071576110716150b2565b6020026020010151611a75565b898481518110611071576110716150b2565b8682815181106110a2576110a26150b2565b91151560209283029190910190910152600101610fce565b50505050509392505050565b60606000806000806110da88888851612ed6565b9350935093509350806001600160401b038111156110fa576110fa61387d565b604051908082528060200260200182016040528015611123578160200160208202803683370190505b50945060005b818110156110ba576111eb85611159578960008151811061114c5761114c6150b2565b6020026020010151611174565b89828151811061116b5761116b6150b2565b60200260200101515b85611199578960008151811061118c5761118c6150b2565b60200260200101516111b4565b8983815181106111ab576111ab6150b2565b60200260200101515b856111d957896000815181106111cc576111cc6150b2565b6020026020010151611223565b8984815181106111cc576111cc6150b2565b8682815181106111fd576111fd6150b2565b6020908102919091010152600101611129565b61121d3385858585612f85565b50505050565b6001600160a01b038316600090815260096020908152604080832085845290915280822090518290600490611259908690615122565b90815260200160405180910390205481526020019081526020016000205490509392505050565b61121d338585858561302f565b61121d33858585856130b7565b6001600160a01b03831660009081526008602090815260408083208584529091528082209051606092906004906112d2908690615122565b908152602001604051809103902054815260200190815260200160002080546112fa90614f02565b80601f016020809104026020016040519081016040528092919081815260200182805461132690614f02565b80156113735780601f1061134857610100808354040283529160200191611373565b820191906000526020600020905b81548152906001019060200180831161135657829003601f168201915b505050505090509392505050565b6001600160a01b0383166000908152600a6020908152604080832085845290915280822090518290600490611259908690615122565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f62f1fea563417698e0150e612482a1413def1f1206fd1c85981ff0bd9ffb5f888a8a8a8a8a60405160200161141697969594939291906150c8565b6040516020818303038152906040528051906020012060405160200161143c919061513e565b6040516020818303038152906040528051906020012090506114628a8683878787613152565b61146f8a8a8a8a8a613205565b50505050505050505050565b60008060008061148d87878751612ed6565b935093509350935060005b8181101561157d576000836114c757866000815181106114ba576114ba6150b2565b60200260200101516114e2565b8682815181106114d9576114d96150b2565b60200260200101515b9050611574338761150d578a600081518110611500576115006150b2565b6020026020010151611528565b8a848151811061151f5761151f6150b2565b60200260200101515b8761154d578a600081518110611540576115406150b2565b6020026020010151611568565b8a858151811061155f5761155f6150b2565b60200260200101515b84516020860151613296565b50600101611498565b5050505050505050565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f20772140fdb3d071eaa7b3c498d767632d85382eadebf1c930637df53bdb772f8a8a8a8a8a6040516020016115e6979695949392919061516f565b6040516020818303038152906040528051906020012060405160200161160c919061513e565b6040516020818303038152906040528051906020012090506116328a8683878787613152565b61146f8a8a8a8a8a61302f565b6001600160a01b0383166000908152600c602090815260408083208584529091528082209051606092906004906112d2908690615122565b606060008060008061168b88888851612ed6565b9350935093509350806001600160401b038111156116ab576116ab61387d565b6040519080825280602002602001820160405280156116d4578160200160208202803683370190505b50945060005b818110156110ba5761179c8561170a57896000815181106116fd576116fd6150b2565b6020026020010151611725565b89828151811061171c5761171c6150b2565b60200260200101515b8561174a578960008151811061173d5761173d6150b2565b6020026020010151611765565b89838151811061175c5761175c6150b2565b60200260200101515b8561178a578960008151811061177d5761177d6150b2565b6020026020010151610f04565b89848151811061177d5761177d6150b2565b8682815181106117ae576117ae6150b2565b6001600160a01b03909216602092830291909101909101526001016116da565b815160005b8181101561182a57611822338b8b8785815181106117f3576117f36150b2565b602002602001015160000151888681518110611811576118116150b2565b602002602001015160200151613205565b6001016117d3565b5050805160005b8181101561188857611880338b8b868581518110611851576118516150b2565b60200260200101516000015187868151811061186f5761186f6150b2565b602002602001015160200151613296565b600101611831565b5050825160005b818110156118e6576118de338b8b8885815181106118af576118af6150b2565b6020026020010151600001518986815181106118cd576118cd6150b2565b60200260200101516020015161302f565b60010161188f565b5050845160005b818110156119445761193c338b8b8a858151811061190d5761190d6150b2565b6020026020010151600001518b868151811061192b5761192b6150b2565b602002602001015160200151612f85565b6001016118ed565b5050855160005b818110156119a25761199a338b8b8b858151811061196b5761196b6150b2565b6020026020010151600001518c8681518110611989576119896150b2565b6020026020010151602001516130b7565b60010161194b565b5050835160005b8181101561146f576119f8338b8b8985815181106119c9576119c96150b2565b6020026020010151600001518a86815181106119e7576119e76150b2565b60200260200101516020015161331e565b6001016119a9565b6000836001600160a01b031660016000856001600160a01b03166001600160a01b031681526020019081526020016000206000600485604051611a439190615122565b90815260408051602092819003830190205483529082019290925201600020546001600160a01b031614949350505050565b6001600160a01b0383166000908152600b6020908152604080832085845290915280822090518290600490611aab908690615122565b908152604080516020928190038301902054835290820192909252016000205460ff16949350505050565b600080600080611ae887878751612ed6565b935093509350935060005b8181101561157d57600083611b225786600081518110611b1557611b156150b2565b6020026020010151611b3d565b868281518110611b3457611b346150b2565b60200260200101515b9050611bcf3387611b68578a600081518110611b5b57611b5b6150b2565b6020026020010151611b83565b8a8481518110611b7a57611b7a6150b2565b60200260200101515b87611ba8578a600081518110611b9b57611b9b6150b2565b6020026020010151611bc3565b8a8581518110611bba57611bba6150b2565b60200260200101515b845160208601516130b7565b50600101611af3565b6060600080600080611bec88888851612ed6565b9350935093509350806001600160401b03811115611c0c57611c0c61387d565b604051908082528060200260200182016040528015611c3f57816020015b6060815260200190600190039081611c2a5790505b50945060005b818110156110ba57611d0785611c755789600081518110611c6857611c686150b2565b6020026020010151611c90565b898281518110611c8757611c876150b2565b60200260200101515b85611cb55789600081518110611ca857611ca86150b2565b6020026020010151611cd0565b898381518110611cc757611cc76150b2565b60200260200101515b85611cf55789600081518110611ce857611ce86150b2565b602002602001015161163f565b898481518110611ce857611ce86150b2565b868281518110611d1957611d196150b2565b6020908102919091010152600101611c45565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f8d7561f54c33dc0cf43c405f24523cfbf86f6c991e371994b70c7f65bf87406e8a8a8a8a8a604051602001611d8b97969594939291906150c8565b60405160208183030381529060405280519060200120604051602001611db1919061513e565b604051602081830303815290604052805190602001209050611dd78a8683878787613152565b61146f8a8a8a8a8a61331e565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f20772140fdb3d071eaa7b3c498d767632d85382eadebf1c930637df53bdb772f8a8a8a8a8a604051602001611e43979695949392919061516f565b60405160208183030381529060405280519060200120604051602001611e69919061513e565b604051602081830303815290604052805190602001209050611e8f8a8683878787613152565b61146f8a8a8a8a8a613296565b600080600080611eae87878751612ed6565b935093509350935060005b8181101561157d57600083611ee85786600081518110611edb57611edb6150b2565b6020026020010151611f03565b868281518110611efa57611efa6150b2565b60200260200101515b9050611f953387611f2e578a600081518110611f2157611f216150b2565b6020026020010151611f49565b8a8481518110611f4057611f406150b2565b60200260200101515b87611f6e578a600081518110611f6157611f616150b2565b6020026020010151611f89565b8a8581518110611f8057611f806150b2565b60200260200101515b8451602086015161302f565b50600101611eb9565b6001600160a01b0381166000908152600660205260409020805460609190611fc590614f02565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff190614f02565b801561203e5780601f106120135761010080835404028352916020019161203e565b820191906000526020600020905b81548152906001019060200180831161202157829003601f168201915b50505050509050919050565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17fb6d8284afd9120a0a19f8dd4bb0119595e5fb90b1c0a48c239b3e001105fdf4b8787878787604051602001610ee397969594939291906151b8565b6000806000806120bb87878751612ed6565b935093509350935060005b8181101561157d576000836120f557866000815181106120e8576120e86150b2565b6020026020010151612110565b868281518110612107576121076150b2565b60200260200101515b90506121a2338761213b578a60008151811061212e5761212e6150b2565b6020026020010151612156565b8a848151811061214d5761214d6150b2565b60200260200101515b8761217b578a60008151811061216e5761216e6150b2565b6020026020010151612196565b8a858151811061218d5761218d6150b2565b60200260200101515b8451602086015161331e565b506001016120c6565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17fb44b995c45c2bef12a1ba33bc54e45cbbdd566df618a1d8d769adc7f902121148a8a8a8a8a60405160200161220a9796959493929190615201565b60405160208183030381529060405280519060200120604051602001612230919061513e565b6040516020818303038152906040528051906020012090506122568a8683878787613152565b61146f8a8a8a8a8a612f85565b60408051600481526024810182526020810180516001600160e01b0316638da5cb5b60e01b179052905160009182916001600160a01b038716916122a691615122565b6000604051808303816000865af19150503d80600081146122e3576040519150601f19603f3d011682016040523d82523d6000602084013e6122e8565b606091505b50909250905060006122f98261524a565b6001600160a01b03160361232057604051632384b66d60e01b815260040160405180910390fd5b81801561233e5750336123328261524a565b6001600160a01b031614155b1561235c576040516327ecd79f60e11b815260040160405180910390fd5b604080516060810182526001815284151560208083018281526001600160a01b038981168587018181528c83166000818152600287528990209751885495519251909416620100000262010000600160b01b03199215156101000261ff00199515159590951661ffff19909616959095179390931716929092179094559351918252339392917f961c9ccd18ff75f83e58597107ced585c08a0514de45947c8aa7a0d5fdf67d18910160405180910390a45050505050565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f20772140fdb3d071eaa7b3c498d767632d85382eadebf1c930637df53bdb772f8787878787604051602001610ee3979695949392919061516f565b60608060608060608087516001600160401b038111156124955761249561387d565b6040519080825280602002602001820160405280156124c857816020015b60608152602001906001900390816124b35790505b50915060005b8851811015612513576124ee8f8f8b8481518110611ce857611ce86150b2565b838281518110612500576125006150b2565b60209081029190910101526001016124ce565b5086516001600160401b0381111561252d5761252d61387d565b604051908082528060200260200182016040528015612556578160200160208202803683370190505b50905060005b87518110156125a15761257c8f8f8a84815181106111cc576111cc6150b2565b82828151811061258e5761258e6150b2565b602090810291909101015260010161255c565b5088516001600160401b038111156125bb576125bb61387d565b6040519080825280602002602001820160405280156125e4578160200160208202803683370190505b50925060005b895181101561263c576126178f8f8c848151811061260a5761260a6150b2565b6020026020010151611381565b848281518110612629576126296150b2565b60209081029190910101526001016125ea565b508a516001600160401b038111156126565761265661387d565b60405190808252806020026020018201604052801561267f578160200160208202803683370190505b50945060005b8b518110156126cf576126a58f8f8e8481518110611071576110716150b2565b8682815181106126b7576126b76150b2565b91151560209283029190910190910152600101612685565b508b516001600160401b038111156126e9576126e961387d565b604051908082528060200260200182016040528015612712578160200160208202803683370190505b50955060005b8c5181101561276a576127388f8f8f848151811061177d5761177d6150b2565b87828151811061274a5761274a6150b2565b6001600160a01b0390921660209283029190910190910152600101612718565b5089516001600160401b038111156127845761278461387d565b6040519080825280602002602001820160405280156127b757816020015b60608152602001906001900390816127a25790505b50935060005b8a5181101561280f576127ea8f8f8d84815181106127dd576127dd6150b2565b602002602001015161129a565b8582815181106127fc576127fc6150b2565b60209081029190910101526001016127bd565b50985098509850985098509892505050565b606060008060008061283588888851612ed6565b9350935093509350806001600160401b038111156128555761285561387d565b60405190808252806020026020018201604052801561287e578160200160208202803683370190505b50945060005b818110156110ba57612939856128b457896000815181106128a7576128a76150b2565b60200260200101516128cf565b8982815181106128c6576128c66150b2565b60200260200101515b856128f457896000815181106128e7576128e76150b2565b602002602001015161290f565b898381518110612906576129066150b2565b60200260200101515b85612927578960008151811061260a5761260a6150b2565b89848151811061260a5761260a6150b2565b86828151811061294b5761294b6150b2565b6020908102919091010152600101612884565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17f8d7561f54c33dc0cf43c405f24523cfbf86f6c991e371994b70c7f65bf87406e8787878787604051602001610ee397969594939291906150c8565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17fb6d8284afd9120a0a19f8dd4bb0119595e5fb90b1c0a48c239b3e001105fdf4b8a8a8a8a8a604051602001612a1c97969594939291906151b8565b60405160208183030381529060405280519060200120604051602001612a42919061513e565b604051602081830303815290604052805190602001209050612a688a8683878787613152565b61146f8a8a8a8a8a6130b7565b6060600080600080612a8988888851612ed6565b9350935093509350806001600160401b03811115612aa957612aa961387d565b604051908082528060200260200182016040528015612adc57816020015b6060815260200190600190039081612ac75790505b50945060005b818110156110ba57612b9785612b125789600081518110612b0557612b056150b2565b6020026020010151612b2d565b898281518110612b2457612b246150b2565b60200260200101515b85612b525789600081518110612b4557612b456150b2565b6020026020010151612b6d565b898381518110612b6457612b646150b2565b60200260200101515b85612b8557896000815181106127dd576127dd6150b2565b8984815181106127dd576127dd6150b2565b868281518110612ba957612ba96150b2565b6020908102919091010152600101612ae2565b61121d338585858561331e565b600080600080612bdb87878751612ed6565b935093509350935060005b8181101561157d57600083612c155786600081518110612c0857612c086150b2565b6020026020010151612c30565b868281518110612c2757612c276150b2565b60200260200101515b9050612cc23387612c5b578a600081518110612c4e57612c4e6150b2565b6020026020010151612c76565b8a8481518110612c6d57612c6d6150b2565b60200260200101515b87612c9b578a600081518110612c8e57612c8e6150b2565b6020026020010151612cb6565b8a8581518110612cad57612cad6150b2565b60200260200101515b84516020860151612f85565b50600101612be6565b61121d3385858585613205565b600080600080612cea87878751612ed6565b935093509350935060005b8181101561157d57600083612d245786600081518110612d1757612d176150b2565b6020026020010151612d3f565b868281518110612d3657612d366150b2565b60200260200101515b9050612dd13387612d6a578a600081518110612d5d57612d5d6150b2565b6020026020010151612d85565b8a8481518110612d7c57612d7c6150b2565b60200260200101515b87612daa578a600081518110612d9d57612d9d6150b2565b6020026020010151612dc5565b8a8581518110612dbc57612dbc6150b2565b60200260200101515b84516020860151613205565b50600101612cf5565b60007f00a62895077ea5b5748b8c328af2b8c40340681cfa1d89ec1b4b351eee48cfb17fb44b995c45c2bef12a1ba33bc54e45cbbdd566df618a1d8d769adc7f902121148787878787604051602001610ee39796959493929190615201565b61121d3385858585613296565b6000600482604051612e589190615122565b908152602001604051809103902054600003612eaf5760058054906000612e7e8361526e565b9190505550600554600483604051612e969190615122565b9081526040519081900360200190205550600554919050565b600482604051612ebf9190615122565b90815260200160405180910390205490505b919050565b8251825160019182148015929182141591841415906000908490612ef75750815b8015612f04575084875114155b80612f215750828015612f145750815b8015612f21575084865114155b80612f3f5750838015612f315750825b8015612f3f57508551875114155b15612f5d5760405163586cb9e160e01b815260040160405180910390fd5b8315612f6b57508551612f7c565b8215612f7957508451612f7c565b50835b93509350935093565b612f91858584866133af565b6001600160a01b0384166000908152600b6020908152604080832086845290915281208291612fbf85612e46565b815260200190815260200160002060006101000a81548160ff02191690831515021790555082846001600160a01b03167ffc6eac6df20a61ff9d8ec7453e452ca73931f2cb16944e9dc884b4a8d64239148484604051613020929190615295565b60405180910390a35050505050565b61303b858584866133af565b6001600160a01b0384166000908152600a602090815260408083208684529091528120829161306985612e46565b81526020019081526020016000208190555082846001600160a01b03167f0c10bed87f43a5875a921aa58c1428dcdefe61e5ed5c58bc96d7961ab34d4b9a84846040516130209291906152b9565b6130c3858584866133af565b6001600160a01b0384166000908152600760209081526040808320868452909152812082916130f185612e46565b81526020810191909152604090810160002080546001600160a01b0319166001600160a01b039384161790555184918616907f78ab16f2d097b9728046fb602022fccefef4ec306810b9e8b6fd618e91c122149061302090869086906152db565b844211156131735760405163f87d927160e01b815260040160405180910390fd5b6040805160008082526020820180845287905260ff861692820192909252606081018490526080810183905260019060a0016020604051602081039080840390855afa1580156131c7573d6000803e3d6000fd5b505050602060405103519050866001600160a01b0316816001600160a01b031614610e7b57604051638baa579f60e01b815260040160405180910390fd5b613211858584866133af565b6001600160a01b0384166000908152600c602090815260408083208684529091528120829161323f85612e46565b815260200190815260200160002090816132599190614f8b565b5082846001600160a01b03167f11e1b2f69159e4bf02488e2c90bf30e6075a4bf57a39ce63ba83d10a96777c038484604051613020929190615305565b6132a2858584866133af565b6001600160a01b0384166000908152600960209081526040808320868452909152812082916132d085612e46565b81526020019081526020016000208190555082846001600160a01b03167f2b529d8c80cbea7dc71690ffd099111430f1e30963439b4659e9a1ec3fba578584846040516130209291906152b9565b61332a858584866133af565b6001600160a01b03841660009081526008602090815260408083208684529091528120829161335885612e46565b815260200190815260200160002090816133729190614f8b565b5082846001600160a01b03167f3e7f7fe71b156da17053b2814558642d261b19433ae77e083aac01f074124f378484604051613020929190615305565b6001600160a01b038316600090815260208190526040808220905182906004906133da908790615122565b9081526040805160209281900383019020548352908201929092520160009081205460ff1691508160048111156134135761341361504a565b14801561351257506001600160a01b038416600090815260026020526040902054610100900460ff1680156134bb5750846001600160a01b0316846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134af9190614ee5565b6001600160a01b031614155b8061351257506001600160a01b038416600090815260026020526040902054610100900460ff1615801561351257506001600160a01b03848116600090815260026020526040902054620100009004811690861614155b15613530576040516327ecd79f60e11b815260040160405180910390fd5b60018160048111156135445761354461504a565b14801561357757506001600160a01b0380851660009081526003602090815260408083209389168352929052205460ff16155b1561359557604051637dc99f8960e11b815260040160405180910390fd5b60028160048111156135a9576135a961504a565b1480156136a857506001600160a01b038416600090815260026020526040902054610100900460ff1680156136515750846001600160a01b0316846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613621573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136459190614ee5565b6001600160a01b031614155b806136a857506001600160a01b038416600090815260026020526040902054610100900460ff161580156136a857506001600160a01b03848116600090815260026020526040902054620100009004811690861614155b80156136da57506001600160a01b0380851660009081526003602090815260408083209389168352929052205460ff16155b156136f8576040516302da8d6360e31b815260040160405180910390fd5b600381600481111561370c5761370c61504a565b14801561378e57506040516331a9108f60e11b8152600481018390526001600160a01b038087169190861690636352211e90602401602060405180830381865afa15801561375e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137829190614ee5565b6001600160a01b031614155b156137ac576040516359dc379f60e01b815260040160405180910390fd5b60048160048111156137c0576137c061504a565b1480156138355750846001600160a01b031660016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006004866040516138099190615122565b90815260408051602092819003830190205483529082019290925201600020546001600160a01b031614155b15613853576040516370e2142360e11b815260040160405180910390fd5b5050505050565b6001600160a01b038116811461386f57600080fd5b50565b8035612ed18161385a565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156138b5576138b561387d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156138e3576138e361387d565b604052919050565b600082601f8301126138fc57600080fd5b81356001600160401b038111156139155761391561387d565b613928601f8201601f19166020016138bb565b81815284602083860101111561393d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561396d57600080fd5b82356139788161385a565b915060208301356001600160401b0381111561399357600080fd5b61399f858286016138eb565b9150509250929050565b600080600080608085870312156139bf57600080fd5b84356139ca8161385a565b935060208501356001600160401b038111156139e557600080fd5b6139f1878288016138eb565b935050604085013560058110613a0657600080fd5b91506060850135613a168161385a565b939692955090935050565b600060208284031215613a3357600080fd5b81356001600160e01b031981168114613a4b57600080fd5b9392505050565b60006001600160401b03821115613a6b57613a6b61387d565b5060051b60200190565b600082601f830112613a8657600080fd5b81356020613a9b613a9683613a52565b6138bb565b82815260059290921b84018101918181019086841115613aba57600080fd5b8286015b84811015613ade578035613ad18161385a565b8352918301918301613abe565b509695505050505050565b80358015158114612ed157600080fd5b600080600060608486031215613b0e57600080fd5b8335613b198161385a565b92506020848101356001600160401b0380821115613b3657600080fd5b613b4288838901613a75565b94506040870135915080821115613b5857600080fd5b508501601f81018713613b6a57600080fd5b8035613b78613a9682613a52565b81815260059190911b82018301908381019089831115613b9757600080fd5b928401925b82841015613bbc57613bad84613ae9565b82529284019290840190613b9c565b80955050505050509250925092565b600080600080600060a08688031215613be357600080fd5b8535613bee8161385a565b94506020860135935060408601356001600160401b0380821115613c1157600080fd5b613c1d89838a016138eb565b94506060880135915080821115613c3357600080fd5b50613c40888289016138eb565b95989497509295608001359392505050565b600080600060608486031215613c6757600080fd5b8335613c728161385a565b92506020840135915060408401356001600160401b03811115613c9457600080fd5b613ca0868287016138eb565b9150509250925092565b600082601f830112613cbb57600080fd5b81356020613ccb613a9683613a52565b82815260059290921b84018101918181019086841115613cea57600080fd5b8286015b84811015613ade5780358352918301918301613cee565b600082601f830112613d1657600080fd5b81356020613d26613a9683613a52565b82815260059290921b84018101918181019086841115613d4557600080fd5b8286015b84811015613ade5780356001600160401b03811115613d685760008081fd5b613d768986838b01016138eb565b845250918301918301613d49565b600080600060608486031215613d9957600080fd5b83356001600160401b0380821115613db057600080fd5b613dbc87838801613a75565b94506020860135915080821115613dd257600080fd5b613dde87838801613caa565b93506040860135915080821115613df457600080fd5b50613ca086828701613d05565b600081518084526020808501945080840160005b83811015613e33578151151587529582019590820190600101613e15565b509495945050505050565b602081526000613a4b6020830184613e01565b600081518084526020808501945080840160005b83811015613e3357815187529582019590820190600101613e65565b602081526000613a4b6020830184613e51565b60008060008060808587031215613eaa57600080fd5b8435613eb58161385a565b93506020850135925060408501356001600160401b03811115613ed757600080fd5b613ee3878288016138eb565b925050613ef260608601613ae9565b905092959194509250565b60008060008060808587031215613f1357600080fd5b8435613f1e8161385a565b93506020850135925060408501356001600160401b03811115613f4057600080fd5b613f4c878288016138eb565b949793965093946060013593505050565b60008060008060808587031215613f7357600080fd5b8435613f7e8161385a565b93506020850135925060408501356001600160401b03811115613fa057600080fd5b613fac878288016138eb565b9250506060850135613a168161385a565b60005b83811015613fd8578181015183820152602001613fc0565b50506000910152565b60008151808452613ff9816020860160208601613fbd565b601f01601f19169290920160200192915050565b602081526000613a4b6020830184613fe1565b6000806040838503121561403357600080fd5b823561403e8161385a565b9150602083013561404e8161385a565b809150509250929050565b803560ff81168114612ed157600080fd5b60008060008060008060008060006101208a8c03121561408957600080fd5b89356140948161385a565b985060208a01356140a48161385a565b975060408a0135965060608a01356001600160401b03808211156140c757600080fd5b6140d38d838e016138eb565b975060808c01359150808211156140e957600080fd5b506140f68c828d016138eb565b95505060a08a0135935061410c60c08b01614059565b925060e08a013591506101008a013590509295985092959850929598565b600082601f83011261413b57600080fd5b8135602061414b613a9683613a52565b82815260059290921b8401810191818101908684111561416a57600080fd5b8286015b84811015613ade5780356001600160401b038082111561418e5760008081fd5b908801906040828b03601f19018113156141a85760008081fd5b6141b0613893565b87840135838111156141c25760008081fd5b6141d08d8a838801016138eb565b8252509201358683015250835291830191830161416e565b6000806000606084860312156141fd57600080fd5b83356001600160401b038082111561421457600080fd5b61422087838801613a75565b9450602086013591508082111561423657600080fd5b61424287838801613caa565b9350604086013591508082111561425857600080fd5b50613ca08682870161412a565b60008060008060008060008060006101208a8c03121561428457600080fd5b893561428f8161385a565b985060208a013561429f8161385a565b975060408a0135965060608a01356001600160401b038111156142c157600080fd5b6142cd8c828d016138eb565b96505060808a0135945060a08a0135935061410c60c08b01614059565b600081518084526020808501945080840160005b83811015613e335781516001600160a01b0316875295820195908201906001016142fe565b602081526000613a4b60208301846142ea565b600082601f83011261434757600080fd5b81356020614357613a9683613a52565b82815260059290921b8401810191818101908684111561437657600080fd5b8286015b84811015613ade5780356001600160401b038082111561439a5760008081fd5b908801906040828b03601f19018113156143b45760008081fd5b6143bc613893565b87840135838111156143ce5760008081fd5b6143dc8d8a838801016138eb565b82525092810135926143ed8461385a565b808801939093525050835291830191830161437a565b600082601f83011261441457600080fd5b81356020614424613a9683613a52565b82815260059290921b8401810191818101908684111561444357600080fd5b8286015b84811015613ade5780356001600160401b03808211156144675760008081fd5b908801906040828b03601f19018113156144815760008081fd5b614489613893565b878401358381111561449b5760008081fd5b6144a98d8a838801016138eb565b8252506144b7828501613ae9565b818901528652505050918301918301614447565b600082601f8301126144dc57600080fd5b813560206144ec613a9683613a52565b82815260059290921b8401810191818101908684111561450b57600080fd5b8286015b84811015613ade5780356001600160401b038082111561452f5760008081fd5b908801906040828b03601f19018113156145495760008081fd5b614551613893565b87840135838111156145635760008081fd5b6145718d8a838801016138eb565b8252509083013590828211156145875760008081fd5b6145958c89848701016138eb565b81890152865250505091830191830161450f565b600082601f8301126145ba57600080fd5b813560206145ca613a9683613a52565b82815260059290921b840181019181810190868411156145e957600080fd5b8286015b84811015613ade5780356001600160401b038082111561460d5760008081fd5b908801906040828b03601f19018113156146275760008081fd5b61462f613893565b87840135838111156146415760008081fd5b61464f8d8a838801016138eb565b8252509083013590828211156146655760008081fd5b6146738c89848701016138eb565b8189015286525050509183019183016145ed565b600080600080600080600080610100898b0312156146a457600080fd5b6146ad89613872565b97506020890135965060408901356001600160401b03808211156146d057600080fd5b6146dc8c838d01614336565b975060608b01359150808211156146f257600080fd5b6146fe8c838d01614403565b965060808b013591508082111561471457600080fd5b6147208c838d016144cb565b955060a08b013591508082111561473657600080fd5b6147428c838d0161412a565b945060c08b013591508082111561475857600080fd5b6147648c838d016145a9565b935060e08b013591508082111561477a57600080fd5b506147878b828c0161412a565b9150509295985092959890939650565b6000806000606084860312156147ac57600080fd5b83356147b78161385a565b925060208401356147c78161385a565b915060408401356001600160401b03811115613c9457600080fd5b6000806000606084860312156147f757600080fd5b83356001600160401b038082111561480e57600080fd5b61481a87838801613a75565b9450602086013591508082111561483057600080fd5b61483c87838801613caa565b9350604086013591508082111561485257600080fd5b50613ca086828701614336565b600081518084526020808501808196508360051b8101915082860160005b858110156148a7578284038952614895848351613fe1565b9885019893509084019060010161487d565b5091979650505050505050565b602081526000613a4b602083018461485f565b6000602082840312156148d957600080fd5b8135613a4b8161385a565b600080600080600060a086880312156148fc57600080fd5b85356149078161385a565b94506020860135935060408601356001600160401b0381111561492957600080fd5b614935888289016138eb565b93505060608601356149468161385a565b949793965091946080013592915050565b60008060006060848603121561496c57600080fd5b83356001600160401b038082111561498357600080fd5b61498f87838801613a75565b945060208601359150808211156149a557600080fd5b6149b187838801613caa565b935060408601359150808211156149c757600080fd5b50613ca0868287016144cb565b60008060008060008060008060006101208a8c0312156149f357600080fd5b89356149fe8161385a565b985060208a0135614a0e8161385a565b975060408a0135965060608a01356001600160401b03811115614a3057600080fd5b614a3c8c828d016138eb565b965050614a4b60808b01613ae9565b945060a08a0135935061410c60c08b01614059565b600080600060608486031215614a7557600080fd5b8335614a808161385a565b92506020840135614a908161385a565b9150614a9e60408501613ae9565b90509250925092565b600080600080600060a08688031215614abf57600080fd5b8535614aca8161385a565b94506020860135935060408601356001600160401b03811115614aec57600080fd5b614af8888289016138eb565b9598949750949560608101359550608001359392505050565b600080600080600080600080610100898b031215614b2e57600080fd5b614b3789613872565b97506020890135965060408901356001600160401b0380821115614b5a57600080fd5b614b668c838d01613d05565b975060608b0135915080821115614b7c57600080fd5b614b888c838d01613d05565b965060808b0135915080821115614b9e57600080fd5b614baa8c838d01613d05565b955060a08b0135915080821115614bc057600080fd5b614bcc8c838d01613d05565b945060c08b0135915080821115614be257600080fd5b614bee8c838d01613d05565b935060e08b0135915080821115614c0457600080fd5b506147878b828c01613d05565b60c081526000614c2460c08301896142ea565b8281036020840152614c368189613e01565b90508281036040840152614c4a818861485f565b90508281036060840152614c5e8187613e51565b90508281036080840152614c72818661485f565b905082810360a0840152614c868185613e51565b9998505050505050505050565b60008060008060008060008060006101208a8c031215614cb257600080fd5b8935614cbd8161385a565b985060208a0135614ccd8161385a565b975060408a0135965060608a01356001600160401b03811115614cef57600080fd5b614cfb8c828d016138eb565b96505060808a0135614a4b8161385a565b60008060008060808587031215614d2257600080fd5b8435614d2d8161385a565b93506020850135925060408501356001600160401b0380821115614d5057600080fd5b614d5c888389016138eb565b93506060870135915080821115614d7257600080fd5b50614d7f878288016138eb565b91505092959194509250565b600080600060608486031215614da057600080fd5b83356001600160401b0380821115614db757600080fd5b614dc387838801613a75565b94506020860135915080821115614dd957600080fd5b614de587838801613caa565b93506040860135915080821115614dfb57600080fd5b50613ca086828701614403565b600080600060608486031215614e1d57600080fd5b83356001600160401b0380821115614e3457600080fd5b614e4087838801613a75565b94506020860135915080821115614e5657600080fd5b614e6287838801613caa565b93506040860135915080821115614e7857600080fd5b50613ca0868287016145a9565b600080600080600060a08688031215614e9d57600080fd5b8535614ea88161385a565b94506020860135935060408601356001600160401b03811115614eca57600080fd5b614ed6888289016138eb565b93505061494660608701613ae9565b600060208284031215614ef757600080fd5b8151613a4b8161385a565b600181811c90821680614f1657607f821691505b602082108103614f3657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115614f8657600081815260208120601f850160051c81016020861015614f635750805b601f850160051c820191505b81811015614f8257828155600101614f6f565b5050505b505050565b81516001600160401b03811115614fa457614fa461387d565b614fb881614fb28454614f02565b84614f3c565b602080601f831160018114614fed5760008415614fd55750858301515b600019600386901b1c1916600185901b178555614f82565b600085815260208120601f198616915b8281101561501c57888601518255948401946001909101908401614ffd565b508582101561503a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fd5b6060815260006150736060830186613fe1565b90506005841061509357634e487b7160e01b600052602160045260246000fd5b60208201939093526001600160a01b0391909116604090910152919050565b634e487b7160e01b600052603260045260246000fd5b87815286602082015260018060a01b038616604082015284606082015260e0608082015260006150fb60e0830186613fe1565b82810360a084015261510d8186613fe1565b9150508260c083015298975050505050505050565b60008251615134818460208701613fbd565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b87815286602082015260018060a01b038616604082015284606082015260e0608082015260006151a260e0830186613fe1565b60a08301949094525060c0015295945050505050565b878152866020820152600060018060a01b03808816604084015286606084015260e060808401526151ec60e0840187613fe1565b941660a08301525060c0015295945050505050565b87815286602082015260018060a01b038616604082015284606082015260e06080820152600061523460e0830186613fe1565b93151560a08301525060c0015295945050505050565b80516020808301519190811015614f365760001960209190910360031b1b16919050565b60006001820161528e57634e487b7160e01b600052601160045260246000fd5b5060010190565b6040815260006152a86040830185613fe1565b905082151560208301529392505050565b6040815260006152cc6040830185613fe1565b90508260208301529392505050565b6040815260006152ee6040830185613fe1565b905060018060a01b03831660208301529392505050565b6040815260006153186040830185613fe1565b828103602084015261532a8185613fe1565b9594505050505056fea264697066735822122050cecf49729830824fd5f0a36c5b59bffc6aae7bc56966509393f935f4d1652464736f6c63430008150033
Deployed Bytecode Sourcemap
539:46210:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9485:301;;;;;;:::i;:::-;;:::i;:::-;;7735:506;;;;;;:::i;:::-;;:::i;5849:229::-;;;;;;:::i;:::-;;:::i;:::-;;;3184:14:6;;3177:22;3159:41;;3147:2;3132:18;5849:229:1;;;;;;;;8291:816;;;;;;:::i;:::-;;:::i;22766:515::-;;;;;;:::i;:::-;;:::i;:::-;;;6551:25:6;;;6539:2;6524:18;22766:515:1;6405:177:6;9892:236:1;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7281:32:6;;;7263:51;;7251:2;7236:18;9892:236:1;7117:203:6;12643:930:1;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16577:936::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24223:222::-;;;;;;:::i;:::-;;:::i;10742:230::-;;;;;;:::i;:::-;;:::i;24777:222::-;;;;;;:::i;:::-;;:::i;23942:231::-;;;;;;:::i;:::-;;:::i;605:263::-;;;;;10455:237;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6191:208::-;;;;;;:::i;:::-;-1:-1:-1;;;;;6352:26:1;;;6302:20;6352:26;;;:14;:26;;;;;;;;:40;;;;;;;;;;;;;;;;6191:208;11312:227;;;;;;:::i;:::-;;:::i;38363:912::-;;;;;;:::i;:::-;;:::i;30841:980::-;;;;;;:::i;:::-;;:::i;37416:897::-;;;;;;:::i;:::-;;:::i;11022:240::-;;;;;;:::i;:::-;;:::i;11651:942::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31871:2565::-;;;;;;:::i;:::-;;:::i;6449:304::-;;;;;;:::i;:::-;;:::i;10178:227::-;;;;;;:::i;:::-;;:::i;25671:992::-;;;;;;:::i;:::-;;:::i;15589:938::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1631:189::-;;;;;36458:908;;;;;;:::i;:::-;;:::i;39325:900::-;;;;;;:::i;:::-;;:::i;28777:976::-;;;;;;:::i;:::-;;:::i;1062:180::-;;;;;1826:188;;;;;9218:217;;;;;;:::i;:::-;;:::i;20538:511::-;;;;;;:::i;:::-;;:::i;1248:192::-;;;;;27743:984;;;;;;:::i;:::-;;:::i;35511:897::-;;;;;;:::i;:::-;;:::i;6803:882::-;;;;;;:::i;:::-;;:::i;23331:505::-;;;;;;:::i;:::-;;:::i;17563:2850::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;14607:932::-;;;;;;:::i;:::-;;:::i;21651:512::-;;;;;;:::i;:::-;;:::i;34552:909::-;;;;;;:::i;:::-;;:::i;13623:934::-;;;;;;:::i;:::-;;:::i;24495:232::-;;;;;;:::i;:::-;;:::i;26713:980::-;;;;;;:::i;:::-;;:::i;25049:235::-;;;;;;:::i;:::-;;:::i;29803:988::-;;;;;;:::i;:::-;;:::i;21099:502::-;;;;;;:::i;:::-;;:::i;1446:179::-;;;;;874:182;;;;;25334:225;;;;;;:::i;:::-;;:::i;9485:301::-;-1:-1:-1;;;;;5499:26:1;;;;;;:14;:26;;;;;:37;:26;;:37;;;;;5495:288;;;735:10:4;-1:-1:-1;;;;;5556:43:1;5564:10;-1:-1:-1;;;;;5556:25:1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5556:43:1;;5552:109;;5626:20;;-1:-1:-1;;;5626:20:1;;;;;;;;;;;5552:109;5495:288;;;-1:-1:-1;;;;;5681:26:1;;;;;;;:14;:26;;;;;:32;;;;;735:10:4;5681:48:1;5677:106;;5752:20;;-1:-1:-1;;;5752:20:1;;;;;;;;;;;5677:106;-1:-1:-1;;;;;9652:35:1;::::1;;::::0;;;:23:::1;:35;::::0;;;;:59:::1;9690:21:::0;9652:35;:59:::1;:::i;:::-;;9745:10;-1:-1:-1::0;;;;;9726:53:1::1;;9757:21;9726:53;;;;;;:::i;:::-;;;;;;;;9485:301:::0;;;:::o;7735:506::-;-1:-1:-1;;;;;5180:26:1;;;;;;:14;:26;;;;;:37;7923:10;;5180:37;;5175:101;;5240:25;;-1:-1:-1;;;5240:25:1;;;;;;;;;;;5175:101;-1:-1:-1;;;;;5499:26:1;::::1;;::::0;;;:14:::1;:26;::::0;;;;:37;:26;;:37:::1;::::0;::::1;;;5495:288;;;735:10:4::0;-1:-1:-1;;;;;5556:43:1::1;5564:10;-1:-1:-1::0;;;;;5556:25:1::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5556:43:1::1;;5552:109;;5626:20;;-1:-1:-1::0;;;5626:20:1::1;;;;;;;;;;;5552:109;5495:288;;;-1:-1:-1::0;;;;;5681:26:1;;::::1;;::::0;;;:14:::1;:26;::::0;;;;:32;;;::::1;;735:10:4::0;5681:48:1::1;5677:106;;5752:20;;-1:-1:-1::0;;;5752:20:1::1;;;;;;;;;;;5677:106;7967:19:::2;7989:17;8002:3;7989:12;:17::i;:::-;-1:-1:-1::0;;;;;8017:32:1;::::2;:20;:32:::0;;;::::2;::::0;;;;;;;:45;;;;;;;;:58;;7967:39;;-1:-1:-1;8065:10:1;;-1:-1:-1;;8017:58:1::2;::::0;8065:10;8017:58:::2;::::0;::::2;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;;;;;;8085:37:1;;::::2;;::::0;;;:25:::2;:37;::::0;;;;;;;:50;;;;;;;;;;:68;;-1:-1:-1;;;;;;8085:68:1::2;::::0;;::::2;::::0;;;::::2;::::0;;;8169:65;;::::2;::::0;::::2;::::0;8201:3;;8206:10;;8085:68;;8169:65:::2;:::i;:::-;;;;;;;;7957:284;5285:1:::1;7735:506:::0;;;;;:::o;5849:229::-;5939:4;-1:-1:-1;;;;;;5974:41:1;;-1:-1:-1;;;5974:41:1;;:97;;-1:-1:-1;;;;;;;6031:40:1;;-1:-1:-1;;;6031:40:1;5974:97;5955:116;5849:229;-1:-1:-1;;5849:229:1:o;8291:816::-;-1:-1:-1;;;;;5180:26:1;;;;;;:14;:26;;;;;:37;8485:10;;5180:37;;5175:101;;5240:25;;-1:-1:-1;;;5240:25:1;;;;;;;;;;;5175:101;-1:-1:-1;;;;;5499:26:1;::::1;;::::0;;;:14:::1;:26;::::0;;;;:37;:26;;:37:::1;::::0;::::1;;;5495:288;;;735:10:4::0;-1:-1:-1;;;;;5556:43:1::1;5564:10;-1:-1:-1::0;;;;;5556:25:1::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;5556:43:1::1;;5552:109;;5626:20;;-1:-1:-1::0;;;5626:20:1::1;;;;;;;;;;;5552:109;5495:288;;;-1:-1:-1::0;;;;;5681:26:1;;::::1;;::::0;;;:14:::1;:26;::::0;;;;:32;;;::::1;;735:10:4::0;5681:48:1::1;5677:106;;5752:20;;-1:-1:-1::0;;;5752:20:1::1;;;;;;;;;;;5677:106;8546:28:::0;;8598:32;;8588:42;::::2;8584:114;;8653:34;;-1:-1:-1::0;;;8653:34:1::2;;;;;;;;;;;8584:114;8712:9;8707:394;8727:6;8723:1;:10;8707:394;;;8836:25;8862:1;8836:28;;;;;;;;:::i;:::-;;;;;;;8751:14;:26;8766:10;-1:-1:-1::0;;;;;8751:26:1::2;-1:-1:-1::0;;;;;8751:26:1::2;;;;;;;;;;;;:82;8795:21;8817:1;8795:24;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;8751:82:1::2;-1:-1:-1::0;;;;;8751:82:1::2;;;;;;;;;;;;;:113;;;;;;;;;;;;;;;;;;8947:21;8969:1;8947:24;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;8883:148:1::2;8919:10;-1:-1:-1::0;;;;;8883:148:1::2;;8989:25;9015:1;8989:28;;;;;;;;:::i;:::-;;;;;;;8883:148;;;;3184:14:6::0;3177:22;3159:41;;3147:2;3132:18;;3019:187;8883:148:1::2;;;;;;;;9073:3;;8707:394;;;;8519:588;5285:1:::1;8291:816:::0;;;;:::o;22766:515::-;22976:15;23064:16;23098:29;23145:10;23173:7;23198:3;23219:5;23242:8;23036:228;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23013:261;;;;;;23003:271;;22766:515;;;;;;;:::o;9892:236::-;-1:-1:-1;;;;;10069:26:1;;10028:17;10069:26;;;:14;:26;;;;;;;;:35;;;;;;;;;10105:15;;10028:17;;10105:10;;:15;;10116:3;;10105:15;:::i;:::-;;;;;;;;;;;;;;;;;10069:52;;;;;;;;;;-1:-1:-1;10069:52:1;;-1:-1:-1;;;;;10069:52:1;;;-1:-1:-1;;;;9892:236:1:o;12643:930::-;12809:24;12859;12897:19;12930:23;12967:18;12998:143;13052:11;13081:8;13107:13;:20;12998:36;:143::i;:::-;12845:296;;;;;;;;13176:10;-1:-1:-1;;;;;13165:22:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13165:22:1;;13152:35;;13203:9;13198:369;13218:10;13214:1;:14;13198:369;;;13262:235;13296:19;:53;;13335:11;13347:1;13335:14;;;;;;;;:::i;:::-;;;;;;;13296:53;;;13318:11;13330:1;13318:14;;;;;;;;:::i;:::-;;;;;;;13296:53;13367:14;:42;;13398:8;13407:1;13398:11;;;;;;;;:::i;:::-;;;;;;;13367:42;;;13384:8;13393:1;13384:11;;;;;;;;:::i;:::-;;;;;;;13367:42;13427:18;:56;;13467:13;13481:1;13467:16;;;;;;;;:::i;:::-;;;;;;;10178:227;:::i;13427:56::-;13448:13;13462:1;13448:16;;;;;;;;:::i;13262:235::-;13246:10;13257:1;13246:13;;;;;;;;:::i;:::-;:251;;;:13;;;;;;;;;;;:251;13539:3;;13198:369;;;;12835:738;;;;12643:930;;;;;:::o;16577:936::-;16743:27;16796:24;16834:19;16867:23;16904:18;16935:143;16989:11;17018:8;17044:13;:20;16935:36;:143::i;:::-;16782:296;;;;;;;;17116:10;-1:-1:-1;;;;;17102:25:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17102:25:1;;17089:38;;17143:9;17138:369;17158:10;17154:1;:14;17138:369;;;17202:235;17236:19;:53;;17275:11;17287:1;17275:14;;;;;;;;:::i;:::-;;;;;;;17236:53;;;17258:11;17270:1;17258:14;;;;;;;;:::i;:::-;;;;;;;17236:53;17307:14;:42;;17338:8;17347:1;17338:11;;;;;;;;:::i;:::-;;;;;;;17307:42;;;17324:8;17333:1;17324:11;;;;;;;;:::i;:::-;;;;;;;17307:42;17367:18;:56;;17407:13;17421:1;17407:16;;;;;;;;:::i;:::-;;;;;;;10742:230;:::i;17367:56::-;17388:13;17402:1;17388:16;;;;;;;;:::i;17202:235::-;17186:10;17197:1;17186:13;;;;;;;;:::i;:::-;;;;;;;;;;:251;17479:3;;17138:369;;24223:222;24374:64;735:10:4;24406::1;24418:7;24427:3;24432:5;24374:17;:64::i;:::-;24223:222;;;;:::o;10742:230::-;-1:-1:-1;;;;;10916:23:1;;10875:17;10916:23;;;:11;:23;;;;;;;;:32;;;;;;;;;10949:15;;10875:17;;10949:10;;:15;;10960:3;;10949:15;:::i;:::-;;;;;;;;;;;;;;10916:49;;;;;;;;;;;;10904:61;;10742:230;;;;;:::o;24777:222::-;24929:63;735:10:4;24960::1;24972:7;24981:3;24986:5;24929:16;:63::i;23942:231::-;24099:67;735:10:4;24134::1;24146:7;24155:3;24160:5;24099:20;:67::i;10455:237::-;-1:-1:-1;;;;;10635:24:1;;;;;;:12;:24;;;;;;;;:33;;;;;;;;;10669:15;;10589:22;;10635:24;10669:10;;:15;;10680:3;;10669:15;:::i;:::-;;;;;;;;;;;;;;10635:50;;;;;;;;;;;10623:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10455:237;;;;;:::o;11312:227::-;-1:-1:-1;;;;;11484:22:1;;11444:16;11484:22;;;:10;:22;;;;;;;;:31;;;;;;;;;11516:15;;11444:16;;11516:10;;:15;;11527:3;;11516:15;:::i;38363:912::-;38639:14;38832:16;38874:29;38929:10;38965:7;38998:3;39027:5;39058:8;38796:292;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38765:341;;;;;;38679:441;;;;;;;;:::i;:::-;;;;;;;;;;;;;38656:474;;;;;;38639:491;;39140:58;39164:6;39172:8;39182:6;39190:1;39193;39196;39140:23;:58::i;:::-;39208:60;39228:6;39236:10;39248:7;39257:3;39262:5;39208:19;:60::i;:::-;38629:646;38363:912;;;;;;;;;:::o;30841:980::-;31023:24;31061:19;31094:23;31131:18;31162:140;31216:11;31245:8;31271:10;:17;31162:36;:140::i;:::-;31009:293;;;;;;;;31317:9;31312:503;31332:10;31328:1;:14;31312:503;;;31360:30;31393:18;:82;;31462:10;31473:1;31462:13;;;;;;;;:::i;:::-;;;;;;;31393:82;;;31430:10;31441:1;31430:13;;;;;;;;:::i;:::-;;;;;;;31393:82;31360:115;-1:-1:-1;31489:256:1;735:10:4;31554:19:1;:53;;31593:11;31605:1;31593:14;;;;;;;;:::i;:::-;;;;;;;31554:53;;;31576:11;31588:1;31576:14;;;;;;;;:::i;:::-;;;;;;;31554:53;31625:14;:42;;31656:8;31665:1;31656:11;;;;;;;;:::i;:::-;;;;;;;31625:42;;;31642:8;31651:1;31642:11;;;;;;;;:::i;:::-;;;;;;;31625:42;31685:13;;31716:15;;;;31489:17;:256::i;:::-;-1:-1:-1;31787:3:1;;31312:503;;;;30999:822;;;;30841:980;;;:::o;37416:897::-;37682:14;37875:16;37917:27;37970:10;38006:7;38039:3;38068:5;38099:8;37839:290;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37808:339;;;;;;37722:439;;;;;;;;:::i;:::-;;;;;;;;;;;;;37699:472;;;;;;37682:489;;38181:58;38205:6;38213:8;38223:6;38231:1;38234;38237;38181:23;:58::i;:::-;38249:57;38266:6;38274:10;38286:7;38295:3;38300:5;38249:16;:57::i;11022:240::-;-1:-1:-1;;;;;11204:25:1;;;;;;:13;:25;;;;;;;;:34;;;;;;;;;11239:15;;11157:23;;11204:25;11239:10;;:15;;11250:3;;11239:15;:::i;11651:942::-;11820:27;11873:24;11911:19;11944:23;11981:18;12012:143;12066:11;12095:8;12121:13;:20;12012:36;:143::i;:::-;11859:296;;;;;;;;12193:10;-1:-1:-1;;;;;12179:25:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12179:25:1;;12166:38;;12220:9;12215:372;12235:10;12231:1;:14;12215:372;;;12279:238;12316:19;:53;;12355:11;12367:1;12355:14;;;;;;;;:::i;:::-;;;;;;;12316:53;;;12338:11;12350:1;12338:14;;;;;;;;:::i;:::-;;;;;;;12316:53;12387:14;:42;;12418:8;12427:1;12418:11;;;;;;;;:::i;:::-;;;;;;;12387:42;;;12404:8;12413:1;12404:11;;;;;;;;:::i;:::-;;;;;;;12387:42;12447:18;:56;;12487:13;12501:1;12487:16;;;;;;;;:::i;:::-;;;;;;;9892:236;:::i;12447:56::-;12468:13;12482:1;12468:16;;;;;;;;:::i;12279:238::-;12263:10;12274:1;12263:13;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12263:254:1;;;:13;;;;;;;;;;;:254;12559:3;;12215:372;;31871:2565;32281:23;;32264:14;32314:314;32334:6;32330:1;:10;32314:314;;;32358:200;735:10:4;32425::1;32453:7;32478:16;32495:1;32478:19;;;;;;;;:::i;:::-;;;;;;;:23;;;32519:16;32536:1;32519:19;;;;;;;;:::i;:::-;;;;;;;:25;;;32358:19;:200::i;:::-;32600:3;;32314:314;;;-1:-1:-1;;32647:21:1;;32683:9;32678:308;32698:6;32694:1;:10;32678:308;;;32722:194;735:10:4;32787::1;32815:7;32840:14;32855:1;32840:17;;;;;;;;:::i;:::-;;;;;;;:21;;;32879:14;32894:1;32879:17;;;;;;;;:::i;:::-;;;;;;;:23;;;32722:17;:194::i;:::-;32958:3;;32678:308;;;-1:-1:-1;;33005:20:1;;33040:9;33035:305;33055:6;33051:1;:10;33035:305;;;33079:191;735:10:4;33143::1;33171:7;33196:13;33210:1;33196:16;;;;;;;;:::i;:::-;;;;;;;:20;;;33234:13;33248:1;33234:16;;;;;;;;:::i;:::-;;;;;;;:22;;;33079:16;:191::i;:::-;33312:3;;33035:305;;;-1:-1:-1;;33359:21:1;;33395:9;33390:308;33410:6;33406:1;:10;33390:308;;;33434:194;735:10:4;33499::1;33527:7;33552:14;33567:1;33552:17;;;;;;;;:::i;:::-;;;;;;;:21;;;33591:14;33606:1;33591:17;;;;;;;;:::i;:::-;;;;;;;:23;;;33434:17;:194::i;:::-;33670:3;;33390:308;;;-1:-1:-1;;33717:24:1;;33756:9;33751:317;33771:6;33767:1;:10;33751:317;;;33795:203;735:10:4;33863::1;33891:7;33916:17;33934:1;33916:20;;;;;;;;:::i;:::-;;;;;;;:24;;;33958:17;33976:1;33958:20;;;;;;;;:::i;:::-;;;;;;;:26;;;33795:20;:203::i;:::-;34040:3;;33751:317;;;-1:-1:-1;;34087:22:1;;34124:9;34119:311;34139:6;34135:1;:10;34119:311;;;34163:197;735:10:4;34229::1;34257:7;34282:15;34298:1;34282:18;;;;;;;;:::i;:::-;;;;;;;:22;;;34322:15;34338:1;34322:18;;;;;;;;:::i;:::-;;;;;;;:24;;;34163:18;:197::i;:::-;34402:3;;34119:311;;6449:304;6593:23;6731:15;-1:-1:-1;;;;;6661:85:1;:25;:37;6687:10;-1:-1:-1;;;;;6661:37:1;-1:-1:-1;;;;;6661:37:1;;;;;;;;;;;;:54;6699:10;6710:3;6699:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6661:54;;;;;;;;;;-1:-1:-1;6661:54:1;;-1:-1:-1;;;;;6661:54:1;:85;;;-1:-1:-1;;;;6449:304:1:o;10178:227::-;-1:-1:-1;;;;;10349:23:1;;10311:14;10349:23;;;:11;:23;;;;;;;;:32;;;;;;;;;10382:15;;10311:14;;10382:10;;:15;;10393:3;;10382:15;:::i;:::-;;;;;;;;;;;;;;;;;10349:49;;;;;;;;;;-1:-1:-1;10349:49:1;;;;;;-1:-1:-1;;;;10178:227:1:o;25671:992::-;25859:24;25897:19;25930:23;25967:18;25998:140;26052:11;26081:8;26107:10;:17;25998:36;:140::i;:::-;25845:293;;;;;;;;26153:9;26148:509;26168:10;26164:1;:14;26148:509;;;26196:33;26232:18;:82;;26301:10;26312:1;26301:13;;;;;;;;:::i;:::-;;;;;;;26232:82;;;26269:10;26280:1;26269:13;;;;;;;;:::i;:::-;;;;;;;26232:82;26196:118;-1:-1:-1;26328:259:1;735:10:4;26396:19:1;:53;;26435:11;26447:1;26435:14;;;;;;;;:::i;:::-;;;;;;;26396:53;;;26418:11;26430:1;26418:14;;;;;;;;:::i;:::-;;;;;;;26396:53;26467:14;:42;;26498:8;26507:1;26498:11;;;;;;;;:::i;:::-;;;;;;;26467:42;;;26484:8;26493:1;26484:11;;;;;;;;:::i;:::-;;;;;;;26467:42;26527:13;;26558:15;;;;26328:20;:259::i;:::-;-1:-1:-1;26629:3:1;;26148:509;;15589:938;15757:26;15809:24;15847:19;15880:23;15917:18;15948:143;16002:11;16031:8;16057:13;:20;15948:36;:143::i;:::-;15795:296;;;;;;;;16128:10;-1:-1:-1;;;;;16115:24:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16102:37;;16155:9;16150:371;16170:10;16166:1;:14;16150:371;;;16214:237;16250:19;:53;;16289:11;16301:1;16289:14;;;;;;;;:::i;:::-;;;;;;;16250:53;;;16272:11;16284:1;16272:14;;;;;;;;:::i;:::-;;;;;;;16250:53;16321:14;:42;;16352:8;16361:1;16352:11;;;;;;;;:::i;:::-;;;;;;;16321:42;;;16338:8;16347:1;16338:11;;;;;;;;:::i;:::-;;;;;;;16321:42;16381:18;:56;;16421:13;16435:1;16421:16;;;;;;;;:::i;:::-;;;;;;;11022:240;:::i;16381:56::-;16402:13;16416:1;16402:16;;;;;;;;:::i;16214:237::-;16198:10;16209:1;16198:13;;;;;;;;:::i;:::-;;;;;;;;;;:253;16493:3;;16150:371;;36458:908;36732:14;36925:16;36967:28;37021:10;37057:7;37090:3;37119:5;37150:8;36889:291;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36858:340;;;;;;36772:440;;;;;;;;:::i;:::-;;;;;;;;;;;;;36749:473;;;;;;36732:490;;37232:58;37256:6;37264:8;37274:6;37282:1;37285;37288;37232:23;:58::i;:::-;37300:59;37319:6;37327:10;37339:7;37348:3;37353:5;37300:18;:59::i;39325:900::-;39593:14;39786:16;39828:27;39881:10;39917:7;39950:3;39979:5;40010:8;39750:290;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39719:339;;;;;;39633:439;;;;;;;;:::i;:::-;;;;;;;;;;;;;39610:472;;;;;;39593:489;;40092:58;40116:6;40124:8;40134:6;40142:1;40145;40148;40092:23;:58::i;:::-;40160;40178:6;40186:10;40198:7;40207:3;40212:5;40160:17;:58::i;28777:976::-;28957:24;28995:19;29028:23;29065:18;29096:140;29150:11;29179:8;29205:10;:17;29096:36;:140::i;:::-;28943:293;;;;;;;;29251:9;29246:501;29266:10;29262:1;:14;29246:501;;;29294:29;29326:18;:82;;29395:10;29406:1;29395:13;;;;;;;;:::i;:::-;;;;;;;29326:82;;;29363:10;29374:1;29363:13;;;;;;;;:::i;:::-;;;;;;;29326:82;29294:114;-1:-1:-1;29422:255:1;735:10:4;29486:19:1;:53;;29525:11;29537:1;29525:14;;;;;;;;:::i;:::-;;;;;;;29486:53;;;29508:11;29520:1;29508:14;;;;;;;;:::i;:::-;;;;;;;29486:53;29557:14;:42;;29588:8;29597:1;29588:11;;;;;;;;:::i;:::-;;;;;;;29557:42;;;29574:8;29583:1;29574:11;;;;;;;;:::i;:::-;;;;;;;29557:42;29617:13;;29648:15;;;;29422:16;:255::i;:::-;-1:-1:-1;29719:3:1;;29246:501;;9218:217;-1:-1:-1;;;;;9393:35:1;;;;;;:23;:35;;;;;9369:59;;9322:35;;9393;9369:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9218:217;;;:::o;20538:511::-;20743:15;20831:16;20865:30;20913:10;20941:7;20966:3;20987:5;21010:8;20803:229;;;;;;;;;;;;;;:::i;27743:984::-;27927:24;27965:19;27998:23;28035:18;28066:140;28120:11;28149:8;28175:10;:17;28066:36;:140::i;:::-;27913:293;;;;;;;;28221:9;28216:505;28236:10;28232:1;:14;28216:505;;;28264:31;28298:18;:82;;28367:10;28378:1;28367:13;;;;;;;;:::i;:::-;;;;;;;28298:82;;;28335:10;28346:1;28335:13;;;;;;;;:::i;:::-;;;;;;;28298:82;28264:116;-1:-1:-1;28394:257:1;735:10:4;28460:19:1;:53;;28499:11;28511:1;28499:14;;;;;;;;:::i;:::-;;;;;;;28460:53;;;28482:11;28494:1;28482:14;;;;;;;;:::i;:::-;;;;;;;28460:53;28531:14;:42;;28562:8;28571:1;28562:11;;;;;;;;:::i;:::-;;;;;;;28531:42;;;28548:8;28557:1;28548:11;;;;;;;;:::i;:::-;;;;;;;28531:42;28591:13;;28622:15;;;;28394:18;:257::i;:::-;-1:-1:-1;28693:3:1;;28216:505;;35511:897;35776:14;35969:16;36011:27;36064:10;36100:7;36133:3;36162:5;36193:8;35933:290;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35902:339;;;;;;35816:439;;;;;;;;:::i;:::-;;;;;;;;;;;;;35793:472;;;;;;35776:489;;36275:58;36299:6;36307:8;36317:6;36325:1;36328;36331;36275:23;:58::i;:::-;36343;36361:6;36369:10;36381:7;36390:3;36395:5;36343:17;:58::i;6803:882::-;7016:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7016:34:1;-1:-1:-1;;;7016:34:1;;;6987:73;;6936:19;;;;-1:-1:-1;;;;;6987:15:1;;;:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6935:125:1;;-1:-1:-1;6935:125:1;-1:-1:-1;7136:1:1;7099:22;6935:125;7099:22;:::i;:::-;-1:-1:-1;;;;;7075:63:1;;7071:124;;7161:23;;-1:-1:-1;;;7161:23:1;;;;;;;;;;;7071:124;7221:14;:95;;;;-1:-1:-1;735:10:4;7275:22:1;7283:13;7275:22;:::i;:::-;-1:-1:-1;;;;;7251:65:1;;;7221:95;7204:175;;;7348:20;;-1:-1:-1;;;7348:20:1;;;;;;;;;;;7204:175;7418:116;;;;;;;;7457:4;7418:116;;;;;;;;;;;;-1:-1:-1;;;;;7418:116:1;;;;;;;;;7389:26;;;-1:-1:-1;7389:26:1;;;:14;:26;;;;;:145;;;;;;;;;;;;;-1:-1:-1;;;;;;7389:145:1;;;;;-1:-1:-1;;7389:145:1;;;;;;;-1:-1:-1;;7389:145:1;;;;;;;;;;;;;;;;;;;7550:128;;3159:41:6;;;735:10:4;;7418:116:1;7389:26;7550:128;;3132:18:6;7550:128:1;;;;;;;6925:760;;6803:882;;;:::o;23331:505::-;23533:15;23621:16;23655:27;23700:10;23728:7;23753:3;23774:5;23797:8;23593:226;;;;;;;;;;;;;;:::i;17563:2850::-;17914:34;17962:28;18004:30;18048:29;18091:32;18137:31;18556:10;:17;-1:-1:-1;;;;;18543:31:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18524:50;;18589:9;18584:263;18604:10;:17;18600:1;:21;18584:263;;;18661:116;18697:10;18725:7;18750:10;18761:1;18750:13;;;;;;;;:::i;18661:116::-;18639:16;18656:1;18639:19;;;;;;;;:::i;:::-;;;;;;;;;;:138;18819:3;;18584:263;;;;18888:8;:15;-1:-1:-1;;;;;18874:30:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18874:30:1;;18857:47;;18919:9;18914:255;18934:8;:15;18930:1;:19;18914:255;;;18987:112;19021:10;19049:7;19074:8;19083:1;19074:11;;;;;;;;:::i;18987:112::-;18967:14;18982:1;18967:17;;;;;;;;:::i;:::-;;;;;;;;;;:132;19141:3;;18914:255;;;;19208:7;:14;-1:-1:-1;;;;;19195:28:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19195:28:1;;19179:44;;19238:9;19233:189;19253:7;:14;19249:1;:18;19233:189;;;19304:48;19320:10;19332:7;19341;19349:1;19341:10;;;;;;;;:::i;:::-;;;;;;;19304:15;:48::i;:::-;19285:13;19299:1;19285:16;;;;;;;;:::i;:::-;;;;;;;;;;:67;19394:3;;19233:189;;;;19460:8;:15;-1:-1:-1;;;;;19449:27:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19449:27:1;;19432:44;;19491:9;19486:255;19506:8;:15;19502:1;:19;19486:255;;;19559:112;19593:10;19621:7;19646:8;19655:1;19646:11;;;;;;;;:::i;19559:112::-;19539:14;19554:1;19539:17;;;;;;;;:::i;:::-;:132;;;:17;;;;;;;;;;;:132;19713:3;;19486:255;;;;19785:11;:18;-1:-1:-1;;;;;19771:33:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19771:33:1;;19751:53;;19819:9;19814:267;19834:11;:18;19830:1;:22;19814:267;;;19893:118;19930:10;19958:7;19983:11;19995:1;19983:14;;;;;;;;:::i;19893:118::-;19870:17;19888:1;19870:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19870:141:1;;;:20;;;;;;;;;;;:141;20053:3;;19814:267;;;;20121:9;:16;-1:-1:-1;;;;;20109:29:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20091:47;;20153:9;20148:259;20168:9;:16;20164:1;:20;20148:259;;;20223:114;20258:10;20286:7;20311:9;20321:1;20311:12;;;;;;;;:::i;:::-;;;;;;;20223:17;:114::i;:::-;20202:15;20218:1;20202:18;;;;;;;;:::i;:::-;;;;;;;;;;:135;20379:3;;20148:259;;;;17563:2850;;;;;;;;;;;;;;;:::o;14607:932::-;14772:26;14824:24;14862:19;14895:23;14932:18;14963:143;15017:11;15046:8;15072:13;:20;14963:36;:143::i;:::-;14810:296;;;;;;;;15143:10;-1:-1:-1;;;;;15130:24:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15130:24:1;;15117:37;;15170:9;15165:368;15185:10;15181:1;:14;15165:368;;;15229:234;15262:19;:53;;15301:11;15313:1;15301:14;;;;;;;;:::i;:::-;;;;;;;15262:53;;;15284:11;15296:1;15284:14;;;;;;;;:::i;:::-;;;;;;;15262:53;15333:14;:42;;15364:8;15373:1;15364:11;;;;;;;;:::i;:::-;;;;;;;15333:42;;;15350:8;15359:1;15350:11;;;;;;;;:::i;:::-;;;;;;;15333:42;15393:18;:56;;15433:13;15447:1;15433:16;;;;;;;;:::i;15393:56::-;15414:13;15428:1;15414:16;;;;;;;;:::i;15229:234::-;15213:10;15224:1;15213:13;;;;;;;;:::i;:::-;;;;;;;;;;:250;15505:3;;15165:368;;21651:512;21859:15;21947:16;21981:28;22027:10;22055:7;22080:3;22101:5;22124:8;21919:227;;;;;;;;;;;;;;:::i;34552:909::-;34823:14;35016:16;35058:30;35114:10;35150:7;35183:3;35212:5;35243:8;34980:293;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34949:342;;;;;;34863:442;;;;;;;;:::i;:::-;;;;;;;;;;;;;34840:475;;;;;;34823:492;;35325:58;35349:6;35357:8;35367:6;35375:1;35378;35381;35325:23;:58::i;:::-;35393:61;35414:6;35422:10;35434:7;35443:3;35448:5;35393:20;:61::i;13623:934::-;13790:25;13841:24;13879:19;13912:23;13949:18;13980:143;14034:11;14063:8;14089:13;:20;13980:36;:143::i;:::-;13827:296;;;;;;;;14159:10;-1:-1:-1;;;;;14147:23:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14134:36;;14186:9;14181:370;14201:10;14197:1;:14;14181:370;;;14245:236;14280:19;:53;;14319:11;14331:1;14319:14;;;;;;;;:::i;:::-;;;;;;;14280:53;;;14302:11;14314:1;14302:14;;;;;;;;:::i;:::-;;;;;;;14280:53;14351:14;:42;;14382:8;14391:1;14382:11;;;;;;;;:::i;:::-;;;;;;;14351:42;;;14368:8;14377:1;14368:11;;;;;;;;:::i;:::-;;;;;;;14351:42;14411:18;:56;;14451:13;14465:1;14451:16;;;;;;;;:::i;14411:56::-;14432:13;14446:1;14432:16;;;;;;;;:::i;14245:236::-;14229:10;14240:1;14229:13;;;;;;;;:::i;:::-;;;;;;;;;;:252;14523:3;;14181:370;;24495:232;24655:65;735:10:4;24688::1;24700:7;24709:3;24714:5;24655:18;:65::i;26713:980::-;26895:24;26933:19;26966:23;27003:18;27034:140;27088:11;27117:8;27143:10;:17;27034:36;:140::i;:::-;26881:293;;;;;;;;27189:9;27184:503;27204:10;27200:1;:14;27184:503;;;27232:30;27265:18;:82;;27334:10;27345:1;27334:13;;;;;;;;:::i;:::-;;;;;;;27265:82;;;27302:10;27313:1;27302:13;;;;;;;;:::i;:::-;;;;;;;27265:82;27232:115;-1:-1:-1;27361:256:1;735:10:4;27426:19:1;:53;;27465:11;27477:1;27465:14;;;;;;;;:::i;:::-;;;;;;;27426:53;;;27448:11;27460:1;27448:14;;;;;;;;:::i;:::-;;;;;;;27426:53;27497:14;:42;;27528:8;27537:1;27528:11;;;;;;;;:::i;:::-;;;;;;;27497:42;;;27514:8;27523:1;27514:11;;;;;;;;:::i;:::-;;;;;;;27497:42;27557:13;;27588:15;;;;27361:17;:256::i;:::-;-1:-1:-1;27659:3:1;;27184:503;;25049:235;25211:66;735:10:4;25245::1;25257:7;25266:3;25271:5;25211:19;:66::i;29803:988::-;29989:24;30027:19;30060:23;30097:18;30128:140;30182:11;30211:8;30237:10;:17;30128:36;:140::i;:::-;29975:293;;;;;;;;30283:9;30278:507;30298:10;30294:1;:14;30278:507;;;30326:32;30361:18;:82;;30430:10;30441:1;30430:13;;;;;;;;:::i;:::-;;;;;;;30361:82;;;30398:10;30409:1;30398:13;;;;;;;;:::i;:::-;;;;;;;30361:82;30326:117;-1:-1:-1;30457:258:1;735:10:4;30524:19:1;:53;;30563:11;30575:1;30563:14;;;;;;;;:::i;:::-;;;;;;;30524:53;;;30546:11;30558:1;30546:14;;;;;;;;:::i;:::-;;;;;;;30524:53;30595:14;:42;;30626:8;30635:1;30626:11;;;;;;;;:::i;:::-;;;;;;;30595:42;;;30612:8;30621:1;30612:11;;;;;;;;:::i;:::-;;;;;;;30595:42;30655:13;;30686:15;;;;30457:19;:258::i;:::-;-1:-1:-1;30757:3:1;;30278:507;;21099:502;21298:15;21386:16;21420:27;21465:10;21493:7;21518:3;21539:5;21562:8;21358:226;;;;;;;;;;;;;;:::i;25334:225::-;25488:64;735:10:4;25520::1;25532:7;25541:3;25546:5;25488:17;:64::i;44110:281::-;44169:13;44198:10;44209:3;44198:15;;;;;;:::i;:::-;;;;;;;;;;;;;;44217:1;44198:20;44194:191;;44234:10;:12;;;:10;:12;;;:::i;:::-;;;;;;44278:10;;44260;44271:3;44260:15;;;;;;:::i;:::-;;;;;;;;;;;;;;:28;-1:-1:-1;44310:10:1;;44110:281;;;:::o;44194:191::-;44359:10;44370:3;44359:15;;;;;;:::i;:::-;;;;;;;;;;;;;;44351:23;;44194:191;44110:281;;;:::o;40706:1207::-;41098:18;;41148:15;;41120:1;41098:23;;;;;;41148:20;;;;;41199:21;;;;40925:24;;41098:23;;41248:57;;;41287:18;41248:57;:115;;;;;41347:16;41325:11;:18;:38;;41248:115;41247:242;;;;41381:14;:52;;;;;41415:18;41381:52;:107;;;;;41472:16;41453:8;:15;:35;;41381:107;41247:370;;;;41506:19;:53;;;;;41545:14;41506:53;:110;;;;;41601:8;:15;41579:11;:18;:37;;41506:110;41230:447;;;41649:17;;-1:-1:-1;;;41649:17:1;;;;;;;;;;;41230:447;41691:19;41687:220;;;-1:-1:-1;41739:18:1;;41687:220;;;41778:14;41774:133;;;-1:-1:-1;41821:15:1;;41774:133;;;-1:-1:-1;41880:16:1;41774:133;40706:1207;;;;;;;:::o;44795:380::-;44971:60;44998:6;45006:10;45018:3;45023:7;44971:26;:60::i;:::-;-1:-1:-1;;;;;45041:23:1;;;;;;:11;:23;;;;;;;;:32;;;;;;;;45095:5;;45074:17;45087:3;45074:12;:17::i;:::-;45041:51;;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;45148:7;45136:10;-1:-1:-1;;;;;45115:53:1;;45157:3;45162:5;45115:53;;;;;;;:::i;:::-;;;;;;;;44795:380;;;;;:::o;45578:379::-;45755:60;45782:6;45790:10;45802:3;45807:7;45755:26;:60::i;:::-;-1:-1:-1;;;;;45825:22:1;;;;;;:10;:22;;;;;;;;:31;;;;;;;;45878:5;;45857:17;45870:3;45857:12;:17::i;:::-;45825:50;;;;;;;;;;;:58;;;;45930:7;45918:10;-1:-1:-1;;;;;45898:52:1;;45939:3;45944:5;45898:52;;;;;;;:::i;44397:392::-;44579:60;44606:6;44614:10;44626:3;44631:7;44579:26;:60::i;:::-;-1:-1:-1;;;;;44649:26:1;;;;;;:14;:26;;;;;;;;:35;;;;;;;;44706:5;;44685:17;44698:3;44685:12;:17::i;:::-;44649:54;;;;;;;;;;;;;-1:-1:-1;44649:54:1;:62;;-1:-1:-1;;;;;;44649:62:1;-1:-1:-1;;;;;44649:62:1;;;;;;44726:56;44762:7;;44726:56;;;;;;;44771:3;;44776:5;;44726:56;:::i;40287:413::-;40501:8;40483:15;:26;40479:81;;;40532:17;;-1:-1:-1;;;40532:17:1;;;;;;;;;;;40479:81;40586:26;;;40569:14;40586:26;;;;;;;;;59083:25:6;;;59156:4;59144:17;;59124:18;;;59117:45;;;;59178:18;;;59171:34;;;59221:18;;;59214:34;;;40586:26:1;;59055:19:6;;40586:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40569:43;;40636:6;-1:-1:-1;;;;;40626:16:1;:6;-1:-1:-1;;;;;40626:16:1;;40622:72;;40665:18;;-1:-1:-1;;;40665:18:1;;;;;;;;;;;45963:395;46150:60;46177:6;46185:10;46197:3;46202:7;46150:26;:60::i;:::-;-1:-1:-1;;;;;46220:25:1;;;;;;:13;:25;;;;;;;;:34;;;;;;;;46276:5;;46255:17;46268:3;46255:12;:17::i;:::-;46220:53;;;;;;;;;;;:61;;;;;;:::i;:::-;;46331:7;46319:10;-1:-1:-1;;;;;46296:55:1;;46340:3;46345:5;46296:55;;;;;;;:::i;46364:383::-;46543:60;46570:6;46578:10;46590:3;46595:7;46543:26;:60::i;:::-;-1:-1:-1;;;;;46613:23:1;;;;;;:11;:23;;;;;;;;:32;;;;;;;;46667:5;;46646:17;46659:3;46646:12;:17::i;:::-;46613:51;;;;;;;;;;;:59;;;;46720:7;46708:10;-1:-1:-1;;;;;46687:53:1;;46729:3;46734:5;46687:53;;;;;;;:::i;45181:391::-;45366:60;45393:6;45401:10;45413:3;45418:7;45366:26;:60::i;:::-;-1:-1:-1;;;;;45436:24:1;;;;;;:12;:24;;;;;;;;:33;;;;;;;;45491:5;;45470:17;45483:3;45470:12;:17::i;:::-;45436:52;;;;;;;;;;;:60;;;;;;:::i;:::-;;45545:7;45533:10;-1:-1:-1;;;;;45511:54:1;;45554:3;45559:5;45511:54;;;;;;;:::i;42164:1634::-;-1:-1:-1;;;;;42357:32:1;;42333:21;42357:32;;;;;;;;;;;42403:15;;42333:21;;42403:10;;:15;;42414:3;;42403:15;:::i;:::-;;;;;;;;;;;;;;;;;42357:71;;;;;;;;;;-1:-1:-1;42357:71:1;;;;;;;-1:-1:-1;42456:10:1;:30;;;;;;;;:::i;:::-;;:270;;;;-1:-1:-1;;;;;;42504:26:1;;;;;;:14;:26;;;;;:37;;;;;;:94;;;;;42592:6;-1:-1:-1;;;;;42561:37:1;42569:10;-1:-1:-1;;;;;42561:25:1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42561:37:1;;;42504:94;42503:222;;;-1:-1:-1;;;;;;42621:26:1;;;;;;:14;:26;;;;;:37;;;;;;42620:38;:104;;;;-1:-1:-1;;;;;;42682:26:1;;;;;;;:14;:26;;;;;:32;;;;;;:42;;;;;42620:104;42439:1353;;;42758:20;;-1:-1:-1;;;42758:20:1;;;;;;;;;;;42439:1353;42826:23;42812:10;:37;;;;;;;;:::i;:::-;;:88;;;;-1:-1:-1;;;;;;42866:26:1;;;;;;;:14;:26;;;;;;;;:34;;;;;;;;;;;;42865:35;42812:88;42795:997;;;42932:27;;-1:-1:-1;;;42932:27:1;;;;;;;;;;;42795:997;43007:30;42993:10;:44;;;;;;;;:::i;:::-;;:284;;;;-1:-1:-1;;;;;;43055:26:1;;;;;;:14;:26;;;;;:37;;;;;;:94;;;;;43143:6;-1:-1:-1;;;;;43112:37:1;43120:10;-1:-1:-1;;;;;43112:25:1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43112:37:1;;;43055:94;43054:222;;;-1:-1:-1;;;;;;43172:26:1;;;;;;:14;:26;;;;;:37;;;;;;43171:38;:104;;;;-1:-1:-1;;;;;;43233:26:1;;;;;;;:14;:26;;;;;:32;;;;;;:42;;;;;43171:104;42993:335;;;;-1:-1:-1;;;;;;43294:26:1;;;;;;;:14;:26;;;;;;;;:34;;;;;;;;;;;;43293:35;42993:335;42976:816;;;43360:34;;-1:-1:-1;;;43360:34:1;;;;;;;;;;;42976:816;43442:21;43428:10;:35;;;;;;;;:::i;:::-;;:97;;;;-1:-1:-1;43479:36:1;;-1:-1:-1;;;43479:36:1;;;;;6551:25:6;;;-1:-1:-1;;;;;43479:46:1;;;;:27;;;;;;6524:18:6;;43479:36:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43479:46:1;;;43428:97;43411:381;;;43557:15;;-1:-1:-1;;;43557:15:1;;;;;;;;;;;43411:381;43620:26;43606:10;:40;;;;;;;;:::i;:::-;;:123;;;;;43722:6;-1:-1:-1;;;;;43664:64:1;:25;:37;43690:10;-1:-1:-1;;;;;43664:37:1;-1:-1:-1;;;;;43664:37:1;;;;;;;;;;;;:54;43702:10;43713:3;43702:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;43664:54;;;;;;;;;;-1:-1:-1;43664:54:1;;-1:-1:-1;;;;;43664:54:1;:64;43662:67;43606:123;43589:203;;;43761:20;;-1:-1:-1;;;43761:20:1;;;;;;;;;;;43589:203;42323:1475;42164:1634;;;;:::o;14:131:6:-;-1:-1:-1;;;;;89:31:6;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:134::-;218:20;;247:31;218:20;247:31;:::i;289:127::-;350:10;345:3;341:20;338:1;331:31;381:4;378:1;371:15;405:4;402:1;395:15;421:257;493:4;487:11;;;525:17;;-1:-1:-1;;;;;557:34:6;;593:22;;;554:62;551:88;;;619:18;;:::i;:::-;655:4;648:24;421:257;:::o;683:275::-;754:2;748:9;819:2;800:13;;-1:-1:-1;;796:27:6;784:40;;-1:-1:-1;;;;;839:34:6;;875:22;;;836:62;833:88;;;901:18;;:::i;:::-;937:2;930:22;683:275;;-1:-1:-1;683:275:6:o;963:531::-;1006:5;1059:3;1052:4;1044:6;1040:17;1036:27;1026:55;;1077:1;1074;1067:12;1026:55;1113:6;1100:20;-1:-1:-1;;;;;1135:2:6;1132:26;1129:52;;;1161:18;;:::i;:::-;1205:55;1248:2;1229:13;;-1:-1:-1;;1225:27:6;1254:4;1221:38;1205:55;:::i;:::-;1285:2;1276:7;1269:19;1331:3;1324:4;1319:2;1311:6;1307:15;1303:26;1300:35;1297:55;;;1348:1;1345;1338:12;1297:55;1413:2;1406:4;1398:6;1394:17;1387:4;1378:7;1374:18;1361:55;1461:1;1436:16;;;1454:4;1432:27;1425:38;;;;1440:7;963:531;-1:-1:-1;;;963:531:6:o;1499:457::-;1577:6;1585;1638:2;1626:9;1617:7;1613:23;1609:32;1606:52;;;1654:1;1651;1644:12;1606:52;1693:9;1680:23;1712:31;1737:5;1712:31;:::i;:::-;1762:5;-1:-1:-1;1818:2:6;1803:18;;1790:32;-1:-1:-1;;;;;1834:30:6;;1831:50;;;1877:1;1874;1867:12;1831:50;1900;1942:7;1933:6;1922:9;1918:22;1900:50;:::i;:::-;1890:60;;;1499:457;;;;;:::o;1961:762::-;2070:6;2078;2086;2094;2147:3;2135:9;2126:7;2122:23;2118:33;2115:53;;;2164:1;2161;2154:12;2115:53;2203:9;2190:23;2222:31;2247:5;2222:31;:::i;:::-;2272:5;-1:-1:-1;2328:2:6;2313:18;;2300:32;-1:-1:-1;;;;;2344:30:6;;2341:50;;;2387:1;2384;2377:12;2341:50;2410;2452:7;2443:6;2432:9;2428:22;2410:50;:::i;:::-;2400:60;;;2512:2;2501:9;2497:18;2484:32;2547:1;2538:7;2535:14;2525:42;;2563:1;2560;2553:12;2525:42;2586:7;-1:-1:-1;2645:2:6;2630:18;;2617:32;2658:33;2617:32;2658:33;:::i;:::-;1961:762;;;;-1:-1:-1;1961:762:6;;-1:-1:-1;;1961:762:6:o;2728:286::-;2786:6;2839:2;2827:9;2818:7;2814:23;2810:32;2807:52;;;2855:1;2852;2845:12;2807:52;2881:23;;-1:-1:-1;;;;;;2933:32:6;;2923:43;;2913:71;;2980:1;2977;2970:12;2913:71;3003:5;2728:286;-1:-1:-1;;;2728:286:6:o;3211:183::-;3271:4;-1:-1:-1;;;;;3296:6:6;3293:30;3290:56;;;3326:18;;:::i;:::-;-1:-1:-1;3371:1:6;3367:14;3383:4;3363:25;;3211:183::o;3399:737::-;3453:5;3506:3;3499:4;3491:6;3487:17;3483:27;3473:55;;3524:1;3521;3514:12;3473:55;3560:6;3547:20;3586:4;3610:60;3626:43;3666:2;3626:43;:::i;:::-;3610:60;:::i;:::-;3704:15;;;3790:1;3786:10;;;;3774:23;;3770:32;;;3735:12;;;;3814:15;;;3811:35;;;3842:1;3839;3832:12;3811:35;3878:2;3870:6;3866:15;3890:217;3906:6;3901:3;3898:15;3890:217;;;3986:3;3973:17;4003:31;4028:5;4003:31;:::i;:::-;4047:18;;4085:12;;;;3923;;3890:217;;;-1:-1:-1;4125:5:6;3399:737;-1:-1:-1;;;;;;3399:737:6:o;4141:160::-;4206:20;;4262:13;;4255:21;4245:32;;4235:60;;4291:1;4288;4281:12;4306:1273;4430:6;4438;4446;4499:2;4487:9;4478:7;4474:23;4470:32;4467:52;;;4515:1;4512;4505:12;4467:52;4554:9;4541:23;4573:31;4598:5;4573:31;:::i;:::-;4623:5;-1:-1:-1;4647:2:6;4685:18;;;4672:32;-1:-1:-1;;;;;4753:14:6;;;4750:34;;;4780:1;4777;4770:12;4750:34;4803:61;4856:7;4847:6;4836:9;4832:22;4803:61;:::i;:::-;4793:71;;4917:2;4906:9;4902:18;4889:32;4873:48;;4946:2;4936:8;4933:16;4930:36;;;4962:1;4959;4952:12;4930:36;-1:-1:-1;4985:24:6;;5040:4;5032:13;;5028:27;-1:-1:-1;5018:55:6;;5069:1;5066;5059:12;5018:55;5105:2;5092:16;5128:60;5144:43;5184:2;5144:43;:::i;5128:60::-;5222:15;;;5304:1;5300:10;;;;5292:19;;5288:28;;;5253:12;;;;5328:19;;;5325:39;;;5360:1;5357;5350:12;5325:39;5384:11;;;;5404:145;5420:6;5415:3;5412:15;5404:145;;;5486:20;5502:3;5486:20;:::i;:::-;5474:33;;5437:12;;;;5527;;;;5404:145;;;5568:5;5558:15;;;;;;;4306:1273;;;;;:::o;5584:816::-;5699:6;5707;5715;5723;5731;5784:3;5772:9;5763:7;5759:23;5755:33;5752:53;;;5801:1;5798;5791:12;5752:53;5840:9;5827:23;5859:31;5884:5;5859:31;:::i;:::-;5909:5;-1:-1:-1;5961:2:6;5946:18;;5933:32;;-1:-1:-1;6016:2:6;6001:18;;5988:32;-1:-1:-1;;;;;6069:14:6;;;6066:34;;;6096:1;6093;6086:12;6066:34;6119:50;6161:7;6152:6;6141:9;6137:22;6119:50;:::i;:::-;6109:60;;6222:2;6211:9;6207:18;6194:32;6178:48;;6251:2;6241:8;6238:16;6235:36;;;6267:1;6264;6257:12;6235:36;;6290:52;6334:7;6323:8;6312:9;6308:24;6290:52;:::i;:::-;5584:816;;;;-1:-1:-1;5584:816:6;;6389:3;6374:19;6361:33;;5584:816;-1:-1:-1;;;5584:816:6:o;6587:525::-;6674:6;6682;6690;6743:2;6731:9;6722:7;6718:23;6714:32;6711:52;;;6759:1;6756;6749:12;6711:52;6798:9;6785:23;6817:31;6842:5;6817:31;:::i;:::-;6867:5;-1:-1:-1;6919:2:6;6904:18;;6891:32;;-1:-1:-1;6974:2:6;6959:18;;6946:32;-1:-1:-1;;;;;6990:30:6;;6987:50;;;7033:1;7030;7023:12;6987:50;7056;7098:7;7089:6;7078:9;7074:22;7056:50;:::i;:::-;7046:60;;;6587:525;;;;;:::o;7325:662::-;7379:5;7432:3;7425:4;7417:6;7413:17;7409:27;7399:55;;7450:1;7447;7440:12;7399:55;7486:6;7473:20;7512:4;7536:60;7552:43;7592:2;7552:43;:::i;7536:60::-;7630:15;;;7716:1;7712:10;;;;7700:23;;7696:32;;;7661:12;;;;7740:15;;;7737:35;;;7768:1;7765;7758:12;7737:35;7804:2;7796:6;7792:15;7816:142;7832:6;7827:3;7824:15;7816:142;;;7898:17;;7886:30;;7936:12;;;;7849;;7816:142;;7992:888;8045:5;8098:3;8091:4;8083:6;8079:17;8075:27;8065:55;;8116:1;8113;8106:12;8065:55;8152:6;8139:20;8178:4;8202:60;8218:43;8258:2;8218:43;:::i;8202:60::-;8296:15;;;8382:1;8378:10;;;;8366:23;;8362:32;;;8327:12;;;;8406:15;;;8403:35;;;8434:1;8431;8424:12;8403:35;8470:2;8462:6;8458:15;8482:369;8498:6;8493:3;8490:15;8482:369;;;8584:3;8571:17;-1:-1:-1;;;;;8607:11:6;8604:35;8601:125;;;8680:1;8709:2;8705;8698:14;8601:125;8751:57;8804:3;8799:2;8785:11;8777:6;8773:24;8769:33;8751:57;:::i;:::-;8739:70;;-1:-1:-1;8829:12:6;;;;8515;;8482:369;;8885:830;9047:6;9055;9063;9116:2;9104:9;9095:7;9091:23;9087:32;9084:52;;;9132:1;9129;9122:12;9084:52;9172:9;9159:23;-1:-1:-1;;;;;9242:2:6;9234:6;9231:14;9228:34;;;9258:1;9255;9248:12;9228:34;9281:61;9334:7;9325:6;9314:9;9310:22;9281:61;:::i;:::-;9271:71;;9395:2;9384:9;9380:18;9367:32;9351:48;;9424:2;9414:8;9411:16;9408:36;;;9440:1;9437;9430:12;9408:36;9463:63;9518:7;9507:8;9496:9;9492:24;9463:63;:::i;:::-;9453:73;;9579:2;9568:9;9564:18;9551:32;9535:48;;9608:2;9598:8;9595:16;9592:36;;;9624:1;9621;9614:12;9592:36;;9647:62;9701:7;9690:8;9679:9;9675:24;9647:62;:::i;9720:448::-;9770:3;9808:5;9802:12;9835:6;9830:3;9823:19;9861:4;9890:2;9885:3;9881:12;9874:19;;9927:2;9920:5;9916:14;9948:1;9958:185;9972:6;9969:1;9966:13;9958:185;;;10047:13;;10040:21;10033:29;10021:42;;10083:12;;;;10118:15;;;;9994:1;9987:9;9958:185;;;-1:-1:-1;10159:3:6;;9720:448;-1:-1:-1;;;;;9720:448:6:o;10173:252::-;10346:2;10335:9;10328:21;10309:4;10366:53;10415:2;10404:9;10400:18;10392:6;10366:53;:::i;10430:435::-;10483:3;10521:5;10515:12;10548:6;10543:3;10536:19;10574:4;10603:2;10598:3;10594:12;10587:19;;10640:2;10633:5;10629:14;10661:1;10671:169;10685:6;10682:1;10679:13;10671:169;;;10746:13;;10734:26;;10780:12;;;;10815:15;;;;10707:1;10700:9;10671:169;;10870:261;11049:2;11038:9;11031:21;11012:4;11069:56;11121:2;11110:9;11106:18;11098:6;11069:56;:::i;11136:594::-;11229:6;11237;11245;11253;11306:3;11294:9;11285:7;11281:23;11277:33;11274:53;;;11323:1;11320;11313:12;11274:53;11362:9;11349:23;11381:31;11406:5;11381:31;:::i;:::-;11431:5;-1:-1:-1;11483:2:6;11468:18;;11455:32;;-1:-1:-1;11538:2:6;11523:18;;11510:32;-1:-1:-1;;;;;11554:30:6;;11551:50;;;11597:1;11594;11587:12;11551:50;11620;11662:7;11653:6;11642:9;11638:22;11620:50;:::i;:::-;11610:60;;;11689:35;11720:2;11709:9;11705:18;11689:35;:::i;:::-;11679:45;;11136:594;;;;;;;:::o;11917:593::-;12012:6;12020;12028;12036;12089:3;12077:9;12068:7;12064:23;12060:33;12057:53;;;12106:1;12103;12096:12;12057:53;12145:9;12132:23;12164:31;12189:5;12164:31;:::i;:::-;12214:5;-1:-1:-1;12266:2:6;12251:18;;12238:32;;-1:-1:-1;12321:2:6;12306:18;;12293:32;-1:-1:-1;;;;;12337:30:6;;12334:50;;;12380:1;12377;12370:12;12334:50;12403;12445:7;12436:6;12425:9;12421:22;12403:50;:::i;:::-;11917:593;;;;-1:-1:-1;12393:60:6;;12500:2;12485:18;12472:32;;-1:-1:-1;;;11917:593:6:o;12515:667::-;12611:6;12619;12627;12635;12688:3;12676:9;12667:7;12663:23;12659:33;12656:53;;;12705:1;12702;12695:12;12656:53;12744:9;12731:23;12763:31;12788:5;12763:31;:::i;:::-;12813:5;-1:-1:-1;12865:2:6;12850:18;;12837:32;;-1:-1:-1;12920:2:6;12905:18;;12892:32;-1:-1:-1;;;;;12936:30:6;;12933:50;;;12979:1;12976;12969:12;12933:50;13002;13044:7;13035:6;13024:9;13020:22;13002:50;:::i;:::-;12992:60;;;13104:2;13093:9;13089:18;13076:32;13117:33;13142:7;13117:33;:::i;13187:250::-;13272:1;13282:113;13296:6;13293:1;13290:13;13282:113;;;13372:11;;;13366:18;13353:11;;;13346:39;13318:2;13311:10;13282:113;;;-1:-1:-1;;13429:1:6;13411:16;;13404:27;13187:250::o;13442:270::-;13483:3;13521:5;13515:12;13548:6;13543:3;13536:19;13564:76;13633:6;13626:4;13621:3;13617:14;13610:4;13603:5;13599:16;13564:76;:::i;:::-;13694:2;13673:15;-1:-1:-1;;13669:29:6;13660:39;;;;13701:4;13656:50;;13442:270;-1:-1:-1;;13442:270:6:o;13717:217::-;13864:2;13853:9;13846:21;13827:4;13884:44;13924:2;13913:9;13909:18;13901:6;13884:44;:::i;13939:388::-;14007:6;14015;14068:2;14056:9;14047:7;14043:23;14039:32;14036:52;;;14084:1;14081;14074:12;14036:52;14123:9;14110:23;14142:31;14167:5;14142:31;:::i;:::-;14192:5;-1:-1:-1;14249:2:6;14234:18;;14221:32;14262:33;14221:32;14262:33;:::i;:::-;14314:7;14304:17;;;13939:388;;;;;:::o;14512:156::-;14578:20;;14638:4;14627:16;;14617:27;;14607:55;;14658:1;14655;14648:12;14673:1167;14822:6;14830;14838;14846;14854;14862;14870;14878;14886;14939:3;14927:9;14918:7;14914:23;14910:33;14907:53;;;14956:1;14953;14946:12;14907:53;14995:9;14982:23;15014:31;15039:5;15014:31;:::i;:::-;15064:5;-1:-1:-1;15121:2:6;15106:18;;15093:32;15134:33;15093:32;15134:33;:::i;:::-;15186:7;-1:-1:-1;15240:2:6;15225:18;;15212:32;;-1:-1:-1;15295:2:6;15280:18;;15267:32;-1:-1:-1;;;;;15348:14:6;;;15345:34;;;15375:1;15372;15365:12;15345:34;15398:50;15440:7;15431:6;15420:9;15416:22;15398:50;:::i;:::-;15388:60;;15501:3;15490:9;15486:19;15473:33;15457:49;;15531:2;15521:8;15518:16;15515:36;;;15547:1;15544;15537:12;15515:36;;15570:52;15614:7;15603:8;15592:9;15588:24;15570:52;:::i;:::-;15560:62;;;15669:3;15658:9;15654:19;15641:33;15631:43;;15693:37;15725:3;15714:9;15710:19;15693:37;:::i;:::-;15683:47;;15777:3;15766:9;15762:19;15749:33;15739:43;;15829:3;15818:9;15814:19;15801:33;15791:43;;14673:1167;;;;;;;;;;;:::o;15845:1448::-;15912:5;15965:3;15958:4;15950:6;15946:17;15942:27;15932:55;;15983:1;15980;15973:12;15932:55;16019:6;16006:20;16045:4;16069:60;16085:43;16125:2;16085:43;:::i;16069:60::-;16163:15;;;16249:1;16245:10;;;;16233:23;;16229:32;;;16194:12;;;;16273:15;;;16270:35;;;16301:1;16298;16291:12;16270:35;16337:2;16329:6;16325:15;16349:915;16365:6;16360:3;16357:15;16349:915;;;16451:3;16438:17;-1:-1:-1;;;;;16528:2:6;16515:11;16512:19;16509:109;;;16572:1;16601:2;16597;16590:14;16509:109;16641:24;;;;16688:4;16716:12;;;-1:-1:-1;;16712:26:6;16708:35;-1:-1:-1;16705:125:6;;;16784:1;16813:2;16809;16802:14;16705:125;16856:22;;:::i;:::-;16928:2;16924;16920:11;16907:25;16961:2;16951:8;16948:16;16945:106;;;17005:1;17034:2;17030;17023:14;16945:106;17078:50;17124:3;17119:2;17108:8;17104:2;17100:17;17096:26;17078:50;:::i;:::-;17064:65;;-1:-1:-1;17178:11:6;;17165:25;17149:14;;;17142:49;-1:-1:-1;17204:18:6;;17242:12;;;;16382;;16349:915;;17298:863;17479:6;17487;17495;17548:2;17536:9;17527:7;17523:23;17519:32;17516:52;;;17564:1;17561;17554:12;17516:52;17604:9;17591:23;-1:-1:-1;;;;;17674:2:6;17666:6;17663:14;17660:34;;;17690:1;17687;17680:12;17660:34;17713:61;17766:7;17757:6;17746:9;17742:22;17713:61;:::i;:::-;17703:71;;17827:2;17816:9;17812:18;17799:32;17783:48;;17856:2;17846:8;17843:16;17840:36;;;17872:1;17869;17862:12;17840:36;17895:63;17950:7;17939:8;17928:9;17924:24;17895:63;:::i;:::-;17885:73;;18011:2;18000:9;17996:18;17983:32;17967:48;;18040:2;18030:8;18027:16;18024:36;;;18056:1;18053;18046:12;18024:36;;18079:76;18147:7;18136:8;18125:9;18121:24;18079:76;:::i;18166:1013::-;18304:6;18312;18320;18328;18336;18344;18352;18360;18368;18421:3;18409:9;18400:7;18396:23;18392:33;18389:53;;;18438:1;18435;18428:12;18389:53;18477:9;18464:23;18496:31;18521:5;18496:31;:::i;:::-;18546:5;-1:-1:-1;18603:2:6;18588:18;;18575:32;18616:33;18575:32;18616:33;:::i;:::-;18668:7;-1:-1:-1;18722:2:6;18707:18;;18694:32;;-1:-1:-1;18777:2:6;18762:18;;18749:32;-1:-1:-1;;;;;18793:30:6;;18790:50;;;18836:1;18833;18826:12;18790:50;18859;18901:7;18892:6;18881:9;18877:22;18859:50;:::i;:::-;18849:60;;;18956:3;18945:9;18941:19;18928:33;18918:43;;19008:3;18997:9;18993:19;18980:33;18970:43;;19032:37;19064:3;19053:9;19049:19;19032:37;:::i;19408:461::-;19461:3;19499:5;19493:12;19526:6;19521:3;19514:19;19552:4;19581:2;19576:3;19572:12;19565:19;;19618:2;19611:5;19607:14;19639:1;19649:195;19663:6;19660:1;19657:13;19649:195;;;19728:13;;-1:-1:-1;;;;;19724:39:6;19712:52;;19784:12;;;;19819:15;;;;19760:1;19678:9;19649:195;;19874:261;20053:2;20042:9;20035:21;20016:4;20073:56;20125:2;20114:9;20110:18;20102:6;20073:56;:::i;20140:1532::-;20210:5;20263:3;20256:4;20248:6;20244:17;20240:27;20230:55;;20281:1;20278;20271:12;20230:55;20317:6;20304:20;20343:4;20367:60;20383:43;20423:2;20383:43;:::i;20367:60::-;20461:15;;;20547:1;20543:10;;;;20531:23;;20527:32;;;20492:12;;;;20571:15;;;20568:35;;;20599:1;20596;20589:12;20568:35;20635:2;20627:6;20623:15;20647:996;20663:6;20658:3;20655:15;20647:996;;;20749:3;20736:17;-1:-1:-1;;;;;20826:2:6;20813:11;20810:19;20807:109;;;20870:1;20899:2;20895;20888:14;20807:109;20939:24;;;;20986:4;21014:12;;;-1:-1:-1;;21010:26:6;21006:35;-1:-1:-1;21003:125:6;;;21082:1;21111:2;21107;21100:14;21003:125;21154:22;;:::i;:::-;21226:2;21222;21218:11;21205:25;21259:2;21249:8;21246:16;21243:106;;;21303:1;21332:2;21328;21321:14;21243:106;21376:50;21422:3;21417:2;21406:8;21402:2;21398:17;21394:26;21376:50;:::i;:::-;21362:65;;-1:-1:-1;21468:11:6;;;21455:25;;21493:33;21455:25;21493:33;:::i;:::-;21546:14;;;21539:31;;;;-1:-1:-1;;21583:18:6;;21621:12;;;;20680;;20647:996;;21677:1451;21744:5;21797:3;21790:4;21782:6;21778:17;21774:27;21764:55;;21815:1;21812;21805:12;21764:55;21851:6;21838:20;21877:4;21901:60;21917:43;21957:2;21917:43;:::i;21901:60::-;21995:15;;;22081:1;22077:10;;;;22065:23;;22061:32;;;22026:12;;;;22105:15;;;22102:35;;;22133:1;22130;22123:12;22102:35;22169:2;22161:6;22157:15;22181:918;22197:6;22192:3;22189:15;22181:918;;;22283:3;22270:17;-1:-1:-1;;;;;22360:2:6;22347:11;22344:19;22341:109;;;22404:1;22433:2;22429;22422:14;22341:109;22473:24;;;;22520:4;22548:12;;;-1:-1:-1;;22544:26:6;22540:35;-1:-1:-1;22537:125:6;;;22616:1;22645:2;22641;22634:14;22537:125;22688:22;;:::i;:::-;22760:2;22756;22752:11;22739:25;22793:2;22783:8;22780:16;22777:106;;;22837:1;22866:2;22862;22855:14;22777:106;22910:50;22956:3;22951:2;22940:8;22936:2;22932:17;22928:26;22910:50;:::i;:::-;22903:5;22896:65;;22997:28;23021:2;23017;23013:11;22997:28;:::i;:::-;22981:14;;;22974:52;23039:18;;-1:-1:-1;;;23077:12:6;;;;22214;;22181:918;;23133:1647;23201:5;23254:3;23247:4;23239:6;23235:17;23231:27;23221:55;;23272:1;23269;23262:12;23221:55;23308:6;23295:20;23334:4;23358:60;23374:43;23414:2;23374:43;:::i;23358:60::-;23452:15;;;23538:1;23534:10;;;;23522:23;;23518:32;;;23483:12;;;;23562:15;;;23559:35;;;23590:1;23587;23580:12;23559:35;23626:2;23618:6;23614:15;23638:1113;23654:6;23649:3;23646:15;23638:1113;;;23740:3;23727:17;-1:-1:-1;;;;;23817:2:6;23804:11;23801:19;23798:109;;;23861:1;23890:2;23886;23879:14;23798:109;23930:24;;;;23977:4;24005:12;;;-1:-1:-1;;24001:26:6;23997:35;-1:-1:-1;23994:125:6;;;24073:1;24102:2;24098;24091:14;23994:125;24145:22;;:::i;:::-;24217:2;24213;24209:11;24196:25;24250:2;24240:8;24237:16;24234:106;;;24294:1;24323:2;24319;24312:14;24234:106;24367:50;24413:3;24408:2;24397:8;24393:2;24389:17;24385:26;24367:50;:::i;:::-;24353:65;;-1:-1:-1;24460:11:6;;;24447:25;;24488:16;;;24485:106;;;24545:1;24574:2;24570;24563:14;24485:106;24627:50;24673:3;24668:2;24657:8;24653:2;24649:17;24645:26;24627:50;:::i;:::-;24611:14;;;24604:74;24691:18;;-1:-1:-1;;;24729:12:6;;;;23671;;23638:1113;;24785:1648;24854:5;24907:3;24900:4;24892:6;24888:17;24884:27;24874:55;;24925:1;24922;24915:12;24874:55;24961:6;24948:20;24987:4;25011:60;25027:43;25067:2;25027:43;:::i;25011:60::-;25105:15;;;25191:1;25187:10;;;;25175:23;;25171:32;;;25136:12;;;;25215:15;;;25212:35;;;25243:1;25240;25233:12;25212:35;25279:2;25271:6;25267:15;25291:1113;25307:6;25302:3;25299:15;25291:1113;;;25393:3;25380:17;-1:-1:-1;;;;;25470:2:6;25457:11;25454:19;25451:109;;;25514:1;25543:2;25539;25532:14;25451:109;25583:24;;;;25630:4;25658:12;;;-1:-1:-1;;25654:26:6;25650:35;-1:-1:-1;25647:125:6;;;25726:1;25755:2;25751;25744:14;25647:125;25798:22;;:::i;:::-;25870:2;25866;25862:11;25849:25;25903:2;25893:8;25890:16;25887:106;;;25947:1;25976:2;25972;25965:14;25887:106;26020:50;26066:3;26061:2;26050:8;26046:2;26042:17;26038:26;26020:50;:::i;:::-;26006:65;;-1:-1:-1;26113:11:6;;;26100:25;;26141:16;;;26138:106;;;26198:1;26227:2;26223;26216:14;26138:106;26280:50;26326:3;26321:2;26310:8;26306:2;26302:17;26298:26;26280:50;:::i;:::-;26264:14;;;26257:74;26344:18;;-1:-1:-1;;;26382:12:6;;;;25324;;25291:1113;;26438:1909;26889:6;26897;26905;26913;26921;26929;26937;26945;26998:3;26986:9;26977:7;26973:23;26969:33;26966:53;;;27015:1;27012;27005:12;26966:53;27038:29;27057:9;27038:29;:::i;:::-;27028:39;;27114:2;27103:9;27099:18;27086:32;27076:42;;27169:2;27158:9;27154:18;27141:32;-1:-1:-1;;;;;27233:2:6;27225:6;27222:14;27219:34;;;27249:1;27246;27239:12;27219:34;27272:77;27341:7;27332:6;27321:9;27317:22;27272:77;:::i;:::-;27262:87;;27402:2;27391:9;27387:18;27374:32;27358:48;;27431:2;27421:8;27418:16;27415:36;;;27447:1;27444;27437:12;27415:36;27470:76;27538:7;27527:8;27516:9;27512:24;27470:76;:::i;:::-;27460:86;;27599:3;27588:9;27584:19;27571:33;27555:49;;27629:2;27619:8;27616:16;27613:36;;;27645:1;27642;27635:12;27613:36;27668:77;27737:7;27726:8;27715:9;27711:24;27668:77;:::i;:::-;27658:87;;27798:3;27787:9;27783:19;27770:33;27754:49;;27828:2;27818:8;27815:16;27812:36;;;27844:1;27841;27834:12;27812:36;27867:76;27935:7;27924:8;27913:9;27909:24;27867:76;:::i;:::-;27857:86;;27996:3;27985:9;27981:19;27968:33;27952:49;;28026:2;28016:8;28013:16;28010:36;;;28042:1;28039;28032:12;28010:36;28065:78;28135:7;28124:8;28113:9;28109:24;28065:78;:::i;:::-;28055:88;;28196:3;28185:9;28181:19;28168:33;28152:49;;28226:2;28216:8;28213:16;28210:36;;;28242:1;28239;28232:12;28210:36;;28265:76;28333:7;28322:8;28311:9;28307:24;28265:76;:::i;:::-;28255:86;;;26438:1909;;;;;;;;;;;:::o;28352:598::-;28439:6;28447;28455;28508:2;28496:9;28487:7;28483:23;28479:32;28476:52;;;28524:1;28521;28514:12;28476:52;28563:9;28550:23;28582:31;28607:5;28582:31;:::i;:::-;28632:5;-1:-1:-1;28689:2:6;28674:18;;28661:32;28702:33;28661:32;28702:33;:::i;:::-;28754:7;-1:-1:-1;28812:2:6;28797:18;;28784:32;-1:-1:-1;;;;;28828:30:6;;28825:50;;;28871:1;28868;28861:12;28955:869;29139:6;29147;29155;29208:2;29196:9;29187:7;29183:23;29179:32;29176:52;;;29224:1;29221;29214:12;29176:52;29264:9;29251:23;-1:-1:-1;;;;;29334:2:6;29326:6;29323:14;29320:34;;;29350:1;29347;29340:12;29320:34;29373:61;29426:7;29417:6;29406:9;29402:22;29373:61;:::i;:::-;29363:71;;29487:2;29476:9;29472:18;29459:32;29443:48;;29516:2;29506:8;29503:16;29500:36;;;29532:1;29529;29522:12;29500:36;29555:63;29610:7;29599:8;29588:9;29584:24;29555:63;:::i;:::-;29545:73;;29671:2;29660:9;29656:18;29643:32;29627:48;;29700:2;29690:8;29687:16;29684:36;;;29716:1;29713;29706:12;29684:36;;29739:79;29810:7;29799:8;29788:9;29784:24;29739:79;:::i;29829:615::-;29881:3;29919:5;29913:12;29946:6;29941:3;29934:19;29972:4;30013:2;30008:3;30004:12;30038:11;30065;30058:18;;30115:6;30112:1;30108:14;30101:5;30097:26;30085:38;;30157:2;30150:5;30146:14;30178:1;30188:230;30202:6;30199:1;30196:13;30188:230;;;30273:5;30267:4;30263:16;30258:3;30251:29;30301:37;30333:4;30324:6;30318:13;30301:37;:::i;:::-;30396:12;;;;30293:45;-1:-1:-1;30361:15:6;;;;30224:1;30217:9;30188:230;;;-1:-1:-1;30434:4:6;;29829:615;-1:-1:-1;;;;;;;29829:615:6:o;30449:280::-;30648:2;30637:9;30630:21;30611:4;30668:55;30719:2;30708:9;30704:18;30696:6;30668:55;:::i;33791:247::-;33850:6;33903:2;33891:9;33882:7;33878:23;33874:32;33871:52;;;33919:1;33916;33909:12;33871:52;33958:9;33945:23;33977:31;34002:5;33977:31;:::i;34043:736::-;34148:6;34156;34164;34172;34180;34233:3;34221:9;34212:7;34208:23;34204:33;34201:53;;;34250:1;34247;34240:12;34201:53;34289:9;34276:23;34308:31;34333:5;34308:31;:::i;:::-;34358:5;-1:-1:-1;34410:2:6;34395:18;;34382:32;;-1:-1:-1;34465:2:6;34450:18;;34437:32;-1:-1:-1;;;;;34481:30:6;;34478:50;;;34524:1;34521;34514:12;34478:50;34547;34589:7;34580:6;34569:9;34565:22;34547:50;:::i;:::-;34537:60;;;34649:2;34638:9;34634:18;34621:32;34662:33;34687:7;34662:33;:::i;:::-;34043:736;;;;-1:-1:-1;34043:736:6;;34768:3;34753:19;34740:33;;34043:736;-1:-1:-1;;34043:736:6:o;34784:865::-;34966:6;34974;34982;35035:2;35023:9;35014:7;35010:23;35006:32;35003:52;;;35051:1;35048;35041:12;35003:52;35091:9;35078:23;-1:-1:-1;;;;;35161:2:6;35153:6;35150:14;35147:34;;;35177:1;35174;35167:12;35147:34;35200:61;35253:7;35244:6;35233:9;35229:22;35200:61;:::i;:::-;35190:71;;35314:2;35303:9;35299:18;35286:32;35270:48;;35343:2;35333:8;35330:16;35327:36;;;35359:1;35356;35349:12;35327:36;35382:63;35437:7;35426:8;35415:9;35411:24;35382:63;:::i;:::-;35372:73;;35498:2;35487:9;35483:18;35470:32;35454:48;;35527:2;35517:8;35514:16;35511:36;;;35543:1;35540;35533:12;35511:36;;35566:77;35635:7;35624:8;35613:9;35609:24;35566:77;:::i;35654:1014::-;35790:6;35798;35806;35814;35822;35830;35838;35846;35854;35907:3;35895:9;35886:7;35882:23;35878:33;35875:53;;;35924:1;35921;35914:12;35875:53;35963:9;35950:23;35982:31;36007:5;35982:31;:::i;:::-;36032:5;-1:-1:-1;36089:2:6;36074:18;;36061:32;36102:33;36061:32;36102:33;:::i;:::-;36154:7;-1:-1:-1;36208:2:6;36193:18;;36180:32;;-1:-1:-1;36263:2:6;36248:18;;36235:32;-1:-1:-1;;;;;36279:30:6;;36276:50;;;36322:1;36319;36312:12;36276:50;36345;36387:7;36378:6;36367:9;36363:22;36345:50;:::i;:::-;36335:60;;;36414:36;36445:3;36434:9;36430:19;36414:36;:::i;:::-;36404:46;;36497:3;36486:9;36482:19;36469:33;36459:43;;36521:37;36553:3;36542:9;36538:19;36521:37;:::i;36673:456::-;36747:6;36755;36763;36816:2;36804:9;36795:7;36791:23;36787:32;36784:52;;;36832:1;36829;36822:12;36784:52;36871:9;36858:23;36890:31;36915:5;36890:31;:::i;:::-;36940:5;-1:-1:-1;36997:2:6;36982:18;;36969:32;37010:33;36969:32;37010:33;:::i;:::-;37062:7;-1:-1:-1;37088:35:6;37119:2;37104:18;;37088:35;:::i;:::-;37078:45;;36673:456;;;;;:::o;37134:663::-;37239:6;37247;37255;37263;37271;37324:3;37312:9;37303:7;37299:23;37295:33;37292:53;;;37341:1;37338;37331:12;37292:53;37380:9;37367:23;37399:31;37424:5;37399:31;:::i;:::-;37449:5;-1:-1:-1;37501:2:6;37486:18;;37473:32;;-1:-1:-1;37556:2:6;37541:18;;37528:32;-1:-1:-1;;;;;37572:30:6;;37569:50;;;37615:1;37612;37605:12;37569:50;37638;37680:7;37671:6;37660:9;37656:22;37638:50;:::i;:::-;37134:663;;;;-1:-1:-1;37628:60:6;;37735:2;37720:18;;37707:32;;-1:-1:-1;37786:3:6;37771:19;37758:33;;37134:663;-1:-1:-1;;;37134:663:6:o;37802:1700::-;38134:6;38142;38150;38158;38166;38174;38182;38190;38243:3;38231:9;38222:7;38218:23;38214:33;38211:53;;;38260:1;38257;38250:12;38211:53;38283:29;38302:9;38283:29;:::i;:::-;38273:39;;38359:2;38348:9;38344:18;38331:32;38321:42;;38414:2;38403:9;38399:18;38386:32;-1:-1:-1;;;;;38478:2:6;38470:6;38467:14;38464:34;;;38494:1;38491;38484:12;38464:34;38517:60;38569:7;38560:6;38549:9;38545:22;38517:60;:::i;:::-;38507:70;;38630:2;38619:9;38615:18;38602:32;38586:48;;38659:2;38649:8;38646:16;38643:36;;;38675:1;38672;38665:12;38643:36;38698:62;38752:7;38741:8;38730:9;38726:24;38698:62;:::i;:::-;38688:72;;38813:3;38802:9;38798:19;38785:33;38769:49;;38843:2;38833:8;38830:16;38827:36;;;38859:1;38856;38849:12;38827:36;38882:62;38936:7;38925:8;38914:9;38910:24;38882:62;:::i;:::-;38872:72;;38997:3;38986:9;38982:19;38969:33;38953:49;;39027:2;39017:8;39014:16;39011:36;;;39043:1;39040;39033:12;39011:36;39066:62;39120:7;39109:8;39098:9;39094:24;39066:62;:::i;:::-;39056:72;;39181:3;39170:9;39166:19;39153:33;39137:49;;39211:2;39201:8;39198:16;39195:36;;;39227:1;39224;39217:12;39195:36;39250:62;39304:7;39293:8;39282:9;39278:24;39250:62;:::i;:::-;39240:72;;39365:3;39354:9;39350:19;39337:33;39321:49;;39395:2;39385:8;39382:16;39379:36;;;39411:1;39408;39401:12;39379:36;;39434:62;39488:7;39477:8;39466:9;39462:24;39434:62;:::i;39507:1310::-;40106:3;40095:9;40088:22;40069:4;40133:57;40185:3;40174:9;40170:19;40162:6;40133:57;:::i;:::-;40238:9;40230:6;40226:22;40221:2;40210:9;40206:18;40199:50;40272:41;40306:6;40298;40272:41;:::i;:::-;40258:55;;40361:9;40353:6;40349:22;40344:2;40333:9;40329:18;40322:50;40395:43;40431:6;40423;40395:43;:::i;:::-;40381:57;;40486:9;40478:6;40474:22;40469:2;40458:9;40454:18;40447:50;40520:44;40557:6;40549;40520:44;:::i;:::-;40506:58;;40613:9;40605:6;40601:22;40595:3;40584:9;40580:19;40573:51;40647:43;40683:6;40675;40647:43;:::i;:::-;40633:57;;40739:9;40731:6;40727:22;40721:3;40710:9;40706:19;40699:51;40767:44;40804:6;40796;40767:44;:::i;:::-;40759:52;39507:1310;-1:-1:-1;;;;;;;;;39507:1310:6:o;41906:1087::-;42045:6;42053;42061;42069;42077;42085;42093;42101;42109;42162:3;42150:9;42141:7;42137:23;42133:33;42130:53;;;42179:1;42176;42169:12;42130:53;42218:9;42205:23;42237:31;42262:5;42237:31;:::i;:::-;42287:5;-1:-1:-1;42344:2:6;42329:18;;42316:32;42357:33;42316:32;42357:33;:::i;:::-;42409:7;-1:-1:-1;42463:2:6;42448:18;;42435:32;;-1:-1:-1;42518:2:6;42503:18;;42490:32;-1:-1:-1;;;;;42534:30:6;;42531:50;;;42577:1;42574;42567:12;42531:50;42600;42642:7;42633:6;42622:9;42618:22;42600:50;:::i;:::-;42590:60;;;42702:3;42691:9;42687:19;42674:33;42716;42741:7;42716:33;:::i;43281:746::-;43386:6;43394;43402;43410;43463:3;43451:9;43442:7;43438:23;43434:33;43431:53;;;43480:1;43477;43470:12;43431:53;43519:9;43506:23;43538:31;43563:5;43538:31;:::i;:::-;43588:5;-1:-1:-1;43640:2:6;43625:18;;43612:32;;-1:-1:-1;43695:2:6;43680:18;;43667:32;-1:-1:-1;;;;;43748:14:6;;;43745:34;;;43775:1;43772;43765:12;43745:34;43798:50;43840:7;43831:6;43820:9;43816:22;43798:50;:::i;:::-;43788:60;;43901:2;43890:9;43886:18;43873:32;43857:48;;43930:2;43920:8;43917:16;43914:36;;;43946:1;43943;43936:12;43914:36;;43969:52;44013:7;44002:8;43991:9;43987:24;43969:52;:::i;:::-;43959:62;;;43281:746;;;;;;;:::o;44032:863::-;44213:6;44221;44229;44282:2;44270:9;44261:7;44257:23;44253:32;44250:52;;;44298:1;44295;44288:12;44250:52;44338:9;44325:23;-1:-1:-1;;;;;44408:2:6;44400:6;44397:14;44394:34;;;44424:1;44421;44414:12;44394:34;44447:61;44500:7;44491:6;44480:9;44476:22;44447:61;:::i;:::-;44437:71;;44561:2;44550:9;44546:18;44533:32;44517:48;;44590:2;44580:8;44577:16;44574:36;;;44606:1;44603;44596:12;44574:36;44629:63;44684:7;44673:8;44662:9;44658:24;44629:63;:::i;:::-;44619:73;;44745:2;44734:9;44730:18;44717:32;44701:48;;44774:2;44764:8;44761:16;44758:36;;;44790:1;44787;44780:12;44758:36;;44813:76;44881:7;44870:8;44859:9;44855:24;44813:76;:::i;45652:867::-;45835:6;45843;45851;45904:2;45892:9;45883:7;45879:23;45875:32;45872:52;;;45920:1;45917;45910:12;45872:52;45960:9;45947:23;-1:-1:-1;;;;;46030:2:6;46022:6;46019:14;46016:34;;;46046:1;46043;46036:12;46016:34;46069:61;46122:7;46113:6;46102:9;46098:22;46069:61;:::i;:::-;46059:71;;46183:2;46172:9;46168:18;46155:32;46139:48;;46212:2;46202:8;46199:16;46196:36;;;46228:1;46225;46218:12;46196:36;46251:63;46306:7;46295:8;46284:9;46280:24;46251:63;:::i;:::-;46241:73;;46367:2;46356:9;46352:18;46339:32;46323:48;;46396:2;46386:8;46383:16;46380:36;;;46412:1;46409;46402:12;46380:36;;46435:78;46505:7;46494:8;46483:9;46479:24;46435:78;:::i;46524:663::-;46626:6;46634;46642;46650;46658;46711:3;46699:9;46690:7;46686:23;46682:33;46679:53;;;46728:1;46725;46718:12;46679:53;46767:9;46754:23;46786:31;46811:5;46786:31;:::i;:::-;46836:5;-1:-1:-1;46888:2:6;46873:18;;46860:32;;-1:-1:-1;46943:2:6;46928:18;;46915:32;-1:-1:-1;;;;;46959:30:6;;46956:50;;;47002:1;46999;46992:12;46956:50;47025;47067:7;47058:6;47047:9;47043:22;47025:50;:::i;:::-;47015:60;;;47094:35;47125:2;47114:9;47110:18;47094:35;:::i;48458:251::-;48528:6;48581:2;48569:9;48560:7;48556:23;48552:32;48549:52;;;48597:1;48594;48587:12;48549:52;48629:9;48623:16;48648:31;48673:5;48648:31;:::i;48714:380::-;48793:1;48789:12;;;;48836;;;48857:61;;48911:4;48903:6;48899:17;48889:27;;48857:61;48964:2;48956:6;48953:14;48933:18;48930:38;48927:161;;49010:10;49005:3;49001:20;48998:1;48991:31;49045:4;49042:1;49035:15;49073:4;49070:1;49063:15;48927:161;;48714:380;;;:::o;49225:545::-;49327:2;49322:3;49319:11;49316:448;;;49363:1;49388:5;49384:2;49377:17;49433:4;49429:2;49419:19;49503:2;49491:10;49487:19;49484:1;49480:27;49474:4;49470:38;49539:4;49527:10;49524:20;49521:47;;;-1:-1:-1;49562:4:6;49521:47;49617:2;49612:3;49608:12;49605:1;49601:20;49595:4;49591:31;49581:41;;49672:82;49690:2;49683:5;49680:13;49672:82;;;49735:17;;;49716:1;49705:13;49672:82;;;49676:3;;;49316:448;49225:545;;;:::o;49946:1352::-;50072:3;50066:10;-1:-1:-1;;;;;50091:6:6;50088:30;50085:56;;;50121:18;;:::i;:::-;50150:97;50240:6;50200:38;50232:4;50226:11;50200:38;:::i;:::-;50194:4;50150:97;:::i;:::-;50302:4;;50366:2;50355:14;;50383:1;50378:663;;;;51085:1;51102:6;51099:89;;;-1:-1:-1;51154:19:6;;;51148:26;51099:89;-1:-1:-1;;49903:1:6;49899:11;;;49895:24;49891:29;49881:40;49927:1;49923:11;;;49878:57;51201:81;;50348:944;;50378:663;49172:1;49165:14;;;49209:4;49196:18;;-1:-1:-1;;50414:20:6;;;50532:236;50546:7;50543:1;50540:14;50532:236;;;50635:19;;;50629:26;50614:42;;50727:27;;;;50695:1;50683:14;;;;50562:19;;50532:236;;;50536:3;50796:6;50787:7;50784:19;50781:201;;;50857:19;;;50851:26;-1:-1:-1;;50940:1:6;50936:14;;;50952:3;50932:24;50928:37;50924:42;50909:58;50894:74;;50781:201;-1:-1:-1;;;;;51028:1:6;51012:14;;;51008:22;50995:36;;-1:-1:-1;49946:1352:6:o;51303:127::-;51364:10;51359:3;51355:20;51352:1;51345:31;51395:4;51392:1;51385:15;51419:4;51416:1;51409:15;51435:551;51651:2;51640:9;51633:21;51614:4;51671:44;51711:2;51700:9;51696:18;51688:6;51671:44;:::i;:::-;51663:52;;51745:1;51737:6;51734:13;51724:144;;51790:10;51785:3;51781:20;51778:1;51771:31;51825:4;51822:1;51815:15;51853:4;51850:1;51843:15;51724:144;51899:2;51884:18;;51877:34;;;;-1:-1:-1;;;;;51947:32:6;;;;51942:2;51927:18;;;51920:60;51435:551;;-1:-1:-1;51435:551:6:o;51991:127::-;52052:10;52047:3;52043:20;52040:1;52033:31;52083:4;52080:1;52073:15;52107:4;52104:1;52097:15;52123:767;52460:6;52449:9;52442:25;52503:6;52498:2;52487:9;52483:18;52476:34;52575:1;52571;52566:3;52562:11;52558:19;52550:6;52546:32;52541:2;52530:9;52526:18;52519:60;52615:6;52610:2;52599:9;52595:18;52588:34;52659:3;52653;52642:9;52638:19;52631:32;52423:4;52686:45;52726:3;52715:9;52711:19;52703:6;52686:45;:::i;:::-;52780:9;52772:6;52768:22;52762:3;52751:9;52747:19;52740:51;52808:32;52833:6;52825;52808:32;:::i;:::-;52800:40;;;52877:6;52871:3;52860:9;52856:19;52849:35;52123:767;;;;;;;;;;:::o;52895:289::-;53026:3;53064:6;53058:13;53080:66;53139:6;53134:3;53127:4;53119:6;53115:17;53080:66;:::i;:::-;53162:16;;;;;52895:289;-1:-1:-1;;52895:289:6:o;53189:380::-;53431:66;53419:79;;53523:2;53514:12;;53507:28;;;;53560:2;53551:12;;53189:380::o;53574:674::-;53889:6;53878:9;53871:25;53932:6;53927:2;53916:9;53912:18;53905:34;54004:1;54000;53995:3;53991:11;53987:19;53979:6;53975:32;53970:2;53959:9;53955:18;53948:60;54044:6;54039:2;54028:9;54024:18;54017:34;54088:3;54082;54071:9;54067:19;54060:32;53852:4;54109:45;54149:3;54138:9;54134:19;54126:6;54109:45;:::i;:::-;54185:3;54170:19;;54163:35;;;;-1:-1:-1;54229:3:6;54214:19;54207:35;54101:53;53574:674;-1:-1:-1;;;;;53574:674:6:o;55704:706::-;56021:6;56010:9;56003:25;56064:6;56059:2;56048:9;56044:18;56037:34;55984:4;56107:1;56103;56098:3;56094:11;56090:19;56157:2;56149:6;56145:15;56140:2;56129:9;56125:18;56118:43;56197:6;56192:2;56181:9;56177:18;56170:34;56241:3;56235;56224:9;56220:19;56213:32;56262:45;56302:3;56291:9;56287:19;56279:6;56262:45;:::i;:::-;56344:15;;56338:3;56323:19;;56316:44;-1:-1:-1;56391:3:6;56376:19;56369:35;56254:53;55704:706;-1:-1:-1;;;;;55704:706:6:o;56415:686::-;56726:6;56715:9;56708:25;56769:6;56764:2;56753:9;56749:18;56742:34;56841:1;56837;56832:3;56828:11;56824:19;56816:6;56812:32;56807:2;56796:9;56792:18;56785:60;56881:6;56876:2;56865:9;56861:18;56854:34;56925:3;56919;56908:9;56904:19;56897:32;56689:4;56946:45;56986:3;56975:9;56971:19;56963:6;56946:45;:::i;:::-;57035:14;;57028:22;57022:3;57007:19;;57000:51;-1:-1:-1;57082:3:6;57067:19;57060:35;56938:53;56415:686;-1:-1:-1;;;;;56415:686:6:o;57398:297::-;57516:12;;57563:4;57552:16;;;57546:23;;57516:12;57581:16;;57578:111;;;-1:-1:-1;;57655:4:6;57651:17;;;;57648:1;57644:25;57640:38;57629:50;;57398:297;-1:-1:-1;57398:297:6:o;57700:232::-;57739:3;57760:17;;;57757:140;;57819:10;57814:3;57810:20;57807:1;57800:31;57854:4;57851:1;57844:15;57882:4;57879:1;57872:15;57757:140;-1:-1:-1;57924:1:6;57913:13;;57700:232::o;57937:300::-;58108:2;58097:9;58090:21;58071:4;58128:44;58168:2;58157:9;58153:18;58145:6;58128:44;:::i;:::-;58120:52;;58222:6;58215:14;58208:22;58203:2;58192:9;58188:18;58181:50;57937:300;;;;;:::o;58242:288::-;58417:2;58406:9;58399:21;58380:4;58437:44;58477:2;58466:9;58462:18;58454:6;58437:44;:::i;:::-;58429:52;;58517:6;58512:2;58501:9;58497:18;58490:34;58242:288;;;;;:::o;58535:316::-;58712:2;58701:9;58694:21;58675:4;58732:44;58772:2;58761:9;58757:18;58749:6;58732:44;:::i;:::-;58724:52;;58841:1;58837;58832:3;58828:11;58824:19;58816:6;58812:32;58807:2;58796:9;58792:18;58785:60;58535:316;;;;;:::o;59259:381::-;59456:2;59445:9;59438:21;59419:4;59482:44;59522:2;59511:9;59507:18;59499:6;59482:44;:::i;:::-;59574:9;59566:6;59562:22;59557:2;59546:9;59542:18;59535:50;59602:32;59627:6;59619;59602:32;:::i;:::-;59594:40;59259:381;-1:-1:-1;;;;;59259:381:6:o
Swarm Source
ipfs://50cecf49729830824fd5f0a36c5b59bffc6aae7bc56966509393f935f4d16524
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.