Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 233 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 24246389 | 50 days ago | IN | 0 ETH | 0.00000138 | ||||
| Mint | 24233515 | 52 days ago | IN | 0 ETH | 0.00016902 | ||||
| Set Approval For... | 24212678 | 55 days ago | IN | 0 ETH | 0.00000504 | ||||
| Safe Transfer Fr... | 23927317 | 95 days ago | IN | 0 ETH | 0.00001338 | ||||
| Transfer From | 23927057 | 95 days ago | IN | 0 ETH | 0.00013382 | ||||
| Mint | 23776072 | 116 days ago | IN | 0 ETH | 0.00017778 | ||||
| Set Approval For... | 23586219 | 143 days ago | IN | 0 ETH | 0.0000092 | ||||
| Mint | 23375840 | 172 days ago | IN | 0 ETH | 0.00022637 | ||||
| Mint | 23375836 | 172 days ago | IN | 0 ETH | 0.00021536 | ||||
| Mint | 23375832 | 172 days ago | IN | 0 ETH | 0.00021559 | ||||
| Safe Transfer Fr... | 23343162 | 177 days ago | IN | 0 ETH | 0.00000702 | ||||
| Set Approval For... | 23176358 | 200 days ago | IN | 0 ETH | 0.00013713 | ||||
| Mint | 22624741 | 277 days ago | IN | 0 ETH | 0.00115826 | ||||
| Safe Transfer Fr... | 22517872 | 292 days ago | IN | 0 ETH | 0.00013592 | ||||
| Set Approval For... | 22451570 | 301 days ago | IN | 0 ETH | 0.00007636 | ||||
| Set Approval For... | 22320678 | 320 days ago | IN | 0 ETH | 0.0000414 | ||||
| Set Approval For... | 22316732 | 320 days ago | IN | 0 ETH | 0.00001629 | ||||
| Set Approval For... | 22236909 | 331 days ago | IN | 0 ETH | 0.00003274 | ||||
| Safe Transfer Fr... | 22217532 | 334 days ago | IN | 0 ETH | 0.00059054 | ||||
| Mint | 22139002 | 345 days ago | IN | 0 ETH | 0.00020723 | ||||
| Mint | 22138998 | 345 days ago | IN | 0 ETH | 0.00019221 | ||||
| Mint | 22138994 | 345 days ago | IN | 0 ETH | 0.00018929 | ||||
| Mint | 22138989 | 345 days ago | IN | 0 ETH | 0.00018309 | ||||
| Mint | 22138982 | 345 days ago | IN | 0 ETH | 0.00020049 | ||||
| Mint | 22138979 | 345 days ago | IN | 0 ETH | 0.00020423 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PictierHistoryNFT
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-06-20
*/
// SPDX-License-Identifier: MIT
// Sources flattened with hardhat v2.9.5 https://hardhat.org
// File @openzeppelin/contracts/utils/introspection/IERC165.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File @openzeppelin/contracts/token/ERC721/IERC721.sol@v4.6.0
// OpenZeppelin Contracts (last updated v4.6.0) (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`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol@v4.6.0
// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File @openzeppelin/contracts/utils/Address.sol@v4.6.0
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File @openzeppelin/contracts/utils/Context.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (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/utils/Strings.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File @openzeppelin/contracts/utils/introspection/ERC165.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File @openzeppelin/contracts/token/ERC721/ERC721.sol@v4.6.0
// OpenZeppelin Contracts (last updated v4.6.0) (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 overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not 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 {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(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);
_afterTokenTransfer(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 from incorrect owner");
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);
_afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev 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 {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File @openzeppelin/contracts/interfaces/IERC2981.sol@v4.6.0
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
// File @openzeppelin/contracts/access/IAccessControl.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File @openzeppelin/contracts/access/AccessControl.sol@v4.6.0
// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File @openzeppelin/contracts/security/Pausable.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File @openzeppelin/contracts/access/Ownable.sol@v4.6.0
// OpenZeppelin Contracts v4.4.1 (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() {
_transferOwnership(_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 {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File contracts/nft.sol
pragma solidity ^0.8.0;
contract PictierHistoryNFT is
ERC721,
IERC2981,
Pausable,
AccessControl,
Ownable
{
bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
string public _baseURIextended = "https://file.pictier.com/nft/history/metadata/";
address payable private _withdrawalWallet = payable(0x64516497D4eddb144F70b56726c262bC0bd3c743);
address payable private _royaltyWallet = payable(0x64516497D4eddb144F70b56726c262bC0bd3c743);
uint256 public _royaltyBasis = 250; // 2.5%
bool public saleActive = false;
uint256[] public _claimableCounts;
struct PRICE {
uint256 minId;
uint256 maxId;
uint256 price;
}
mapping (uint256 => PRICE) priceList;
enum RARITY {
NONE,
COMMON,
UNCOMMON,
RARE,
EPIC,
LEGENDARY
}
mapping (uint256 => RARITY) rarityList;
constructor()
ERC721(
"PictierHistoryNFT",
"PiHT"
)
{
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
grantRole(MANAGER_ROLE, msg.sender);
_setPrice(1, 100, 0.1 ether);
}
function setPrice(uint256 minId, uint256 maxId, uint256 price)
external
onlyRole(MANAGER_ROLE)
{
_setPrice(minId, maxId, price * (10**15));
}
function _setPrice(uint256 minId, uint256 maxId, uint256 price)
internal
{
PRICE memory newPrice = PRICE({
minId: minId,
maxId: maxId,
price: price
});
priceList[maxId] = newPrice;
_claimableCounts.push(maxId);
}
function getPrice(uint256 tokenId)
external
view
returns (uint256)
{
return _price(tokenId);
}
function mint(address to, uint256 tokenId)
external
onlyRole(MANAGER_ROLE)
returns (uint256)
{
_mint(to, tokenId);
if (tokenId <= 1000) {
rarityList[tokenId] = RARITY.EPIC;
} else {
rarityList[tokenId] = RARITY.COMMON;
}
return tokenId;
}
function setWithdrawalWallet(address payable withdrawalWallet_)
external
onlyRole(MANAGER_ROLE)
{
_withdrawalWallet = (withdrawalWallet_);
}
function withdraw()
external
onlyRole(MANAGER_ROLE)
{
payable(_withdrawalWallet).transfer(address(this).balance);
}
function pause()
public
onlyRole(MANAGER_ROLE)
{
_pause();
}
function unpause()
public
onlyRole(MANAGER_ROLE)
{
_unpause();
}
function setBaseURI(string memory baseURI_)
external
onlyRole(MANAGER_ROLE)
{
_baseURIextended = baseURI_;
}
function contractURI()
external
view
returns (string memory)
{
return string(abi.encodePacked(_baseURIextended, "metadata.json"));
}
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
return string(abi.encodePacked(_baseURIextended, Strings.toString(tokenId), ".json"));
}
function transferOwnership(address _newOwner)
public
override
onlyOwner
{
address currentOwner = owner();
_transferOwnership(_newOwner);
grantRole(MANAGER_ROLE, _newOwner);
grantRole(DEFAULT_ADMIN_ROLE, _newOwner);
revokeRole(MANAGER_ROLE, currentOwner);
revokeRole(DEFAULT_ADMIN_ROLE, currentOwner);
}
function setSaleActive(bool val)
external
onlyRole(MANAGER_ROLE)
{
saleActive = val;
}
function claim(uint256 tokenId)
external
payable
whenNotPaused
returns (uint256)
{
require(saleActive, "Sale has not begun");
require(1 <= tokenId, "Can't buy");
require(_claimableCounts[_claimableCounts.length - 1] >= tokenId, "Can't buy");
require(_price(tokenId) == msg.value, "Incorrect ETH sent; check price!");
_mint(msg.sender, tokenId);
rarityList[tokenId] = RARITY.EPIC;
return tokenId;
}
function setRoyaltyWallet(address payable royaltyWallet_)
external
onlyRole(MANAGER_ROLE)
{
_royaltyWallet = (royaltyWallet_);
}
/**
* @dev See {IERC165-royaltyInfo}.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
override
returns (address receiver, uint256 royaltyAmount)
{
require(_exists(tokenId), "Nonexistent token");
return (payable(_royaltyWallet), uint((salePrice * _royaltyBasis)/10000));
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC721, IERC165, AccessControl)
returns (bool)
{
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
function getClaimableCount()
external
view
returns (uint256)
{
return _claimableCounts[_claimableCounts.length - 1];
}
function setRarity(uint256 tokenId, RARITY rarity)
external
onlyRole(MANAGER_ROLE)
{
rarityList[tokenId] = rarity;
}
function getRarity(uint256 tokenId)
external
view
returns (RARITY)
{
return rarityList[tokenId];
}
function _price(uint256 tokenId)
internal
view
virtual
returns (uint256)
{
for (uint256 i = _claimableCounts.length; i > 0; i--) {
PRICE memory price = priceList[_claimableCounts[i-1]];
if (price.minId <= tokenId && price.maxId >= tokenId) {
return price.price;
}
}
return 0;
}
receive () external payable {}
fallback () external payable {}
}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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_claimableCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_royaltyBasis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimableCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRarity","outputs":[{"internalType":"enum PictierHistoryNFT.RARITY","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minId","type":"uint256"},{"internalType":"uint256","name":"maxId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum PictierHistoryNFT.RARITY","name":"rarity","type":"uint8"}],"name":"setRarity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"royaltyWallet_","type":"address"}],"name":"setRoyaltyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawalWallet_","type":"address"}],"name":"setWithdrawalWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526040518060600160405280602e815260200162005a12602e91396009908051906020019062000035929190620008b3565b507364516497d4eddb144f70b56726c262bc0bd3c743600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507364516497d4eddb144f70b56726c262bc0bd3c743600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060fa600c556000600d60006101000a81548160ff0219169083151502179055503480156200010d57600080fd5b506040518060400160405280601181526020017f50696374696572486973746f72794e46540000000000000000000000000000008152506040518060400160405280600481526020017f5069485400000000000000000000000000000000000000000000000000000000815250816000908051906020019062000192929190620008b3565b508060019080519060200190620001ab929190620008b3565b5050506000600660006101000a81548160ff021916908315150217905550620001e9620001dd6200025360201b60201c565b6200025b60201b60201c565b620001fe6000801b336200032160201b60201c565b620002307f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08336200033760201b60201c565b6200024d6001606467016345785d8a00006200037060201b60201c565b62000da8565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003338282620003f360201b60201c565b5050565b6200034882620004e560201b60201c565b62000359816200050560201b60201c565b6200036b8383620003f360201b60201c565b505050565b6000604051806060016040528085815260200184815260200183815250905080600f6000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600e83908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b6200040582826200052960201b60201c565b620004e15760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004866200025360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060076000838152602001908152602001600020600101549050919050565b62000526816200051a6200025360201b60201c565b6200059460201b60201c565b50565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620005a682826200052960201b60201c565b6200065457620005d98173ffffffffffffffffffffffffffffffffffffffff1660146200065860201b62001bcd1760201c565b620005f48360001c60206200065860201b62001bcd1760201c565b6040516020016200060792919062000a86565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064b919062000b2b565b60405180910390fd5b5050565b6060600060028360026200066d919062000b88565b62000679919062000be9565b67ffffffffffffffff81111562000695576200069462000c46565b5b6040519080825280601f01601f191660200182016040528015620006c85781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000703576200070262000c75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106200076a576200076962000c75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002620007ac919062000b88565b620007b8919062000be9565b90505b600181111562000862577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110620007fe57620007fd62000c75565b5b1a60f81b82828151811062000818576200081762000c75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806200085a9062000ca4565b9050620007bb565b5060008414620008a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008a09062000d22565b60405180910390fd5b8091505092915050565b828054620008c19062000d73565b90600052602060002090601f016020900481019282620008e5576000855562000931565b82601f106200090057805160ff191683800117855562000931565b8280016001018555821562000931579182015b828111156200093057825182559160200191906001019062000913565b5b50905062000940919062000944565b5090565b5b808211156200095f57600081600090555060010162000945565b5090565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000620009a660178362000963565b9150620009b3826200096e565b601782019050919050565b600081519050919050565b60005b83811015620009e9578082015181840152602081019050620009cc565b83811115620009f9576000848401525b50505050565b600062000a0c82620009be565b62000a18818562000963565b935062000a2a818560208601620009c9565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600062000a6e60118362000963565b915062000a7b8262000a36565b601182019050919050565b600062000a938262000997565b915062000aa18285620009ff565b915062000aae8262000a5f565b915062000abc8284620009ff565b91508190509392505050565b600082825260208201905092915050565b6000601f19601f8301169050919050565b600062000af782620009be565b62000b03818562000ac8565b935062000b15818560208601620009c9565b62000b208162000ad9565b840191505092915050565b6000602082019050818103600083015262000b47818462000aea565b905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b958262000b4f565b915062000ba28362000b4f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000bde5762000bdd62000b59565b5b828202905092915050565b600062000bf68262000b4f565b915062000c038362000b4f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c3b5762000c3a62000b59565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600062000cb18262000b4f565b91506000820362000cc75762000cc662000b59565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600062000d0a60208362000ac8565b915062000d178262000cd2565b602082019050919050565b6000602082019050818103600083015262000d3d8162000cfb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d8c57607f821691505b60208210810362000da25762000da162000d44565b5b50919050565b614c5a8062000db86000396000f3fe60806040526004361061026b5760003560e01c8063715018a611610144578063ae3146e9116100b6578063d547741f1161007a578063d547741f14610938578063e757223014610961578063e8a3d4851461099e578063e985e9c5146109c9578063ec87621c14610a06578063f2fde38b14610a3157610272565b8063ae3146e914610855578063b88d4fde14610880578063b9f8bf68146108a9578063c87b56dd146108d2578063cdeee6371461090f57610272565b80638da5cb5b116101085780638da5cb5b1461074557806391d148541461077057806395d89b41146107ad578063a217fddf146107d8578063a22cb46514610803578063aa585d561461082c57610272565b8063715018a61461068857806375796f761461069f5780637c4c4f85146106c8578063841718a6146107055780638456cb591461072e57610272565b8063379607f5116101dd57806348758697116101a1578063487586971461055257806355f804b31461058f5780635c975abb146105b85780636352211e146105e357806368428a1b1461062057806370a082311461064b57610272565b8063379607f51461048e5780633ccfd60b146104be5780633f4ba83a146104d557806340c10f19146104ec57806342842e0e1461052957610272565b80631a6931411161022f5780631a6931411461036d57806323b872dd14610398578063248a9ca3146103c15780632a55205a146103fe5780632f2ff15d1461043c57806336568abe1461046557610272565b806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc5780630928fc2214610319578063095ea7b31461034457610272565b3661027257005b005b34801561028057600080fd5b5061029b600480360381019061029691906131cf565b610a5a565b6040516102a89190613217565b60405180910390f35b3480156102bd57600080fd5b506102c6610ad4565b6040516102d391906132cb565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613323565b610b66565b6040516103109190613391565b60405180910390f35b34801561032557600080fd5b5061032e610beb565b60405161033b91906132cb565b60405180910390f35b34801561035057600080fd5b5061036b600480360381019061036691906133d8565b610c79565b005b34801561037957600080fd5b50610382610d90565b60405161038f9190613427565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613442565b610dc7565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906134cb565b610e27565b6040516103f59190613507565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613522565b610e47565b604051610433929190613562565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e919061358b565b610edb565b005b34801561047157600080fd5b5061048c6004803603810190610487919061358b565b610efc565b005b6104a860048036038101906104a39190613323565b610f7f565b6040516104b59190613427565b60405180910390f35b3480156104ca57600080fd5b506104d3611166565b005b3480156104e157600080fd5b506104ea6111fc565b005b3480156104f857600080fd5b50610513600480360381019061050e91906133d8565b611231565b6040516105209190613427565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613442565b6112f8565b005b34801561055e57600080fd5b5061057960048036038101906105749190613323565b611318565b6040516105869190613642565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190613792565b611342565b005b3480156105c457600080fd5b506105cd611387565b6040516105da9190613217565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190613323565b61139e565b6040516106179190613391565b60405180910390f35b34801561062c57600080fd5b5061063561144f565b6040516106429190613217565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906137db565b611462565b60405161067f9190613427565b60405180910390f35b34801561069457600080fd5b5061069d611519565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190613846565b6115a1565b005b3480156106d457600080fd5b506106ef60048036038101906106ea9190613323565b611610565b6040516106fc9190613427565b60405180910390f35b34801561071157600080fd5b5061072c6004803603810190610727919061389f565b611634565b005b34801561073a57600080fd5b5061074361167c565b005b34801561075157600080fd5b5061075a6116b1565b6040516107679190613391565b60405180910390f35b34801561077c57600080fd5b506107976004803603810190610792919061358b565b6116db565b6040516107a49190613217565b60405180910390f35b3480156107b957600080fd5b506107c2611746565b6040516107cf91906132cb565b60405180910390f35b3480156107e457600080fd5b506107ed6117d8565b6040516107fa9190613507565b60405180910390f35b34801561080f57600080fd5b5061082a600480360381019061082591906138cc565b6117df565b005b34801561083857600080fd5b50610853600480360381019061084e919061390c565b6117f5565b005b34801561086157600080fd5b5061086a611842565b6040516108779190613427565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613a00565b611848565b005b3480156108b557600080fd5b506108d060048036038101906108cb9190613aa8565b6118aa565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613323565b611914565b60405161090691906132cb565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190613846565b611948565b005b34801561094457600080fd5b5061095f600480360381019061095a919061358b565b6119b7565b005b34801561096d57600080fd5b5061098860048036038101906109839190613323565b6119d8565b6040516109959190613427565b60405180910390f35b3480156109aa57600080fd5b506109b36119ea565b6040516109c091906132cb565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190613ae8565b611a12565b6040516109fd9190613217565b60405180910390f35b348015610a1257600080fd5b50610a1b611aa6565b604051610a289190613507565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a5391906137db565b611aca565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610acd5750610acc82611e09565b5b9050919050565b606060008054610ae390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0f90613b57565b8015610b5c5780601f10610b3157610100808354040283529160200191610b5c565b820191906000526020600020905b815481529060010190602001808311610b3f57829003601f168201915b5050505050905090565b6000610b7182611e83565b610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613bfa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610bf890613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2490613b57565b8015610c715780601f10610c4657610100808354040283529160200191610c71565b820191906000526020600020905b815481529060010190602001808311610c5457829003601f168201915b505050505081565b6000610c848261139e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613c8c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d13611eef565b73ffffffffffffffffffffffffffffffffffffffff161480610d425750610d4181610d3c611eef565b611a12565b5b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890613d1e565b60405180910390fd5b610d8b8383611ef7565b505050565b6000600e6001600e80549050610da69190613d6d565b81548110610db757610db6613da1565b5b9060005260206000200154905090565b610dd8610dd2611eef565b82611fb0565b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90613e42565b60405180910390fd5b610e2283838361208e565b505050565b600060076000838152602001908152602001600020600101549050919050565b600080610e5384611e83565b610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613eae565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600c5485610ec69190613ece565b610ed09190613f57565b915091509250929050565b610ee482610e27565b610eed816122f4565b610ef78383612308565b505050565b610f04611eef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613ffa565b60405180910390fd5b610f7b82826123e9565b5050565b6000610f89611387565b15610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614066565b60405180910390fd5b600d60009054906101000a900460ff16611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f906140d2565b60405180910390fd5b816001111561105c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110539061413e565b60405180910390fd5b81600e6001600e805490506110719190613d6d565b8154811061108257611081613da1565b5b906000526020600020015410156110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c59061413e565b60405180910390fd5b346110d8836124cb565b14611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f906141aa565b60405180910390fd5b6111223383612594565b60046010600084815260200190815260200160002060006101000a81548160ff02191690836005811115611159576111586135cb565b5b0217905550819050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611190816122f4565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111f8573d6000803e3d6000fd5b5050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611226816122f4565b61122e61276d565b50565b60007f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861125d816122f4565b6112678484612594565b6103e883116112b15760046010600085815260200190815260200160002060006101000a81548160ff021916908360058111156112a7576112a66135cb565b5b02179055506112ee565b60016010600085815260200190815260200160002060006101000a81548160ff021916908360058111156112e8576112e76135cb565b5b02179055505b8291505092915050565b61131383838360405180602001604052806000815250611848565b505050565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861136c816122f4565b81600990805190602001906113829291906130c0565b505050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d9061423c565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906142ce565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611521611eef565b73ffffffffffffffffffffffffffffffffffffffff1661153f6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061433a565b60405180910390fd5b61159f600061280f565b565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086115cb816122f4565b81600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600e818154811061162057600080fd5b906000526020600020016000915090505481565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861165e816122f4565b81600d60006101000a81548160ff0219169083151502179055505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086116a6816122f4565b6116ae6128d5565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461175590613b57565b80601f016020809104026020016040519081016040528092919081815260200182805461178190613b57565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b5050505050905090565b6000801b81565b6117f16117ea611eef565b8383612978565b5050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861181f816122f4565b61183c848466038d7ea4c68000856118379190613ece565b612ae4565b50505050565b600c5481565b611859611853611eef565b83611fb0565b611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613e42565b60405180910390fd5b6118a484848484612b67565b50505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086118d4816122f4565b816010600085815260200190815260200160002060006101000a81548160ff0219169083600581111561190a576119096135cb565b5b0217905550505050565b6060600961192183612bc3565b604051602001611932929190614476565b6040516020818303038152906040529050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611972816122f4565b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6119c082610e27565b6119c9816122f4565b6119d383836123e9565b505050565b60006119e3826124cb565b9050919050565b606060096040516020016119fe91906144f1565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b611ad2611eef565b73ffffffffffffffffffffffffffffffffffffffff16611af06116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3d9061433a565b60405180910390fd5b6000611b506116b1565b9050611b5b8261280f565b611b857f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0883610edb565b611b926000801b83610edb565b611bbc7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08826119b7565b611bc96000801b826119b7565b5050565b606060006002836002611be09190613ece565b611bea9190614513565b67ffffffffffffffff811115611c0357611c02613667565b5b6040519080825280601f01601f191660200182016040528015611c355781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6d57611c6c613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cd157611cd0613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d119190613ece565b611d1b9190614513565b90505b6001811115611dbb577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5d57611d5c613da1565b5b1a60f81b828281518110611d7457611d73613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611db490614569565b9050611d1e565b5060008414611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df6906145de565b60405180910390fd5b8091505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e7c5750611e7b82612d23565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6a8361139e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fbb82611e83565b611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff190614670565b60405180910390fd5b60006120058361139e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204757506120468185611a12565b5b8061208557508373ffffffffffffffffffffffffffffffffffffffff1661206d84610b66565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120ae8261139e565b73ffffffffffffffffffffffffffffffffffffffff1614612104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fb90614702565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a90614794565b60405180910390fd5b61217e838383612e05565b612189600082611ef7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d99190613d6d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122309190614513565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122ef838383612e0a565b505050565b61230581612300611eef565b612e0f565b50565b61231282826116db565b6123e55760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061238a611eef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6123f382826116db565b156124c75760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061246c611eef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080600e8054905090505b6000811115612589576000600f6000600e6001856124f59190613d6d565b8154811061250657612505613da1565b5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816000015111158015612562575083816020015110155b156125755780604001519250505061258f565b50808061258190614569565b9150506124d7565b50600090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90614800565b60405180910390fd5b61260c81611e83565b1561264c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126439061486c565b60405180910390fd5b61265860008383612e05565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a89190614513565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461276960008383612e0a565b5050565b612775611387565b6127b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ab906148d8565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127f8611eef565b6040516128059190613391565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128dd611387565b1561291d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291490614066565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612961611eef565b60405161296e9190613391565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129dd90614944565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ad79190613217565b60405180910390a3505050565b6000604051806060016040528085815260200184815260200183815250905080600f6000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600e83908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b612b7284848461208e565b612b7e84848484612eac565b612bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb4906149d6565b60405180910390fd5b50505050565b606060008203612c0a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d1e565b600082905060005b60008214612c3c578080612c25906149f6565b915050600a82612c359190613f57565b9150612c12565b60008167ffffffffffffffff811115612c5857612c57613667565b5b6040519080825280601f01601f191660200182016040528015612c8a5781602001600182028036833780820191505090505b5090505b60008514612d1757600182612ca39190613d6d565b9150600a85612cb29190614a3e565b6030612cbe9190614513565b60f81b818381518110612cd457612cd3613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d109190613f57565b9450612c8e565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dfe5750612dfd82613033565b5b9050919050565b505050565b505050565b612e1982826116db565b612ea857612e3e8173ffffffffffffffffffffffffffffffffffffffff166014611bcd565b612e4c8360001c6020611bcd565b604051602001612e5d929190614b07565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9f91906132cb565b60405180910390fd5b5050565b6000612ecd8473ffffffffffffffffffffffffffffffffffffffff1661309d565b15613026578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef6611eef565b8786866040518563ffffffff1660e01b8152600401612f189493929190614b96565b6020604051808303816000875af1925050508015612f5457506040513d601f19601f82011682018060405250810190612f519190614bf7565b60015b612fd6573d8060008114612f84576040519150601f19603f3d011682016040523d82523d6000602084013e612f89565b606091505b506000815103612fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc5906149d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061302b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546130cc90613b57565b90600052602060002090601f0160209004810192826130ee5760008555613135565b82601f1061310757805160ff1916838001178555613135565b82800160010185558215613135579182015b82811115613134578251825591602001919060010190613119565b5b5090506131429190613146565b5090565b5b8082111561315f576000816000905550600101613147565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131ac81613177565b81146131b757600080fd5b50565b6000813590506131c9816131a3565b92915050565b6000602082840312156131e5576131e461316d565b5b60006131f3848285016131ba565b91505092915050565b60008115159050919050565b613211816131fc565b82525050565b600060208201905061322c6000830184613208565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561326c578082015181840152602081019050613251565b8381111561327b576000848401525b50505050565b6000601f19601f8301169050919050565b600061329d82613232565b6132a7818561323d565b93506132b781856020860161324e565b6132c081613281565b840191505092915050565b600060208201905081810360008301526132e58184613292565b905092915050565b6000819050919050565b613300816132ed565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b6000602082840312156133395761333861316d565b5b60006133478482850161330e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061337b82613350565b9050919050565b61338b81613370565b82525050565b60006020820190506133a66000830184613382565b92915050565b6133b581613370565b81146133c057600080fd5b50565b6000813590506133d2816133ac565b92915050565b600080604083850312156133ef576133ee61316d565b5b60006133fd858286016133c3565b925050602061340e8582860161330e565b9150509250929050565b613421816132ed565b82525050565b600060208201905061343c6000830184613418565b92915050565b60008060006060848603121561345b5761345a61316d565b5b6000613469868287016133c3565b935050602061347a868287016133c3565b925050604061348b8682870161330e565b9150509250925092565b6000819050919050565b6134a881613495565b81146134b357600080fd5b50565b6000813590506134c58161349f565b92915050565b6000602082840312156134e1576134e061316d565b5b60006134ef848285016134b6565b91505092915050565b61350181613495565b82525050565b600060208201905061351c60008301846134f8565b92915050565b600080604083850312156135395761353861316d565b5b60006135478582860161330e565b92505060206135588582860161330e565b9150509250929050565b60006040820190506135776000830185613382565b6135846020830184613418565b9392505050565b600080604083850312156135a2576135a161316d565b5b60006135b0858286016134b6565b92505060206135c1858286016133c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061360b5761360a6135cb565b5b50565b600081905061361c826135fa565b919050565b600061362c8261360e565b9050919050565b61363c81613621565b82525050565b60006020820190506136576000830184613633565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61369f82613281565b810181811067ffffffffffffffff821117156136be576136bd613667565b5b80604052505050565b60006136d1613163565b90506136dd8282613696565b919050565b600067ffffffffffffffff8211156136fd576136fc613667565b5b61370682613281565b9050602081019050919050565b82818337600083830152505050565b6000613735613730846136e2565b6136c7565b90508281526020810184848401111561375157613750613662565b5b61375c848285613713565b509392505050565b600082601f8301126137795761377861365d565b5b8135613789848260208601613722565b91505092915050565b6000602082840312156137a8576137a761316d565b5b600082013567ffffffffffffffff8111156137c6576137c5613172565b5b6137d284828501613764565b91505092915050565b6000602082840312156137f1576137f061316d565b5b60006137ff848285016133c3565b91505092915050565b600061381382613350565b9050919050565b61382381613808565b811461382e57600080fd5b50565b6000813590506138408161381a565b92915050565b60006020828403121561385c5761385b61316d565b5b600061386a84828501613831565b91505092915050565b61387c816131fc565b811461388757600080fd5b50565b60008135905061389981613873565b92915050565b6000602082840312156138b5576138b461316d565b5b60006138c38482850161388a565b91505092915050565b600080604083850312156138e3576138e261316d565b5b60006138f1858286016133c3565b92505060206139028582860161388a565b9150509250929050565b6000806000606084860312156139255761392461316d565b5b60006139338682870161330e565b93505060206139448682870161330e565b92505060406139558682870161330e565b9150509250925092565b600067ffffffffffffffff82111561397a57613979613667565b5b61398382613281565b9050602081019050919050565b60006139a361399e8461395f565b6136c7565b9050828152602081018484840111156139bf576139be613662565b5b6139ca848285613713565b509392505050565b600082601f8301126139e7576139e661365d565b5b81356139f7848260208601613990565b91505092915050565b60008060008060808587031215613a1a57613a1961316d565b5b6000613a28878288016133c3565b9450506020613a39878288016133c3565b9350506040613a4a8782880161330e565b925050606085013567ffffffffffffffff811115613a6b57613a6a613172565b5b613a77878288016139d2565b91505092959194509250565b60068110613a9057600080fd5b50565b600081359050613aa281613a83565b92915050565b60008060408385031215613abf57613abe61316d565b5b6000613acd8582860161330e565b9250506020613ade85828601613a93565b9150509250929050565b60008060408385031215613aff57613afe61316d565b5b6000613b0d858286016133c3565b9250506020613b1e858286016133c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b6f57607f821691505b602082108103613b8257613b81613b28565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613be4602c8361323d565b9150613bef82613b88565b604082019050919050565b60006020820190508181036000830152613c1381613bd7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c7660218361323d565b9150613c8182613c1a565b604082019050919050565b60006020820190508181036000830152613ca581613c69565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d0860388361323d565b9150613d1382613cac565b604082019050919050565b60006020820190508181036000830152613d3781613cfb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d78826132ed565b9150613d83836132ed565b925082821015613d9657613d95613d3e565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e2c60318361323d565b9150613e3782613dd0565b604082019050919050565b60006020820190508181036000830152613e5b81613e1f565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000613e9860118361323d565b9150613ea382613e62565b602082019050919050565b60006020820190508181036000830152613ec781613e8b565b9050919050565b6000613ed9826132ed565b9150613ee4836132ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1d57613f1c613d3e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f62826132ed565b9150613f6d836132ed565b925082613f7d57613f7c613f28565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613fe4602f8361323d565b9150613fef82613f88565b604082019050919050565b6000602082019050818103600083015261401381613fd7565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061405060108361323d565b915061405b8261401a565b602082019050919050565b6000602082019050818103600083015261407f81614043565b9050919050565b7f53616c6520686173206e6f7420626567756e0000000000000000000000000000600082015250565b60006140bc60128361323d565b91506140c782614086565b602082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b7f43616e2774206275790000000000000000000000000000000000000000000000600082015250565b600061412860098361323d565b9150614133826140f2565b602082019050919050565b600060208201905081810360008301526141578161411b565b9050919050565b7f496e636f7272656374204554482073656e743b20636865636b20707269636521600082015250565b600061419460208361323d565b915061419f8261415e565b602082019050919050565b600060208201905081810360008301526141c381614187565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061422660298361323d565b9150614231826141ca565b604082019050919050565b6000602082019050818103600083015261425581614219565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006142b8602a8361323d565b91506142c38261425c565b604082019050919050565b600060208201905081810360008301526142e7816142ab565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061432460208361323d565b915061432f826142ee565b602082019050919050565b6000602082019050818103600083015261435381614317565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461438781613b57565b614391818661435a565b945060018216600081146143ac57600181146143bd576143f0565b60ff198316865281860193506143f0565b6143c685614365565b60005b838110156143e8578154818901526001820191506020810190506143c9565b838801955050505b50505092915050565b600061440482613232565b61440e818561435a565b935061441e81856020860161324e565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061446060058361435a565b915061446b8261442a565b600582019050919050565b6000614482828561437a565b915061448e82846143f9565b915061449982614453565b91508190509392505050565b7f6d657461646174612e6a736f6e00000000000000000000000000000000000000600082015250565b60006144db600d8361435a565b91506144e6826144a5565b600d82019050919050565b60006144fd828461437a565b9150614508826144ce565b915081905092915050565b600061451e826132ed565b9150614529836132ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561455e5761455d613d3e565b5b828201905092915050565b6000614574826132ed565b91506000820361458757614586613d3e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006145c860208361323d565b91506145d382614592565b602082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061465a602c8361323d565b9150614665826145fe565b604082019050919050565b600060208201905081810360008301526146898161464d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146ec60258361323d565b91506146f782614690565b604082019050919050565b6000602082019050818103600083015261471b816146df565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061477e60248361323d565b915061478982614722565b604082019050919050565b600060208201905081810360008301526147ad81614771565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006147ea60208361323d565b91506147f5826147b4565b602082019050919050565b60006020820190508181036000830152614819816147dd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614856601c8361323d565b915061486182614820565b602082019050919050565b6000602082019050818103600083015261488581614849565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006148c260148361323d565b91506148cd8261488c565b602082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061492e60198361323d565b9150614939826148f8565b602082019050919050565b6000602082019050818103600083015261495d81614921565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149c060328361323d565b91506149cb82614964565b604082019050919050565b600060208201905081810360008301526149ef816149b3565b9050919050565b6000614a01826132ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a3357614a32613d3e565b5b600182019050919050565b6000614a49826132ed565b9150614a54836132ed565b925082614a6457614a63613f28565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614aa560178361435a565b9150614ab082614a6f565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614af160118361435a565b9150614afc82614abb565b601182019050919050565b6000614b1282614a98565b9150614b1e82856143f9565b9150614b2982614ae4565b9150614b3582846143f9565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614b6882614b41565b614b728185614b4c565b9350614b8281856020860161324e565b614b8b81613281565b840191505092915050565b6000608082019050614bab6000830187613382565b614bb86020830186613382565b614bc56040830185613418565b8181036060830152614bd78184614b5d565b905095945050505050565b600081519050614bf1816131a3565b92915050565b600060208284031215614c0d57614c0c61316d565b5b6000614c1b84828501614be2565b9150509291505056fea2646970667358221220802f0f949095018a8fa6b892b31bfb209022d8bc8f273b1706c69af3af8d1a6164736f6c634300080e003368747470733a2f2f66696c652e706963746965722e636f6d2f6e66742f686973746f72792f6d657461646174612f
Deployed Bytecode
0x60806040526004361061026b5760003560e01c8063715018a611610144578063ae3146e9116100b6578063d547741f1161007a578063d547741f14610938578063e757223014610961578063e8a3d4851461099e578063e985e9c5146109c9578063ec87621c14610a06578063f2fde38b14610a3157610272565b8063ae3146e914610855578063b88d4fde14610880578063b9f8bf68146108a9578063c87b56dd146108d2578063cdeee6371461090f57610272565b80638da5cb5b116101085780638da5cb5b1461074557806391d148541461077057806395d89b41146107ad578063a217fddf146107d8578063a22cb46514610803578063aa585d561461082c57610272565b8063715018a61461068857806375796f761461069f5780637c4c4f85146106c8578063841718a6146107055780638456cb591461072e57610272565b8063379607f5116101dd57806348758697116101a1578063487586971461055257806355f804b31461058f5780635c975abb146105b85780636352211e146105e357806368428a1b1461062057806370a082311461064b57610272565b8063379607f51461048e5780633ccfd60b146104be5780633f4ba83a146104d557806340c10f19146104ec57806342842e0e1461052957610272565b80631a6931411161022f5780631a6931411461036d57806323b872dd14610398578063248a9ca3146103c15780632a55205a146103fe5780632f2ff15d1461043c57806336568abe1461046557610272565b806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc5780630928fc2214610319578063095ea7b31461034457610272565b3661027257005b005b34801561028057600080fd5b5061029b600480360381019061029691906131cf565b610a5a565b6040516102a89190613217565b60405180910390f35b3480156102bd57600080fd5b506102c6610ad4565b6040516102d391906132cb565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613323565b610b66565b6040516103109190613391565b60405180910390f35b34801561032557600080fd5b5061032e610beb565b60405161033b91906132cb565b60405180910390f35b34801561035057600080fd5b5061036b600480360381019061036691906133d8565b610c79565b005b34801561037957600080fd5b50610382610d90565b60405161038f9190613427565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613442565b610dc7565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906134cb565b610e27565b6040516103f59190613507565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613522565b610e47565b604051610433929190613562565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e919061358b565b610edb565b005b34801561047157600080fd5b5061048c6004803603810190610487919061358b565b610efc565b005b6104a860048036038101906104a39190613323565b610f7f565b6040516104b59190613427565b60405180910390f35b3480156104ca57600080fd5b506104d3611166565b005b3480156104e157600080fd5b506104ea6111fc565b005b3480156104f857600080fd5b50610513600480360381019061050e91906133d8565b611231565b6040516105209190613427565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190613442565b6112f8565b005b34801561055e57600080fd5b5061057960048036038101906105749190613323565b611318565b6040516105869190613642565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190613792565b611342565b005b3480156105c457600080fd5b506105cd611387565b6040516105da9190613217565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190613323565b61139e565b6040516106179190613391565b60405180910390f35b34801561062c57600080fd5b5061063561144f565b6040516106429190613217565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906137db565b611462565b60405161067f9190613427565b60405180910390f35b34801561069457600080fd5b5061069d611519565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190613846565b6115a1565b005b3480156106d457600080fd5b506106ef60048036038101906106ea9190613323565b611610565b6040516106fc9190613427565b60405180910390f35b34801561071157600080fd5b5061072c6004803603810190610727919061389f565b611634565b005b34801561073a57600080fd5b5061074361167c565b005b34801561075157600080fd5b5061075a6116b1565b6040516107679190613391565b60405180910390f35b34801561077c57600080fd5b506107976004803603810190610792919061358b565b6116db565b6040516107a49190613217565b60405180910390f35b3480156107b957600080fd5b506107c2611746565b6040516107cf91906132cb565b60405180910390f35b3480156107e457600080fd5b506107ed6117d8565b6040516107fa9190613507565b60405180910390f35b34801561080f57600080fd5b5061082a600480360381019061082591906138cc565b6117df565b005b34801561083857600080fd5b50610853600480360381019061084e919061390c565b6117f5565b005b34801561086157600080fd5b5061086a611842565b6040516108779190613427565b60405180910390f35b34801561088c57600080fd5b506108a760048036038101906108a29190613a00565b611848565b005b3480156108b557600080fd5b506108d060048036038101906108cb9190613aa8565b6118aa565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613323565b611914565b60405161090691906132cb565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190613846565b611948565b005b34801561094457600080fd5b5061095f600480360381019061095a919061358b565b6119b7565b005b34801561096d57600080fd5b5061098860048036038101906109839190613323565b6119d8565b6040516109959190613427565b60405180910390f35b3480156109aa57600080fd5b506109b36119ea565b6040516109c091906132cb565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190613ae8565b611a12565b6040516109fd9190613217565b60405180910390f35b348015610a1257600080fd5b50610a1b611aa6565b604051610a289190613507565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a5391906137db565b611aca565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610acd5750610acc82611e09565b5b9050919050565b606060008054610ae390613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0f90613b57565b8015610b5c5780601f10610b3157610100808354040283529160200191610b5c565b820191906000526020600020905b815481529060010190602001808311610b3f57829003601f168201915b5050505050905090565b6000610b7182611e83565b610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613bfa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610bf890613b57565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2490613b57565b8015610c715780601f10610c4657610100808354040283529160200191610c71565b820191906000526020600020905b815481529060010190602001808311610c5457829003601f168201915b505050505081565b6000610c848261139e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613c8c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d13611eef565b73ffffffffffffffffffffffffffffffffffffffff161480610d425750610d4181610d3c611eef565b611a12565b5b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890613d1e565b60405180910390fd5b610d8b8383611ef7565b505050565b6000600e6001600e80549050610da69190613d6d565b81548110610db757610db6613da1565b5b9060005260206000200154905090565b610dd8610dd2611eef565b82611fb0565b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90613e42565b60405180910390fd5b610e2283838361208e565b505050565b600060076000838152602001908152602001600020600101549050919050565b600080610e5384611e83565b610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613eae565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600c5485610ec69190613ece565b610ed09190613f57565b915091509250929050565b610ee482610e27565b610eed816122f4565b610ef78383612308565b505050565b610f04611eef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613ffa565b60405180910390fd5b610f7b82826123e9565b5050565b6000610f89611387565b15610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614066565b60405180910390fd5b600d60009054906101000a900460ff16611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f906140d2565b60405180910390fd5b816001111561105c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110539061413e565b60405180910390fd5b81600e6001600e805490506110719190613d6d565b8154811061108257611081613da1565b5b906000526020600020015410156110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c59061413e565b60405180910390fd5b346110d8836124cb565b14611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f906141aa565b60405180910390fd5b6111223383612594565b60046010600084815260200190815260200160002060006101000a81548160ff02191690836005811115611159576111586135cb565b5b0217905550819050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611190816122f4565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111f8573d6000803e3d6000fd5b5050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611226816122f4565b61122e61276d565b50565b60007f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861125d816122f4565b6112678484612594565b6103e883116112b15760046010600085815260200190815260200160002060006101000a81548160ff021916908360058111156112a7576112a66135cb565b5b02179055506112ee565b60016010600085815260200190815260200160002060006101000a81548160ff021916908360058111156112e8576112e76135cb565b5b02179055505b8291505092915050565b61131383838360405180602001604052806000815250611848565b505050565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861136c816122f4565b81600990805190602001906113829291906130c0565b505050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d9061423c565b60405180910390fd5b80915050919050565b600d60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906142ce565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611521611eef565b73ffffffffffffffffffffffffffffffffffffffff1661153f6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061433a565b60405180910390fd5b61159f600061280f565b565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086115cb816122f4565b81600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600e818154811061162057600080fd5b906000526020600020016000915090505481565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861165e816122f4565b81600d60006101000a81548160ff0219169083151502179055505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086116a6816122f4565b6116ae6128d5565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606001805461175590613b57565b80601f016020809104026020016040519081016040528092919081815260200182805461178190613b57565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b5050505050905090565b6000801b81565b6117f16117ea611eef565b8383612978565b5050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861181f816122f4565b61183c848466038d7ea4c68000856118379190613ece565b612ae4565b50505050565b600c5481565b611859611853611eef565b83611fb0565b611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613e42565b60405180910390fd5b6118a484848484612b67565b50505050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b086118d4816122f4565b816010600085815260200190815260200160002060006101000a81548160ff0219169083600581111561190a576119096135cb565b5b0217905550505050565b6060600961192183612bc3565b604051602001611932929190614476565b6040516020818303038152906040529050919050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08611972816122f4565b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6119c082610e27565b6119c9816122f4565b6119d383836123e9565b505050565b60006119e3826124cb565b9050919050565b606060096040516020016119fe91906144f1565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b611ad2611eef565b73ffffffffffffffffffffffffffffffffffffffff16611af06116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3d9061433a565b60405180910390fd5b6000611b506116b1565b9050611b5b8261280f565b611b857f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0883610edb565b611b926000801b83610edb565b611bbc7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08826119b7565b611bc96000801b826119b7565b5050565b606060006002836002611be09190613ece565b611bea9190614513565b67ffffffffffffffff811115611c0357611c02613667565b5b6040519080825280601f01601f191660200182016040528015611c355781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c6d57611c6c613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cd157611cd0613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d119190613ece565b611d1b9190614513565b90505b6001811115611dbb577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d5d57611d5c613da1565b5b1a60f81b828281518110611d7457611d73613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611db490614569565b9050611d1e565b5060008414611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df6906145de565b60405180910390fd5b8091505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e7c5750611e7b82612d23565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6a8361139e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fbb82611e83565b611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff190614670565b60405180910390fd5b60006120058361139e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204757506120468185611a12565b5b8061208557508373ffffffffffffffffffffffffffffffffffffffff1661206d84610b66565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120ae8261139e565b73ffffffffffffffffffffffffffffffffffffffff1614612104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fb90614702565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a90614794565b60405180910390fd5b61217e838383612e05565b612189600082611ef7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d99190613d6d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122309190614513565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122ef838383612e0a565b505050565b61230581612300611eef565b612e0f565b50565b61231282826116db565b6123e55760016007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061238a611eef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6123f382826116db565b156124c75760006007600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061246c611eef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080600e8054905090505b6000811115612589576000600f6000600e6001856124f59190613d6d565b8154811061250657612505613da1565b5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816000015111158015612562575083816020015110155b156125755780604001519250505061258f565b50808061258190614569565b9150506124d7565b50600090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90614800565b60405180910390fd5b61260c81611e83565b1561264c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126439061486c565b60405180910390fd5b61265860008383612e05565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a89190614513565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461276960008383612e0a565b5050565b612775611387565b6127b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ab906148d8565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127f8611eef565b6040516128059190613391565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128dd611387565b1561291d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291490614066565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612961611eef565b60405161296e9190613391565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129dd90614944565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ad79190613217565b60405180910390a3505050565b6000604051806060016040528085815260200184815260200183815250905080600f6000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600e83908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b612b7284848461208e565b612b7e84848484612eac565b612bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb4906149d6565b60405180910390fd5b50505050565b606060008203612c0a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d1e565b600082905060005b60008214612c3c578080612c25906149f6565b915050600a82612c359190613f57565b9150612c12565b60008167ffffffffffffffff811115612c5857612c57613667565b5b6040519080825280601f01601f191660200182016040528015612c8a5781602001600182028036833780820191505090505b5090505b60008514612d1757600182612ca39190613d6d565b9150600a85612cb29190614a3e565b6030612cbe9190614513565b60f81b818381518110612cd457612cd3613da1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d109190613f57565b9450612c8e565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612dfe5750612dfd82613033565b5b9050919050565b505050565b505050565b612e1982826116db565b612ea857612e3e8173ffffffffffffffffffffffffffffffffffffffff166014611bcd565b612e4c8360001c6020611bcd565b604051602001612e5d929190614b07565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9f91906132cb565b60405180910390fd5b5050565b6000612ecd8473ffffffffffffffffffffffffffffffffffffffff1661309d565b15613026578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef6611eef565b8786866040518563ffffffff1660e01b8152600401612f189493929190614b96565b6020604051808303816000875af1925050508015612f5457506040513d601f19601f82011682018060405250810190612f519190614bf7565b60015b612fd6573d8060008114612f84576040519150601f19603f3d011682016040523d82523d6000602084013e612f89565b606091505b506000815103612fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc5906149d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061302b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546130cc90613b57565b90600052602060002090601f0160209004810192826130ee5760008555613135565b82601f1061310757805160ff1916838001178555613135565b82800160010185558215613135579182015b82811115613134578251825591602001919060010190613119565b5b5090506131429190613146565b5090565b5b8082111561315f576000816000905550600101613147565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131ac81613177565b81146131b757600080fd5b50565b6000813590506131c9816131a3565b92915050565b6000602082840312156131e5576131e461316d565b5b60006131f3848285016131ba565b91505092915050565b60008115159050919050565b613211816131fc565b82525050565b600060208201905061322c6000830184613208565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561326c578082015181840152602081019050613251565b8381111561327b576000848401525b50505050565b6000601f19601f8301169050919050565b600061329d82613232565b6132a7818561323d565b93506132b781856020860161324e565b6132c081613281565b840191505092915050565b600060208201905081810360008301526132e58184613292565b905092915050565b6000819050919050565b613300816132ed565b811461330b57600080fd5b50565b60008135905061331d816132f7565b92915050565b6000602082840312156133395761333861316d565b5b60006133478482850161330e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061337b82613350565b9050919050565b61338b81613370565b82525050565b60006020820190506133a66000830184613382565b92915050565b6133b581613370565b81146133c057600080fd5b50565b6000813590506133d2816133ac565b92915050565b600080604083850312156133ef576133ee61316d565b5b60006133fd858286016133c3565b925050602061340e8582860161330e565b9150509250929050565b613421816132ed565b82525050565b600060208201905061343c6000830184613418565b92915050565b60008060006060848603121561345b5761345a61316d565b5b6000613469868287016133c3565b935050602061347a868287016133c3565b925050604061348b8682870161330e565b9150509250925092565b6000819050919050565b6134a881613495565b81146134b357600080fd5b50565b6000813590506134c58161349f565b92915050565b6000602082840312156134e1576134e061316d565b5b60006134ef848285016134b6565b91505092915050565b61350181613495565b82525050565b600060208201905061351c60008301846134f8565b92915050565b600080604083850312156135395761353861316d565b5b60006135478582860161330e565b92505060206135588582860161330e565b9150509250929050565b60006040820190506135776000830185613382565b6135846020830184613418565b9392505050565b600080604083850312156135a2576135a161316d565b5b60006135b0858286016134b6565b92505060206135c1858286016133c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061360b5761360a6135cb565b5b50565b600081905061361c826135fa565b919050565b600061362c8261360e565b9050919050565b61363c81613621565b82525050565b60006020820190506136576000830184613633565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61369f82613281565b810181811067ffffffffffffffff821117156136be576136bd613667565b5b80604052505050565b60006136d1613163565b90506136dd8282613696565b919050565b600067ffffffffffffffff8211156136fd576136fc613667565b5b61370682613281565b9050602081019050919050565b82818337600083830152505050565b6000613735613730846136e2565b6136c7565b90508281526020810184848401111561375157613750613662565b5b61375c848285613713565b509392505050565b600082601f8301126137795761377861365d565b5b8135613789848260208601613722565b91505092915050565b6000602082840312156137a8576137a761316d565b5b600082013567ffffffffffffffff8111156137c6576137c5613172565b5b6137d284828501613764565b91505092915050565b6000602082840312156137f1576137f061316d565b5b60006137ff848285016133c3565b91505092915050565b600061381382613350565b9050919050565b61382381613808565b811461382e57600080fd5b50565b6000813590506138408161381a565b92915050565b60006020828403121561385c5761385b61316d565b5b600061386a84828501613831565b91505092915050565b61387c816131fc565b811461388757600080fd5b50565b60008135905061389981613873565b92915050565b6000602082840312156138b5576138b461316d565b5b60006138c38482850161388a565b91505092915050565b600080604083850312156138e3576138e261316d565b5b60006138f1858286016133c3565b92505060206139028582860161388a565b9150509250929050565b6000806000606084860312156139255761392461316d565b5b60006139338682870161330e565b93505060206139448682870161330e565b92505060406139558682870161330e565b9150509250925092565b600067ffffffffffffffff82111561397a57613979613667565b5b61398382613281565b9050602081019050919050565b60006139a361399e8461395f565b6136c7565b9050828152602081018484840111156139bf576139be613662565b5b6139ca848285613713565b509392505050565b600082601f8301126139e7576139e661365d565b5b81356139f7848260208601613990565b91505092915050565b60008060008060808587031215613a1a57613a1961316d565b5b6000613a28878288016133c3565b9450506020613a39878288016133c3565b9350506040613a4a8782880161330e565b925050606085013567ffffffffffffffff811115613a6b57613a6a613172565b5b613a77878288016139d2565b91505092959194509250565b60068110613a9057600080fd5b50565b600081359050613aa281613a83565b92915050565b60008060408385031215613abf57613abe61316d565b5b6000613acd8582860161330e565b9250506020613ade85828601613a93565b9150509250929050565b60008060408385031215613aff57613afe61316d565b5b6000613b0d858286016133c3565b9250506020613b1e858286016133c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b6f57607f821691505b602082108103613b8257613b81613b28565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613be4602c8361323d565b9150613bef82613b88565b604082019050919050565b60006020820190508181036000830152613c1381613bd7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c7660218361323d565b9150613c8182613c1a565b604082019050919050565b60006020820190508181036000830152613ca581613c69565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d0860388361323d565b9150613d1382613cac565b604082019050919050565b60006020820190508181036000830152613d3781613cfb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d78826132ed565b9150613d83836132ed565b925082821015613d9657613d95613d3e565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e2c60318361323d565b9150613e3782613dd0565b604082019050919050565b60006020820190508181036000830152613e5b81613e1f565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000613e9860118361323d565b9150613ea382613e62565b602082019050919050565b60006020820190508181036000830152613ec781613e8b565b9050919050565b6000613ed9826132ed565b9150613ee4836132ed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1d57613f1c613d3e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f62826132ed565b9150613f6d836132ed565b925082613f7d57613f7c613f28565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613fe4602f8361323d565b9150613fef82613f88565b604082019050919050565b6000602082019050818103600083015261401381613fd7565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061405060108361323d565b915061405b8261401a565b602082019050919050565b6000602082019050818103600083015261407f81614043565b9050919050565b7f53616c6520686173206e6f7420626567756e0000000000000000000000000000600082015250565b60006140bc60128361323d565b91506140c782614086565b602082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b7f43616e2774206275790000000000000000000000000000000000000000000000600082015250565b600061412860098361323d565b9150614133826140f2565b602082019050919050565b600060208201905081810360008301526141578161411b565b9050919050565b7f496e636f7272656374204554482073656e743b20636865636b20707269636521600082015250565b600061419460208361323d565b915061419f8261415e565b602082019050919050565b600060208201905081810360008301526141c381614187565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061422660298361323d565b9150614231826141ca565b604082019050919050565b6000602082019050818103600083015261425581614219565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006142b8602a8361323d565b91506142c38261425c565b604082019050919050565b600060208201905081810360008301526142e7816142ab565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061432460208361323d565b915061432f826142ee565b602082019050919050565b6000602082019050818103600083015261435381614317565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461438781613b57565b614391818661435a565b945060018216600081146143ac57600181146143bd576143f0565b60ff198316865281860193506143f0565b6143c685614365565b60005b838110156143e8578154818901526001820191506020810190506143c9565b838801955050505b50505092915050565b600061440482613232565b61440e818561435a565b935061441e81856020860161324e565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061446060058361435a565b915061446b8261442a565b600582019050919050565b6000614482828561437a565b915061448e82846143f9565b915061449982614453565b91508190509392505050565b7f6d657461646174612e6a736f6e00000000000000000000000000000000000000600082015250565b60006144db600d8361435a565b91506144e6826144a5565b600d82019050919050565b60006144fd828461437a565b9150614508826144ce565b915081905092915050565b600061451e826132ed565b9150614529836132ed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561455e5761455d613d3e565b5b828201905092915050565b6000614574826132ed565b91506000820361458757614586613d3e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006145c860208361323d565b91506145d382614592565b602082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061465a602c8361323d565b9150614665826145fe565b604082019050919050565b600060208201905081810360008301526146898161464d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146ec60258361323d565b91506146f782614690565b604082019050919050565b6000602082019050818103600083015261471b816146df565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061477e60248361323d565b915061478982614722565b604082019050919050565b600060208201905081810360008301526147ad81614771565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006147ea60208361323d565b91506147f5826147b4565b602082019050919050565b60006020820190508181036000830152614819816147dd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614856601c8361323d565b915061486182614820565b602082019050919050565b6000602082019050818103600083015261488581614849565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006148c260148361323d565b91506148cd8261488c565b602082019050919050565b600060208201905081810360008301526148f1816148b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061492e60198361323d565b9150614939826148f8565b602082019050919050565b6000602082019050818103600083015261495d81614921565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149c060328361323d565b91506149cb82614964565b604082019050919050565b600060208201905081810360008301526149ef816149b3565b9050919050565b6000614a01826132ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a3357614a32613d3e565b5b600182019050919050565b6000614a49826132ed565b9150614a54836132ed565b925082614a6457614a63613f28565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614aa560178361435a565b9150614ab082614a6f565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614af160118361435a565b9150614afc82614abb565b601182019050919050565b6000614b1282614a98565b9150614b1e82856143f9565b9150614b2982614ae4565b9150614b3582846143f9565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614b6882614b41565b614b728185614b4c565b9350614b8281856020860161324e565b614b8b81613281565b840191505092915050565b6000608082019050614bab6000830187613382565b614bb86020830186613382565b614bc56040830185613418565b8181036060830152614bd78184614b5d565b905095945050505050565b600081519050614bf1816131a3565b92915050565b600060208284031215614c0d57614c0c61316d565b5b6000614c1b84828501614be2565b9150509291505056fea2646970667358221220802f0f949095018a8fa6b892b31bfb209022d8bc8f273b1706c69af3af8d1a6164736f6c634300080e0033
Deployed Bytecode Sourcemap
51723:6182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56648:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22705:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24265:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51908:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23788:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56936:164;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25015:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43241:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56320:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;43634:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44682:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55575:506;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54082:152;;;;;;;;;;;;;:::i;:::-;;54345:101;;;;;;;;;;;;;:::i;:::-;;53545:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25425:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57269:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54454:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47935:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22399:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52246:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22129:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50838:103;;;;;;;;;;;;;:::i;:::-;;53899:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52283:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55444:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54242:97;;;;;;;;;;;;;:::i;:::-;;50187:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41701:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22874:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40806:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24558:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52897:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52197:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25681:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57108:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54793:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56089:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44026:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53397:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54607:178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24784:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51837:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55043:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56648:280;56810:4;56854:26;56839:41;;;:11;:41;;;;:81;;;;56884:36;56908:11;56884:23;:36::i;:::-;56839:81;56832:88;;56648:280;;;:::o;22705:100::-;22759:13;22792:5;22785:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22705:100;:::o;24265:221::-;24341:7;24369:16;24377:7;24369;:16::i;:::-;24361:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24454:15;:24;24470:7;24454:24;;;;;;;;;;;;;;;;;;;;;24447:31;;24265:221;;;:::o;51908:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23788:411::-;23869:13;23885:23;23900:7;23885:14;:23::i;:::-;23869:39;;23933:5;23927:11;;:2;:11;;;23919:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24027:5;24011:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24036:37;24053:5;24060:12;:10;:12::i;:::-;24036:16;:37::i;:::-;24011:62;23989:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24170:21;24179:2;24183:7;24170:8;:21::i;:::-;23858:341;23788:411;;:::o;56936:164::-;57015:7;57047:16;57090:1;57064:16;:23;;;;:27;;;;:::i;:::-;57047:45;;;;;;;;:::i;:::-;;;;;;;;;;57040:52;;56936:164;:::o;25015:339::-;25210:41;25229:12;:10;:12::i;:::-;25243:7;25210:18;:41::i;:::-;25202:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25318:28;25328:4;25334:2;25338:7;25318:9;:28::i;:::-;25015:339;;;:::o;43241:131::-;43315:7;43342:6;:12;43349:4;43342:12;;;;;;;;;;;:22;;;43335:29;;43241:131;;;:::o;56320:320::-;56445:16;56463:21;56510:16;56518:7;56510;:16::i;:::-;56502:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56575:14;;;;;;;;;;;56625:5;56610:13;;56598:9;:25;;;;:::i;:::-;56597:33;;;;:::i;:::-;56559:73;;;;56320:320;;;;;:::o;43634:147::-;43717:18;43730:4;43717:12;:18::i;:::-;41297:16;41308:4;41297:10;:16::i;:::-;43748:25:::1;43759:4;43765:7;43748:10;:25::i;:::-;43634:147:::0;;;:::o;44682:218::-;44789:12;:10;:12::i;:::-;44778:23;;:7;:23;;;44770:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;44866:26;44878:4;44884:7;44866:11;:26::i;:::-;44682:218;;:::o;55575:506::-;55683:7;48261:8;:6;:8::i;:::-;48260:9;48252:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55716:10:::1;;;;;;;;;;;55708:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;55773:7;55768:1;:12;;55760:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;55862:7;55813:16;55856:1;55830:16;:23;;;;:27;;;;:::i;:::-;55813:45;;;;;;;;:::i;:::-;;;;;;;;;;:56;;55805:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;55921:9;55902:15;55909:7;55902:6;:15::i;:::-;:28;55894:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55978:26;55984:10;55996:7;55978:5;:26::i;:::-;56037:11;56015:10;:19;56026:7;56015:19;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;56066:7;56059:14;;55575:506:::0;;;:::o;54082:152::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;54176:17:::1;;;;;;;;;;;54168:35;;:58;54204:21;54168:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54082:152:::0;:::o;54345:101::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;54428:10:::1;:8;:10::i;:::-;54345:101:::0;:::o;53545:346::-;53656:7;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;53681:18:::1;53687:2;53691:7;53681:5;:18::i;:::-;53725:4;53714:7;:15;53710:149;;53768:11;53746:10;:19;53757:7;53746:19;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53710:149;;;53834:13;53812:10;:19;53823:7;53812:19;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53710:149;53876:7;53869:14;;53545:346:::0;;;;;:::o;25425:185::-;25563:39;25580:4;25586:2;25590:7;25563:39;;;;;;;;;;;;:16;:39::i;:::-;25425:185;;;:::o;57269:144::-;57355:6;57386:10;:19;57397:7;57386:19;;;;;;;;;;;;;;;;;;;;;57379:26;;57269:144;;;:::o;54454:145::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;54583:8:::1;54564:16;:27;;;;;;;;;;;;:::i;:::-;;54454:145:::0;;:::o;47935:86::-;47982:4;48006:7;;;;;;;;;;;47999:14;;47935:86;:::o;22399:239::-;22471:7;22491:13;22507:7;:16;22515:7;22507:16;;;;;;;;;;;;;;;;;;;;;22491:32;;22559:1;22542:19;;:5;:19;;;22534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22625:5;22618:12;;;22399:239;;;:::o;52246:30::-;;;;;;;;;;;;;:::o;22129:208::-;22201:7;22246:1;22229:19;;:5;:19;;;22221:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22313:9;:16;22323:5;22313:16;;;;;;;;;;;;;;;;22306:23;;22129:208;;;:::o;50838:103::-;50418:12;:10;:12::i;:::-;50407:23;;:7;:5;:7::i;:::-;:23;;;50399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50903:30:::1;50930:1;50903:18;:30::i;:::-;50838:103::o:0;53899:177::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;54050:17:::1;54029;;:39;;;;;;;;;;;;;;;;;;53899:177:::0;;:::o;52283:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55444:123::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;55556:3:::1;55543:10;;:16;;;;;;;;;;;;;;;;;;55444:123:::0;;:::o;54242:97::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;54323:8:::1;:6;:8::i;:::-;54242:97:::0;:::o;50187:87::-;50233:7;50260:6;;;;;;;;;;;50253:13;;50187:87;:::o;41701:147::-;41787:4;41811:6;:12;41818:4;41811:12;;;;;;;;;;;:20;;:29;41832:7;41811:29;;;;;;;;;;;;;;;;;;;;;;;;;41804:36;;41701:147;;;;:::o;22874:104::-;22930:13;22963:7;22956:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22874:104;:::o;40806:49::-;40851:4;40806:49;;;:::o;24558:155::-;24653:52;24672:12;:10;:12::i;:::-;24686:8;24696;24653:18;:52::i;:::-;24558:155;;:::o;52897:178::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;53026:41:::1;53036:5;53043;53059:6;53050:5;:16;;;;:::i;:::-;53026:9;:41::i;:::-;52897:178:::0;;;;:::o;52197:34::-;;;;:::o;25681:328::-;25856:41;25875:12;:10;:12::i;:::-;25889:7;25856:18;:41::i;:::-;25848:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25962:39;25976:4;25982:2;25986:7;25995:5;25962:13;:39::i;:::-;25681:328;;;;:::o;57108:153::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;57247:6:::1;57225:10;:19;57236:7;57225:19;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;57108:153:::0;;;:::o;54793:242::-;54911:13;54973:16;54991:25;55008:7;54991:16;:25::i;:::-;54956:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54942:85;;54793:242;;;:::o;56089:165::-;51876:25;41297:16;41308:4;41297:10;:16::i;:::-;56231:14:::1;56213;;:33;;;;;;;;;;;;;;;;;;56089:165:::0;;:::o;44026:149::-;44110:18;44123:4;44110:12;:18::i;:::-;41297:16;41308:4;41297:10;:16::i;:::-;44141:26:::1;44153:4;44159:7;44141:11;:26::i;:::-;44026:149:::0;;;:::o;53397:140::-;53482:7;53514:15;53521:7;53514:6;:15::i;:::-;53507:22;;53397:140;;;:::o;54607:178::-;54680:13;54742:16;54725:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;54711:66;;54607:178;:::o;24784:164::-;24881:4;24905:18;:25;24924:5;24905:25;;;;;;;;;;;;;;;:35;24931:8;24905:35;;;;;;;;;;;;;;;;;;;;;;;;;24898:42;;24784:164;;;;:::o;51837:64::-;51876:25;51837:64;:::o;55043:393::-;50418:12;:10;:12::i;:::-;50407:23;;:7;:5;:7::i;:::-;:23;;;50399:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55158:20:::1;55181:7;:5;:7::i;:::-;55158:30;;55199:29;55218:9;55199:18;:29::i;:::-;55239:34;51876:25;55263:9;55239;:34::i;:::-;55284:40;40851:4;55294:18:::0;::::1;55314:9;55284;:40::i;:::-;55335:38;51876:25;55360:12;55335:10;:38::i;:::-;55384:44;40851:4;55395:18:::0;::::1;55415:12;55384:10;:44::i;:::-;55147:289;55043:393:::0;:::o;18858:451::-;18933:13;18959:19;19004:1;18995:6;18991:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18981:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18959:47;;19017:15;:6;19024:1;19017:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19043;:6;19050:1;19043:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19074:9;19099:1;19090:6;19086:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19074:26;;19069:135;19106:1;19102;:5;19069:135;;;19141:12;19162:3;19154:5;:11;19141:25;;;;;;;:::i;:::-;;;;;19129:6;19136:1;19129:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;19191:1;19181:11;;;;;19109:3;;;;:::i;:::-;;;19069:135;;;;19231:1;19222:5;:10;19214:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;19294:6;19280:21;;;18858:451;;;;:::o;41405:204::-;41490:4;41529:32;41514:47;;;:11;:47;;;;:87;;;;41565:36;41589:11;41565:23;:36::i;:::-;41514:87;41507:94;;41405:204;;;:::o;27519:127::-;27584:4;27636:1;27608:30;;:7;:16;27616:7;27608:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27601:37;;27519:127;;;:::o;16972:98::-;17025:7;17052:10;17045:17;;16972:98;:::o;31665:174::-;31767:2;31740:15;:24;31756:7;31740:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31823:7;31819:2;31785:46;;31794:23;31809:7;31794:14;:23::i;:::-;31785:46;;;;;;;;;;;;31665:174;;:::o;27813:348::-;27906:4;27931:16;27939:7;27931;:16::i;:::-;27923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28007:13;28023:23;28038:7;28023:14;:23::i;:::-;28007:39;;28076:5;28065:16;;:7;:16;;;:52;;;;28085:32;28102:5;28109:7;28085:16;:32::i;:::-;28065:52;:87;;;;28145:7;28121:31;;:20;28133:7;28121:11;:20::i;:::-;:31;;;28065:87;28057:96;;;27813:348;;;;:::o;30922:625::-;31081:4;31054:31;;:23;31069:7;31054:14;:23::i;:::-;:31;;;31046:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31160:1;31146:16;;:2;:16;;;31138:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31216:39;31237:4;31243:2;31247:7;31216:20;:39::i;:::-;31320:29;31337:1;31341:7;31320:8;:29::i;:::-;31381:1;31362:9;:15;31372:4;31362:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31410:1;31393:9;:13;31403:2;31393:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31441:2;31422:7;:16;31430:7;31422:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31480:7;31476:2;31461:27;;31470:4;31461:27;;;;;;;;;;;;31501:38;31521:4;31527:2;31531:7;31501:19;:38::i;:::-;30922:625;;;:::o;42152:105::-;42219:30;42230:4;42236:12;:10;:12::i;:::-;42219:10;:30::i;:::-;42152:105;:::o;46183:238::-;46267:22;46275:4;46281:7;46267;:22::i;:::-;46262:152;;46338:4;46306:6;:12;46313:4;46306:12;;;;;;;;;;;:20;;:29;46327:7;46306:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;46389:12;:10;:12::i;:::-;46362:40;;46380:7;46362:40;;46374:4;46362:40;;;;;;;;;;46262:152;46183:238;;:::o;46553:239::-;46637:22;46645:4;46651:7;46637;:22::i;:::-;46633:152;;;46708:5;46676:6;:12;46683:4;46676:12;;;;;;;;;;;:20;;:29;46697:7;46676:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;46760:12;:10;:12::i;:::-;46733:40;;46751:7;46733:40;;46745:4;46733:40;;;;;;;;;;46633:152;46553:239;;:::o;57421:406::-;57521:7;57551:9;57563:16;:23;;;;57551:35;;57546:255;57592:1;57588;:5;57546:255;;;57615:18;57636:9;:32;57646:16;57665:1;57663;:3;;;;:::i;:::-;57646:21;;;;;;;;:::i;:::-;;;;;;;;;;57636:32;;;;;;;;;;;57615:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57702:7;57687:5;:11;;;:22;;:48;;;;;57728:7;57713:5;:11;;;:22;;57687:48;57683:107;;;57763:5;:11;;;57756:18;;;;;;57683:107;57600:201;57595:3;;;;;:::i;:::-;;;;57546:255;;;;57818:1;57811:8;;57421:406;;;;:::o;29497:439::-;29591:1;29577:16;;:2;:16;;;29569:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29650:16;29658:7;29650;:16::i;:::-;29649:17;29641:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29712:45;29741:1;29745:2;29749:7;29712:20;:45::i;:::-;29787:1;29770:9;:13;29780:2;29770:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29818:2;29799:7;:16;29807:7;29799:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29863:7;29859:2;29838:33;;29855:1;29838:33;;;;;;;;;;;;29884:44;29912:1;29916:2;29920:7;29884:19;:44::i;:::-;29497:439;;:::o;48994:120::-;48538:8;:6;:8::i;:::-;48530:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;49063:5:::1;49053:7;;:15;;;;;;;;;;;;;;;;;;49084:22;49093:12;:10;:12::i;:::-;49084:22;;;;;;:::i;:::-;;;;;;;;48994:120::o:0;51457:191::-;51531:16;51550:6;;;;;;;;;;;51531:25;;51576:8;51567:6;;:17;;;;;;;;;;;;;;;;;;51631:8;51600:40;;51621:8;51600:40;;;;;;;;;;;;51520:128;51457:191;:::o;48735:118::-;48261:8;:6;:8::i;:::-;48260:9;48252:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48805:4:::1;48795:7;;:14;;;;;;;;;;;;;;;;;;48825:20;48832:12;:10;:12::i;:::-;48825:20;;;;;;:::i;:::-;;;;;;;;48735:118::o:0;31981:315::-;32136:8;32127:17;;:5;:17;;;32119:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32223:8;32185:18;:25;32204:5;32185:25;;;;;;;;;;;;;;;:35;32211:8;32185:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32269:8;32247:41;;32262:5;32247:41;;;32279:8;32247:41;;;;;;:::i;:::-;;;;;;;;31981:315;;;:::o;53083:306::-;53181:21;53205:99;;;;;;;;53233:5;53205:99;;;;53260:5;53205:99;;;;53287:5;53205:99;;;53181:123;;53334:8;53315:9;:16;53325:5;53315:16;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;53353:16;53375:5;53353:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53170:219;53083:306;;;:::o;26891:315::-;27048:28;27058:4;27064:2;27068:7;27048:9;:28::i;:::-;27095:48;27118:4;27124:2;27128:7;27137:5;27095:22;:48::i;:::-;27087:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26891:315;;;;:::o;17557:723::-;17613:13;17843:1;17834:5;:10;17830:53;;17861:10;;;;;;;;;;;;;;;;;;;;;17830:53;17893:12;17908:5;17893:20;;17924:14;17949:78;17964:1;17956:4;:9;17949:78;;17982:8;;;;;:::i;:::-;;;;18013:2;18005:10;;;;;:::i;:::-;;;17949:78;;;18037:19;18069:6;18059:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18037:39;;18087:154;18103:1;18094:5;:10;18087:154;;18131:1;18121:11;;;;;:::i;:::-;;;18198:2;18190:5;:10;;;;:::i;:::-;18177:2;:24;;;;:::i;:::-;18164:39;;18147:6;18154;18147:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18227:2;18218:11;;;;;:::i;:::-;;;18087:154;;;18265:6;18251:21;;;;;17557:723;;;;:::o;21760:305::-;21862:4;21914:25;21899:40;;;:11;:40;;;;:105;;;;21971:33;21956:48;;;:11;:48;;;;21899:105;:158;;;;22021:36;22045:11;22021:23;:36::i;:::-;21899:158;21879:178;;21760:305;;;:::o;34232:126::-;;;;:::o;34743:125::-;;;;:::o;42547:505::-;42636:22;42644:4;42650:7;42636;:22::i;:::-;42631:414;;42824:41;42852:7;42824:41;;42862:2;42824:19;:41::i;:::-;42938:38;42966:4;42958:13;;42973:2;42938:19;:38::i;:::-;42729:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42675:358;;;;;;;;;;;:::i;:::-;;;;;;;;42631:414;42547:505;;:::o;32861:799::-;33016:4;33037:15;:2;:13;;;:15::i;:::-;33033:620;;;33089:2;33073:36;;;33110:12;:10;:12::i;:::-;33124:4;33130:7;33139:5;33073:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33069:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33332:1;33315:6;:13;:18;33311:272;;33358:60;;;;;;;;;;:::i;:::-;;;;;;;;33311:272;33533:6;33527:13;33518:6;33514:2;33510:15;33503:38;33069:529;33206:41;;;33196:51;;;:6;:51;;;;33189:58;;;;;33033:620;33637:4;33630:11;;32861:799;;;;;;;:::o;20185:157::-;20270:4;20309:25;20294:40;;;:11;:40;;;;20287:47;;20185:157;;;:::o;9017:326::-;9077:4;9334:1;9312:7;:19;;;:23;9305:30;;9017:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:329::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6271:329;;;;:::o;6606:118::-;6693:24;6711:5;6693:24;:::i;:::-;6688:3;6681:37;6606:118;;:::o;6730:222::-;6823:4;6861:2;6850:9;6846:18;6838:26;;6874:71;6942:1;6931:9;6927:17;6918:6;6874:71;:::i;:::-;6730:222;;;;:::o;6958:474::-;7026:6;7034;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;7336:2;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7307:118;6958:474;;;;;:::o;7438:332::-;7559:4;7597:2;7586:9;7582:18;7574:26;;7610:71;7678:1;7667:9;7663:17;7654:6;7610:71;:::i;:::-;7691:72;7759:2;7748:9;7744:18;7735:6;7691:72;:::i;:::-;7438:332;;;;;:::o;7776:474::-;7844:6;7852;7901:2;7889:9;7880:7;7876:23;7872:32;7869:119;;;7907:79;;:::i;:::-;7869:119;8027:1;8052:53;8097:7;8088:6;8077:9;8073:22;8052:53;:::i;:::-;8042:63;;7998:117;8154:2;8180:53;8225:7;8216:6;8205:9;8201:22;8180:53;:::i;:::-;8170:63;;8125:118;7776:474;;;;;:::o;8256:180::-;8304:77;8301:1;8294:88;8401:4;8398:1;8391:15;8425:4;8422:1;8415:15;8442:116;8526:1;8519:5;8516:12;8506:46;;8532:18;;:::i;:::-;8506:46;8442:116;:::o;8564:133::-;8612:7;8641:5;8630:16;;8647:44;8685:5;8647:44;:::i;:::-;8564:133;;;:::o;8703:::-;8762:9;8795:35;8824:5;8795:35;:::i;:::-;8782:48;;8703:133;;;:::o;8842:149::-;8938:46;8978:5;8938:46;:::i;:::-;8933:3;8926:59;8842:149;;:::o;8997:240::-;9099:4;9137:2;9126:9;9122:18;9114:26;;9150:80;9227:1;9216:9;9212:17;9203:6;9150:80;:::i;:::-;8997:240;;;;:::o;9243:117::-;9352:1;9349;9342:12;9366:117;9475:1;9472;9465:12;9489:180;9537:77;9534:1;9527:88;9634:4;9631:1;9624:15;9658:4;9655:1;9648:15;9675:281;9758:27;9780:4;9758:27;:::i;:::-;9750:6;9746:40;9888:6;9876:10;9873:22;9852:18;9840:10;9837:34;9834:62;9831:88;;;9899:18;;:::i;:::-;9831:88;9939:10;9935:2;9928:22;9718:238;9675:281;;:::o;9962:129::-;9996:6;10023:20;;:::i;:::-;10013:30;;10052:33;10080:4;10072:6;10052:33;:::i;:::-;9962:129;;;:::o;10097:308::-;10159:4;10249:18;10241:6;10238:30;10235:56;;;10271:18;;:::i;:::-;10235:56;10309:29;10331:6;10309:29;:::i;:::-;10301:37;;10393:4;10387;10383:15;10375:23;;10097:308;;;:::o;10411:154::-;10495:6;10490:3;10485;10472:30;10557:1;10548:6;10543:3;10539:16;10532:27;10411:154;;;:::o;10571:412::-;10649:5;10674:66;10690:49;10732:6;10690:49;:::i;:::-;10674:66;:::i;:::-;10665:75;;10763:6;10756:5;10749:21;10801:4;10794:5;10790:16;10839:3;10830:6;10825:3;10821:16;10818:25;10815:112;;;10846:79;;:::i;:::-;10815:112;10936:41;10970:6;10965:3;10960;10936:41;:::i;:::-;10655:328;10571:412;;;;;:::o;11003:340::-;11059:5;11108:3;11101:4;11093:6;11089:17;11085:27;11075:122;;11116:79;;:::i;:::-;11075:122;11233:6;11220:20;11258:79;11333:3;11325:6;11318:4;11310:6;11306:17;11258:79;:::i;:::-;11249:88;;11065:278;11003:340;;;;:::o;11349:509::-;11418:6;11467:2;11455:9;11446:7;11442:23;11438:32;11435:119;;;11473:79;;:::i;:::-;11435:119;11621:1;11610:9;11606:17;11593:31;11651:18;11643:6;11640:30;11637:117;;;11673:79;;:::i;:::-;11637:117;11778:63;11833:7;11824:6;11813:9;11809:22;11778:63;:::i;:::-;11768:73;;11564:287;11349:509;;;;:::o;11864:329::-;11923:6;11972:2;11960:9;11951:7;11947:23;11943:32;11940:119;;;11978:79;;:::i;:::-;11940:119;12098:1;12123:53;12168:7;12159:6;12148:9;12144:22;12123:53;:::i;:::-;12113:63;;12069:117;11864:329;;;;:::o;12199:104::-;12244:7;12273:24;12291:5;12273:24;:::i;:::-;12262:35;;12199:104;;;:::o;12309:138::-;12390:32;12416:5;12390:32;:::i;:::-;12383:5;12380:43;12370:71;;12437:1;12434;12427:12;12370:71;12309:138;:::o;12453:155::-;12507:5;12545:6;12532:20;12523:29;;12561:41;12596:5;12561:41;:::i;:::-;12453:155;;;;:::o;12614:345::-;12681:6;12730:2;12718:9;12709:7;12705:23;12701:32;12698:119;;;12736:79;;:::i;:::-;12698:119;12856:1;12881:61;12934:7;12925:6;12914:9;12910:22;12881:61;:::i;:::-;12871:71;;12827:125;12614:345;;;;:::o;12965:116::-;13035:21;13050:5;13035:21;:::i;:::-;13028:5;13025:32;13015:60;;13071:1;13068;13061:12;13015:60;12965:116;:::o;13087:133::-;13130:5;13168:6;13155:20;13146:29;;13184:30;13208:5;13184:30;:::i;:::-;13087:133;;;;:::o;13226:323::-;13282:6;13331:2;13319:9;13310:7;13306:23;13302:32;13299:119;;;13337:79;;:::i;:::-;13299:119;13457:1;13482:50;13524:7;13515:6;13504:9;13500:22;13482:50;:::i;:::-;13472:60;;13428:114;13226:323;;;;:::o;13555:468::-;13620:6;13628;13677:2;13665:9;13656:7;13652:23;13648:32;13645:119;;;13683:79;;:::i;:::-;13645:119;13803:1;13828:53;13873:7;13864:6;13853:9;13849:22;13828:53;:::i;:::-;13818:63;;13774:117;13930:2;13956:50;13998:7;13989:6;13978:9;13974:22;13956:50;:::i;:::-;13946:60;;13901:115;13555:468;;;;;:::o;14029:619::-;14106:6;14114;14122;14171:2;14159:9;14150:7;14146:23;14142:32;14139:119;;;14177:79;;:::i;:::-;14139:119;14297:1;14322:53;14367:7;14358:6;14347:9;14343:22;14322:53;:::i;:::-;14312:63;;14268:117;14424:2;14450:53;14495:7;14486:6;14475:9;14471:22;14450:53;:::i;:::-;14440:63;;14395:118;14552:2;14578:53;14623:7;14614:6;14603:9;14599:22;14578:53;:::i;:::-;14568:63;;14523:118;14029:619;;;;;:::o;14654:307::-;14715:4;14805:18;14797:6;14794:30;14791:56;;;14827:18;;:::i;:::-;14791:56;14865:29;14887:6;14865:29;:::i;:::-;14857:37;;14949:4;14943;14939:15;14931:23;;14654:307;;;:::o;14967:410::-;15044:5;15069:65;15085:48;15126:6;15085:48;:::i;:::-;15069:65;:::i;:::-;15060:74;;15157:6;15150:5;15143:21;15195:4;15188:5;15184:16;15233:3;15224:6;15219:3;15215:16;15212:25;15209:112;;;15240:79;;:::i;:::-;15209:112;15330:41;15364:6;15359:3;15354;15330:41;:::i;:::-;15050:327;14967:410;;;;;:::o;15396:338::-;15451:5;15500:3;15493:4;15485:6;15481:17;15477:27;15467:122;;15508:79;;:::i;:::-;15467:122;15625:6;15612:20;15650:78;15724:3;15716:6;15709:4;15701:6;15697:17;15650:78;:::i;:::-;15641:87;;15457:277;15396:338;;;;:::o;15740:943::-;15835:6;15843;15851;15859;15908:3;15896:9;15887:7;15883:23;15879:33;15876:120;;;15915:79;;:::i;:::-;15876:120;16035:1;16060:53;16105:7;16096:6;16085:9;16081:22;16060:53;:::i;:::-;16050:63;;16006:117;16162:2;16188:53;16233:7;16224:6;16213:9;16209:22;16188:53;:::i;:::-;16178:63;;16133:118;16290:2;16316:53;16361:7;16352:6;16341:9;16337:22;16316:53;:::i;:::-;16306:63;;16261:118;16446:2;16435:9;16431:18;16418:32;16477:18;16469:6;16466:30;16463:117;;;16499:79;;:::i;:::-;16463:117;16604:62;16658:7;16649:6;16638:9;16634:22;16604:62;:::i;:::-;16594:72;;16389:287;15740:943;;;;;;;:::o;16689:110::-;16773:1;16766:5;16763:12;16753:40;;16789:1;16786;16779:12;16753:40;16689:110;:::o;16805:161::-;16862:5;16900:6;16887:20;16878:29;;16916:44;16954:5;16916:44;:::i;:::-;16805:161;;;;:::o;16972:496::-;17051:6;17059;17108:2;17096:9;17087:7;17083:23;17079:32;17076:119;;;17114:79;;:::i;:::-;17076:119;17234:1;17259:53;17304:7;17295:6;17284:9;17280:22;17259:53;:::i;:::-;17249:63;;17205:117;17361:2;17387:64;17443:7;17434:6;17423:9;17419:22;17387:64;:::i;:::-;17377:74;;17332:129;16972:496;;;;;:::o;17474:474::-;17542:6;17550;17599:2;17587:9;17578:7;17574:23;17570:32;17567:119;;;17605:79;;:::i;:::-;17567:119;17725:1;17750:53;17795:7;17786:6;17775:9;17771:22;17750:53;:::i;:::-;17740:63;;17696:117;17852:2;17878:53;17923:7;17914:6;17903:9;17899:22;17878:53;:::i;:::-;17868:63;;17823:118;17474:474;;;;;:::o;17954:180::-;18002:77;17999:1;17992:88;18099:4;18096:1;18089:15;18123:4;18120:1;18113:15;18140:320;18184:6;18221:1;18215:4;18211:12;18201:22;;18268:1;18262:4;18258:12;18289:18;18279:81;;18345:4;18337:6;18333:17;18323:27;;18279:81;18407:2;18399:6;18396:14;18376:18;18373:38;18370:84;;18426:18;;:::i;:::-;18370:84;18191:269;18140:320;;;:::o;18466:231::-;18606:34;18602:1;18594:6;18590:14;18583:58;18675:14;18670:2;18662:6;18658:15;18651:39;18466:231;:::o;18703:366::-;18845:3;18866:67;18930:2;18925:3;18866:67;:::i;:::-;18859:74;;18942:93;19031:3;18942:93;:::i;:::-;19060:2;19055:3;19051:12;19044:19;;18703:366;;;:::o;19075:419::-;19241:4;19279:2;19268:9;19264:18;19256:26;;19328:9;19322:4;19318:20;19314:1;19303:9;19299:17;19292:47;19356:131;19482:4;19356:131;:::i;:::-;19348:139;;19075:419;;;:::o;19500:220::-;19640:34;19636:1;19628:6;19624:14;19617:58;19709:3;19704:2;19696:6;19692:15;19685:28;19500:220;:::o;19726:366::-;19868:3;19889:67;19953:2;19948:3;19889:67;:::i;:::-;19882:74;;19965:93;20054:3;19965:93;:::i;:::-;20083:2;20078:3;20074:12;20067:19;;19726:366;;;:::o;20098:419::-;20264:4;20302:2;20291:9;20287:18;20279:26;;20351:9;20345:4;20341:20;20337:1;20326:9;20322:17;20315:47;20379:131;20505:4;20379:131;:::i;:::-;20371:139;;20098:419;;;:::o;20523:243::-;20663:34;20659:1;20651:6;20647:14;20640:58;20732:26;20727:2;20719:6;20715:15;20708:51;20523:243;:::o;20772:366::-;20914:3;20935:67;20999:2;20994:3;20935:67;:::i;:::-;20928:74;;21011:93;21100:3;21011:93;:::i;:::-;21129:2;21124:3;21120:12;21113:19;;20772:366;;;:::o;21144:419::-;21310:4;21348:2;21337:9;21333:18;21325:26;;21397:9;21391:4;21387:20;21383:1;21372:9;21368:17;21361:47;21425:131;21551:4;21425:131;:::i;:::-;21417:139;;21144:419;;;:::o;21569:180::-;21617:77;21614:1;21607:88;21714:4;21711:1;21704:15;21738:4;21735:1;21728:15;21755:191;21795:4;21815:20;21833:1;21815:20;:::i;:::-;21810:25;;21849:20;21867:1;21849:20;:::i;:::-;21844:25;;21888:1;21885;21882:8;21879:34;;;21893:18;;:::i;:::-;21879:34;21938:1;21935;21931:9;21923:17;;21755:191;;;;:::o;21952:180::-;22000:77;21997:1;21990:88;22097:4;22094:1;22087:15;22121:4;22118:1;22111:15;22138:236;22278:34;22274:1;22266:6;22262:14;22255:58;22347:19;22342:2;22334:6;22330:15;22323:44;22138:236;:::o;22380:366::-;22522:3;22543:67;22607:2;22602:3;22543:67;:::i;:::-;22536:74;;22619:93;22708:3;22619:93;:::i;:::-;22737:2;22732:3;22728:12;22721:19;;22380:366;;;:::o;22752:419::-;22918:4;22956:2;22945:9;22941:18;22933:26;;23005:9;22999:4;22995:20;22991:1;22980:9;22976:17;22969:47;23033:131;23159:4;23033:131;:::i;:::-;23025:139;;22752:419;;;:::o;23177:167::-;23317:19;23313:1;23305:6;23301:14;23294:43;23177:167;:::o;23350:366::-;23492:3;23513:67;23577:2;23572:3;23513:67;:::i;:::-;23506:74;;23589:93;23678:3;23589:93;:::i;:::-;23707:2;23702:3;23698:12;23691:19;;23350:366;;;:::o;23722:419::-;23888:4;23926:2;23915:9;23911:18;23903:26;;23975:9;23969:4;23965:20;23961:1;23950:9;23946:17;23939:47;24003:131;24129:4;24003:131;:::i;:::-;23995:139;;23722:419;;;:::o;24147:348::-;24187:7;24210:20;24228:1;24210:20;:::i;:::-;24205:25;;24244:20;24262:1;24244:20;:::i;:::-;24239:25;;24432:1;24364:66;24360:74;24357:1;24354:81;24349:1;24342:9;24335:17;24331:105;24328:131;;;24439:18;;:::i;:::-;24328:131;24487:1;24484;24480:9;24469:20;;24147:348;;;;:::o;24501:180::-;24549:77;24546:1;24539:88;24646:4;24643:1;24636:15;24670:4;24667:1;24660:15;24687:185;24727:1;24744:20;24762:1;24744:20;:::i;:::-;24739:25;;24778:20;24796:1;24778:20;:::i;:::-;24773:25;;24817:1;24807:35;;24822:18;;:::i;:::-;24807:35;24864:1;24861;24857:9;24852:14;;24687:185;;;;:::o;24878:234::-;25018:34;25014:1;25006:6;25002:14;24995:58;25087:17;25082:2;25074:6;25070:15;25063:42;24878:234;:::o;25118:366::-;25260:3;25281:67;25345:2;25340:3;25281:67;:::i;:::-;25274:74;;25357:93;25446:3;25357:93;:::i;:::-;25475:2;25470:3;25466:12;25459:19;;25118:366;;;:::o;25490:419::-;25656:4;25694:2;25683:9;25679:18;25671:26;;25743:9;25737:4;25733:20;25729:1;25718:9;25714:17;25707:47;25771:131;25897:4;25771:131;:::i;:::-;25763:139;;25490:419;;;:::o;25915:166::-;26055:18;26051:1;26043:6;26039:14;26032:42;25915:166;:::o;26087:366::-;26229:3;26250:67;26314:2;26309:3;26250:67;:::i;:::-;26243:74;;26326:93;26415:3;26326:93;:::i;:::-;26444:2;26439:3;26435:12;26428:19;;26087:366;;;:::o;26459:419::-;26625:4;26663:2;26652:9;26648:18;26640:26;;26712:9;26706:4;26702:20;26698:1;26687:9;26683:17;26676:47;26740:131;26866:4;26740:131;:::i;:::-;26732:139;;26459:419;;;:::o;26884:168::-;27024:20;27020:1;27012:6;27008:14;27001:44;26884:168;:::o;27058:366::-;27200:3;27221:67;27285:2;27280:3;27221:67;:::i;:::-;27214:74;;27297:93;27386:3;27297:93;:::i;:::-;27415:2;27410:3;27406:12;27399:19;;27058:366;;;:::o;27430:419::-;27596:4;27634:2;27623:9;27619:18;27611:26;;27683:9;27677:4;27673:20;27669:1;27658:9;27654:17;27647:47;27711:131;27837:4;27711:131;:::i;:::-;27703:139;;27430:419;;;:::o;27855:159::-;27995:11;27991:1;27983:6;27979:14;27972:35;27855:159;:::o;28020:365::-;28162:3;28183:66;28247:1;28242:3;28183:66;:::i;:::-;28176:73;;28258:93;28347:3;28258:93;:::i;:::-;28376:2;28371:3;28367:12;28360:19;;28020:365;;;:::o;28391:419::-;28557:4;28595:2;28584:9;28580:18;28572:26;;28644:9;28638:4;28634:20;28630:1;28619:9;28615:17;28608:47;28672:131;28798:4;28672:131;:::i;:::-;28664:139;;28391:419;;;:::o;28816:182::-;28956:34;28952:1;28944:6;28940:14;28933:58;28816:182;:::o;29004:366::-;29146:3;29167:67;29231:2;29226:3;29167:67;:::i;:::-;29160:74;;29243:93;29332:3;29243:93;:::i;:::-;29361:2;29356:3;29352:12;29345:19;;29004:366;;;:::o;29376:419::-;29542:4;29580:2;29569:9;29565:18;29557:26;;29629:9;29623:4;29619:20;29615:1;29604:9;29600:17;29593:47;29657:131;29783:4;29657:131;:::i;:::-;29649:139;;29376:419;;;:::o;29801:228::-;29941:34;29937:1;29929:6;29925:14;29918:58;30010:11;30005:2;29997:6;29993:15;29986:36;29801:228;:::o;30035:366::-;30177:3;30198:67;30262:2;30257:3;30198:67;:::i;:::-;30191:74;;30274:93;30363:3;30274:93;:::i;:::-;30392:2;30387:3;30383:12;30376:19;;30035:366;;;:::o;30407:419::-;30573:4;30611:2;30600:9;30596:18;30588:26;;30660:9;30654:4;30650:20;30646:1;30635:9;30631:17;30624:47;30688:131;30814:4;30688:131;:::i;:::-;30680:139;;30407:419;;;:::o;30832:229::-;30972:34;30968:1;30960:6;30956:14;30949:58;31041:12;31036:2;31028:6;31024:15;31017:37;30832:229;:::o;31067:366::-;31209:3;31230:67;31294:2;31289:3;31230:67;:::i;:::-;31223:74;;31306:93;31395:3;31306:93;:::i;:::-;31424:2;31419:3;31415:12;31408:19;;31067:366;;;:::o;31439:419::-;31605:4;31643:2;31632:9;31628:18;31620:26;;31692:9;31686:4;31682:20;31678:1;31667:9;31663:17;31656:47;31720:131;31846:4;31720:131;:::i;:::-;31712:139;;31439:419;;;:::o;31864:182::-;32004:34;32000:1;31992:6;31988:14;31981:58;31864:182;:::o;32052:366::-;32194:3;32215:67;32279:2;32274:3;32215:67;:::i;:::-;32208:74;;32291:93;32380:3;32291:93;:::i;:::-;32409:2;32404:3;32400:12;32393:19;;32052:366;;;:::o;32424:419::-;32590:4;32628:2;32617:9;32613:18;32605:26;;32677:9;32671:4;32667:20;32663:1;32652:9;32648:17;32641:47;32705:131;32831:4;32705:131;:::i;:::-;32697:139;;32424:419;;;:::o;32849:148::-;32951:11;32988:3;32973:18;;32849:148;;;;:::o;33003:141::-;33052:4;33075:3;33067:11;;33098:3;33095:1;33088:14;33132:4;33129:1;33119:18;33111:26;;33003:141;;;:::o;33174:845::-;33277:3;33314:5;33308:12;33343:36;33369:9;33343:36;:::i;:::-;33395:89;33477:6;33472:3;33395:89;:::i;:::-;33388:96;;33515:1;33504:9;33500:17;33531:1;33526:137;;;;33677:1;33672:341;;;;33493:520;;33526:137;33610:4;33606:9;33595;33591:25;33586:3;33579:38;33646:6;33641:3;33637:16;33630:23;;33526:137;;33672:341;33739:38;33771:5;33739:38;:::i;:::-;33799:1;33813:154;33827:6;33824:1;33821:13;33813:154;;;33901:7;33895:14;33891:1;33886:3;33882:11;33875:35;33951:1;33942:7;33938:15;33927:26;;33849:4;33846:1;33842:12;33837:17;;33813:154;;;33996:6;33991:3;33987:16;33980:23;;33679:334;;33493:520;;33281:738;;33174:845;;;;:::o;34025:377::-;34131:3;34159:39;34192:5;34159:39;:::i;:::-;34214:89;34296:6;34291:3;34214:89;:::i;:::-;34207:96;;34312:52;34357:6;34352:3;34345:4;34338:5;34334:16;34312:52;:::i;:::-;34389:6;34384:3;34380:16;34373:23;;34135:267;34025:377;;;;:::o;34408:155::-;34548:7;34544:1;34536:6;34532:14;34525:31;34408:155;:::o;34569:400::-;34729:3;34750:84;34832:1;34827:3;34750:84;:::i;:::-;34743:91;;34843:93;34932:3;34843:93;:::i;:::-;34961:1;34956:3;34952:11;34945:18;;34569:400;;;:::o;34975:695::-;35253:3;35275:92;35363:3;35354:6;35275:92;:::i;:::-;35268:99;;35384:95;35475:3;35466:6;35384:95;:::i;:::-;35377:102;;35496:148;35640:3;35496:148;:::i;:::-;35489:155;;35661:3;35654:10;;34975:695;;;;;:::o;35676:163::-;35816:15;35812:1;35804:6;35800:14;35793:39;35676:163;:::o;35845:402::-;36005:3;36026:85;36108:2;36103:3;36026:85;:::i;:::-;36019:92;;36120:93;36209:3;36120:93;:::i;:::-;36238:2;36233:3;36229:12;36222:19;;35845:402;;;:::o;36253:535::-;36483:3;36505:92;36593:3;36584:6;36505:92;:::i;:::-;36498:99;;36614:148;36758:3;36614:148;:::i;:::-;36607:155;;36779:3;36772:10;;36253:535;;;;:::o;36794:305::-;36834:3;36853:20;36871:1;36853:20;:::i;:::-;36848:25;;36887:20;36905:1;36887:20;:::i;:::-;36882:25;;37041:1;36973:66;36969:74;36966:1;36963:81;36960:107;;;37047:18;;:::i;:::-;36960:107;37091:1;37088;37084:9;37077:16;;36794:305;;;;:::o;37105:171::-;37144:3;37167:24;37185:5;37167:24;:::i;:::-;37158:33;;37213:4;37206:5;37203:15;37200:41;;37221:18;;:::i;:::-;37200:41;37268:1;37261:5;37257:13;37250:20;;37105:171;;;:::o;37282:182::-;37422:34;37418:1;37410:6;37406:14;37399:58;37282:182;:::o;37470:366::-;37612:3;37633:67;37697:2;37692:3;37633:67;:::i;:::-;37626:74;;37709:93;37798:3;37709:93;:::i;:::-;37827:2;37822:3;37818:12;37811:19;;37470:366;;;:::o;37842:419::-;38008:4;38046:2;38035:9;38031:18;38023:26;;38095:9;38089:4;38085:20;38081:1;38070:9;38066:17;38059:47;38123:131;38249:4;38123:131;:::i;:::-;38115:139;;37842:419;;;:::o;38267:231::-;38407:34;38403:1;38395:6;38391:14;38384:58;38476:14;38471:2;38463:6;38459:15;38452:39;38267:231;:::o;38504:366::-;38646:3;38667:67;38731:2;38726:3;38667:67;:::i;:::-;38660:74;;38743:93;38832:3;38743:93;:::i;:::-;38861:2;38856:3;38852:12;38845:19;;38504:366;;;:::o;38876:419::-;39042:4;39080:2;39069:9;39065:18;39057:26;;39129:9;39123:4;39119:20;39115:1;39104:9;39100:17;39093:47;39157:131;39283:4;39157:131;:::i;:::-;39149:139;;38876:419;;;:::o;39301:224::-;39441:34;39437:1;39429:6;39425:14;39418:58;39510:7;39505:2;39497:6;39493:15;39486:32;39301:224;:::o;39531:366::-;39673:3;39694:67;39758:2;39753:3;39694:67;:::i;:::-;39687:74;;39770:93;39859:3;39770:93;:::i;:::-;39888:2;39883:3;39879:12;39872:19;;39531:366;;;:::o;39903:419::-;40069:4;40107:2;40096:9;40092:18;40084:26;;40156:9;40150:4;40146:20;40142:1;40131:9;40127:17;40120:47;40184:131;40310:4;40184:131;:::i;:::-;40176:139;;39903:419;;;:::o;40328:223::-;40468:34;40464:1;40456:6;40452:14;40445:58;40537:6;40532:2;40524:6;40520:15;40513:31;40328:223;:::o;40557:366::-;40699:3;40720:67;40784:2;40779:3;40720:67;:::i;:::-;40713:74;;40796:93;40885:3;40796:93;:::i;:::-;40914:2;40909:3;40905:12;40898:19;;40557:366;;;:::o;40929:419::-;41095:4;41133:2;41122:9;41118:18;41110:26;;41182:9;41176:4;41172:20;41168:1;41157:9;41153:17;41146:47;41210:131;41336:4;41210:131;:::i;:::-;41202:139;;40929:419;;;:::o;41354:182::-;41494:34;41490:1;41482:6;41478:14;41471:58;41354:182;:::o;41542:366::-;41684:3;41705:67;41769:2;41764:3;41705:67;:::i;:::-;41698:74;;41781:93;41870:3;41781:93;:::i;:::-;41899:2;41894:3;41890:12;41883:19;;41542:366;;;:::o;41914:419::-;42080:4;42118:2;42107:9;42103:18;42095:26;;42167:9;42161:4;42157:20;42153:1;42142:9;42138:17;42131:47;42195:131;42321:4;42195:131;:::i;:::-;42187:139;;41914:419;;;:::o;42339:178::-;42479:30;42475:1;42467:6;42463:14;42456:54;42339:178;:::o;42523:366::-;42665:3;42686:67;42750:2;42745:3;42686:67;:::i;:::-;42679:74;;42762:93;42851:3;42762:93;:::i;:::-;42880:2;42875:3;42871:12;42864:19;;42523:366;;;:::o;42895:419::-;43061:4;43099:2;43088:9;43084:18;43076:26;;43148:9;43142:4;43138:20;43134:1;43123:9;43119:17;43112:47;43176:131;43302:4;43176:131;:::i;:::-;43168:139;;42895:419;;;:::o;43320:170::-;43460:22;43456:1;43448:6;43444:14;43437:46;43320:170;:::o;43496:366::-;43638:3;43659:67;43723:2;43718:3;43659:67;:::i;:::-;43652:74;;43735:93;43824:3;43735:93;:::i;:::-;43853:2;43848:3;43844:12;43837:19;;43496:366;;;:::o;43868:419::-;44034:4;44072:2;44061:9;44057:18;44049:26;;44121:9;44115:4;44111:20;44107:1;44096:9;44092:17;44085:47;44149:131;44275:4;44149:131;:::i;:::-;44141:139;;43868:419;;;:::o;44293:175::-;44433:27;44429:1;44421:6;44417:14;44410:51;44293:175;:::o;44474:366::-;44616:3;44637:67;44701:2;44696:3;44637:67;:::i;:::-;44630:74;;44713:93;44802:3;44713:93;:::i;:::-;44831:2;44826:3;44822:12;44815:19;;44474:366;;;:::o;44846:419::-;45012:4;45050:2;45039:9;45035:18;45027:26;;45099:9;45093:4;45089:20;45085:1;45074:9;45070:17;45063:47;45127:131;45253:4;45127:131;:::i;:::-;45119:139;;44846:419;;;:::o;45271:237::-;45411:34;45407:1;45399:6;45395:14;45388:58;45480:20;45475:2;45467:6;45463:15;45456:45;45271:237;:::o;45514:366::-;45656:3;45677:67;45741:2;45736:3;45677:67;:::i;:::-;45670:74;;45753:93;45842:3;45753:93;:::i;:::-;45871:2;45866:3;45862:12;45855:19;;45514:366;;;:::o;45886:419::-;46052:4;46090:2;46079:9;46075:18;46067:26;;46139:9;46133:4;46129:20;46125:1;46114:9;46110:17;46103:47;46167:131;46293:4;46167:131;:::i;:::-;46159:139;;45886:419;;;:::o;46311:233::-;46350:3;46373:24;46391:5;46373:24;:::i;:::-;46364:33;;46419:66;46412:5;46409:77;46406:103;;46489:18;;:::i;:::-;46406:103;46536:1;46529:5;46525:13;46518:20;;46311:233;;;:::o;46550:176::-;46582:1;46599:20;46617:1;46599:20;:::i;:::-;46594:25;;46633:20;46651:1;46633:20;:::i;:::-;46628:25;;46672:1;46662:35;;46677:18;;:::i;:::-;46662:35;46718:1;46715;46711:9;46706:14;;46550:176;;;;:::o;46732:173::-;46872:25;46868:1;46860:6;46856:14;46849:49;46732:173;:::o;46911:402::-;47071:3;47092:85;47174:2;47169:3;47092:85;:::i;:::-;47085:92;;47186:93;47275:3;47186:93;:::i;:::-;47304:2;47299:3;47295:12;47288:19;;46911:402;;;:::o;47319:167::-;47459:19;47455:1;47447:6;47443:14;47436:43;47319:167;:::o;47492:402::-;47652:3;47673:85;47755:2;47750:3;47673:85;:::i;:::-;47666:92;;47767:93;47856:3;47767:93;:::i;:::-;47885:2;47880:3;47876:12;47869:19;;47492:402;;;:::o;47900:967::-;48282:3;48304:148;48448:3;48304:148;:::i;:::-;48297:155;;48469:95;48560:3;48551:6;48469:95;:::i;:::-;48462:102;;48581:148;48725:3;48581:148;:::i;:::-;48574:155;;48746:95;48837:3;48828:6;48746:95;:::i;:::-;48739:102;;48858:3;48851:10;;47900:967;;;;;:::o;48873:98::-;48924:6;48958:5;48952:12;48942:22;;48873:98;;;:::o;48977:168::-;49060:11;49094:6;49089:3;49082:19;49134:4;49129:3;49125:14;49110:29;;48977:168;;;;:::o;49151:360::-;49237:3;49265:38;49297:5;49265:38;:::i;:::-;49319:70;49382:6;49377:3;49319:70;:::i;:::-;49312:77;;49398:52;49443:6;49438:3;49431:4;49424:5;49420:16;49398:52;:::i;:::-;49475:29;49497:6;49475:29;:::i;:::-;49470:3;49466:39;49459:46;;49241:270;49151:360;;;;:::o;49517:640::-;49712:4;49750:3;49739:9;49735:19;49727:27;;49764:71;49832:1;49821:9;49817:17;49808:6;49764:71;:::i;:::-;49845:72;49913:2;49902:9;49898:18;49889:6;49845:72;:::i;:::-;49927;49995:2;49984:9;49980:18;49971:6;49927:72;:::i;:::-;50046:9;50040:4;50036:20;50031:2;50020:9;50016:18;50009:48;50074:76;50145:4;50136:6;50074:76;:::i;:::-;50066:84;;49517:640;;;;;;;:::o;50163:141::-;50219:5;50250:6;50244:13;50235:22;;50266:32;50292:5;50266:32;:::i;:::-;50163:141;;;;:::o;50310:349::-;50379:6;50428:2;50416:9;50407:7;50403:23;50399:32;50396:119;;;50434:79;;:::i;:::-;50396:119;50554:1;50579:63;50634:7;50625:6;50614:9;50610:22;50579:63;:::i;:::-;50569:73;;50525:127;50310:349;;;;:::o
Swarm Source
ipfs://802f0f949095018a8fa6b892b31bfb209022d8bc8f273b1706c69af3af8d1a61
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.18
Net Worth in ETH
0.000091
Token Allocations
AVAX
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| AVAX | 100.00% | $8.84 | 0.02 | $0.176833 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.