Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
1020
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DangerDonuts
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-20 */ // File: @openzeppelin/contracts/utils/Context.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/DangerDonuts.sol pragma solidity ^0.8.7; contract DangerDonuts is Ownable, ERC721A, ReentrancyGuard { bool public mPublicSaleIsActive = false; uint256 public mMaxTokenSupply = 6943; string public mBaseURI = ""; // Pricing uint256[5] public mAllowedQuantities = [1, 2, 6, 12, 13]; mapping(uint256 => uint256) public mPriceMap; constructor() ERC721A("DangerDonuts", "DD") { mPriceMap[1] = 0.0169 ether; mPriceMap[2] = 0.0169 ether; mPriceMap[6] = 0.05 ether; mPriceMap[12] = 0.09 ether; mPriceMap[13] = 0.0969 ether; } /// Functions for minting function mint(uint256 quantity) external payable { require(mPublicSaleIsActive, "Public sale must be active to mint"); require(quantity + totalSupply() <= mMaxTokenSupply, "Purchase would exceed max supply"); bool isQuantityMapped = false; for(uint8 i = 0; i < mAllowedQuantities.length; i++) { if(quantity == mAllowedQuantities[i]){ isQuantityMapped = true; break; } } require(isQuantityMapped, "Quantity not on the menu"); require(msg.value >= mPriceMap[quantity], "Ether value sent was not enough"); _safeMint(msg.sender, quantity); } function reserveMint(address[] calldata recipients, uint256[] calldata quantities) external onlyOwner nonReentrant { require(recipients.length == quantities.length, "Array lengths must match"); // Ensure total quantities doesn't exceed supply uint256 totalQuantity = 0; for(uint256 i = 0; i < quantities.length; i++){ totalQuantity += quantities[i]; } require(totalQuantity + totalSupply() <= mMaxTokenSupply, "Reserve mint would exceed max supply"); // Mint for each address for (uint256 i = 0; i < recipients.length; i++) { _safeMint(recipients[i], quantities[i]); } } /// Functions for managing token metadata function setBaseURI(string calldata baseURI) external onlyOwner { mBaseURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return mBaseURI; } /// Turns sale state on/off - ONLY OWNER function flipPublicSaleState() external onlyOwner { mPublicSaleIsActive = !mPublicSaleIsActive; } /// Ether withdrawal - ONLY OWNER function forceWithdraw(uint256 amount, address payable to) external onlyOwner nonReentrant { (bool success, ) = payable(to).call{value: amount}(""); require(success, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"name":"forceWithdraw","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mAllowedQuantities","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mMaxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mPriceMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mPublicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"reserveMint","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60006101000a81548160ff021916908315150217905550611b1f600b5560405180602001604052806000815250600c90805190602001906200004c92919062000300565b506040518060a00160405280600160ff168152602001600260ff168152602001600660ff168152602001600c60ff168152602001600d60ff16815250600d9060056200009a92919062000391565b50348015620000a857600080fd5b506040518060400160405280600c81526020017f44616e676572446f6e75747300000000000000000000000000000000000000008152506040518060400160405280600281526020017f444400000000000000000000000000000000000000000000000000000000000081525062000135620001296200022f60201b60201c565b6200023760201b60201c565b81600390805190602001906200014d92919062000300565b5080600490805190602001906200016692919062000300565b5062000177620002fb60201b60201c565b60018190555050506001600981905550663c0a75e0b44000601260006001815260200190815260200160002081905550663c0a75e0b4400060126000600281526020019081526020016000208190555066b1a2bc2ec5000060126000600681526020019081526020016000208190555067013fbe85edc9000060126000600c81526020019081526020016000208190555067015842095ebc400060126000600d8152602001908152602001600020819055506200045f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200030e90620003fa565b90600052602060002090601f0160209004810192826200033257600085556200037e565b82601f106200034d57805160ff19168380011785556200037e565b828001600101855582156200037e579182015b828111156200037d57825182559160200191906001019062000360565b5b5090506200038d9190620003db565b5090565b8260058101928215620003c8579160200282015b82811115620003c7578251829060ff16905591602001919060010190620003a5565b5b509050620003d79190620003db565b5090565b5b80821115620003f6576000816000905550600101620003dc565b5090565b600060028204905060018216806200041357607f821691505b602082108114156200042a576200042962000430565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613a57806200046f6000396000f3fe60806040526004361061019c5760003560e01c8063715018a6116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610591578063e985e9c5146105ce578063f2fde38b1461060b578063faabbb06146106345761019c565b8063a22cb46514610514578063b88d4fde1461053d578063c0a58fa9146105665761019c565b806395d89b41116100c657806395d89b411461048d578063963565e1146104b8578063a0712d68146104e1578063a10866ef146104fd5761019c565b8063715018a6146104205780638734c6ea146104375780638da5cb5b146104625761019c565b806323b872dd1161015957806355f804b31161013357806355f804b3146103405780636352211e146103695780636ebb7f20146103a657806370a08231146103e35761019c565b806323b872dd146102c557806342842e0e146102ee5780634ef020b2146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780632149b8ed1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612dad565b610671565b6040516101d591906131b2565b60405180910390f35b3480156101ea57600080fd5b506101f3610753565b60405161020091906131cd565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612e54565b6107e5565b60405161023d919061314b565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612cec565b610861565b005b34801561027b57600080fd5b5061028461096c565b604051610291919061332f565b60405180910390f35b3480156102a657600080fd5b506102af610983565b6040516102bc91906131cd565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612bd6565b610a11565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612bd6565b610a21565b005b34801561032357600080fd5b5061033e60048036038101906103399190612e81565b610a41565b005b34801561034c57600080fd5b5061036760048036038101906103629190612e07565b610bc4565b005b34801561037557600080fd5b50610390600480360381019061038b9190612e54565b610c56565b60405161039d919061314b565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190612e54565b610c6c565b6040516103da919061332f565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190612b69565b610c84565b604051610417919061332f565b60405180910390f35b34801561042c57600080fd5b50610435610d54565b005b34801561044357600080fd5b5061044c610ddc565b60405161045991906131b2565b60405180910390f35b34801561046e57600080fd5b50610477610def565b604051610484919061314b565b60405180910390f35b34801561049957600080fd5b506104a2610e18565b6040516104af91906131cd565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190612d2c565b610eaa565b005b6104fb60048036038101906104f69190612e54565b6110d8565b005b34801561050957600080fd5b5061051261126f565b005b34801561052057600080fd5b5061053b60048036038101906105369190612cac565b611317565b005b34801561054957600080fd5b50610564600480360381019061055f9190612c29565b61148f565b005b34801561057257600080fd5b5061057b61150b565b604051610588919061332f565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190612e54565b611511565b6040516105c591906131cd565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190612b96565b6115b0565b60405161060291906131b2565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d9190612b69565b611644565b005b34801561064057600080fd5b5061065b60048036038101906106569190612e54565b61173c565b604051610668919061332f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061074c575061074b82611757565b5b9050919050565b6060600380546107629061357e565b80601f016020809104026020016040519081016040528092919081815260200182805461078e9061357e565b80156107db5780601f106107b0576101008083540402835291602001916107db565b820191906000526020600020905b8154815290600101906020018083116107be57829003601f168201915b5050505050905090565b60006107f0826117c1565b610826576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086c82610c56565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f361180f565b73ffffffffffffffffffffffffffffffffffffffff161415801561092557506109238161091e61180f565b6115b0565b155b1561095c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610967838383611817565b505050565b60006109766118c9565b6002546001540303905090565b600c80546109909061357e565b80601f01602080910402602001604051908101604052809291908181526020018280546109bc9061357e565b8015610a095780601f106109de57610100808354040283529160200191610a09565b820191906000526020600020905b8154815290600101906020018083116109ec57829003601f168201915b505050505081565b610a1c8383836118ce565b505050565b610a3c8383836040518060200160405280600081525061148f565b505050565b610a4961180f565b73ffffffffffffffffffffffffffffffffffffffff16610a67610def565b73ffffffffffffffffffffffffffffffffffffffff1614610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab49061328f565b60405180910390fd5b60026009541415610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa9061330f565b60405180910390fd5b600260098190555060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b3190613136565b60006040518083038185875af1925050503d8060008114610b6e576040519150601f19603f3d011682016040523d82523d6000602084013e610b73565b606091505b5050905080610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906132ef565b60405180910390fd5b5060016009819055505050565b610bcc61180f565b73ffffffffffffffffffffffffffffffffffffffff16610bea610def565b73ffffffffffffffffffffffffffffffffffffffff1614610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c379061328f565b60405180910390fd5b8181600c9190610c51929190612893565b505050565b6000610c6182611dbf565b600001519050919050565b60126020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d5c61180f565b73ffffffffffffffffffffffffffffffffffffffff16610d7a610def565b73ffffffffffffffffffffffffffffffffffffffff1614610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc79061328f565b60405180910390fd5b610dda600061204e565b565b600a60009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e279061357e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e539061357e565b8015610ea05780601f10610e7557610100808354040283529160200191610ea0565b820191906000526020600020905b815481529060010190602001808311610e8357829003601f168201915b5050505050905090565b610eb261180f565b73ffffffffffffffffffffffffffffffffffffffff16610ed0610def565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d9061328f565b60405180910390fd5b60026009541415610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f639061330f565b60405180910390fd5b6002600981905550818190508484905014610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb3906132cf565b60405180910390fd5b6000805b8383905081101561100557838382818110610fde57610fdd613712565b5b9050602002013582610ff091906133ee565b91508080610ffd906135e1565b915050610fc0565b50600b5461101161096c565b8261101c91906133ee565b111561105d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110549061326f565b60405180910390fd5b60005b858590508110156110c8576110b586868381811061108157611080613712565b5b90506020020160208101906110969190612b69565b8585848181106110a9576110a8613712565b5b90506020020135612112565b80806110c0906135e1565b915050611060565b5050600160098190555050505050565b600a60009054906101000a900460ff16611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e906131ef565b60405180910390fd5b600b5461113261096c565b8261113d91906133ee565b111561117e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111759061324f565b60405180910390fd5b6000805b60058160ff1610156111ca57600d8160ff16600581106111a5576111a4613712565b5b01548314156111b757600191506111ca565b80806111c29061362a565b915050611182565b508061120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906132af565b60405180910390fd5b6012600083815260200190815260200160002054341015611261576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112589061322f565b60405180910390fd5b61126b3383612112565b5050565b61127761180f565b73ffffffffffffffffffffffffffffffffffffffff16611295610def565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e29061328f565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b61131f61180f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611384576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061139161180f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661143e61180f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161148391906131b2565b60405180910390a35050565b61149a8484846118ce565b6114b98373ffffffffffffffffffffffffffffffffffffffff16612130565b80156114ce57506114cc84848484612153565b155b15611505576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600b5481565b606061151c826117c1565b611552576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061155c6122b3565b905060008151141561157d57604051806020016040528060008152506115a8565b8061158784612345565b604051602001611598929190613112565b6040516020818303038152906040525b915050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61164c61180f565b73ffffffffffffffffffffffffffffffffffffffff1661166a610def565b73ffffffffffffffffffffffffffffffffffffffff16146116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b79061328f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117279061320f565b60405180910390fd5b6117398161204e565b50565b600d816005811061174c57600080fd5b016000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816117cc6118c9565b111580156117db575060015482105b8015611808575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006118d982611dbf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661190061180f565b73ffffffffffffffffffffffffffffffffffffffff1614806119335750611932826000015161192d61180f565b6115b0565b5b80611978575061194161180f565b73ffffffffffffffffffffffffffffffffffffffff16611960846107e5565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119b1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a1a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a81576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a8e85858560016124a6565b611a9e6000848460000151611817565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d4f57600154811015611d4e5782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611db885858560016124ac565b5050505050565b611dc7612919565b600082905080611dd56118c9565b11158015611de4575060015481105b15612017576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161201557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ef9578092505050612049565b5b60011561201457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461200f578092505050612049565b611efa565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61212c8282604051806020016040528060008152506124b2565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261217961180f565b8786866040518563ffffffff1660e01b815260040161219b9493929190613166565b602060405180830381600087803b1580156121b557600080fd5b505af19250505080156121e657506040513d601f19601f820116820180604052508101906121e39190612dda565b60015b612260573d8060008114612216576040519150601f19603f3d011682016040523d82523d6000602084013e61221b565b606091505b50600081511415612258576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546122c29061357e565b80601f01602080910402602001604051908101604052809291908181526020018280546122ee9061357e565b801561233b5780601f106123105761010080835404028352916020019161233b565b820191906000526020600020905b81548152906001019060200180831161231e57829003601f168201915b5050505050905090565b6060600082141561238d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a1565b600082905060005b600082146123bf5780806123a8906135e1565b915050600a826123b89190613444565b9150612395565b60008167ffffffffffffffff8111156123db576123da613741565b5b6040519080825280601f01601f19166020018201604052801561240d5781602001600182028036833780820191505090505b5090505b6000851461249a576001826124269190613475565b9150600a856124359190613654565b603061244191906133ee565b60f81b81838151811061245757612456613712565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124939190613444565b9450612411565b8093505050505b919050565b50505050565b50505050565b6124bf83838360016124c4565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612532576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561256d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61257a60008683876124a6565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561274457506127438773ffffffffffffffffffffffffffffffffffffffff16612130565b5b1561280a575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b96000888480600101955088612153565b6127ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561274a57826001541461280557600080fd5b612876565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561280b575b81600181905550505061288c60008683876124ac565b5050505050565b82805461289f9061357e565b90600052602060002090601f0160209004810192826128c15760008555612908565b82601f106128da57803560ff1916838001178555612908565b82800160010185558215612908579182015b828111156129075782358255916020019190600101906128ec565b5b509050612915919061295c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561297557600081600090555060010161295d565b5090565b600061298c6129878461336f565b61334a565b9050828152602081018484840111156129a8576129a761377f565b5b6129b384828561353c565b509392505050565b6000813590506129ca816139ae565b92915050565b6000813590506129df816139c5565b92915050565b60008083601f8401126129fb576129fa613775565b5b8235905067ffffffffffffffff811115612a1857612a17613770565b5b602083019150836020820283011115612a3457612a3361377a565b5b9250929050565b60008083601f840112612a5157612a50613775565b5b8235905067ffffffffffffffff811115612a6e57612a6d613770565b5b602083019150836020820283011115612a8a57612a8961377a565b5b9250929050565b600081359050612aa0816139dc565b92915050565b600081359050612ab5816139f3565b92915050565b600081519050612aca816139f3565b92915050565b600082601f830112612ae557612ae4613775565b5b8135612af5848260208601612979565b91505092915050565b60008083601f840112612b1457612b13613775565b5b8235905067ffffffffffffffff811115612b3157612b30613770565b5b602083019150836001820283011115612b4d57612b4c61377a565b5b9250929050565b600081359050612b6381613a0a565b92915050565b600060208284031215612b7f57612b7e613789565b5b6000612b8d848285016129bb565b91505092915050565b60008060408385031215612bad57612bac613789565b5b6000612bbb858286016129bb565b9250506020612bcc858286016129bb565b9150509250929050565b600080600060608486031215612bef57612bee613789565b5b6000612bfd868287016129bb565b9350506020612c0e868287016129bb565b9250506040612c1f86828701612b54565b9150509250925092565b60008060008060808587031215612c4357612c42613789565b5b6000612c51878288016129bb565b9450506020612c62878288016129bb565b9350506040612c7387828801612b54565b925050606085013567ffffffffffffffff811115612c9457612c93613784565b5b612ca087828801612ad0565b91505092959194509250565b60008060408385031215612cc357612cc2613789565b5b6000612cd1858286016129bb565b9250506020612ce285828601612a91565b9150509250929050565b60008060408385031215612d0357612d02613789565b5b6000612d11858286016129bb565b9250506020612d2285828601612b54565b9150509250929050565b60008060008060408587031215612d4657612d45613789565b5b600085013567ffffffffffffffff811115612d6457612d63613784565b5b612d70878288016129e5565b9450945050602085013567ffffffffffffffff811115612d9357612d92613784565b5b612d9f87828801612a3b565b925092505092959194509250565b600060208284031215612dc357612dc2613789565b5b6000612dd184828501612aa6565b91505092915050565b600060208284031215612df057612def613789565b5b6000612dfe84828501612abb565b91505092915050565b60008060208385031215612e1e57612e1d613789565b5b600083013567ffffffffffffffff811115612e3c57612e3b613784565b5b612e4885828601612afe565b92509250509250929050565b600060208284031215612e6a57612e69613789565b5b6000612e7884828501612b54565b91505092915050565b60008060408385031215612e9857612e97613789565b5b6000612ea685828601612b54565b9250506020612eb7858286016129d0565b9150509250929050565b612eca816134a9565b82525050565b612ed9816134cd565b82525050565b6000612eea826133a0565b612ef481856133b6565b9350612f0481856020860161354b565b612f0d8161378e565b840191505092915050565b6000612f23826133ab565b612f2d81856133d2565b9350612f3d81856020860161354b565b612f468161378e565b840191505092915050565b6000612f5c826133ab565b612f6681856133e3565b9350612f7681856020860161354b565b80840191505092915050565b6000612f8f6022836133d2565b9150612f9a8261379f565b604082019050919050565b6000612fb26026836133d2565b9150612fbd826137ee565b604082019050919050565b6000612fd5601f836133d2565b9150612fe08261383d565b602082019050919050565b6000612ff86020836133d2565b915061300382613866565b602082019050919050565b600061301b6024836133d2565b91506130268261388f565b604082019050919050565b600061303e6020836133d2565b9150613049826138de565b602082019050919050565b60006130616018836133d2565b915061306c82613907565b602082019050919050565b60006130846018836133d2565b915061308f82613930565b602082019050919050565b60006130a76000836133c7565b91506130b282613959565b600082019050919050565b60006130ca6010836133d2565b91506130d58261395c565b602082019050919050565b60006130ed601f836133d2565b91506130f882613985565b602082019050919050565b61310c81613525565b82525050565b600061311e8285612f51565b915061312a8284612f51565b91508190509392505050565b60006131418261309a565b9150819050919050565b60006020820190506131606000830184612ec1565b92915050565b600060808201905061317b6000830187612ec1565b6131886020830186612ec1565b6131956040830185613103565b81810360608301526131a78184612edf565b905095945050505050565b60006020820190506131c76000830184612ed0565b92915050565b600060208201905081810360008301526131e78184612f18565b905092915050565b6000602082019050818103600083015261320881612f82565b9050919050565b6000602082019050818103600083015261322881612fa5565b9050919050565b6000602082019050818103600083015261324881612fc8565b9050919050565b6000602082019050818103600083015261326881612feb565b9050919050565b600060208201905081810360008301526132888161300e565b9050919050565b600060208201905081810360008301526132a881613031565b9050919050565b600060208201905081810360008301526132c881613054565b9050919050565b600060208201905081810360008301526132e881613077565b9050919050565b60006020820190508181036000830152613308816130bd565b9050919050565b60006020820190508181036000830152613328816130e0565b9050919050565b60006020820190506133446000830184613103565b92915050565b6000613354613365565b905061336082826135b0565b919050565b6000604051905090565b600067ffffffffffffffff82111561338a57613389613741565b5b6133938261378e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006133f982613525565b915061340483613525565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561343957613438613685565b5b828201905092915050565b600061344f82613525565b915061345a83613525565b92508261346a576134696136b4565b5b828204905092915050565b600061348082613525565b915061348b83613525565b92508282101561349e5761349d613685565b5b828203905092915050565b60006134b482613505565b9050919050565b60006134c682613505565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561356957808201518184015260208101905061354e565b83811115613578576000848401525b50505050565b6000600282049050600182168061359657607f821691505b602082108114156135aa576135a96136e3565b5b50919050565b6135b98261378e565b810181811067ffffffffffffffff821117156135d8576135d7613741565b5b80604052505050565b60006135ec82613525565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561361f5761361e613685565b5b600182019050919050565b60006136358261352f565b915060ff82141561364957613648613685565b5b600182019050919050565b600061365f82613525565b915061366a83613525565b92508261367a576136796136b4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e7420776173206e6f7420656e6f75676800600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f52657365727665206d696e7420776f756c6420657863656564206d617820737560008201527f70706c7900000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206e6f74206f6e20746865206d656e750000000000000000600082015250565b7f4172726179206c656e67746873206d757374206d617463680000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6139b7816134a9565b81146139c257600080fd5b50565b6139ce816134bb565b81146139d957600080fd5b50565b6139e5816134cd565b81146139f057600080fd5b50565b6139fc816134d9565b8114613a0757600080fd5b50565b613a1381613525565b8114613a1e57600080fd5b5056fea2646970667358221220c0bea9437a7c8d44c405aab940581abebf9836be4abb2dc6b9b9551de91f2b1364736f6c63430008070033
Deployed Bytecode
0x60806040526004361061019c5760003560e01c8063715018a6116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610591578063e985e9c5146105ce578063f2fde38b1461060b578063faabbb06146106345761019c565b8063a22cb46514610514578063b88d4fde1461053d578063c0a58fa9146105665761019c565b806395d89b41116100c657806395d89b411461048d578063963565e1146104b8578063a0712d68146104e1578063a10866ef146104fd5761019c565b8063715018a6146104205780638734c6ea146104375780638da5cb5b146104625761019c565b806323b872dd1161015957806355f804b31161013357806355f804b3146103405780636352211e146103695780636ebb7f20146103a657806370a08231146103e35761019c565b806323b872dd146102c557806342842e0e146102ee5780634ef020b2146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780632149b8ed1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612dad565b610671565b6040516101d591906131b2565b60405180910390f35b3480156101ea57600080fd5b506101f3610753565b60405161020091906131cd565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612e54565b6107e5565b60405161023d919061314b565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612cec565b610861565b005b34801561027b57600080fd5b5061028461096c565b604051610291919061332f565b60405180910390f35b3480156102a657600080fd5b506102af610983565b6040516102bc91906131cd565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612bd6565b610a11565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612bd6565b610a21565b005b34801561032357600080fd5b5061033e60048036038101906103399190612e81565b610a41565b005b34801561034c57600080fd5b5061036760048036038101906103629190612e07565b610bc4565b005b34801561037557600080fd5b50610390600480360381019061038b9190612e54565b610c56565b60405161039d919061314b565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c89190612e54565b610c6c565b6040516103da919061332f565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190612b69565b610c84565b604051610417919061332f565b60405180910390f35b34801561042c57600080fd5b50610435610d54565b005b34801561044357600080fd5b5061044c610ddc565b60405161045991906131b2565b60405180910390f35b34801561046e57600080fd5b50610477610def565b604051610484919061314b565b60405180910390f35b34801561049957600080fd5b506104a2610e18565b6040516104af91906131cd565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190612d2c565b610eaa565b005b6104fb60048036038101906104f69190612e54565b6110d8565b005b34801561050957600080fd5b5061051261126f565b005b34801561052057600080fd5b5061053b60048036038101906105369190612cac565b611317565b005b34801561054957600080fd5b50610564600480360381019061055f9190612c29565b61148f565b005b34801561057257600080fd5b5061057b61150b565b604051610588919061332f565b60405180910390f35b34801561059d57600080fd5b506105b860048036038101906105b39190612e54565b611511565b6040516105c591906131cd565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190612b96565b6115b0565b60405161060291906131b2565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d9190612b69565b611644565b005b34801561064057600080fd5b5061065b60048036038101906106569190612e54565b61173c565b604051610668919061332f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061074c575061074b82611757565b5b9050919050565b6060600380546107629061357e565b80601f016020809104026020016040519081016040528092919081815260200182805461078e9061357e565b80156107db5780601f106107b0576101008083540402835291602001916107db565b820191906000526020600020905b8154815290600101906020018083116107be57829003601f168201915b5050505050905090565b60006107f0826117c1565b610826576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086c82610c56565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f361180f565b73ffffffffffffffffffffffffffffffffffffffff161415801561092557506109238161091e61180f565b6115b0565b155b1561095c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610967838383611817565b505050565b60006109766118c9565b6002546001540303905090565b600c80546109909061357e565b80601f01602080910402602001604051908101604052809291908181526020018280546109bc9061357e565b8015610a095780601f106109de57610100808354040283529160200191610a09565b820191906000526020600020905b8154815290600101906020018083116109ec57829003601f168201915b505050505081565b610a1c8383836118ce565b505050565b610a3c8383836040518060200160405280600081525061148f565b505050565b610a4961180f565b73ffffffffffffffffffffffffffffffffffffffff16610a67610def565b73ffffffffffffffffffffffffffffffffffffffff1614610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab49061328f565b60405180910390fd5b60026009541415610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa9061330f565b60405180910390fd5b600260098190555060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b3190613136565b60006040518083038185875af1925050503d8060008114610b6e576040519150601f19603f3d011682016040523d82523d6000602084013e610b73565b606091505b5050905080610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906132ef565b60405180910390fd5b5060016009819055505050565b610bcc61180f565b73ffffffffffffffffffffffffffffffffffffffff16610bea610def565b73ffffffffffffffffffffffffffffffffffffffff1614610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c379061328f565b60405180910390fd5b8181600c9190610c51929190612893565b505050565b6000610c6182611dbf565b600001519050919050565b60126020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610d5c61180f565b73ffffffffffffffffffffffffffffffffffffffff16610d7a610def565b73ffffffffffffffffffffffffffffffffffffffff1614610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc79061328f565b60405180910390fd5b610dda600061204e565b565b600a60009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e279061357e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e539061357e565b8015610ea05780601f10610e7557610100808354040283529160200191610ea0565b820191906000526020600020905b815481529060010190602001808311610e8357829003601f168201915b5050505050905090565b610eb261180f565b73ffffffffffffffffffffffffffffffffffffffff16610ed0610def565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d9061328f565b60405180910390fd5b60026009541415610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f639061330f565b60405180910390fd5b6002600981905550818190508484905014610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb3906132cf565b60405180910390fd5b6000805b8383905081101561100557838382818110610fde57610fdd613712565b5b9050602002013582610ff091906133ee565b91508080610ffd906135e1565b915050610fc0565b50600b5461101161096c565b8261101c91906133ee565b111561105d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110549061326f565b60405180910390fd5b60005b858590508110156110c8576110b586868381811061108157611080613712565b5b90506020020160208101906110969190612b69565b8585848181106110a9576110a8613712565b5b90506020020135612112565b80806110c0906135e1565b915050611060565b5050600160098190555050505050565b600a60009054906101000a900460ff16611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e906131ef565b60405180910390fd5b600b5461113261096c565b8261113d91906133ee565b111561117e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111759061324f565b60405180910390fd5b6000805b60058160ff1610156111ca57600d8160ff16600581106111a5576111a4613712565b5b01548314156111b757600191506111ca565b80806111c29061362a565b915050611182565b508061120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906132af565b60405180910390fd5b6012600083815260200190815260200160002054341015611261576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112589061322f565b60405180910390fd5b61126b3383612112565b5050565b61127761180f565b73ffffffffffffffffffffffffffffffffffffffff16611295610def565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e29061328f565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b61131f61180f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611384576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061139161180f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661143e61180f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161148391906131b2565b60405180910390a35050565b61149a8484846118ce565b6114b98373ffffffffffffffffffffffffffffffffffffffff16612130565b80156114ce57506114cc84848484612153565b155b15611505576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600b5481565b606061151c826117c1565b611552576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061155c6122b3565b905060008151141561157d57604051806020016040528060008152506115a8565b8061158784612345565b604051602001611598929190613112565b6040516020818303038152906040525b915050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61164c61180f565b73ffffffffffffffffffffffffffffffffffffffff1661166a610def565b73ffffffffffffffffffffffffffffffffffffffff16146116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b79061328f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117279061320f565b60405180910390fd5b6117398161204e565b50565b600d816005811061174c57600080fd5b016000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816117cc6118c9565b111580156117db575060015482105b8015611808575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006118d982611dbf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661190061180f565b73ffffffffffffffffffffffffffffffffffffffff1614806119335750611932826000015161192d61180f565b6115b0565b5b80611978575061194161180f565b73ffffffffffffffffffffffffffffffffffffffff16611960846107e5565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806119b1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611a1a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a81576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a8e85858560016124a6565b611a9e6000848460000151611817565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d4f57600154811015611d4e5782600001516005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611db885858560016124ac565b5050505050565b611dc7612919565b600082905080611dd56118c9565b11158015611de4575060015481105b15612017576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161201557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ef9578092505050612049565b5b60011561201457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461200f578092505050612049565b611efa565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61212c8282604051806020016040528060008152506124b2565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261217961180f565b8786866040518563ffffffff1660e01b815260040161219b9493929190613166565b602060405180830381600087803b1580156121b557600080fd5b505af19250505080156121e657506040513d601f19601f820116820180604052508101906121e39190612dda565b60015b612260573d8060008114612216576040519150601f19603f3d011682016040523d82523d6000602084013e61221b565b606091505b50600081511415612258576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546122c29061357e565b80601f01602080910402602001604051908101604052809291908181526020018280546122ee9061357e565b801561233b5780601f106123105761010080835404028352916020019161233b565b820191906000526020600020905b81548152906001019060200180831161231e57829003601f168201915b5050505050905090565b6060600082141561238d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a1565b600082905060005b600082146123bf5780806123a8906135e1565b915050600a826123b89190613444565b9150612395565b60008167ffffffffffffffff8111156123db576123da613741565b5b6040519080825280601f01601f19166020018201604052801561240d5781602001600182028036833780820191505090505b5090505b6000851461249a576001826124269190613475565b9150600a856124359190613654565b603061244191906133ee565b60f81b81838151811061245757612456613712565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124939190613444565b9450612411565b8093505050505b919050565b50505050565b50505050565b6124bf83838360016124c4565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612532576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561256d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61257a60008683876124a6565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561274457506127438773ffffffffffffffffffffffffffffffffffffffff16612130565b5b1561280a575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b96000888480600101955088612153565b6127ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561274a57826001541461280557600080fd5b612876565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561280b575b81600181905550505061288c60008683876124ac565b5050505050565b82805461289f9061357e565b90600052602060002090601f0160209004810192826128c15760008555612908565b82601f106128da57803560ff1916838001178555612908565b82800160010185558215612908579182015b828111156129075782358255916020019190600101906128ec565b5b509050612915919061295c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561297557600081600090555060010161295d565b5090565b600061298c6129878461336f565b61334a565b9050828152602081018484840111156129a8576129a761377f565b5b6129b384828561353c565b509392505050565b6000813590506129ca816139ae565b92915050565b6000813590506129df816139c5565b92915050565b60008083601f8401126129fb576129fa613775565b5b8235905067ffffffffffffffff811115612a1857612a17613770565b5b602083019150836020820283011115612a3457612a3361377a565b5b9250929050565b60008083601f840112612a5157612a50613775565b5b8235905067ffffffffffffffff811115612a6e57612a6d613770565b5b602083019150836020820283011115612a8a57612a8961377a565b5b9250929050565b600081359050612aa0816139dc565b92915050565b600081359050612ab5816139f3565b92915050565b600081519050612aca816139f3565b92915050565b600082601f830112612ae557612ae4613775565b5b8135612af5848260208601612979565b91505092915050565b60008083601f840112612b1457612b13613775565b5b8235905067ffffffffffffffff811115612b3157612b30613770565b5b602083019150836001820283011115612b4d57612b4c61377a565b5b9250929050565b600081359050612b6381613a0a565b92915050565b600060208284031215612b7f57612b7e613789565b5b6000612b8d848285016129bb565b91505092915050565b60008060408385031215612bad57612bac613789565b5b6000612bbb858286016129bb565b9250506020612bcc858286016129bb565b9150509250929050565b600080600060608486031215612bef57612bee613789565b5b6000612bfd868287016129bb565b9350506020612c0e868287016129bb565b9250506040612c1f86828701612b54565b9150509250925092565b60008060008060808587031215612c4357612c42613789565b5b6000612c51878288016129bb565b9450506020612c62878288016129bb565b9350506040612c7387828801612b54565b925050606085013567ffffffffffffffff811115612c9457612c93613784565b5b612ca087828801612ad0565b91505092959194509250565b60008060408385031215612cc357612cc2613789565b5b6000612cd1858286016129bb565b9250506020612ce285828601612a91565b9150509250929050565b60008060408385031215612d0357612d02613789565b5b6000612d11858286016129bb565b9250506020612d2285828601612b54565b9150509250929050565b60008060008060408587031215612d4657612d45613789565b5b600085013567ffffffffffffffff811115612d6457612d63613784565b5b612d70878288016129e5565b9450945050602085013567ffffffffffffffff811115612d9357612d92613784565b5b612d9f87828801612a3b565b925092505092959194509250565b600060208284031215612dc357612dc2613789565b5b6000612dd184828501612aa6565b91505092915050565b600060208284031215612df057612def613789565b5b6000612dfe84828501612abb565b91505092915050565b60008060208385031215612e1e57612e1d613789565b5b600083013567ffffffffffffffff811115612e3c57612e3b613784565b5b612e4885828601612afe565b92509250509250929050565b600060208284031215612e6a57612e69613789565b5b6000612e7884828501612b54565b91505092915050565b60008060408385031215612e9857612e97613789565b5b6000612ea685828601612b54565b9250506020612eb7858286016129d0565b9150509250929050565b612eca816134a9565b82525050565b612ed9816134cd565b82525050565b6000612eea826133a0565b612ef481856133b6565b9350612f0481856020860161354b565b612f0d8161378e565b840191505092915050565b6000612f23826133ab565b612f2d81856133d2565b9350612f3d81856020860161354b565b612f468161378e565b840191505092915050565b6000612f5c826133ab565b612f6681856133e3565b9350612f7681856020860161354b565b80840191505092915050565b6000612f8f6022836133d2565b9150612f9a8261379f565b604082019050919050565b6000612fb26026836133d2565b9150612fbd826137ee565b604082019050919050565b6000612fd5601f836133d2565b9150612fe08261383d565b602082019050919050565b6000612ff86020836133d2565b915061300382613866565b602082019050919050565b600061301b6024836133d2565b91506130268261388f565b604082019050919050565b600061303e6020836133d2565b9150613049826138de565b602082019050919050565b60006130616018836133d2565b915061306c82613907565b602082019050919050565b60006130846018836133d2565b915061308f82613930565b602082019050919050565b60006130a76000836133c7565b91506130b282613959565b600082019050919050565b60006130ca6010836133d2565b91506130d58261395c565b602082019050919050565b60006130ed601f836133d2565b91506130f882613985565b602082019050919050565b61310c81613525565b82525050565b600061311e8285612f51565b915061312a8284612f51565b91508190509392505050565b60006131418261309a565b9150819050919050565b60006020820190506131606000830184612ec1565b92915050565b600060808201905061317b6000830187612ec1565b6131886020830186612ec1565b6131956040830185613103565b81810360608301526131a78184612edf565b905095945050505050565b60006020820190506131c76000830184612ed0565b92915050565b600060208201905081810360008301526131e78184612f18565b905092915050565b6000602082019050818103600083015261320881612f82565b9050919050565b6000602082019050818103600083015261322881612fa5565b9050919050565b6000602082019050818103600083015261324881612fc8565b9050919050565b6000602082019050818103600083015261326881612feb565b9050919050565b600060208201905081810360008301526132888161300e565b9050919050565b600060208201905081810360008301526132a881613031565b9050919050565b600060208201905081810360008301526132c881613054565b9050919050565b600060208201905081810360008301526132e881613077565b9050919050565b60006020820190508181036000830152613308816130bd565b9050919050565b60006020820190508181036000830152613328816130e0565b9050919050565b60006020820190506133446000830184613103565b92915050565b6000613354613365565b905061336082826135b0565b919050565b6000604051905090565b600067ffffffffffffffff82111561338a57613389613741565b5b6133938261378e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006133f982613525565b915061340483613525565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561343957613438613685565b5b828201905092915050565b600061344f82613525565b915061345a83613525565b92508261346a576134696136b4565b5b828204905092915050565b600061348082613525565b915061348b83613525565b92508282101561349e5761349d613685565b5b828203905092915050565b60006134b482613505565b9050919050565b60006134c682613505565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561356957808201518184015260208101905061354e565b83811115613578576000848401525b50505050565b6000600282049050600182168061359657607f821691505b602082108114156135aa576135a96136e3565b5b50919050565b6135b98261378e565b810181811067ffffffffffffffff821117156135d8576135d7613741565b5b80604052505050565b60006135ec82613525565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561361f5761361e613685565b5b600182019050919050565b60006136358261352f565b915060ff82141561364957613648613685565b5b600182019050919050565b600061365f82613525565b915061366a83613525565b92508261367a576136796136b4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e7420776173206e6f7420656e6f75676800600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f52657365727665206d696e7420776f756c6420657863656564206d617820737560008201527f70706c7900000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5175616e74697479206e6f74206f6e20746865206d656e750000000000000000600082015250565b7f4172726179206c656e67746873206d757374206d617463680000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6139b7816134a9565b81146139c257600080fd5b50565b6139ce816134bb565b81146139d957600080fd5b50565b6139e5816134cd565b81146139f057600080fd5b50565b6139fc816134d9565b8114613a0757600080fd5b50565b613a1381613525565b8114613a1e57600080fd5b5056fea2646970667358221220c0bea9437a7c8d44c405aab940581abebf9836be4abb2dc6b9b9551de91f2b1364736f6c63430008070033
Deployed Bytecode Sourcemap
48583:2704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31048:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34433:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35936:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35499:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30297:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48745:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36793:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37034:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51073:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50642:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34242:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48860:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31417:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2633:103;;;;;;;;;;;;;:::i;:::-;;48655:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1982:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34602:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49885:702;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49192:685;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50914:112;;;;;;;;;;;;;:::i;:::-;;36212:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37290:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48701:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34777:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36562:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2891:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48797:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31048:305;31150:4;31202:25;31187:40;;;:11;:40;;;;:105;;;;31259:33;31244:48;;;:11;:48;;;;31187:105;:158;;;;31309:36;31333:11;31309:23;:36::i;:::-;31187:158;31167:178;;31048:305;;;:::o;34433:100::-;34487:13;34520:5;34513:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34433:100;:::o;35936:204::-;36004:7;36029:16;36037:7;36029;:16::i;:::-;36024:64;;36054:34;;;;;;;;;;;;;;36024:64;36108:15;:24;36124:7;36108:24;;;;;;;;;;;;;;;;;;;;;36101:31;;35936:204;;;:::o;35499:371::-;35572:13;35588:24;35604:7;35588:15;:24::i;:::-;35572:40;;35633:5;35627:11;;:2;:11;;;35623:48;;;35647:24;;;;;;;;;;;;;;35623:48;35704:5;35688:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;35714:37;35731:5;35738:12;:10;:12::i;:::-;35714:16;:37::i;:::-;35713:38;35688:63;35684:138;;;35775:35;;;;;;;;;;;;;;35684:138;35834:28;35843:2;35847:7;35856:5;35834:8;:28::i;:::-;35561:309;35499:371;;:::o;30297:303::-;30341:7;30566:15;:13;:15::i;:::-;30551:12;;30535:13;;:28;:46;30528:53;;30297:303;:::o;48745:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36793:170::-;36927:28;36937:4;36943:2;36947:7;36927:9;:28::i;:::-;36793:170;;;:::o;37034:185::-;37172:39;37189:4;37195:2;37199:7;37172:39;;;;;;;;;;;;:16;:39::i;:::-;37034:185;;;:::o;51073:211::-;2213:12;:10;:12::i;:::-;2202:23;;:7;:5;:7::i;:::-;:23;;;2194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5262:1:::1;5860:7;;:19;;5852:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5262:1;5993:7;:18;;;;51176:12:::2;51202:2;51194:16;;51218:6;51194:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51175:54;;;51248:7;51240:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51164:120;5218:1:::1;6172:7;:22;;;;51073:211:::0;;:::o;50642:101::-;2213:12;:10;:12::i;:::-;2202:23;;:7;:5;:7::i;:::-;:23;;;2194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50728:7:::1;;50717:8;:18;;;;;;;:::i;:::-;;50642:101:::0;;:::o;34242:124::-;34306:7;34333:20;34345:7;34333:11;:20::i;:::-;:25;;;34326:32;;34242:124;;;:::o;48860:44::-;;;;;;;;;;;;;;;;;:::o;31417:206::-;31481:7;31522:1;31505:19;;:5;:19;;;31501:60;;;31533:28;;;;;;;;;;;;;;31501:60;31587:12;:19;31600:5;31587:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31579:36;;31572:43;;31417:206;;;:::o;2633:103::-;2213:12;:10;:12::i;:::-;2202:23;;:7;:5;:7::i;:::-;:23;;;2194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2698:30:::1;2725:1;2698:18;:30::i;:::-;2633:103::o:0;48655:39::-;;;;;;;;;;;;;:::o;1982:87::-;2028:7;2055:6;;;;;;;;;;;2048:13;;1982:87;:::o;34602:104::-;34658:13;34691:7;34684:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34602:104;:::o;49885:702::-;2213:12;:10;:12::i;:::-;2202:23;;:7;:5;:7::i;:::-;:23;;;2194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5262:1:::1;5860:7;;:19;;5852:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5262:1;5993:7;:18;;;;50040:10:::2;;:17;;50019:10;;:17;;:38;50011:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50165:21;50205:9:::0;50201:103:::2;50224:10;;:17;;50220:1;:21;50201:103;;;50279:10;;50290:1;50279:13;;;;;;;:::i;:::-;;;;;;;;50262:30;;;;;:::i;:::-;;;50243:3;;;;;:::i;:::-;;;;50201:103;;;;50355:15;;50338:13;:11;:13::i;:::-;50322;:29;;;;:::i;:::-;:48;;50314:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50471:9;50466:114;50490:10;;:17;;50486:1;:21;50466:114;;;50529:39;50539:10;;50550:1;50539:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50554:10;;50565:1;50554:13;;;;;;;:::i;:::-;;;;;;;;50529:9;:39::i;:::-;50509:3;;;;;:::i;:::-;;;;50466:114;;;;50000:587;5218:1:::1;6172:7;:22;;;;49885:702:::0;;;;:::o;49192:685::-;49260:19;;;;;;;;;;;49252:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49365:15;;49348:13;:11;:13::i;:::-;49337:8;:24;;;;:::i;:::-;:43;;49329:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;49428:21;49472:7;49468:207;49489:25;49485:1;:29;;;49468:207;;;49560:18;49579:1;49560:21;;;;;;;;;:::i;:::-;;;;49548:8;:33;49545:119;;;49620:4;49601:23;;49643:5;;49545:119;49516:3;;;;;:::i;:::-;;;;49468:207;;;;49693:16;49685:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49770:9;:19;49780:8;49770:19;;;;;;;;;;;;49757:9;:32;;49749:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49838:31;49848:10;49860:8;49838:9;:31::i;:::-;49241:636;49192:685;:::o;50914:112::-;2213:12;:10;:12::i;:::-;2202:23;;:7;:5;:7::i;:::-;:23;;;2194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50999:19:::1;;;;;;;;;;;50998:20;50976:19;;:42;;;;;;;;;;;;;;;;;;50914:112::o:0;36212:279::-;36315:12;:10;:12::i;:::-;36303:24;;:8;:24;;;36299:54;;;36336:17;;;;;;;;;;;;;;36299:54;36411:8;36366:18;:32;36385:12;:10;:12::i;:::-;36366:32;;;;;;;;;;;;;;;:42;36399:8;36366:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36464:8;36435:48;;36450:12;:10;:12::i;:::-;36435:48;;;36474:8;36435:48;;;;;;:::i;:::-;;;;;;;;36212:279;;:::o;37290:369::-;37457:28;37467:4;37473:2;37477:7;37457:9;:28::i;:::-;37500:15;:2;:13;;;:15::i;:::-;:76;;;;;37520:56;37551:4;37557:2;37561:7;37570:5;37520:30;:56::i;:::-;37519:57;37500:76;37496:156;;;37600:40;;;;;;;;;;;;;;37496:156;37290:369;;;;:::o;48701:37::-;;;;:::o;34777:318::-;34850:13;34881:16;34889:7;34881;:16::i;:::-;34876:59;;34906:29;;;;;;;;;;;;;;34876:59;34948:21;34972:10;:8;:10::i;:::-;34948:34;;35025:1;35006:7;35000:21;:26;;:87;;;;;;;;;;;;;;;;;35053:7;35062:18;:7;:16;:18::i;:::-;35036:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35000:87;34993:94;;;34777:318;;;:::o;36562:164::-;36659:4;36683:18;:25;36702:5;36683:25;;;;;;;;;;;;;;;:35;36709:8;36683:35;;;;;;;;;;;;;;;;;;;;;;;;;36676:42;;36562:164;;;;:::o;2891:201::-;2213:12;:10;:12::i;:::-;2202:23;;:7;:5;:7::i;:::-;:23;;;2194:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3000:1:::1;2980:22;;:8;:22;;;;2972:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3056:28;3075:8;3056:18;:28::i;:::-;2891:201:::0;:::o;48797:56::-;;;;;;;;;;;;;;;;;;;;:::o;26396:157::-;26481:4;26520:25;26505:40;;;:11;:40;;;;26498:47;;26396:157;;;:::o;37914:187::-;37971:4;38014:7;37995:15;:13;:15::i;:::-;:26;;:53;;;;;38035:13;;38025:7;:23;37995:53;:98;;;;;38066:11;:20;38078:7;38066:20;;;;;;;;;;;:27;;;;;;;;;;;;38065:28;37995:98;37988:105;;37914:187;;;:::o;710:98::-;763:7;790:10;783:17;;710:98;:::o;45525:196::-;45667:2;45640:15;:24;45656:7;45640:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45705:7;45701:2;45685:28;;45694:5;45685:28;;;;;;;;;;;;45525:196;;;:::o;30021:92::-;30077:7;30021:92;:::o;41027:2112::-;41142:35;41180:20;41192:7;41180:11;:20::i;:::-;41142:58;;41213:22;41255:13;:18;;;41239:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41290:50;41307:13;:18;;;41327:12;:10;:12::i;:::-;41290:16;:50::i;:::-;41239:101;:154;;;;41381:12;:10;:12::i;:::-;41357:36;;:20;41369:7;41357:11;:20::i;:::-;:36;;;41239:154;41213:181;;41412:17;41407:66;;41438:35;;;;;;;;;;;;;;41407:66;41510:4;41488:26;;:13;:18;;;:26;;;41484:67;;41523:28;;;;;;;;;;;;;;41484:67;41580:1;41566:16;;:2;:16;;;41562:52;;;41591:23;;;;;;;;;;;;;;41562:52;41627:43;41649:4;41655:2;41659:7;41668:1;41627:21;:43::i;:::-;41735:49;41752:1;41756:7;41765:13;:18;;;41735:8;:49::i;:::-;42110:1;42080:12;:18;42093:4;42080:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42154:1;42126:12;:16;42139:2;42126:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42200:2;42172:11;:20;42184:7;42172:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42262:15;42217:11;:20;42229:7;42217:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42530:19;42562:1;42552:7;:11;42530:33;;42623:1;42582:43;;:11;:24;42594:11;42582:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42578:445;;;42807:13;;42793:11;:27;42789:219;;;42877:13;:18;;;42845:11;:24;42857:11;42845:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42960:13;:28;;;42918:11;:24;42930:11;42918:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42789:219;42578:445;42055:979;43070:7;43066:2;43051:27;;43060:4;43051:27;;;;;;;;;;;;43089:42;43110:4;43116:2;43120:7;43129:1;43089:20;:42::i;:::-;41131:2008;;41027:2112;;;:::o;33072:1108::-;33133:21;;:::i;:::-;33167:12;33182:7;33167:22;;33250:4;33231:15;:13;:15::i;:::-;:23;;:47;;;;;33265:13;;33258:4;:20;33231:47;33227:886;;;33299:31;33333:11;:17;33345:4;33333:17;;;;;;;;;;;33299:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33374:9;:16;;;33369:729;;33445:1;33419:28;;:9;:14;;;:28;;;33415:101;;33483:9;33476:16;;;;;;33415:101;33818:261;33825:4;33818:261;;;33858:6;;;;;;;;33903:11;:17;33915:4;33903:17;;;;;;;;;;;33891:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33977:1;33951:28;;:9;:14;;;:28;;;33947:109;;34019:9;34012:16;;;;;;33947:109;33818:261;;;33369:729;33280:833;33227:886;34141:31;;;;;;;;;;;;;;33072:1108;;;;:::o;3252:191::-;3326:16;3345:6;;;;;;;;;;;3326:25;;3371:8;3362:6;;:17;;;;;;;;;;;;;;;;;;3426:8;3395:40;;3416:8;3395:40;;;;;;;;;;;;3315:128;3252:191;:::o;38109:104::-;38178:27;38188:2;38192:8;38178:27;;;;;;;;;;;;:9;:27::i;:::-;38109:104;;:::o;16139:326::-;16199:4;16456:1;16434:7;:19;;;:23;16427:30;;16139:326;;;:::o;46213:667::-;46376:4;46413:2;46397:36;;;46434:12;:10;:12::i;:::-;46448:4;46454:7;46463:5;46397:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46393:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46648:1;46631:6;:13;:18;46627:235;;;46677:40;;;;;;;;;;;;;;46627:235;46820:6;46814:13;46805:6;46801:2;46797:15;46790:38;46393:480;46526:45;;;46516:55;;;:6;:55;;;;46509:62;;;46213:667;;;;;;:::o;50751:109::-;50811:13;50844:8;50837:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50751:109;:::o;23774:723::-;23830:13;24060:1;24051:5;:10;24047:53;;;24078:10;;;;;;;;;;;;;;;;;;;;;24047:53;24110:12;24125:5;24110:20;;24141:14;24166:78;24181:1;24173:4;:9;24166:78;;24199:8;;;;;:::i;:::-;;;;24230:2;24222:10;;;;;:::i;:::-;;;24166:78;;;24254:19;24286:6;24276:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24254:39;;24304:154;24320:1;24311:5;:10;24304:154;;24348:1;24338:11;;;;;:::i;:::-;;;24415:2;24407:5;:10;;;;:::i;:::-;24394:2;:24;;;;:::i;:::-;24381:39;;24364:6;24371;24364:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;24444:2;24435:11;;;;;:::i;:::-;;;24304:154;;;24482:6;24468:21;;;;;23774:723;;;;:::o;47528:159::-;;;;;:::o;48346:158::-;;;;;:::o;38576:163::-;38699:32;38705:2;38709:8;38719:5;38726:4;38699:5;:32::i;:::-;38576:163;;;:::o;38998:1775::-;39137:20;39160:13;;39137:36;;39202:1;39188:16;;:2;:16;;;39184:48;;;39213:19;;;;;;;;;;;;;;39184:48;39259:1;39247:8;:13;39243:44;;;39269:18;;;;;;;;;;;;;;39243:44;39300:61;39330:1;39334:2;39338:12;39352:8;39300:21;:61::i;:::-;39673:8;39638:12;:16;39651:2;39638:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39737:8;39697:12;:16;39710:2;39697:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39796:2;39763:11;:25;39775:12;39763:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39863:15;39813:11;:25;39825:12;39813:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;39896:20;39919:12;39896:35;;39946:11;39975:8;39960:12;:23;39946:37;;40004:4;:23;;;;;40012:15;:2;:13;;;:15::i;:::-;40004:23;40000:641;;;40048:314;40104:12;40100:2;40079:38;;40096:1;40079:38;;;;;;;;;;;;40145:69;40184:1;40188:2;40192:14;;;;;;40208:5;40145:30;:69::i;:::-;40140:174;;40250:40;;;;;;;;;;;;;;40140:174;40357:3;40341:12;:19;;40048:314;;40443:12;40426:13;;:29;40422:43;;40457:8;;;40422:43;40000:641;;;40506:120;40562:14;;;;;;40558:2;40537:40;;40554:1;40537:40;;;;;;;;;;;;40621:3;40605:12;:19;;40506:120;;40000:641;40671:12;40655:13;:28;;;;39613:1082;;40705:60;40734:1;40738:2;40742:12;40756:8;40705:20;:60::i;:::-;39126:1647;38998:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:155::-;622:5;660:6;647:20;638:29;;676:41;711:5;676:41;:::i;:::-;568:155;;;;:::o;746:568::-;819:8;829:6;879:3;872:4;864:6;860:17;856:27;846:122;;887:79;;:::i;:::-;846:122;1000:6;987:20;977:30;;1030:18;1022:6;1019:30;1016:117;;;1052:79;;:::i;:::-;1016:117;1166:4;1158:6;1154:17;1142:29;;1220:3;1212:4;1204:6;1200:17;1190:8;1186:32;1183:41;1180:128;;;1227:79;;:::i;:::-;1180:128;746:568;;;;;:::o;1337:::-;1410:8;1420:6;1470:3;1463:4;1455:6;1451:17;1447:27;1437:122;;1478:79;;:::i;:::-;1437:122;1591:6;1578:20;1568:30;;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1757:4;1749:6;1745:17;1733:29;;1811:3;1803:4;1795:6;1791:17;1781:8;1777:32;1774:41;1771:128;;;1818:79;;:::i;:::-;1771:128;1337:568;;;;;:::o;1911:133::-;1954:5;1992:6;1979:20;1970:29;;2008:30;2032:5;2008:30;:::i;:::-;1911:133;;;;:::o;2050:137::-;2095:5;2133:6;2120:20;2111:29;;2149:32;2175:5;2149:32;:::i;:::-;2050:137;;;;:::o;2193:141::-;2249:5;2280:6;2274:13;2265:22;;2296:32;2322:5;2296:32;:::i;:::-;2193:141;;;;:::o;2353:338::-;2408:5;2457:3;2450:4;2442:6;2438:17;2434:27;2424:122;;2465:79;;:::i;:::-;2424:122;2582:6;2569:20;2607:78;2681:3;2673:6;2666:4;2658:6;2654:17;2607:78;:::i;:::-;2598:87;;2414:277;2353:338;;;;:::o;2711:553::-;2769:8;2779:6;2829:3;2822:4;2814:6;2810:17;2806:27;2796:122;;2837:79;;:::i;:::-;2796:122;2950:6;2937:20;2927:30;;2980:18;2972:6;2969:30;2966:117;;;3002:79;;:::i;:::-;2966:117;3116:4;3108:6;3104:17;3092:29;;3170:3;3162:4;3154:6;3150:17;3140:8;3136:32;3133:41;3130:128;;;3177:79;;:::i;:::-;3130:128;2711:553;;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:934::-;6880:6;6888;6896;6904;6953:2;6941:9;6932:7;6928:23;6924:32;6921:119;;;6959:79;;:::i;:::-;6921:119;7107:1;7096:9;7092:17;7079:31;7137:18;7129:6;7126:30;7123:117;;;7159:79;;:::i;:::-;7123:117;7272:80;7344:7;7335:6;7324:9;7320:22;7272:80;:::i;:::-;7254:98;;;;7050:312;7429:2;7418:9;7414:18;7401:32;7460:18;7452:6;7449:30;7446:117;;;7482:79;;:::i;:::-;7446:117;7595:80;7667:7;7658:6;7647:9;7643:22;7595:80;:::i;:::-;7577:98;;;;7372:313;6758:934;;;;;;;:::o;7698:327::-;7756:6;7805:2;7793:9;7784:7;7780:23;7776:32;7773:119;;;7811:79;;:::i;:::-;7773:119;7931:1;7956:52;8000:7;7991:6;7980:9;7976:22;7956:52;:::i;:::-;7946:62;;7902:116;7698:327;;;;:::o;8031:349::-;8100:6;8149:2;8137:9;8128:7;8124:23;8120:32;8117:119;;;8155:79;;:::i;:::-;8117:119;8275:1;8300:63;8355:7;8346:6;8335:9;8331:22;8300:63;:::i;:::-;8290:73;;8246:127;8031:349;;;;:::o;8386:529::-;8457:6;8465;8514:2;8502:9;8493:7;8489:23;8485:32;8482:119;;;8520:79;;:::i;:::-;8482:119;8668:1;8657:9;8653:17;8640:31;8698:18;8690:6;8687:30;8684:117;;;8720:79;;:::i;:::-;8684:117;8833:65;8890:7;8881:6;8870:9;8866:22;8833:65;:::i;:::-;8815:83;;;;8611:297;8386:529;;;;;:::o;8921:329::-;8980:6;9029:2;9017:9;9008:7;9004:23;9000:32;8997:119;;;9035:79;;:::i;:::-;8997:119;9155:1;9180:53;9225:7;9216:6;9205:9;9201:22;9180:53;:::i;:::-;9170:63;;9126:117;8921:329;;;;:::o;9256:490::-;9332:6;9340;9389:2;9377:9;9368:7;9364:23;9360:32;9357:119;;;9395:79;;:::i;:::-;9357:119;9515:1;9540:53;9585:7;9576:6;9565:9;9561:22;9540:53;:::i;:::-;9530:63;;9486:117;9642:2;9668:61;9721:7;9712:6;9701:9;9697:22;9668:61;:::i;:::-;9658:71;;9613:126;9256:490;;;;;:::o;9752:118::-;9839:24;9857:5;9839:24;:::i;:::-;9834:3;9827:37;9752:118;;:::o;9876:109::-;9957:21;9972:5;9957:21;:::i;:::-;9952:3;9945:34;9876:109;;:::o;9991:360::-;10077:3;10105:38;10137:5;10105:38;:::i;:::-;10159:70;10222:6;10217:3;10159:70;:::i;:::-;10152:77;;10238:52;10283:6;10278:3;10271:4;10264:5;10260:16;10238:52;:::i;:::-;10315:29;10337:6;10315:29;:::i;:::-;10310:3;10306:39;10299:46;;10081:270;9991:360;;;;:::o;10357:364::-;10445:3;10473:39;10506:5;10473:39;:::i;:::-;10528:71;10592:6;10587:3;10528:71;:::i;:::-;10521:78;;10608:52;10653:6;10648:3;10641:4;10634:5;10630:16;10608:52;:::i;:::-;10685:29;10707:6;10685:29;:::i;:::-;10680:3;10676:39;10669:46;;10449:272;10357:364;;;;:::o;10727:377::-;10833:3;10861:39;10894:5;10861:39;:::i;:::-;10916:89;10998:6;10993:3;10916:89;:::i;:::-;10909:96;;11014:52;11059:6;11054:3;11047:4;11040:5;11036:16;11014:52;:::i;:::-;11091:6;11086:3;11082:16;11075:23;;10837:267;10727:377;;;;:::o;11110:366::-;11252:3;11273:67;11337:2;11332:3;11273:67;:::i;:::-;11266:74;;11349:93;11438:3;11349:93;:::i;:::-;11467:2;11462:3;11458:12;11451:19;;11110:366;;;:::o;11482:::-;11624:3;11645:67;11709:2;11704:3;11645:67;:::i;:::-;11638:74;;11721:93;11810:3;11721:93;:::i;:::-;11839:2;11834:3;11830:12;11823:19;;11482:366;;;:::o;11854:::-;11996:3;12017:67;12081:2;12076:3;12017:67;:::i;:::-;12010:74;;12093:93;12182:3;12093:93;:::i;:::-;12211:2;12206:3;12202:12;12195:19;;11854:366;;;:::o;12226:::-;12368:3;12389:67;12453:2;12448:3;12389:67;:::i;:::-;12382:74;;12465:93;12554:3;12465:93;:::i;:::-;12583:2;12578:3;12574:12;12567:19;;12226:366;;;:::o;12598:::-;12740:3;12761:67;12825:2;12820:3;12761:67;:::i;:::-;12754:74;;12837:93;12926:3;12837:93;:::i;:::-;12955:2;12950:3;12946:12;12939:19;;12598:366;;;:::o;12970:::-;13112:3;13133:67;13197:2;13192:3;13133:67;:::i;:::-;13126:74;;13209:93;13298:3;13209:93;:::i;:::-;13327:2;13322:3;13318:12;13311:19;;12970:366;;;:::o;13342:::-;13484:3;13505:67;13569:2;13564:3;13505:67;:::i;:::-;13498:74;;13581:93;13670:3;13581:93;:::i;:::-;13699:2;13694:3;13690:12;13683:19;;13342:366;;;:::o;13714:::-;13856:3;13877:67;13941:2;13936:3;13877:67;:::i;:::-;13870:74;;13953:93;14042:3;13953:93;:::i;:::-;14071:2;14066:3;14062:12;14055:19;;13714:366;;;:::o;14086:398::-;14245:3;14266:83;14347:1;14342:3;14266:83;:::i;:::-;14259:90;;14358:93;14447:3;14358:93;:::i;:::-;14476:1;14471:3;14467:11;14460:18;;14086:398;;;:::o;14490:366::-;14632:3;14653:67;14717:2;14712:3;14653:67;:::i;:::-;14646:74;;14729:93;14818:3;14729:93;:::i;:::-;14847:2;14842:3;14838:12;14831:19;;14490:366;;;:::o;14862:::-;15004:3;15025:67;15089:2;15084:3;15025:67;:::i;:::-;15018:74;;15101:93;15190:3;15101:93;:::i;:::-;15219:2;15214:3;15210:12;15203:19;;14862:366;;;:::o;15234:118::-;15321:24;15339:5;15321:24;:::i;:::-;15316:3;15309:37;15234:118;;:::o;15358:435::-;15538:3;15560:95;15651:3;15642:6;15560:95;:::i;:::-;15553:102;;15672:95;15763:3;15754:6;15672:95;:::i;:::-;15665:102;;15784:3;15777:10;;15358:435;;;;;:::o;15799:379::-;15983:3;16005:147;16148:3;16005:147;:::i;:::-;15998:154;;16169:3;16162:10;;15799:379;;;:::o;16184:222::-;16277:4;16315:2;16304:9;16300:18;16292:26;;16328:71;16396:1;16385:9;16381:17;16372:6;16328:71;:::i;:::-;16184:222;;;;:::o;16412:640::-;16607:4;16645:3;16634:9;16630:19;16622:27;;16659:71;16727:1;16716:9;16712:17;16703:6;16659:71;:::i;:::-;16740:72;16808:2;16797:9;16793:18;16784:6;16740:72;:::i;:::-;16822;16890:2;16879:9;16875:18;16866:6;16822:72;:::i;:::-;16941:9;16935:4;16931:20;16926:2;16915:9;16911:18;16904:48;16969:76;17040:4;17031:6;16969:76;:::i;:::-;16961:84;;16412:640;;;;;;;:::o;17058:210::-;17145:4;17183:2;17172:9;17168:18;17160:26;;17196:65;17258:1;17247:9;17243:17;17234:6;17196:65;:::i;:::-;17058:210;;;;:::o;17274:313::-;17387:4;17425:2;17414:9;17410:18;17402:26;;17474:9;17468:4;17464:20;17460:1;17449:9;17445:17;17438:47;17502:78;17575:4;17566:6;17502:78;:::i;:::-;17494:86;;17274:313;;;;:::o;17593:419::-;17759:4;17797:2;17786:9;17782:18;17774:26;;17846:9;17840:4;17836:20;17832:1;17821:9;17817:17;17810:47;17874:131;18000:4;17874:131;:::i;:::-;17866:139;;17593:419;;;:::o;18018:::-;18184:4;18222:2;18211:9;18207:18;18199:26;;18271:9;18265:4;18261:20;18257:1;18246:9;18242:17;18235:47;18299:131;18425:4;18299:131;:::i;:::-;18291:139;;18018:419;;;:::o;18443:::-;18609:4;18647:2;18636:9;18632:18;18624:26;;18696:9;18690:4;18686:20;18682:1;18671:9;18667:17;18660:47;18724:131;18850:4;18724:131;:::i;:::-;18716:139;;18443:419;;;:::o;18868:::-;19034:4;19072:2;19061:9;19057:18;19049:26;;19121:9;19115:4;19111:20;19107:1;19096:9;19092:17;19085:47;19149:131;19275:4;19149:131;:::i;:::-;19141:139;;18868:419;;;:::o;19293:::-;19459:4;19497:2;19486:9;19482:18;19474:26;;19546:9;19540:4;19536:20;19532:1;19521:9;19517:17;19510:47;19574:131;19700:4;19574:131;:::i;:::-;19566:139;;19293:419;;;:::o;19718:::-;19884:4;19922:2;19911:9;19907:18;19899:26;;19971:9;19965:4;19961:20;19957:1;19946:9;19942:17;19935:47;19999:131;20125:4;19999:131;:::i;:::-;19991:139;;19718:419;;;:::o;20143:::-;20309:4;20347:2;20336:9;20332:18;20324:26;;20396:9;20390:4;20386:20;20382:1;20371:9;20367:17;20360:47;20424:131;20550:4;20424:131;:::i;:::-;20416:139;;20143:419;;;:::o;20568:::-;20734:4;20772:2;20761:9;20757:18;20749:26;;20821:9;20815:4;20811:20;20807:1;20796:9;20792:17;20785:47;20849:131;20975:4;20849:131;:::i;:::-;20841:139;;20568:419;;;:::o;20993:::-;21159:4;21197:2;21186:9;21182:18;21174:26;;21246:9;21240:4;21236:20;21232:1;21221:9;21217:17;21210:47;21274:131;21400:4;21274:131;:::i;:::-;21266:139;;20993:419;;;:::o;21418:::-;21584:4;21622:2;21611:9;21607:18;21599:26;;21671:9;21665:4;21661:20;21657:1;21646:9;21642:17;21635:47;21699:131;21825:4;21699:131;:::i;:::-;21691:139;;21418:419;;;:::o;21843:222::-;21936:4;21974:2;21963:9;21959:18;21951:26;;21987:71;22055:1;22044:9;22040:17;22031:6;21987:71;:::i;:::-;21843:222;;;;:::o;22071:129::-;22105:6;22132:20;;:::i;:::-;22122:30;;22161:33;22189:4;22181:6;22161:33;:::i;:::-;22071:129;;;:::o;22206:75::-;22239:6;22272:2;22266:9;22256:19;;22206:75;:::o;22287:307::-;22348:4;22438:18;22430:6;22427:30;22424:56;;;22460:18;;:::i;:::-;22424:56;22498:29;22520:6;22498:29;:::i;:::-;22490:37;;22582:4;22576;22572:15;22564:23;;22287:307;;;:::o;22600:98::-;22651:6;22685:5;22679:12;22669:22;;22600:98;;;:::o;22704:99::-;22756:6;22790:5;22784:12;22774:22;;22704:99;;;:::o;22809:168::-;22892:11;22926:6;22921:3;22914:19;22966:4;22961:3;22957:14;22942:29;;22809:168;;;;:::o;22983:147::-;23084:11;23121:3;23106:18;;22983:147;;;;:::o;23136:169::-;23220:11;23254:6;23249:3;23242:19;23294:4;23289:3;23285:14;23270:29;;23136:169;;;;:::o;23311:148::-;23413:11;23450:3;23435:18;;23311:148;;;;:::o;23465:305::-;23505:3;23524:20;23542:1;23524:20;:::i;:::-;23519:25;;23558:20;23576:1;23558:20;:::i;:::-;23553:25;;23712:1;23644:66;23640:74;23637:1;23634:81;23631:107;;;23718:18;;:::i;:::-;23631:107;23762:1;23759;23755:9;23748:16;;23465:305;;;;:::o;23776:185::-;23816:1;23833:20;23851:1;23833:20;:::i;:::-;23828:25;;23867:20;23885:1;23867:20;:::i;:::-;23862:25;;23906:1;23896:35;;23911:18;;:::i;:::-;23896:35;23953:1;23950;23946:9;23941:14;;23776:185;;;;:::o;23967:191::-;24007:4;24027:20;24045:1;24027:20;:::i;:::-;24022:25;;24061:20;24079:1;24061:20;:::i;:::-;24056:25;;24100:1;24097;24094:8;24091:34;;;24105:18;;:::i;:::-;24091:34;24150:1;24147;24143:9;24135:17;;23967:191;;;;:::o;24164:96::-;24201:7;24230:24;24248:5;24230:24;:::i;:::-;24219:35;;24164:96;;;:::o;24266:104::-;24311:7;24340:24;24358:5;24340:24;:::i;:::-;24329:35;;24266:104;;;:::o;24376:90::-;24410:7;24453:5;24446:13;24439:21;24428:32;;24376:90;;;:::o;24472:149::-;24508:7;24548:66;24541:5;24537:78;24526:89;;24472:149;;;:::o;24627:126::-;24664:7;24704:42;24697:5;24693:54;24682:65;;24627:126;;;:::o;24759:77::-;24796:7;24825:5;24814:16;;24759:77;;;:::o;24842:86::-;24877:7;24917:4;24910:5;24906:16;24895:27;;24842:86;;;:::o;24934:154::-;25018:6;25013:3;25008;24995:30;25080:1;25071:6;25066:3;25062:16;25055:27;24934:154;;;:::o;25094:307::-;25162:1;25172:113;25186:6;25183:1;25180:13;25172:113;;;25271:1;25266:3;25262:11;25256:18;25252:1;25247:3;25243:11;25236:39;25208:2;25205:1;25201:10;25196:15;;25172:113;;;25303:6;25300:1;25297:13;25294:101;;;25383:1;25374:6;25369:3;25365:16;25358:27;25294:101;25143:258;25094:307;;;:::o;25407:320::-;25451:6;25488:1;25482:4;25478:12;25468:22;;25535:1;25529:4;25525:12;25556:18;25546:81;;25612:4;25604:6;25600:17;25590:27;;25546:81;25674:2;25666:6;25663:14;25643:18;25640:38;25637:84;;;25693:18;;:::i;:::-;25637:84;25458:269;25407:320;;;:::o;25733:281::-;25816:27;25838:4;25816:27;:::i;:::-;25808:6;25804:40;25946:6;25934:10;25931:22;25910:18;25898:10;25895:34;25892:62;25889:88;;;25957:18;;:::i;:::-;25889:88;25997:10;25993:2;25986:22;25776:238;25733:281;;:::o;26020:233::-;26059:3;26082:24;26100:5;26082:24;:::i;:::-;26073:33;;26128:66;26121:5;26118:77;26115:103;;;26198:18;;:::i;:::-;26115:103;26245:1;26238:5;26234:13;26227:20;;26020:233;;;:::o;26259:167::-;26296:3;26319:22;26335:5;26319:22;:::i;:::-;26310:31;;26363:4;26356:5;26353:15;26350:41;;;26371:18;;:::i;:::-;26350:41;26418:1;26411:5;26407:13;26400:20;;26259:167;;;:::o;26432:176::-;26464:1;26481:20;26499:1;26481:20;:::i;:::-;26476:25;;26515:20;26533:1;26515:20;:::i;:::-;26510:25;;26554:1;26544:35;;26559:18;;:::i;:::-;26544:35;26600:1;26597;26593:9;26588:14;;26432:176;;;;:::o;26614:180::-;26662:77;26659:1;26652:88;26759:4;26756:1;26749:15;26783:4;26780:1;26773:15;26800:180;26848:77;26845:1;26838:88;26945:4;26942:1;26935:15;26969:4;26966:1;26959:15;26986:180;27034:77;27031:1;27024:88;27131:4;27128:1;27121:15;27155:4;27152:1;27145:15;27172:180;27220:77;27217:1;27210:88;27317:4;27314:1;27307:15;27341:4;27338:1;27331:15;27358:180;27406:77;27403:1;27396:88;27503:4;27500:1;27493:15;27527:4;27524:1;27517:15;27544:117;27653:1;27650;27643:12;27667:117;27776:1;27773;27766:12;27790:117;27899:1;27896;27889:12;27913:117;28022:1;28019;28012:12;28036:117;28145:1;28142;28135:12;28159:117;28268:1;28265;28258:12;28282:102;28323:6;28374:2;28370:7;28365:2;28358:5;28354:14;28350:28;28340:38;;28282:102;;;:::o;28390:221::-;28530:34;28526:1;28518:6;28514:14;28507:58;28599:4;28594:2;28586:6;28582:15;28575:29;28390:221;:::o;28617:225::-;28757:34;28753:1;28745:6;28741:14;28734:58;28826:8;28821:2;28813:6;28809:15;28802:33;28617:225;:::o;28848:181::-;28988:33;28984:1;28976:6;28972:14;28965:57;28848:181;:::o;29035:182::-;29175:34;29171:1;29163:6;29159:14;29152:58;29035:182;:::o;29223:223::-;29363:34;29359:1;29351:6;29347:14;29340:58;29432:6;29427:2;29419:6;29415:15;29408:31;29223:223;:::o;29452:182::-;29592:34;29588:1;29580:6;29576:14;29569:58;29452:182;:::o;29640:174::-;29780:26;29776:1;29768:6;29764:14;29757:50;29640:174;:::o;29820:::-;29960:26;29956:1;29948:6;29944:14;29937:50;29820:174;:::o;30000:114::-;;:::o;30120:166::-;30260:18;30256:1;30248:6;30244:14;30237:42;30120:166;:::o;30292:181::-;30432:33;30428:1;30420:6;30416:14;30409:57;30292:181;:::o;30479:122::-;30552:24;30570:5;30552:24;:::i;:::-;30545:5;30542:35;30532:63;;30591:1;30588;30581:12;30532:63;30479:122;:::o;30607:138::-;30688:32;30714:5;30688:32;:::i;:::-;30681:5;30678:43;30668:71;;30735:1;30732;30725:12;30668:71;30607:138;:::o;30751:116::-;30821:21;30836:5;30821:21;:::i;:::-;30814:5;30811:32;30801:60;;30857:1;30854;30847:12;30801:60;30751:116;:::o;30873:120::-;30945:23;30962:5;30945:23;:::i;:::-;30938:5;30935:34;30925:62;;30983:1;30980;30973:12;30925:62;30873:120;:::o;30999:122::-;31072:24;31090:5;31072:24;:::i;:::-;31065:5;31062:35;31052:63;;31111:1;31108;31101:12;31052:63;30999:122;:::o
Swarm Source
ipfs://c0bea9437a7c8d44c405aab940581abebf9836be4abb2dc6b9b9551de91f2b13
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.