Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,569 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 28311196 | 46 days ago | IN | 0 ETH | 0.00000061 | ||||
| Set Approval For... | 23472339 | 158 days ago | IN | 0 ETH | 0 | ||||
| Set Approval For... | 22840595 | 172 days ago | IN | 0 ETH | 0.00000002 | ||||
| Set Approval For... | 19978814 | 238 days ago | IN | 0 ETH | 0.00000004 | ||||
| Set Approval For... | 19421842 | 251 days ago | IN | 0 ETH | 0.00000009 | ||||
| Set Approval For... | 19315737 | 254 days ago | IN | 0 ETH | 0 | ||||
| Transfer From | 15580020 | 340 days ago | IN | 0 ETH | 0.00000001 | ||||
| Set Approval For... | 15128955 | 351 days ago | IN | 0 ETH | 0.00000002 | ||||
| Set Approval For... | 14735665 | 360 days ago | IN | 0 ETH | 0.00000001 | ||||
| Set Approval For... | 14129707 | 374 days ago | IN | 0 ETH | 0.00000036 | ||||
| Set Approval For... | 13569198 | 387 days ago | IN | 0 ETH | 0.00000003 | ||||
| Safe Transfer Fr... | 13057664 | 399 days ago | IN | 0 ETH | 0.00000013 | ||||
| Set Approval For... | 12031253 | 422 days ago | IN | 0 ETH | 0.00000024 | ||||
| Set Approval For... | 11999411 | 423 days ago | IN | 0 ETH | 0.00000786 | ||||
| Set Approval For... | 11711884 | 430 days ago | IN | 0 ETH | 0.0000001 | ||||
| Set Approval For... | 11614546 | 432 days ago | IN | 0 ETH | 0.0000003 | ||||
| Set Approval For... | 11075600 | 444 days ago | IN | 0 ETH | 0.0000002 | ||||
| Set Approval For... | 11075525 | 444 days ago | IN | 0 ETH | 0.00000012 | ||||
| Set Approval For... | 11075525 | 444 days ago | IN | 0 ETH | 0.0000002 | ||||
| Set Approval For... | 10845494 | 450 days ago | IN | 0 ETH | 0.00000029 | ||||
| Safe Transfer Fr... | 10842644 | 450 days ago | IN | 0 ETH | 0.00000024 | ||||
| Set Approval For... | 10826728 | 450 days ago | IN | 0 ETH | 0.00000093 | ||||
| Set Approval For... | 10804805 | 451 days ago | IN | 0 ETH | 0.00000021 | ||||
| Set Approval For... | 10792409 | 451 days ago | IN | 0 ETH | 0.00000015 | ||||
| Set Approval For... | 10575022 | 456 days ago | IN | 0 ETH | 0.00000011 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GreedKeys
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-05-30
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
/// @title Greed Keys
/// @author Andre Costa @ LuxLabs.io
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
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;
}
}
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Trees proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
} else {
// Hash(current element of the proof + current computed hash)
computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
}
}
return computedHash;
}
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
address internal _oldOwner;
uint256 internal lastOwnershipTransfer;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Returns the address of the previous owner.
*/
function oldOwner() public view virtual returns (address) {
return _oldOwner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner_ = _owner;
_oldOwner = oldOwner_;
_owner = newOwner;
lastOwnershipTransfer = block.timestamp;
emit OwnershipTransferred(oldOwner_, newOwner);
}
}
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
* being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
* that `ownerOf(tokenId)` is `a`.
*/
// solhint-disable-next-line func-name-mixedcase
function __unsafe_increaseBalance(address account, uint256 amount) internal {
_balances[account] += amount;
}
}
contract GreedKeys is ERC721, Ownable {
/// @notice The base uri of the project
string public baseURI;
/// @notice The collection's max supply
uint256 public maxSupply = 1400;
/// @notice Total reserved
uint256 public reserved = 250;
uint256 public reservedMinted;
/// @notice Total guaranteed mint count
uint256 public guaranteed = 1079;
/// @dev Merkle tree root hash for guaranteed list
bytes32 public rootForGuaranteed = 0x929101aeda3c7e1587f9c9044e1baa7b9f63e1f4b1c70839f2af1b301f53ac90;
/// @dev Merkle tree root hash for allowed list
bytes32 public rootForOversubscribed = 0x4b01488369b6941b1b15421c20feee9dfcb347f71ac5e811d31e5b1f9402cf94;
/// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints
mapping(address => bool) public mintedOnGuaranteed;
mapping(address => bool) public mintedOnOversubscribed;
/// @dev Counters library to track token id and counts
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
Counters.Counter private _guaranteedAllowListMintedCounter;
Counters.Counter private _oversubscribedAllowListMintedCounter;
/// @dev Different states of minting
enum MintState {
PAUSED, // Minting is paused
GUARANTEED, // Guaranteed allow list
OVERSUBSCRIBED, // General allow list
PUBLIC // Open to public
}
MintState public mintState = MintState.PAUSED;
constructor() ERC721("Greed Keys", "GK") {
baseURI = "ipfs://QmcuaWWV2Wt243c9dtJXhmNokupHFQ6iAaE6u7RXmHnWtR/";
}
/// Base uri functions
///@notice Returns the base uri
///@return Base uri
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
///@notice Sets a new base uri
///@dev Only callable by owner
///@param newBaseURI The new base uri
function setBaseURI(string memory newBaseURI) external onlyOwner {
baseURI = newBaseURI;
}
///@notice Returns the token uri
///@dev Updated to include json
///@param tokenId Token id
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token");
return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : "";
}
/// Minting functions
///@notice Mints nft token for allowed list addresses
///@dev Uses Merkle tree proof
///@param proof The Merkle tree proof of the allow list address
function mintAllowlist(address receiver, bytes32[] calldata proof) external {
/// Check if the sale is paused
require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states");
require(_tokenIdCounter.current() < maxSupply, "Max supply minted");
/// Check if user is on the allow list
bytes32 leaf = keccak256(abi.encodePacked(receiver));
/// Update the root based on the state
bytes32 root;
// If current state is for guaranteed mints, set to the guaranteed hash
if (mintState == MintState.GUARANTEED) {
/// Set the correct root hash
root = rootForGuaranteed;
/// Check that user has not minted on guaranteed list
require(mintedOnGuaranteed[receiver] == false, "User already minted on guaranteed list");
// Check there is sufficient guaranteed mint supply left
require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted");
/// Increase the allow list minted count
_guaranteedAllowListMintedCounter.increment();
/// Set that address has minted
mintedOnGuaranteed[receiver] = true;
}
// If current state is for oversubscribed, set to the oversubscribed hash
if (mintState == MintState.OVERSUBSCRIBED) {
/// Set the correct root hash
root = rootForOversubscribed;
/// Check that user has not minted on oversubscribed list
require(mintedOnOversubscribed[receiver] == false, "User already minted on oversubscribed list");
/// Check there is sufficient oversubscribed supply left
/// Balance for oversubscribed mint = max supply minus reserved and guaranteed count
require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted");
_oversubscribedAllowListMintedCounter.increment();
/// Set that address has minted
mintedOnOversubscribed[receiver] = true;
}
// Check the merkle proof
require(MerkleProof.verify(proof, root, leaf), "Invalid proof");
/// Get current token id then increase it
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
/// Mint the token
_safeMint(receiver, tokenId);
}
///@notice Mints a token to caller addresses
function mintPublic(address receiver) external {
require(mintState == MintState.PUBLIC, "Public mint inactive");
/// Check balance of supply
/// Total supply minus reserved
require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted");
/// Get current token id then increase it
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
/// Mint the token
_safeMint(receiver, tokenId);
}
///@notice Mint from reserve supply
///@dev Only callable by owner
///@param to Array of addresses to receive airdrop
function mintFromReserved(address to, uint256 amount) external onlyOwner {
/// Check balance of supply
require(amount + reservedMinted <= reserved, "Amount exceeds reserved supply");
for(uint i; i < amount;) {
/// Get current token id then increase it
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
/// Mint the token
_safeMint(to, tokenId);
/// Unchecked i to save gas
unchecked {
i++;
}
}
reservedMinted += amount;
}
/// Other view and admin functions
/**
* @param merkleRoot_ The new merkle root
*/
function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner {
rootForGuaranteed = merkleRoot_;
}
/**
* @param merkleRoot_ The new merkle root
*/
function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner {
rootForOversubscribed = merkleRoot_;
}
///@notice Returns the total number of nftes minted
function totalMinted() public view returns(uint256) {
/// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
return _tokenIdCounter.current();
}
///@notice Returns the current number of guaranteed allow list minted
function totalGuaranteedAllowListMinted() public view returns(uint256) {
/// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
return _guaranteedAllowListMintedCounter.current();
}
///@notice Returns the current number of oversubscribed allow list minted
function totalOversubscribedAllowListMinted() public view returns(uint256) {
/// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
return _oversubscribedAllowListMintedCounter.current();
}
///@notice Returns the total allow list minted
function totalAllowListMinted() public view returns(uint256) {
/// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count
return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current();
}
/**
* Set mint state.
* @param mintState_ The new state of the contract.
*/
function setMintState(uint256 mintState_) external onlyOwner {
require(mintState_ < 5, "Invalid State!");
mintState = MintState(mintState_);
}
///@notice Function to update guaranteed mint count
///@param count New guaranteed mint count
function setGuaranteedCount(uint256 count) external onlyOwner {
guaranteed = count;
}
///@notice Function to update reserved mint count
///@param count New reserved mint count
function setReservedCount(uint256 count) external onlyOwner {
reserved = count;
}
}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":[{"internalType":"address","name":"to","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum GreedKeys.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","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"}]Contract Creation Code
6080604052610578600a5560fa600b55610437600d557f929101aeda3c7e1587f9c9044e1baa7b9f63e1f4b1c70839f2af1b301f53ac905f1b600e557f4b01488369b6941b1b15421c20feee9dfcb347f71ac5e811d31e5b1f9402cf945f1b600f555f60155f6101000a81548160ff021916908360038111156200008857620000876200028d565b5b021790555034801562000099575f80fd5b506040518060400160405280600a81526020017f4772656564204b657973000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f474b000000000000000000000000000000000000000000000000000000000000815250815f90816200011691906200051e565b5080600190816200012891906200051e565b5050506200014b6200013f6200017c60201b60201c565b6200018360201b60201c565b60405180606001604052806036815260200162004c9560369139600990816200017591906200051e565b5062000602565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200033657607f821691505b6020821081036200034c576200034b620002f1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620003b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000373565b620003bc868362000373565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200040662000400620003fa84620003d4565b620003dd565b620003d4565b9050919050565b5f819050919050565b6200042183620003e6565b6200043962000430826200040d565b8484546200037f565b825550505050565b5f90565b6200044f62000441565b6200045c81848462000416565b505050565b5b818110156200048357620004775f8262000445565b60018101905062000462565b5050565b601f821115620004d2576200049c8162000352565b620004a78462000364565b81016020851015620004b7578190505b620004cf620004c68562000364565b83018262000461565b50505b505050565b5f82821c905092915050565b5f620004f45f1984600802620004d7565b1980831691505092915050565b5f6200050e8383620004e3565b9150826002028217905092915050565b6200052982620002ba565b67ffffffffffffffff811115620005455762000544620002c4565b5b6200055182546200031e565b6200055e82828562000487565b5f60209050601f83116001811462000594575f84156200057f578287015190505b6200058b858262000501565b865550620005fa565b601f198416620005a48662000352565b5f5b82811015620005cd57848901518255600182019150602085019450602081019050620005a6565b86831015620005ed5784890151620005e9601f891682620004e3565b8355505b6001600288020188555050505b505050505050565b61468580620006105f395ff3fe608060405234801561000f575f80fd5b5060043610610246575f3560e01c80638da5cb5b11610139578063c87b56dd116100b6578063f20423141161007a578063f2042314146106c6578063f2fde38b146106e4578063f487404f14610700578063f9c957d81461071e578063fe60d12c1461073a57610246565b8063c87b56dd1461060c578063d371f76b1461063c578063d5abeb011461065a578063e921dad214610678578063e985e9c51461069657610246565b8063ab81e062116100fd578063ab81e0621461056a578063ad8c3f3314610586578063b2422232146105a2578063b88d4fde146105d2578063c051e38a146105ee57610246565b80638da5cb5b146104d857806395d89b41146104f6578063a06cb71914610514578063a22cb46514610530578063a2309ff81461054c57610246565b806335d5959a116101c75780636352211e1161018b5780636352211e146104205780636c0360eb1461045057806370a082311461046e578063715018a61461049e578063893807aa146104a857610246565b806335d5959a146103905780633c186018146103ac57806342842e0e146103ca5780634f297ccc146103e657806355f804b31461040457610246565b80630bb862d11161020e5780630bb862d11461030057806316f9b7071461031c57806323b872dd146103385780632dc7b8551461035457806332f4681c1461037257610246565b806301ffc9a71461024a57806306fdde031461027a578063081812fc14610298578063084520b4146102c8578063095ea7b3146102e4575b5f80fd5b610264600480360381019061025f9190612b37565b610758565b6040516102719190612b7c565b60405180910390f35b610282610839565b60405161028f9190612c1f565b60405180910390f35b6102b260048036038101906102ad9190612c72565b6108c8565b6040516102bf9190612cdc565b60405180910390f35b6102e260048036038101906102dd9190612d1f565b61090a565b005b6102fe60048036038101906102f99190612d1f565b610a2e565b005b61031a60048036038101906103159190612c72565b610b44565b005b61033660048036038101906103319190612c72565b610c41565b005b610352600480360381019061034d9190612d5d565b610cc7565b005b61035c610d27565b6040516103699190612dc5565b60405180910390f35b61037a610d2d565b6040516103879190612ded565b60405180910390f35b6103aa60048036038101906103a59190612e30565b610d33565b005b6103b4610db9565b6040516103c19190612ded565b60405180910390f35b6103e460048036038101906103df9190612d5d565b610ddd565b005b6103ee610dfc565b6040516103fb9190612ded565b60405180910390f35b61041e60048036038101906104199190612f87565b610e02565b005b61043a60048036038101906104359190612c72565b610e91565b6040516104479190612cdc565b60405180910390f35b610458610f15565b6040516104659190612c1f565b60405180910390f35b61048860048036038101906104839190612fce565b610fa1565b6040516104959190612ded565b60405180910390f35b6104a6611055565b005b6104c260048036038101906104bd9190612fce565b6110dc565b6040516104cf9190612b7c565b60405180910390f35b6104e06110f9565b6040516104ed9190612cdc565b60405180910390f35b6104fe611121565b60405161050b9190612c1f565b60405180910390f35b61052e60048036038101906105299190612fce565b6111b1565b005b61054a60048036038101906105459190613023565b6112a4565b005b6105546112ba565b6040516105619190612ded565b60405180910390f35b610584600480360381019061057f91906130be565b6112ca565b005b6105a0600480360381019061059b9190612e30565b6117b3565b005b6105bc60048036038101906105b79190612fce565b611839565b6040516105c99190612b7c565b60405180910390f35b6105ec60048036038101906105e791906131b9565b611856565b005b6105f66118b8565b60405161060391906132ac565b60405180910390f35b61062660048036038101906106219190612c72565b6118ca565b6040516106339190612c1f565b60405180910390f35b610644611974565b6040516106519190612ded565b60405180910390f35b610662611984565b60405161066f9190612ded565b60405180910390f35b61068061198a565b60405161068d9190612dc5565b60405180910390f35b6106b060048036038101906106ab91906132c5565b611990565b6040516106bd9190612b7c565b60405180910390f35b6106ce611a1e565b6040516106db9190612ded565b60405180910390f35b6106fe60048036038101906106f99190612fce565b611a2e565b005b610708611b24565b6040516107159190612cdc565b60405180910390f35b61073860048036038101906107339190612c72565b611b4c565b005b610742611bd2565b60405161074f9190612ded565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610832575061083182611bd8565b5b9050919050565b60605f805461084790613330565b80601f016020809104026020016040519081016040528092919081815260200182805461087390613330565b80156108be5780601f10610895576101008083540402835291602001916108be565b820191905f5260205f20905b8154815290600101906020018083116108a157829003601f168201915b5050505050905090565b5f6108d282611c41565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610912611c8c565b73ffffffffffffffffffffffffffffffffffffffff166109306110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d906133aa565b60405180910390fd5b600b54600c548261099791906133f5565b11156109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90613472565b60405180910390fd5b5f5b81811015610a11575f6109ed6012611c93565b90506109f96012611c9f565b610a038482611cb3565b8180600101925050506109da565b5080600c5f828254610a2391906133f5565b925050819055505050565b5f610a3882610e91565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613500565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac7611c8c565b73ffffffffffffffffffffffffffffffffffffffff161480610af65750610af581610af0611c8c565b611990565b5b610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061358e565b60405180910390fd5b610b3f8383611cd0565b505050565b610b4c611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610b6a6110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906133aa565b60405180910390fd5b60058110610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa906135f6565b60405180910390fd5b806003811115610c1657610c15613239565b5b60155f6101000a81548160ff02191690836003811115610c3957610c38613239565b5b021790555050565b610c49611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610c676110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb4906133aa565b60405180910390fd5b80600b8190555050565b610cd8610cd2611c8c565b82611d86565b610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613684565b60405180910390fd5b610d22838383611e62565b505050565b600e5481565b600d5481565b610d3b611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610d596110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906133aa565b60405180910390fd5b80600e8190555050565b5f610dc46014611c93565b610dce6013611c93565b610dd891906133f5565b905090565b610df783838360405180602001604052805f815250611856565b505050565b600c5481565b610e0a611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610e286110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e75906133aa565b60405180910390fd5b8060099081610e8d919061383f565b5050565b5f80610e9c83612160565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390613958565b60405180910390fd5b80915050919050565b60098054610f2290613330565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4e90613330565b8015610f995780601f10610f7057610100808354040283529160200191610f99565b820191905f5260205f20905b815481529060010190602001808311610f7c57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611007906139e6565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61105d611c8c565b73ffffffffffffffffffffffffffffffffffffffff1661107b6110f9565b73ffffffffffffffffffffffffffffffffffffffff16146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906133aa565b60405180910390fd5b6110da5f612199565b565b6011602052805f5260405f205f915054906101000a900460ff1681565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461113090613330565b80601f016020809104026020016040519081016040528092919081815260200182805461115c90613330565b80156111a75780601f1061117e576101008083540402835291602001916111a7565b820191905f5260205f20905b81548152906001019060200180831161118a57829003601f168201915b5050505050905090565b6003808111156111c4576111c3613239565b5b60155f9054906101000a900460ff1660038111156111e5576111e4613239565b5b14611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c90613a4e565b60405180910390fd5b600b54600a546112359190613a6c565b61123f6012611c93565b1061127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690613b0f565b60405180910390fd5b5f61128a6012611c93565b90506112966012611c9f565b6112a08282611cb3565b5050565b6112b66112af611c8c565b83836122a3565b5050565b5f6112c56012611c93565b905090565b600160038111156112de576112dd613239565b5b60155f9054906101000a900460ff1660038111156112ff576112fe613239565b5b148061133d57506002600381111561131a57611319613239565b5b60155f9054906101000a900460ff16600381111561133b5761133a613239565b5b145b61137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390613b77565b60405180910390fd5b600a546113896012611c93565b106113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613bdf565b60405180910390fd5b5f836040516020016113db9190613c42565b6040516020818303038152906040528051906020012090505f6001600381111561140857611407613239565b5b60155f9054906101000a900460ff16600381111561142957611428613239565b5b0361156d57600e5490505f151560105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b990613ccc565b60405180910390fd5b600d546114cd611a1e565b1061150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490613d34565b60405180910390fd5b6115176013611c9f565b600160105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6002600381111561158157611580613239565b5b60155f9054906101000a900460ff1660038111156115a2576115a1613239565b5b0361170057600f5490505f151560115f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290613dc2565b60405180910390fd5b600d54600b54600a5461164e9190613a6c565b6116589190613a6c565b611660611974565b106116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790613e2a565b60405180910390fd5b6116aa6014611c9f565b600160115f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b61174b8484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050828461240a565b61178a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178190613e92565b60405180910390fd5b5f6117956012611c93565b90506117a16012611c9f565b6117ab8682611cb3565b505050505050565b6117bb611c8c565b73ffffffffffffffffffffffffffffffffffffffff166117d96110f9565b73ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611826906133aa565b60405180910390fd5b80600f8190555050565b6010602052805f5260405f205f915054906101000a900460ff1681565b611867611861611c8c565b83611d86565b6118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613684565b60405180910390fd5b6118b284848484612420565b50505050565b60155f9054906101000a900460ff1681565b60606118d66012611c93565b821115611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613efa565b60405180910390fd5b5f6009805461192690613330565b9050116119415760405180602001604052805f81525061196d565b600961194c8361247c565b60405160200161195d929190613ff8565b6040516020818303038152906040525b9050919050565b5f61197f6014611c93565b905090565b600a5481565b600f5481565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f611a296013611c93565b905090565b611a36611c8c565b73ffffffffffffffffffffffffffffffffffffffff16611a546110f9565b73ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa1906133aa565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f9061409a565b60405180910390fd5b611b2181612199565b50565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b54611c8c565b73ffffffffffffffffffffffffffffffffffffffff16611b726110f9565b73ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf906133aa565b60405180910390fd5b80600d8190555050565b600b5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c4a816125d5565b611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613958565b60405180910390fd5b50565b5f33905090565b5f815f01549050919050565b6001815f015f828254019250508190555050565b611ccc828260405180602001604052805f815250612615565b5050565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4083610e91565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611d90826125d5565b611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614128565b60405180910390fd5b5f611dd983610e91565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e1b5750611e1a8185611990565b5b80611e5957508373ffffffffffffffffffffffffffffffffffffffff16611e41846108c8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8282610e91565b73ffffffffffffffffffffffffffffffffffffffff1614611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf906141b6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90614244565b60405180910390fd5b611f53838383600161266f565b8273ffffffffffffffffffffffffffffffffffffffff16611f7382610e91565b73ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc0906141b6565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120499190613a6c565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461209d91906133f5565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215b8383836001612675565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612308906142ac565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123fd9190612b7c565b60405180910390a3505050565b5f82612416858461267b565b1490509392505050565b61242b848484611e62565b6124378484848461272b565b612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d9061433a565b60405180910390fd5b50505050565b60605f82036124c2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d0565b5f8290505f5b5f82146124f15780806124da90614358565b915050600a826124ea91906143cc565b91506124c8565b5f8167ffffffffffffffff81111561250c5761250b612e63565b5b6040519080825280601f01601f19166020018201604052801561253e5781602001600182028036833780820191505090505b5090505b5f85146125c9576001826125569190613a6c565b9150600a8561256591906143fc565b603061257191906133f5565b60f81b8183815181106125875761258661442c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125c291906143cc565b9450612542565b8093505050505b919050565b5f8073ffffffffffffffffffffffffffffffffffffffff166125f683612160565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61261f83836128ad565b61262b5f84848461272b565b61266a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126619061433a565b60405180910390fd5b505050565b50505050565b50505050565b5f808290505f5b8451811015612720575f85828151811061269f5761269e61442c565b5b602002602001015190508083116126e05782816040516020016126c3929190614479565b60405160208183030381529060405280519060200120925061270c565b80836040516020016126f3929190614479565b6040516020818303038152906040528051906020012092505b50808061271890614358565b915050612682565b508091505092915050565b5f61274b8473ffffffffffffffffffffffffffffffffffffffff16612ac0565b156128a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612774611c8c565b8786866040518563ffffffff1660e01b815260040161279694939291906144f6565b6020604051808303815f875af19250505080156127d157506040513d601f19601f820116820180604052508101906127ce9190614554565b60015b612850573d805f81146127ff576040519150601f19603f3d011682016040523d82523d5f602084013e612804565b606091505b505f815103612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f9061433a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128a5565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361291b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612912906145c9565b60405180910390fd5b612924816125d5565b15612964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295b90614631565b60405180910390fd5b6129715f8383600161266f565b61297a816125d5565b156129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b190614631565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612abc5f83836001612675565b5050565b5f80823b90505f8111915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1681612ae2565b8114612b20575f80fd5b50565b5f81359050612b3181612b0d565b92915050565b5f60208284031215612b4c57612b4b612ada565b5b5f612b5984828501612b23565b91505092915050565b5f8115159050919050565b612b7681612b62565b82525050565b5f602082019050612b8f5f830184612b6d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612bcc578082015181840152602081019050612bb1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612bf182612b95565b612bfb8185612b9f565b9350612c0b818560208601612baf565b612c1481612bd7565b840191505092915050565b5f6020820190508181035f830152612c378184612be7565b905092915050565b5f819050919050565b612c5181612c3f565b8114612c5b575f80fd5b50565b5f81359050612c6c81612c48565b92915050565b5f60208284031215612c8757612c86612ada565b5b5f612c9484828501612c5e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cc682612c9d565b9050919050565b612cd681612cbc565b82525050565b5f602082019050612cef5f830184612ccd565b92915050565b612cfe81612cbc565b8114612d08575f80fd5b50565b5f81359050612d1981612cf5565b92915050565b5f8060408385031215612d3557612d34612ada565b5b5f612d4285828601612d0b565b9250506020612d5385828601612c5e565b9150509250929050565b5f805f60608486031215612d7457612d73612ada565b5b5f612d8186828701612d0b565b9350506020612d9286828701612d0b565b9250506040612da386828701612c5e565b9150509250925092565b5f819050919050565b612dbf81612dad565b82525050565b5f602082019050612dd85f830184612db6565b92915050565b612de781612c3f565b82525050565b5f602082019050612e005f830184612dde565b92915050565b612e0f81612dad565b8114612e19575f80fd5b50565b5f81359050612e2a81612e06565b92915050565b5f60208284031215612e4557612e44612ada565b5b5f612e5284828501612e1c565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e9982612bd7565b810181811067ffffffffffffffff82111715612eb857612eb7612e63565b5b80604052505050565b5f612eca612ad1565b9050612ed68282612e90565b919050565b5f67ffffffffffffffff821115612ef557612ef4612e63565b5b612efe82612bd7565b9050602081019050919050565b828183375f83830152505050565b5f612f2b612f2684612edb565b612ec1565b905082815260208101848484011115612f4757612f46612e5f565b5b612f52848285612f0b565b509392505050565b5f82601f830112612f6e57612f6d612e5b565b5b8135612f7e848260208601612f19565b91505092915050565b5f60208284031215612f9c57612f9b612ada565b5b5f82013567ffffffffffffffff811115612fb957612fb8612ade565b5b612fc584828501612f5a565b91505092915050565b5f60208284031215612fe357612fe2612ada565b5b5f612ff084828501612d0b565b91505092915050565b61300281612b62565b811461300c575f80fd5b50565b5f8135905061301d81612ff9565b92915050565b5f806040838503121561303957613038612ada565b5b5f61304685828601612d0b565b92505060206130578582860161300f565b9150509250929050565b5f80fd5b5f80fd5b5f8083601f84011261307e5761307d612e5b565b5b8235905067ffffffffffffffff81111561309b5761309a613061565b5b6020830191508360208202830111156130b7576130b6613065565b5b9250929050565b5f805f604084860312156130d5576130d4612ada565b5b5f6130e286828701612d0b565b935050602084013567ffffffffffffffff81111561310357613102612ade565b5b61310f86828701613069565b92509250509250925092565b5f67ffffffffffffffff82111561313557613134612e63565b5b61313e82612bd7565b9050602081019050919050565b5f61315d6131588461311b565b612ec1565b90508281526020810184848401111561317957613178612e5f565b5b613184848285612f0b565b509392505050565b5f82601f8301126131a05761319f612e5b565b5b81356131b084826020860161314b565b91505092915050565b5f805f80608085870312156131d1576131d0612ada565b5b5f6131de87828801612d0b565b94505060206131ef87828801612d0b565b935050604061320087828801612c5e565b925050606085013567ffffffffffffffff81111561322157613220612ade565b5b61322d8782880161318c565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6004811061327757613276613239565b5b50565b5f81905061328782613266565b919050565b5f6132968261327a565b9050919050565b6132a68161328c565b82525050565b5f6020820190506132bf5f83018461329d565b92915050565b5f80604083850312156132db576132da612ada565b5b5f6132e885828601612d0b565b92505060206132f985828601612d0b565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061334757607f821691505b60208210810361335a57613359613303565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613394602083612b9f565b915061339f82613360565b602082019050919050565b5f6020820190508181035f8301526133c181613388565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6133ff82612c3f565b915061340a83612c3f565b9250828201905080821115613422576134216133c8565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c7900005f82015250565b5f61345c601e83612b9f565b915061346782613428565b602082019050919050565b5f6020820190508181035f83015261348981613450565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f6134ea602183612b9f565b91506134f582613490565b604082019050919050565b5f6020820190508181035f830152613517816134de565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f613578603d83612b9f565b91506135838261351e565b604082019050919050565b5f6020820190508181035f8301526135a58161356c565b9050919050565b7f496e76616c6964205374617465210000000000000000000000000000000000005f82015250565b5f6135e0600e83612b9f565b91506135eb826135ac565b602082019050919050565b5f6020820190508181035f83015261360d816135d4565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f61366e602d83612b9f565b915061367982613614565b604082019050919050565b5f6020820190508181035f83015261369b81613662565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026136fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136c3565b61370886836136c3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61374361373e61373984612c3f565b613720565b612c3f565b9050919050565b5f819050919050565b61375c83613729565b6137706137688261374a565b8484546136cf565b825550505050565b5f90565b613784613778565b61378f818484613753565b505050565b5b818110156137b2576137a75f8261377c565b600181019050613795565b5050565b601f8211156137f7576137c8816136a2565b6137d1846136b4565b810160208510156137e0578190505b6137f46137ec856136b4565b830182613794565b50505b505050565b5f82821c905092915050565b5f6138175f19846008026137fc565b1980831691505092915050565b5f61382f8383613808565b9150826002028217905092915050565b61384882612b95565b67ffffffffffffffff81111561386157613860612e63565b5b61386b8254613330565b6138768282856137b6565b5f60209050601f8311600181146138a7575f8415613895578287015190505b61389f8582613824565b865550613906565b601f1984166138b5866136a2565b5f5b828110156138dc578489015182556001820191506020850194506020810190506138b7565b868310156138f957848901516138f5601f891682613808565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f613942601883612b9f565b915061394d8261390e565b602082019050919050565b5f6020820190508181035f83015261396f81613936565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f6139d0602983612b9f565b91506139db82613976565b604082019050919050565b5f6020820190508181035f8301526139fd816139c4565b9050919050565b7f5075626c6963206d696e7420696e6163746976650000000000000000000000005f82015250565b5f613a38601483612b9f565b9150613a4382613a04565b602082019050919050565b5f6020820190508181035f830152613a6581613a2c565b9050919050565b5f613a7682612c3f565b9150613a8183612c3f565b9250828203905081811115613a9957613a986133c8565b5b92915050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e745f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f613af9602283612b9f565b9150613b0482613a9f565b604082019050919050565b5f6020820190508181035f830152613b2681613aed565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573005f82015250565b5f613b61601f83612b9f565b9150613b6c82613b2d565b602082019050919050565b5f6020820190508181035f830152613b8e81613b55565b9050919050565b7f4d617820737570706c79206d696e7465640000000000000000000000000000005f82015250565b5f613bc9601183612b9f565b9150613bd482613b95565b602082019050919050565b5f6020820190508181035f830152613bf681613bbd565b9050919050565b5f8160601b9050919050565b5f613c1382613bfd565b9050919050565b5f613c2482613c09565b9050919050565b613c3c613c3782612cbc565b613c1a565b82525050565b5f613c4d8284613c2b565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e7465655f8201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b5f613cb6602683612b9f565b9150613cc182613c5c565b604082019050919050565b5f6020820190508181035f830152613ce381613caa565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e746564000000005f82015250565b5f613d1e601c83612b9f565b9150613d2982613cea565b602082019050919050565b5f6020820190508181035f830152613d4b81613d12565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f76657273756273635f8201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b5f613dac602a83612b9f565b9150613db782613d52565b604082019050919050565b5f6020820190508181035f830152613dd981613da0565b9050919050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000005f82015250565b5f613e14601c83612b9f565b9150613e1f82613de0565b602082019050919050565b5f6020820190508181035f830152613e4181613e08565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f613e7c600d83612b9f565b9150613e8782613e48565b602082019050919050565b5f6020820190508181035f830152613ea981613e70565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e005f82015250565b5f613ee4601f83612b9f565b9150613eef82613eb0565b602082019050919050565b5f6020820190508181035f830152613f1181613ed8565b9050919050565b5f81905092915050565b5f8154613f2e81613330565b613f388186613f18565b9450600182165f8114613f525760018114613f6757613f99565b60ff1983168652811515820286019350613f99565b613f70856136a2565b5f5b83811015613f9157815481890152600182019150602081019050613f72565b838801955050505b50505092915050565b5f613fac82612b95565b613fb68185613f18565b9350613fc6818560208601612baf565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f6140038285613f22565b915061400f8284613fa2565b915061401a82613fd2565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614084602683612b9f565b915061408f8261402a565b604082019050919050565b5f6020820190508181035f8301526140b181614078565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f614112602c83612b9f565b915061411d826140b8565b604082019050919050565b5f6020820190508181035f83015261413f81614106565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f6141a0602583612b9f565b91506141ab82614146565b604082019050919050565b5f6020820190508181035f8301526141cd81614194565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61422e602483612b9f565b9150614239826141d4565b604082019050919050565b5f6020820190508181035f83015261425b81614222565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614296601983612b9f565b91506142a182614262565b602082019050919050565b5f6020820190508181035f8301526142c38161428a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f614324603283612b9f565b915061432f826142ca565b604082019050919050565b5f6020820190508181035f83015261435181614318565b9050919050565b5f61436282612c3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614394576143936133c8565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143d682612c3f565b91506143e183612c3f565b9250826143f1576143f061439f565b5b828204905092915050565b5f61440682612c3f565b915061441183612c3f565b9250826144215761442061439f565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b61447361446e82612dad565b614459565b82525050565b5f6144848285614462565b6020820191506144948284614462565b6020820191508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6144c8826144a4565b6144d281856144ae565b93506144e2818560208601612baf565b6144eb81612bd7565b840191505092915050565b5f6080820190506145095f830187612ccd565b6145166020830186612ccd565b6145236040830185612dde565b818103606083015261453581846144be565b905095945050505050565b5f8151905061454e81612b0d565b92915050565b5f6020828403121561456957614568612ada565b5b5f61457684828501614540565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f6145b3602083612b9f565b91506145be8261457f565b602082019050919050565b5f6020820190508181035f8301526145e0816145a7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f61461b601c83612b9f565b9150614626826145e7565b602082019050919050565b5f6020820190508181035f8301526146488161460f565b905091905056fea264697066735822122087e2aea7ad28f7c318dbf16ecf1c3748900fb725cec4bf284e093cf86ca6aa3564736f6c63430008140033697066733a2f2f516d637561575756325774323433633964744a58686d4e6f6b7570484651366941614536753752586d486e5774522f
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610246575f3560e01c80638da5cb5b11610139578063c87b56dd116100b6578063f20423141161007a578063f2042314146106c6578063f2fde38b146106e4578063f487404f14610700578063f9c957d81461071e578063fe60d12c1461073a57610246565b8063c87b56dd1461060c578063d371f76b1461063c578063d5abeb011461065a578063e921dad214610678578063e985e9c51461069657610246565b8063ab81e062116100fd578063ab81e0621461056a578063ad8c3f3314610586578063b2422232146105a2578063b88d4fde146105d2578063c051e38a146105ee57610246565b80638da5cb5b146104d857806395d89b41146104f6578063a06cb71914610514578063a22cb46514610530578063a2309ff81461054c57610246565b806335d5959a116101c75780636352211e1161018b5780636352211e146104205780636c0360eb1461045057806370a082311461046e578063715018a61461049e578063893807aa146104a857610246565b806335d5959a146103905780633c186018146103ac57806342842e0e146103ca5780634f297ccc146103e657806355f804b31461040457610246565b80630bb862d11161020e5780630bb862d11461030057806316f9b7071461031c57806323b872dd146103385780632dc7b8551461035457806332f4681c1461037257610246565b806301ffc9a71461024a57806306fdde031461027a578063081812fc14610298578063084520b4146102c8578063095ea7b3146102e4575b5f80fd5b610264600480360381019061025f9190612b37565b610758565b6040516102719190612b7c565b60405180910390f35b610282610839565b60405161028f9190612c1f565b60405180910390f35b6102b260048036038101906102ad9190612c72565b6108c8565b6040516102bf9190612cdc565b60405180910390f35b6102e260048036038101906102dd9190612d1f565b61090a565b005b6102fe60048036038101906102f99190612d1f565b610a2e565b005b61031a60048036038101906103159190612c72565b610b44565b005b61033660048036038101906103319190612c72565b610c41565b005b610352600480360381019061034d9190612d5d565b610cc7565b005b61035c610d27565b6040516103699190612dc5565b60405180910390f35b61037a610d2d565b6040516103879190612ded565b60405180910390f35b6103aa60048036038101906103a59190612e30565b610d33565b005b6103b4610db9565b6040516103c19190612ded565b60405180910390f35b6103e460048036038101906103df9190612d5d565b610ddd565b005b6103ee610dfc565b6040516103fb9190612ded565b60405180910390f35b61041e60048036038101906104199190612f87565b610e02565b005b61043a60048036038101906104359190612c72565b610e91565b6040516104479190612cdc565b60405180910390f35b610458610f15565b6040516104659190612c1f565b60405180910390f35b61048860048036038101906104839190612fce565b610fa1565b6040516104959190612ded565b60405180910390f35b6104a6611055565b005b6104c260048036038101906104bd9190612fce565b6110dc565b6040516104cf9190612b7c565b60405180910390f35b6104e06110f9565b6040516104ed9190612cdc565b60405180910390f35b6104fe611121565b60405161050b9190612c1f565b60405180910390f35b61052e60048036038101906105299190612fce565b6111b1565b005b61054a60048036038101906105459190613023565b6112a4565b005b6105546112ba565b6040516105619190612ded565b60405180910390f35b610584600480360381019061057f91906130be565b6112ca565b005b6105a0600480360381019061059b9190612e30565b6117b3565b005b6105bc60048036038101906105b79190612fce565b611839565b6040516105c99190612b7c565b60405180910390f35b6105ec60048036038101906105e791906131b9565b611856565b005b6105f66118b8565b60405161060391906132ac565b60405180910390f35b61062660048036038101906106219190612c72565b6118ca565b6040516106339190612c1f565b60405180910390f35b610644611974565b6040516106519190612ded565b60405180910390f35b610662611984565b60405161066f9190612ded565b60405180910390f35b61068061198a565b60405161068d9190612dc5565b60405180910390f35b6106b060048036038101906106ab91906132c5565b611990565b6040516106bd9190612b7c565b60405180910390f35b6106ce611a1e565b6040516106db9190612ded565b60405180910390f35b6106fe60048036038101906106f99190612fce565b611a2e565b005b610708611b24565b6040516107159190612cdc565b60405180910390f35b61073860048036038101906107339190612c72565b611b4c565b005b610742611bd2565b60405161074f9190612ded565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610832575061083182611bd8565b5b9050919050565b60605f805461084790613330565b80601f016020809104026020016040519081016040528092919081815260200182805461087390613330565b80156108be5780601f10610895576101008083540402835291602001916108be565b820191905f5260205f20905b8154815290600101906020018083116108a157829003601f168201915b5050505050905090565b5f6108d282611c41565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610912611c8c565b73ffffffffffffffffffffffffffffffffffffffff166109306110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097d906133aa565b60405180910390fd5b600b54600c548261099791906133f5565b11156109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90613472565b60405180910390fd5b5f5b81811015610a11575f6109ed6012611c93565b90506109f96012611c9f565b610a038482611cb3565b8180600101925050506109da565b5080600c5f828254610a2391906133f5565b925050819055505050565b5f610a3882610e91565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613500565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac7611c8c565b73ffffffffffffffffffffffffffffffffffffffff161480610af65750610af581610af0611c8c565b611990565b5b610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061358e565b60405180910390fd5b610b3f8383611cd0565b505050565b610b4c611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610b6a6110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906133aa565b60405180910390fd5b60058110610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa906135f6565b60405180910390fd5b806003811115610c1657610c15613239565b5b60155f6101000a81548160ff02191690836003811115610c3957610c38613239565b5b021790555050565b610c49611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610c676110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb4906133aa565b60405180910390fd5b80600b8190555050565b610cd8610cd2611c8c565b82611d86565b610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90613684565b60405180910390fd5b610d22838383611e62565b505050565b600e5481565b600d5481565b610d3b611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610d596110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906133aa565b60405180910390fd5b80600e8190555050565b5f610dc46014611c93565b610dce6013611c93565b610dd891906133f5565b905090565b610df783838360405180602001604052805f815250611856565b505050565b600c5481565b610e0a611c8c565b73ffffffffffffffffffffffffffffffffffffffff16610e286110f9565b73ffffffffffffffffffffffffffffffffffffffff1614610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e75906133aa565b60405180910390fd5b8060099081610e8d919061383f565b5050565b5f80610e9c83612160565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390613958565b60405180910390fd5b80915050919050565b60098054610f2290613330565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4e90613330565b8015610f995780601f10610f7057610100808354040283529160200191610f99565b820191905f5260205f20905b815481529060010190602001808311610f7c57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611007906139e6565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61105d611c8c565b73ffffffffffffffffffffffffffffffffffffffff1661107b6110f9565b73ffffffffffffffffffffffffffffffffffffffff16146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906133aa565b60405180910390fd5b6110da5f612199565b565b6011602052805f5260405f205f915054906101000a900460ff1681565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461113090613330565b80601f016020809104026020016040519081016040528092919081815260200182805461115c90613330565b80156111a75780601f1061117e576101008083540402835291602001916111a7565b820191905f5260205f20905b81548152906001019060200180831161118a57829003601f168201915b5050505050905090565b6003808111156111c4576111c3613239565b5b60155f9054906101000a900460ff1660038111156111e5576111e4613239565b5b14611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c90613a4e565b60405180910390fd5b600b54600a546112359190613a6c565b61123f6012611c93565b1061127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690613b0f565b60405180910390fd5b5f61128a6012611c93565b90506112966012611c9f565b6112a08282611cb3565b5050565b6112b66112af611c8c565b83836122a3565b5050565b5f6112c56012611c93565b905090565b600160038111156112de576112dd613239565b5b60155f9054906101000a900460ff1660038111156112ff576112fe613239565b5b148061133d57506002600381111561131a57611319613239565b5b60155f9054906101000a900460ff16600381111561133b5761133a613239565b5b145b61137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390613b77565b60405180910390fd5b600a546113896012611c93565b106113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613bdf565b60405180910390fd5b5f836040516020016113db9190613c42565b6040516020818303038152906040528051906020012090505f6001600381111561140857611407613239565b5b60155f9054906101000a900460ff16600381111561142957611428613239565b5b0361156d57600e5490505f151560105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b990613ccc565b60405180910390fd5b600d546114cd611a1e565b1061150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490613d34565b60405180910390fd5b6115176013611c9f565b600160105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6002600381111561158157611580613239565b5b60155f9054906101000a900460ff1660038111156115a2576115a1613239565b5b0361170057600f5490505f151560115f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290613dc2565b60405180910390fd5b600d54600b54600a5461164e9190613a6c565b6116589190613a6c565b611660611974565b106116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790613e2a565b60405180910390fd5b6116aa6014611c9f565b600160115f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b61174b8484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050828461240a565b61178a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178190613e92565b60405180910390fd5b5f6117956012611c93565b90506117a16012611c9f565b6117ab8682611cb3565b505050505050565b6117bb611c8c565b73ffffffffffffffffffffffffffffffffffffffff166117d96110f9565b73ffffffffffffffffffffffffffffffffffffffff161461182f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611826906133aa565b60405180910390fd5b80600f8190555050565b6010602052805f5260405f205f915054906101000a900460ff1681565b611867611861611c8c565b83611d86565b6118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613684565b60405180910390fd5b6118b284848484612420565b50505050565b60155f9054906101000a900460ff1681565b60606118d66012611c93565b821115611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90613efa565b60405180910390fd5b5f6009805461192690613330565b9050116119415760405180602001604052805f81525061196d565b600961194c8361247c565b60405160200161195d929190613ff8565b6040516020818303038152906040525b9050919050565b5f61197f6014611c93565b905090565b600a5481565b600f5481565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f611a296013611c93565b905090565b611a36611c8c565b73ffffffffffffffffffffffffffffffffffffffff16611a546110f9565b73ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa1906133aa565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f9061409a565b60405180910390fd5b611b2181612199565b50565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b54611c8c565b73ffffffffffffffffffffffffffffffffffffffff16611b726110f9565b73ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf906133aa565b60405180910390fd5b80600d8190555050565b600b5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c4a816125d5565b611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090613958565b60405180910390fd5b50565b5f33905090565b5f815f01549050919050565b6001815f015f828254019250508190555050565b611ccc828260405180602001604052805f815250612615565b5050565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4083610e91565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611d90826125d5565b611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc690614128565b60405180910390fd5b5f611dd983610e91565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e1b5750611e1a8185611990565b5b80611e5957508373ffffffffffffffffffffffffffffffffffffffff16611e41846108c8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8282610e91565b73ffffffffffffffffffffffffffffffffffffffff1614611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf906141b6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90614244565b60405180910390fd5b611f53838383600161266f565b8273ffffffffffffffffffffffffffffffffffffffff16611f7382610e91565b73ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc0906141b6565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120499190613a6c565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461209d91906133f5565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215b8383836001612675565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612308906142ac565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123fd9190612b7c565b60405180910390a3505050565b5f82612416858461267b565b1490509392505050565b61242b848484611e62565b6124378484848461272b565b612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d9061433a565b60405180910390fd5b50505050565b60605f82036124c2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d0565b5f8290505f5b5f82146124f15780806124da90614358565b915050600a826124ea91906143cc565b91506124c8565b5f8167ffffffffffffffff81111561250c5761250b612e63565b5b6040519080825280601f01601f19166020018201604052801561253e5781602001600182028036833780820191505090505b5090505b5f85146125c9576001826125569190613a6c565b9150600a8561256591906143fc565b603061257191906133f5565b60f81b8183815181106125875761258661442c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125c291906143cc565b9450612542565b8093505050505b919050565b5f8073ffffffffffffffffffffffffffffffffffffffff166125f683612160565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61261f83836128ad565b61262b5f84848461272b565b61266a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126619061433a565b60405180910390fd5b505050565b50505050565b50505050565b5f808290505f5b8451811015612720575f85828151811061269f5761269e61442c565b5b602002602001015190508083116126e05782816040516020016126c3929190614479565b60405160208183030381529060405280519060200120925061270c565b80836040516020016126f3929190614479565b6040516020818303038152906040528051906020012092505b50808061271890614358565b915050612682565b508091505092915050565b5f61274b8473ffffffffffffffffffffffffffffffffffffffff16612ac0565b156128a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612774611c8c565b8786866040518563ffffffff1660e01b815260040161279694939291906144f6565b6020604051808303815f875af19250505080156127d157506040513d601f19601f820116820180604052508101906127ce9190614554565b60015b612850573d805f81146127ff576040519150601f19603f3d011682016040523d82523d5f602084013e612804565b606091505b505f815103612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f9061433a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128a5565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361291b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612912906145c9565b60405180910390fd5b612924816125d5565b15612964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295b90614631565b60405180910390fd5b6129715f8383600161266f565b61297a816125d5565b156129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b190614631565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612abc5f83836001612675565b5050565b5f80823b90505f8111915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b1681612ae2565b8114612b20575f80fd5b50565b5f81359050612b3181612b0d565b92915050565b5f60208284031215612b4c57612b4b612ada565b5b5f612b5984828501612b23565b91505092915050565b5f8115159050919050565b612b7681612b62565b82525050565b5f602082019050612b8f5f830184612b6d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612bcc578082015181840152602081019050612bb1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612bf182612b95565b612bfb8185612b9f565b9350612c0b818560208601612baf565b612c1481612bd7565b840191505092915050565b5f6020820190508181035f830152612c378184612be7565b905092915050565b5f819050919050565b612c5181612c3f565b8114612c5b575f80fd5b50565b5f81359050612c6c81612c48565b92915050565b5f60208284031215612c8757612c86612ada565b5b5f612c9484828501612c5e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cc682612c9d565b9050919050565b612cd681612cbc565b82525050565b5f602082019050612cef5f830184612ccd565b92915050565b612cfe81612cbc565b8114612d08575f80fd5b50565b5f81359050612d1981612cf5565b92915050565b5f8060408385031215612d3557612d34612ada565b5b5f612d4285828601612d0b565b9250506020612d5385828601612c5e565b9150509250929050565b5f805f60608486031215612d7457612d73612ada565b5b5f612d8186828701612d0b565b9350506020612d9286828701612d0b565b9250506040612da386828701612c5e565b9150509250925092565b5f819050919050565b612dbf81612dad565b82525050565b5f602082019050612dd85f830184612db6565b92915050565b612de781612c3f565b82525050565b5f602082019050612e005f830184612dde565b92915050565b612e0f81612dad565b8114612e19575f80fd5b50565b5f81359050612e2a81612e06565b92915050565b5f60208284031215612e4557612e44612ada565b5b5f612e5284828501612e1c565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e9982612bd7565b810181811067ffffffffffffffff82111715612eb857612eb7612e63565b5b80604052505050565b5f612eca612ad1565b9050612ed68282612e90565b919050565b5f67ffffffffffffffff821115612ef557612ef4612e63565b5b612efe82612bd7565b9050602081019050919050565b828183375f83830152505050565b5f612f2b612f2684612edb565b612ec1565b905082815260208101848484011115612f4757612f46612e5f565b5b612f52848285612f0b565b509392505050565b5f82601f830112612f6e57612f6d612e5b565b5b8135612f7e848260208601612f19565b91505092915050565b5f60208284031215612f9c57612f9b612ada565b5b5f82013567ffffffffffffffff811115612fb957612fb8612ade565b5b612fc584828501612f5a565b91505092915050565b5f60208284031215612fe357612fe2612ada565b5b5f612ff084828501612d0b565b91505092915050565b61300281612b62565b811461300c575f80fd5b50565b5f8135905061301d81612ff9565b92915050565b5f806040838503121561303957613038612ada565b5b5f61304685828601612d0b565b92505060206130578582860161300f565b9150509250929050565b5f80fd5b5f80fd5b5f8083601f84011261307e5761307d612e5b565b5b8235905067ffffffffffffffff81111561309b5761309a613061565b5b6020830191508360208202830111156130b7576130b6613065565b5b9250929050565b5f805f604084860312156130d5576130d4612ada565b5b5f6130e286828701612d0b565b935050602084013567ffffffffffffffff81111561310357613102612ade565b5b61310f86828701613069565b92509250509250925092565b5f67ffffffffffffffff82111561313557613134612e63565b5b61313e82612bd7565b9050602081019050919050565b5f61315d6131588461311b565b612ec1565b90508281526020810184848401111561317957613178612e5f565b5b613184848285612f0b565b509392505050565b5f82601f8301126131a05761319f612e5b565b5b81356131b084826020860161314b565b91505092915050565b5f805f80608085870312156131d1576131d0612ada565b5b5f6131de87828801612d0b565b94505060206131ef87828801612d0b565b935050604061320087828801612c5e565b925050606085013567ffffffffffffffff81111561322157613220612ade565b5b61322d8782880161318c565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6004811061327757613276613239565b5b50565b5f81905061328782613266565b919050565b5f6132968261327a565b9050919050565b6132a68161328c565b82525050565b5f6020820190506132bf5f83018461329d565b92915050565b5f80604083850312156132db576132da612ada565b5b5f6132e885828601612d0b565b92505060206132f985828601612d0b565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061334757607f821691505b60208210810361335a57613359613303565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613394602083612b9f565b915061339f82613360565b602082019050919050565b5f6020820190508181035f8301526133c181613388565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6133ff82612c3f565b915061340a83612c3f565b9250828201905080821115613422576134216133c8565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c7900005f82015250565b5f61345c601e83612b9f565b915061346782613428565b602082019050919050565b5f6020820190508181035f83015261348981613450565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f6134ea602183612b9f565b91506134f582613490565b604082019050919050565b5f6020820190508181035f830152613517816134de565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f613578603d83612b9f565b91506135838261351e565b604082019050919050565b5f6020820190508181035f8301526135a58161356c565b9050919050565b7f496e76616c6964205374617465210000000000000000000000000000000000005f82015250565b5f6135e0600e83612b9f565b91506135eb826135ac565b602082019050919050565b5f6020820190508181035f83015261360d816135d4565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f61366e602d83612b9f565b915061367982613614565b604082019050919050565b5f6020820190508181035f83015261369b81613662565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026136fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136c3565b61370886836136c3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61374361373e61373984612c3f565b613720565b612c3f565b9050919050565b5f819050919050565b61375c83613729565b6137706137688261374a565b8484546136cf565b825550505050565b5f90565b613784613778565b61378f818484613753565b505050565b5b818110156137b2576137a75f8261377c565b600181019050613795565b5050565b601f8211156137f7576137c8816136a2565b6137d1846136b4565b810160208510156137e0578190505b6137f46137ec856136b4565b830182613794565b50505b505050565b5f82821c905092915050565b5f6138175f19846008026137fc565b1980831691505092915050565b5f61382f8383613808565b9150826002028217905092915050565b61384882612b95565b67ffffffffffffffff81111561386157613860612e63565b5b61386b8254613330565b6138768282856137b6565b5f60209050601f8311600181146138a7575f8415613895578287015190505b61389f8582613824565b865550613906565b601f1984166138b5866136a2565b5f5b828110156138dc578489015182556001820191506020850194506020810190506138b7565b868310156138f957848901516138f5601f891682613808565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f613942601883612b9f565b915061394d8261390e565b602082019050919050565b5f6020820190508181035f83015261396f81613936565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f6139d0602983612b9f565b91506139db82613976565b604082019050919050565b5f6020820190508181035f8301526139fd816139c4565b9050919050565b7f5075626c6963206d696e7420696e6163746976650000000000000000000000005f82015250565b5f613a38601483612b9f565b9150613a4382613a04565b602082019050919050565b5f6020820190508181035f830152613a6581613a2c565b9050919050565b5f613a7682612c3f565b9150613a8183612c3f565b9250828203905081811115613a9957613a986133c8565b5b92915050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e745f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f613af9602283612b9f565b9150613b0482613a9f565b604082019050919050565b5f6020820190508181035f830152613b2681613aed565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573005f82015250565b5f613b61601f83612b9f565b9150613b6c82613b2d565b602082019050919050565b5f6020820190508181035f830152613b8e81613b55565b9050919050565b7f4d617820737570706c79206d696e7465640000000000000000000000000000005f82015250565b5f613bc9601183612b9f565b9150613bd482613b95565b602082019050919050565b5f6020820190508181035f830152613bf681613bbd565b9050919050565b5f8160601b9050919050565b5f613c1382613bfd565b9050919050565b5f613c2482613c09565b9050919050565b613c3c613c3782612cbc565b613c1a565b82525050565b5f613c4d8284613c2b565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e7465655f8201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b5f613cb6602683612b9f565b9150613cc182613c5c565b604082019050919050565b5f6020820190508181035f830152613ce381613caa565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e746564000000005f82015250565b5f613d1e601c83612b9f565b9150613d2982613cea565b602082019050919050565b5f6020820190508181035f830152613d4b81613d12565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f76657273756273635f8201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b5f613dac602a83612b9f565b9150613db782613d52565b604082019050919050565b5f6020820190508181035f830152613dd981613da0565b9050919050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000005f82015250565b5f613e14601c83612b9f565b9150613e1f82613de0565b602082019050919050565b5f6020820190508181035f830152613e4181613e08565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f613e7c600d83612b9f565b9150613e8782613e48565b602082019050919050565b5f6020820190508181035f830152613ea981613e70565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e005f82015250565b5f613ee4601f83612b9f565b9150613eef82613eb0565b602082019050919050565b5f6020820190508181035f830152613f1181613ed8565b9050919050565b5f81905092915050565b5f8154613f2e81613330565b613f388186613f18565b9450600182165f8114613f525760018114613f6757613f99565b60ff1983168652811515820286019350613f99565b613f70856136a2565b5f5b83811015613f9157815481890152600182019150602081019050613f72565b838801955050505b50505092915050565b5f613fac82612b95565b613fb68185613f18565b9350613fc6818560208601612baf565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f6140038285613f22565b915061400f8284613fa2565b915061401a82613fd2565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614084602683612b9f565b915061408f8261402a565b604082019050919050565b5f6020820190508181035f8301526140b181614078565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f614112602c83612b9f565b915061411d826140b8565b604082019050919050565b5f6020820190508181035f83015261413f81614106565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f6141a0602583612b9f565b91506141ab82614146565b604082019050919050565b5f6020820190508181035f8301526141cd81614194565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61422e602483612b9f565b9150614239826141d4565b604082019050919050565b5f6020820190508181035f83015261425b81614222565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614296601983612b9f565b91506142a182614262565b602082019050919050565b5f6020820190508181035f8301526142c38161428a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f614324603283612b9f565b915061432f826142ca565b604082019050919050565b5f6020820190508181035f83015261435181614318565b9050919050565b5f61436282612c3f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614394576143936133c8565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143d682612c3f565b91506143e183612c3f565b9250826143f1576143f061439f565b5b828204905092915050565b5f61440682612c3f565b915061441183612c3f565b9250826144215761442061439f565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b61447361446e82612dad565b614459565b82525050565b5f6144848285614462565b6020820191506144948284614462565b6020820191508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6144c8826144a4565b6144d281856144ae565b93506144e2818560208601612baf565b6144eb81612bd7565b840191505092915050565b5f6080820190506145095f830187612ccd565b6145166020830186612ccd565b6145236040830185612dde565b818103606083015261453581846144be565b905095945050505050565b5f8151905061454e81612b0d565b92915050565b5f6020828403121561456957614568612ada565b5b5f61457684828501614540565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f6145b3602083612b9f565b91506145be8261457f565b602082019050919050565b5f6020820190508181035f8301526145e0816145a7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f61461b601c83612b9f565b9150614626826145e7565b602082019050919050565b5f6020820190508181035f8301526146488161460f565b905091905056fea264697066735822122087e2aea7ad28f7c318dbf16ecf1c3748900fb725cec4bf284e093cf86ca6aa3564736f6c63430008140033
Deployed Bytecode Sourcemap
42356:9146:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27072:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28000:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29512:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48363:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29030:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50902:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51399:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30212:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42817:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42719:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49109:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50491:304;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30584:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42635:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44354:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27710:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42449:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27441:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21918:103;;;:::i;:::-;;43258:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21092:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28169:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47688:533;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29755:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49497:227;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45072:2557;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49305:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43200:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30806:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43848:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44574:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50158:272;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42525:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42980:105;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29981:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49807:264;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22176:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21261:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51190:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42598:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27072:305;27174:4;27226:25;27211:40;;;:11;:40;;;;:105;;;;27283:33;27268:48;;;:11;:48;;;;27211:105;:158;;;;27333:36;27357:11;27333:23;:36::i;:::-;27211:158;27191:178;;27072:305;;;:::o;28000:100::-;28054:13;28087:5;28080:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28000:100;:::o;29512:171::-;29588:7;29608:23;29623:7;29608:14;:23::i;:::-;29651:15;:24;29667:7;29651:24;;;;;;;;;;;;;;;;;;;;;29644:31;;29512:171;;;:::o;48363:631::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48519:8:::1;;48501:14;;48492:6;:23;;;;:::i;:::-;:35;;48484:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48588:6;48584:368;48600:6;48596:1;:10;48584:368;;;48679:15;48697:25;:15;:23;:25::i;:::-;48679:43;;48737:27;:15;:25;:27::i;:::-;48813:22;48823:2;48827:7;48813:9;:22::i;:::-;48922:3;;;;;;;48609:343;48584:368;;;;48980:6;48962:14;;:24;;;;;;;:::i;:::-;;;;;;;;48363:631:::0;;:::o;29030:416::-;29111:13;29127:23;29142:7;29127:14;:23::i;:::-;29111:39;;29175:5;29169:11;;:2;:11;;;29161:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29269:5;29253:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29278:37;29295:5;29302:12;:10;:12::i;:::-;29278:16;:37::i;:::-;29253:62;29231:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;29417:21;29426:2;29430:7;29417:8;:21::i;:::-;29100:346;29030:416;;:::o;50902:175::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50995:1:::1;50982:10;:14;50974:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;51058:10;51048:21;;;;;;;;:::i;:::-;;51036:9;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50902:175:::0;:::o;51399:96::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51481:5:::1;51470:8;:16;;;;51399:96:::0;:::o;30212:301::-;30373:41;30392:12;:10;:12::i;:::-;30406:7;30373:18;:41::i;:::-;30365:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;30477:28;30487:4;30493:2;30497:7;30477:9;:28::i;:::-;30212:301;;;:::o;42817:101::-;;;;:::o;42719:32::-;;;;:::o;49109:123::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49213:11:::1;49193:17;:31;;;;49109:123:::0;:::o;50491:304::-;50543:7;50739:47;:37;:45;:47::i;:::-;50693:43;:33;:41;:43::i;:::-;:93;;;;:::i;:::-;50686:100;;50491:304;:::o;30584:151::-;30688:39;30705:4;30711:2;30715:7;30688:39;;;;;;;;;;;;:16;:39::i;:::-;30584:151;;;:::o;42635:29::-;;;;:::o;44354:104::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44440:10:::1;44430:7;:20;;;;;;:::i;:::-;;44354:104:::0;:::o;27710:223::-;27782:7;27802:13;27818:17;27827:7;27818:8;:17::i;:::-;27802:33;;27871:1;27854:19;;:5;:19;;;27846:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27920:5;27913:12;;;27710:223;;;:::o;42449:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27441:207::-;27513:7;27558:1;27541:19;;:5;:19;;;27533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27624:9;:16;27634:5;27624:16;;;;;;;;;;;;;;;;27617:23;;27441:207;;;:::o;21918:103::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21983:30:::1;22010:1;21983:18;:30::i;:::-;21918:103::o:0;43258:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;21092:87::-;21138:7;21165:6;;;;;;;;;;;21158:13;;21092:87;:::o;28169:104::-;28225:13;28258:7;28251:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28169:104;:::o;47688:533::-;47769:16;47756:29;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;47748:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47951:8;;47939:9;;:20;;;;:::i;:::-;47911:25;:15;:23;:25::i;:::-;:48;47903:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48063:15;48081:25;:15;:23;:25::i;:::-;48063:43;;48117:27;:15;:25;:27::i;:::-;48185:28;48195:8;48205:7;48185:9;:28::i;:::-;47735:486;47688:533;:::o;29755:155::-;29850:52;29869:12;:10;:12::i;:::-;29883:8;29893;29850:18;:52::i;:::-;29755:155;;:::o;49497:227::-;49540:7;49690:25;:15;:23;:25::i;:::-;49683:32;;49497:227;:::o;45072:2557::-;45221:20;45208:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;:74;;;;45258:24;45245:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;45208:74;45200:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45367:9;;45339:25;:15;:23;:25::i;:::-;:37;45331:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45460:12;45502:8;45485:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;45475:37;;;;;;45460:52;;45581:12;45704:20;45691:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;45687:720;;45793:17;;45786:24;;45935:5;45903:37;;:18;:28;45922:8;45903:28;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;45895:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;46126:10;;46091:32;:30;:32::i;:::-;:45;46083:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46253:45;:33;:43;:45::i;:::-;46391:4;46360:18;:28;46379:8;46360:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;45687:720;46520:24;46507:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;46503:794;;46613:21;;46606:28;;46767:5;46731:41;;:22;:32;46754:8;46731:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;46723:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;47074:10;;47063:8;;47051:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;47012:36;:34;:36::i;:::-;:72;47004:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47135:49;:37;:47;:49::i;:::-;47281:4;47246:22;:32;47269:8;47246:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;46503:794;47352:37;47371:5;;47352:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47378:4;47384;47352:18;:37::i;:::-;47344:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47471:15;47489:25;:15;:23;:25::i;:::-;47471:43;;47525:27;:15;:25;:27::i;:::-;47593:28;47603:8;47613:7;47593:9;:28::i;:::-;45148:2481;;;45072:2557;;;:::o;49305:127::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49413:11:::1;49389:21;:35;;;;49305:127:::0;:::o;43200:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;30806:279::-;30937:41;30956:12;:10;:12::i;:::-;30970:7;30937:18;:41::i;:::-;30929:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;31039:38;31053:4;31059:2;31063:7;31072:4;31039:13;:38::i;:::-;30806:279;;;;:::o;43848:45::-;;;;;;;;;;;;;:::o;44574:298::-;44647:13;44692:25;:15;:23;:25::i;:::-;44681:7;:36;;44673:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44797:1;44779:7;44773:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44815:7;44824:25;44841:7;44824:16;:25::i;:::-;44801:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44773:91;44766:98;;44574:298;;;:::o;50158:272::-;50224:7;50374:47;:37;:45;:47::i;:::-;50367:54;;50158:272;:::o;42525:31::-;;;;:::o;42980:105::-;;;;:::o;29981:164::-;30078:4;30102:18;:25;30121:5;30102:25;;;;;;;;;;;;;;;:35;30128:8;30102:35;;;;;;;;;;;;;;;;;;;;;;;;;30095:42;;29981:164;;;;:::o;49807:264::-;49869:7;50019:43;:33;:41;:43::i;:::-;50012:50;;49807:264;:::o;22176:201::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22285:1:::1;22265:22;;:8;:22;;::::0;22257:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22341:28;22360:8;22341:18;:28::i;:::-;22176:201:::0;:::o;21261:93::-;21310:7;21337:9;;;;;;;;;;;21330:16;;21261:93;:::o;51190:100::-;21498:12;:10;:12::i;:::-;21487:23;;:7;:5;:7::i;:::-;:23;;;21479:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51276:5:::1;51263:10;:18;;;;51190:100:::0;:::o;42598:29::-;;;;:::o;25681:157::-;25766:4;25805:25;25790:40;;;:11;:40;;;;25783:47;;25681:157;;;:::o;38506:135::-;38588:16;38596:7;38588;:16::i;:::-;38580:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38506:135;:::o;19736:98::-;19789:7;19816:10;19809:17;;19736:98;:::o;941:114::-;1006:7;1033;:14;;;1026:21;;941:114;;;:::o;1063:127::-;1170:1;1152:7;:14;;;:19;;;;;;;;;;;1063:127;:::o;33765:110::-;33841:26;33851:2;33855:7;33841:26;;;;;;;;;;;;:9;:26::i;:::-;33765:110;;:::o;37819:174::-;37921:2;37894:15;:24;37910:7;37894:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37977:7;37973:2;37939:46;;37948:23;37963:7;37948:14;:23::i;:::-;37939:46;;;;;;;;;;;;37819:174;;:::o;33075:348::-;33168:4;33193:16;33201:7;33193;:16::i;:::-;33185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33269:13;33285:23;33300:7;33285:14;:23::i;:::-;33269:39;;33338:5;33327:16;;:7;:16;;;:52;;;;33347:32;33364:5;33371:7;33347:16;:32::i;:::-;33327:52;:87;;;;33407:7;33383:31;;:20;33395:7;33383:11;:20::i;:::-;:31;;;33327:87;33319:96;;;33075:348;;;;:::o;36915:785::-;37040:4;37013:31;;:23;37028:7;37013:14;:23::i;:::-;:31;;;37005:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37119:1;37105:16;;:2;:16;;;37097:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37175:42;37196:4;37202:2;37206:7;37215:1;37175:20;:42::i;:::-;37347:4;37320:31;;:23;37335:7;37320:14;:23::i;:::-;:31;;;37312:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37465:15;:24;37481:7;37465:24;;;;;;;;;;;;37458:31;;;;;;;;;;;37521:1;37502:9;:15;37512:4;37502:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37550:1;37533:9;:13;37543:2;37533:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37591:2;37572:7;:16;37580:7;37572:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37630:7;37626:2;37611:27;;37620:4;37611:27;;;;;;;;;;;;37651:41;37671:4;37677:2;37681:7;37690:1;37651:19;:41::i;:::-;36915:785;;;:::o;32350:117::-;32416:7;32443;:16;32451:7;32443:16;;;;;;;;;;;;;;;;;;;;;32436:23;;32350:117;;;:::o;22537:275::-;22611:17;22631:6;;;;;;;;;;;22611:26;;22660:9;22648;;:21;;;;;;;;;;;;;;;;;;22689:8;22680:6;;:17;;;;;;;;;;;;;;;;;;22732:15;22708:21;:39;;;;22795:8;22763:41;;22784:9;22763:41;;;;;;;;;;;;22600:212;22537:275;:::o;38136:281::-;38257:8;38248:17;;:5;:17;;;38240:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38344:8;38306:18;:25;38325:5;38306:25;;;;;;;;;;;;;;;:35;38332:8;38306:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38390:8;38368:41;;38383:5;38368:41;;;38400:8;38368:41;;;;;;:::i;:::-;;;;;;;;38136:281;;;:::o;2369:190::-;2494:4;2547;2518:25;2531:5;2538:4;2518:12;:25::i;:::-;:33;2511:40;;2369:190;;;;;:::o;31966:270::-;32079:28;32089:4;32095:2;32099:7;32079:9;:28::i;:::-;32126:47;32149:4;32155:2;32159:7;32168:4;32126:22;:47::i;:::-;32118:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31966:270;;;;:::o;23128:723::-;23184:13;23414:1;23405:5;:10;23401:53;;23432:10;;;;;;;;;;;;;;;;;;;;;23401:53;23464:12;23479:5;23464:20;;23495:14;23520:78;23535:1;23527:4;:9;23520:78;;23553:8;;;;;:::i;:::-;;;;23584:2;23576:10;;;;;:::i;:::-;;;23520:78;;;23608:19;23640:6;23630:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23608:39;;23658:154;23674:1;23665:5;:10;23658:154;;23702:1;23692:11;;;;;:::i;:::-;;;23769:2;23761:5;:10;;;;:::i;:::-;23748:2;:24;;;;:::i;:::-;23735:39;;23718:6;23725;23718:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23798:2;23789:11;;;;;:::i;:::-;;;23658:154;;;23836:6;23822:21;;;;;23128:723;;;;:::o;32780:128::-;32845:4;32898:1;32869:31;;:17;32878:7;32869:8;:17::i;:::-;:31;;;;32862:38;;32780:128;;;:::o;34102:285::-;34197:18;34203:2;34207:7;34197:5;:18::i;:::-;34248:53;34279:1;34283:2;34287:7;34296:4;34248:22;:53::i;:::-;34226:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34102:285;;;:::o;40790:116::-;;;;;:::o;41628:115::-;;;;;:::o;2921:701::-;3004:7;3024:20;3047:4;3024:27;;3067:9;3062:523;3086:5;:12;3082:1;:16;3062:523;;;3120:20;3143:5;3149:1;3143:8;;;;;;;;:::i;:::-;;;;;;;;3120:31;;3186:12;3170;:28;3166:408;;3340:12;3354;3323:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3313:55;;;;;;3298:70;;3166:408;;;3530:12;3544;3513:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3503:55;;;;;;3488:70;;3166:408;3105:480;3100:3;;;;;:::i;:::-;;;;3062:523;;;;3602:12;3595:19;;;2921:701;;;;:::o;39205:853::-;39359:4;39380:15;:2;:13;;;:15::i;:::-;39376:675;;;39432:2;39416:36;;;39453:12;:10;:12::i;:::-;39467:4;39473:7;39482:4;39416:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39412:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39674:1;39657:6;:13;:18;39653:328;;39700:60;;;;;;;;;;:::i;:::-;;;;;;;;39653:328;39931:6;39925:13;39916:6;39912:2;39908:15;39901:38;39412:584;39548:41;;;39538:51;;;:6;:51;;;;39531:58;;;;;39376:675;40035:4;40028:11;;39205:853;;;;;;;:::o;34723:942::-;34817:1;34803:16;;:2;:16;;;34795:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34876:16;34884:7;34876;:16::i;:::-;34875:17;34867:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34938:48;34967:1;34971:2;34975:7;34984:1;34938:20;:48::i;:::-;35085:16;35093:7;35085;:16::i;:::-;35084:17;35076:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35500:1;35483:9;:13;35493:2;35483:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;35544:2;35525:7;:16;35533:7;35525:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35589:7;35585:2;35564:33;;35581:1;35564:33;;;;;;;;;;;;35610:47;35638:1;35642:2;35646:7;35655:1;35610:19;:47::i;:::-;34723:942;;:::o;11726:387::-;11786:4;11994:12;12061:7;12049:20;12041:28;;12104:1;12097:4;:8;12090:15;;;11726:387;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:77::-;5552:7;5581:5;5570:16;;5515:77;;;:::o;5598:118::-;5685:24;5703:5;5685:24;:::i;:::-;5680:3;5673:37;5598:118;;:::o;5722:222::-;5815:4;5853:2;5842:9;5838:18;5830:26;;5866:71;5934:1;5923:9;5919:17;5910:6;5866:71;:::i;:::-;5722:222;;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:122::-;6375:24;6393:5;6375:24;:::i;:::-;6368:5;6365:35;6355:63;;6414:1;6411;6404:12;6355:63;6302:122;:::o;6430:139::-;6476:5;6514:6;6501:20;6492:29;;6530:33;6557:5;6530:33;:::i;:::-;6430:139;;;;:::o;6575:329::-;6634:6;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6575:329;;;;:::o;6910:117::-;7019:1;7016;7009:12;7033:117;7142:1;7139;7132:12;7156:180;7204:77;7201:1;7194:88;7301:4;7298:1;7291:15;7325:4;7322:1;7315:15;7342:281;7425:27;7447:4;7425:27;:::i;:::-;7417:6;7413:40;7555:6;7543:10;7540:22;7519:18;7507:10;7504:34;7501:62;7498:88;;;7566:18;;:::i;:::-;7498:88;7606:10;7602:2;7595:22;7385:238;7342:281;;:::o;7629:129::-;7663:6;7690:20;;:::i;:::-;7680:30;;7719:33;7747:4;7739:6;7719:33;:::i;:::-;7629:129;;;:::o;7764:308::-;7826:4;7916:18;7908:6;7905:30;7902:56;;;7938:18;;:::i;:::-;7902:56;7976:29;7998:6;7976:29;:::i;:::-;7968:37;;8060:4;8054;8050:15;8042:23;;7764:308;;;:::o;8078:146::-;8175:6;8170:3;8165;8152:30;8216:1;8207:6;8202:3;8198:16;8191:27;8078:146;;;:::o;8230:425::-;8308:5;8333:66;8349:49;8391:6;8349:49;:::i;:::-;8333:66;:::i;:::-;8324:75;;8422:6;8415:5;8408:21;8460:4;8453:5;8449:16;8498:3;8489:6;8484:3;8480:16;8477:25;8474:112;;;8505:79;;:::i;:::-;8474:112;8595:54;8642:6;8637:3;8632;8595:54;:::i;:::-;8314:341;8230:425;;;;;:::o;8675:340::-;8731:5;8780:3;8773:4;8765:6;8761:17;8757:27;8747:122;;8788:79;;:::i;:::-;8747:122;8905:6;8892:20;8930:79;9005:3;8997:6;8990:4;8982:6;8978:17;8930:79;:::i;:::-;8921:88;;8737:278;8675:340;;;;:::o;9021:509::-;9090:6;9139:2;9127:9;9118:7;9114:23;9110:32;9107:119;;;9145:79;;:::i;:::-;9107:119;9293:1;9282:9;9278:17;9265:31;9323:18;9315:6;9312:30;9309:117;;;9345:79;;:::i;:::-;9309:117;9450:63;9505:7;9496:6;9485:9;9481:22;9450:63;:::i;:::-;9440:73;;9236:287;9021:509;;;;:::o;9536:329::-;9595:6;9644:2;9632:9;9623:7;9619:23;9615:32;9612:119;;;9650:79;;:::i;:::-;9612:119;9770:1;9795:53;9840:7;9831:6;9820:9;9816:22;9795:53;:::i;:::-;9785:63;;9741:117;9536:329;;;;:::o;9871:116::-;9941:21;9956:5;9941:21;:::i;:::-;9934:5;9931:32;9921:60;;9977:1;9974;9967:12;9921:60;9871:116;:::o;9993:133::-;10036:5;10074:6;10061:20;10052:29;;10090:30;10114:5;10090:30;:::i;:::-;9993:133;;;;:::o;10132:468::-;10197:6;10205;10254:2;10242:9;10233:7;10229:23;10225:32;10222:119;;;10260:79;;:::i;:::-;10222:119;10380:1;10405:53;10450:7;10441:6;10430:9;10426:22;10405:53;:::i;:::-;10395:63;;10351:117;10507:2;10533:50;10575:7;10566:6;10555:9;10551:22;10533:50;:::i;:::-;10523:60;;10478:115;10132:468;;;;;:::o;10606:117::-;10715:1;10712;10705:12;10729:117;10838:1;10835;10828:12;10869:568;10942:8;10952:6;11002:3;10995:4;10987:6;10983:17;10979:27;10969:122;;11010:79;;:::i;:::-;10969:122;11123:6;11110:20;11100:30;;11153:18;11145:6;11142:30;11139:117;;;11175:79;;:::i;:::-;11139:117;11289:4;11281:6;11277:17;11265:29;;11343:3;11335:4;11327:6;11323:17;11313:8;11309:32;11306:41;11303:128;;;11350:79;;:::i;:::-;11303:128;10869:568;;;;;:::o;11443:704::-;11538:6;11546;11554;11603:2;11591:9;11582:7;11578:23;11574:32;11571:119;;;11609:79;;:::i;:::-;11571:119;11729:1;11754:53;11799:7;11790:6;11779:9;11775:22;11754:53;:::i;:::-;11744:63;;11700:117;11884:2;11873:9;11869:18;11856:32;11915:18;11907:6;11904:30;11901:117;;;11937:79;;:::i;:::-;11901:117;12050:80;12122:7;12113:6;12102:9;12098:22;12050:80;:::i;:::-;12032:98;;;;11827:313;11443:704;;;;;:::o;12153:307::-;12214:4;12304:18;12296:6;12293:30;12290:56;;;12326:18;;:::i;:::-;12290:56;12364:29;12386:6;12364:29;:::i;:::-;12356:37;;12448:4;12442;12438:15;12430:23;;12153:307;;;:::o;12466:423::-;12543:5;12568:65;12584:48;12625:6;12584:48;:::i;:::-;12568:65;:::i;:::-;12559:74;;12656:6;12649:5;12642:21;12694:4;12687:5;12683:16;12732:3;12723:6;12718:3;12714:16;12711:25;12708:112;;;12739:79;;:::i;:::-;12708:112;12829:54;12876:6;12871:3;12866;12829:54;:::i;:::-;12549:340;12466:423;;;;;:::o;12908:338::-;12963:5;13012:3;13005:4;12997:6;12993:17;12989:27;12979:122;;13020:79;;:::i;:::-;12979:122;13137:6;13124:20;13162:78;13236:3;13228:6;13221:4;13213:6;13209:17;13162:78;:::i;:::-;13153:87;;12969:277;12908:338;;;;:::o;13252:943::-;13347:6;13355;13363;13371;13420:3;13408:9;13399:7;13395:23;13391:33;13388:120;;;13427:79;;:::i;:::-;13388:120;13547:1;13572:53;13617:7;13608:6;13597:9;13593:22;13572:53;:::i;:::-;13562:63;;13518:117;13674:2;13700:53;13745:7;13736:6;13725:9;13721:22;13700:53;:::i;:::-;13690:63;;13645:118;13802:2;13828:53;13873:7;13864:6;13853:9;13849:22;13828:53;:::i;:::-;13818:63;;13773:118;13958:2;13947:9;13943:18;13930:32;13989:18;13981:6;13978:30;13975:117;;;14011:79;;:::i;:::-;13975:117;14116:62;14170:7;14161:6;14150:9;14146:22;14116:62;:::i;:::-;14106:72;;13901:287;13252:943;;;;;;;:::o;14201:180::-;14249:77;14246:1;14239:88;14346:4;14343:1;14336:15;14370:4;14367:1;14360:15;14387:119;14474:1;14467:5;14464:12;14454:46;;14480:18;;:::i;:::-;14454:46;14387:119;:::o;14512:139::-;14563:7;14592:5;14581:16;;14598:47;14639:5;14598:47;:::i;:::-;14512:139;;;:::o;14657:::-;14719:9;14752:38;14784:5;14752:38;:::i;:::-;14739:51;;14657:139;;;:::o;14802:155::-;14901:49;14944:5;14901:49;:::i;:::-;14896:3;14889:62;14802:155;;:::o;14963:246::-;15068:4;15106:2;15095:9;15091:18;15083:26;;15119:83;15199:1;15188:9;15184:17;15175:6;15119:83;:::i;:::-;14963:246;;;;:::o;15215:474::-;15283:6;15291;15340:2;15328:9;15319:7;15315:23;15311:32;15308:119;;;15346:79;;:::i;:::-;15308:119;15466:1;15491:53;15536:7;15527:6;15516:9;15512:22;15491:53;:::i;:::-;15481:63;;15437:117;15593:2;15619:53;15664:7;15655:6;15644:9;15640:22;15619:53;:::i;:::-;15609:63;;15564:118;15215:474;;;;;:::o;15695:180::-;15743:77;15740:1;15733:88;15840:4;15837:1;15830:15;15864:4;15861:1;15854:15;15881:320;15925:6;15962:1;15956:4;15952:12;15942:22;;16009:1;16003:4;15999:12;16030:18;16020:81;;16086:4;16078:6;16074:17;16064:27;;16020:81;16148:2;16140:6;16137:14;16117:18;16114:38;16111:84;;16167:18;;:::i;:::-;16111:84;15932:269;15881:320;;;:::o;16207:182::-;16347:34;16343:1;16335:6;16331:14;16324:58;16207:182;:::o;16395:366::-;16537:3;16558:67;16622:2;16617:3;16558:67;:::i;:::-;16551:74;;16634:93;16723:3;16634:93;:::i;:::-;16752:2;16747:3;16743:12;16736:19;;16395:366;;;:::o;16767:419::-;16933:4;16971:2;16960:9;16956:18;16948:26;;17020:9;17014:4;17010:20;17006:1;16995:9;16991:17;16984:47;17048:131;17174:4;17048:131;:::i;:::-;17040:139;;16767:419;;;:::o;17192:180::-;17240:77;17237:1;17230:88;17337:4;17334:1;17327:15;17361:4;17358:1;17351:15;17378:191;17418:3;17437:20;17455:1;17437:20;:::i;:::-;17432:25;;17471:20;17489:1;17471:20;:::i;:::-;17466:25;;17514:1;17511;17507:9;17500:16;;17535:3;17532:1;17529:10;17526:36;;;17542:18;;:::i;:::-;17526:36;17378:191;;;;:::o;17575:180::-;17715:32;17711:1;17703:6;17699:14;17692:56;17575:180;:::o;17761:366::-;17903:3;17924:67;17988:2;17983:3;17924:67;:::i;:::-;17917:74;;18000:93;18089:3;18000:93;:::i;:::-;18118:2;18113:3;18109:12;18102:19;;17761:366;;;:::o;18133:419::-;18299:4;18337:2;18326:9;18322:18;18314:26;;18386:9;18380:4;18376:20;18372:1;18361:9;18357:17;18350:47;18414:131;18540:4;18414:131;:::i;:::-;18406:139;;18133:419;;;:::o;18558:220::-;18698:34;18694:1;18686:6;18682:14;18675:58;18767:3;18762:2;18754:6;18750:15;18743:28;18558:220;:::o;18784:366::-;18926:3;18947:67;19011:2;19006:3;18947:67;:::i;:::-;18940:74;;19023:93;19112:3;19023:93;:::i;:::-;19141:2;19136:3;19132:12;19125:19;;18784:366;;;:::o;19156:419::-;19322:4;19360:2;19349:9;19345:18;19337:26;;19409:9;19403:4;19399:20;19395:1;19384:9;19380:17;19373:47;19437:131;19563:4;19437:131;:::i;:::-;19429:139;;19156:419;;;:::o;19581:248::-;19721:34;19717:1;19709:6;19705:14;19698:58;19790:31;19785:2;19777:6;19773:15;19766:56;19581:248;:::o;19835:366::-;19977:3;19998:67;20062:2;20057:3;19998:67;:::i;:::-;19991:74;;20074:93;20163:3;20074:93;:::i;:::-;20192:2;20187:3;20183:12;20176:19;;19835:366;;;:::o;20207:419::-;20373:4;20411:2;20400:9;20396:18;20388:26;;20460:9;20454:4;20450:20;20446:1;20435:9;20431:17;20424:47;20488:131;20614:4;20488:131;:::i;:::-;20480:139;;20207:419;;;:::o;20632:164::-;20772:16;20768:1;20760:6;20756:14;20749:40;20632:164;:::o;20802:366::-;20944:3;20965:67;21029:2;21024:3;20965:67;:::i;:::-;20958:74;;21041:93;21130:3;21041:93;:::i;:::-;21159:2;21154:3;21150:12;21143:19;;20802:366;;;:::o;21174:419::-;21340:4;21378:2;21367:9;21363:18;21355:26;;21427:9;21421:4;21417:20;21413:1;21402:9;21398:17;21391:47;21455:131;21581:4;21455:131;:::i;:::-;21447:139;;21174:419;;;:::o;21599:232::-;21739:34;21735:1;21727:6;21723:14;21716:58;21808:15;21803:2;21795:6;21791:15;21784:40;21599:232;:::o;21837:366::-;21979:3;22000:67;22064:2;22059:3;22000:67;:::i;:::-;21993:74;;22076:93;22165:3;22076:93;:::i;:::-;22194:2;22189:3;22185:12;22178:19;;21837:366;;;:::o;22209:419::-;22375:4;22413:2;22402:9;22398:18;22390:26;;22462:9;22456:4;22452:20;22448:1;22437:9;22433:17;22426:47;22490:131;22616:4;22490:131;:::i;:::-;22482:139;;22209:419;;;:::o;22634:141::-;22683:4;22706:3;22698:11;;22729:3;22726:1;22719:14;22763:4;22760:1;22750:18;22742:26;;22634:141;;;:::o;22781:93::-;22818:6;22865:2;22860;22853:5;22849:14;22845:23;22835:33;;22781:93;;;:::o;22880:107::-;22924:8;22974:5;22968:4;22964:16;22943:37;;22880:107;;;;:::o;22993:393::-;23062:6;23112:1;23100:10;23096:18;23135:97;23165:66;23154:9;23135:97;:::i;:::-;23253:39;23283:8;23272:9;23253:39;:::i;:::-;23241:51;;23325:4;23321:9;23314:5;23310:21;23301:30;;23374:4;23364:8;23360:19;23353:5;23350:30;23340:40;;23069:317;;22993:393;;;;;:::o;23392:60::-;23420:3;23441:5;23434:12;;23392:60;;;:::o;23458:142::-;23508:9;23541:53;23559:34;23568:24;23586:5;23568:24;:::i;:::-;23559:34;:::i;:::-;23541:53;:::i;:::-;23528:66;;23458:142;;;:::o;23606:75::-;23649:3;23670:5;23663:12;;23606:75;;;:::o;23687:269::-;23797:39;23828:7;23797:39;:::i;:::-;23858:91;23907:41;23931:16;23907:41;:::i;:::-;23899:6;23892:4;23886:11;23858:91;:::i;:::-;23852:4;23845:105;23763:193;23687:269;;;:::o;23962:73::-;24007:3;23962:73;:::o;24041:189::-;24118:32;;:::i;:::-;24159:65;24217:6;24209;24203:4;24159:65;:::i;:::-;24094:136;24041:189;;:::o;24236:186::-;24296:120;24313:3;24306:5;24303:14;24296:120;;;24367:39;24404:1;24397:5;24367:39;:::i;:::-;24340:1;24333:5;24329:13;24320:22;;24296:120;;;24236:186;;:::o;24428:543::-;24529:2;24524:3;24521:11;24518:446;;;24563:38;24595:5;24563:38;:::i;:::-;24647:29;24665:10;24647:29;:::i;:::-;24637:8;24633:44;24830:2;24818:10;24815:18;24812:49;;;24851:8;24836:23;;24812:49;24874:80;24930:22;24948:3;24930:22;:::i;:::-;24920:8;24916:37;24903:11;24874:80;:::i;:::-;24533:431;;24518:446;24428:543;;;:::o;24977:117::-;25031:8;25081:5;25075:4;25071:16;25050:37;;24977:117;;;;:::o;25100:169::-;25144:6;25177:51;25225:1;25221:6;25213:5;25210:1;25206:13;25177:51;:::i;:::-;25173:56;25258:4;25252;25248:15;25238:25;;25151:118;25100:169;;;;:::o;25274:295::-;25350:4;25496:29;25521:3;25515:4;25496:29;:::i;:::-;25488:37;;25558:3;25555:1;25551:11;25545:4;25542:21;25534:29;;25274:295;;;;:::o;25574:1395::-;25691:37;25724:3;25691:37;:::i;:::-;25793:18;25785:6;25782:30;25779:56;;;25815:18;;:::i;:::-;25779:56;25859:38;25891:4;25885:11;25859:38;:::i;:::-;25944:67;26004:6;25996;25990:4;25944:67;:::i;:::-;26038:1;26062:4;26049:17;;26094:2;26086:6;26083:14;26111:1;26106:618;;;;26768:1;26785:6;26782:77;;;26834:9;26829:3;26825:19;26819:26;26810:35;;26782:77;26885:67;26945:6;26938:5;26885:67;:::i;:::-;26879:4;26872:81;26741:222;26076:887;;26106:618;26158:4;26154:9;26146:6;26142:22;26192:37;26224:4;26192:37;:::i;:::-;26251:1;26265:208;26279:7;26276:1;26273:14;26265:208;;;26358:9;26353:3;26349:19;26343:26;26335:6;26328:42;26409:1;26401:6;26397:14;26387:24;;26456:2;26445:9;26441:18;26428:31;;26302:4;26299:1;26295:12;26290:17;;26265:208;;;26501:6;26492:7;26489:19;26486:179;;;26559:9;26554:3;26550:19;26544:26;26602:48;26644:4;26636:6;26632:17;26621:9;26602:48;:::i;:::-;26594:6;26587:64;26509:156;26486:179;26711:1;26707;26699:6;26695:14;26691:22;26685:4;26678:36;26113:611;;;26076:887;;25666:1303;;;25574:1395;;:::o;26975:174::-;27115:26;27111:1;27103:6;27099:14;27092:50;26975:174;:::o;27155:366::-;27297:3;27318:67;27382:2;27377:3;27318:67;:::i;:::-;27311:74;;27394:93;27483:3;27394:93;:::i;:::-;27512:2;27507:3;27503:12;27496:19;;27155:366;;;:::o;27527:419::-;27693:4;27731:2;27720:9;27716:18;27708:26;;27780:9;27774:4;27770:20;27766:1;27755:9;27751:17;27744:47;27808:131;27934:4;27808:131;:::i;:::-;27800:139;;27527:419;;;:::o;27952:228::-;28092:34;28088:1;28080:6;28076:14;28069:58;28161:11;28156:2;28148:6;28144:15;28137:36;27952:228;:::o;28186:366::-;28328:3;28349:67;28413:2;28408:3;28349:67;:::i;:::-;28342:74;;28425:93;28514:3;28425:93;:::i;:::-;28543:2;28538:3;28534:12;28527:19;;28186:366;;;:::o;28558:419::-;28724:4;28762:2;28751:9;28747:18;28739:26;;28811:9;28805:4;28801:20;28797:1;28786:9;28782:17;28775:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28558:419;;;:::o;28983:170::-;29123:22;29119:1;29111:6;29107:14;29100:46;28983:170;:::o;29159:366::-;29301:3;29322:67;29386:2;29381:3;29322:67;:::i;:::-;29315:74;;29398:93;29487:3;29398:93;:::i;:::-;29516:2;29511:3;29507:12;29500:19;;29159:366;;;:::o;29531:419::-;29697:4;29735:2;29724:9;29720:18;29712:26;;29784:9;29778:4;29774:20;29770:1;29759:9;29755:17;29748:47;29812:131;29938:4;29812:131;:::i;:::-;29804:139;;29531:419;;;:::o;29956:194::-;29996:4;30016:20;30034:1;30016:20;:::i;:::-;30011:25;;30050:20;30068:1;30050:20;:::i;:::-;30045:25;;30094:1;30091;30087:9;30079:17;;30118:1;30112:4;30109:11;30106:37;;;30123:18;;:::i;:::-;30106:37;29956:194;;;;:::o;30156:221::-;30296:34;30292:1;30284:6;30280:14;30273:58;30365:4;30360:2;30352:6;30348:15;30341:29;30156:221;:::o;30383:366::-;30525:3;30546:67;30610:2;30605:3;30546:67;:::i;:::-;30539:74;;30622:93;30711:3;30622:93;:::i;:::-;30740:2;30735:3;30731:12;30724:19;;30383:366;;;:::o;30755:419::-;30921:4;30959:2;30948:9;30944:18;30936:26;;31008:9;31002:4;30998:20;30994:1;30983:9;30979:17;30972:47;31036:131;31162:4;31036:131;:::i;:::-;31028:139;;30755:419;;;:::o;31180:181::-;31320:33;31316:1;31308:6;31304:14;31297:57;31180:181;:::o;31367:366::-;31509:3;31530:67;31594:2;31589:3;31530:67;:::i;:::-;31523:74;;31606:93;31695:3;31606:93;:::i;:::-;31724:2;31719:3;31715:12;31708:19;;31367:366;;;:::o;31739:419::-;31905:4;31943:2;31932:9;31928:18;31920:26;;31992:9;31986:4;31982:20;31978:1;31967:9;31963:17;31956:47;32020:131;32146:4;32020:131;:::i;:::-;32012:139;;31739:419;;;:::o;32164:167::-;32304:19;32300:1;32292:6;32288:14;32281:43;32164:167;:::o;32337:366::-;32479:3;32500:67;32564:2;32559:3;32500:67;:::i;:::-;32493:74;;32576:93;32665:3;32576:93;:::i;:::-;32694:2;32689:3;32685:12;32678:19;;32337:366;;;:::o;32709:419::-;32875:4;32913:2;32902:9;32898:18;32890:26;;32962:9;32956:4;32952:20;32948:1;32937:9;32933:17;32926:47;32990:131;33116:4;32990:131;:::i;:::-;32982:139;;32709:419;;;:::o;33134:94::-;33167:8;33215:5;33211:2;33207:14;33186:35;;33134:94;;;:::o;33234:::-;33273:7;33302:20;33316:5;33302:20;:::i;:::-;33291:31;;33234:94;;;:::o;33334:100::-;33373:7;33402:26;33422:5;33402:26;:::i;:::-;33391:37;;33334:100;;;:::o;33440:157::-;33545:45;33565:24;33583:5;33565:24;:::i;:::-;33545:45;:::i;:::-;33540:3;33533:58;33440:157;;:::o;33603:256::-;33715:3;33730:75;33801:3;33792:6;33730:75;:::i;:::-;33830:2;33825:3;33821:12;33814:19;;33850:3;33843:10;;33603:256;;;;:::o;33865:225::-;34005:34;34001:1;33993:6;33989:14;33982:58;34074:8;34069:2;34061:6;34057:15;34050:33;33865:225;:::o;34096:366::-;34238:3;34259:67;34323:2;34318:3;34259:67;:::i;:::-;34252:74;;34335:93;34424:3;34335:93;:::i;:::-;34453:2;34448:3;34444:12;34437:19;;34096:366;;;:::o;34468:419::-;34634:4;34672:2;34661:9;34657:18;34649:26;;34721:9;34715:4;34711:20;34707:1;34696:9;34692:17;34685:47;34749:131;34875:4;34749:131;:::i;:::-;34741:139;;34468:419;;;:::o;34893:178::-;35033:30;35029:1;35021:6;35017:14;35010:54;34893:178;:::o;35077:366::-;35219:3;35240:67;35304:2;35299:3;35240:67;:::i;:::-;35233:74;;35316:93;35405:3;35316:93;:::i;:::-;35434:2;35429:3;35425:12;35418:19;;35077:366;;;:::o;35449:419::-;35615:4;35653:2;35642:9;35638:18;35630:26;;35702:9;35696:4;35692:20;35688:1;35677:9;35673:17;35666:47;35730:131;35856:4;35730:131;:::i;:::-;35722:139;;35449:419;;;:::o;35874:229::-;36014:34;36010:1;36002:6;35998:14;35991:58;36083:12;36078:2;36070:6;36066:15;36059:37;35874:229;:::o;36109:366::-;36251:3;36272:67;36336:2;36331:3;36272:67;:::i;:::-;36265:74;;36348:93;36437:3;36348:93;:::i;:::-;36466:2;36461:3;36457:12;36450:19;;36109:366;;;:::o;36481:419::-;36647:4;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36481:419;;;:::o;36906:178::-;37046:30;37042:1;37034:6;37030:14;37023:54;36906:178;:::o;37090:366::-;37232:3;37253:67;37317:2;37312:3;37253:67;:::i;:::-;37246:74;;37329:93;37418:3;37329:93;:::i;:::-;37447:2;37442:3;37438:12;37431:19;;37090:366;;;:::o;37462:419::-;37628:4;37666:2;37655:9;37651:18;37643:26;;37715:9;37709:4;37705:20;37701:1;37690:9;37686:17;37679:47;37743:131;37869:4;37743:131;:::i;:::-;37735:139;;37462:419;;;:::o;37887:163::-;38027:15;38023:1;38015:6;38011:14;38004:39;37887:163;:::o;38056:366::-;38198:3;38219:67;38283:2;38278:3;38219:67;:::i;:::-;38212:74;;38295:93;38384:3;38295:93;:::i;:::-;38413:2;38408:3;38404:12;38397:19;;38056:366;;;:::o;38428:419::-;38594:4;38632:2;38621:9;38617:18;38609:26;;38681:9;38675:4;38671:20;38667:1;38656:9;38652:17;38645:47;38709:131;38835:4;38709:131;:::i;:::-;38701:139;;38428:419;;;:::o;38853:181::-;38993:33;38989:1;38981:6;38977:14;38970:57;38853:181;:::o;39040:366::-;39182:3;39203:67;39267:2;39262:3;39203:67;:::i;:::-;39196:74;;39279:93;39368:3;39279:93;:::i;:::-;39397:2;39392:3;39388:12;39381:19;;39040:366;;;:::o;39412:419::-;39578:4;39616:2;39605:9;39601:18;39593:26;;39665:9;39659:4;39655:20;39651:1;39640:9;39636:17;39629:47;39693:131;39819:4;39693:131;:::i;:::-;39685:139;;39412:419;;;:::o;39837:148::-;39939:11;39976:3;39961:18;;39837:148;;;;:::o;40015:874::-;40118:3;40155:5;40149:12;40184:36;40210:9;40184:36;:::i;:::-;40236:89;40318:6;40313:3;40236:89;:::i;:::-;40229:96;;40356:1;40345:9;40341:17;40372:1;40367:166;;;;40547:1;40542:341;;;;40334:549;;40367:166;40451:4;40447:9;40436;40432:25;40427:3;40420:38;40513:6;40506:14;40499:22;40491:6;40487:35;40482:3;40478:45;40471:52;;40367:166;;40542:341;40609:38;40641:5;40609:38;:::i;:::-;40669:1;40683:154;40697:6;40694:1;40691:13;40683:154;;;40771:7;40765:14;40761:1;40756:3;40752:11;40745:35;40821:1;40812:7;40808:15;40797:26;;40719:4;40716:1;40712:12;40707:17;;40683:154;;;40866:6;40861:3;40857:16;40850:23;;40549:334;;40334:549;;40122:767;;40015:874;;;;:::o;40895:390::-;41001:3;41029:39;41062:5;41029:39;:::i;:::-;41084:89;41166:6;41161:3;41084:89;:::i;:::-;41077:96;;41182:65;41240:6;41235:3;41228:4;41221:5;41217:16;41182:65;:::i;:::-;41272:6;41267:3;41263:16;41256:23;;41005:280;40895:390;;;;:::o;41291:182::-;41459:7;41454:3;41447:20;41291:182;:::o;41479:693::-;41746:3;41768:92;41856:3;41847:6;41768:92;:::i;:::-;41761:99;;41877:95;41968:3;41959:6;41877:95;:::i;:::-;41870:102;;41982:137;42115:3;41982:137;:::i;:::-;42144:1;42139:3;42135:11;42128:18;;42163:3;42156:10;;41479:693;;;;;:::o;42178:225::-;42318:34;42314:1;42306:6;42302:14;42295:58;42387:8;42382:2;42374:6;42370:15;42363:33;42178:225;:::o;42409:366::-;42551:3;42572:67;42636:2;42631:3;42572:67;:::i;:::-;42565:74;;42648:93;42737:3;42648:93;:::i;:::-;42766:2;42761:3;42757:12;42750:19;;42409:366;;;:::o;42781:419::-;42947:4;42985:2;42974:9;42970:18;42962:26;;43034:9;43028:4;43024:20;43020:1;43009:9;43005:17;42998:47;43062:131;43188:4;43062:131;:::i;:::-;43054:139;;42781:419;;;:::o;43206:231::-;43346:34;43342:1;43334:6;43330:14;43323:58;43415:14;43410:2;43402:6;43398:15;43391:39;43206:231;:::o;43443:366::-;43585:3;43606:67;43670:2;43665:3;43606:67;:::i;:::-;43599:74;;43682:93;43771:3;43682:93;:::i;:::-;43800:2;43795:3;43791:12;43784:19;;43443:366;;;:::o;43815:419::-;43981:4;44019:2;44008:9;44004:18;43996:26;;44068:9;44062:4;44058:20;44054:1;44043:9;44039:17;44032:47;44096:131;44222:4;44096:131;:::i;:::-;44088:139;;43815:419;;;:::o;44240:224::-;44380:34;44376:1;44368:6;44364:14;44357:58;44449:7;44444:2;44436:6;44432:15;44425:32;44240:224;:::o;44470:366::-;44612:3;44633:67;44697:2;44692:3;44633:67;:::i;:::-;44626:74;;44709:93;44798:3;44709:93;:::i;:::-;44827:2;44822:3;44818:12;44811:19;;44470:366;;;:::o;44842:419::-;45008:4;45046:2;45035:9;45031:18;45023:26;;45095:9;45089:4;45085:20;45081:1;45070:9;45066:17;45059:47;45123:131;45249:4;45123:131;:::i;:::-;45115:139;;44842:419;;;:::o;45267:223::-;45407:34;45403:1;45395:6;45391:14;45384:58;45476:6;45471:2;45463:6;45459:15;45452:31;45267:223;:::o;45496:366::-;45638:3;45659:67;45723:2;45718:3;45659:67;:::i;:::-;45652:74;;45735:93;45824:3;45735:93;:::i;:::-;45853:2;45848:3;45844:12;45837:19;;45496:366;;;:::o;45868:419::-;46034:4;46072:2;46061:9;46057:18;46049:26;;46121:9;46115:4;46111:20;46107:1;46096:9;46092:17;46085:47;46149:131;46275:4;46149:131;:::i;:::-;46141:139;;45868:419;;;:::o;46293:175::-;46433:27;46429:1;46421:6;46417:14;46410:51;46293:175;:::o;46474:366::-;46616:3;46637:67;46701:2;46696:3;46637:67;:::i;:::-;46630:74;;46713:93;46802:3;46713:93;:::i;:::-;46831:2;46826:3;46822:12;46815:19;;46474:366;;;:::o;46846:419::-;47012:4;47050:2;47039:9;47035:18;47027:26;;47099:9;47093:4;47089:20;47085:1;47074:9;47070:17;47063:47;47127:131;47253:4;47127:131;:::i;:::-;47119:139;;46846:419;;;:::o;47271:237::-;47411:34;47407:1;47399:6;47395:14;47388:58;47480:20;47475:2;47467:6;47463:15;47456:45;47271:237;:::o;47514:366::-;47656:3;47677:67;47741:2;47736:3;47677:67;:::i;:::-;47670:74;;47753:93;47842:3;47753:93;:::i;:::-;47871:2;47866:3;47862:12;47855:19;;47514:366;;;:::o;47886:419::-;48052:4;48090:2;48079:9;48075:18;48067:26;;48139:9;48133:4;48129:20;48125:1;48114:9;48110:17;48103:47;48167:131;48293:4;48167:131;:::i;:::-;48159:139;;47886:419;;;:::o;48311:233::-;48350:3;48373:24;48391:5;48373:24;:::i;:::-;48364:33;;48419:66;48412:5;48409:77;48406:103;;48489:18;;:::i;:::-;48406:103;48536:1;48529:5;48525:13;48518:20;;48311:233;;;:::o;48550:180::-;48598:77;48595:1;48588:88;48695:4;48692:1;48685:15;48719:4;48716:1;48709:15;48736:185;48776:1;48793:20;48811:1;48793:20;:::i;:::-;48788:25;;48827:20;48845:1;48827:20;:::i;:::-;48822:25;;48866:1;48856:35;;48871:18;;:::i;:::-;48856:35;48913:1;48910;48906:9;48901:14;;48736:185;;;;:::o;48927:176::-;48959:1;48976:20;48994:1;48976:20;:::i;:::-;48971:25;;49010:20;49028:1;49010:20;:::i;:::-;49005:25;;49049:1;49039:35;;49054:18;;:::i;:::-;49039:35;49095:1;49092;49088:9;49083:14;;48927:176;;;;:::o;49109:180::-;49157:77;49154:1;49147:88;49254:4;49251:1;49244:15;49278:4;49275:1;49268:15;49295:79;49334:7;49363:5;49352:16;;49295:79;;;:::o;49380:157::-;49485:45;49505:24;49523:5;49505:24;:::i;:::-;49485:45;:::i;:::-;49480:3;49473:58;49380:157;;:::o;49543:397::-;49683:3;49698:75;49769:3;49760:6;49698:75;:::i;:::-;49798:2;49793:3;49789:12;49782:19;;49811:75;49882:3;49873:6;49811:75;:::i;:::-;49911:2;49906:3;49902:12;49895:19;;49931:3;49924:10;;49543:397;;;;;:::o;49946:98::-;49997:6;50031:5;50025:12;50015:22;;49946:98;;;:::o;50050:168::-;50133:11;50167:6;50162:3;50155:19;50207:4;50202:3;50198:14;50183:29;;50050:168;;;;:::o;50224:373::-;50310:3;50338:38;50370:5;50338:38;:::i;:::-;50392:70;50455:6;50450:3;50392:70;:::i;:::-;50385:77;;50471:65;50529:6;50524:3;50517:4;50510:5;50506:16;50471:65;:::i;:::-;50561:29;50583:6;50561:29;:::i;:::-;50556:3;50552:39;50545:46;;50314:283;50224:373;;;;:::o;50603:640::-;50798:4;50836:3;50825:9;50821:19;50813:27;;50850:71;50918:1;50907:9;50903:17;50894:6;50850:71;:::i;:::-;50931:72;50999:2;50988:9;50984:18;50975:6;50931:72;:::i;:::-;51013;51081:2;51070:9;51066:18;51057:6;51013:72;:::i;:::-;51132:9;51126:4;51122:20;51117:2;51106:9;51102:18;51095:48;51160:76;51231:4;51222:6;51160:76;:::i;:::-;51152:84;;50603:640;;;;;;;:::o;51249:141::-;51305:5;51336:6;51330:13;51321:22;;51352:32;51378:5;51352:32;:::i;:::-;51249:141;;;;:::o;51396:349::-;51465:6;51514:2;51502:9;51493:7;51489:23;51485:32;51482:119;;;51520:79;;:::i;:::-;51482:119;51640:1;51665:63;51720:7;51711:6;51700:9;51696:22;51665:63;:::i;:::-;51655:73;;51611:127;51396:349;;;;:::o;51751:182::-;51891:34;51887:1;51879:6;51875:14;51868:58;51751:182;:::o;51939:366::-;52081:3;52102:67;52166:2;52161:3;52102:67;:::i;:::-;52095:74;;52178:93;52267:3;52178:93;:::i;:::-;52296:2;52291:3;52287:12;52280:19;;51939:366;;;:::o;52311:419::-;52477:4;52515:2;52504:9;52500:18;52492:26;;52564:9;52558:4;52554:20;52550:1;52539:9;52535:17;52528:47;52592:131;52718:4;52592:131;:::i;:::-;52584:139;;52311:419;;;:::o;52736:178::-;52876:30;52872:1;52864:6;52860:14;52853:54;52736:178;:::o;52920:366::-;53062:3;53083:67;53147:2;53142:3;53083:67;:::i;:::-;53076:74;;53159:93;53248:3;53159:93;:::i;:::-;53277:2;53272:3;53268:12;53261:19;;52920:366;;;:::o;53292:419::-;53458:4;53496:2;53485:9;53481:18;53473:26;;53545:9;53539:4;53535:20;53531:1;53520:9;53516:17;53509:47;53573:131;53699:4;53573:131;:::i;:::-;53565:139;;53292:419;;;:::o
Swarm Source
ipfs://87e2aea7ad28f7c318dbf16ecf1c3748900fb725cec4bf284e093cf86ca6aa35
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.