Polygon Sponsored slots available. Book your slot here!
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 9,702 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 80606089 | 34 days ago | IN | 0 POL | 0.00315501 | ||||
| Set Approval For... | 80307278 | 41 days ago | IN | 0 POL | 0.00086362 | ||||
| Set Approval For... | 80307273 | 41 days ago | IN | 0 POL | 0.00086656 | ||||
| Set Approval For... | 76911850 | 120 days ago | IN | 0 POL | 0.00079788 | ||||
| Set Approval For... | 76042273 | 142 days ago | IN | 0 POL | 0.00074277 | ||||
| Safe Transfer Fr... | 75917116 | 145 days ago | IN | 0 POL | 0.0027783 | ||||
| Set Approval For... | 75689447 | 150 days ago | IN | 0 POL | 0.00074025 | ||||
| Set Approval For... | 75245442 | 161 days ago | IN | 0 POL | 0.00074025 | ||||
| Set Approval For... | 74502120 | 180 days ago | IN | 0 POL | 0.00074277 | ||||
| Set Approval For... | 74502115 | 180 days ago | IN | 0 POL | 0.00074025 | ||||
| Set Approval For... | 73522232 | 205 days ago | IN | 0 POL | 0.00086362 | ||||
| Set Approval For... | 72479385 | 231 days ago | IN | 0 POL | 0.00089176 | ||||
| Transfer From | 71666498 | 251 days ago | IN | 0 POL | 0.00753469 | ||||
| Transfer From | 71666494 | 251 days ago | IN | 0 POL | 0.00600952 | ||||
| Set Approval For... | 71596539 | 252 days ago | IN | 0 POL | 0.00074353 | ||||
| Set Approval For... | 71332058 | 259 days ago | IN | 0 POL | 0.0006489 | ||||
| Set Approval For... | 71268725 | 261 days ago | IN | 0 POL | 0.00587845 | ||||
| Set Approval For... | 71181532 | 263 days ago | IN | 0 POL | 0.00092217 | ||||
| Set Approval For... | 71090533 | 265 days ago | IN | 0 POL | 0.00086165 | ||||
| Revoke Role | 70933029 | 269 days ago | IN | 0 POL | 0.00158063 | ||||
| Revoke Role | 70933025 | 269 days ago | IN | 0 POL | 0.00156376 | ||||
| Revoke Role | 70933021 | 269 days ago | IN | 0 POL | 0.00157152 | ||||
| Revoke Role | 70933018 | 269 days ago | IN | 0 POL | 0.0016242 | ||||
| Revoke Role | 70933014 | 269 days ago | IN | 0 POL | 0.00162865 | ||||
| Revoke Role | 70933011 | 269 days ago | IN | 0 POL | 0.00164275 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TraceNFTPass
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/**
*Submitted for verification at polygonscan.com on 2022-10-18
*/
// SPDX-License-Identifier: MIT
/*
_____ ____ _ ____ _____
|_ _| _ \ / \ / ___| ____|
| | | |_) | / _ \| | | _|
| | | _ < / ___ \ |___| |___
|_| |_| \_\/_/ \_\____|_____|
.-"^`\ /`^"-.
.' ___\ /___ `.
/ /.---. .---.\ \
| // '-. ___________________________ .-' \\ |
| ;| \/--------------------------// |; |
\ || |\_) TRACE (_/| || /
\ | \ . \ ; | Genesis NFT || ; / . / | /
'\_\ \\ \ \ \ | ||/ / / // /_/'
\\ \ \ \| Pass |/ / / //
`'-\_\_\ Unlimeted /_/_/-'`
'--------------------------'
*/
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);
}
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 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);
}
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);
}
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);
}
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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
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;
}
}
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @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);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
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;
}
}
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: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner 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: caller is not token 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) {
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 an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* 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 {}
}
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
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 Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
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());
}
}
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;
}
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.
*
* May emit a {RoleGranted} event.
*/
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.
*
* May emit a {RoleRevoked} event.
*/
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`.
*
* May emit a {RoleRevoked} event.
*/
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.
*
* May emit a {RoleGranted} event.
*
* [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.
*
* May emit a {RoleGranted} event.
*/
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.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
pragma solidity ^0.8.16;
contract TraceNFTPass is ERC721, ERC721Enumerable, Pausable, AccessControl {
using Counters for Counters.Counter;
event ChangeBaseURI(string indexed baseURI);
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
Counters.Counter private _tokenIdCounter;
string private base;
constructor() ERC721("Trace Genesis NFT Pass", "PASS") { // Trace Genesis NFT Pass
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_grantRole(MINTER_ROLE, msg.sender);
}
function _baseURI() internal view override returns (string memory) {
return base;
}
function baseURI() public view returns (string memory) {
return _baseURI();
}
function changeBaseURI(string memory _base) public onlyRole(DEFAULT_ADMIN_ROLE) {
base = _base;
emit ChangeBaseURI(_base);
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function safeMint(address to) public onlyRole(MINTER_ROLE) {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
}
function safeMintBatch(address[] memory recipients, uint256[] memory amounts) public onlyRole(MINTER_ROLE) {
require(recipients.length == amounts.length, "ERC721: recipients and amounts length mismatch");
for (uint256 i = 0; i < recipients.length; i++) {
address recipient = recipients[i];
uint256 amount = amounts[i];
for (uint256 j = 0; j < amount; j++) {
safeMint(recipient);
}
}
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId)
internal
whenNotPaused
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable, AccessControl)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"baseURI","type":"string"}],"name":"ChangeBaseURI","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_base","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"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":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"safeMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601681526020017f54726163652047656e65736973204e46542050617373000000000000000000008152506040518060400160405280600481526020017f504153530000000000000000000000000000000000000000000000000000000081525081600090816200008f91906200051d565b508060019081620000a191906200051d565b5050506000600a60006101000a81548160ff021916908315150217905550620000d46000801b336200013e60201b60201c565b620001067f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336200013e60201b60201c565b620001387f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200013e60201b60201c565b62000604565b6200015082826200023060201b60201c565b6200022c576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001d16200029b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200032557607f821691505b6020821081036200033b576200033a620002dd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000366565b620003b1868362000366565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003fe620003f8620003f284620003c9565b620003d3565b620003c9565b9050919050565b6000819050919050565b6200041a83620003dd565b62000432620004298262000405565b84845462000373565b825550505050565b600090565b620004496200043a565b620004568184846200040f565b505050565b5b818110156200047e57620004726000826200043f565b6001810190506200045c565b5050565b601f821115620004cd57620004978162000341565b620004a28462000356565b81016020851015620004b2578190505b620004ca620004c18562000356565b8301826200045b565b50505b505050565b600082821c905092915050565b6000620004f260001984600802620004d2565b1980831691505092915050565b60006200050d8383620004df565b9150826002028217905092915050565b6200052882620002a3565b67ffffffffffffffff811115620005445762000543620002ae565b5b6200055082546200030c565b6200055d82828562000482565b600060209050601f83116001811462000595576000841562000580578287015190505b6200058c8582620004ff565b865550620005fc565b601f198416620005a58662000341565b60005b82811015620005cf57848901518255600182019150602085019450602081019050620005a8565b86831015620005ef5784890151620005eb601f891682620004df565b8355505b6001600288020188555050505b505050505050565b61440180620006146000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80635c975abb1161010f578063a22cb465116100a2578063d539139311610071578063d53913931461057a578063d547741f14610598578063e63ab1e9146105b4578063e985e9c5146105d2576101e5565b8063a22cb465146104f6578063aef765e414610512578063b88d4fde1461052e578063c87b56dd1461054a576101e5565b80638456cb59116100de5780638456cb591461048057806391d148541461048a57806395d89b41146104ba578063a217fddf146104d8576101e5565b80635c975abb146103e45780636352211e146104025780636c0360eb1461043257806370a0823114610450576101e5565b80632f2ff15d116101875780633f4ba83a116101565780633f4ba83a1461037257806340d097c31461037c57806342842e0e146103985780634f6ccce7146103b4576101e5565b80632f2ff15d146102ee5780632f745c591461030a57806336568abe1461033a57806339a0c6f914610356576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248a9ca3146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190612a2e565b610602565b6040516102119190612a76565b60405180910390f35b610222610614565b60405161022f9190612b21565b60405180910390f35b610252600480360381019061024d9190612b79565b6106a6565b60405161025f9190612be7565b60405180910390f35b610282600480360381019061027d9190612c2e565b6106ec565b005b61028c610803565b6040516102999190612c7d565b60405180910390f35b6102bc60048036038101906102b79190612c98565b610810565b005b6102d860048036038101906102d39190612d21565b610870565b6040516102e59190612d5d565b60405180910390f35b61030860048036038101906103039190612d78565b610890565b005b610324600480360381019061031f9190612c2e565b6108b1565b6040516103319190612c7d565b60405180910390f35b610354600480360381019061034f9190612d78565b610956565b005b610370600480360381019061036b9190612eed565b6109d9565b005b61037a610a3c565b005b61039660048036038101906103919190612f36565b610a71565b005b6103b260048036038101906103ad9190612c98565b610ac2565b005b6103ce60048036038101906103c99190612b79565b610ae2565b6040516103db9190612c7d565b60405180910390f35b6103ec610b53565b6040516103f99190612a76565b60405180910390f35b61041c60048036038101906104179190612b79565b610b6a565b6040516104299190612be7565b60405180910390f35b61043a610c1b565b6040516104479190612b21565b60405180910390f35b61046a60048036038101906104659190612f36565b610c2a565b6040516104779190612c7d565b60405180910390f35b610488610ce1565b005b6104a4600480360381019061049f9190612d78565b610d16565b6040516104b19190612a76565b60405180910390f35b6104c2610d81565b6040516104cf9190612b21565b60405180910390f35b6104e0610e13565b6040516104ed9190612d5d565b60405180910390f35b610510600480360381019061050b9190612f8f565b610e1a565b005b61052c6004803603810190610527919061315a565b610e30565b005b61054860048036038101906105439190613273565b610f2b565b005b610564600480360381019061055f9190612b79565b610f8d565b6040516105719190612b21565b60405180910390f35b610582610ff5565b60405161058f9190612d5d565b60405180910390f35b6105b260048036038101906105ad9190612d78565b611019565b005b6105bc61103a565b6040516105c99190612d5d565b60405180910390f35b6105ec60048036038101906105e791906132f6565b61105e565b6040516105f99190612a76565b60405180910390f35b600061060d826110f2565b9050919050565b60606000805461062390613365565b80601f016020809104026020016040519081016040528092919081815260200182805461064f90613365565b801561069c5780601f106106715761010080835404028352916020019161069c565b820191906000526020600020905b81548152906001019060200180831161067f57829003601f168201915b5050505050905090565b60006106b18261116c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106f782610b6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e90613408565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107866111b7565b73ffffffffffffffffffffffffffffffffffffffff1614806107b557506107b4816107af6111b7565b61105e565b5b6107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb9061349a565b60405180910390fd5b6107fe83836111bf565b505050565b6000600880549050905090565b61082161081b6111b7565b82611278565b610860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108579061352c565b60405180910390fd5b61086b83838361130d565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b61089982610870565b6108a281611573565b6108ac8383611587565b505050565b60006108bc83610c2a565b82106108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f4906135be565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61095e6111b7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613650565b60405180910390fd5b6109d58282611668565b5050565b6000801b6109e681611573565b81600d90816109f5919061381c565b5081604051610a04919061392a565b60405180910390207f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376760405160405180910390a25050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a6681611573565b610a6e61174a565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a9b81611573565b6000610aa7600c6117ad565b9050610ab3600c6117bb565b610abd83826117d1565b505050565b610add83838360405180602001604052806000815250610f2b565b505050565b6000610aec610803565b8210610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906139b3565b60405180910390fd5b60088281548110610b4157610b406139d3565b5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0990613a4e565b60405180910390fd5b80915050919050565b6060610c256117ef565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613ae0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d0b81611573565b610d13611881565b50565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610d9090613365565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbc90613365565b8015610e095780601f10610dde57610100808354040283529160200191610e09565b820191906000526020600020905b815481529060010190602001808311610dec57829003601f168201915b5050505050905090565b6000801b81565b610e2c610e256111b7565b83836118e4565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e5a81611573565b8151835114610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9590613b72565b60405180910390fd5b60005b8351811015610f25576000848281518110610ebf57610ebe6139d3565b5b602002602001015190506000848381518110610ede57610edd6139d3565b5b6020026020010151905060005b81811015610f0f57610efc83610a71565b8080610f0790613bc1565b915050610eeb565b5050508080610f1d90613bc1565b915050610ea1565b50505050565b610f3c610f366111b7565b83611278565b610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f729061352c565b60405180910390fd5b610f8784848484611a50565b50505050565b6060610f988261116c565b6000610fa26117ef565b90506000815111610fc25760405180602001604052806000815250610fed565b80610fcc84611aac565b604051602001610fdd929190613c09565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61102282610870565b61102b81611573565b6110358383611668565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611165575061116482611c0c565b5b9050919050565b61117581611c86565b6111b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ab90613a4e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661123283610b6a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061128483610b6a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112c657506112c5818561105e565b5b8061130457508373ffffffffffffffffffffffffffffffffffffffff166112ec846106a6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661132d82610b6a565b73ffffffffffffffffffffffffffffffffffffffff1614611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613c9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990613d31565b60405180910390fd5b6113fd838383611cf2565b6114086000826111bf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114589190613d51565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114af9190613d85565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461156e838383611d0a565b505050565b6115848161157f6111b7565b611d0f565b50565b6115918282610d16565b611664576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116096111b7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116728282610d16565b15611746576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116eb6111b7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611752611dac565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6117966111b7565b6040516117a39190612be7565b60405180910390a1565b600081600001549050919050565b6001816000016000828254019250508190555050565b6117eb828260405180602001604052806000815250611df5565b5050565b6060600d80546117fe90613365565b80601f016020809104026020016040519081016040528092919081815260200182805461182a90613365565b80156118775780601f1061184c57610100808354040283529160200191611877565b820191906000526020600020905b81548152906001019060200180831161185a57829003601f168201915b5050505050905090565b611889611e50565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118cd6111b7565b6040516118da9190612be7565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990613e05565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a439190612a76565b60405180910390a3505050565b611a5b84848461130d565b611a6784848484611e9a565b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90613e97565b60405180910390fd5b50505050565b606060008203611af3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c07565b600082905060005b60008214611b25578080611b0e90613bc1565b915050600a82611b1e9190613ee6565b9150611afb565b60008167ffffffffffffffff811115611b4157611b40612dc2565b5b6040519080825280601f01601f191660200182016040528015611b735781602001600182028036833780820191505090505b5090505b60008514611c0057600182611b8c9190613d51565b9150600a85611b9b9190613f17565b6030611ba79190613d85565b60f81b818381518110611bbd57611bbc6139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bf99190613ee6565b9450611b77565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c7f5750611c7e82612021565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611cfa611e50565b611d05838383612103565b505050565b505050565b611d198282610d16565b611da857611d3e8173ffffffffffffffffffffffffffffffffffffffff166014612215565b611d4c8360001c6020612215565b604051602001611d5d929190613fe0565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f9190612b21565b60405180910390fd5b5050565b611db4610b53565b611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90614066565b60405180910390fd5b565b611dff8383612451565b611e0c6000848484611e9a565b611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290613e97565b60405180910390fd5b505050565b611e58610b53565b15611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f906140d2565b60405180910390fd5b565b6000611ebb8473ffffffffffffffffffffffffffffffffffffffff1661262a565b15612014578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ee46111b7565b8786866040518563ffffffff1660e01b8152600401611f069493929190614147565b6020604051808303816000875af1925050508015611f4257506040513d601f19601f82011682018060405250810190611f3f91906141a8565b60015b611fc4573d8060008114611f72576040519150601f19603f3d011682016040523d82523d6000602084013e611f77565b606091505b506000815103611fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb390613e97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612019565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120fc57506120fb8261264d565b5b9050919050565b61210e8383836126b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121505761214b816126bc565b61218f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461218e5761218d8382612705565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121d1576121cc81612872565b612210565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461220f5761220e8282612943565b5b5b505050565b60606000600283600261222891906141d5565b6122329190613d85565b67ffffffffffffffff81111561224b5761224a612dc2565b5b6040519080825280601f01601f19166020018201604052801561227d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106122b5576122b46139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612319576123186139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261235991906141d5565b6123639190613d85565b90505b6001811115612403577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123a5576123a46139d3565b5b1a60f81b8282815181106123bc576123bb6139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806123fc9061422f565b9050612366565b5060008414612447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243e906142a4565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b790614310565b60405180910390fd5b6124c981611c86565b15612509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125009061437c565b60405180910390fd5b61251560008383611cf2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125659190613d85565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461262660008383611d0a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161271284610c2a565b61271c9190613d51565b9050600060076000848152602001908152602001600020549050818114612801576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128869190613d51565b90506000600960008481526020019081526020016000205490506000600883815481106128b6576128b56139d3565b5b9060005260206000200154905080600883815481106128d8576128d76139d3565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129275761292661439c565b5b6001900381819060005260206000200160009055905550505050565b600061294e83610c2a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a0b816129d6565b8114612a1657600080fd5b50565b600081359050612a2881612a02565b92915050565b600060208284031215612a4457612a436129cc565b5b6000612a5284828501612a19565b91505092915050565b60008115159050919050565b612a7081612a5b565b82525050565b6000602082019050612a8b6000830184612a67565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612acb578082015181840152602081019050612ab0565b60008484015250505050565b6000601f19601f8301169050919050565b6000612af382612a91565b612afd8185612a9c565b9350612b0d818560208601612aad565b612b1681612ad7565b840191505092915050565b60006020820190508181036000830152612b3b8184612ae8565b905092915050565b6000819050919050565b612b5681612b43565b8114612b6157600080fd5b50565b600081359050612b7381612b4d565b92915050565b600060208284031215612b8f57612b8e6129cc565b5b6000612b9d84828501612b64565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd182612ba6565b9050919050565b612be181612bc6565b82525050565b6000602082019050612bfc6000830184612bd8565b92915050565b612c0b81612bc6565b8114612c1657600080fd5b50565b600081359050612c2881612c02565b92915050565b60008060408385031215612c4557612c446129cc565b5b6000612c5385828601612c19565b9250506020612c6485828601612b64565b9150509250929050565b612c7781612b43565b82525050565b6000602082019050612c926000830184612c6e565b92915050565b600080600060608486031215612cb157612cb06129cc565b5b6000612cbf86828701612c19565b9350506020612cd086828701612c19565b9250506040612ce186828701612b64565b9150509250925092565b6000819050919050565b612cfe81612ceb565b8114612d0957600080fd5b50565b600081359050612d1b81612cf5565b92915050565b600060208284031215612d3757612d366129cc565b5b6000612d4584828501612d0c565b91505092915050565b612d5781612ceb565b82525050565b6000602082019050612d726000830184612d4e565b92915050565b60008060408385031215612d8f57612d8e6129cc565b5b6000612d9d85828601612d0c565b9250506020612dae85828601612c19565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612dfa82612ad7565b810181811067ffffffffffffffff82111715612e1957612e18612dc2565b5b80604052505050565b6000612e2c6129c2565b9050612e388282612df1565b919050565b600067ffffffffffffffff821115612e5857612e57612dc2565b5b612e6182612ad7565b9050602081019050919050565b82818337600083830152505050565b6000612e90612e8b84612e3d565b612e22565b905082815260208101848484011115612eac57612eab612dbd565b5b612eb7848285612e6e565b509392505050565b600082601f830112612ed457612ed3612db8565b5b8135612ee4848260208601612e7d565b91505092915050565b600060208284031215612f0357612f026129cc565b5b600082013567ffffffffffffffff811115612f2157612f206129d1565b5b612f2d84828501612ebf565b91505092915050565b600060208284031215612f4c57612f4b6129cc565b5b6000612f5a84828501612c19565b91505092915050565b612f6c81612a5b565b8114612f7757600080fd5b50565b600081359050612f8981612f63565b92915050565b60008060408385031215612fa657612fa56129cc565b5b6000612fb485828601612c19565b9250506020612fc585828601612f7a565b9150509250929050565b600067ffffffffffffffff821115612fea57612fe9612dc2565b5b602082029050602081019050919050565b600080fd5b600061301361300e84612fcf565b612e22565b9050808382526020820190506020840283018581111561303657613035612ffb565b5b835b8181101561305f578061304b8882612c19565b845260208401935050602081019050613038565b5050509392505050565b600082601f83011261307e5761307d612db8565b5b813561308e848260208601613000565b91505092915050565b600067ffffffffffffffff8211156130b2576130b1612dc2565b5b602082029050602081019050919050565b60006130d66130d184613097565b612e22565b905080838252602082019050602084028301858111156130f9576130f8612ffb565b5b835b81811015613122578061310e8882612b64565b8452602084019350506020810190506130fb565b5050509392505050565b600082601f83011261314157613140612db8565b5b81356131518482602086016130c3565b91505092915050565b60008060408385031215613171576131706129cc565b5b600083013567ffffffffffffffff81111561318f5761318e6129d1565b5b61319b85828601613069565b925050602083013567ffffffffffffffff8111156131bc576131bb6129d1565b5b6131c88582860161312c565b9150509250929050565b600067ffffffffffffffff8211156131ed576131ec612dc2565b5b6131f682612ad7565b9050602081019050919050565b6000613216613211846131d2565b612e22565b90508281526020810184848401111561323257613231612dbd565b5b61323d848285612e6e565b509392505050565b600082601f83011261325a57613259612db8565b5b813561326a848260208601613203565b91505092915050565b6000806000806080858703121561328d5761328c6129cc565b5b600061329b87828801612c19565b94505060206132ac87828801612c19565b93505060406132bd87828801612b64565b925050606085013567ffffffffffffffff8111156132de576132dd6129d1565b5b6132ea87828801613245565b91505092959194509250565b6000806040838503121561330d5761330c6129cc565b5b600061331b85828601612c19565b925050602061332c85828601612c19565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061337d57607f821691505b6020821081036133905761338f613336565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006133f2602183612a9c565b91506133fd82613396565b604082019050919050565b60006020820190508181036000830152613421816133e5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613484603e83612a9c565b915061348f82613428565b604082019050919050565b600060208201905081810360008301526134b381613477565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613516602e83612a9c565b9150613521826134ba565b604082019050919050565b6000602082019050818103600083015261354581613509565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006135a8602b83612a9c565b91506135b38261354c565b604082019050919050565b600060208201905081810360008301526135d78161359b565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061363a602f83612a9c565b9150613645826135de565b604082019050919050565b600060208201905081810360008301526136698161362d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136d27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613695565b6136dc8683613695565b95508019841693508086168417925050509392505050565b6000819050919050565b600061371961371461370f84612b43565b6136f4565b612b43565b9050919050565b6000819050919050565b613733836136fe565b61374761373f82613720565b8484546136a2565b825550505050565b600090565b61375c61374f565b61376781848461372a565b505050565b5b8181101561378b57613780600082613754565b60018101905061376d565b5050565b601f8211156137d0576137a181613670565b6137aa84613685565b810160208510156137b9578190505b6137cd6137c585613685565b83018261376c565b50505b505050565b600082821c905092915050565b60006137f3600019846008026137d5565b1980831691505092915050565b600061380c83836137e2565b9150826002028217905092915050565b61382582612a91565b67ffffffffffffffff81111561383e5761383d612dc2565b5b6138488254613365565b61385382828561378f565b600060209050601f8311600181146138865760008415613874578287015190505b61387e8582613800565b8655506138e6565b601f19841661389486613670565b60005b828110156138bc57848901518255600182019150602085019450602081019050613897565b868310156138d957848901516138d5601f8916826137e2565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061390482612a91565b61390e81856138ee565b935061391e818560208601612aad565b80840191505092915050565b600061393682846138f9565b915081905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061399d602c83612a9c565b91506139a882613941565b604082019050919050565b600060208201905081810360008301526139cc81613990565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613a38601883612a9c565b9150613a4382613a02565b602082019050919050565b60006020820190508181036000830152613a6781613a2b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613aca602983612a9c565b9150613ad582613a6e565b604082019050919050565b60006020820190508181036000830152613af981613abd565b9050919050565b7f4552433732313a20726563697069656e747320616e6420616d6f756e7473206c60008201527f656e677468206d69736d61746368000000000000000000000000000000000000602082015250565b6000613b5c602e83612a9c565b9150613b6782613b00565b604082019050919050565b60006020820190508181036000830152613b8b81613b4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bcc82612b43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bfe57613bfd613b92565b5b600182019050919050565b6000613c1582856138f9565b9150613c2182846138f9565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c89602583612a9c565b9150613c9482613c2d565b604082019050919050565b60006020820190508181036000830152613cb881613c7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d1b602483612a9c565b9150613d2682613cbf565b604082019050919050565b60006020820190508181036000830152613d4a81613d0e565b9050919050565b6000613d5c82612b43565b9150613d6783612b43565b9250828203905081811115613d7f57613d7e613b92565b5b92915050565b6000613d9082612b43565b9150613d9b83612b43565b9250828201905080821115613db357613db2613b92565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613def601983612a9c565b9150613dfa82613db9565b602082019050919050565b60006020820190508181036000830152613e1e81613de2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e81603283612a9c565b9150613e8c82613e25565b604082019050919050565b60006020820190508181036000830152613eb081613e74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ef182612b43565b9150613efc83612b43565b925082613f0c57613f0b613eb7565b5b828204905092915050565b6000613f2282612b43565b9150613f2d83612b43565b925082613f3d57613f3c613eb7565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613f7e6017836138ee565b9150613f8982613f48565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613fca6011836138ee565b9150613fd582613f94565b601182019050919050565b6000613feb82613f71565b9150613ff782856138f9565b915061400282613fbd565b915061400e82846138f9565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614050601483612a9c565b915061405b8261401a565b602082019050919050565b6000602082019050818103600083015261407f81614043565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006140bc601083612a9c565b91506140c782614086565b602082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614119826140f2565b61412381856140fd565b9350614133818560208601612aad565b61413c81612ad7565b840191505092915050565b600060808201905061415c6000830187612bd8565b6141696020830186612bd8565b6141766040830185612c6e565b8181036060830152614188818461410e565b905095945050505050565b6000815190506141a281612a02565b92915050565b6000602082840312156141be576141bd6129cc565b5b60006141cc84828501614193565b91505092915050565b60006141e082612b43565b91506141eb83612b43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422457614223613b92565b5b828202905092915050565b600061423a82612b43565b91506000820361424d5761424c613b92565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061428e602083612a9c565b915061429982614258565b602082019050919050565b600060208201905081810360008301526142bd81614281565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006142fa602083612a9c565b9150614305826142c4565b602082019050919050565b60006020820190508181036000830152614329816142ed565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614366601c83612a9c565b915061437182614330565b602082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202b177cdfb77c112eff05eb94c2485d7f3e64af65e8419562e9b859c0960256ce64736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80635c975abb1161010f578063a22cb465116100a2578063d539139311610071578063d53913931461057a578063d547741f14610598578063e63ab1e9146105b4578063e985e9c5146105d2576101e5565b8063a22cb465146104f6578063aef765e414610512578063b88d4fde1461052e578063c87b56dd1461054a576101e5565b80638456cb59116100de5780638456cb591461048057806391d148541461048a57806395d89b41146104ba578063a217fddf146104d8576101e5565b80635c975abb146103e45780636352211e146104025780636c0360eb1461043257806370a0823114610450576101e5565b80632f2ff15d116101875780633f4ba83a116101565780633f4ba83a1461037257806340d097c31461037c57806342842e0e146103985780634f6ccce7146103b4576101e5565b80632f2ff15d146102ee5780632f745c591461030a57806336568abe1461033a57806339a0c6f914610356576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248a9ca3146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff9190612a2e565b610602565b6040516102119190612a76565b60405180910390f35b610222610614565b60405161022f9190612b21565b60405180910390f35b610252600480360381019061024d9190612b79565b6106a6565b60405161025f9190612be7565b60405180910390f35b610282600480360381019061027d9190612c2e565b6106ec565b005b61028c610803565b6040516102999190612c7d565b60405180910390f35b6102bc60048036038101906102b79190612c98565b610810565b005b6102d860048036038101906102d39190612d21565b610870565b6040516102e59190612d5d565b60405180910390f35b61030860048036038101906103039190612d78565b610890565b005b610324600480360381019061031f9190612c2e565b6108b1565b6040516103319190612c7d565b60405180910390f35b610354600480360381019061034f9190612d78565b610956565b005b610370600480360381019061036b9190612eed565b6109d9565b005b61037a610a3c565b005b61039660048036038101906103919190612f36565b610a71565b005b6103b260048036038101906103ad9190612c98565b610ac2565b005b6103ce60048036038101906103c99190612b79565b610ae2565b6040516103db9190612c7d565b60405180910390f35b6103ec610b53565b6040516103f99190612a76565b60405180910390f35b61041c60048036038101906104179190612b79565b610b6a565b6040516104299190612be7565b60405180910390f35b61043a610c1b565b6040516104479190612b21565b60405180910390f35b61046a60048036038101906104659190612f36565b610c2a565b6040516104779190612c7d565b60405180910390f35b610488610ce1565b005b6104a4600480360381019061049f9190612d78565b610d16565b6040516104b19190612a76565b60405180910390f35b6104c2610d81565b6040516104cf9190612b21565b60405180910390f35b6104e0610e13565b6040516104ed9190612d5d565b60405180910390f35b610510600480360381019061050b9190612f8f565b610e1a565b005b61052c6004803603810190610527919061315a565b610e30565b005b61054860048036038101906105439190613273565b610f2b565b005b610564600480360381019061055f9190612b79565b610f8d565b6040516105719190612b21565b60405180910390f35b610582610ff5565b60405161058f9190612d5d565b60405180910390f35b6105b260048036038101906105ad9190612d78565b611019565b005b6105bc61103a565b6040516105c99190612d5d565b60405180910390f35b6105ec60048036038101906105e791906132f6565b61105e565b6040516105f99190612a76565b60405180910390f35b600061060d826110f2565b9050919050565b60606000805461062390613365565b80601f016020809104026020016040519081016040528092919081815260200182805461064f90613365565b801561069c5780601f106106715761010080835404028352916020019161069c565b820191906000526020600020905b81548152906001019060200180831161067f57829003601f168201915b5050505050905090565b60006106b18261116c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106f782610b6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e90613408565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107866111b7565b73ffffffffffffffffffffffffffffffffffffffff1614806107b557506107b4816107af6111b7565b61105e565b5b6107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb9061349a565b60405180910390fd5b6107fe83836111bf565b505050565b6000600880549050905090565b61082161081b6111b7565b82611278565b610860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108579061352c565b60405180910390fd5b61086b83838361130d565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b61089982610870565b6108a281611573565b6108ac8383611587565b505050565b60006108bc83610c2a565b82106108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f4906135be565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61095e6111b7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290613650565b60405180910390fd5b6109d58282611668565b5050565b6000801b6109e681611573565b81600d90816109f5919061381c565b5081604051610a04919061392a565b60405180910390207f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376760405160405180910390a25050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a6681611573565b610a6e61174a565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a9b81611573565b6000610aa7600c6117ad565b9050610ab3600c6117bb565b610abd83826117d1565b505050565b610add83838360405180602001604052806000815250610f2b565b505050565b6000610aec610803565b8210610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906139b3565b60405180910390fd5b60088281548110610b4157610b406139d3565b5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0990613a4e565b60405180910390fd5b80915050919050565b6060610c256117ef565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613ae0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d0b81611573565b610d13611881565b50565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610d9090613365565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbc90613365565b8015610e095780601f10610dde57610100808354040283529160200191610e09565b820191906000526020600020905b815481529060010190602001808311610dec57829003601f168201915b5050505050905090565b6000801b81565b610e2c610e256111b7565b83836118e4565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e5a81611573565b8151835114610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9590613b72565b60405180910390fd5b60005b8351811015610f25576000848281518110610ebf57610ebe6139d3565b5b602002602001015190506000848381518110610ede57610edd6139d3565b5b6020026020010151905060005b81811015610f0f57610efc83610a71565b8080610f0790613bc1565b915050610eeb565b5050508080610f1d90613bc1565b915050610ea1565b50505050565b610f3c610f366111b7565b83611278565b610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f729061352c565b60405180910390fd5b610f8784848484611a50565b50505050565b6060610f988261116c565b6000610fa26117ef565b90506000815111610fc25760405180602001604052806000815250610fed565b80610fcc84611aac565b604051602001610fdd929190613c09565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61102282610870565b61102b81611573565b6110358383611668565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611165575061116482611c0c565b5b9050919050565b61117581611c86565b6111b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ab90613a4e565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661123283610b6a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061128483610b6a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112c657506112c5818561105e565b5b8061130457508373ffffffffffffffffffffffffffffffffffffffff166112ec846106a6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661132d82610b6a565b73ffffffffffffffffffffffffffffffffffffffff1614611383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137a90613c9f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e990613d31565b60405180910390fd5b6113fd838383611cf2565b6114086000826111bf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114589190613d51565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114af9190613d85565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461156e838383611d0a565b505050565b6115848161157f6111b7565b611d0f565b50565b6115918282610d16565b611664576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116096111b7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116728282610d16565b15611746576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116eb6111b7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611752611dac565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6117966111b7565b6040516117a39190612be7565b60405180910390a1565b600081600001549050919050565b6001816000016000828254019250508190555050565b6117eb828260405180602001604052806000815250611df5565b5050565b6060600d80546117fe90613365565b80601f016020809104026020016040519081016040528092919081815260200182805461182a90613365565b80156118775780601f1061184c57610100808354040283529160200191611877565b820191906000526020600020905b81548152906001019060200180831161185a57829003601f168201915b5050505050905090565b611889611e50565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118cd6111b7565b6040516118da9190612be7565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990613e05565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a439190612a76565b60405180910390a3505050565b611a5b84848461130d565b611a6784848484611e9a565b611aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9d90613e97565b60405180910390fd5b50505050565b606060008203611af3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c07565b600082905060005b60008214611b25578080611b0e90613bc1565b915050600a82611b1e9190613ee6565b9150611afb565b60008167ffffffffffffffff811115611b4157611b40612dc2565b5b6040519080825280601f01601f191660200182016040528015611b735781602001600182028036833780820191505090505b5090505b60008514611c0057600182611b8c9190613d51565b9150600a85611b9b9190613f17565b6030611ba79190613d85565b60f81b818381518110611bbd57611bbc6139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611bf99190613ee6565b9450611b77565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c7f5750611c7e82612021565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611cfa611e50565b611d05838383612103565b505050565b505050565b611d198282610d16565b611da857611d3e8173ffffffffffffffffffffffffffffffffffffffff166014612215565b611d4c8360001c6020612215565b604051602001611d5d929190613fe0565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f9190612b21565b60405180910390fd5b5050565b611db4610b53565b611df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dea90614066565b60405180910390fd5b565b611dff8383612451565b611e0c6000848484611e9a565b611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290613e97565b60405180910390fd5b505050565b611e58610b53565b15611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f906140d2565b60405180910390fd5b565b6000611ebb8473ffffffffffffffffffffffffffffffffffffffff1661262a565b15612014578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ee46111b7565b8786866040518563ffffffff1660e01b8152600401611f069493929190614147565b6020604051808303816000875af1925050508015611f4257506040513d601f19601f82011682018060405250810190611f3f91906141a8565b60015b611fc4573d8060008114611f72576040519150601f19603f3d011682016040523d82523d6000602084013e611f77565b606091505b506000815103611fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb390613e97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612019565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120fc57506120fb8261264d565b5b9050919050565b61210e8383836126b7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121505761214b816126bc565b61218f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461218e5761218d8382612705565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121d1576121cc81612872565b612210565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461220f5761220e8282612943565b5b5b505050565b60606000600283600261222891906141d5565b6122329190613d85565b67ffffffffffffffff81111561224b5761224a612dc2565b5b6040519080825280601f01601f19166020018201604052801561227d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106122b5576122b46139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612319576123186139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261235991906141d5565b6123639190613d85565b90505b6001811115612403577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123a5576123a46139d3565b5b1a60f81b8282815181106123bc576123bb6139d3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806123fc9061422f565b9050612366565b5060008414612447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243e906142a4565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b790614310565b60405180910390fd5b6124c981611c86565b15612509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125009061437c565b60405180910390fd5b61251560008383611cf2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125659190613d85565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461262660008383611d0a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161271284610c2a565b61271c9190613d51565b9050600060076000848152602001908152602001600020549050818114612801576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128869190613d51565b90506000600960008481526020019081526020016000205490506000600883815481106128b6576128b56139d3565b5b9060005260206000200154905080600883815481106128d8576128d76139d3565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129275761292661439c565b5b6001900381819060005260206000200160009055905550505050565b600061294e83610c2a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a0b816129d6565b8114612a1657600080fd5b50565b600081359050612a2881612a02565b92915050565b600060208284031215612a4457612a436129cc565b5b6000612a5284828501612a19565b91505092915050565b60008115159050919050565b612a7081612a5b565b82525050565b6000602082019050612a8b6000830184612a67565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612acb578082015181840152602081019050612ab0565b60008484015250505050565b6000601f19601f8301169050919050565b6000612af382612a91565b612afd8185612a9c565b9350612b0d818560208601612aad565b612b1681612ad7565b840191505092915050565b60006020820190508181036000830152612b3b8184612ae8565b905092915050565b6000819050919050565b612b5681612b43565b8114612b6157600080fd5b50565b600081359050612b7381612b4d565b92915050565b600060208284031215612b8f57612b8e6129cc565b5b6000612b9d84828501612b64565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bd182612ba6565b9050919050565b612be181612bc6565b82525050565b6000602082019050612bfc6000830184612bd8565b92915050565b612c0b81612bc6565b8114612c1657600080fd5b50565b600081359050612c2881612c02565b92915050565b60008060408385031215612c4557612c446129cc565b5b6000612c5385828601612c19565b9250506020612c6485828601612b64565b9150509250929050565b612c7781612b43565b82525050565b6000602082019050612c926000830184612c6e565b92915050565b600080600060608486031215612cb157612cb06129cc565b5b6000612cbf86828701612c19565b9350506020612cd086828701612c19565b9250506040612ce186828701612b64565b9150509250925092565b6000819050919050565b612cfe81612ceb565b8114612d0957600080fd5b50565b600081359050612d1b81612cf5565b92915050565b600060208284031215612d3757612d366129cc565b5b6000612d4584828501612d0c565b91505092915050565b612d5781612ceb565b82525050565b6000602082019050612d726000830184612d4e565b92915050565b60008060408385031215612d8f57612d8e6129cc565b5b6000612d9d85828601612d0c565b9250506020612dae85828601612c19565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612dfa82612ad7565b810181811067ffffffffffffffff82111715612e1957612e18612dc2565b5b80604052505050565b6000612e2c6129c2565b9050612e388282612df1565b919050565b600067ffffffffffffffff821115612e5857612e57612dc2565b5b612e6182612ad7565b9050602081019050919050565b82818337600083830152505050565b6000612e90612e8b84612e3d565b612e22565b905082815260208101848484011115612eac57612eab612dbd565b5b612eb7848285612e6e565b509392505050565b600082601f830112612ed457612ed3612db8565b5b8135612ee4848260208601612e7d565b91505092915050565b600060208284031215612f0357612f026129cc565b5b600082013567ffffffffffffffff811115612f2157612f206129d1565b5b612f2d84828501612ebf565b91505092915050565b600060208284031215612f4c57612f4b6129cc565b5b6000612f5a84828501612c19565b91505092915050565b612f6c81612a5b565b8114612f7757600080fd5b50565b600081359050612f8981612f63565b92915050565b60008060408385031215612fa657612fa56129cc565b5b6000612fb485828601612c19565b9250506020612fc585828601612f7a565b9150509250929050565b600067ffffffffffffffff821115612fea57612fe9612dc2565b5b602082029050602081019050919050565b600080fd5b600061301361300e84612fcf565b612e22565b9050808382526020820190506020840283018581111561303657613035612ffb565b5b835b8181101561305f578061304b8882612c19565b845260208401935050602081019050613038565b5050509392505050565b600082601f83011261307e5761307d612db8565b5b813561308e848260208601613000565b91505092915050565b600067ffffffffffffffff8211156130b2576130b1612dc2565b5b602082029050602081019050919050565b60006130d66130d184613097565b612e22565b905080838252602082019050602084028301858111156130f9576130f8612ffb565b5b835b81811015613122578061310e8882612b64565b8452602084019350506020810190506130fb565b5050509392505050565b600082601f83011261314157613140612db8565b5b81356131518482602086016130c3565b91505092915050565b60008060408385031215613171576131706129cc565b5b600083013567ffffffffffffffff81111561318f5761318e6129d1565b5b61319b85828601613069565b925050602083013567ffffffffffffffff8111156131bc576131bb6129d1565b5b6131c88582860161312c565b9150509250929050565b600067ffffffffffffffff8211156131ed576131ec612dc2565b5b6131f682612ad7565b9050602081019050919050565b6000613216613211846131d2565b612e22565b90508281526020810184848401111561323257613231612dbd565b5b61323d848285612e6e565b509392505050565b600082601f83011261325a57613259612db8565b5b813561326a848260208601613203565b91505092915050565b6000806000806080858703121561328d5761328c6129cc565b5b600061329b87828801612c19565b94505060206132ac87828801612c19565b93505060406132bd87828801612b64565b925050606085013567ffffffffffffffff8111156132de576132dd6129d1565b5b6132ea87828801613245565b91505092959194509250565b6000806040838503121561330d5761330c6129cc565b5b600061331b85828601612c19565b925050602061332c85828601612c19565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061337d57607f821691505b6020821081036133905761338f613336565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006133f2602183612a9c565b91506133fd82613396565b604082019050919050565b60006020820190508181036000830152613421816133e5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613484603e83612a9c565b915061348f82613428565b604082019050919050565b600060208201905081810360008301526134b381613477565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613516602e83612a9c565b9150613521826134ba565b604082019050919050565b6000602082019050818103600083015261354581613509565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006135a8602b83612a9c565b91506135b38261354c565b604082019050919050565b600060208201905081810360008301526135d78161359b565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061363a602f83612a9c565b9150613645826135de565b604082019050919050565b600060208201905081810360008301526136698161362d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136d27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613695565b6136dc8683613695565b95508019841693508086168417925050509392505050565b6000819050919050565b600061371961371461370f84612b43565b6136f4565b612b43565b9050919050565b6000819050919050565b613733836136fe565b61374761373f82613720565b8484546136a2565b825550505050565b600090565b61375c61374f565b61376781848461372a565b505050565b5b8181101561378b57613780600082613754565b60018101905061376d565b5050565b601f8211156137d0576137a181613670565b6137aa84613685565b810160208510156137b9578190505b6137cd6137c585613685565b83018261376c565b50505b505050565b600082821c905092915050565b60006137f3600019846008026137d5565b1980831691505092915050565b600061380c83836137e2565b9150826002028217905092915050565b61382582612a91565b67ffffffffffffffff81111561383e5761383d612dc2565b5b6138488254613365565b61385382828561378f565b600060209050601f8311600181146138865760008415613874578287015190505b61387e8582613800565b8655506138e6565b601f19841661389486613670565b60005b828110156138bc57848901518255600182019150602085019450602081019050613897565b868310156138d957848901516138d5601f8916826137e2565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061390482612a91565b61390e81856138ee565b935061391e818560208601612aad565b80840191505092915050565b600061393682846138f9565b915081905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061399d602c83612a9c565b91506139a882613941565b604082019050919050565b600060208201905081810360008301526139cc81613990565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613a38601883612a9c565b9150613a4382613a02565b602082019050919050565b60006020820190508181036000830152613a6781613a2b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613aca602983612a9c565b9150613ad582613a6e565b604082019050919050565b60006020820190508181036000830152613af981613abd565b9050919050565b7f4552433732313a20726563697069656e747320616e6420616d6f756e7473206c60008201527f656e677468206d69736d61746368000000000000000000000000000000000000602082015250565b6000613b5c602e83612a9c565b9150613b6782613b00565b604082019050919050565b60006020820190508181036000830152613b8b81613b4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613bcc82612b43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bfe57613bfd613b92565b5b600182019050919050565b6000613c1582856138f9565b9150613c2182846138f9565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c89602583612a9c565b9150613c9482613c2d565b604082019050919050565b60006020820190508181036000830152613cb881613c7c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d1b602483612a9c565b9150613d2682613cbf565b604082019050919050565b60006020820190508181036000830152613d4a81613d0e565b9050919050565b6000613d5c82612b43565b9150613d6783612b43565b9250828203905081811115613d7f57613d7e613b92565b5b92915050565b6000613d9082612b43565b9150613d9b83612b43565b9250828201905080821115613db357613db2613b92565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613def601983612a9c565b9150613dfa82613db9565b602082019050919050565b60006020820190508181036000830152613e1e81613de2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e81603283612a9c565b9150613e8c82613e25565b604082019050919050565b60006020820190508181036000830152613eb081613e74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ef182612b43565b9150613efc83612b43565b925082613f0c57613f0b613eb7565b5b828204905092915050565b6000613f2282612b43565b9150613f2d83612b43565b925082613f3d57613f3c613eb7565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613f7e6017836138ee565b9150613f8982613f48565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613fca6011836138ee565b9150613fd582613f94565b601182019050919050565b6000613feb82613f71565b9150613ff782856138f9565b915061400282613fbd565b915061400e82846138f9565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614050601483612a9c565b915061405b8261401a565b602082019050919050565b6000602082019050818103600083015261407f81614043565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006140bc601083612a9c565b91506140c782614086565b602082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614119826140f2565b61412381856140fd565b9350614133818560208601612aad565b61413c81612ad7565b840191505092915050565b600060808201905061415c6000830187612bd8565b6141696020830186612bd8565b6141766040830185612c6e565b8181036060830152614188818461410e565b905095945050505050565b6000815190506141a281612a02565b92915050565b6000602082840312156141be576141bd6129cc565b5b60006141cc84828501614193565b91505092915050565b60006141e082612b43565b91506141eb83612b43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422457614223613b92565b5b828202905092915050565b600061423a82612b43565b91506000820361424d5761424c613b92565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061428e602083612a9c565b915061429982614258565b602082019050919050565b600060208201905081810360008301526142bd81614281565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006142fa602083612a9c565b9150614305826142c4565b602082019050919050565b60006020820190508181036000830152614329816142ed565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614366601c83612a9c565b915061437182614330565b602082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202b177cdfb77c112eff05eb94c2485d7f3e64af65e8419562e9b859c0960256ce64736f6c63430008100033
Deployed Bytecode Sourcemap
57682:2318:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59770:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22623:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24136:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23653:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37254:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24836:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52457:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52898:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36922:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54042:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58521:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58757:77;;;:::i;:::-;;58842:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25243:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37444:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44298:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22334:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58422:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22065:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58676:73;;;:::i;:::-;;50917:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22792:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50022:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24379:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59042:485;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25499:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22967:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57929:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53338:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57860:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24605:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59770:227;59924:4;59953:36;59977:11;59953:23;:36::i;:::-;59946:43;;59770:227;;;:::o;22623:100::-;22677:13;22710:5;22703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22623:100;:::o;24136:171::-;24212:7;24232:23;24247:7;24232:14;:23::i;:::-;24275:15;:24;24291:7;24275:24;;;;;;;;;;;;;;;;;;;;;24268:31;;24136:171;;;:::o;23653:417::-;23734:13;23750:23;23765:7;23750:14;:23::i;:::-;23734:39;;23798:5;23792:11;;:2;:11;;;23784:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23892:5;23876:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23901:37;23918:5;23925:12;:10;:12::i;:::-;23901:16;:37::i;:::-;23876:62;23854:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24041:21;24050:2;24054:7;24041:8;:21::i;:::-;23723:347;23653:417;;:::o;37254:113::-;37315:7;37342:10;:17;;;;37335:24;;37254:113;:::o;24836:336::-;25031:41;25050:12;:10;:12::i;:::-;25064:7;25031:18;:41::i;:::-;25023:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25136:28;25146:4;25152:2;25156:7;25136:9;:28::i;:::-;24836:336;;;:::o;52457:131::-;52531:7;52558:6;:12;52565:4;52558:12;;;;;;;;;;;:22;;;52551:29;;52457:131;;;:::o;52898:147::-;52981:18;52994:4;52981:12;:18::i;:::-;50513:16;50524:4;50513:10;:16::i;:::-;53012:25:::1;53023:4;53029:7;53012:10;:25::i;:::-;52898:147:::0;;;:::o;36922:256::-;37019:7;37055:23;37072:5;37055:16;:23::i;:::-;37047:5;:31;37039:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37144:12;:19;37157:5;37144:19;;;;;;;;;;;;;;;:26;37164:5;37144:26;;;;;;;;;;;;37137:33;;36922:256;;;;:::o;54042:218::-;54149:12;:10;:12::i;:::-;54138:23;;:7;:23;;;54130:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54226:26;54238:4;54244:7;54226:11;:26::i;:::-;54042:218;;:::o;58521:147::-;50067:4;58581:18;;50513:16;50524:4;50513:10;:16::i;:::-;58619:5:::1;58612:4;:12;;;;;;:::i;:::-;;58654:5;58640:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;58521:147:::0;;:::o;58757:77::-;57898:24;50513:16;50524:4;50513:10;:16::i;:::-;58816:10:::1;:8;:10::i;:::-;58757:77:::0;:::o;58842:192::-;57967:24;50513:16;50524:4;50513:10;:16::i;:::-;58912:15:::1;58930:25;:15;:23;:25::i;:::-;58912:43;;58966:27;:15;:25;:27::i;:::-;59004:22;59014:2;59018:7;59004:9;:22::i;:::-;58901:133;58842:192:::0;;:::o;25243:185::-;25381:39;25398:4;25404:2;25408:7;25381:39;;;;;;;;;;;;:16;:39::i;:::-;25243:185;;;:::o;37444:233::-;37519:7;37555:30;:28;:30::i;:::-;37547:5;:38;37539:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37652:10;37663:5;37652:17;;;;;;;;:::i;:::-;;;;;;;;;;37645:24;;37444:233;;;:::o;44298:86::-;44345:4;44369:7;;;;;;;;;;;44362:14;;44298:86;:::o;22334:222::-;22406:7;22426:13;22442:7;:16;22450:7;22442:16;;;;;;;;;;;;;;;;;;;;;22426:32;;22494:1;22477:19;;:5;:19;;;22469:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22543:5;22536:12;;;22334:222;;;:::o;58422:91::-;58462:13;58495:10;:8;:10::i;:::-;58488:17;;58422:91;:::o;22065:207::-;22137:7;22182:1;22165:19;;:5;:19;;;22157:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22248:9;:16;22258:5;22248:16;;;;;;;;;;;;;;;;22241:23;;22065:207;;;:::o;58676:73::-;57898:24;50513:16;50524:4;50513:10;:16::i;:::-;58733:8:::1;:6;:8::i;:::-;58676:73:::0;:::o;50917:147::-;51003:4;51027:6;:12;51034:4;51027:12;;;;;;;;;;;:20;;:29;51048:7;51027:29;;;;;;;;;;;;;;;;;;;;;;;;;51020:36;;50917:147;;;;:::o;22792:104::-;22848:13;22881:7;22874:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22792:104;:::o;50022:49::-;50067:4;50022:49;;;:::o;24379:155::-;24474:52;24493:12;:10;:12::i;:::-;24507:8;24517;24474:18;:52::i;:::-;24379:155;;:::o;59042:485::-;57967:24;50513:16;50524:4;50513:10;:16::i;:::-;59189:7:::1;:14;59168:10;:17;:35;59160:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;59270:9;59265:255;59289:10;:17;59285:1;:21;59265:255;;;59328:17;59348:10;59359:1;59348:13;;;;;;;;:::i;:::-;;;;;;;;59328:33;;59376:14;59393:7;59401:1;59393:10;;;;;;;;:::i;:::-;;;;;;;;59376:27;;59423:9;59418:91;59442:6;59438:1;:10;59418:91;;;59474:19;59483:9;59474:8;:19::i;:::-;59450:3;;;;;:::i;:::-;;;;59418:91;;;;59313:207;;59308:3;;;;;:::i;:::-;;;;59265:255;;;;59042:485:::0;;;:::o;25499:323::-;25673:41;25692:12;:10;:12::i;:::-;25706:7;25673:18;:41::i;:::-;25665:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25776:38;25790:4;25796:2;25800:7;25809:4;25776:13;:38::i;:::-;25499:323;;;;:::o;22967:281::-;23040:13;23066:23;23081:7;23066:14;:23::i;:::-;23102:21;23126:10;:8;:10::i;:::-;23102:34;;23178:1;23160:7;23154:21;:25;:86;;;;;;;;;;;;;;;;;23206:7;23215:18;:7;:16;:18::i;:::-;23189:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23154:86;23147:93;;;22967:281;;;:::o;57929:62::-;57967:24;57929:62;:::o;53338:149::-;53422:18;53435:4;53422:12;:18::i;:::-;50513:16;50524:4;50513:10;:16::i;:::-;53453:26:::1;53465:4;53471:7;53453:11;:26::i;:::-;53338:149:::0;;;:::o;57860:62::-;57898:24;57860:62;:::o;24605:164::-;24702:4;24726:18;:25;24745:5;24726:25;;;;;;;;;;;;;;;:35;24752:8;24726:35;;;;;;;;;;;;;;;;;;;;;;;;;24719:42;;24605:164;;;;:::o;50621:204::-;50706:4;50745:32;50730:47;;;:11;:47;;;;:87;;;;50781:36;50805:11;50781:23;:36::i;:::-;50730:87;50723:94;;50621:204;;;:::o;32111:135::-;32193:16;32201:7;32193;:16::i;:::-;32185:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32111:135;:::o;16969:98::-;17022:7;17049:10;17042:17;;16969:98;:::o;31390:174::-;31492:2;31465:15;:24;31481:7;31465:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31548:7;31544:2;31510:46;;31519:23;31534:7;31519:14;:23::i;:::-;31510:46;;;;;;;;;;;;31390:174;;:::o;27623:264::-;27716:4;27733:13;27749:23;27764:7;27749:14;:23::i;:::-;27733:39;;27802:5;27791:16;;:7;:16;;;:52;;;;27811:32;27828:5;27835:7;27811:16;:32::i;:::-;27791:52;:87;;;;27871:7;27847:31;;:20;27859:7;27847:11;:20::i;:::-;:31;;;27791:87;27783:96;;;27623:264;;;;:::o;30646:625::-;30805:4;30778:31;;:23;30793:7;30778:14;:23::i;:::-;:31;;;30770:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30884:1;30870:16;;:2;:16;;;30862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30940:39;30961:4;30967:2;30971:7;30940:20;:39::i;:::-;31044:29;31061:1;31065:7;31044:8;:29::i;:::-;31105:1;31086:9;:15;31096:4;31086:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31134:1;31117:9;:13;31127:2;31117:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31165:2;31146:7;:16;31154:7;31146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31204:7;31200:2;31185:27;;31194:4;31185:27;;;;;;;;;;;;31225:38;31245:4;31251:2;31255:7;31225:19;:38::i;:::-;30646:625;;;:::o;51368:105::-;51435:30;51446:4;51452:12;:10;:12::i;:::-;51435:10;:30::i;:::-;51368:105;:::o;55639:238::-;55723:22;55731:4;55737:7;55723;:22::i;:::-;55718:152;;55794:4;55762:6;:12;55769:4;55762:12;;;;;;;;;;;:20;;:29;55783:7;55762:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;55845:12;:10;:12::i;:::-;55818:40;;55836:7;55818:40;;55830:4;55818:40;;;;;;;;;;55718:152;55639:238;;:::o;56057:239::-;56141:22;56149:4;56155:7;56141;:22::i;:::-;56137:152;;;56212:5;56180:6;:12;56187:4;56180:12;;;;;;;;;;;:20;;:29;56201:7;56180:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;56264:12;:10;:12::i;:::-;56237:40;;56255:7;56237:40;;56249:4;56237:40;;;;;;;;;;56137:152;56057:239;;:::o;45153:120::-;44162:16;:14;:16::i;:::-;45222:5:::1;45212:7;;:15;;;;;;;;;;;;;;;;;;45243:22;45252:12;:10;:12::i;:::-;45243:22;;;;;;:::i;:::-;;;;;;;;45153:120::o:0;57061:114::-;57126:7;57153;:14;;;57146:21;;57061:114;;;:::o;57183:127::-;57290:1;57272:7;:14;;;:19;;;;;;;;;;;57183:127;:::o;28229:110::-;28305:26;28315:2;28319:7;28305:26;;;;;;;;;;;;:9;:26::i;:::-;28229:110;;:::o;58317:97::-;58369:13;58402:4;58395:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58317:97;:::o;44894:118::-;43903:19;:17;:19::i;:::-;44964:4:::1;44954:7;;:14;;;;;;;;;;;;;;;;;;44984:20;44991:12;:10;:12::i;:::-;44984:20;;;;;;:::i;:::-;;;;;;;;44894:118::o:0;31707:315::-;31862:8;31853:17;;:5;:17;;;31845:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31949:8;31911:18;:25;31930:5;31911:25;;;;;;;;;;;;;;;:35;31937:8;31911:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31995:8;31973:41;;31988:5;31973:41;;;32005:8;31973:41;;;;;;:::i;:::-;;;;;;;;31707:315;;;:::o;26703:313::-;26859:28;26869:4;26875:2;26879:7;26859:9;:28::i;:::-;26906:47;26929:4;26935:2;26939:7;26948:4;26906:22;:47::i;:::-;26898:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26703:313;;;;:::o;17486:723::-;17542:13;17772:1;17763:5;:10;17759:53;;17790:10;;;;;;;;;;;;;;;;;;;;;17759:53;17822:12;17837:5;17822:20;;17853:14;17878:78;17893:1;17885:4;:9;17878:78;;17911:8;;;;;:::i;:::-;;;;17942:2;17934:10;;;;;:::i;:::-;;;17878:78;;;17966:19;17998:6;17988:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17966:39;;18016:154;18032:1;18023:5;:10;18016:154;;18060:1;18050:11;;;;;:::i;:::-;;;18127:2;18119:5;:10;;;;:::i;:::-;18106:2;:24;;;;:::i;:::-;18093:39;;18076:6;18083;18076:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18156:2;18147:11;;;;;:::i;:::-;;;18016:154;;;18194:6;18180:21;;;;;17486:723;;;;:::o;36614:224::-;36716:4;36755:35;36740:50;;;:11;:50;;;;:90;;;;36794:36;36818:11;36794:23;:36::i;:::-;36740:90;36733:97;;36614:224;;;:::o;27329:127::-;27394:4;27446:1;27418:30;;:7;:16;27426:7;27418:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27411:37;;27329:127;;;:::o;59535:227::-;43903:19;:17;:19::i;:::-;59709:45:::1;59736:4;59742:2;59746:7;59709:26;:45::i;:::-;59535:227:::0;;;:::o;34746:125::-;;;;:::o;51763:505::-;51852:22;51860:4;51866:7;51852;:22::i;:::-;51847:414;;52040:41;52068:7;52040:41;;52078:2;52040:19;:41::i;:::-;52154:38;52182:4;52174:13;;52189:2;52154:19;:38::i;:::-;51945:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51891:358;;;;;;;;;;;:::i;:::-;;;;;;;;51847:414;51763:505;;:::o;44642:108::-;44709:8;:6;:8::i;:::-;44701:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;44642:108::o;28566:319::-;28695:18;28701:2;28705:7;28695:5;:18::i;:::-;28746:53;28777:1;28781:2;28785:7;28794:4;28746:22;:53::i;:::-;28724:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28566:319;;;:::o;44457:108::-;44528:8;:6;:8::i;:::-;44527:9;44519:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;44457:108::o;32810:853::-;32964:4;32985:15;:2;:13;;;:15::i;:::-;32981:675;;;33037:2;33021:36;;;33058:12;:10;:12::i;:::-;33072:4;33078:7;33087:4;33021:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33017:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33279:1;33262:6;:13;:18;33258:328;;33305:60;;;;;;;;;;:::i;:::-;;;;;;;;33258:328;33536:6;33530:13;33521:6;33517:2;33513:15;33506:38;33017:584;33153:41;;;33143:51;;;:6;:51;;;;33136:58;;;;;32981:675;33640:4;33633:11;;32810:853;;;;;;;:::o;21696:305::-;21798:4;21850:25;21835:40;;;:11;:40;;;;:105;;;;21907:33;21892:48;;;:11;:48;;;;21835:105;:158;;;;21957:36;21981:11;21957:23;:36::i;:::-;21835:158;21815:178;;21696:305;;;:::o;38290:589::-;38434:45;38461:4;38467:2;38471:7;38434:26;:45::i;:::-;38512:1;38496:18;;:4;:18;;;38492:187;;38531:40;38563:7;38531:31;:40::i;:::-;38492:187;;;38601:2;38593:10;;:4;:10;;;38589:90;;38620:47;38653:4;38659:7;38620:32;:47::i;:::-;38589:90;38492:187;38707:1;38693:16;;:2;:16;;;38689:183;;38726:45;38763:7;38726:36;:45::i;:::-;38689:183;;;38799:4;38793:10;;:2;:10;;;38789:83;;38820:40;38848:2;38852:7;38820:27;:40::i;:::-;38789:83;38689:183;38290:589;;;:::o;18787:451::-;18862:13;18888:19;18933:1;18924:6;18920:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18910:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18888:47;;18946:15;:6;18953:1;18946:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18972;:6;18979:1;18972:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19003:9;19028:1;19019:6;19015:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19003:26;;18998:135;19035:1;19031;:5;18998:135;;;19070:12;19091:3;19083:5;:11;19070:25;;;;;;;:::i;:::-;;;;;19058:6;19065:1;19058:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;19120:1;19110:11;;;;;19038:3;;;;:::i;:::-;;;18998:135;;;;19160:1;19151:5;:10;19143:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;19223:6;19209:21;;;18787:451;;;;:::o;29221:439::-;29315:1;29301:16;;:2;:16;;;29293:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29374:16;29382:7;29374;:16::i;:::-;29373:17;29365:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29436:45;29465:1;29469:2;29473:7;29436:20;:45::i;:::-;29511:1;29494:9;:13;29504:2;29494:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29542:2;29523:7;:16;29531:7;29523:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29587:7;29583:2;29562:33;;29579:1;29562:33;;;;;;;;;;;;29608:44;29636:1;29640:2;29644:7;29608:19;:44::i;:::-;29221:439;;:::o;9082:326::-;9142:4;9399:1;9377:7;:19;;;:23;9370:30;;9082:326;;;:::o;20278:157::-;20363:4;20402:25;20387:40;;;:11;:40;;;;20380:47;;20278:157;;;:::o;34235:126::-;;;;:::o;39602:164::-;39706:10;:17;;;;39679:15;:24;39695:7;39679:24;;;;;;;;;;;:44;;;;39734:10;39750:7;39734:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39602:164;:::o;40393:988::-;40659:22;40709:1;40684:22;40701:4;40684:16;:22::i;:::-;:26;;;;:::i;:::-;40659:51;;40721:18;40742:17;:26;40760:7;40742:26;;;;;;;;;;;;40721:47;;40889:14;40875:10;:28;40871:328;;40920:19;40942:12;:18;40955:4;40942:18;;;;;;;;;;;;;;;:34;40961:14;40942:34;;;;;;;;;;;;40920:56;;41026:11;40993:12;:18;41006:4;40993:18;;;;;;;;;;;;;;;:30;41012:10;40993:30;;;;;;;;;;;:44;;;;41143:10;41110:17;:30;41128:11;41110:30;;;;;;;;;;;:43;;;;40905:294;40871:328;41295:17;:26;41313:7;41295:26;;;;;;;;;;;41288:33;;;41339:12;:18;41352:4;41339:18;;;;;;;;;;;;;;;:34;41358:14;41339:34;;;;;;;;;;;41332:41;;;40474:907;;40393:988;;:::o;41676:1079::-;41929:22;41974:1;41954:10;:17;;;;:21;;;;:::i;:::-;41929:46;;41986:18;42007:15;:24;42023:7;42007:24;;;;;;;;;;;;41986:45;;42358:19;42380:10;42391:14;42380:26;;;;;;;;:::i;:::-;;;;;;;;;;42358:48;;42444:11;42419:10;42430;42419:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42555:10;42524:15;:28;42540:11;42524:28;;;;;;;;;;;:41;;;;42696:15;:24;42712:7;42696:24;;;;;;;;;;;42689:31;;;42731:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41747:1008;;;41676:1079;:::o;39180:221::-;39265:14;39282:20;39299:2;39282:16;:20::i;:::-;39265:37;;39340:7;39313:12;:16;39326:2;39313:16;;;;;;;;;;;;;;;:24;39330:6;39313:24;;;;;;;;;;;:34;;;;39387:6;39358:17;:26;39376:7;39358:26;;;;;;;;;;;:35;;;;39254:147;39180:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:122::-;6023:24;6041:5;6023:24;:::i;:::-;6016:5;6013:35;6003:63;;6062:1;6059;6052:12;6003:63;5950:122;:::o;6078:139::-;6124:5;6162:6;6149:20;6140:29;;6178:33;6205:5;6178:33;:::i;:::-;6078:139;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:118::-;6645:24;6663:5;6645:24;:::i;:::-;6640:3;6633:37;6558:118;;:::o;6682:222::-;6775:4;6813:2;6802:9;6798:18;6790:26;;6826:71;6894:1;6883:9;6879:17;6870:6;6826:71;:::i;:::-;6682:222;;;;:::o;6910:474::-;6978:6;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7161:1;7186:53;7231:7;7222:6;7211:9;7207:22;7186:53;:::i;:::-;7176:63;;7132:117;7288:2;7314:53;7359:7;7350:6;7339:9;7335:22;7314:53;:::i;:::-;7304:63;;7259:118;6910:474;;;;;:::o;7390:117::-;7499:1;7496;7489:12;7513:117;7622:1;7619;7612:12;7636:180;7684:77;7681:1;7674:88;7781:4;7778:1;7771:15;7805:4;7802:1;7795:15;7822:281;7905:27;7927:4;7905:27;:::i;:::-;7897:6;7893:40;8035:6;8023:10;8020:22;7999:18;7987:10;7984:34;7981:62;7978:88;;;8046:18;;:::i;:::-;7978:88;8086:10;8082:2;8075:22;7865:238;7822:281;;:::o;8109:129::-;8143:6;8170:20;;:::i;:::-;8160:30;;8199:33;8227:4;8219:6;8199:33;:::i;:::-;8109:129;;;:::o;8244:308::-;8306:4;8396:18;8388:6;8385:30;8382:56;;;8418:18;;:::i;:::-;8382:56;8456:29;8478:6;8456:29;:::i;:::-;8448:37;;8540:4;8534;8530:15;8522:23;;8244:308;;;:::o;8558:146::-;8655:6;8650:3;8645;8632:30;8696:1;8687:6;8682:3;8678:16;8671:27;8558:146;;;:::o;8710:425::-;8788:5;8813:66;8829:49;8871:6;8829:49;:::i;:::-;8813:66;:::i;:::-;8804:75;;8902:6;8895:5;8888:21;8940:4;8933:5;8929:16;8978:3;8969:6;8964:3;8960:16;8957:25;8954:112;;;8985:79;;:::i;:::-;8954:112;9075:54;9122:6;9117:3;9112;9075:54;:::i;:::-;8794:341;8710:425;;;;;:::o;9155:340::-;9211:5;9260:3;9253:4;9245:6;9241:17;9237:27;9227:122;;9268:79;;:::i;:::-;9227:122;9385:6;9372:20;9410:79;9485:3;9477:6;9470:4;9462:6;9458:17;9410:79;:::i;:::-;9401:88;;9217:278;9155:340;;;;:::o;9501:509::-;9570:6;9619:2;9607:9;9598:7;9594:23;9590:32;9587:119;;;9625:79;;:::i;:::-;9587:119;9773:1;9762:9;9758:17;9745:31;9803:18;9795:6;9792:30;9789:117;;;9825:79;;:::i;:::-;9789:117;9930:63;9985:7;9976:6;9965:9;9961:22;9930:63;:::i;:::-;9920:73;;9716:287;9501:509;;;;:::o;10016:329::-;10075:6;10124:2;10112:9;10103:7;10099:23;10095:32;10092:119;;;10130:79;;:::i;:::-;10092:119;10250:1;10275:53;10320:7;10311:6;10300:9;10296:22;10275:53;:::i;:::-;10265:63;;10221:117;10016:329;;;;:::o;10351:116::-;10421:21;10436:5;10421:21;:::i;:::-;10414:5;10411:32;10401:60;;10457:1;10454;10447:12;10401:60;10351:116;:::o;10473:133::-;10516:5;10554:6;10541:20;10532:29;;10570:30;10594:5;10570:30;:::i;:::-;10473:133;;;;:::o;10612:468::-;10677:6;10685;10734:2;10722:9;10713:7;10709:23;10705:32;10702:119;;;10740:79;;:::i;:::-;10702:119;10860:1;10885:53;10930:7;10921:6;10910:9;10906:22;10885:53;:::i;:::-;10875:63;;10831:117;10987:2;11013:50;11055:7;11046:6;11035:9;11031:22;11013:50;:::i;:::-;11003:60;;10958:115;10612:468;;;;;:::o;11086:311::-;11163:4;11253:18;11245:6;11242:30;11239:56;;;11275:18;;:::i;:::-;11239:56;11325:4;11317:6;11313:17;11305:25;;11385:4;11379;11375:15;11367:23;;11086:311;;;:::o;11403:117::-;11512:1;11509;11502:12;11543:710;11639:5;11664:81;11680:64;11737:6;11680:64;:::i;:::-;11664:81;:::i;:::-;11655:90;;11765:5;11794:6;11787:5;11780:21;11828:4;11821:5;11817:16;11810:23;;11881:4;11873:6;11869:17;11861:6;11857:30;11910:3;11902:6;11899:15;11896:122;;;11929:79;;:::i;:::-;11896:122;12044:6;12027:220;12061:6;12056:3;12053:15;12027:220;;;12136:3;12165:37;12198:3;12186:10;12165:37;:::i;:::-;12160:3;12153:50;12232:4;12227:3;12223:14;12216:21;;12103:144;12087:4;12082:3;12078:14;12071:21;;12027:220;;;12031:21;11645:608;;11543:710;;;;;:::o;12276:370::-;12347:5;12396:3;12389:4;12381:6;12377:17;12373:27;12363:122;;12404:79;;:::i;:::-;12363:122;12521:6;12508:20;12546:94;12636:3;12628:6;12621:4;12613:6;12609:17;12546:94;:::i;:::-;12537:103;;12353:293;12276:370;;;;:::o;12652:311::-;12729:4;12819:18;12811:6;12808:30;12805:56;;;12841:18;;:::i;:::-;12805:56;12891:4;12883:6;12879:17;12871:25;;12951:4;12945;12941:15;12933:23;;12652:311;;;:::o;12986:710::-;13082:5;13107:81;13123:64;13180:6;13123:64;:::i;:::-;13107:81;:::i;:::-;13098:90;;13208:5;13237:6;13230:5;13223:21;13271:4;13264:5;13260:16;13253:23;;13324:4;13316:6;13312:17;13304:6;13300:30;13353:3;13345:6;13342:15;13339:122;;;13372:79;;:::i;:::-;13339:122;13487:6;13470:220;13504:6;13499:3;13496:15;13470:220;;;13579:3;13608:37;13641:3;13629:10;13608:37;:::i;:::-;13603:3;13596:50;13675:4;13670:3;13666:14;13659:21;;13546:144;13530:4;13525:3;13521:14;13514:21;;13470:220;;;13474:21;13088:608;;12986:710;;;;;:::o;13719:370::-;13790:5;13839:3;13832:4;13824:6;13820:17;13816:27;13806:122;;13847:79;;:::i;:::-;13806:122;13964:6;13951:20;13989:94;14079:3;14071:6;14064:4;14056:6;14052:17;13989:94;:::i;:::-;13980:103;;13796:293;13719:370;;;;:::o;14095:894::-;14213:6;14221;14270:2;14258:9;14249:7;14245:23;14241:32;14238:119;;;14276:79;;:::i;:::-;14238:119;14424:1;14413:9;14409:17;14396:31;14454:18;14446:6;14443:30;14440:117;;;14476:79;;:::i;:::-;14440:117;14581:78;14651:7;14642:6;14631:9;14627:22;14581:78;:::i;:::-;14571:88;;14367:302;14736:2;14725:9;14721:18;14708:32;14767:18;14759:6;14756:30;14753:117;;;14789:79;;:::i;:::-;14753:117;14894:78;14964:7;14955:6;14944:9;14940:22;14894:78;:::i;:::-;14884:88;;14679:303;14095:894;;;;;:::o;14995:307::-;15056:4;15146:18;15138:6;15135:30;15132:56;;;15168:18;;:::i;:::-;15132:56;15206:29;15228:6;15206:29;:::i;:::-;15198:37;;15290:4;15284;15280:15;15272:23;;14995:307;;;:::o;15308:423::-;15385:5;15410:65;15426:48;15467:6;15426:48;:::i;:::-;15410:65;:::i;:::-;15401:74;;15498:6;15491:5;15484:21;15536:4;15529:5;15525:16;15574:3;15565:6;15560:3;15556:16;15553:25;15550:112;;;15581:79;;:::i;:::-;15550:112;15671:54;15718:6;15713:3;15708;15671:54;:::i;:::-;15391:340;15308:423;;;;;:::o;15750:338::-;15805:5;15854:3;15847:4;15839:6;15835:17;15831:27;15821:122;;15862:79;;:::i;:::-;15821:122;15979:6;15966:20;16004:78;16078:3;16070:6;16063:4;16055:6;16051:17;16004:78;:::i;:::-;15995:87;;15811:277;15750:338;;;;:::o;16094:943::-;16189:6;16197;16205;16213;16262:3;16250:9;16241:7;16237:23;16233:33;16230:120;;;16269:79;;:::i;:::-;16230:120;16389:1;16414:53;16459:7;16450:6;16439:9;16435:22;16414:53;:::i;:::-;16404:63;;16360:117;16516:2;16542:53;16587:7;16578:6;16567:9;16563:22;16542:53;:::i;:::-;16532:63;;16487:118;16644:2;16670:53;16715:7;16706:6;16695:9;16691:22;16670:53;:::i;:::-;16660:63;;16615:118;16800:2;16789:9;16785:18;16772:32;16831:18;16823:6;16820:30;16817:117;;;16853:79;;:::i;:::-;16817:117;16958:62;17012:7;17003:6;16992:9;16988:22;16958:62;:::i;:::-;16948:72;;16743:287;16094:943;;;;;;;:::o;17043:474::-;17111:6;17119;17168:2;17156:9;17147:7;17143:23;17139:32;17136:119;;;17174:79;;:::i;:::-;17136:119;17294:1;17319:53;17364:7;17355:6;17344:9;17340:22;17319:53;:::i;:::-;17309:63;;17265:117;17421:2;17447:53;17492:7;17483:6;17472:9;17468:22;17447:53;:::i;:::-;17437:63;;17392:118;17043:474;;;;;:::o;17523:180::-;17571:77;17568:1;17561:88;17668:4;17665:1;17658:15;17692:4;17689:1;17682:15;17709:320;17753:6;17790:1;17784:4;17780:12;17770:22;;17837:1;17831:4;17827:12;17858:18;17848:81;;17914:4;17906:6;17902:17;17892:27;;17848:81;17976:2;17968:6;17965:14;17945:18;17942:38;17939:84;;17995:18;;:::i;:::-;17939:84;17760:269;17709:320;;;:::o;18035:220::-;18175:34;18171:1;18163:6;18159:14;18152:58;18244:3;18239:2;18231:6;18227:15;18220:28;18035:220;:::o;18261:366::-;18403:3;18424:67;18488:2;18483:3;18424:67;:::i;:::-;18417:74;;18500:93;18589:3;18500:93;:::i;:::-;18618:2;18613:3;18609:12;18602:19;;18261:366;;;:::o;18633:419::-;18799:4;18837:2;18826:9;18822:18;18814:26;;18886:9;18880:4;18876:20;18872:1;18861:9;18857:17;18850:47;18914:131;19040:4;18914:131;:::i;:::-;18906:139;;18633:419;;;:::o;19058:249::-;19198:34;19194:1;19186:6;19182:14;19175:58;19267:32;19262:2;19254:6;19250:15;19243:57;19058:249;:::o;19313:366::-;19455:3;19476:67;19540:2;19535:3;19476:67;:::i;:::-;19469:74;;19552:93;19641:3;19552:93;:::i;:::-;19670:2;19665:3;19661:12;19654:19;;19313:366;;;:::o;19685:419::-;19851:4;19889:2;19878:9;19874:18;19866:26;;19938:9;19932:4;19928:20;19924:1;19913:9;19909:17;19902:47;19966:131;20092:4;19966:131;:::i;:::-;19958:139;;19685:419;;;:::o;20110:233::-;20250:34;20246:1;20238:6;20234:14;20227:58;20319:16;20314:2;20306:6;20302:15;20295:41;20110:233;:::o;20349:366::-;20491:3;20512:67;20576:2;20571:3;20512:67;:::i;:::-;20505:74;;20588:93;20677:3;20588:93;:::i;:::-;20706:2;20701:3;20697:12;20690:19;;20349:366;;;:::o;20721:419::-;20887:4;20925:2;20914:9;20910:18;20902:26;;20974:9;20968:4;20964:20;20960:1;20949:9;20945:17;20938:47;21002:131;21128:4;21002:131;:::i;:::-;20994:139;;20721:419;;;:::o;21146:230::-;21286:34;21282:1;21274:6;21270:14;21263:58;21355:13;21350:2;21342:6;21338:15;21331:38;21146:230;:::o;21382:366::-;21524:3;21545:67;21609:2;21604:3;21545:67;:::i;:::-;21538:74;;21621:93;21710:3;21621:93;:::i;:::-;21739:2;21734:3;21730:12;21723:19;;21382:366;;;:::o;21754:419::-;21920:4;21958:2;21947:9;21943:18;21935:26;;22007:9;22001:4;21997:20;21993:1;21982:9;21978:17;21971:47;22035:131;22161:4;22035:131;:::i;:::-;22027:139;;21754:419;;;:::o;22179:234::-;22319:34;22315:1;22307:6;22303:14;22296:58;22388:17;22383:2;22375:6;22371:15;22364:42;22179:234;:::o;22419:366::-;22561:3;22582:67;22646:2;22641:3;22582:67;:::i;:::-;22575:74;;22658:93;22747:3;22658:93;:::i;:::-;22776:2;22771:3;22767:12;22760:19;;22419:366;;;:::o;22791:419::-;22957:4;22995:2;22984:9;22980:18;22972:26;;23044:9;23038:4;23034:20;23030:1;23019:9;23015:17;23008:47;23072:131;23198:4;23072:131;:::i;:::-;23064:139;;22791:419;;;:::o;23216:141::-;23265:4;23288:3;23280:11;;23311:3;23308:1;23301:14;23345:4;23342:1;23332:18;23324:26;;23216:141;;;:::o;23363:93::-;23400:6;23447:2;23442;23435:5;23431:14;23427:23;23417:33;;23363:93;;;:::o;23462:107::-;23506:8;23556:5;23550:4;23546:16;23525:37;;23462:107;;;;:::o;23575:393::-;23644:6;23694:1;23682:10;23678:18;23717:97;23747:66;23736:9;23717:97;:::i;:::-;23835:39;23865:8;23854:9;23835:39;:::i;:::-;23823:51;;23907:4;23903:9;23896:5;23892:21;23883:30;;23956:4;23946:8;23942:19;23935:5;23932:30;23922:40;;23651:317;;23575:393;;;;;:::o;23974:60::-;24002:3;24023:5;24016:12;;23974:60;;;:::o;24040:142::-;24090:9;24123:53;24141:34;24150:24;24168:5;24150:24;:::i;:::-;24141:34;:::i;:::-;24123:53;:::i;:::-;24110:66;;24040:142;;;:::o;24188:75::-;24231:3;24252:5;24245:12;;24188:75;;;:::o;24269:269::-;24379:39;24410:7;24379:39;:::i;:::-;24440:91;24489:41;24513:16;24489:41;:::i;:::-;24481:6;24474:4;24468:11;24440:91;:::i;:::-;24434:4;24427:105;24345:193;24269:269;;;:::o;24544:73::-;24589:3;24544:73;:::o;24623:189::-;24700:32;;:::i;:::-;24741:65;24799:6;24791;24785:4;24741:65;:::i;:::-;24676:136;24623:189;;:::o;24818:186::-;24878:120;24895:3;24888:5;24885:14;24878:120;;;24949:39;24986:1;24979:5;24949:39;:::i;:::-;24922:1;24915:5;24911:13;24902:22;;24878:120;;;24818:186;;:::o;25010:543::-;25111:2;25106:3;25103:11;25100:446;;;25145:38;25177:5;25145:38;:::i;:::-;25229:29;25247:10;25229:29;:::i;:::-;25219:8;25215:44;25412:2;25400:10;25397:18;25394:49;;;25433:8;25418:23;;25394:49;25456:80;25512:22;25530:3;25512:22;:::i;:::-;25502:8;25498:37;25485:11;25456:80;:::i;:::-;25115:431;;25100:446;25010:543;;;:::o;25559:117::-;25613:8;25663:5;25657:4;25653:16;25632:37;;25559:117;;;;:::o;25682:169::-;25726:6;25759:51;25807:1;25803:6;25795:5;25792:1;25788:13;25759:51;:::i;:::-;25755:56;25840:4;25834;25830:15;25820:25;;25733:118;25682:169;;;;:::o;25856:295::-;25932:4;26078:29;26103:3;26097:4;26078:29;:::i;:::-;26070:37;;26140:3;26137:1;26133:11;26127:4;26124:21;26116:29;;25856:295;;;;:::o;26156:1395::-;26273:37;26306:3;26273:37;:::i;:::-;26375:18;26367:6;26364:30;26361:56;;;26397:18;;:::i;:::-;26361:56;26441:38;26473:4;26467:11;26441:38;:::i;:::-;26526:67;26586:6;26578;26572:4;26526:67;:::i;:::-;26620:1;26644:4;26631:17;;26676:2;26668:6;26665:14;26693:1;26688:618;;;;27350:1;27367:6;27364:77;;;27416:9;27411:3;27407:19;27401:26;27392:35;;27364:77;27467:67;27527:6;27520:5;27467:67;:::i;:::-;27461:4;27454:81;27323:222;26658:887;;26688:618;26740:4;26736:9;26728:6;26724:22;26774:37;26806:4;26774:37;:::i;:::-;26833:1;26847:208;26861:7;26858:1;26855:14;26847:208;;;26940:9;26935:3;26931:19;26925:26;26917:6;26910:42;26991:1;26983:6;26979:14;26969:24;;27038:2;27027:9;27023:18;27010:31;;26884:4;26881:1;26877:12;26872:17;;26847:208;;;27083:6;27074:7;27071:19;27068:179;;;27141:9;27136:3;27132:19;27126:26;27184:48;27226:4;27218:6;27214:17;27203:9;27184:48;:::i;:::-;27176:6;27169:64;27091:156;27068:179;27293:1;27289;27281:6;27277:14;27273:22;27267:4;27260:36;26695:611;;;26658:887;;26248:1303;;;26156:1395;;:::o;27557:148::-;27659:11;27696:3;27681:18;;27557:148;;;;:::o;27711:390::-;27817:3;27845:39;27878:5;27845:39;:::i;:::-;27900:89;27982:6;27977:3;27900:89;:::i;:::-;27893:96;;27998:65;28056:6;28051:3;28044:4;28037:5;28033:16;27998:65;:::i;:::-;28088:6;28083:3;28079:16;28072:23;;27821:280;27711:390;;;;:::o;28107:275::-;28239:3;28261:95;28352:3;28343:6;28261:95;:::i;:::-;28254:102;;28373:3;28366:10;;28107:275;;;;:::o;28388:231::-;28528:34;28524:1;28516:6;28512:14;28505:58;28597:14;28592:2;28584:6;28580:15;28573:39;28388:231;:::o;28625:366::-;28767:3;28788:67;28852:2;28847:3;28788:67;:::i;:::-;28781:74;;28864:93;28953:3;28864:93;:::i;:::-;28982:2;28977:3;28973:12;28966:19;;28625:366;;;:::o;28997:419::-;29163:4;29201:2;29190:9;29186:18;29178:26;;29250:9;29244:4;29240:20;29236:1;29225:9;29221:17;29214:47;29278:131;29404:4;29278:131;:::i;:::-;29270:139;;28997:419;;;:::o;29422:180::-;29470:77;29467:1;29460:88;29567:4;29564:1;29557:15;29591:4;29588:1;29581:15;29608:174;29748:26;29744:1;29736:6;29732:14;29725:50;29608:174;:::o;29788:366::-;29930:3;29951:67;30015:2;30010:3;29951:67;:::i;:::-;29944:74;;30027:93;30116:3;30027:93;:::i;:::-;30145:2;30140:3;30136:12;30129:19;;29788:366;;;:::o;30160:419::-;30326:4;30364:2;30353:9;30349:18;30341:26;;30413:9;30407:4;30403:20;30399:1;30388:9;30384:17;30377:47;30441:131;30567:4;30441:131;:::i;:::-;30433:139;;30160:419;;;:::o;30585:228::-;30725:34;30721:1;30713:6;30709:14;30702:58;30794:11;30789:2;30781:6;30777:15;30770:36;30585:228;:::o;30819:366::-;30961:3;30982:67;31046:2;31041:3;30982:67;:::i;:::-;30975:74;;31058:93;31147:3;31058:93;:::i;:::-;31176:2;31171:3;31167:12;31160:19;;30819:366;;;:::o;31191:419::-;31357:4;31395:2;31384:9;31380:18;31372:26;;31444:9;31438:4;31434:20;31430:1;31419:9;31415:17;31408:47;31472:131;31598:4;31472:131;:::i;:::-;31464:139;;31191:419;;;:::o;31616:233::-;31756:34;31752:1;31744:6;31740:14;31733:58;31825:16;31820:2;31812:6;31808:15;31801:41;31616:233;:::o;31855:366::-;31997:3;32018:67;32082:2;32077:3;32018:67;:::i;:::-;32011:74;;32094:93;32183:3;32094:93;:::i;:::-;32212:2;32207:3;32203:12;32196:19;;31855:366;;;:::o;32227:419::-;32393:4;32431:2;32420:9;32416:18;32408:26;;32480:9;32474:4;32470:20;32466:1;32455:9;32451:17;32444:47;32508:131;32634:4;32508:131;:::i;:::-;32500:139;;32227:419;;;:::o;32652:180::-;32700:77;32697:1;32690:88;32797:4;32794:1;32787:15;32821:4;32818:1;32811:15;32838:233;32877:3;32900:24;32918:5;32900:24;:::i;:::-;32891:33;;32946:66;32939:5;32936:77;32933:103;;33016:18;;:::i;:::-;32933:103;33063:1;33056:5;33052:13;33045:20;;32838:233;;;:::o;33077:435::-;33257:3;33279:95;33370:3;33361:6;33279:95;:::i;:::-;33272:102;;33391:95;33482:3;33473:6;33391:95;:::i;:::-;33384:102;;33503:3;33496:10;;33077:435;;;;;:::o;33518:224::-;33658:34;33654:1;33646:6;33642:14;33635:58;33727:7;33722:2;33714:6;33710:15;33703:32;33518:224;:::o;33748:366::-;33890:3;33911:67;33975:2;33970:3;33911:67;:::i;:::-;33904:74;;33987:93;34076:3;33987:93;:::i;:::-;34105:2;34100:3;34096:12;34089:19;;33748:366;;;:::o;34120:419::-;34286:4;34324:2;34313:9;34309:18;34301:26;;34373:9;34367:4;34363:20;34359:1;34348:9;34344:17;34337:47;34401:131;34527:4;34401:131;:::i;:::-;34393:139;;34120:419;;;:::o;34545:223::-;34685:34;34681:1;34673:6;34669:14;34662:58;34754:6;34749:2;34741:6;34737:15;34730:31;34545:223;:::o;34774:366::-;34916:3;34937:67;35001:2;34996:3;34937:67;:::i;:::-;34930:74;;35013:93;35102:3;35013:93;:::i;:::-;35131:2;35126:3;35122:12;35115:19;;34774:366;;;:::o;35146:419::-;35312:4;35350:2;35339:9;35335:18;35327:26;;35399:9;35393:4;35389:20;35385:1;35374:9;35370:17;35363:47;35427:131;35553:4;35427:131;:::i;:::-;35419:139;;35146:419;;;:::o;35571:194::-;35611:4;35631:20;35649:1;35631:20;:::i;:::-;35626:25;;35665:20;35683:1;35665:20;:::i;:::-;35660:25;;35709:1;35706;35702:9;35694:17;;35733:1;35727:4;35724:11;35721:37;;;35738:18;;:::i;:::-;35721:37;35571:194;;;;:::o;35771:191::-;35811:3;35830:20;35848:1;35830:20;:::i;:::-;35825:25;;35864:20;35882:1;35864:20;:::i;:::-;35859:25;;35907:1;35904;35900:9;35893:16;;35928:3;35925:1;35922:10;35919:36;;;35935:18;;:::i;:::-;35919:36;35771:191;;;;:::o;35968:175::-;36108:27;36104:1;36096:6;36092:14;36085:51;35968:175;:::o;36149:366::-;36291:3;36312:67;36376:2;36371:3;36312:67;:::i;:::-;36305:74;;36388:93;36477:3;36388:93;:::i;:::-;36506:2;36501:3;36497:12;36490:19;;36149:366;;;:::o;36521:419::-;36687:4;36725:2;36714:9;36710:18;36702:26;;36774:9;36768:4;36764:20;36760:1;36749:9;36745:17;36738:47;36802:131;36928:4;36802:131;:::i;:::-;36794:139;;36521:419;;;:::o;36946:237::-;37086:34;37082:1;37074:6;37070:14;37063:58;37155:20;37150:2;37142:6;37138:15;37131:45;36946:237;:::o;37189:366::-;37331:3;37352:67;37416:2;37411:3;37352:67;:::i;:::-;37345:74;;37428:93;37517:3;37428:93;:::i;:::-;37546:2;37541:3;37537:12;37530:19;;37189:366;;;:::o;37561:419::-;37727:4;37765:2;37754:9;37750:18;37742:26;;37814:9;37808:4;37804:20;37800:1;37789:9;37785:17;37778:47;37842:131;37968:4;37842:131;:::i;:::-;37834:139;;37561:419;;;:::o;37986:180::-;38034:77;38031:1;38024:88;38131:4;38128:1;38121:15;38155:4;38152:1;38145:15;38172:185;38212:1;38229:20;38247:1;38229:20;:::i;:::-;38224:25;;38263:20;38281:1;38263:20;:::i;:::-;38258:25;;38302:1;38292:35;;38307:18;;:::i;:::-;38292:35;38349:1;38346;38342:9;38337:14;;38172:185;;;;:::o;38363:176::-;38395:1;38412:20;38430:1;38412:20;:::i;:::-;38407:25;;38446:20;38464:1;38446:20;:::i;:::-;38441:25;;38485:1;38475:35;;38490:18;;:::i;:::-;38475:35;38531:1;38528;38524:9;38519:14;;38363:176;;;;:::o;38545:173::-;38685:25;38681:1;38673:6;38669:14;38662:49;38545:173;:::o;38724:402::-;38884:3;38905:85;38987:2;38982:3;38905:85;:::i;:::-;38898:92;;38999:93;39088:3;38999:93;:::i;:::-;39117:2;39112:3;39108:12;39101:19;;38724:402;;;:::o;39132:167::-;39272:19;39268:1;39260:6;39256:14;39249:43;39132:167;:::o;39305:402::-;39465:3;39486:85;39568:2;39563:3;39486:85;:::i;:::-;39479:92;;39580:93;39669:3;39580:93;:::i;:::-;39698:2;39693:3;39689:12;39682:19;;39305:402;;;:::o;39713:967::-;40095:3;40117:148;40261:3;40117:148;:::i;:::-;40110:155;;40282:95;40373:3;40364:6;40282:95;:::i;:::-;40275:102;;40394:148;40538:3;40394:148;:::i;:::-;40387:155;;40559:95;40650:3;40641:6;40559:95;:::i;:::-;40552:102;;40671:3;40664:10;;39713:967;;;;;:::o;40686:170::-;40826:22;40822:1;40814:6;40810:14;40803:46;40686:170;:::o;40862:366::-;41004:3;41025:67;41089:2;41084:3;41025:67;:::i;:::-;41018:74;;41101:93;41190:3;41101:93;:::i;:::-;41219:2;41214:3;41210:12;41203:19;;40862:366;;;:::o;41234:419::-;41400:4;41438:2;41427:9;41423:18;41415:26;;41487:9;41481:4;41477:20;41473:1;41462:9;41458:17;41451:47;41515:131;41641:4;41515:131;:::i;:::-;41507:139;;41234:419;;;:::o;41659:166::-;41799:18;41795:1;41787:6;41783:14;41776:42;41659:166;:::o;41831:366::-;41973:3;41994:67;42058:2;42053:3;41994:67;:::i;:::-;41987:74;;42070:93;42159:3;42070:93;:::i;:::-;42188:2;42183:3;42179:12;42172:19;;41831:366;;;:::o;42203:419::-;42369:4;42407:2;42396:9;42392:18;42384:26;;42456:9;42450:4;42446:20;42442:1;42431:9;42427:17;42420:47;42484:131;42610:4;42484:131;:::i;:::-;42476:139;;42203:419;;;:::o;42628:98::-;42679:6;42713:5;42707:12;42697:22;;42628:98;;;:::o;42732:168::-;42815:11;42849:6;42844:3;42837:19;42889:4;42884:3;42880:14;42865:29;;42732:168;;;;:::o;42906:373::-;42992:3;43020:38;43052:5;43020:38;:::i;:::-;43074:70;43137:6;43132:3;43074:70;:::i;:::-;43067:77;;43153:65;43211:6;43206:3;43199:4;43192:5;43188:16;43153:65;:::i;:::-;43243:29;43265:6;43243:29;:::i;:::-;43238:3;43234:39;43227:46;;42996:283;42906:373;;;;:::o;43285:640::-;43480:4;43518:3;43507:9;43503:19;43495:27;;43532:71;43600:1;43589:9;43585:17;43576:6;43532:71;:::i;:::-;43613:72;43681:2;43670:9;43666:18;43657:6;43613:72;:::i;:::-;43695;43763:2;43752:9;43748:18;43739:6;43695:72;:::i;:::-;43814:9;43808:4;43804:20;43799:2;43788:9;43784:18;43777:48;43842:76;43913:4;43904:6;43842:76;:::i;:::-;43834:84;;43285:640;;;;;;;:::o;43931:141::-;43987:5;44018:6;44012:13;44003:22;;44034:32;44060:5;44034:32;:::i;:::-;43931:141;;;;:::o;44078:349::-;44147:6;44196:2;44184:9;44175:7;44171:23;44167:32;44164:119;;;44202:79;;:::i;:::-;44164:119;44322:1;44347:63;44402:7;44393:6;44382:9;44378:22;44347:63;:::i;:::-;44337:73;;44293:127;44078:349;;;;:::o;44433:348::-;44473:7;44496:20;44514:1;44496:20;:::i;:::-;44491:25;;44530:20;44548:1;44530:20;:::i;:::-;44525:25;;44718:1;44650:66;44646:74;44643:1;44640:81;44635:1;44628:9;44621:17;44617:105;44614:131;;;44725:18;;:::i;:::-;44614:131;44773:1;44770;44766:9;44755:20;;44433:348;;;;:::o;44787:171::-;44826:3;44849:24;44867:5;44849:24;:::i;:::-;44840:33;;44895:4;44888:5;44885:15;44882:41;;44903:18;;:::i;:::-;44882:41;44950:1;44943:5;44939:13;44932:20;;44787:171;;;:::o;44964:182::-;45104:34;45100:1;45092:6;45088:14;45081:58;44964:182;:::o;45152:366::-;45294:3;45315:67;45379:2;45374:3;45315:67;:::i;:::-;45308:74;;45391:93;45480:3;45391:93;:::i;:::-;45509:2;45504:3;45500:12;45493:19;;45152:366;;;:::o;45524:419::-;45690:4;45728:2;45717:9;45713:18;45705:26;;45777:9;45771:4;45767:20;45763:1;45752:9;45748:17;45741:47;45805:131;45931:4;45805:131;:::i;:::-;45797:139;;45524:419;;;:::o;45949:182::-;46089:34;46085:1;46077:6;46073:14;46066:58;45949:182;:::o;46137:366::-;46279:3;46300:67;46364:2;46359:3;46300:67;:::i;:::-;46293:74;;46376:93;46465:3;46376:93;:::i;:::-;46494:2;46489:3;46485:12;46478:19;;46137:366;;;:::o;46509:419::-;46675:4;46713:2;46702:9;46698:18;46690:26;;46762:9;46756:4;46752:20;46748:1;46737:9;46733:17;46726:47;46790:131;46916:4;46790:131;:::i;:::-;46782:139;;46509:419;;;:::o;46934:178::-;47074:30;47070:1;47062:6;47058:14;47051:54;46934:178;:::o;47118:366::-;47260:3;47281:67;47345:2;47340:3;47281:67;:::i;:::-;47274:74;;47357:93;47446:3;47357:93;:::i;:::-;47475:2;47470:3;47466:12;47459:19;;47118:366;;;:::o;47490:419::-;47656:4;47694:2;47683:9;47679:18;47671:26;;47743:9;47737:4;47733:20;47729:1;47718:9;47714:17;47707:47;47771:131;47897:4;47771:131;:::i;:::-;47763:139;;47490:419;;;:::o;47915:180::-;47963:77;47960:1;47953:88;48060:4;48057:1;48050:15;48084:4;48081:1;48074:15
Swarm Source
ipfs://2b177cdfb77c112eff05eb94c2485d7f3e64af65e8419562e9b859c0960256ce
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in POL
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.