Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 15,453 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 81862579 | 4 days ago | IN | 0 POL | 0.00189808 | ||||
| Set Approval For... | 80256951 | 42 days ago | IN | 0 POL | 0.00139695 | ||||
| Set Approval For... | 80123805 | 45 days ago | IN | 0 POL | 0.00096234 | ||||
| Set Approval For... | 79498122 | 59 days ago | IN | 0 POL | 0.00177438 | ||||
| Set Approval For... | 79462409 | 60 days ago | IN | 0 POL | 0.00090912 | ||||
| Set Approval For... | 79211240 | 66 days ago | IN | 0 POL | 0.00365296 | ||||
| Set Approval For... | 78686906 | 78 days ago | IN | 0 POL | 0.00559976 | ||||
| Set Approval For... | 77779886 | 99 days ago | IN | 0 POL | 0.00139695 | ||||
| Set Approval For... | 76358005 | 134 days ago | IN | 0 POL | 0.00073959 | ||||
| Safe Transfer Fr... | 75433441 | 157 days ago | IN | 0 POL | 0.00175498 | ||||
| Set Approval For... | 75000111 | 167 days ago | IN | 0 POL | 0.00068026 | ||||
| Set Approval For... | 74285775 | 185 days ago | IN | 0 POL | 0.00074211 | ||||
| Set Approval For... | 71357494 | 258 days ago | IN | 0 POL | 0.00139695 | ||||
| Set Approval For... | 69640714 | 301 days ago | IN | 0 POL | 0.00144351 | ||||
| Safe Transfer Fr... | 69082496 | 315 days ago | IN | 0 POL | 0.00179953 | ||||
| Set Approval For... | 68140429 | 338 days ago | IN | 0 POL | 0.00263126 | ||||
| Safe Transfer Fr... | 68018047 | 341 days ago | IN | 0 POL | 0.00181206 | ||||
| Set Approval For... | 67784355 | 347 days ago | IN | 0 POL | 0.00276941 | ||||
| Set Approval For... | 67312249 | 359 days ago | IN | 0 POL | 0.00139695 | ||||
| Set Approval For... | 66814639 | 372 days ago | IN | 0 POL | 0.00237954 | ||||
| Set Approval For... | 65004204 | 417 days ago | IN | 0 POL | 0.00145753 | ||||
| Set Approval For... | 64566280 | 428 days ago | IN | 0 POL | 0.00267991 | ||||
| Set Approval For... | 63157307 | 463 days ago | IN | 0 POL | 0.00153369 | ||||
| Set Approval For... | 62764011 | 473 days ago | IN | 0 POL | 0.00079959 | ||||
| Set Approval For... | 62763940 | 473 days ago | IN | 0 POL | 0.00073959 |
Latest 8 internal transactions
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NFTChat
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/**
*Submitted for verification at polygonscan.com on 2021-10-12
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
contract Ownable
{
/**
* @dev Error constants.
*/
string public constant NOT_CURRENT_OWNER = "018001";
string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";
/**
* @dev Current owner address.
*/
address public owner;
/**
* @dev An event which is triggered when the owner is changed.
* @param previousOwner The address of the previous owner.
* @param newOwner The address of the new owner.
*/
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The constructor sets the original `owner` of the contract to the sender account.
*/
constructor()
{
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner()
{
require(msg.sender == owner, NOT_CURRENT_OWNER);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(
address _newOwner
)
public
onlyOwner
{
require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
library AddressUtils
{
/**
* @dev Returns whether the target address is a contract.
* @param _addr Address to check.
* @return addressCheck True if _addr is a contract, false if not.
*/
function isContract(
address _addr
)
internal
view
returns (bool addressCheck)
{
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(_addr) } // solhint-disable-line
addressCheck = (codehash != 0x0 && codehash != accountHash);
}
}
interface ERC165
{
/**
* @dev Checks if the smart contract includes a specific interface.
* This function uses less than 30,000 gas.
* @param _interfaceID The interface identifier, as specified in ERC-165.
* @return True if _interfaceID is supported, false otherwise.
*/
function supportsInterface(
bytes4 _interfaceID
)
external
view
returns (bool);
}
/**
* @dev Implementation of standard for detect smart contract interfaces.
*/
contract SupportsInterface is
ERC165
{
/**
* @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
*/
mapping(bytes4 => bool) internal supportedInterfaces;
/**
* @dev Contract constructor.
*/
constructor()
{
supportedInterfaces[0x01ffc9a7] = true; // ERC165
}
/**
* @dev Function to check which interfaces are suported by this contract.
* @param _interfaceID Id of the interface.
* @return True if _interfaceID is supported, false otherwise.
*/
function supportsInterface(
bytes4 _interfaceID
)
external
override
view
returns (bool)
{
return supportedInterfaces[_interfaceID];
}
}
interface ERC721TokenReceiver
{
/**
* @notice The contract address is always the message sender. A wallet/broker/auction application
* MUST implement the wallet interface if it will accept safe transfers.
* @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
* recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
* of other than the magic value MUST result in the transaction being reverted.
* Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
* @param _operator The address which called `safeTransferFrom` function.
* @param _from The address which previously owned the token.
* @param _tokenId The NFT identifier which is being transferred.
* @param _data Additional data with no specified format.
* @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
*/
function onERC721Received(
address _operator,
address _from,
uint256 _tokenId,
bytes calldata _data
)
external
returns(bytes4);
}
interface ERC721
{
/**
* @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
* created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
* number of NFTs may be created and assigned without emitting Transfer. At the time of any
* transfer, the approved address for that NFT (if any) is reset to none.
*/
event Transfer(
address indexed _from,
address indexed _to,
uint256 indexed _tokenId
);
/**
* @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
* address indicates there is no approved address. When a Transfer event emits, this also
* indicates that the approved address for that NFT (if any) is reset to none.
*/
event Approval(
address indexed _owner,
address indexed _approved,
uint256 indexed _tokenId
);
/**
* @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
* all NFTs of the owner.
*/
event ApprovalForAll(
address indexed _owner,
address indexed _operator,
bool _approved
);
/**
* @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
* approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
* the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
* function checks if `_to` is a smart contract (code size > 0). If so, it calls
* `onERC721Received` on `_to` and throws if the return value is not
* `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
* @dev Transfers the ownership of an NFT from one address to another address. This function can
* be changed to payable.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
* @param _data Additional data with no specified format, sent in call to `_to`.
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes calldata _data
)
external;
/**
* @notice This works identically to the other function with an extra data parameter, except this
* function just sets data to ""
* @dev Transfers the ownership of an NFT from one address to another address. This function can
* be changed to payable.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId
)
external;
/**
* @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
* they may be permanently lost.
* @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
* address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
* address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
*/
function transferFrom(
address _from,
address _to,
uint256 _tokenId
)
external;
/**
* @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
* the current NFT owner, or an authorized operator of the current owner.
* @param _approved The new approved NFT controller.
* @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
* @param _tokenId The NFT to approve.
*/
function approve(
address _approved,
uint256 _tokenId
)
external;
/**
* @notice The contract MUST allow multiple operators per owner.
* @dev Enables or disables approval for a third party ("operator") to manage all of
* `msg.sender`'s assets. It also emits the ApprovalForAll event.
* @param _operator Address to add to the set of authorized operators.
* @param _approved True if the operators is approved, false to revoke approval.
*/
function setApprovalForAll(
address _operator,
bool _approved
)
external;
/**
* @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
* considered invalid, and this function throws for queries about the zero address.
* @notice Count all NFTs assigned to an owner.
* @param _owner Address for whom to query the balance.
* @return Balance of _owner.
*/
function balanceOf(
address _owner
)
external
view
returns (uint256);
/**
* @notice Find the owner of an NFT.
* @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
* considered invalid, and queries about them do throw.
* @param _tokenId The identifier for an NFT.
* @return Address of _tokenId owner.
*/
function ownerOf(
uint256 _tokenId
)
external
view
returns (address);
/**
* @notice Throws if `_tokenId` is not a valid NFT.
* @dev Get the approved address for a single NFT.
* @param _tokenId The NFT to find the approved address for.
* @return Address that _tokenId is approved for.
*/
function getApproved(
uint256 _tokenId
)
external
view
returns (address);
/**
* @notice Query if an address is an authorized operator for another address.
* @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
* @param _owner The address that owns the NFTs.
* @param _operator The address that acts on behalf of the owner.
* @return True if approved for all, false otherwise.
*/
function isApprovedForAll(
address _owner,
address _operator
)
external
view
returns (bool);
}
interface ERC721Metadata
{
/**
* @dev Returns a descriptive name for a collection of NFTs in this contract.
* @return _name Representing name.
*/
function name()
external
view
returns (string memory _name);
/**
* @dev Returns a abbreviated name for a collection of NFTs in this contract.
* @return _symbol Representing symbol.
*/
function symbol()
external
view
returns (string memory _symbol);
/**
* @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
* `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
* that conforms to the "ERC721 Metadata JSON Schema".
* @return URI of _tokenId.
*/
function tokenURI(uint256 _tokenId)
external
view
returns (string memory);
}
/**
* @dev Implementation of ERC-721 non-fungible token standard.
*/
contract NFToken is
ERC721,
SupportsInterface
{
using AddressUtils for address;
/**
* @dev List of revert message codes. Implementing dApp should handle showing the correct message.
* Based on 0xcert framework error codes.
*/
string constant ZERO_ADDRESS = "003001";
string constant NOT_VALID_NFT = "003002";
string constant NOT_OWNER_OR_OPERATOR = "003003";
string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
string constant NFT_ALREADY_EXISTS = "003006";
string constant NOT_OWNER = "003007";
string constant IS_OWNER = "003008";
/**
* @dev Magic value of a smart contract that can receive NFT.
* Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
*/
bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;
/**
* @dev A mapping from NFT ID to the address that owns it.
*/
mapping (uint256 => address) internal idToOwner;
/**
* @dev Mapping from NFT ID to approved address.
*/
mapping (uint256 => address) internal idToApproval;
/**
* @dev Mapping from owner address to count of their tokens.
*/
mapping (address => uint256) private ownerToNFTokenCount;
/**
* @dev Mapping from owner address to mapping of operator addresses.
*/
mapping (address => mapping (address => bool)) internal ownerToOperators;
/**
* @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
* @param _tokenId ID of the NFT to validate.
*/
modifier canOperate(
uint256 _tokenId
)
{
address tokenOwner = idToOwner[_tokenId];
require(
tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
NOT_OWNER_OR_OPERATOR
);
_;
}
/**
* @dev Guarantees that the msg.sender is allowed to transfer NFT.
* @param _tokenId ID of the NFT to transfer.
*/
modifier canTransfer(
uint256 _tokenId
)
{
address tokenOwner = idToOwner[_tokenId];
require(
tokenOwner == msg.sender
|| idToApproval[_tokenId] == msg.sender
|| ownerToOperators[tokenOwner][msg.sender],
NOT_OWNER_APPROVED_OR_OPERATOR
);
_;
}
/**
* @dev Guarantees that _tokenId is a valid Token.
* @param _tokenId ID of the NFT to validate.
*/
modifier validNFToken(
uint256 _tokenId
)
{
require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
_;
}
/**
* @dev Contract constructor.
*/
constructor()
{
supportedInterfaces[0x80ac58cd] = true; // ERC721
}
/**
* @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
* approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
* the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
* function checks if `_to` is a smart contract (code size > 0). If so, it calls
* `onERC721Received` on `_to` and throws if the return value is not
* `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
* @dev Transfers the ownership of an NFT from one address to another address. This function can
* be changed to payable.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
* @param _data Additional data with no specified format, sent in call to `_to`.
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes calldata _data
)
external
override
{
_safeTransferFrom(_from, _to, _tokenId, _data);
}
/**
* @notice This works identically to the other function with an extra data parameter, except this
* function just sets data to "".
* @dev Transfers the ownership of an NFT from one address to another address. This function can
* be changed to payable.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId
)
external
override
{
_safeTransferFrom(_from, _to, _tokenId, "");
}
/**
* @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
* they may be permanently lost.
* @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
* address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
* address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
*/
function transferFrom(
address _from,
address _to,
uint256 _tokenId
)
external
override
canTransfer(_tokenId)
validNFToken(_tokenId)
{
address tokenOwner = idToOwner[_tokenId];
require(tokenOwner == _from, NOT_OWNER);
require(_to != address(0), ZERO_ADDRESS);
_transfer(_to, _tokenId);
}
/**
* @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
* the current NFT owner, or an authorized operator of the current owner.
* @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
* @param _approved Address to be approved for the given NFT ID.
* @param _tokenId ID of the token to be approved.
*/
function approve(
address _approved,
uint256 _tokenId
)
external
override
canOperate(_tokenId)
validNFToken(_tokenId)
{
address tokenOwner = idToOwner[_tokenId];
require(_approved != tokenOwner, IS_OWNER);
idToApproval[_tokenId] = _approved;
emit Approval(tokenOwner, _approved, _tokenId);
}
/**
* @notice This works even if sender doesn't own any tokens at the time.
* @dev Enables or disables approval for a third party ("operator") to manage all of
* `msg.sender`'s assets. It also emits the ApprovalForAll event.
* @param _operator Address to add to the set of authorized operators.
* @param _approved True if the operators is approved, false to revoke approval.
*/
function setApprovalForAll(
address _operator,
bool _approved
)
external
override
{
ownerToOperators[msg.sender][_operator] = _approved;
emit ApprovalForAll(msg.sender, _operator, _approved);
}
/**
* @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
* considered invalid, and this function throws for queries about the zero address.
* @param _owner Address for whom to query the balance.
* @return Balance of _owner.
*/
function balanceOf(
address _owner
)
external
override
view
returns (uint256)
{
require(_owner != address(0), ZERO_ADDRESS);
return _getOwnerNFTCount(_owner);
}
/**
* @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
* considered invalid, and queries about them do throw.
* @param _tokenId The identifier for an NFT.
* @return _owner Address of _tokenId owner.
*/
function ownerOf(
uint256 _tokenId
)
external
override
view
returns (address _owner)
{
_owner = idToOwner[_tokenId];
require(_owner != address(0), NOT_VALID_NFT);
}
/**
* @notice Throws if `_tokenId` is not a valid NFT.
* @dev Get the approved address for a single NFT.
* @param _tokenId ID of the NFT to query the approval of.
* @return Address that _tokenId is approved for.
*/
function getApproved(
uint256 _tokenId
)
external
override
view
validNFToken(_tokenId)
returns (address)
{
return idToApproval[_tokenId];
}
/**
* @dev Checks if `_operator` is an approved operator for `_owner`.
* @param _owner The address that owns the NFTs.
* @param _operator The address that acts on behalf of the owner.
* @return True if approved for all, false otherwise.
*/
function isApprovedForAll(
address _owner,
address _operator
)
external
override
view
returns (bool)
{
return ownerToOperators[_owner][_operator];
}
/**
* @notice Does NO checks.
* @dev Actually performs the transfer.
* @param _to Address of a new owner.
* @param _tokenId The NFT that is being transferred.
*/
function _transfer(
address _to,
uint256 _tokenId
)
internal
{
address from = idToOwner[_tokenId];
_clearApproval(_tokenId);
_removeNFToken(from, _tokenId);
_addNFToken(_to, _tokenId);
emit Transfer(from, _to, _tokenId);
}
/**
* @notice This is an internal function which should be called from user-implemented external
* mint function. Its purpose is to show and properly initialize data structures when using this
* implementation.
* @dev Mints a new NFT.
* @param _to The address that will own the minted NFT.
* @param _tokenId of the NFT to be minted by the msg.sender.
*/
function _mint(
address _to,
uint256 _tokenId
)
internal
virtual
{
require(_to != address(0), ZERO_ADDRESS);
require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
_addNFToken(_to, _tokenId);
emit Transfer(address(0), _to, _tokenId);
}
/**
* @notice This is an internal function which should be called from user-implemented external burn
* function. Its purpose is to show and properly initialize data structures when using this
* implementation. Also, note that this burn implementation allows the minter to re-mint a burned
* NFT.
* @dev Burns a NFT.
* @param _tokenId ID of the NFT to be burned.
*/
function _burn(
uint256 _tokenId
)
internal
virtual
validNFToken(_tokenId)
{
address tokenOwner = idToOwner[_tokenId];
_clearApproval(_tokenId);
_removeNFToken(tokenOwner, _tokenId);
emit Transfer(tokenOwner, address(0), _tokenId);
}
/**
* @notice Use and override this function with caution. Wrong usage can have serious consequences.
* @dev Removes a NFT from owner.
* @param _from Address from which we want to remove the NFT.
* @param _tokenId Which NFT we want to remove.
*/
function _removeNFToken(
address _from,
uint256 _tokenId
)
internal
virtual
{
require(idToOwner[_tokenId] == _from, NOT_OWNER);
ownerToNFTokenCount[_from] -= 1;
delete idToOwner[_tokenId];
}
/**
* @notice Use and override this function with caution. Wrong usage can have serious consequences.
* @dev Assigns a new NFT to owner.
* @param _to Address to which we want to add the NFT.
* @param _tokenId Which NFT we want to add.
*/
function _addNFToken(
address _to,
uint256 _tokenId
)
internal
virtual
{
require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
idToOwner[_tokenId] = _to;
ownerToNFTokenCount[_to] += 1;
}
/**
* @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
* extension to remove double storage (gas optimization) of owner NFT count.
* @param _owner Address for whom to query the count.
* @return Number of _owner NFTs.
*/
function _getOwnerNFTCount(
address _owner
)
internal
virtual
view
returns (uint256)
{
return ownerToNFTokenCount[_owner];
}
/**
* @dev Actually perform the safeTransferFrom.
* @param _from The current owner of the NFT.
* @param _to The new owner.
* @param _tokenId The NFT to transfer.
* @param _data Additional data with no specified format, sent in call to `_to`.
*/
function _safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes memory _data
)
private
canTransfer(_tokenId)
validNFToken(_tokenId)
{
address tokenOwner = idToOwner[_tokenId];
require(tokenOwner == _from, NOT_OWNER);
require(_to != address(0), ZERO_ADDRESS);
_transfer(_to, _tokenId);
if (_to.isContract())
{
bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
}
}
/**
* @dev Clears the current approval of a given NFT ID.
* @param _tokenId ID of the NFT to be transferred.
*/
function _clearApproval(
uint256 _tokenId
)
private
{
delete idToApproval[_tokenId];
}
}
/**
* @dev Optional metadata implementation for ERC-721 non-fungible token standard.
*/
contract NFTokenMetadata is
NFToken,
ERC721Metadata
{
/**
* @dev A descriptive name for a collection of NFTs.
*/
string internal nftName;
/**
* @dev An abbreviated name for NFTokens.
*/
string internal nftSymbol;
/**
* @dev Mapping from NFT ID to metadata uri.
*/
mapping (uint256 => string) internal idToUri;
/**
* @notice When implementing this contract don't forget to set nftName and nftSymbol.
* @dev Contract constructor.
*/
constructor()
{
supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
}
/**
* @dev Returns a descriptive name for a collection of NFTokens.
* @return _name Representing name.
*/
function name()
external
override
view
returns (string memory _name)
{
_name = nftName;
}
/**
* @dev Returns an abbreviated name for NFTokens.
* @return _symbol Representing symbol.
*/
function symbol()
external
override
view
returns (string memory _symbol)
{
_symbol = nftSymbol;
}
/**
* @dev A distinct URI (RFC 3986) for a given NFT.
* @param _tokenId Id for which we want uri.
* @return URI of _tokenId.
*/
function tokenURI(
uint256 _tokenId
)
external
override
view
validNFToken(_tokenId)
returns (string memory)
{
return idToUri[_tokenId];
}
/**
* @notice This is an internal function which should be called from user-implemented external
* burn function. Its purpose is to show and properly initialize data structures when using this
* implementation. Also, note that this burn implementation allows the minter to re-mint a burned
* NFT.
* @dev Burns a NFT.
* @param _tokenId ID of the NFT to be burned.
*/
function _burn(
uint256 _tokenId
)
internal
override
virtual
{
super._burn(_tokenId);
delete idToUri[_tokenId];
}
/**
* @notice This is an internal function which should be called from user-implemented external
* function. Its purpose is to show and properly initialize data structures when using this
* implementation.
* @dev Set a distinct URI (RFC 3986) for a given NFT ID.
* @param _tokenId Id for which we want URI.
* @param _uri String representing RFC 3986 URI.
*/
function _setTokenUri(
uint256 _tokenId,
string memory _uri
)
internal
validNFToken(_tokenId)
{
idToUri[_tokenId] = _uri;
}
}
contract NFTChat is NFTokenMetadata, Ownable {
using Counters for Counters.Counter;
Counters.Counter private tokenIds;
Counters.Counter public subscribedAddressCounter;
uint32 public FIRST_TIER = 1000;
uint32 public SECOND_TIER = 10000;
uint256 public FIRST_TIER_FEE = 0.1 ether;
uint256 public SECOND_TIER_FEE = 0.5 ether;
uint256 public THIRD_TIER_FEE = 3.99 ether;
uint256 public subscriptionFee = FIRST_TIER_FEE;
uint256 public transactionFee = 0.000 ether;
string constant NOT_ENOUGH_CRYPTO_MSG = "Not enough MATIC in wallet";
mapping(address => bool) public subscribedAddresses;
// Team payout addresses.
address private constant _a1 = 0x42A7545EE9D9B16A7b3Ce31C031aA281162F1430; //h
address private constant _a2 = 0x61736bd58833cdaE807103b3caf4BE52462024CC; //m
address private constant _a3 = 0x5aC46bb905a03AdF7073a896378209c069D924c3; //j
address private constant _a4 = 0xd0557c7bAe8cCEa7B21b623aBD28D67d9deCb2b5; //a
constructor() {
nftName = "NFTchat";
nftSymbol = "CHAT";
}
function setTransactionFee(uint256 _newTransactionFee) external onlyOwner {
transactionFee = _newTransactionFee;
}
function setSubscriptionFee(uint256 _newSubscriptionFee) external onlyOwner {
subscriptionFee = _newSubscriptionFee;
}
function setSecondTier(uint32 _newSecondTier) external onlyOwner {
SECOND_TIER = _newSecondTier;
}
function setSecondTierFee(uint256 _newSecondTierFee) external onlyOwner {
SECOND_TIER_FEE = _newSecondTierFee;
}
function setThirdTierFee(uint256 _newThirdTierFee) external onlyOwner {
THIRD_TIER_FEE = _newThirdTierFee;
}
function subscribeAddress() external payable {
require(!subscribedAddresses[msg.sender], "ADDRESS_ALREADY_SUBSCRIBED");
require(subscriptionFee <= msg.value, "INVALID_SUBSCRIBTION_FEE");
subscribedAddresses[msg.sender] = true;
subscribedAddressCounter.increment();
calculateSubscriptionFee();
}
function subscribeFreeAddress(address _toBeSubscribed) external onlyOwner {
require(!subscribedAddresses[_toBeSubscribed], "ADDRESS_ALREADY_SUBSCRIBED");
subscribedAddresses[_toBeSubscribed] = true;
subscribedAddressCounter.increment();
calculateSubscriptionFee();
}
function unsubscribeAddress(address _toBeUnsubscribed) external onlyOwner {
require(subscribedAddresses[_toBeUnsubscribed], "ADDRESS_IS_NOT_SUBSCRIBED");
subscribedAddresses[_toBeUnsubscribed] = false;
subscribedAddressCounter.decrement();
calculateSubscriptionFee();
}
function calculateSubscriptionFee() internal returns (uint256) {
uint256 addressCount = subscribedAddressCounter.current();
if (addressCount < FIRST_TIER) {
subscriptionFee = FIRST_TIER_FEE;
} else if (addressCount < SECOND_TIER) {
subscriptionFee = SECOND_TIER_FEE;
} else {
subscriptionFee = THIRD_TIER_FEE;
}
return subscriptionFee;
}
function mint(address _to, string calldata _uri) external payable {
require(subscribedAddresses[msg.sender], "ADDRESS_IS_NOT_SUBSCRIBED");
require(msg.value >= transactionFee, NOT_ENOUGH_CRYPTO_MSG);
tokenIds.increment();
uint256 newTokenId = tokenIds.current();
super._mint(_to, newTokenId);
super._setTokenUri(newTokenId, _uri);
}
function withdraw() external onlyOwner {
uint256 amount = (address(this).balance * 25) / 100;
(bool success1, ) = _a1.call{value: amount}("");
require(success1, "Transfer to A1 failed.");
(bool success2, ) = _a2.call{value: amount}("");
require(success2, "Transfer to A2 failed.");
(bool success3, ) = _a3.call{value: amount}("");
require(success3, "Transfer to A3 failed.");
(bool success4, ) = _a4.call{value: amount}("");
require(success4, "Transfer to A4 failed.");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIRST_TIER","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIRST_TIER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECOND_TIER","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECOND_TIER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THIRD_TIER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newSecondTier","type":"uint32"}],"name":"setSecondTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSecondTierFee","type":"uint256"}],"name":"setSecondTierFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSubscriptionFee","type":"uint256"}],"name":"setSubscriptionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newThirdTierFee","type":"uint256"}],"name":"setThirdTierFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTransactionFee","type":"uint256"}],"name":"setTransactionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscribeAddress","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_toBeSubscribed","type":"address"}],"name":"subscribeFreeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscribedAddressCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"subscribedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toBeUnsubscribed","type":"address"}],"name":"unsubscribeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526103e8600b60006101000a81548163ffffffff021916908363ffffffff160217905550612710600b60046101000a81548163ffffffff021916908363ffffffff16021790555067016345785d8a0000600c556706f05b59d3b20000600d5567375f53dc2dcf0000600e55600c54600f5560006010553480156200008657600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600781526020017f4e4654636861740000000000000000000000000000000000000000000000000081525060059080519060200190620002089291906200025d565b506040518060400160405280600481526020017f434841540000000000000000000000000000000000000000000000000000000081525060069080519060200190620002569291906200025d565b5062000372565b8280546200026b906200030d565b90600052602060002090601f0160209004810192826200028f5760008555620002db565b82601f10620002aa57805160ff1916838001178555620002db565b82800160010185558215620002db579182015b82811115620002da578251825591602001919060010190620002bd565b5b509050620002ea9190620002ee565b5090565b5b8082111562000309576000816000905550600101620002ef565b5090565b600060028204905060018216806200032657607f821691505b602082108114156200033d576200033c62000343565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61459980620003826000396000f3fe60806040526004361061020f5760003560e01c806372c139d911610118578063ad95a585116100a0578063d0def5211161006f578063d0def52114610768578063e985e9c514610784578063ebb4acb9146107c1578063f2fde38b146107ec578063f3fe3bc3146108155761020f565b8063ad95a585146106ac578063b88d4fde146106d7578063b89be73d14610700578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105d957806395d89b4114610604578063967ba7a81461062f5780639ed3edf014610658578063a22cb465146106835761020f565b806372c139d91461051f5780637d0b1cef1461055c578063860d248a146105855780638adc9a9b146105b05761020f565b80633ccfd60b1161019b5780635771239e1161016a5780635771239e1461042857806361137e72146104535780636352211e1461047c5780636ac84956146104b957806370a08231146104e25761020f565b80633ccfd60b1461039457806342842e0e146103ab57806342c77a8d146103d45780634d5a2680146103fd5761020f565b8063095ea7b3116101e2578063095ea7b3146102e4578063096a8ab71461030d5780630aa0a175146103365780631983aee81461036157806323b872dd1461036b5761020f565b8063013b91911461021457806301ffc9a71461023f57806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b50610229610840565b6040516102369190614092565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190613c21565b610856565b6040516102739190613f3a565b60405180910390f35b34801561028857600080fd5b506102916108bd565b60405161029e9190613f55565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613c7b565b61094f565b6040516102db9190613ed3565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613be1565b610a6a565b005b34801561031957600080fd5b50610334600480360381019061032f9190613c7b565b610e4d565b005b34801561034257600080fd5b5061034b610f20565b6040516103589190614077565b60405180910390f35b610369610f26565b005b34801561037757600080fd5b50610392600480360381019061038d9190613a66565b611065565b005b3480156103a057600080fd5b506103a96114b7565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613a66565b6118a4565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906139f9565b6118c4565b005b34801561040957600080fd5b50610412611a87565b60405161041f9190614092565b60405180910390f35b34801561043457600080fd5b5061043d611a9d565b60405161044a9190614077565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613c7b565b611aa3565b005b34801561048857600080fd5b506104a3600480360381019061049e9190613c7b565b611b76565b6040516104b09190613ed3565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613c7b565b611c5c565b005b3480156104ee57600080fd5b50610509600480360381019061050491906139f9565b611d2f565b6040516105169190614077565b60405180910390f35b34801561052b57600080fd5b50610546600480360381019061054191906139f9565b611de9565b6040516105539190613f3a565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e91906139f9565b611e09565b005b34801561059157600080fd5b5061059a611fcd565b6040516105a79190613f55565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613c7b565b612006565b005b3480156105e557600080fd5b506105ee6120d9565b6040516105fb9190613ed3565b60405180910390f35b34801561061057600080fd5b506106196120ff565b6040516106269190613f55565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613ca8565b612191565b005b34801561066457600080fd5b5061066d61227e565b60405161067a9190614077565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190613b41565b612284565b005b3480156106b857600080fd5b506106c1612381565b6040516106ce9190614077565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613ab9565b612387565b005b34801561070c57600080fd5b506107156123de565b6040516107229190614077565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613c7b565b6123e4565b60405161075f9190613f55565b60405180910390f35b610782600480360381019061077d9190613b81565b612567565b005b34801561079057600080fd5b506107ab60048036038101906107a69190613a26565b6126e7565b6040516107b89190613f3a565b60405180910390f35b3480156107cd57600080fd5b506107d661277b565b6040516107e39190614077565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e91906139f9565b612787565b005b34801561082157600080fd5b5061082a6129b9565b6040516108379190613f55565b60405180910390f35b600b60049054906101000a900463ffffffff1681565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600580546108cc906142bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108f8906142bc565b80156109455780601f1061091a57610100808354040283529160200191610945565b820191906000526020600020905b81548152906001019060200180831161092857829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a249190613f55565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610b635750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd19190613f55565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9190613f55565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e9190613f55565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9190613f55565b60405180910390fd5b508060108190555050565b600f5481565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613fd7565b60405180910390fd5b34600f541115610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90614057565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061105a600a6129f2565b611062612a08565b50565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061113657503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806111c75750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303400000000000000000000000000000000000000000000000000008152509061123e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112359190613f55565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061131b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113129190613f55565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f19190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a9190613f55565b60405180910390fd5b506114ae8686612a87565b50505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061157f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115769190613f55565b60405180910390fd5b50600060646019476115919190614177565b61159b9190614146565b905060007342a7545ee9d9b16a7b3ce31c031aa281162f143073ffffffffffffffffffffffffffffffffffffffff16826040516115d790613ebe565b60006040518083038185875af1925050503d8060008114611614576040519150601f19603f3d011682016040523d82523d6000602084013e611619565b606091505b505090508061165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490614017565b60405180910390fd5b60007361736bd58833cdae807103b3caf4be52462024cc73ffffffffffffffffffffffffffffffffffffffff168360405161169790613ebe565b60006040518083038185875af1925050503d80600081146116d4576040519150601f19603f3d011682016040523d82523d6000602084013e6116d9565b606091505b505090508061171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490613ff7565b60405180910390fd5b6000735ac46bb905a03adf7073a896378209c069d924c373ffffffffffffffffffffffffffffffffffffffff168460405161175790613ebe565b60006040518083038185875af1925050503d8060008114611794576040519150601f19603f3d011682016040523d82523d6000602084013e611799565b606091505b50509050806117dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d490613fb7565b60405180910390fd5b600073d0557c7bae8ccea7b21b623abd28d67d9decb2b573ffffffffffffffffffffffffffffffffffffffff168560405161181790613ebe565b60006040518083038185875af1925050503d8060008114611854576040519150601f19603f3d011682016040523d82523d6000602084013e611859565b606091505b505090508061189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490613f97565b60405180910390fd5b5050505050565b6118bf83838360405180602001604052806000815250612b3c565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061198c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119839190613f55565b60405180910390fd5b50601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1090614037565b60405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a7b600a61310a565b611a83612a08565b5050565b600b60009054906101000a900463ffffffff1681565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b629190613f55565b60405180910390fd5b5080600e8190555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d9190613f55565b60405180910390fd5b50919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b9190613f55565b60405180910390fd5b5080600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf9190613f55565b60405180910390fd5b50611de282613166565b9050919050565b60116020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec89190613f55565b60405180910390fd5b50601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5690613fd7565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fc1600a6129f2565b611fc9612a08565b5050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c59190613f55565b60405180910390fd5b5080600d8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461210e906142bc565b80601f016020809104026020016040519081016040528092919081815260200182805461213a906142bc565b80156121875780601f1061215c57610100808354040283529160200191612187565b820191906000526020600020905b81548152906001019060200180831161216a57829003601f168201915b5050505050905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612259576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122509190613f55565b60405180910390fd5b5080600b60046101000a81548163ffffffff021916908363ffffffff16021790555050565b60105481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123759190613f3a565b60405180910390a35050565b600e5481565b6123d785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b3c565b5050505050565b600c5481565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b99190613f55565b60405180910390fd5b506007600084815260200190815260200160002080546124e1906142bc565b80601f016020809104026020016040519081016040528092919081815260200182805461250d906142bc565b801561255a5780601f1061252f5761010080835404028352916020019161255a565b820191906000526020600020905b81548152906001019060200180831161253d57829003601f168201915b5050505050915050919050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ea90614037565b60405180910390fd5b6010543410156040518060400160405280601a81526020017f4e6f7420656e6f756768204d4154494320696e2077616c6c657400000000000081525090612670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126679190613f55565b60405180910390fd5b5061267b60096129f2565b600061268760096131af565b905061269384826131bd565b6126e18184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506133ab565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8060000154905081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061284f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128469190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906128f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ef9190613f55565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b6001816000016000828254019250508190555050565b600080612a15600a6131af565b9050600b60009054906101000a900463ffffffff1663ffffffff16811015612a4557600c54600f81905550612a7e565b600b60049054906101000a900463ffffffff1663ffffffff16811015612a7357600d54600f81905550612a7d565b600e54600f819055505b5b600f5491505090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ac8826134b5565b612ad281836134ee565b612adc8383613659565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612c0d57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612c9e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c9190613f55565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de99190613f55565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec89190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f719190613f55565b60405180910390fd5b50612f858787612a87565b612fa48773ffffffffffffffffffffffffffffffffffffffff166137e1565b156131005760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401612fea9493929190613eee565b602060405180830381600087803b15801561300457600080fd5b505af1158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c9190613c4e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f49190613f55565b60405180910390fd5b50505b5050505050505050565b60008160000154905060008111613156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314d90613f77565b60405180910390fd5b6001810382600001819055505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325c9190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133379190613f55565b60405180910390fd5b5061334b8282613659565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347e9190613f55565b60405180910390fd5b50816007600085815260200190815260200160002090805190602001906134af92919061382c565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906135c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135be9190613f55565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461361891906141d1565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a9190613f55565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137d691906140f0565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156138235750808214155b92505050919050565b828054613838906142bc565b90600052602060002090601f01602090048101928261385a57600085556138a1565b82601f1061387357805160ff19168380011785556138a1565b828001600101855582156138a1579182015b828111156138a0578251825591602001919060010190613885565b5b5090506138ae91906138b2565b5090565b5b808211156138cb5760008160009055506001016138b3565b5090565b6000813590506138de816144f0565b92915050565b6000813590506138f381614507565b92915050565b6000813590506139088161451e565b92915050565b60008151905061391d8161451e565b92915050565b60008083601f84011261393957613938614380565b5b8235905067ffffffffffffffff8111156139565761395561437b565b5b60208301915083600182028301111561397257613971614385565b5b9250929050565b60008083601f84011261398f5761398e614380565b5b8235905067ffffffffffffffff8111156139ac576139ab61437b565b5b6020830191508360018202830111156139c8576139c7614385565b5b9250929050565b6000813590506139de81614535565b92915050565b6000813590506139f38161454c565b92915050565b600060208284031215613a0f57613a0e61438f565b5b6000613a1d848285016138cf565b91505092915050565b60008060408385031215613a3d57613a3c61438f565b5b6000613a4b858286016138cf565b9250506020613a5c858286016138cf565b9150509250929050565b600080600060608486031215613a7f57613a7e61438f565b5b6000613a8d868287016138cf565b9350506020613a9e868287016138cf565b9250506040613aaf868287016139cf565b9150509250925092565b600080600080600060808688031215613ad557613ad461438f565b5b6000613ae3888289016138cf565b9550506020613af4888289016138cf565b9450506040613b05888289016139cf565b935050606086013567ffffffffffffffff811115613b2657613b2561438a565b5b613b3288828901613923565b92509250509295509295909350565b60008060408385031215613b5857613b5761438f565b5b6000613b66858286016138cf565b9250506020613b77858286016138e4565b9150509250929050565b600080600060408486031215613b9a57613b9961438f565b5b6000613ba8868287016138cf565b935050602084013567ffffffffffffffff811115613bc957613bc861438a565b5b613bd586828701613979565b92509250509250925092565b60008060408385031215613bf857613bf761438f565b5b6000613c06858286016138cf565b9250506020613c17858286016139cf565b9150509250929050565b600060208284031215613c3757613c3661438f565b5b6000613c45848285016138f9565b91505092915050565b600060208284031215613c6457613c6361438f565b5b6000613c728482850161390e565b91505092915050565b600060208284031215613c9157613c9061438f565b5b6000613c9f848285016139cf565b91505092915050565b600060208284031215613cbe57613cbd61438f565b5b6000613ccc848285016139e4565b91505092915050565b613cde81614205565b82525050565b613ced81614217565b82525050565b6000613cfe826140ad565b613d0881856140c3565b9350613d18818560208601614289565b613d2181614394565b840191505092915050565b6000613d37826140b8565b613d4181856140df565b9350613d51818560208601614289565b613d5a81614394565b840191505092915050565b6000613d72601b836140df565b9150613d7d826143a5565b602082019050919050565b6000613d956016836140df565b9150613da0826143ce565b602082019050919050565b6000613db86016836140df565b9150613dc3826143f7565b602082019050919050565b6000613ddb601a836140df565b9150613de682614420565b602082019050919050565b6000613dfe6016836140df565b9150613e0982614449565b602082019050919050565b6000613e216016836140df565b9150613e2c82614472565b602082019050919050565b6000613e446019836140df565b9150613e4f8261449b565b602082019050919050565b6000613e676018836140df565b9150613e72826144c4565b602082019050919050565b6000613e8a6000836140d4565b9150613e95826144ed565b600082019050919050565b613ea98161426f565b82525050565b613eb881614279565b82525050565b6000613ec982613e7d565b9150819050919050565b6000602082019050613ee86000830184613cd5565b92915050565b6000608082019050613f036000830187613cd5565b613f106020830186613cd5565b613f1d6040830185613ea0565b8181036060830152613f2f8184613cf3565b905095945050505050565b6000602082019050613f4f6000830184613ce4565b92915050565b60006020820190508181036000830152613f6f8184613d2c565b905092915050565b60006020820190508181036000830152613f9081613d65565b9050919050565b60006020820190508181036000830152613fb081613d88565b9050919050565b60006020820190508181036000830152613fd081613dab565b9050919050565b60006020820190508181036000830152613ff081613dce565b9050919050565b6000602082019050818103600083015261401081613df1565b9050919050565b6000602082019050818103600083015261403081613e14565b9050919050565b6000602082019050818103600083015261405081613e37565b9050919050565b6000602082019050818103600083015261407081613e5a565b9050919050565b600060208201905061408c6000830184613ea0565b92915050565b60006020820190506140a76000830184613eaf565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006140fb8261426f565b91506141068361426f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413b5761413a6142ee565b5b828201905092915050565b60006141518261426f565b915061415c8361426f565b92508261416c5761416b61431d565b5b828204905092915050565b60006141828261426f565b915061418d8361426f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141c6576141c56142ee565b5b828202905092915050565b60006141dc8261426f565b91506141e78361426f565b9250828210156141fa576141f96142ee565b5b828203905092915050565b60006142108261424f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60005b838110156142a757808201518184015260208101905061428c565b838111156142b6576000848401525b50505050565b600060028204905060018216806142d457607f821691505b602082108114156142e8576142e761434c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b7f5472616e7366657220746f204134206661696c65642e00000000000000000000600082015250565b7f5472616e7366657220746f204133206661696c65642e00000000000000000000600082015250565b7f414444524553535f414c52454144595f53554253435249424544000000000000600082015250565b7f5472616e7366657220746f204132206661696c65642e00000000000000000000600082015250565b7f5472616e7366657220746f204131206661696c65642e00000000000000000000600082015250565b7f414444524553535f49535f4e4f545f5355425343524942454400000000000000600082015250565b7f494e56414c49445f535542534352494254494f4e5f4645450000000000000000600082015250565b50565b6144f981614205565b811461450457600080fd5b50565b61451081614217565b811461451b57600080fd5b50565b61452781614223565b811461453257600080fd5b50565b61453e8161426f565b811461454957600080fd5b50565b61455581614279565b811461456057600080fd5b5056fea2646970667358221220150d21c4044a9b58d92bef1fd9c4b56b333417d83759af2e85e6e18cff9d047164736f6c63430008060033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806372c139d911610118578063ad95a585116100a0578063d0def5211161006f578063d0def52114610768578063e985e9c514610784578063ebb4acb9146107c1578063f2fde38b146107ec578063f3fe3bc3146108155761020f565b8063ad95a585146106ac578063b88d4fde146106d7578063b89be73d14610700578063c87b56dd1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105d957806395d89b4114610604578063967ba7a81461062f5780639ed3edf014610658578063a22cb465146106835761020f565b806372c139d91461051f5780637d0b1cef1461055c578063860d248a146105855780638adc9a9b146105b05761020f565b80633ccfd60b1161019b5780635771239e1161016a5780635771239e1461042857806361137e72146104535780636352211e1461047c5780636ac84956146104b957806370a08231146104e25761020f565b80633ccfd60b1461039457806342842e0e146103ab57806342c77a8d146103d45780634d5a2680146103fd5761020f565b8063095ea7b3116101e2578063095ea7b3146102e4578063096a8ab71461030d5780630aa0a175146103365780631983aee81461036157806323b872dd1461036b5761020f565b8063013b91911461021457806301ffc9a71461023f57806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b50610229610840565b6040516102369190614092565b60405180910390f35b34801561024b57600080fd5b5061026660048036038101906102619190613c21565b610856565b6040516102739190613f3a565b60405180910390f35b34801561028857600080fd5b506102916108bd565b60405161029e9190613f55565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613c7b565b61094f565b6040516102db9190613ed3565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613be1565b610a6a565b005b34801561031957600080fd5b50610334600480360381019061032f9190613c7b565b610e4d565b005b34801561034257600080fd5b5061034b610f20565b6040516103589190614077565b60405180910390f35b610369610f26565b005b34801561037757600080fd5b50610392600480360381019061038d9190613a66565b611065565b005b3480156103a057600080fd5b506103a96114b7565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190613a66565b6118a4565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906139f9565b6118c4565b005b34801561040957600080fd5b50610412611a87565b60405161041f9190614092565b60405180910390f35b34801561043457600080fd5b5061043d611a9d565b60405161044a9190614077565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613c7b565b611aa3565b005b34801561048857600080fd5b506104a3600480360381019061049e9190613c7b565b611b76565b6040516104b09190613ed3565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613c7b565b611c5c565b005b3480156104ee57600080fd5b50610509600480360381019061050491906139f9565b611d2f565b6040516105169190614077565b60405180910390f35b34801561052b57600080fd5b50610546600480360381019061054191906139f9565b611de9565b6040516105539190613f3a565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e91906139f9565b611e09565b005b34801561059157600080fd5b5061059a611fcd565b6040516105a79190613f55565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613c7b565b612006565b005b3480156105e557600080fd5b506105ee6120d9565b6040516105fb9190613ed3565b60405180910390f35b34801561061057600080fd5b506106196120ff565b6040516106269190613f55565b60405180910390f35b34801561063b57600080fd5b5061065660048036038101906106519190613ca8565b612191565b005b34801561066457600080fd5b5061066d61227e565b60405161067a9190614077565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a59190613b41565b612284565b005b3480156106b857600080fd5b506106c1612381565b6040516106ce9190614077565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613ab9565b612387565b005b34801561070c57600080fd5b506107156123de565b6040516107229190614077565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613c7b565b6123e4565b60405161075f9190613f55565b60405180910390f35b610782600480360381019061077d9190613b81565b612567565b005b34801561079057600080fd5b506107ab60048036038101906107a69190613a26565b6126e7565b6040516107b89190613f3a565b60405180910390f35b3480156107cd57600080fd5b506107d661277b565b6040516107e39190614077565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e91906139f9565b612787565b005b34801561082157600080fd5b5061082a6129b9565b6040516108379190613f55565b60405180910390f35b600b60049054906101000a900463ffffffff1681565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600580546108cc906142bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108f8906142bc565b80156109455780601f1061091a57610100808354040283529160200191610945565b820191906000526020600020905b81548152906001019060200180831161092857829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a249190613f55565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610b635750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd19190613f55565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae9190613f55565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e9190613f55565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9190613f55565b60405180910390fd5b508060108190555050565b600f5481565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613fd7565b60405180910390fd5b34600f541115610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90614057565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061105a600a6129f2565b611062612a08565b50565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061113657503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806111c75750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303400000000000000000000000000000000000000000000000000008152509061123e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112359190613f55565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061131b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113129190613f55565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f19190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a9190613f55565b60405180910390fd5b506114ae8686612a87565b50505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061157f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115769190613f55565b60405180910390fd5b50600060646019476115919190614177565b61159b9190614146565b905060007342a7545ee9d9b16a7b3ce31c031aa281162f143073ffffffffffffffffffffffffffffffffffffffff16826040516115d790613ebe565b60006040518083038185875af1925050503d8060008114611614576040519150601f19603f3d011682016040523d82523d6000602084013e611619565b606091505b505090508061165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490614017565b60405180910390fd5b60007361736bd58833cdae807103b3caf4be52462024cc73ffffffffffffffffffffffffffffffffffffffff168360405161169790613ebe565b60006040518083038185875af1925050503d80600081146116d4576040519150601f19603f3d011682016040523d82523d6000602084013e6116d9565b606091505b505090508061171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490613ff7565b60405180910390fd5b6000735ac46bb905a03adf7073a896378209c069d924c373ffffffffffffffffffffffffffffffffffffffff168460405161175790613ebe565b60006040518083038185875af1925050503d8060008114611794576040519150601f19603f3d011682016040523d82523d6000602084013e611799565b606091505b50509050806117dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d490613fb7565b60405180910390fd5b600073d0557c7bae8ccea7b21b623abd28d67d9decb2b573ffffffffffffffffffffffffffffffffffffffff168560405161181790613ebe565b60006040518083038185875af1925050503d8060008114611854576040519150601f19603f3d011682016040523d82523d6000602084013e611859565b606091505b505090508061189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189490613f97565b60405180910390fd5b5050505050565b6118bf83838360405180602001604052806000815250612b3c565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061198c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119839190613f55565b60405180910390fd5b50601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1090614037565b60405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a7b600a61310a565b611a83612a08565b5050565b600b60009054906101000a900463ffffffff1681565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b629190613f55565b60405180910390fd5b5080600e8190555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d9190613f55565b60405180910390fd5b50919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b9190613f55565b60405180910390fd5b5080600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf9190613f55565b60405180910390fd5b50611de282613166565b9050919050565b60116020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec89190613f55565b60405180910390fd5b50601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5690613fd7565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fc1600a6129f2565b611fc9612a08565b5050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c59190613f55565b60405180910390fd5b5080600d8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461210e906142bc565b80601f016020809104026020016040519081016040528092919081815260200182805461213a906142bc565b80156121875780601f1061215c57610100808354040283529160200191612187565b820191906000526020600020905b81548152906001019060200180831161216a57829003601f168201915b5050505050905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612259576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122509190613f55565b60405180910390fd5b5080600b60046101000a81548163ffffffff021916908363ffffffff16021790555050565b60105481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123759190613f3a565b60405180910390a35050565b600e5481565b6123d785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b3c565b5050505050565b600c5481565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b99190613f55565b60405180910390fd5b506007600084815260200190815260200160002080546124e1906142bc565b80601f016020809104026020016040519081016040528092919081815260200182805461250d906142bc565b801561255a5780601f1061252f5761010080835404028352916020019161255a565b820191906000526020600020905b81548152906001019060200180831161253d57829003601f168201915b5050505050915050919050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ea90614037565b60405180910390fd5b6010543410156040518060400160405280601a81526020017f4e6f7420656e6f756768204d4154494320696e2077616c6c657400000000000081525090612670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126679190613f55565b60405180910390fd5b5061267b60096129f2565b600061268760096131af565b905061269384826131bd565b6126e18184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506133ab565b50505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8060000154905081565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061284f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128469190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906128f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ef9190613f55565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b6001816000016000828254019250508190555050565b600080612a15600a6131af565b9050600b60009054906101000a900463ffffffff1663ffffffff16811015612a4557600c54600f81905550612a7e565b600b60049054906101000a900463ffffffff1663ffffffff16811015612a7357600d54600f81905550612a7d565b600e54600f819055505b5b600f5491505090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ac8826134b5565b612ad281836134ee565b612adc8383613659565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612c0d57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612c9e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c9190613f55565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de99190613f55565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec89190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f719190613f55565b60405180910390fd5b50612f858787612a87565b612fa48773ffffffffffffffffffffffffffffffffffffffff166137e1565b156131005760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401612fea9493929190613eee565b602060405180830381600087803b15801561300457600080fd5b505af1158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c9190613c4e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906130fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f49190613f55565b60405180910390fd5b50505b5050505050505050565b60008160000154905060008111613156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314d90613f77565b60405180910390fd5b6001810382600001819055505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325c9190613f55565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133379190613f55565b60405180910390fd5b5061334b8282613659565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347e9190613f55565b60405180910390fd5b50816007600085815260200190815260200160002090805190602001906134af92919061382c565b50505050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906135c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135be9190613f55565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461361891906141d1565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a9190613f55565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137d691906140f0565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156138235750808214155b92505050919050565b828054613838906142bc565b90600052602060002090601f01602090048101928261385a57600085556138a1565b82601f1061387357805160ff19168380011785556138a1565b828001600101855582156138a1579182015b828111156138a0578251825591602001919060010190613885565b5b5090506138ae91906138b2565b5090565b5b808211156138cb5760008160009055506001016138b3565b5090565b6000813590506138de816144f0565b92915050565b6000813590506138f381614507565b92915050565b6000813590506139088161451e565b92915050565b60008151905061391d8161451e565b92915050565b60008083601f84011261393957613938614380565b5b8235905067ffffffffffffffff8111156139565761395561437b565b5b60208301915083600182028301111561397257613971614385565b5b9250929050565b60008083601f84011261398f5761398e614380565b5b8235905067ffffffffffffffff8111156139ac576139ab61437b565b5b6020830191508360018202830111156139c8576139c7614385565b5b9250929050565b6000813590506139de81614535565b92915050565b6000813590506139f38161454c565b92915050565b600060208284031215613a0f57613a0e61438f565b5b6000613a1d848285016138cf565b91505092915050565b60008060408385031215613a3d57613a3c61438f565b5b6000613a4b858286016138cf565b9250506020613a5c858286016138cf565b9150509250929050565b600080600060608486031215613a7f57613a7e61438f565b5b6000613a8d868287016138cf565b9350506020613a9e868287016138cf565b9250506040613aaf868287016139cf565b9150509250925092565b600080600080600060808688031215613ad557613ad461438f565b5b6000613ae3888289016138cf565b9550506020613af4888289016138cf565b9450506040613b05888289016139cf565b935050606086013567ffffffffffffffff811115613b2657613b2561438a565b5b613b3288828901613923565b92509250509295509295909350565b60008060408385031215613b5857613b5761438f565b5b6000613b66858286016138cf565b9250506020613b77858286016138e4565b9150509250929050565b600080600060408486031215613b9a57613b9961438f565b5b6000613ba8868287016138cf565b935050602084013567ffffffffffffffff811115613bc957613bc861438a565b5b613bd586828701613979565b92509250509250925092565b60008060408385031215613bf857613bf761438f565b5b6000613c06858286016138cf565b9250506020613c17858286016139cf565b9150509250929050565b600060208284031215613c3757613c3661438f565b5b6000613c45848285016138f9565b91505092915050565b600060208284031215613c6457613c6361438f565b5b6000613c728482850161390e565b91505092915050565b600060208284031215613c9157613c9061438f565b5b6000613c9f848285016139cf565b91505092915050565b600060208284031215613cbe57613cbd61438f565b5b6000613ccc848285016139e4565b91505092915050565b613cde81614205565b82525050565b613ced81614217565b82525050565b6000613cfe826140ad565b613d0881856140c3565b9350613d18818560208601614289565b613d2181614394565b840191505092915050565b6000613d37826140b8565b613d4181856140df565b9350613d51818560208601614289565b613d5a81614394565b840191505092915050565b6000613d72601b836140df565b9150613d7d826143a5565b602082019050919050565b6000613d956016836140df565b9150613da0826143ce565b602082019050919050565b6000613db86016836140df565b9150613dc3826143f7565b602082019050919050565b6000613ddb601a836140df565b9150613de682614420565b602082019050919050565b6000613dfe6016836140df565b9150613e0982614449565b602082019050919050565b6000613e216016836140df565b9150613e2c82614472565b602082019050919050565b6000613e446019836140df565b9150613e4f8261449b565b602082019050919050565b6000613e676018836140df565b9150613e72826144c4565b602082019050919050565b6000613e8a6000836140d4565b9150613e95826144ed565b600082019050919050565b613ea98161426f565b82525050565b613eb881614279565b82525050565b6000613ec982613e7d565b9150819050919050565b6000602082019050613ee86000830184613cd5565b92915050565b6000608082019050613f036000830187613cd5565b613f106020830186613cd5565b613f1d6040830185613ea0565b8181036060830152613f2f8184613cf3565b905095945050505050565b6000602082019050613f4f6000830184613ce4565b92915050565b60006020820190508181036000830152613f6f8184613d2c565b905092915050565b60006020820190508181036000830152613f9081613d65565b9050919050565b60006020820190508181036000830152613fb081613d88565b9050919050565b60006020820190508181036000830152613fd081613dab565b9050919050565b60006020820190508181036000830152613ff081613dce565b9050919050565b6000602082019050818103600083015261401081613df1565b9050919050565b6000602082019050818103600083015261403081613e14565b9050919050565b6000602082019050818103600083015261405081613e37565b9050919050565b6000602082019050818103600083015261407081613e5a565b9050919050565b600060208201905061408c6000830184613ea0565b92915050565b60006020820190506140a76000830184613eaf565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006140fb8261426f565b91506141068361426f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413b5761413a6142ee565b5b828201905092915050565b60006141518261426f565b915061415c8361426f565b92508261416c5761416b61431d565b5b828204905092915050565b60006141828261426f565b915061418d8361426f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141c6576141c56142ee565b5b828202905092915050565b60006141dc8261426f565b91506141e78361426f565b9250828210156141fa576141f96142ee565b5b828203905092915050565b60006142108261424f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60005b838110156142a757808201518184015260208101905061428c565b838111156142b6576000848401525b50505050565b600060028204905060018216806142d457607f821691505b602082108114156142e8576142e761434c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000600082015250565b7f5472616e7366657220746f204134206661696c65642e00000000000000000000600082015250565b7f5472616e7366657220746f204133206661696c65642e00000000000000000000600082015250565b7f414444524553535f414c52454144595f53554253435249424544000000000000600082015250565b7f5472616e7366657220746f204132206661696c65642e00000000000000000000600082015250565b7f5472616e7366657220746f204131206661696c65642e00000000000000000000600082015250565b7f414444524553535f49535f4e4f545f5355425343524942454400000000000000600082015250565b7f494e56414c49445f535542534352494254494f4e5f4645450000000000000000600082015250565b50565b6144f981614205565b811461450457600080fd5b50565b61451081614217565b811461451b57600080fd5b50565b61452781614223565b811461453257600080fd5b50565b61453e8161426f565b811461454957600080fd5b50565b61455581614279565b811461456057600080fd5b5056fea2646970667358221220150d21c4044a9b58d92bef1fd9c4b56b333417d83759af2e85e6e18cff9d047164736f6c63430008060033
Deployed Bytecode Sourcemap
28322:4197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28555:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4424:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26502:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20611:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18396:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29449:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28745:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30109:344;;;:::i;:::-;;17622:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31951:565;;;;;;;;;;;;;:::i;:::-;;16867:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30784:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28517:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28645:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29979:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20159:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29585:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19685:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28927:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30465:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1188:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29845:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1308:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26738:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29725:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28799:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19159:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28694:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16247:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28597:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27019:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31550:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21063:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28456:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2133:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1132:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28555:33;;;;;;;;;;;;;:::o;4424:172::-;4534:4;4557:19;:33;4577:12;4557:33;;;;;;;;;;;;;;;;;;;;;;;;;;;4550:40;;4424:172;;;:::o;26502:120::-;26570:19;26609:7;26601:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26502:120;:::o;20611:183::-;20740:7;20716:8;15210:1;15179:33;;:9;:19;15189:8;15179:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15214:13;;;;;;;;;;;;;;;;;15171:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20766:12:::1;:22;20779:8;20766:22;;;;;;;;;;;;;;;;;;;;;20759:29;;20611:183:::0;;;;:::o;18396:352::-;18509:8;14363:18;14384:9;:19;14394:8;14384:19;;;;;;;;;;;;;;;;;;;;;14363:40;;14440:10;14426:24;;:10;:24;;;:68;;;;14454:16;:28;14471:10;14454:28;;;;;;;;;;;;;;;:40;14483:10;14454:40;;;;;;;;;;;;;;;;;;;;;;;;;14426:68;14503:21;;;;;;;;;;;;;;;;;14410:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18537:8:::1;15210:1;15179:33;;:9;:19;15189:8;15179:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15214:13;;;;;;;;;;;;;;;;::::0;15171:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18557:18:::2;18578:9;:19;18588:8;18578:19;;;;;;;;;;;;;;;;;;;;;18557:40;;18625:10;18612:23;;:9;:23;;;;18637:8;;;;;;;;;;;;;;;;::::0;18604:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18680:9;18655:12;:22;18668:8;18655:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;18733:8;18722:9;18701:41;;18710:10;18701:41;;;;;;;;;;;;18550:198;14538:1:::1;14356:189:::0;18396:352;;;:::o;29449:128::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29551:18:::1;29534:14;:35;;;;29449:128:::0;:::o;28745:47::-;;;;:::o;30109:344::-;30174:19;:31;30194:10;30174:31;;;;;;;;;;;;;;;;;;;;;;;;;30173:32;30165:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30274:9;30255:15;;:28;;30247:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30357:4;30323:19;:31;30343:10;30323:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;30372:36;:24;:34;:36::i;:::-;30419:26;:24;:26::i;:::-;;30109:344::o;17622:353::-;17755:8;14743:18;14764:9;:19;14774:8;14764:19;;;;;;;;;;;;;;;;;;;;;14743:40;;14820:10;14806:24;;:10;:24;;;:71;;;;14867:10;14841:36;;:12;:22;14854:8;14841:22;;;;;;;;;;;;;;;;;;;;;:36;;;14806:71;:122;;;;14888:16;:28;14905:10;14888:28;;;;;;;;;;;;;;;:40;14917:10;14888:40;;;;;;;;;;;;;;;;;;;;;;;;;14806:122;14937:30;;;;;;;;;;;;;;;;;14790:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17783:8:::1;15210:1;15179:33;;:9;:19;15189:8;15179:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15214:13;;;;;;;;;;;;;;;;::::0;15171:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17803:18:::2;17824:9;:19;17834:8;17824:19;;;;;;;;;;;;;;;;;;;;;17803:40;;17872:5;17858:19;;:10;:19;;;17879:9;;;;;;;;;;;;;;;;::::0;17850:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17919:1;17904:17;;:3;:17;;;;17923:12;;;;;;;;;;;;;;;;::::0;17896:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17945:24;17955:3;17960:8;17945:9;:24::i;:::-;17796:179;14981:1:::1;14736:252:::0;17622:353;;;;:::o;31951:565::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;32001:14:::1;32049:3;32043:2;32019:21;:26;;;;:::i;:::-;32018:34;;;;:::i;:::-;32001:51;;32066:13;29049:42;32085:8;;32101:6;32085:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32065:47;;;32131:8;32123:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;32180:13;29133:42;32199:8;;32215:6;32199:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32179:47;;;32245:8;32237:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;32294:13;29217:42;32313:8;;32329:6;32313:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32293:47;;;32359:8;32351:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;32408:13;29301:42;32427:8;;32443:6;32427:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32407:47;;;32473:8;32465:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;31990:526;;;;;31951:565::o:0;16867:179::-;16997:43;17015:5;17022:3;17027:8;16997:43;;;;;;;;;;;;:17;:43::i;:::-;16867:179;;;:::o;30784:310::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30877:19:::1;:38;30897:17;30877:38;;;;;;;;;;;;;;;;;;;;;;;;;30869:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30997:5;30956:19;:38;30976:17;30956:38;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31013:36;:24;:34;:36::i;:::-;31060:26;:24;:26::i;:::-;;30784:310:::0;:::o;28517:31::-;;;;;;;;;;;;;:::o;28645:42::-;;;;:::o;29979:122::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30077:16:::1;30060:14;:33;;;;29979:122:::0;:::o;20159:208::-;20256:14;20291:9;:19;20301:8;20291:19;;;;;;;;;;;;;;;;;;;;;20282:28;;20343:1;20325:20;;:6;:20;;;;20347:13;;;;;;;;;;;;;;;;;20317:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20159:208;;;:::o;29585:132::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29690:19:::1;29672:15;:37;;;;29585:132:::0;:::o;19685:204::-;19782:7;19827:1;19809:20;;:6;:20;;;;19831:12;;;;;;;;;;;;;;;;;19801:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19858:25;19876:6;19858:17;:25::i;:::-;19851:32;;19685:204;;;:::o;28927:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;30465:307::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30559:19:::1;:36;30579:15;30559:36;;;;;;;;;;;;;;;;;;;;;;;;;30558:37;30550:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30676:4;30637:19;:36;30657:15;30637:36;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;30691:36;:24;:34;:36::i;:::-;30738:26;:24;:26::i;:::-;;30465:307:::0;:::o;1188:65::-;;;;;;;;;;;;;;;;;;;:::o;29845:126::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29946:17:::1;29928:15;:35;;;;29845:126:::0;:::o;1308:20::-;;;;;;;;;;;;;:::o;26738:128::-;26808:21;26851:9;26841:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26738:128;:::o;29725:112::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29815:14:::1;29801:11;;:28;;;;;;;;;;;;;;;;;;29725:112:::0;:::o;28799:43::-;;;;:::o;19159:232::-;19316:9;19274:16;:28;19291:10;19274:28;;;;;;;;;;;;;;;:39;19303:9;19274:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19364:9;19337:48;;19352:10;19337:48;;;19375:9;19337:48;;;;;;:::i;:::-;;;;;;;;19159:232;;:::o;28694:42::-;;;;:::o;16247:209::-;16404:46;16422:5;16429:3;16434:8;16444:5;;16404:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;16247:209;;;;;:::o;28597:41::-;;;;:::o;27019:181::-;27145:13;27121:8;15210:1;15179:33;;:9;:19;15189:8;15179:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15214:13;;;;;;;;;;;;;;;;;15171:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27177:7:::1;:17;27185:8;27177:17;;;;;;;;;;;27170:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27019:181:::0;;;;:::o;31550:393::-;31635:19;:31;31655:10;31635:31;;;;;;;;;;;;;;;;;;;;;;;;;31627:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;31728:14;;31715:9;:27;;31744:21;;;;;;;;;;;;;;;;;31707:59;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31777:20;:8;:18;:20::i;:::-;31808:18;31829;:8;:16;:18::i;:::-;31808:39;;31860:28;31872:3;31877:10;31860:11;:28::i;:::-;31899:36;31918:10;31930:4;;31899:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:36::i;:::-;31616:327;31550:393;;;:::o;21063:192::-;21191:4;21214:16;:24;21231:6;21214:24;;;;;;;;;;;;;;;:35;21239:9;21214:35;;;;;;;;;;;;;;;;;;;;;;;;;21207:42;;21063:192;;;;:::o;28456:48::-;;;;;;;;;:::o;2133:238::-;1926:5;;;;;;;;;;;1912:19;;:10;:19;;;1933:17;;;;;;;;;;;;;;;;;1904:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2255:1:::1;2234:23;;:9;:23;;;;2259:31;;;;;;;;;;;;;;;;::::0;2226:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2331:9;2303:38;;2324:5;;;;;;;;;;;2303:38;;;;;;;;;;;;2356:9;2348:5;;:17;;;;;;;;;;;;;;;;;;2133:238:::0;:::o;1132:51::-;;;;;;;;;;;;;;;;;;;:::o;594:127::-;701:1;683:7;:14;;;:19;;;;;;;;;;;594:127;:::o;31102:440::-;31156:7;31176:20;31199:34;:24;:32;:34::i;:::-;31176:57;;31265:10;;;;;;;;;;;31250:25;;:12;:25;31246:254;;;31310:14;;31292:15;:32;;;;31246:254;;;31362:11;;;;;;;;;;;31347:26;;:12;:26;31343:157;;;31408:15;;31390;:33;;;;31343:157;;;31474:14;;31456:15;:32;;;;31343:157;31246:254;31519:15;;31512:22;;;31102:440;:::o;21446:275::-;21535:12;21550:9;:19;21560:8;21550:19;;;;;;;;;;;;;;;;;;;;;21535:34;;21576:24;21591:8;21576:14;:24::i;:::-;21609:30;21624:4;21630:8;21609:14;:30::i;:::-;21646:26;21658:3;21663:8;21646:11;:26::i;:::-;21706:8;21701:3;21686:29;;21695:4;21686:29;;;;;;;;;;;;21528:193;21446:275;;:::o;24848:590::-;24996:8;14743:18;14764:9;:19;14774:8;14764:19;;;;;;;;;;;;;;;;;;;;;14743:40;;14820:10;14806:24;;:10;:24;;;:71;;;;14867:10;14841:36;;:12;:22;14854:8;14841:22;;;;;;;;;;;;;;;;;;;;;:36;;;14806:71;:122;;;;14888:16;:28;14905:10;14888:28;;;;;;;;;;;;;;;:40;14917:10;14888:40;;;;;;;;;;;;;;;;;;;;;;;;;14806:122;14937:30;;;;;;;;;;;;;;;;;14790:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25024:8:::1;15210:1;15179:33;;:9;:19;15189:8;15179:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15214:13;;;;;;;;;;;;;;;;::::0;15171:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25044:18:::2;25065:9;:19;25075:8;25065:19;;;;;;;;;;;;;;;;;;;;;25044:40;;25113:5;25099:19;;:10;:19;;;25120:9;;;;;;;;;;;;;;;;::::0;25091:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25160:1;25145:17;;:3;:17;;;;25164:12;;;;;;;;;;;;;;;;::::0;25137:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25186:24;25196:3;25201:8;25186:9;:24::i;:::-;25223:16;:3;:14;;;:16::i;:::-;25219:214;;;25255:13;25291:3;25271:41;;;25313:10;25325:5;25332:8;25342:5;25271:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25255:93;;13581:10;25375:24;;25365:34;;;:6;:34;;;;25401:23;;;;;;;;;;;;;;;;::::0;25357:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25246:187;25219:214;25037:401;14981:1:::1;14736:252:::0;24848:590;;;;;:::o;729:235::-;793:13;809:7;:14;;;793:30;;850:1;842:5;:9;834:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;944:1;936:5;:9;919:7;:14;;:26;;;;782:182;729:235;:::o;24407:163::-;24511:7;24537:19;:27;24557:6;24537:27;;;;;;;;;;;;;;;;24530:34;;24407:163;;;:::o;472:114::-;537:7;564;:14;;;557:21;;472:114;;;:::o;22112:297::-;22233:1;22218:17;;:3;:17;;;;22237:12;;;;;;;;;;;;;;;;;22210:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22296:1;22265:33;;:9;:19;22275:8;22265:19;;;;;;;;;;;;;;;;;;;;;:33;;;22300:18;;;;;;;;;;;;;;;;;22257:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22328:26;22340:3;22345:8;22328:11;:26::i;:::-;22394:8;22389:3;22368:35;;22385:1;22368:35;;;;;;;;;;;;22112:297;;:::o;28152:157::-;28259:8;15210:1;15179:33;;:9;:19;15189:8;15179:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15214:13;;;;;;;;;;;;;;;;;15171:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28299:4:::1;28279:7;:17;28287:8;28279:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;28152:157:::0;;;:::o;25571:110::-;25653:12;:22;25666:8;25653:22;;;;;;;;;;;;25646:29;;;;;;;;;;;25571:110;:::o;23369:234::-;23509:5;23486:28;;:9;:19;23496:8;23486:19;;;;;;;;;;;;;;;;;;;;;:28;;;23516:9;;;;;;;;;;;;;;;;;23478:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23563:1;23533:19;:26;23553:5;23533:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;23578:9;:19;23588:8;23578:19;;;;;;;;;;;;23571:26;;;;;;;;;;;23369:234;;:::o;23870:242::-;24013:1;23982:33;;:9;:19;23992:8;23982:19;;;;;;;;;;;;;;;;;;;;;:33;;;24017:18;;;;;;;;;;;;;;;;;23974:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24067:3;24045:9;:19;24055:8;24045:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24105:1;24077:19;:24;24097:3;24077:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;23870:242;;:::o;2591:780::-;2674:17;3115:16;3138:19;3160:66;3138:88;;;;3268:5;3256:18;3244:30;;3334:3;3322:15;;:8;:15;;:42;;;;;3353:11;3341:8;:23;;3322:42;3306:59;;2696:675;;2591:780;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;195:5;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:137::-;336:5;374:6;361:20;352:29;;390:32;416:5;390:32;:::i;:::-;342:86;;;;:::o;434:141::-;490:5;521:6;515:13;506:22;;537:32;563:5;537:32;:::i;:::-;496:79;;;;:::o;594:552::-;651:8;661:6;711:3;704:4;696:6;692:17;688:27;678:2;;719:79;;:::i;:::-;678:2;832:6;819:20;809:30;;862:18;854:6;851:30;848:2;;;884:79;;:::i;:::-;848:2;998:4;990:6;986:17;974:29;;1052:3;1044:4;1036:6;1032:17;1022:8;1018:32;1015:41;1012:2;;;1059:79;;:::i;:::-;1012:2;668:478;;;;;:::o;1166:553::-;1224:8;1234:6;1284:3;1277:4;1269:6;1265:17;1261:27;1251:2;;1292:79;;:::i;:::-;1251:2;1405:6;1392:20;1382:30;;1435:18;1427:6;1424:30;1421:2;;;1457:79;;:::i;:::-;1421:2;1571:4;1563:6;1559:17;1547:29;;1625:3;1617:4;1609:6;1605:17;1595:8;1591:32;1588:41;1585:2;;;1632:79;;:::i;:::-;1585:2;1241:478;;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1777:87;;;;:::o;1870:137::-;1915:5;1953:6;1940:20;1931:29;;1969:32;1995:5;1969:32;:::i;:::-;1921:86;;;;:::o;2013:329::-;2072:6;2121:2;2109:9;2100:7;2096:23;2092:32;2089:2;;;2127:79;;:::i;:::-;2089:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2079:263;;;;:::o;2348:474::-;2416:6;2424;2473:2;2461:9;2452:7;2448:23;2444:32;2441:2;;;2479:79;;:::i;:::-;2441:2;2599:1;2624:53;2669:7;2660:6;2649:9;2645:22;2624:53;:::i;:::-;2614:63;;2570:117;2726:2;2752:53;2797:7;2788:6;2777:9;2773:22;2752:53;:::i;:::-;2742:63;;2697:118;2431:391;;;;;:::o;2828:619::-;2905:6;2913;2921;2970:2;2958:9;2949:7;2945:23;2941:32;2938:2;;;2976:79;;:::i;:::-;2938:2;3096:1;3121:53;3166:7;3157:6;3146:9;3142:22;3121:53;:::i;:::-;3111:63;;3067:117;3223:2;3249:53;3294:7;3285:6;3274:9;3270:22;3249:53;:::i;:::-;3239:63;;3194:118;3351:2;3377:53;3422:7;3413:6;3402:9;3398:22;3377:53;:::i;:::-;3367:63;;3322:118;2928:519;;;;;:::o;3453:963::-;3550:6;3558;3566;3574;3582;3631:3;3619:9;3610:7;3606:23;3602:33;3599:2;;;3638:79;;:::i;:::-;3599:2;3758:1;3783:53;3828:7;3819:6;3808:9;3804:22;3783:53;:::i;:::-;3773:63;;3729:117;3885:2;3911:53;3956:7;3947:6;3936:9;3932:22;3911:53;:::i;:::-;3901:63;;3856:118;4013:2;4039:53;4084:7;4075:6;4064:9;4060:22;4039:53;:::i;:::-;4029:63;;3984:118;4169:2;4158:9;4154:18;4141:32;4200:18;4192:6;4189:30;4186:2;;;4222:79;;:::i;:::-;4186:2;4335:64;4391:7;4382:6;4371:9;4367:22;4335:64;:::i;:::-;4317:82;;;;4112:297;3589:827;;;;;;;;:::o;4422:468::-;4487:6;4495;4544:2;4532:9;4523:7;4519:23;4515:32;4512:2;;;4550:79;;:::i;:::-;4512:2;4670:1;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4641:117;4797:2;4823:50;4865:7;4856:6;4845:9;4841:22;4823:50;:::i;:::-;4813:60;;4768:115;4502:388;;;;;:::o;4896:674::-;4976:6;4984;4992;5041:2;5029:9;5020:7;5016:23;5012:32;5009:2;;;5047:79;;:::i;:::-;5009:2;5167:1;5192:53;5237:7;5228:6;5217:9;5213:22;5192:53;:::i;:::-;5182:63;;5138:117;5322:2;5311:9;5307:18;5294:32;5353:18;5345:6;5342:30;5339:2;;;5375:79;;:::i;:::-;5339:2;5488:65;5545:7;5536:6;5525:9;5521:22;5488:65;:::i;:::-;5470:83;;;;5265:298;4999:571;;;;;:::o;5576:474::-;5644:6;5652;5701:2;5689:9;5680:7;5676:23;5672:32;5669:2;;;5707:79;;:::i;:::-;5669:2;5827:1;5852:53;5897:7;5888:6;5877:9;5873:22;5852:53;:::i;:::-;5842:63;;5798:117;5954:2;5980:53;6025:7;6016:6;6005:9;6001:22;5980:53;:::i;:::-;5970:63;;5925:118;5659:391;;;;;:::o;6056:327::-;6114:6;6163:2;6151:9;6142:7;6138:23;6134:32;6131:2;;;6169:79;;:::i;:::-;6131:2;6289:1;6314:52;6358:7;6349:6;6338:9;6334:22;6314:52;:::i;:::-;6304:62;;6260:116;6121:262;;;;:::o;6389:349::-;6458:6;6507:2;6495:9;6486:7;6482:23;6478:32;6475:2;;;6513:79;;:::i;:::-;6475:2;6633:1;6658:63;6713:7;6704:6;6693:9;6689:22;6658:63;:::i;:::-;6648:73;;6604:127;6465:273;;;;:::o;6744:329::-;6803:6;6852:2;6840:9;6831:7;6827:23;6823:32;6820:2;;;6858:79;;:::i;:::-;6820:2;6978:1;7003:53;7048:7;7039:6;7028:9;7024:22;7003:53;:::i;:::-;6993:63;;6949:117;6810:263;;;;:::o;7079:327::-;7137:6;7186:2;7174:9;7165:7;7161:23;7157:32;7154:2;;;7192:79;;:::i;:::-;7154:2;7312:1;7337:52;7381:7;7372:6;7361:9;7357:22;7337:52;:::i;:::-;7327:62;;7283:116;7144:262;;;;:::o;7412:118::-;7499:24;7517:5;7499:24;:::i;:::-;7494:3;7487:37;7477:53;;:::o;7536:109::-;7617:21;7632:5;7617:21;:::i;:::-;7612:3;7605:34;7595:50;;:::o;7651:360::-;7737:3;7765:38;7797:5;7765:38;:::i;:::-;7819:70;7882:6;7877:3;7819:70;:::i;:::-;7812:77;;7898:52;7943:6;7938:3;7931:4;7924:5;7920:16;7898:52;:::i;:::-;7975:29;7997:6;7975:29;:::i;:::-;7970:3;7966:39;7959:46;;7741:270;;;;;:::o;8017:364::-;8105:3;8133:39;8166:5;8133:39;:::i;:::-;8188:71;8252:6;8247:3;8188:71;:::i;:::-;8181:78;;8268:52;8313:6;8308:3;8301:4;8294:5;8290:16;8268:52;:::i;:::-;8345:29;8367:6;8345:29;:::i;:::-;8340:3;8336:39;8329:46;;8109:272;;;;;:::o;8387:366::-;8529:3;8550:67;8614:2;8609:3;8550:67;:::i;:::-;8543:74;;8626:93;8715:3;8626:93;:::i;:::-;8744:2;8739:3;8735:12;8728:19;;8533:220;;;:::o;8759:366::-;8901:3;8922:67;8986:2;8981:3;8922:67;:::i;:::-;8915:74;;8998:93;9087:3;8998:93;:::i;:::-;9116:2;9111:3;9107:12;9100:19;;8905:220;;;:::o;9131:366::-;9273:3;9294:67;9358:2;9353:3;9294:67;:::i;:::-;9287:74;;9370:93;9459:3;9370:93;:::i;:::-;9488:2;9483:3;9479:12;9472:19;;9277:220;;;:::o;9503:366::-;9645:3;9666:67;9730:2;9725:3;9666:67;:::i;:::-;9659:74;;9742:93;9831:3;9742:93;:::i;:::-;9860:2;9855:3;9851:12;9844:19;;9649:220;;;:::o;9875:366::-;10017:3;10038:67;10102:2;10097:3;10038:67;:::i;:::-;10031:74;;10114:93;10203:3;10114:93;:::i;:::-;10232:2;10227:3;10223:12;10216:19;;10021:220;;;:::o;10247:366::-;10389:3;10410:67;10474:2;10469:3;10410:67;:::i;:::-;10403:74;;10486:93;10575:3;10486:93;:::i;:::-;10604:2;10599:3;10595:12;10588:19;;10393:220;;;:::o;10619:366::-;10761:3;10782:67;10846:2;10841:3;10782:67;:::i;:::-;10775:74;;10858:93;10947:3;10858:93;:::i;:::-;10976:2;10971:3;10967:12;10960:19;;10765:220;;;:::o;10991:366::-;11133:3;11154:67;11218:2;11213:3;11154:67;:::i;:::-;11147:74;;11230:93;11319:3;11230:93;:::i;:::-;11348:2;11343:3;11339:12;11332:19;;11137:220;;;:::o;11363:398::-;11522:3;11543:83;11624:1;11619:3;11543:83;:::i;:::-;11536:90;;11635:93;11724:3;11635:93;:::i;:::-;11753:1;11748:3;11744:11;11737:18;;11526:235;;;:::o;11767:118::-;11854:24;11872:5;11854:24;:::i;:::-;11849:3;11842:37;11832:53;;:::o;11891:115::-;11976:23;11993:5;11976:23;:::i;:::-;11971:3;11964:36;11954:52;;:::o;12012:379::-;12196:3;12218:147;12361:3;12218:147;:::i;:::-;12211:154;;12382:3;12375:10;;12200:191;;;:::o;12397:222::-;12490:4;12528:2;12517:9;12513:18;12505:26;;12541:71;12609:1;12598:9;12594:17;12585:6;12541:71;:::i;:::-;12495:124;;;;:::o;12625:640::-;12820:4;12858:3;12847:9;12843:19;12835:27;;12872:71;12940:1;12929:9;12925:17;12916:6;12872:71;:::i;:::-;12953:72;13021:2;13010:9;13006:18;12997:6;12953:72;:::i;:::-;13035;13103:2;13092:9;13088:18;13079:6;13035:72;:::i;:::-;13154:9;13148:4;13144:20;13139:2;13128:9;13124:18;13117:48;13182:76;13253:4;13244:6;13182:76;:::i;:::-;13174:84;;12825:440;;;;;;;:::o;13271:210::-;13358:4;13396:2;13385:9;13381:18;13373:26;;13409:65;13471:1;13460:9;13456:17;13447:6;13409:65;:::i;:::-;13363:118;;;;:::o;13487:313::-;13600:4;13638:2;13627:9;13623:18;13615:26;;13687:9;13681:4;13677:20;13673:1;13662:9;13658:17;13651:47;13715:78;13788:4;13779:6;13715:78;:::i;:::-;13707:86;;13605:195;;;;:::o;13806:419::-;13972:4;14010:2;13999:9;13995:18;13987:26;;14059:9;14053:4;14049:20;14045:1;14034:9;14030:17;14023:47;14087:131;14213:4;14087:131;:::i;:::-;14079:139;;13977:248;;;:::o;14231:419::-;14397:4;14435:2;14424:9;14420:18;14412:26;;14484:9;14478:4;14474:20;14470:1;14459:9;14455:17;14448:47;14512:131;14638:4;14512:131;:::i;:::-;14504:139;;14402:248;;;:::o;14656:419::-;14822:4;14860:2;14849:9;14845:18;14837:26;;14909:9;14903:4;14899:20;14895:1;14884:9;14880:17;14873:47;14937:131;15063:4;14937:131;:::i;:::-;14929:139;;14827:248;;;:::o;15081:419::-;15247:4;15285:2;15274:9;15270:18;15262:26;;15334:9;15328:4;15324:20;15320:1;15309:9;15305:17;15298:47;15362:131;15488:4;15362:131;:::i;:::-;15354:139;;15252:248;;;:::o;15506:419::-;15672:4;15710:2;15699:9;15695:18;15687:26;;15759:9;15753:4;15749:20;15745:1;15734:9;15730:17;15723:47;15787:131;15913:4;15787:131;:::i;:::-;15779:139;;15677:248;;;:::o;15931:419::-;16097:4;16135:2;16124:9;16120:18;16112:26;;16184:9;16178:4;16174:20;16170:1;16159:9;16155:17;16148:47;16212:131;16338:4;16212:131;:::i;:::-;16204:139;;16102:248;;;:::o;16356:419::-;16522:4;16560:2;16549:9;16545:18;16537:26;;16609:9;16603:4;16599:20;16595:1;16584:9;16580:17;16573:47;16637:131;16763:4;16637:131;:::i;:::-;16629:139;;16527:248;;;:::o;16781:419::-;16947:4;16985:2;16974:9;16970:18;16962:26;;17034:9;17028:4;17024:20;17020:1;17009:9;17005:17;16998:47;17062:131;17188:4;17062:131;:::i;:::-;17054:139;;16952:248;;;:::o;17206:222::-;17299:4;17337:2;17326:9;17322:18;17314:26;;17350:71;17418:1;17407:9;17403:17;17394:6;17350:71;:::i;:::-;17304:124;;;;:::o;17434:218::-;17525:4;17563:2;17552:9;17548:18;17540:26;;17576:69;17642:1;17631:9;17627:17;17618:6;17576:69;:::i;:::-;17530:122;;;;:::o;17739:98::-;17790:6;17824:5;17818:12;17808:22;;17797:40;;;:::o;17843:99::-;17895:6;17929:5;17923:12;17913:22;;17902:40;;;:::o;17948:168::-;18031:11;18065:6;18060:3;18053:19;18105:4;18100:3;18096:14;18081:29;;18043:73;;;;:::o;18122:147::-;18223:11;18260:3;18245:18;;18235:34;;;;:::o;18275:169::-;18359:11;18393:6;18388:3;18381:19;18433:4;18428:3;18424:14;18409:29;;18371:73;;;;:::o;18450:305::-;18490:3;18509:20;18527:1;18509:20;:::i;:::-;18504:25;;18543:20;18561:1;18543:20;:::i;:::-;18538:25;;18697:1;18629:66;18625:74;18622:1;18619:81;18616:2;;;18703:18;;:::i;:::-;18616:2;18747:1;18744;18740:9;18733:16;;18494:261;;;;:::o;18761:185::-;18801:1;18818:20;18836:1;18818:20;:::i;:::-;18813:25;;18852:20;18870:1;18852:20;:::i;:::-;18847:25;;18891:1;18881:2;;18896:18;;:::i;:::-;18881:2;18938:1;18935;18931:9;18926:14;;18803:143;;;;:::o;18952:348::-;18992:7;19015:20;19033:1;19015:20;:::i;:::-;19010:25;;19049:20;19067:1;19049:20;:::i;:::-;19044:25;;19237:1;19169:66;19165:74;19162:1;19159:81;19154:1;19147:9;19140:17;19136:105;19133:2;;;19244:18;;:::i;:::-;19133:2;19292:1;19289;19285:9;19274:20;;19000:300;;;;:::o;19306:191::-;19346:4;19366:20;19384:1;19366:20;:::i;:::-;19361:25;;19400:20;19418:1;19400:20;:::i;:::-;19395:25;;19439:1;19436;19433:8;19430:2;;;19444:18;;:::i;:::-;19430:2;19489:1;19486;19482:9;19474:17;;19351:146;;;;:::o;19503:96::-;19540:7;19569:24;19587:5;19569:24;:::i;:::-;19558:35;;19548:51;;;:::o;19605:90::-;19639:7;19682:5;19675:13;19668:21;19657:32;;19647:48;;;:::o;19701:149::-;19737:7;19777:66;19770:5;19766:78;19755:89;;19745:105;;;:::o;19856:126::-;19893:7;19933:42;19926:5;19922:54;19911:65;;19901:81;;;:::o;19988:77::-;20025:7;20054:5;20043:16;;20033:32;;;:::o;20071:93::-;20107:7;20147:10;20140:5;20136:22;20125:33;;20115:49;;;:::o;20170:307::-;20238:1;20248:113;20262:6;20259:1;20256:13;20248:113;;;20347:1;20342:3;20338:11;20332:18;20328:1;20323:3;20319:11;20312:39;20284:2;20281:1;20277:10;20272:15;;20248:113;;;20379:6;20376:1;20373:13;20370:2;;;20459:1;20450:6;20445:3;20441:16;20434:27;20370:2;20219:258;;;;:::o;20483:320::-;20527:6;20564:1;20558:4;20554:12;20544:22;;20611:1;20605:4;20601:12;20632:18;20622:2;;20688:4;20680:6;20676:17;20666:27;;20622:2;20750;20742:6;20739:14;20719:18;20716:38;20713:2;;;20769:18;;:::i;:::-;20713:2;20534:269;;;;:::o;20809:180::-;20857:77;20854:1;20847:88;20954:4;20951:1;20944:15;20978:4;20975:1;20968:15;20995:180;21043:77;21040:1;21033:88;21140:4;21137:1;21130:15;21164:4;21161:1;21154:15;21181:180;21229:77;21226:1;21219:88;21326:4;21323:1;21316:15;21350:4;21347:1;21340:15;21367:117;21476:1;21473;21466:12;21490:117;21599:1;21596;21589:12;21613:117;21722:1;21719;21712:12;21736:117;21845:1;21842;21835:12;21859:117;21968:1;21965;21958:12;21982:102;22023:6;22074:2;22070:7;22065:2;22058:5;22054:14;22050:28;22040:38;;22030:54;;;:::o;22090:177::-;22230:29;22226:1;22218:6;22214:14;22207:53;22196:71;:::o;22273:172::-;22413:24;22409:1;22401:6;22397:14;22390:48;22379:66;:::o;22451:172::-;22591:24;22587:1;22579:6;22575:14;22568:48;22557:66;:::o;22629:176::-;22769:28;22765:1;22757:6;22753:14;22746:52;22735:70;:::o;22811:172::-;22951:24;22947:1;22939:6;22935:14;22928:48;22917:66;:::o;22989:172::-;23129:24;23125:1;23117:6;23113:14;23106:48;23095:66;:::o;23167:175::-;23307:27;23303:1;23295:6;23291:14;23284:51;23273:69;:::o;23348:174::-;23488:26;23484:1;23476:6;23472:14;23465:50;23454:68;:::o;23528:114::-;23634:8;:::o;23648:122::-;23721:24;23739:5;23721:24;:::i;:::-;23714:5;23711:35;23701:2;;23760:1;23757;23750:12;23701:2;23691:79;:::o;23776:116::-;23846:21;23861:5;23846:21;:::i;:::-;23839:5;23836:32;23826:2;;23882:1;23879;23872:12;23826:2;23816:76;:::o;23898:120::-;23970:23;23987:5;23970:23;:::i;:::-;23963:5;23960:34;23950:2;;24008:1;24005;23998:12;23950:2;23940:78;:::o;24024:122::-;24097:24;24115:5;24097:24;:::i;:::-;24090:5;24087:35;24077:2;;24136:1;24133;24126:12;24077:2;24067:79;:::o;24152:120::-;24224:23;24241:5;24224:23;:::i;:::-;24217:5;24214:34;24204:2;;24262:1;24259;24252:12;24204:2;24194:78;:::o
Swarm Source
ipfs://150d21c4044a9b58d92bef1fd9c4b56b333417d83759af2e85e6e18cff9d0471
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.01
Net Worth in POL
Token Allocations
POL
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| POL | 100.00% | $0.125395 | 0.1 | $0.01254 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.