Source Code
Overview
ETH Balance
0.0006 ETH
Eth Value
$1.88 (@ $3,131.90/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Showing the last 10 transactions (View Advanced Filter)
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Price | 14411636 | 1367 days ago | IN | 0 ETH | 0.00213143 | ||||
| Set Price | 14307405 | 1384 days ago | IN | 0 ETH | 0.00099364 | ||||
| Mint With Token ... | 14307358 | 1384 days ago | IN | 0.0001 ETH | 0.00786077 | ||||
| Mint With Token ... | 14307351 | 1384 days ago | IN | 0.0001 ETH | 0.00683472 | ||||
| Mint With Token ... | 14307344 | 1384 days ago | IN | 0.0001 ETH | 0.00579688 | ||||
| Mint With Token ... | 14307326 | 1384 days ago | IN | 0.0001 ETH | 0.00734148 | ||||
| Mint With Token ... | 14307322 | 1384 days ago | IN | 0.0001 ETH | 0.00636257 | ||||
| Mint With Token ... | 14302145 | 1384 days ago | IN | 0.0001 ETH | 0.01021336 | ||||
| Set Price | 14302052 | 1384 days ago | IN | 0 ETH | 0.00214858 | ||||
| 0x60806040 | 14302002 | 1384 days ago | IN | 0 ETH | 0.1777046 |
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
There are no matching entriesUpdate your filters to view other transactions | |||||||||
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PunkinsNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-03-02
*/
// File: @openzeppelin/contracts/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);
}
}
// File: @openzeppelin/contracts/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
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;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/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/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);
}
// File: @openzeppelin/contracts/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);
}
// File: @openzeppelin/contracts/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;
}
}
// File: @openzeppelin/contracts/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;
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/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);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
* @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: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
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) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
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 overriden 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 owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_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: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 _owners[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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @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 of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @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 {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping(uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// File: PunkinsNFT.sol
pragma solidity ^0.8.0;
contract PunkinsNFT is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
// https://punkinsnft.com - The ONLY place to mint your Punkin!
using Strings for uint256;
uint256 private _price = 0.02 ether;
// Team founder
address GreatPunkinator = 0x74101Ce318882771E6850b05931b4F78ba433dEb;
string punkin1 = "https://ipfs.io/ipfs/QmVPt9kahuYSDXFQrDQEt73oPV5mYXnSaB3QUf9rQ8J8Zy";
// "Simplicity is the ultimate sophistication." ~da Vinci ... "Except when it's not always possible!" ~GreatPunkinator
constructor() ERC721("PunkinsNFT", "PNKN") {
// GreatPunkinator gets Punkin1
// Punkins 2-30 to be minted to GreatPunkinator as reserve for future giveaways
_safeMint( GreatPunkinator, 1 ); _setTokenURI( 1, punkin1 );
}
function mintWithTokenURI(string memory _tokenURI) public payable returns (bool) {
uint256 supply = totalSupply();
uint256 i = 1;
require( supply < 10001, "Exceeds maximum Punkin supply" );
require( msg.value >= _price, "Ether sent is not correct" );
_safeMint( msg.sender, supply + i);
_setTokenURI( supply + i, _tokenURI);
return true;
}
mapping(uint256 => string) private _tokenURIs;
// just in case...
function setPrice(uint256 _newPrice) public onlyOwner() {
_price = _newPrice;
require( msg.sender == GreatPunkinator );
}
function getPrice() public view returns (uint256){
return _price;
}
function withdrawAll() public payable onlyOwner {
uint256 _each = address(this).balance;
require(payable(GreatPunkinator).send(_each));
}
function safeMint(address to, uint256 tokenId) public onlyOwner {
_safeMint(to, tokenId);
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId)
internal
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","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":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mintWithTokenURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
608060405266470de4df820000600c557374101ce318882771e6850b05931b4f78ba433deb600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060800160405280604381526020016200518660439139600e90805190602001906200009592919062000d98565b50348015620000a357600080fd5b506040518060400160405280600a81526020017f50756e6b696e734e4654000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f504e4b4e0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012892919062000d98565b5080600190805190602001906200014192919062000d98565b50505062000164620001586200024460201b60201c565b6200024c60201b60201c565b62000199600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200031260201b60201c565b6200023e6001600e8054620001ae906200121a565b80601f0160208091040260200160405190810160405280929190818152602001828054620001dc906200121a565b80156200022d5780601f1062000201576101008083540402835291602001916200022d565b820191906000526020600020905b8154815290600101906020018083116200020f57829003601f168201915b50505050506200033860201b60201c565b6200147b565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000334828260405180602001604052806000815250620003b960201b60201c565b5050565b62000349826200042760201b60201c565b6200038b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003829062001071565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190620003b492919062000d98565b505050565b620003cb83836200049360201b60201c565b620003e060008484846200067960201b60201c565b62000422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000419906200100b565b60405180910390fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000506576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fd9062001093565b60405180910390fd5b62000517816200042760201b60201c565b156200055a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000551906200102d565b60405180910390fd5b6200056e600083836200083360201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005c09190620010e2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620006a78473ffffffffffffffffffffffffffffffffffffffff166200085060201b620012e41760201c565b1562000826578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006d96200024460201b60201c565b8786866040518563ffffffff1660e01b8152600401620006fd949392919062000fb7565b602060405180830381600087803b1580156200071857600080fd5b505af19250505080156200074c57506040513d601f19601f8201168201806040525081019062000749919062000e5f565b60015b620007d5573d80600081146200077f576040519150601f19603f3d011682016040523d82523d6000602084013e62000784565b606091505b50600081511415620007cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007c4906200100b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200082b565b600190505b949350505050565b6200084b8383836200086360201b620012f71760201c565b505050565b600080823b905060008111915050919050565b6200087b838383620009aa60201b6200140b1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620008c857620008c281620009af60201b60201c565b62000910565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146200090f576200090e8382620009f860201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200095d57620009578162000b7560201b60201c565b620009a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620009a457620009a3828262000c5160201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000a128462000cdd60201b62000a3e1760201c565b62000a1e91906200113f565b905060006007600084815260200190815260200160002054905081811462000b04576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000b8b91906200113f565b905060006009600084815260200190815260200160002054905060006008838154811062000bbe5762000bbd620012dd565b5b90600052602060002001549050806008838154811062000be35762000be2620012dd565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000c355762000c34620012ae565b5b6001900381819060005260206000200160009055905550505050565b600062000c698362000cdd60201b62000a3e1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000d51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d48906200104f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000da6906200121a565b90600052602060002090601f01602090048101928262000dca576000855562000e16565b82601f1062000de557805160ff191683800117855562000e16565b8280016001018555821562000e16579182015b8281111562000e1557825182559160200191906001019062000df8565b5b50905062000e25919062000e29565b5090565b5b8082111562000e4457600081600090555060010162000e2a565b5090565b60008151905062000e598162001461565b92915050565b60006020828403121562000e785762000e776200130c565b5b600062000e888482850162000e48565b91505092915050565b62000e9c816200117a565b82525050565b600062000eaf82620010b5565b62000ebb8185620010c0565b935062000ecd818560208601620011e4565b62000ed88162001311565b840191505092915050565b600062000ef2603283620010d1565b915062000eff8262001322565b604082019050919050565b600062000f19601c83620010d1565b915062000f268262001371565b602082019050919050565b600062000f40602a83620010d1565b915062000f4d826200139a565b604082019050919050565b600062000f67602e83620010d1565b915062000f7482620013e9565b604082019050919050565b600062000f8e602083620010d1565b915062000f9b8262001438565b602082019050919050565b62000fb181620011da565b82525050565b600060808201905062000fce600083018762000e91565b62000fdd602083018662000e91565b62000fec604083018562000fa6565b818103606083015262001000818462000ea2565b905095945050505050565b60006020820190508181036000830152620010268162000ee3565b9050919050565b60006020820190508181036000830152620010488162000f0a565b9050919050565b600060208201905081810360008301526200106a8162000f31565b9050919050565b600060208201905081810360008301526200108c8162000f58565b9050919050565b60006020820190508181036000830152620010ae8162000f7f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620010ef82620011da565b9150620010fc83620011da565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001134576200113362001250565b5b828201905092915050565b60006200114c82620011da565b91506200115983620011da565b9250828210156200116f576200116e62001250565b5b828203905092915050565b60006200118782620011ba565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562001204578082015181840152602081019050620011e7565b8381111562001214576000848401525b50505050565b600060028204905060018216806200123357607f821691505b602082108114156200124a57620012496200127f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6200146c816200118e565b81146200147857600080fd5b50565b613cfb806200148b6000396000f3fe60806040526004361061014b5760003560e01c8063853828b6116100b6578063a14481941161006f578063a14481941461048a578063a22cb465146104b3578063b88d4fde146104dc578063c87b56dd14610505578063e985e9c514610542578063f2fde38b1461057f5761014b565b8063853828b6146103a657806387371f4d146103b05780638da5cb5b146103e057806391b7f5ed1461040b57806395d89b411461043457806398d5fdca1461045f5761014b565b80632f745c59116101085780632f745c591461027257806342842e0e146102af5780634f6ccce7146102d85780636352211e1461031557806370a0823114610352578063715018a61461038f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906129e7565b6105a8565b6040516101849190612f14565b60405180910390f35b34801561019957600080fd5b506101a26105ba565b6040516101af9190612f2f565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612a8a565b61064c565b6040516101ec9190612ead565b60405180910390f35b34801561020157600080fd5b5061021c600480360381019061021791906129a7565b6106d1565b005b34801561022a57600080fd5b506102336107e9565b6040516102409190613211565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190612891565b6107f6565b005b34801561027e57600080fd5b50610299600480360381019061029491906129a7565b610856565b6040516102a69190613211565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d19190612891565b6108fb565b005b3480156102e457600080fd5b506102ff60048036038101906102fa9190612a8a565b61091b565b60405161030c9190613211565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612a8a565b61098c565b6040516103499190612ead565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190612824565b610a3e565b6040516103869190613211565b60405180910390f35b34801561039b57600080fd5b506103a4610af6565b005b6103ae610b7e565b005b6103ca60048036038101906103c59190612a41565b610c62565b6040516103d79190612f14565b60405180910390f35b3480156103ec57600080fd5b506103f5610d33565b6040516104029190612ead565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190612a8a565b610d5d565b005b34801561044057600080fd5b50610449610e3d565b6040516104569190612f2f565b60405180910390f35b34801561046b57600080fd5b50610474610ecf565b6040516104819190613211565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac91906129a7565b610ed9565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612967565b610f63565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906128e4565b6110e4565b005b34801561051157600080fd5b5061052c60048036038101906105279190612a8a565b611146565b6040516105399190612f2f565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190612851565b611158565b6040516105769190612f14565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190612824565b6111ec565b005b60006105b382611410565b9050919050565b6060600080546105c990613467565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590613467565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050905090565b60006106578261148a565b610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906130f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106dc8261098c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490613191565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661076c6114f6565b73ffffffffffffffffffffffffffffffffffffffff16148061079b575061079a816107956114f6565b611158565b5b6107da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d190613031565b60405180910390fd5b6107e483836114fe565b505050565b6000600880549050905090565b6108076108016114f6565b826115b7565b610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d906131d1565b60405180910390fd5b610851838383611695565b505050565b600061086183610a3e565b82106108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990612f51565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610916838383604051806020016040528060008152506110e4565b505050565b60006109256107e9565b8210610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d906131f1565b60405180910390fd5b6008828154811061097a57610979613600565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613071565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa690613051565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610afe6114f6565b73ffffffffffffffffffffffffffffffffffffffff16610b1c610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613111565b60405180910390fd5b610b7c60006118f1565b565b610b866114f6565b73ffffffffffffffffffffffffffffffffffffffff16610ba4610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190613111565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610c5f57600080fd5b50565b600080610c6d6107e9565b90506000600190506127118210610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613131565b60405180910390fd5b600c54341015610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf5906131b1565b60405180910390fd5b610d13338284610d0e91906132f6565b6119b7565b610d288183610d2291906132f6565b856119d5565b600192505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d656114f6565b73ffffffffffffffffffffffffffffffffffffffff16610d83610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd090613111565b60405180910390fd5b80600c81905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e3a57600080fd5b50565b606060018054610e4c90613467565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890613467565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b5050505050905090565b6000600c54905090565b610ee16114f6565b73ffffffffffffffffffffffffffffffffffffffff16610eff610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613111565b60405180910390fd5b610f5f82826119b7565b5050565b610f6b6114f6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090612ff1565b60405180910390fd5b8060056000610fe66114f6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110936114f6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110d89190612f14565b60405180910390a35050565b6110f56110ef6114f6565b836115b7565b611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b906131d1565b60405180910390fd5b61114084848484611a49565b50505050565b606061115182611aa5565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111f46114f6565b73ffffffffffffffffffffffffffffffffffffffff16611212610d33565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613111565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90612f91565b60405180910390fd5b6112e1816118f1565b50565b600080823b905060008111915050919050565b61130283838361140b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113455761134081611bf7565b611384565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611383576113828382611c40565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c7576113c281611dad565b611406565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611405576114048282611e7e565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611483575061148282611efd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115718361098c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115c28261148a565b611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890613011565b60405180910390fd5b600061160c8361098c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061167b57508373ffffffffffffffffffffffffffffffffffffffff166116638461064c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061168c575061168b8185611158565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116b58261098c565b73ffffffffffffffffffffffffffffffffffffffff161461170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290613151565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290612fd1565b60405180910390fd5b611786838383611fdf565b6117916000826114fe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e1919061337d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183891906132f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119d1828260405180602001604052806000815250611fef565b5050565b6119de8261148a565b611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490613091565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611a44929190612638565b505050565b611a54848484611695565b611a608484848461204a565b611a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9690612f71565b60405180910390fd5b50505050565b6060611ab08261148a565b611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae6906130d1565b60405180910390fd5b6000600a60008481526020019081526020016000208054611b0f90613467565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b90613467565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505090506000611b996121e1565b9050600081511415611baf578192505050611bf2565b600082511115611be4578082604051602001611bcc929190612e89565b60405160208183030381529060405292505050611bf2565b611bed846121f8565b925050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c4d84610a3e565b611c57919061337d565b9050600060076000848152602001908152602001600020549050818114611d3c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dc1919061337d565b9050600060096000848152602001908152602001600020549050600060088381548110611df157611df0613600565b5b906000526020600020015490508060088381548110611e1357611e12613600565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611e6257611e616135d1565b5b6001900381819060005260206000200160009055905550505050565b6000611e8983610a3e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fd85750611fd78261229f565b5b9050919050565b611fea8383836112f7565b505050565b611ff98383612309565b612006600084848461204a565b612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c90612f71565b60405180910390fd5b505050565b600061206b8473ffffffffffffffffffffffffffffffffffffffff166112e4565b156121d4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120946114f6565b8786866040518563ffffffff1660e01b81526004016120b69493929190612ec8565b602060405180830381600087803b1580156120d057600080fd5b505af192505050801561210157506040513d601f19601f820116820180604052508101906120fe9190612a14565b60015b612184573d8060008114612131576040519150601f19603f3d011682016040523d82523d6000602084013e612136565b606091505b5060008151141561217c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217390612f71565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121d9565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606122038261148a565b612242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223990613171565b60405180910390fd5b600061224c6121e1565b9050600081511161226c5760405180602001604052806000815250612297565b80612276846124d7565b604051602001612287929190612e89565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612370906130b1565b60405180910390fd5b6123828161148a565b156123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990612fb1565b60405180910390fd5b6123ce60008383611fdf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241e91906132f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6060600082141561251f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612633565b600082905060005b6000821461255157808061253a906134ca565b915050600a8261254a919061334c565b9150612527565b60008167ffffffffffffffff81111561256d5761256c61362f565b5b6040519080825280601f01601f19166020018201604052801561259f5781602001600182028036833780820191505090505b5090505b6000851461262c576001826125b8919061337d565b9150600a856125c79190613513565b60306125d391906132f6565b60f81b8183815181106125e9576125e8613600565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612625919061334c565b94506125a3565b8093505050505b919050565b82805461264490613467565b90600052602060002090601f01602090048101928261266657600085556126ad565b82601f1061267f57805160ff19168380011785556126ad565b828001600101855582156126ad579182015b828111156126ac578251825591602001919060010190612691565b5b5090506126ba91906126be565b5090565b5b808211156126d75760008160009055506001016126bf565b5090565b60006126ee6126e984613251565b61322c565b90508281526020810184848401111561270a57612709613663565b5b612715848285613425565b509392505050565b600061273061272b84613282565b61322c565b90508281526020810184848401111561274c5761274b613663565b5b612757848285613425565b509392505050565b60008135905061276e81613c69565b92915050565b60008135905061278381613c80565b92915050565b60008135905061279881613c97565b92915050565b6000815190506127ad81613c97565b92915050565b600082601f8301126127c8576127c761365e565b5b81356127d88482602086016126db565b91505092915050565b600082601f8301126127f6576127f561365e565b5b813561280684826020860161271d565b91505092915050565b60008135905061281e81613cae565b92915050565b60006020828403121561283a5761283961366d565b5b60006128488482850161275f565b91505092915050565b600080604083850312156128685761286761366d565b5b60006128768582860161275f565b92505060206128878582860161275f565b9150509250929050565b6000806000606084860312156128aa576128a961366d565b5b60006128b88682870161275f565b93505060206128c98682870161275f565b92505060406128da8682870161280f565b9150509250925092565b600080600080608085870312156128fe576128fd61366d565b5b600061290c8782880161275f565b945050602061291d8782880161275f565b935050604061292e8782880161280f565b925050606085013567ffffffffffffffff81111561294f5761294e613668565b5b61295b878288016127b3565b91505092959194509250565b6000806040838503121561297e5761297d61366d565b5b600061298c8582860161275f565b925050602061299d85828601612774565b9150509250929050565b600080604083850312156129be576129bd61366d565b5b60006129cc8582860161275f565b92505060206129dd8582860161280f565b9150509250929050565b6000602082840312156129fd576129fc61366d565b5b6000612a0b84828501612789565b91505092915050565b600060208284031215612a2a57612a2961366d565b5b6000612a388482850161279e565b91505092915050565b600060208284031215612a5757612a5661366d565b5b600082013567ffffffffffffffff811115612a7557612a74613668565b5b612a81848285016127e1565b91505092915050565b600060208284031215612aa057612a9f61366d565b5b6000612aae8482850161280f565b91505092915050565b612ac0816133b1565b82525050565b612acf816133c3565b82525050565b6000612ae0826132b3565b612aea81856132c9565b9350612afa818560208601613434565b612b0381613672565b840191505092915050565b6000612b19826132be565b612b2381856132da565b9350612b33818560208601613434565b612b3c81613672565b840191505092915050565b6000612b52826132be565b612b5c81856132eb565b9350612b6c818560208601613434565b80840191505092915050565b6000612b85602b836132da565b9150612b9082613683565b604082019050919050565b6000612ba86032836132da565b9150612bb3826136d2565b604082019050919050565b6000612bcb6026836132da565b9150612bd682613721565b604082019050919050565b6000612bee601c836132da565b9150612bf982613770565b602082019050919050565b6000612c116024836132da565b9150612c1c82613799565b604082019050919050565b6000612c346019836132da565b9150612c3f826137e8565b602082019050919050565b6000612c57602c836132da565b9150612c6282613811565b604082019050919050565b6000612c7a6038836132da565b9150612c8582613860565b604082019050919050565b6000612c9d602a836132da565b9150612ca8826138af565b604082019050919050565b6000612cc06029836132da565b9150612ccb826138fe565b604082019050919050565b6000612ce3602e836132da565b9150612cee8261394d565b604082019050919050565b6000612d066020836132da565b9150612d118261399c565b602082019050919050565b6000612d296031836132da565b9150612d34826139c5565b604082019050919050565b6000612d4c602c836132da565b9150612d5782613a14565b604082019050919050565b6000612d6f6020836132da565b9150612d7a82613a63565b602082019050919050565b6000612d92601d836132da565b9150612d9d82613a8c565b602082019050919050565b6000612db56029836132da565b9150612dc082613ab5565b604082019050919050565b6000612dd8602f836132da565b9150612de382613b04565b604082019050919050565b6000612dfb6021836132da565b9150612e0682613b53565b604082019050919050565b6000612e1e6019836132da565b9150612e2982613ba2565b602082019050919050565b6000612e416031836132da565b9150612e4c82613bcb565b604082019050919050565b6000612e64602c836132da565b9150612e6f82613c1a565b604082019050919050565b612e838161341b565b82525050565b6000612e958285612b47565b9150612ea18284612b47565b91508190509392505050565b6000602082019050612ec26000830184612ab7565b92915050565b6000608082019050612edd6000830187612ab7565b612eea6020830186612ab7565b612ef76040830185612e7a565b8181036060830152612f098184612ad5565b905095945050505050565b6000602082019050612f296000830184612ac6565b92915050565b60006020820190508181036000830152612f498184612b0e565b905092915050565b60006020820190508181036000830152612f6a81612b78565b9050919050565b60006020820190508181036000830152612f8a81612b9b565b9050919050565b60006020820190508181036000830152612faa81612bbe565b9050919050565b60006020820190508181036000830152612fca81612be1565b9050919050565b60006020820190508181036000830152612fea81612c04565b9050919050565b6000602082019050818103600083015261300a81612c27565b9050919050565b6000602082019050818103600083015261302a81612c4a565b9050919050565b6000602082019050818103600083015261304a81612c6d565b9050919050565b6000602082019050818103600083015261306a81612c90565b9050919050565b6000602082019050818103600083015261308a81612cb3565b9050919050565b600060208201905081810360008301526130aa81612cd6565b9050919050565b600060208201905081810360008301526130ca81612cf9565b9050919050565b600060208201905081810360008301526130ea81612d1c565b9050919050565b6000602082019050818103600083015261310a81612d3f565b9050919050565b6000602082019050818103600083015261312a81612d62565b9050919050565b6000602082019050818103600083015261314a81612d85565b9050919050565b6000602082019050818103600083015261316a81612da8565b9050919050565b6000602082019050818103600083015261318a81612dcb565b9050919050565b600060208201905081810360008301526131aa81612dee565b9050919050565b600060208201905081810360008301526131ca81612e11565b9050919050565b600060208201905081810360008301526131ea81612e34565b9050919050565b6000602082019050818103600083015261320a81612e57565b9050919050565b60006020820190506132266000830184612e7a565b92915050565b6000613236613247565b90506132428282613499565b919050565b6000604051905090565b600067ffffffffffffffff82111561326c5761326b61362f565b5b61327582613672565b9050602081019050919050565b600067ffffffffffffffff82111561329d5761329c61362f565b5b6132a682613672565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133018261341b565b915061330c8361341b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561334157613340613544565b5b828201905092915050565b60006133578261341b565b91506133628361341b565b92508261337257613371613573565b5b828204905092915050565b60006133888261341b565b91506133938361341b565b9250828210156133a6576133a5613544565b5b828203905092915050565b60006133bc826133fb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613452578082015181840152602081019050613437565b83811115613461576000848401525b50505050565b6000600282049050600182168061347f57607f821691505b60208210811415613493576134926135a2565b5b50919050565b6134a282613672565b810181811067ffffffffffffffff821117156134c1576134c061362f565b5b80604052505050565b60006134d58261341b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561350857613507613544565b5b600182019050919050565b600061351e8261341b565b91506135298361341b565b92508261353957613538613573565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d6178696d756d2050756e6b696e20737570706c79000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613c72816133b1565b8114613c7d57600080fd5b50565b613c89816133c3565b8114613c9457600080fd5b50565b613ca0816133cf565b8114613cab57600080fd5b50565b613cb78161341b565b8114613cc257600080fd5b5056fea2646970667358221220c59895c9e1e448612e04641ac3db70a4edeab80c13760a9f5dafe26fa48a9bee64736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d565074396b616875595344584651724451457437336f5056356d59586e53614233515566397251384a385a79
Deployed Bytecode
0x60806040526004361061014b5760003560e01c8063853828b6116100b6578063a14481941161006f578063a14481941461048a578063a22cb465146104b3578063b88d4fde146104dc578063c87b56dd14610505578063e985e9c514610542578063f2fde38b1461057f5761014b565b8063853828b6146103a657806387371f4d146103b05780638da5cb5b146103e057806391b7f5ed1461040b57806395d89b411461043457806398d5fdca1461045f5761014b565b80632f745c59116101085780632f745c591461027257806342842e0e146102af5780634f6ccce7146102d85780636352211e1461031557806370a0823114610352578063715018a61461038f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906129e7565b6105a8565b6040516101849190612f14565b60405180910390f35b34801561019957600080fd5b506101a26105ba565b6040516101af9190612f2f565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612a8a565b61064c565b6040516101ec9190612ead565b60405180910390f35b34801561020157600080fd5b5061021c600480360381019061021791906129a7565b6106d1565b005b34801561022a57600080fd5b506102336107e9565b6040516102409190613211565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b9190612891565b6107f6565b005b34801561027e57600080fd5b50610299600480360381019061029491906129a7565b610856565b6040516102a69190613211565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d19190612891565b6108fb565b005b3480156102e457600080fd5b506102ff60048036038101906102fa9190612a8a565b61091b565b60405161030c9190613211565b60405180910390f35b34801561032157600080fd5b5061033c60048036038101906103379190612a8a565b61098c565b6040516103499190612ead565b60405180910390f35b34801561035e57600080fd5b5061037960048036038101906103749190612824565b610a3e565b6040516103869190613211565b60405180910390f35b34801561039b57600080fd5b506103a4610af6565b005b6103ae610b7e565b005b6103ca60048036038101906103c59190612a41565b610c62565b6040516103d79190612f14565b60405180910390f35b3480156103ec57600080fd5b506103f5610d33565b6040516104029190612ead565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190612a8a565b610d5d565b005b34801561044057600080fd5b50610449610e3d565b6040516104569190612f2f565b60405180910390f35b34801561046b57600080fd5b50610474610ecf565b6040516104819190613211565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac91906129a7565b610ed9565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612967565b610f63565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906128e4565b6110e4565b005b34801561051157600080fd5b5061052c60048036038101906105279190612a8a565b611146565b6040516105399190612f2f565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190612851565b611158565b6040516105769190612f14565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190612824565b6111ec565b005b60006105b382611410565b9050919050565b6060600080546105c990613467565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590613467565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050905090565b60006106578261148a565b610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d906130f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106dc8261098c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490613191565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661076c6114f6565b73ffffffffffffffffffffffffffffffffffffffff16148061079b575061079a816107956114f6565b611158565b5b6107da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d190613031565b60405180910390fd5b6107e483836114fe565b505050565b6000600880549050905090565b6108076108016114f6565b826115b7565b610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d906131d1565b60405180910390fd5b610851838383611695565b505050565b600061086183610a3e565b82106108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089990612f51565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610916838383604051806020016040528060008152506110e4565b505050565b60006109256107e9565b8210610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d906131f1565b60405180910390fd5b6008828154811061097a57610979613600565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613071565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa690613051565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610afe6114f6565b73ffffffffffffffffffffffffffffffffffffffff16610b1c610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613111565b60405180910390fd5b610b7c60006118f1565b565b610b866114f6565b73ffffffffffffffffffffffffffffffffffffffff16610ba4610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190613111565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610c5f57600080fd5b50565b600080610c6d6107e9565b90506000600190506127118210610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613131565b60405180910390fd5b600c54341015610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf5906131b1565b60405180910390fd5b610d13338284610d0e91906132f6565b6119b7565b610d288183610d2291906132f6565b856119d5565b600192505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d656114f6565b73ffffffffffffffffffffffffffffffffffffffff16610d83610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd090613111565b60405180910390fd5b80600c81905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e3a57600080fd5b50565b606060018054610e4c90613467565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890613467565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b5050505050905090565b6000600c54905090565b610ee16114f6565b73ffffffffffffffffffffffffffffffffffffffff16610eff610d33565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613111565b60405180910390fd5b610f5f82826119b7565b5050565b610f6b6114f6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090612ff1565b60405180910390fd5b8060056000610fe66114f6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110936114f6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110d89190612f14565b60405180910390a35050565b6110f56110ef6114f6565b836115b7565b611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b906131d1565b60405180910390fd5b61114084848484611a49565b50505050565b606061115182611aa5565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111f46114f6565b73ffffffffffffffffffffffffffffffffffffffff16611212610d33565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613111565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90612f91565b60405180910390fd5b6112e1816118f1565b50565b600080823b905060008111915050919050565b61130283838361140b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113455761134081611bf7565b611384565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611383576113828382611c40565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c7576113c281611dad565b611406565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611405576114048282611e7e565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611483575061148282611efd565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115718361098c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115c28261148a565b611601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f890613011565b60405180910390fd5b600061160c8361098c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061167b57508373ffffffffffffffffffffffffffffffffffffffff166116638461064c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061168c575061168b8185611158565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116b58261098c565b73ffffffffffffffffffffffffffffffffffffffff161461170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290613151565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290612fd1565b60405180910390fd5b611786838383611fdf565b6117916000826114fe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e1919061337d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183891906132f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119d1828260405180602001604052806000815250611fef565b5050565b6119de8261148a565b611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490613091565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190611a44929190612638565b505050565b611a54848484611695565b611a608484848461204a565b611a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9690612f71565b60405180910390fd5b50505050565b6060611ab08261148a565b611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae6906130d1565b60405180910390fd5b6000600a60008481526020019081526020016000208054611b0f90613467565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b90613467565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505090506000611b996121e1565b9050600081511415611baf578192505050611bf2565b600082511115611be4578082604051602001611bcc929190612e89565b60405160208183030381529060405292505050611bf2565b611bed846121f8565b925050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c4d84610a3e565b611c57919061337d565b9050600060076000848152602001908152602001600020549050818114611d3c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dc1919061337d565b9050600060096000848152602001908152602001600020549050600060088381548110611df157611df0613600565b5b906000526020600020015490508060088381548110611e1357611e12613600565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611e6257611e616135d1565b5b6001900381819060005260206000200160009055905550505050565b6000611e8983610a3e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fc857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fd85750611fd78261229f565b5b9050919050565b611fea8383836112f7565b505050565b611ff98383612309565b612006600084848461204a565b612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c90612f71565b60405180910390fd5b505050565b600061206b8473ffffffffffffffffffffffffffffffffffffffff166112e4565b156121d4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120946114f6565b8786866040518563ffffffff1660e01b81526004016120b69493929190612ec8565b602060405180830381600087803b1580156120d057600080fd5b505af192505050801561210157506040513d601f19601f820116820180604052508101906120fe9190612a14565b60015b612184573d8060008114612131576040519150601f19603f3d011682016040523d82523d6000602084013e612136565b606091505b5060008151141561217c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217390612f71565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121d9565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606122038261148a565b612242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223990613171565b60405180910390fd5b600061224c6121e1565b9050600081511161226c5760405180602001604052806000815250612297565b80612276846124d7565b604051602001612287929190612e89565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612370906130b1565b60405180910390fd5b6123828161148a565b156123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990612fb1565b60405180910390fd5b6123ce60008383611fdf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241e91906132f6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6060600082141561251f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612633565b600082905060005b6000821461255157808061253a906134ca565b915050600a8261254a919061334c565b9150612527565b60008167ffffffffffffffff81111561256d5761256c61362f565b5b6040519080825280601f01601f19166020018201604052801561259f5781602001600182028036833780820191505090505b5090505b6000851461262c576001826125b8919061337d565b9150600a856125c79190613513565b60306125d391906132f6565b60f81b8183815181106125e9576125e8613600565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612625919061334c565b94506125a3565b8093505050505b919050565b82805461264490613467565b90600052602060002090601f01602090048101928261266657600085556126ad565b82601f1061267f57805160ff19168380011785556126ad565b828001600101855582156126ad579182015b828111156126ac578251825591602001919060010190612691565b5b5090506126ba91906126be565b5090565b5b808211156126d75760008160009055506001016126bf565b5090565b60006126ee6126e984613251565b61322c565b90508281526020810184848401111561270a57612709613663565b5b612715848285613425565b509392505050565b600061273061272b84613282565b61322c565b90508281526020810184848401111561274c5761274b613663565b5b612757848285613425565b509392505050565b60008135905061276e81613c69565b92915050565b60008135905061278381613c80565b92915050565b60008135905061279881613c97565b92915050565b6000815190506127ad81613c97565b92915050565b600082601f8301126127c8576127c761365e565b5b81356127d88482602086016126db565b91505092915050565b600082601f8301126127f6576127f561365e565b5b813561280684826020860161271d565b91505092915050565b60008135905061281e81613cae565b92915050565b60006020828403121561283a5761283961366d565b5b60006128488482850161275f565b91505092915050565b600080604083850312156128685761286761366d565b5b60006128768582860161275f565b92505060206128878582860161275f565b9150509250929050565b6000806000606084860312156128aa576128a961366d565b5b60006128b88682870161275f565b93505060206128c98682870161275f565b92505060406128da8682870161280f565b9150509250925092565b600080600080608085870312156128fe576128fd61366d565b5b600061290c8782880161275f565b945050602061291d8782880161275f565b935050604061292e8782880161280f565b925050606085013567ffffffffffffffff81111561294f5761294e613668565b5b61295b878288016127b3565b91505092959194509250565b6000806040838503121561297e5761297d61366d565b5b600061298c8582860161275f565b925050602061299d85828601612774565b9150509250929050565b600080604083850312156129be576129bd61366d565b5b60006129cc8582860161275f565b92505060206129dd8582860161280f565b9150509250929050565b6000602082840312156129fd576129fc61366d565b5b6000612a0b84828501612789565b91505092915050565b600060208284031215612a2a57612a2961366d565b5b6000612a388482850161279e565b91505092915050565b600060208284031215612a5757612a5661366d565b5b600082013567ffffffffffffffff811115612a7557612a74613668565b5b612a81848285016127e1565b91505092915050565b600060208284031215612aa057612a9f61366d565b5b6000612aae8482850161280f565b91505092915050565b612ac0816133b1565b82525050565b612acf816133c3565b82525050565b6000612ae0826132b3565b612aea81856132c9565b9350612afa818560208601613434565b612b0381613672565b840191505092915050565b6000612b19826132be565b612b2381856132da565b9350612b33818560208601613434565b612b3c81613672565b840191505092915050565b6000612b52826132be565b612b5c81856132eb565b9350612b6c818560208601613434565b80840191505092915050565b6000612b85602b836132da565b9150612b9082613683565b604082019050919050565b6000612ba86032836132da565b9150612bb3826136d2565b604082019050919050565b6000612bcb6026836132da565b9150612bd682613721565b604082019050919050565b6000612bee601c836132da565b9150612bf982613770565b602082019050919050565b6000612c116024836132da565b9150612c1c82613799565b604082019050919050565b6000612c346019836132da565b9150612c3f826137e8565b602082019050919050565b6000612c57602c836132da565b9150612c6282613811565b604082019050919050565b6000612c7a6038836132da565b9150612c8582613860565b604082019050919050565b6000612c9d602a836132da565b9150612ca8826138af565b604082019050919050565b6000612cc06029836132da565b9150612ccb826138fe565b604082019050919050565b6000612ce3602e836132da565b9150612cee8261394d565b604082019050919050565b6000612d066020836132da565b9150612d118261399c565b602082019050919050565b6000612d296031836132da565b9150612d34826139c5565b604082019050919050565b6000612d4c602c836132da565b9150612d5782613a14565b604082019050919050565b6000612d6f6020836132da565b9150612d7a82613a63565b602082019050919050565b6000612d92601d836132da565b9150612d9d82613a8c565b602082019050919050565b6000612db56029836132da565b9150612dc082613ab5565b604082019050919050565b6000612dd8602f836132da565b9150612de382613b04565b604082019050919050565b6000612dfb6021836132da565b9150612e0682613b53565b604082019050919050565b6000612e1e6019836132da565b9150612e2982613ba2565b602082019050919050565b6000612e416031836132da565b9150612e4c82613bcb565b604082019050919050565b6000612e64602c836132da565b9150612e6f82613c1a565b604082019050919050565b612e838161341b565b82525050565b6000612e958285612b47565b9150612ea18284612b47565b91508190509392505050565b6000602082019050612ec26000830184612ab7565b92915050565b6000608082019050612edd6000830187612ab7565b612eea6020830186612ab7565b612ef76040830185612e7a565b8181036060830152612f098184612ad5565b905095945050505050565b6000602082019050612f296000830184612ac6565b92915050565b60006020820190508181036000830152612f498184612b0e565b905092915050565b60006020820190508181036000830152612f6a81612b78565b9050919050565b60006020820190508181036000830152612f8a81612b9b565b9050919050565b60006020820190508181036000830152612faa81612bbe565b9050919050565b60006020820190508181036000830152612fca81612be1565b9050919050565b60006020820190508181036000830152612fea81612c04565b9050919050565b6000602082019050818103600083015261300a81612c27565b9050919050565b6000602082019050818103600083015261302a81612c4a565b9050919050565b6000602082019050818103600083015261304a81612c6d565b9050919050565b6000602082019050818103600083015261306a81612c90565b9050919050565b6000602082019050818103600083015261308a81612cb3565b9050919050565b600060208201905081810360008301526130aa81612cd6565b9050919050565b600060208201905081810360008301526130ca81612cf9565b9050919050565b600060208201905081810360008301526130ea81612d1c565b9050919050565b6000602082019050818103600083015261310a81612d3f565b9050919050565b6000602082019050818103600083015261312a81612d62565b9050919050565b6000602082019050818103600083015261314a81612d85565b9050919050565b6000602082019050818103600083015261316a81612da8565b9050919050565b6000602082019050818103600083015261318a81612dcb565b9050919050565b600060208201905081810360008301526131aa81612dee565b9050919050565b600060208201905081810360008301526131ca81612e11565b9050919050565b600060208201905081810360008301526131ea81612e34565b9050919050565b6000602082019050818103600083015261320a81612e57565b9050919050565b60006020820190506132266000830184612e7a565b92915050565b6000613236613247565b90506132428282613499565b919050565b6000604051905090565b600067ffffffffffffffff82111561326c5761326b61362f565b5b61327582613672565b9050602081019050919050565b600067ffffffffffffffff82111561329d5761329c61362f565b5b6132a682613672565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133018261341b565b915061330c8361341b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561334157613340613544565b5b828201905092915050565b60006133578261341b565b91506133628361341b565b92508261337257613371613573565b5b828204905092915050565b60006133888261341b565b91506133938361341b565b9250828210156133a6576133a5613544565b5b828203905092915050565b60006133bc826133fb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613452578082015181840152602081019050613437565b83811115613461576000848401525b50505050565b6000600282049050600182168061347f57607f821691505b60208210811415613493576134926135a2565b5b50919050565b6134a282613672565b810181811067ffffffffffffffff821117156134c1576134c061362f565b5b80604052505050565b60006134d58261341b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561350857613507613544565b5b600182019050919050565b600061351e8261341b565b91506135298361341b565b92508261353957613538613573565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d6178696d756d2050756e6b696e20737570706c79000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613c72816133b1565b8114613c7d57600080fd5b50565b613c89816133c3565b8114613c9457600080fd5b50565b613ca0816133cf565b8114613cab57600080fd5b50565b613cb78161341b565b8114613cc257600080fd5b5056fea2646970667358221220c59895c9e1e448612e04641ac3db70a4edeab80c13760a9f5dafe26fa48a9bee64736f6c63430008070033
Deployed Bytecode Sourcemap
45103:2606:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47494:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24859:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26418:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25941:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39531:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27308:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39199:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27718:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39721:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24553:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24283:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4558:94;;;;;;;;;;;;;:::i;:::-;;46670:160;;;:::i;:::-;;45919:424;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3907:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46429:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25028:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46581:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46838:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26711:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27974:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47163:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27077:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4807:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47494:212;47633:4;47662:36;47686:11;47662:23;:36::i;:::-;47655:43;;47494:212;;;:::o;24859:100::-;24913:13;24946:5;24939:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24859:100;:::o;26418:221::-;26494:7;26522:16;26530:7;26522;:16::i;:::-;26514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26607:15;:24;26623:7;26607:24;;;;;;;;;;;;;;;;;;;;;26600:31;;26418:221;;;:::o;25941:411::-;26022:13;26038:23;26053:7;26038:14;:23::i;:::-;26022:39;;26086:5;26080:11;;:2;:11;;;;26072:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26180:5;26164:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26189:37;26206:5;26213:12;:10;:12::i;:::-;26189:16;:37::i;:::-;26164:62;26142:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26323:21;26332:2;26336:7;26323:8;:21::i;:::-;26011:341;25941:411;;:::o;39531:113::-;39592:7;39619:10;:17;;;;39612:24;;39531:113;:::o;27308:339::-;27503:41;27522:12;:10;:12::i;:::-;27536:7;27503:18;:41::i;:::-;27495:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27611:28;27621:4;27627:2;27631:7;27611:9;:28::i;:::-;27308:339;;;:::o;39199:256::-;39296:7;39332:23;39349:5;39332:16;:23::i;:::-;39324:5;:31;39316:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39421:12;:19;39434:5;39421:19;;;;;;;;;;;;;;;:26;39441:5;39421:26;;;;;;;;;;;;39414:33;;39199:256;;;;:::o;27718:185::-;27856:39;27873:4;27879:2;27883:7;27856:39;;;;;;;;;;;;:16;:39::i;:::-;27718:185;;;:::o;39721:233::-;39796:7;39832:30;:28;:30::i;:::-;39824:5;:38;39816:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39929:10;39940:5;39929:17;;;;;;;;:::i;:::-;;;;;;;;;;39922:24;;39721:233;;;:::o;24553:239::-;24625:7;24645:13;24661:7;:16;24669:7;24661:16;;;;;;;;;;;;;;;;;;;;;24645:32;;24713:1;24696:19;;:5;:19;;;;24688:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24779:5;24772:12;;;24553:239;;;:::o;24283:208::-;24355:7;24400:1;24383:19;;:5;:19;;;;24375:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24467:9;:16;24477:5;24467:16;;;;;;;;;;;;;;;;24460:23;;24283:208;;;:::o;4558:94::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4623:21:::1;4641:1;4623:9;:21::i;:::-;4558:94::o:0;46670:160::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46729:13:::1;46745:21;46729:37;;46793:15;;;;;;;;;;;46785:29;;:36;46815:5;46785:36;;;;;;;;;;;;;;;;;;;;;;;46777:45;;;::::0;::::1;;46718:112;46670:160::o:0;45919:424::-;45994:4;46011:14;46028:13;:11;:13::i;:::-;46011:30;;46052:9;46064:1;46052:13;;46094:5;46085:6;:14;46076:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46172:6;;46159:9;:19;;46150:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46232:34;46243:10;46264:1;46255:6;:10;;;;:::i;:::-;46232:9;:34::i;:::-;46277:36;46300:1;46291:6;:10;;;;:::i;:::-;46303:9;46277:12;:36::i;:::-;46331:4;46324:11;;;;45919:424;;;:::o;3907:87::-;3953:7;3980:6;;;;;;;;;;;3973:13;;3907:87;:::o;46429:144::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46505:9:::1;46496:6;:18;;;;46548:15;;;;;;;;;;;46534:29;;:10;:29;;;46525:40;;;::::0;::::1;;46429:144:::0;:::o;25028:104::-;25084:13;25117:7;25110:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25028:104;:::o;46581:81::-;46622:7;46648:6;;46641:13;;46581:81;:::o;46838:105::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46913:22:::1;46923:2;46927:7;46913:9;:22::i;:::-;46838:105:::0;;:::o;26711:295::-;26826:12;:10;:12::i;:::-;26814:24;;:8;:24;;;;26806:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26926:8;26881:18;:32;26900:12;:10;:12::i;:::-;26881:32;;;;;;;;;;;;;;;:42;26914:8;26881:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26979:8;26950:48;;26965:12;:10;:12::i;:::-;26950:48;;;26989:8;26950:48;;;;;;:::i;:::-;;;;;;;;26711:295;;:::o;27974:328::-;28149:41;28168:12;:10;:12::i;:::-;28182:7;28149:18;:41::i;:::-;28141:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28255:39;28269:4;28275:2;28279:7;28288:5;28255:13;:39::i;:::-;27974:328;;;;:::o;47163:196::-;47290:13;47328:23;47343:7;47328:14;:23::i;:::-;47321:30;;47163:196;;;:::o;27077:164::-;27174:4;27198:18;:25;27217:5;27198:25;;;;;;;;;;;;;;;:35;27224:8;27198:35;;;;;;;;;;;;;;;;;;;;;;;;;27191:42;;27077:164;;;;:::o;4807:192::-;4138:12;:10;:12::i;:::-;4127:23;;:7;:5;:7::i;:::-;:23;;;4119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4916:1:::1;4896:22;;:8;:22;;;;4888:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4972:19;4982:8;4972:9;:19::i;:::-;4807:192:::0;:::o;5953:387::-;6013:4;6221:12;6288:7;6276:20;6268:28;;6331:1;6324:4;:8;6317:15;;;5953:387;;;:::o;40567:589::-;40711:45;40738:4;40744:2;40748:7;40711:26;:45::i;:::-;40789:1;40773:18;;:4;:18;;;40769:187;;;40808:40;40840:7;40808:31;:40::i;:::-;40769:187;;;40878:2;40870:10;;:4;:10;;;40866:90;;40897:47;40930:4;40936:7;40897:32;:47::i;:::-;40866:90;40769:187;40984:1;40970:16;;:2;:16;;;40966:183;;;41003:45;41040:7;41003:36;:45::i;:::-;40966:183;;;41076:4;41070:10;;:2;:10;;;41066:83;;41097:40;41125:2;41129:7;41097:27;:40::i;:::-;41066:83;40966:183;40567:589;;;:::o;35904:126::-;;;;:::o;38891:224::-;38993:4;39032:35;39017:50;;;:11;:50;;;;:90;;;;39071:36;39095:11;39071:23;:36::i;:::-;39017:90;39010:97;;38891:224;;;:::o;29812:127::-;29877:4;29929:1;29901:30;;:7;:16;29909:7;29901:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29894:37;;29812:127;;;:::o;2695:98::-;2748:7;2775:10;2768:17;;2695:98;:::o;33794:174::-;33896:2;33869:15;:24;33885:7;33869:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33952:7;33948:2;33914:46;;33923:23;33938:7;33923:14;:23::i;:::-;33914:46;;;;;;;;;;;;33794:174;;:::o;30106:348::-;30199:4;30224:16;30232:7;30224;:16::i;:::-;30216:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30300:13;30316:23;30331:7;30316:14;:23::i;:::-;30300:39;;30369:5;30358:16;;:7;:16;;;:51;;;;30402:7;30378:31;;:20;30390:7;30378:11;:20::i;:::-;:31;;;30358:51;:87;;;;30413:32;30430:5;30437:7;30413:16;:32::i;:::-;30358:87;30350:96;;;30106:348;;;;:::o;33098:578::-;33257:4;33230:31;;:23;33245:7;33230:14;:23::i;:::-;:31;;;33222:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33340:1;33326:16;;:2;:16;;;;33318:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33396:39;33417:4;33423:2;33427:7;33396:20;:39::i;:::-;33500:29;33517:1;33521:7;33500:8;:29::i;:::-;33561:1;33542:9;:15;33552:4;33542:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33590:1;33573:9;:13;33583:2;33573:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33621:2;33602:7;:16;33610:7;33602:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33660:7;33656:2;33641:27;;33650:4;33641:27;;;;;;;;;;;;33098:578;;;:::o;5007:173::-;5063:16;5082:6;;;;;;;;;;;5063:25;;5108:8;5099:6;;:17;;;;;;;;;;;;;;;;;;5163:8;5132:40;;5153:8;5132:40;;;;;;;;;;;;5052:128;5007:173;:::o;30796:110::-;30872:26;30882:2;30886:7;30872:26;;;;;;;;;;;;:9;:26::i;:::-;30796:110;;:::o;37302:217::-;37402:16;37410:7;37402;:16::i;:::-;37394:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37502:9;37480:10;:19;37491:7;37480:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;37302:217;;:::o;29184:315::-;29341:28;29351:4;29357:2;29361:7;29341:9;:28::i;:::-;29388:48;29411:4;29417:2;29421:7;29430:5;29388:22;:48::i;:::-;29380:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29184:315;;;;:::o;36467:679::-;36540:13;36574:16;36582:7;36574;:16::i;:::-;36566:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;36657:23;36683:10;:19;36694:7;36683:19;;;;;;;;;;;36657:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36713:18;36734:10;:8;:10::i;:::-;36713:31;;36842:1;36826:4;36820:18;:23;36816:72;;;36867:9;36860:16;;;;;;36816:72;37018:1;36998:9;36992:23;:27;36988:108;;;37067:4;37073:9;37050:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37036:48;;;;;;36988:108;37115:23;37130:7;37115:14;:23::i;:::-;37108:30;;;;36467:679;;;;:::o;41879:164::-;41983:10;:17;;;;41956:15;:24;41972:7;41956:24;;;;;;;;;;;:44;;;;42011:10;42027:7;42011:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41879:164;:::o;42670:988::-;42936:22;42986:1;42961:22;42978:4;42961:16;:22::i;:::-;:26;;;;:::i;:::-;42936:51;;42998:18;43019:17;:26;43037:7;43019:26;;;;;;;;;;;;42998:47;;43166:14;43152:10;:28;43148:328;;43197:19;43219:12;:18;43232:4;43219:18;;;;;;;;;;;;;;;:34;43238:14;43219:34;;;;;;;;;;;;43197:56;;43303:11;43270:12;:18;43283:4;43270:18;;;;;;;;;;;;;;;:30;43289:10;43270:30;;;;;;;;;;;:44;;;;43420:10;43387:17;:30;43405:11;43387:30;;;;;;;;;;;:43;;;;43182:294;43148:328;43572:17;:26;43590:7;43572:26;;;;;;;;;;;43565:33;;;43616:12;:18;43629:4;43616:18;;;;;;;;;;;;;;;:34;43635:14;43616:34;;;;;;;;;;;43609:41;;;42751:907;;42670:988;;:::o;43953:1079::-;44206:22;44251:1;44231:10;:17;;;;:21;;;;:::i;:::-;44206:46;;44263:18;44284:15;:24;44300:7;44284:24;;;;;;;;;;;;44263:45;;44635:19;44657:10;44668:14;44657:26;;;;;;;;:::i;:::-;;;;;;;;;;44635:48;;44721:11;44696:10;44707;44696:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44832:10;44801:15;:28;44817:11;44801:28;;;;;;;;;;;:41;;;;44973:15;:24;44989:7;44973:24;;;;;;;;;;;44966:31;;;45008:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44024:1008;;;43953:1079;:::o;41457:221::-;41542:14;41559:20;41576:2;41559:16;:20::i;:::-;41542:37;;41617:7;41590:12;:16;41603:2;41590:16;;;;;;;;;;;;;;;:24;41607:6;41590:24;;;;;;;;;;;:34;;;;41664:6;41635:17;:26;41653:7;41635:26;;;;;;;;;;;:35;;;;41531:147;41457:221;;:::o;23914:305::-;24016:4;24068:25;24053:40;;;:11;:40;;;;:105;;;;24125:33;24110:48;;;:11;:48;;;;24053:105;:158;;;;24175:36;24199:11;24175:23;:36::i;:::-;24053:158;24033:178;;23914:305;;;:::o;46951:204::-;47102:45;47129:4;47135:2;47139:7;47102:26;:45::i;:::-;46951:204;;;:::o;31133:321::-;31263:18;31269:2;31273:7;31263:5;:18::i;:::-;31314:54;31345:1;31349:2;31353:7;31362:5;31314:22;:54::i;:::-;31292:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31133:321;;;:::o;34533:799::-;34688:4;34709:15;:2;:13;;;:15::i;:::-;34705:620;;;34761:2;34745:36;;;34782:12;:10;:12::i;:::-;34796:4;34802:7;34811:5;34745:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34741:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35004:1;34987:6;:13;:18;34983:272;;;35030:60;;;;;;;;;;:::i;:::-;;;;;;;;34983:272;35205:6;35199:13;35190:6;35186:2;35182:15;35175:38;34741:529;34878:41;;;34868:51;;;:6;:51;;;;34861:58;;;;;34705:620;35309:4;35302:11;;34533:799;;;;;;;:::o;25785:94::-;25836:13;25862:9;;;;;;;;;;;;;;25785:94;:::o;25203:334::-;25276:13;25310:16;25318:7;25310;:16::i;:::-;25302:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25391:21;25415:10;:8;:10::i;:::-;25391:34;;25467:1;25449:7;25443:21;:25;:86;;;;;;;;;;;;;;;;;25495:7;25504:18;:7;:16;:18::i;:::-;25478:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25443:86;25436:93;;;25203:334;;;:::o;15893:157::-;15978:4;16017:25;16002:40;;;:11;:40;;;;15995:47;;15893:157;;;:::o;31790:382::-;31884:1;31870:16;;:2;:16;;;;31862:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31943:16;31951:7;31943;:16::i;:::-;31942:17;31934:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32005:45;32034:1;32038:2;32042:7;32005:20;:45::i;:::-;32080:1;32063:9;:13;32073:2;32063:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32111:2;32092:7;:16;32100:7;32092:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32156:7;32152:2;32131:33;;32148:1;32131:33;;;;;;;;;;;;31790:382;;:::o;311:723::-;367:13;597:1;588:5;:10;584:53;;;615:10;;;;;;;;;;;;;;;;;;;;;584:53;647:12;662:5;647:20;;678:14;703:78;718:1;710:4;:9;703:78;;736:8;;;;;:::i;:::-;;;;767:2;759:10;;;;;:::i;:::-;;;703:78;;;791:19;823:6;813:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;791:39;;841:154;857:1;848:5;:10;841:154;;885:1;875:11;;;;;:::i;:::-;;;952:2;944:5;:10;;;;:::i;:::-;931:2;:24;;;;:::i;:::-;918:39;;901:6;908;901:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;841:154;;;1019:6;1005:21;;;;;311:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:118::-;16787:24;16805:5;16787:24;:::i;:::-;16782:3;16775:37;16700:118;;:::o;16824:435::-;17004:3;17026:95;17117:3;17108:6;17026:95;:::i;:::-;17019:102;;17138:95;17229:3;17220:6;17138:95;:::i;:::-;17131:102;;17250:3;17243:10;;16824:435;;;;;:::o;17265:222::-;17358:4;17396:2;17385:9;17381:18;17373:26;;17409:71;17477:1;17466:9;17462:17;17453:6;17409:71;:::i;:::-;17265:222;;;;:::o;17493:640::-;17688:4;17726:3;17715:9;17711:19;17703:27;;17740:71;17808:1;17797:9;17793:17;17784:6;17740:71;:::i;:::-;17821:72;17889:2;17878:9;17874:18;17865:6;17821:72;:::i;:::-;17903;17971:2;17960:9;17956:18;17947:6;17903:72;:::i;:::-;18022:9;18016:4;18012:20;18007:2;17996:9;17992:18;17985:48;18050:76;18121:4;18112:6;18050:76;:::i;:::-;18042:84;;17493:640;;;;;;;:::o;18139:210::-;18226:4;18264:2;18253:9;18249:18;18241:26;;18277:65;18339:1;18328:9;18324:17;18315:6;18277:65;:::i;:::-;18139:210;;;;:::o;18355:313::-;18468:4;18506:2;18495:9;18491:18;18483:26;;18555:9;18549:4;18545:20;18541:1;18530:9;18526:17;18519:47;18583:78;18656:4;18647:6;18583:78;:::i;:::-;18575:86;;18355:313;;;;:::o;18674:419::-;18840:4;18878:2;18867:9;18863:18;18855:26;;18927:9;18921:4;18917:20;18913:1;18902:9;18898:17;18891:47;18955:131;19081:4;18955:131;:::i;:::-;18947:139;;18674:419;;;:::o;19099:::-;19265:4;19303:2;19292:9;19288:18;19280:26;;19352:9;19346:4;19342:20;19338:1;19327:9;19323:17;19316:47;19380:131;19506:4;19380:131;:::i;:::-;19372:139;;19099:419;;;:::o;19524:::-;19690:4;19728:2;19717:9;19713:18;19705:26;;19777:9;19771:4;19767:20;19763:1;19752:9;19748:17;19741:47;19805:131;19931:4;19805:131;:::i;:::-;19797:139;;19524:419;;;:::o;19949:::-;20115:4;20153:2;20142:9;20138:18;20130:26;;20202:9;20196:4;20192:20;20188:1;20177:9;20173:17;20166:47;20230:131;20356:4;20230:131;:::i;:::-;20222:139;;19949:419;;;:::o;20374:::-;20540:4;20578:2;20567:9;20563:18;20555:26;;20627:9;20621:4;20617:20;20613:1;20602:9;20598:17;20591:47;20655:131;20781:4;20655:131;:::i;:::-;20647:139;;20374:419;;;:::o;20799:::-;20965:4;21003:2;20992:9;20988:18;20980:26;;21052:9;21046:4;21042:20;21038:1;21027:9;21023:17;21016:47;21080:131;21206:4;21080:131;:::i;:::-;21072:139;;20799:419;;;:::o;21224:::-;21390:4;21428:2;21417:9;21413:18;21405:26;;21477:9;21471:4;21467:20;21463:1;21452:9;21448:17;21441:47;21505:131;21631:4;21505:131;:::i;:::-;21497:139;;21224:419;;;:::o;21649:::-;21815:4;21853:2;21842:9;21838:18;21830:26;;21902:9;21896:4;21892:20;21888:1;21877:9;21873:17;21866:47;21930:131;22056:4;21930:131;:::i;:::-;21922:139;;21649:419;;;:::o;22074:::-;22240:4;22278:2;22267:9;22263:18;22255:26;;22327:9;22321:4;22317:20;22313:1;22302:9;22298:17;22291:47;22355:131;22481:4;22355:131;:::i;:::-;22347:139;;22074:419;;;:::o;22499:::-;22665:4;22703:2;22692:9;22688:18;22680:26;;22752:9;22746:4;22742:20;22738:1;22727:9;22723:17;22716:47;22780:131;22906:4;22780:131;:::i;:::-;22772:139;;22499:419;;;:::o;22924:::-;23090:4;23128:2;23117:9;23113:18;23105:26;;23177:9;23171:4;23167:20;23163:1;23152:9;23148:17;23141:47;23205:131;23331:4;23205:131;:::i;:::-;23197:139;;22924:419;;;:::o;23349:::-;23515:4;23553:2;23542:9;23538:18;23530:26;;23602:9;23596:4;23592:20;23588:1;23577:9;23573:17;23566:47;23630:131;23756:4;23630:131;:::i;:::-;23622:139;;23349:419;;;:::o;23774:::-;23940:4;23978:2;23967:9;23963:18;23955:26;;24027:9;24021:4;24017:20;24013:1;24002:9;23998:17;23991:47;24055:131;24181:4;24055:131;:::i;:::-;24047:139;;23774:419;;;:::o;24199:::-;24365:4;24403:2;24392:9;24388:18;24380:26;;24452:9;24446:4;24442:20;24438:1;24427:9;24423:17;24416:47;24480:131;24606:4;24480:131;:::i;:::-;24472:139;;24199:419;;;:::o;24624:::-;24790:4;24828:2;24817:9;24813:18;24805:26;;24877:9;24871:4;24867:20;24863:1;24852:9;24848:17;24841:47;24905:131;25031:4;24905:131;:::i;:::-;24897:139;;24624:419;;;:::o;25049:::-;25215:4;25253:2;25242:9;25238:18;25230:26;;25302:9;25296:4;25292:20;25288:1;25277:9;25273:17;25266:47;25330:131;25456:4;25330:131;:::i;:::-;25322:139;;25049:419;;;:::o;25474:::-;25640:4;25678:2;25667:9;25663:18;25655:26;;25727:9;25721:4;25717:20;25713:1;25702:9;25698:17;25691:47;25755:131;25881:4;25755:131;:::i;:::-;25747:139;;25474:419;;;:::o;25899:::-;26065:4;26103:2;26092:9;26088:18;26080:26;;26152:9;26146:4;26142:20;26138:1;26127:9;26123:17;26116:47;26180:131;26306:4;26180:131;:::i;:::-;26172:139;;25899:419;;;:::o;26324:::-;26490:4;26528:2;26517:9;26513:18;26505:26;;26577:9;26571:4;26567:20;26563:1;26552:9;26548:17;26541:47;26605:131;26731:4;26605:131;:::i;:::-;26597:139;;26324:419;;;:::o;26749:::-;26915:4;26953:2;26942:9;26938:18;26930:26;;27002:9;26996:4;26992:20;26988:1;26977:9;26973:17;26966:47;27030:131;27156:4;27030:131;:::i;:::-;27022:139;;26749:419;;;:::o;27174:::-;27340:4;27378:2;27367:9;27363:18;27355:26;;27427:9;27421:4;27417:20;27413:1;27402:9;27398:17;27391:47;27455:131;27581:4;27455:131;:::i;:::-;27447:139;;27174:419;;;:::o;27599:::-;27765:4;27803:2;27792:9;27788:18;27780:26;;27852:9;27846:4;27842:20;27838:1;27827:9;27823:17;27816:47;27880:131;28006:4;27880:131;:::i;:::-;27872:139;;27599:419;;;:::o;28024:222::-;28117:4;28155:2;28144:9;28140:18;28132:26;;28168:71;28236:1;28225:9;28221:17;28212:6;28168:71;:::i;:::-;28024:222;;;;:::o;28252:129::-;28286:6;28313:20;;:::i;:::-;28303:30;;28342:33;28370:4;28362:6;28342:33;:::i;:::-;28252:129;;;:::o;28387:75::-;28420:6;28453:2;28447:9;28437:19;;28387:75;:::o;28468:307::-;28529:4;28619:18;28611:6;28608:30;28605:56;;;28641:18;;:::i;:::-;28605:56;28679:29;28701:6;28679:29;:::i;:::-;28671:37;;28763:4;28757;28753:15;28745:23;;28468:307;;;:::o;28781:308::-;28843:4;28933:18;28925:6;28922:30;28919:56;;;28955:18;;:::i;:::-;28919:56;28993:29;29015:6;28993:29;:::i;:::-;28985:37;;29077:4;29071;29067:15;29059:23;;28781:308;;;:::o;29095:98::-;29146:6;29180:5;29174:12;29164:22;;29095:98;;;:::o;29199:99::-;29251:6;29285:5;29279:12;29269:22;;29199:99;;;:::o;29304:168::-;29387:11;29421:6;29416:3;29409:19;29461:4;29456:3;29452:14;29437:29;;29304:168;;;;:::o;29478:169::-;29562:11;29596:6;29591:3;29584:19;29636:4;29631:3;29627:14;29612:29;;29478:169;;;;:::o;29653:148::-;29755:11;29792:3;29777:18;;29653:148;;;;:::o;29807:305::-;29847:3;29866:20;29884:1;29866:20;:::i;:::-;29861:25;;29900:20;29918:1;29900:20;:::i;:::-;29895:25;;30054:1;29986:66;29982:74;29979:1;29976:81;29973:107;;;30060:18;;:::i;:::-;29973:107;30104:1;30101;30097:9;30090:16;;29807:305;;;;:::o;30118:185::-;30158:1;30175:20;30193:1;30175:20;:::i;:::-;30170:25;;30209:20;30227:1;30209:20;:::i;:::-;30204:25;;30248:1;30238:35;;30253:18;;:::i;:::-;30238:35;30295:1;30292;30288:9;30283:14;;30118:185;;;;:::o;30309:191::-;30349:4;30369:20;30387:1;30369:20;:::i;:::-;30364:25;;30403:20;30421:1;30403:20;:::i;:::-;30398:25;;30442:1;30439;30436:8;30433:34;;;30447:18;;:::i;:::-;30433:34;30492:1;30489;30485:9;30477:17;;30309:191;;;;:::o;30506:96::-;30543:7;30572:24;30590:5;30572:24;:::i;:::-;30561:35;;30506:96;;;:::o;30608:90::-;30642:7;30685:5;30678:13;30671:21;30660:32;;30608:90;;;:::o;30704:149::-;30740:7;30780:66;30773:5;30769:78;30758:89;;30704:149;;;:::o;30859:126::-;30896:7;30936:42;30929:5;30925:54;30914:65;;30859:126;;;:::o;30991:77::-;31028:7;31057:5;31046:16;;30991:77;;;:::o;31074:154::-;31158:6;31153:3;31148;31135:30;31220:1;31211:6;31206:3;31202:16;31195:27;31074:154;;;:::o;31234:307::-;31302:1;31312:113;31326:6;31323:1;31320:13;31312:113;;;31411:1;31406:3;31402:11;31396:18;31392:1;31387:3;31383:11;31376:39;31348:2;31345:1;31341:10;31336:15;;31312:113;;;31443:6;31440:1;31437:13;31434:101;;;31523:1;31514:6;31509:3;31505:16;31498:27;31434:101;31283:258;31234:307;;;:::o;31547:320::-;31591:6;31628:1;31622:4;31618:12;31608:22;;31675:1;31669:4;31665:12;31696:18;31686:81;;31752:4;31744:6;31740:17;31730:27;;31686:81;31814:2;31806:6;31803:14;31783:18;31780:38;31777:84;;;31833:18;;:::i;:::-;31777:84;31598:269;31547:320;;;:::o;31873:281::-;31956:27;31978:4;31956:27;:::i;:::-;31948:6;31944:40;32086:6;32074:10;32071:22;32050:18;32038:10;32035:34;32032:62;32029:88;;;32097:18;;:::i;:::-;32029:88;32137:10;32133:2;32126:22;31916:238;31873:281;;:::o;32160:233::-;32199:3;32222:24;32240:5;32222:24;:::i;:::-;32213:33;;32268:66;32261:5;32258:77;32255:103;;;32338:18;;:::i;:::-;32255:103;32385:1;32378:5;32374:13;32367:20;;32160:233;;;:::o;32399:176::-;32431:1;32448:20;32466:1;32448:20;:::i;:::-;32443:25;;32482:20;32500:1;32482:20;:::i;:::-;32477:25;;32521:1;32511:35;;32526:18;;:::i;:::-;32511:35;32567:1;32564;32560:9;32555:14;;32399:176;;;;:::o;32581:180::-;32629:77;32626:1;32619:88;32726:4;32723:1;32716:15;32750:4;32747:1;32740:15;32767:180;32815:77;32812:1;32805:88;32912:4;32909:1;32902:15;32936:4;32933:1;32926:15;32953:180;33001:77;32998:1;32991:88;33098:4;33095:1;33088:15;33122:4;33119:1;33112:15;33139:180;33187:77;33184:1;33177:88;33284:4;33281:1;33274:15;33308:4;33305:1;33298:15;33325:180;33373:77;33370:1;33363:88;33470:4;33467:1;33460:15;33494:4;33491:1;33484:15;33511:180;33559:77;33556:1;33549:88;33656:4;33653:1;33646:15;33680:4;33677:1;33670:15;33697:117;33806:1;33803;33796:12;33820:117;33929:1;33926;33919:12;33943:117;34052:1;34049;34042:12;34066:117;34175:1;34172;34165:12;34189:102;34230:6;34281:2;34277:7;34272:2;34265:5;34261:14;34257:28;34247:38;;34189:102;;;:::o;34297:230::-;34437:34;34433:1;34425:6;34421:14;34414:58;34506:13;34501:2;34493:6;34489:15;34482:38;34297:230;:::o;34533:237::-;34673:34;34669:1;34661:6;34657:14;34650:58;34742:20;34737:2;34729:6;34725:15;34718:45;34533:237;:::o;34776:225::-;34916:34;34912:1;34904:6;34900:14;34893:58;34985:8;34980:2;34972:6;34968:15;34961:33;34776:225;:::o;35007:178::-;35147:30;35143:1;35135:6;35131:14;35124:54;35007:178;:::o;35191:223::-;35331:34;35327:1;35319:6;35315:14;35308:58;35400:6;35395:2;35387:6;35383:15;35376:31;35191:223;:::o;35420:175::-;35560:27;35556:1;35548:6;35544:14;35537:51;35420:175;:::o;35601:231::-;35741:34;35737:1;35729:6;35725:14;35718:58;35810:14;35805:2;35797:6;35793:15;35786:39;35601:231;:::o;35838:243::-;35978:34;35974:1;35966:6;35962:14;35955:58;36047:26;36042:2;36034:6;36030:15;36023:51;35838:243;:::o;36087:229::-;36227:34;36223:1;36215:6;36211:14;36204:58;36296:12;36291:2;36283:6;36279:15;36272:37;36087:229;:::o;36322:228::-;36462:34;36458:1;36450:6;36446:14;36439:58;36531:11;36526:2;36518:6;36514:15;36507:36;36322:228;:::o;36556:233::-;36696:34;36692:1;36684:6;36680:14;36673:58;36765:16;36760:2;36752:6;36748:15;36741:41;36556:233;:::o;36795:182::-;36935:34;36931:1;36923:6;36919:14;36912:58;36795:182;:::o;36983:236::-;37123:34;37119:1;37111:6;37107:14;37100:58;37192:19;37187:2;37179:6;37175:15;37168:44;36983:236;:::o;37225:231::-;37365:34;37361:1;37353:6;37349:14;37342:58;37434:14;37429:2;37421:6;37417:15;37410:39;37225:231;:::o;37462:182::-;37602:34;37598:1;37590:6;37586:14;37579:58;37462:182;:::o;37650:179::-;37790:31;37786:1;37778:6;37774:14;37767:55;37650:179;:::o;37835:228::-;37975:34;37971:1;37963:6;37959:14;37952:58;38044:11;38039:2;38031:6;38027:15;38020:36;37835:228;:::o;38069:234::-;38209:34;38205:1;38197:6;38193:14;38186:58;38278:17;38273:2;38265:6;38261:15;38254:42;38069:234;:::o;38309:220::-;38449:34;38445:1;38437:6;38433:14;38426:58;38518:3;38513:2;38505:6;38501:15;38494:28;38309:220;:::o;38535:175::-;38675:27;38671:1;38663:6;38659:14;38652:51;38535:175;:::o;38716:236::-;38856:34;38852:1;38844:6;38840:14;38833:58;38925:19;38920:2;38912:6;38908:15;38901:44;38716:236;:::o;38958:231::-;39098:34;39094:1;39086:6;39082:14;39075:58;39167:14;39162:2;39154:6;39150:15;39143:39;38958:231;:::o;39195:122::-;39268:24;39286:5;39268:24;:::i;:::-;39261:5;39258:35;39248:63;;39307:1;39304;39297:12;39248:63;39195:122;:::o;39323:116::-;39393:21;39408:5;39393:21;:::i;:::-;39386:5;39383:32;39373:60;;39429:1;39426;39419:12;39373:60;39323:116;:::o;39445:120::-;39517:23;39534:5;39517:23;:::i;:::-;39510:5;39507:34;39497:62;;39555:1;39552;39545:12;39497:62;39445:120;:::o;39571:122::-;39644:24;39662:5;39644:24;:::i;:::-;39637:5;39634:35;39624:63;;39683:1;39680;39673:12;39624:63;39571:122;:::o
Swarm Source
ipfs://c59895c9e1e448612e04641ac3db70a4edeab80c13760a9f5dafe26fa48a9bee
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $3,135.95 | 0.0006 | $1.88 |
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.