ERC-721
NFT
Overview
Max Total Supply
0 EGS
Holders
1,144
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 EGSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ShinyWhitelistedNFTDrop
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-04 */ // SPDX-License-Identifier: MIT // Sources flattened with hardhat v2.9.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // 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/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @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/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @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/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File contracts/ShinyWhitelistedNFTDrop.sol contract ShinyWhitelistedNFTDrop is ERC721, Ownable { using Strings for uint256; uint256 public constant TOTAL_NFTS = 2222; uint256 public whitelistedAddressesCount; bool public saleStartStatus; bool public whitelistRegistrationStatus; uint256 public tokenCounter; uint256 public membershipFee; string private _baseTokenURI = ""; mapping(address => bool) private _whitelistedAddressStatuses; mapping(address => bool) private _whitelistedAddressNFTClaimStatuses; constructor() Ownable() ERC721("EverydayGoddesses", "EGS") {} /* Admin Methods Start */ function updateTokenBaseURI(string calldata baseTokenURI_) external onlyOwner { _baseTokenURI = baseTokenURI_; } function toggleSell() external onlyOwner { saleStartStatus = !saleStartStatus; } function toggleWhitelistRegistration() external onlyOwner { whitelistRegistrationStatus = !whitelistRegistrationStatus; } function addAddressesAsWhitelisted(address[] calldata _addresses) external onlyOwner { require( whitelistedAddressesCount + _addresses.length <= TOTAL_NFTS, "ShinyWhitelistedNFTDrop: Whitelist is full" ); for ( uint256 addressIndex = 0; addressIndex < _addresses.length; addressIndex++ ) { _whitelistedAddressStatuses[_addresses[addressIndex]] = true; } whitelistedAddressesCount += _addresses.length; } function setMembershipFee(uint256 membershipFee_) external onlyOwner { membershipFee = membershipFee_; } function mintForWhitelistedTokens(address[] calldata whitelistedAddresses_) external onlyOwner { require( whitelistedAddresses_.length > 0, "ShinyWhitelistedNFTDrop: No addresses" ); require( whitelistedAddresses_.length <= 3, "ShinyWhitelistedNFTDrop: Too many addresses" ); for ( uint256 whitelistedAddressIndex = 0; whitelistedAddressIndex < whitelistedAddresses_.length; whitelistedAddressIndex++ ) { // Mint NFTs for each whitelisted address require( _whitelistedAddressStatuses[ whitelistedAddresses_[whitelistedAddressIndex] ], "ShinyWhitelistedNFTDrop: Address not whitelisted" ); require( !_whitelistedAddressNFTClaimStatuses[ whitelistedAddresses_[whitelistedAddressIndex] ], "ShinyWhitelistedNFTDrop: User has already claimed an NFT" ); // Update the user's claim status _whitelistedAddressNFTClaimStatuses[ whitelistedAddresses_[whitelistedAddressIndex] ] = true; // Mint the NFT _safeMint( whitelistedAddresses_[whitelistedAddressIndex], ++tokenCounter ); } } /* Admin Methods End */ /* External Methods Start */ function getRegistered() external payable { require( whitelistRegistrationStatus, "ShinyWhitelistedNFTDrop: Whitelist registration is closed" ); require( whitelistedAddressesCount < TOTAL_NFTS, "ShinyWhitelistedNFTDrop: Whitelist is full" ); require( !_whitelistedAddressStatuses[msg.sender], "ShinyWhitelistedNFTDrop: User is already registered" ); require( msg.value == membershipFee, "ShinyWhitelistedNFTDrop: Wrong membership fee transferred" ); // Add the address as a whitelisted address _whitelistedAddressStatuses[msg.sender] = true; whitelistedAddressesCount++; // Transfer the membership fee to the owner payable(owner()).transfer(msg.value); } function claimNFT() external { require( saleStartStatus, "ShinyWhitelistedNFTDrop: Sale has not started yet" ); require( _whitelistedAddressStatuses[msg.sender], "ShinyWhitelistedNFTDrop: User is not whitelisted" ); require( !_whitelistedAddressNFTClaimStatuses[msg.sender], "ShinyWhitelistedNFTDrop: User has already claimed an NFT" ); // Update the user's claim status _whitelistedAddressNFTClaimStatuses[msg.sender] = true; // Mint the NFT _safeMint(msg.sender, ++tokenCounter); } /* View Methods Start */ function isUserWhitelisted(address _userAddress) external view returns (bool) { return _whitelistedAddressStatuses[_userAddress]; } function hasUserClaimed(address _userAddress) external view returns (bool) { return _whitelistedAddressNFTClaimStatuses[_userAddress]; } /* View Methods End */ /* External Methods End */ /* Public Methods Start */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ShinyWhitelistedNFTDrop: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /* Public Methods End */ /* Internal Functions Start */ function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } /* Internal Functions End */ }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TOTAL_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addAddressesAsWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimNFT","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":[],"name":"getRegistered","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"hasUserClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddress","type":"address"}],"name":"isUserWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"membershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelistedAddresses_","type":"address[]"}],"name":"mintForWhitelistedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[],"name":"saleStartStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"membershipFee_","type":"uint256"}],"name":"setMembershipFee","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":[],"name":"toggleSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistRegistration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI_","type":"string"}],"name":"updateTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistRegistrationStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedAddressesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b929190620001ce565b503480156200003957600080fd5b506040518060400160405280601181526020017f4576657279646179476f646465737365730000000000000000000000000000008152506040518060400160405280600381526020017f45475300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000be929190620001ce565b508060019080519060200190620000d7929190620001ce565b505050620000fa620000ee6200010060201b60201c565b6200010860201b60201c565b620002e3565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001dc906200027e565b90600052602060002090601f0160209004810192826200020057600085556200024c565b82601f106200021b57805160ff19168380011785556200024c565b828001600101855582156200024c579182015b828111156200024b5782518255916020019190600101906200022e565b5b5090506200025b91906200025f565b5090565b5b808211156200027a57600081600090555060010162000260565b5090565b600060028204905060018216806200029757607f821691505b60208210811415620002ae57620002ad620002b4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61438480620002f36000396000f3fe6080604052600436106101e35760003560e01c806395d89b4111610102578063c713a28911610095578063dabfedab11610064578063dabfedab14610685578063e985e9c5146106b0578063f2fde38b146106ed578063fb237eb214610716576101e3565b8063c713a289146105c7578063c87b56dd146105f2578063d082e3811461062f578063d120dff11461065a576101e3565b8063a6659d30116100d1578063a6659d3014610533578063b88d4fde1461054a578063c1e3cd7f14610573578063c60b2f821461059e576101e3565b806395d89b41146104775780639758dec3146104a2578063a195b69c146104cd578063a22cb4651461050a576101e3565b80636352211e1161017a578063715018a611610149578063715018a6146104145780637a6543e21461042b57806381a81896146104355780638da5cb5b1461044c576101e3565b80636352211e1461035a578063672756ad146103975780636f63a73f146103ae57806370a08231146103d7576101e3565b80632295ee5b116101b65780632295ee5b146102b657806323b872dd146102df5780632b4a240a1461030857806342842e0e14610331576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612e2e565b610753565b60405161021c91906133eb565b60405180910390f35b34801561023157600080fd5b5061023a610835565b6040516102479190613406565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612ed5565b6108c7565b6040516102849190613384565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612da1565b61094c565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190612e88565b610a64565b005b3480156102eb57600080fd5b5061030660048036038101906103019190612c8b565b610af6565b005b34801561031457600080fd5b5061032f600480360381019061032a9190612de1565b610b56565b005b34801561033d57600080fd5b5061035860048036038101906103539190612c8b565b610ce8565b005b34801561036657600080fd5b50610381600480360381019061037c9190612ed5565b610d08565b60405161038e9190613384565b60405180910390f35b3480156103a357600080fd5b506103ac610dba565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612de1565b610f9a565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612c1e565b6112f4565b60405161040b9190613768565b60405180910390f35b34801561042057600080fd5b506104296113ac565b005b610433611434565b005b34801561044157600080fd5b5061044a61165a565b005b34801561045857600080fd5b50610461611702565b60405161046e9190613384565b60405180910390f35b34801561048357600080fd5b5061048c61172c565b6040516104999190613406565b60405180910390f35b3480156104ae57600080fd5b506104b76117be565b6040516104c491906133eb565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190612c1e565b6117d1565b60405161050191906133eb565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190612d61565b611827565b005b34801561053f57600080fd5b5061054861183d565b005b34801561055657600080fd5b50610571600480360381019061056c9190612cde565b6118e5565b005b34801561057f57600080fd5b50610588611947565b60405161059591906133eb565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190612ed5565b61195a565b005b3480156105d357600080fd5b506105dc6119e0565b6040516105e99190613768565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190612ed5565b6119e6565b6040516106269190613406565b60405180910390f35b34801561063b57600080fd5b50610644611a8d565b6040516106519190613768565b60405180910390f35b34801561066657600080fd5b5061066f611a93565b60405161067c9190613768565b60405180910390f35b34801561069157600080fd5b5061069a611a99565b6040516106a79190613768565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612c4b565b611a9f565b6040516106e491906133eb565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190612c1e565b611b33565b005b34801561072257600080fd5b5061073d60048036038101906107389190612c1e565b611c2b565b60405161074a91906133eb565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082e575061082d82611c81565b5b9050919050565b6060600080546108449061398d565b80601f01602080910402602001604051908101604052809291908181526020018280546108709061398d565b80156108bd5780601f10610892576101008083540402835291602001916108bd565b820191906000526020600020905b8154815290600101906020018083116108a057829003601f168201915b5050505050905090565b60006108d282611ceb565b610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613628565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095782610d08565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf90613668565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e7611d57565b73ffffffffffffffffffffffffffffffffffffffff161480610a165750610a1581610a10611d57565b611a9f565b5b610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90613568565b60405180910390fd5b610a5f8383611d5f565b505050565b610a6c611d57565b73ffffffffffffffffffffffffffffffffffffffff16610a8a611702565b73ffffffffffffffffffffffffffffffffffffffff1614610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790613648565b60405180910390fd5b8181600b9190610af19291906129f6565b505050565b610b07610b01611d57565b82611e18565b610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d906136e8565b60405180910390fd5b610b51838383611ef6565b505050565b610b5e611d57565b73ffffffffffffffffffffffffffffffffffffffff16610b7c611702565b73ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613648565b60405180910390fd5b6108ae82829050600754610be6919061381c565b1115610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90613688565b60405180910390fd5b60005b82829050811015610cc7576001600c6000858585818110610c4e57610c4d613af7565b5b9050602002016020810190610c639190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cbf906139f0565b915050610c2a565b508181905060076000828254610cdd919061381c565b925050819055505050565b610d03838383604051806020016040528060008152506118e5565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da8906135a8565b60405180910390fd5b80915050919050565b600860009054906101000a900460ff16610e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e00906136c8565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90613508565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990613708565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610f9833600960008154610f8d906139f0565b91905081905561215d565b565b610fa2611d57565b73ffffffffffffffffffffffffffffffffffffffff16610fc0611702565b73ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90613648565b60405180910390fd5b6000828290501161105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105390613728565b60405180910390fd5b60038282905011156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a906135e8565b60405180910390fd5b60005b828290508110156112ef57600c60008484848181106110c8576110c7613af7565b5b90506020020160208101906110dd9190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b906134c8565b60405180910390fd5b600d600084848481811061117b5761117a613af7565b5b90506020020160208101906111909190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90613708565b60405180910390fd5b6001600d600085858581811061123157611230613af7565b5b90506020020160208101906112469190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506112dc8383838181106112ad576112ac613af7565b5b90506020020160208101906112c29190612c1e565b6009600081546112d1906139f0565b91905081905561215d565b80806112e7906139f0565b9150506110a6565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613588565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113b4611d57565b73ffffffffffffffffffffffffffffffffffffffff166113d2611702565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613648565b60405180910390fd5b611432600061217b565b565b600860019054906101000a900460ff16611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613488565b60405180910390fd5b6108ae600754106114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613688565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d906135c8565b60405180910390fd5b600a54341461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190613748565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060076000815480929190611605906139f0565b9190505550611612611702565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611657573d6000803e3d6000fd5b50565b611662611d57565b73ffffffffffffffffffffffffffffffffffffffff16611680611702565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613648565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461173b9061398d565b80601f01602080910402602001604051908101604052809291908181526020018280546117679061398d565b80156117b45780601f10611789576101008083540402835291602001916117b4565b820191906000526020600020905b81548152906001019060200180831161179757829003601f168201915b5050505050905090565b600860019054906101000a900460ff1681565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611839611832611d57565b8383612241565b5050565b611845611d57565b73ffffffffffffffffffffffffffffffffffffffff16611863611702565b73ffffffffffffffffffffffffffffffffffffffff16146118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b090613648565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b6118f66118f0611d57565b83611e18565b611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c906136e8565b60405180910390fd5b611941848484846123ae565b50505050565b600860009054906101000a900460ff1681565b611962611d57565b73ffffffffffffffffffffffffffffffffffffffff16611980611702565b73ffffffffffffffffffffffffffffffffffffffff16146119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90613648565b60405180910390fd5b80600a8190555050565b600a5481565b60606119f182611ceb565b611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a27906136a8565b60405180910390fd5b6000611a3a61240a565b90506000815111611a5a5760405180602001604052806000815250611a85565b80611a648461249c565b604051602001611a75929190613360565b6040516020818303038152906040525b915050919050565b60095481565b60075481565b6108ae81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b3b611d57565b73ffffffffffffffffffffffffffffffffffffffff16611b59611702565b73ffffffffffffffffffffffffffffffffffffffff1614611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690613648565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690613448565b60405180910390fd5b611c288161217b565b50565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dd283610d08565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e2382611ceb565b611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613548565b60405180910390fd5b6000611e6d83610d08565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611edc57508373ffffffffffffffffffffffffffffffffffffffff16611ec4846108c7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eed5750611eec8185611a9f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f1682610d08565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390613468565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd3906134e8565b60405180910390fd5b611fe78383836125fd565b611ff2600082611d5f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204291906138a3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612099919061381c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612158838383612602565b505050565b612177828260405180602001604052806000815250612607565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790613528565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123a191906133eb565b60405180910390a3505050565b6123b9848484611ef6565b6123c584848484612662565b612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613428565b60405180910390fd5b50505050565b6060600b80546124199061398d565b80601f01602080910402602001604051908101604052809291908181526020018280546124459061398d565b80156124925780601f1061246757610100808354040283529160200191612492565b820191906000526020600020905b81548152906001019060200180831161247557829003601f168201915b5050505050905090565b606060008214156124e4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f8565b600082905060005b600082146125165780806124ff906139f0565b915050600a8261250f9190613872565b91506124ec565b60008167ffffffffffffffff81111561253257612531613b26565b5b6040519080825280601f01601f1916602001820160405280156125645781602001600182028036833780820191505090505b5090505b600085146125f15760018261257d91906138a3565b9150600a8561258c9190613a39565b6030612598919061381c565b60f81b8183815181106125ae576125ad613af7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125ea9190613872565b9450612568565b8093505050505b919050565b505050565b505050565b61261183836127f9565b61261e6000848484612662565b61265d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265490613428565b60405180910390fd5b505050565b60006126838473ffffffffffffffffffffffffffffffffffffffff166129d3565b156127ec578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ac611d57565b8786866040518563ffffffff1660e01b81526004016126ce949392919061339f565b602060405180830381600087803b1580156126e857600080fd5b505af192505050801561271957506040513d601f19601f820116820180604052508101906127169190612e5b565b60015b61279c573d8060008114612749576040519150601f19603f3d011682016040523d82523d6000602084013e61274e565b606091505b50600081511415612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90613428565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f1565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286090613608565b60405180910390fd5b61287281611ceb565b156128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a9906134a8565b60405180910390fd5b6128be600083836125fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290e919061381c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129cf60008383612602565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612a029061398d565b90600052602060002090601f016020900481019282612a245760008555612a6b565b82601f10612a3d57803560ff1916838001178555612a6b565b82800160010185558215612a6b579182015b82811115612a6a578235825591602001919060010190612a4f565b5b509050612a789190612a7c565b5090565b5b80821115612a95576000816000905550600101612a7d565b5090565b6000612aac612aa7846137a8565b613783565b905082815260208101848484011115612ac857612ac7613b64565b5b612ad384828561394b565b509392505050565b600081359050612aea816142f2565b92915050565b60008083601f840112612b0657612b05613b5a565b5b8235905067ffffffffffffffff811115612b2357612b22613b55565b5b602083019150836020820283011115612b3f57612b3e613b5f565b5b9250929050565b600081359050612b5581614309565b92915050565b600081359050612b6a81614320565b92915050565b600081519050612b7f81614320565b92915050565b600082601f830112612b9a57612b99613b5a565b5b8135612baa848260208601612a99565b91505092915050565b60008083601f840112612bc957612bc8613b5a565b5b8235905067ffffffffffffffff811115612be657612be5613b55565b5b602083019150836001820283011115612c0257612c01613b5f565b5b9250929050565b600081359050612c1881614337565b92915050565b600060208284031215612c3457612c33613b6e565b5b6000612c4284828501612adb565b91505092915050565b60008060408385031215612c6257612c61613b6e565b5b6000612c7085828601612adb565b9250506020612c8185828601612adb565b9150509250929050565b600080600060608486031215612ca457612ca3613b6e565b5b6000612cb286828701612adb565b9350506020612cc386828701612adb565b9250506040612cd486828701612c09565b9150509250925092565b60008060008060808587031215612cf857612cf7613b6e565b5b6000612d0687828801612adb565b9450506020612d1787828801612adb565b9350506040612d2887828801612c09565b925050606085013567ffffffffffffffff811115612d4957612d48613b69565b5b612d5587828801612b85565b91505092959194509250565b60008060408385031215612d7857612d77613b6e565b5b6000612d8685828601612adb565b9250506020612d9785828601612b46565b9150509250929050565b60008060408385031215612db857612db7613b6e565b5b6000612dc685828601612adb565b9250506020612dd785828601612c09565b9150509250929050565b60008060208385031215612df857612df7613b6e565b5b600083013567ffffffffffffffff811115612e1657612e15613b69565b5b612e2285828601612af0565b92509250509250929050565b600060208284031215612e4457612e43613b6e565b5b6000612e5284828501612b5b565b91505092915050565b600060208284031215612e7157612e70613b6e565b5b6000612e7f84828501612b70565b91505092915050565b60008060208385031215612e9f57612e9e613b6e565b5b600083013567ffffffffffffffff811115612ebd57612ebc613b69565b5b612ec985828601612bb3565b92509250509250929050565b600060208284031215612eeb57612eea613b6e565b5b6000612ef984828501612c09565b91505092915050565b612f0b816138d7565b82525050565b612f1a816138e9565b82525050565b6000612f2b826137d9565b612f3581856137ef565b9350612f4581856020860161395a565b612f4e81613b73565b840191505092915050565b6000612f64826137e4565b612f6e8185613800565b9350612f7e81856020860161395a565b612f8781613b73565b840191505092915050565b6000612f9d826137e4565b612fa78185613811565b9350612fb781856020860161395a565b80840191505092915050565b6000612fd0603283613800565b9150612fdb82613b84565b604082019050919050565b6000612ff3602683613800565b9150612ffe82613bd3565b604082019050919050565b6000613016602583613800565b915061302182613c22565b604082019050919050565b6000613039603983613800565b915061304482613c71565b604082019050919050565b600061305c601c83613800565b915061306782613cc0565b602082019050919050565b600061307f603083613800565b915061308a82613ce9565b604082019050919050565b60006130a2602483613800565b91506130ad82613d38565b604082019050919050565b60006130c5603083613800565b91506130d082613d87565b604082019050919050565b60006130e8601983613800565b91506130f382613dd6565b602082019050919050565b600061310b602c83613800565b915061311682613dff565b604082019050919050565b600061312e603883613800565b915061313982613e4e565b604082019050919050565b6000613151602a83613800565b915061315c82613e9d565b604082019050919050565b6000613174602983613800565b915061317f82613eec565b604082019050919050565b6000613197603383613800565b91506131a282613f3b565b604082019050919050565b60006131ba602b83613800565b91506131c582613f8a565b604082019050919050565b60006131dd602083613800565b91506131e882613fd9565b602082019050919050565b6000613200602c83613800565b915061320b82614002565b604082019050919050565b6000613223602083613800565b915061322e82614051565b602082019050919050565b6000613246602183613800565b91506132518261407a565b604082019050919050565b6000613269602a83613800565b9150613274826140c9565b604082019050919050565b600061328c603883613800565b915061329782614118565b604082019050919050565b60006132af603183613800565b91506132ba82614167565b604082019050919050565b60006132d2603183613800565b91506132dd826141b6565b604082019050919050565b60006132f5603883613800565b915061330082614205565b604082019050919050565b6000613318602583613800565b915061332382614254565b604082019050919050565b600061333b603983613800565b9150613346826142a3565b604082019050919050565b61335a81613941565b82525050565b600061336c8285612f92565b91506133788284612f92565b91508190509392505050565b60006020820190506133996000830184612f02565b92915050565b60006080820190506133b46000830187612f02565b6133c16020830186612f02565b6133ce6040830185613351565b81810360608301526133e08184612f20565b905095945050505050565b60006020820190506134006000830184612f11565b92915050565b600060208201905081810360008301526134208184612f59565b905092915050565b6000602082019050818103600083015261344181612fc3565b9050919050565b6000602082019050818103600083015261346181612fe6565b9050919050565b6000602082019050818103600083015261348181613009565b9050919050565b600060208201905081810360008301526134a18161302c565b9050919050565b600060208201905081810360008301526134c18161304f565b9050919050565b600060208201905081810360008301526134e181613072565b9050919050565b6000602082019050818103600083015261350181613095565b9050919050565b60006020820190508181036000830152613521816130b8565b9050919050565b60006020820190508181036000830152613541816130db565b9050919050565b60006020820190508181036000830152613561816130fe565b9050919050565b6000602082019050818103600083015261358181613121565b9050919050565b600060208201905081810360008301526135a181613144565b9050919050565b600060208201905081810360008301526135c181613167565b9050919050565b600060208201905081810360008301526135e18161318a565b9050919050565b60006020820190508181036000830152613601816131ad565b9050919050565b60006020820190508181036000830152613621816131d0565b9050919050565b60006020820190508181036000830152613641816131f3565b9050919050565b6000602082019050818103600083015261366181613216565b9050919050565b6000602082019050818103600083015261368181613239565b9050919050565b600060208201905081810360008301526136a18161325c565b9050919050565b600060208201905081810360008301526136c18161327f565b9050919050565b600060208201905081810360008301526136e1816132a2565b9050919050565b60006020820190508181036000830152613701816132c5565b9050919050565b60006020820190508181036000830152613721816132e8565b9050919050565b600060208201905081810360008301526137418161330b565b9050919050565b600060208201905081810360008301526137618161332e565b9050919050565b600060208201905061377d6000830184613351565b92915050565b600061378d61379e565b905061379982826139bf565b919050565b6000604051905090565b600067ffffffffffffffff8211156137c3576137c2613b26565b5b6137cc82613b73565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061382782613941565b915061383283613941565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561386757613866613a6a565b5b828201905092915050565b600061387d82613941565b915061388883613941565b92508261389857613897613a99565b5b828204905092915050565b60006138ae82613941565b91506138b983613941565b9250828210156138cc576138cb613a6a565b5b828203905092915050565b60006138e282613921565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561397857808201518184015260208101905061395d565b83811115613987576000848401525b50505050565b600060028204905060018216806139a557607f821691505b602082108114156139b9576139b8613ac8565b5b50919050565b6139c882613b73565b810181811067ffffffffffffffff821117156139e7576139e6613b26565b5b80604052505050565b60006139fb82613941565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a2e57613a2d613a6a565b5b600182019050919050565b6000613a4482613941565b9150613a4f83613941565b925082613a5f57613a5e613a99565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2057686974656c6960008201527f737420726567697374726174696f6e20697320636c6f73656400000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5368696e7957686974656c69737465644e465444726f703a204164647265737360008201527f206e6f742077686974656c697374656400000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205573657220697360008201527f206e6f742077686974656c697374656400000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205573657220697360008201527f20616c7265616479207265676973746572656400000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a20546f6f206d616e60008201527f7920616464726573736573000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2057686974656c6960008201527f73742069732066756c6c00000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205552492071756560008201527f727920666f72206e6f6e6578697374656e7420746f6b656e0000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2053616c6520686160008201527f73206e6f74207374617274656420796574000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205573657220686160008201527f7320616c726561647920636c61696d656420616e204e46540000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a204e6f206164647260008201527f6573736573000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2057726f6e67206d60008201527f656d6265727368697020666565207472616e7366657272656400000000000000602082015250565b6142fb816138d7565b811461430657600080fd5b50565b614312816138e9565b811461431d57600080fd5b50565b614329816138f5565b811461433457600080fd5b50565b61434081613941565b811461434b57600080fd5b5056fea2646970667358221220837c311d7c28a78f7cb3354d2f9e6c2cb27ef4e6fb8df1c530bb300ac07767e564736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c806395d89b4111610102578063c713a28911610095578063dabfedab11610064578063dabfedab14610685578063e985e9c5146106b0578063f2fde38b146106ed578063fb237eb214610716576101e3565b8063c713a289146105c7578063c87b56dd146105f2578063d082e3811461062f578063d120dff11461065a576101e3565b8063a6659d30116100d1578063a6659d3014610533578063b88d4fde1461054a578063c1e3cd7f14610573578063c60b2f821461059e576101e3565b806395d89b41146104775780639758dec3146104a2578063a195b69c146104cd578063a22cb4651461050a576101e3565b80636352211e1161017a578063715018a611610149578063715018a6146104145780637a6543e21461042b57806381a81896146104355780638da5cb5b1461044c576101e3565b80636352211e1461035a578063672756ad146103975780636f63a73f146103ae57806370a08231146103d7576101e3565b80632295ee5b116101b65780632295ee5b146102b657806323b872dd146102df5780632b4a240a1461030857806342842e0e14610331576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612e2e565b610753565b60405161021c91906133eb565b60405180910390f35b34801561023157600080fd5b5061023a610835565b6040516102479190613406565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612ed5565b6108c7565b6040516102849190613384565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612da1565b61094c565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190612e88565b610a64565b005b3480156102eb57600080fd5b5061030660048036038101906103019190612c8b565b610af6565b005b34801561031457600080fd5b5061032f600480360381019061032a9190612de1565b610b56565b005b34801561033d57600080fd5b5061035860048036038101906103539190612c8b565b610ce8565b005b34801561036657600080fd5b50610381600480360381019061037c9190612ed5565b610d08565b60405161038e9190613384565b60405180910390f35b3480156103a357600080fd5b506103ac610dba565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612de1565b610f9a565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190612c1e565b6112f4565b60405161040b9190613768565b60405180910390f35b34801561042057600080fd5b506104296113ac565b005b610433611434565b005b34801561044157600080fd5b5061044a61165a565b005b34801561045857600080fd5b50610461611702565b60405161046e9190613384565b60405180910390f35b34801561048357600080fd5b5061048c61172c565b6040516104999190613406565b60405180910390f35b3480156104ae57600080fd5b506104b76117be565b6040516104c491906133eb565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190612c1e565b6117d1565b60405161050191906133eb565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190612d61565b611827565b005b34801561053f57600080fd5b5061054861183d565b005b34801561055657600080fd5b50610571600480360381019061056c9190612cde565b6118e5565b005b34801561057f57600080fd5b50610588611947565b60405161059591906133eb565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c09190612ed5565b61195a565b005b3480156105d357600080fd5b506105dc6119e0565b6040516105e99190613768565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190612ed5565b6119e6565b6040516106269190613406565b60405180910390f35b34801561063b57600080fd5b50610644611a8d565b6040516106519190613768565b60405180910390f35b34801561066657600080fd5b5061066f611a93565b60405161067c9190613768565b60405180910390f35b34801561069157600080fd5b5061069a611a99565b6040516106a79190613768565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612c4b565b611a9f565b6040516106e491906133eb565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190612c1e565b611b33565b005b34801561072257600080fd5b5061073d60048036038101906107389190612c1e565b611c2b565b60405161074a91906133eb565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061082e575061082d82611c81565b5b9050919050565b6060600080546108449061398d565b80601f01602080910402602001604051908101604052809291908181526020018280546108709061398d565b80156108bd5780601f10610892576101008083540402835291602001916108bd565b820191906000526020600020905b8154815290600101906020018083116108a057829003601f168201915b5050505050905090565b60006108d282611ceb565b610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613628565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095782610d08565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bf90613668565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e7611d57565b73ffffffffffffffffffffffffffffffffffffffff161480610a165750610a1581610a10611d57565b611a9f565b5b610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90613568565b60405180910390fd5b610a5f8383611d5f565b505050565b610a6c611d57565b73ffffffffffffffffffffffffffffffffffffffff16610a8a611702565b73ffffffffffffffffffffffffffffffffffffffff1614610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790613648565b60405180910390fd5b8181600b9190610af19291906129f6565b505050565b610b07610b01611d57565b82611e18565b610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d906136e8565b60405180910390fd5b610b51838383611ef6565b505050565b610b5e611d57565b73ffffffffffffffffffffffffffffffffffffffff16610b7c611702565b73ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613648565b60405180910390fd5b6108ae82829050600754610be6919061381c565b1115610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e90613688565b60405180910390fd5b60005b82829050811015610cc7576001600c6000858585818110610c4e57610c4d613af7565b5b9050602002016020810190610c639190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cbf906139f0565b915050610c2a565b508181905060076000828254610cdd919061381c565b925050819055505050565b610d03838383604051806020016040528060008152506118e5565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da8906135a8565b60405180910390fd5b80915050919050565b600860009054906101000a900460ff16610e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e00906136c8565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90613508565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990613708565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610f9833600960008154610f8d906139f0565b91905081905561215d565b565b610fa2611d57565b73ffffffffffffffffffffffffffffffffffffffff16610fc0611702565b73ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90613648565b60405180910390fd5b6000828290501161105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105390613728565b60405180910390fd5b60038282905011156110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a906135e8565b60405180910390fd5b60005b828290508110156112ef57600c60008484848181106110c8576110c7613af7565b5b90506020020160208101906110dd9190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b906134c8565b60405180910390fd5b600d600084848481811061117b5761117a613af7565b5b90506020020160208101906111909190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90613708565b60405180910390fd5b6001600d600085858581811061123157611230613af7565b5b90506020020160208101906112469190612c1e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506112dc8383838181106112ad576112ac613af7565b5b90506020020160208101906112c29190612c1e565b6009600081546112d1906139f0565b91905081905561215d565b80806112e7906139f0565b9150506110a6565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613588565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113b4611d57565b73ffffffffffffffffffffffffffffffffffffffff166113d2611702565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613648565b60405180910390fd5b611432600061217b565b565b600860019054906101000a900460ff16611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613488565b60405180910390fd5b6108ae600754106114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090613688565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d906135c8565b60405180910390fd5b600a54341461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190613748565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060076000815480929190611605906139f0565b9190505550611612611702565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611657573d6000803e3d6000fd5b50565b611662611d57565b73ffffffffffffffffffffffffffffffffffffffff16611680611702565b73ffffffffffffffffffffffffffffffffffffffff16146116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613648565b60405180910390fd5b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461173b9061398d565b80601f01602080910402602001604051908101604052809291908181526020018280546117679061398d565b80156117b45780601f10611789576101008083540402835291602001916117b4565b820191906000526020600020905b81548152906001019060200180831161179757829003601f168201915b5050505050905090565b600860019054906101000a900460ff1681565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611839611832611d57565b8383612241565b5050565b611845611d57565b73ffffffffffffffffffffffffffffffffffffffff16611863611702565b73ffffffffffffffffffffffffffffffffffffffff16146118b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b090613648565b60405180910390fd5b600860019054906101000a900460ff1615600860016101000a81548160ff021916908315150217905550565b6118f66118f0611d57565b83611e18565b611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c906136e8565b60405180910390fd5b611941848484846123ae565b50505050565b600860009054906101000a900460ff1681565b611962611d57565b73ffffffffffffffffffffffffffffffffffffffff16611980611702565b73ffffffffffffffffffffffffffffffffffffffff16146119d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cd90613648565b60405180910390fd5b80600a8190555050565b600a5481565b60606119f182611ceb565b611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a27906136a8565b60405180910390fd5b6000611a3a61240a565b90506000815111611a5a5760405180602001604052806000815250611a85565b80611a648461249c565b604051602001611a75929190613360565b6040516020818303038152906040525b915050919050565b60095481565b60075481565b6108ae81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b3b611d57565b73ffffffffffffffffffffffffffffffffffffffff16611b59611702565b73ffffffffffffffffffffffffffffffffffffffff1614611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690613648565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1690613448565b60405180910390fd5b611c288161217b565b50565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dd283610d08565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e2382611ceb565b611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613548565b60405180910390fd5b6000611e6d83610d08565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611edc57508373ffffffffffffffffffffffffffffffffffffffff16611ec4846108c7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eed5750611eec8185611a9f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f1682610d08565b73ffffffffffffffffffffffffffffffffffffffff1614611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390613468565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd3906134e8565b60405180910390fd5b611fe78383836125fd565b611ff2600082611d5f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204291906138a3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612099919061381c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612158838383612602565b505050565b612177828260405180602001604052806000815250612607565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790613528565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123a191906133eb565b60405180910390a3505050565b6123b9848484611ef6565b6123c584848484612662565b612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613428565b60405180910390fd5b50505050565b6060600b80546124199061398d565b80601f01602080910402602001604051908101604052809291908181526020018280546124459061398d565b80156124925780601f1061246757610100808354040283529160200191612492565b820191906000526020600020905b81548152906001019060200180831161247557829003601f168201915b5050505050905090565b606060008214156124e4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f8565b600082905060005b600082146125165780806124ff906139f0565b915050600a8261250f9190613872565b91506124ec565b60008167ffffffffffffffff81111561253257612531613b26565b5b6040519080825280601f01601f1916602001820160405280156125645781602001600182028036833780820191505090505b5090505b600085146125f15760018261257d91906138a3565b9150600a8561258c9190613a39565b6030612598919061381c565b60f81b8183815181106125ae576125ad613af7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125ea9190613872565b9450612568565b8093505050505b919050565b505050565b505050565b61261183836127f9565b61261e6000848484612662565b61265d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265490613428565b60405180910390fd5b505050565b60006126838473ffffffffffffffffffffffffffffffffffffffff166129d3565b156127ec578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ac611d57565b8786866040518563ffffffff1660e01b81526004016126ce949392919061339f565b602060405180830381600087803b1580156126e857600080fd5b505af192505050801561271957506040513d601f19601f820116820180604052508101906127169190612e5b565b60015b61279c573d8060008114612749576040519150601f19603f3d011682016040523d82523d6000602084013e61274e565b606091505b50600081511415612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90613428565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f1565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286090613608565b60405180910390fd5b61287281611ceb565b156128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a9906134a8565b60405180910390fd5b6128be600083836125fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290e919061381c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129cf60008383612602565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612a029061398d565b90600052602060002090601f016020900481019282612a245760008555612a6b565b82601f10612a3d57803560ff1916838001178555612a6b565b82800160010185558215612a6b579182015b82811115612a6a578235825591602001919060010190612a4f565b5b509050612a789190612a7c565b5090565b5b80821115612a95576000816000905550600101612a7d565b5090565b6000612aac612aa7846137a8565b613783565b905082815260208101848484011115612ac857612ac7613b64565b5b612ad384828561394b565b509392505050565b600081359050612aea816142f2565b92915050565b60008083601f840112612b0657612b05613b5a565b5b8235905067ffffffffffffffff811115612b2357612b22613b55565b5b602083019150836020820283011115612b3f57612b3e613b5f565b5b9250929050565b600081359050612b5581614309565b92915050565b600081359050612b6a81614320565b92915050565b600081519050612b7f81614320565b92915050565b600082601f830112612b9a57612b99613b5a565b5b8135612baa848260208601612a99565b91505092915050565b60008083601f840112612bc957612bc8613b5a565b5b8235905067ffffffffffffffff811115612be657612be5613b55565b5b602083019150836001820283011115612c0257612c01613b5f565b5b9250929050565b600081359050612c1881614337565b92915050565b600060208284031215612c3457612c33613b6e565b5b6000612c4284828501612adb565b91505092915050565b60008060408385031215612c6257612c61613b6e565b5b6000612c7085828601612adb565b9250506020612c8185828601612adb565b9150509250929050565b600080600060608486031215612ca457612ca3613b6e565b5b6000612cb286828701612adb565b9350506020612cc386828701612adb565b9250506040612cd486828701612c09565b9150509250925092565b60008060008060808587031215612cf857612cf7613b6e565b5b6000612d0687828801612adb565b9450506020612d1787828801612adb565b9350506040612d2887828801612c09565b925050606085013567ffffffffffffffff811115612d4957612d48613b69565b5b612d5587828801612b85565b91505092959194509250565b60008060408385031215612d7857612d77613b6e565b5b6000612d8685828601612adb565b9250506020612d9785828601612b46565b9150509250929050565b60008060408385031215612db857612db7613b6e565b5b6000612dc685828601612adb565b9250506020612dd785828601612c09565b9150509250929050565b60008060208385031215612df857612df7613b6e565b5b600083013567ffffffffffffffff811115612e1657612e15613b69565b5b612e2285828601612af0565b92509250509250929050565b600060208284031215612e4457612e43613b6e565b5b6000612e5284828501612b5b565b91505092915050565b600060208284031215612e7157612e70613b6e565b5b6000612e7f84828501612b70565b91505092915050565b60008060208385031215612e9f57612e9e613b6e565b5b600083013567ffffffffffffffff811115612ebd57612ebc613b69565b5b612ec985828601612bb3565b92509250509250929050565b600060208284031215612eeb57612eea613b6e565b5b6000612ef984828501612c09565b91505092915050565b612f0b816138d7565b82525050565b612f1a816138e9565b82525050565b6000612f2b826137d9565b612f3581856137ef565b9350612f4581856020860161395a565b612f4e81613b73565b840191505092915050565b6000612f64826137e4565b612f6e8185613800565b9350612f7e81856020860161395a565b612f8781613b73565b840191505092915050565b6000612f9d826137e4565b612fa78185613811565b9350612fb781856020860161395a565b80840191505092915050565b6000612fd0603283613800565b9150612fdb82613b84565b604082019050919050565b6000612ff3602683613800565b9150612ffe82613bd3565b604082019050919050565b6000613016602583613800565b915061302182613c22565b604082019050919050565b6000613039603983613800565b915061304482613c71565b604082019050919050565b600061305c601c83613800565b915061306782613cc0565b602082019050919050565b600061307f603083613800565b915061308a82613ce9565b604082019050919050565b60006130a2602483613800565b91506130ad82613d38565b604082019050919050565b60006130c5603083613800565b91506130d082613d87565b604082019050919050565b60006130e8601983613800565b91506130f382613dd6565b602082019050919050565b600061310b602c83613800565b915061311682613dff565b604082019050919050565b600061312e603883613800565b915061313982613e4e565b604082019050919050565b6000613151602a83613800565b915061315c82613e9d565b604082019050919050565b6000613174602983613800565b915061317f82613eec565b604082019050919050565b6000613197603383613800565b91506131a282613f3b565b604082019050919050565b60006131ba602b83613800565b91506131c582613f8a565b604082019050919050565b60006131dd602083613800565b91506131e882613fd9565b602082019050919050565b6000613200602c83613800565b915061320b82614002565b604082019050919050565b6000613223602083613800565b915061322e82614051565b602082019050919050565b6000613246602183613800565b91506132518261407a565b604082019050919050565b6000613269602a83613800565b9150613274826140c9565b604082019050919050565b600061328c603883613800565b915061329782614118565b604082019050919050565b60006132af603183613800565b91506132ba82614167565b604082019050919050565b60006132d2603183613800565b91506132dd826141b6565b604082019050919050565b60006132f5603883613800565b915061330082614205565b604082019050919050565b6000613318602583613800565b915061332382614254565b604082019050919050565b600061333b603983613800565b9150613346826142a3565b604082019050919050565b61335a81613941565b82525050565b600061336c8285612f92565b91506133788284612f92565b91508190509392505050565b60006020820190506133996000830184612f02565b92915050565b60006080820190506133b46000830187612f02565b6133c16020830186612f02565b6133ce6040830185613351565b81810360608301526133e08184612f20565b905095945050505050565b60006020820190506134006000830184612f11565b92915050565b600060208201905081810360008301526134208184612f59565b905092915050565b6000602082019050818103600083015261344181612fc3565b9050919050565b6000602082019050818103600083015261346181612fe6565b9050919050565b6000602082019050818103600083015261348181613009565b9050919050565b600060208201905081810360008301526134a18161302c565b9050919050565b600060208201905081810360008301526134c18161304f565b9050919050565b600060208201905081810360008301526134e181613072565b9050919050565b6000602082019050818103600083015261350181613095565b9050919050565b60006020820190508181036000830152613521816130b8565b9050919050565b60006020820190508181036000830152613541816130db565b9050919050565b60006020820190508181036000830152613561816130fe565b9050919050565b6000602082019050818103600083015261358181613121565b9050919050565b600060208201905081810360008301526135a181613144565b9050919050565b600060208201905081810360008301526135c181613167565b9050919050565b600060208201905081810360008301526135e18161318a565b9050919050565b60006020820190508181036000830152613601816131ad565b9050919050565b60006020820190508181036000830152613621816131d0565b9050919050565b60006020820190508181036000830152613641816131f3565b9050919050565b6000602082019050818103600083015261366181613216565b9050919050565b6000602082019050818103600083015261368181613239565b9050919050565b600060208201905081810360008301526136a18161325c565b9050919050565b600060208201905081810360008301526136c18161327f565b9050919050565b600060208201905081810360008301526136e1816132a2565b9050919050565b60006020820190508181036000830152613701816132c5565b9050919050565b60006020820190508181036000830152613721816132e8565b9050919050565b600060208201905081810360008301526137418161330b565b9050919050565b600060208201905081810360008301526137618161332e565b9050919050565b600060208201905061377d6000830184613351565b92915050565b600061378d61379e565b905061379982826139bf565b919050565b6000604051905090565b600067ffffffffffffffff8211156137c3576137c2613b26565b5b6137cc82613b73565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061382782613941565b915061383283613941565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561386757613866613a6a565b5b828201905092915050565b600061387d82613941565b915061388883613941565b92508261389857613897613a99565b5b828204905092915050565b60006138ae82613941565b91506138b983613941565b9250828210156138cc576138cb613a6a565b5b828203905092915050565b60006138e282613921565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561397857808201518184015260208101905061395d565b83811115613987576000848401525b50505050565b600060028204905060018216806139a557607f821691505b602082108114156139b9576139b8613ac8565b5b50919050565b6139c882613b73565b810181811067ffffffffffffffff821117156139e7576139e6613b26565b5b80604052505050565b60006139fb82613941565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a2e57613a2d613a6a565b5b600182019050919050565b6000613a4482613941565b9150613a4f83613941565b925082613a5f57613a5e613a99565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2057686974656c6960008201527f737420726567697374726174696f6e20697320636c6f73656400000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5368696e7957686974656c69737465644e465444726f703a204164647265737360008201527f206e6f742077686974656c697374656400000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205573657220697360008201527f206e6f742077686974656c697374656400000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205573657220697360008201527f20616c7265616479207265676973746572656400000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a20546f6f206d616e60008201527f7920616464726573736573000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2057686974656c6960008201527f73742069732066756c6c00000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205552492071756560008201527f727920666f72206e6f6e6578697374656e7420746f6b656e0000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2053616c6520686160008201527f73206e6f74207374617274656420796574000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a205573657220686160008201527f7320616c726561647920636c61696d656420616e204e46540000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a204e6f206164647260008201527f6573736573000000000000000000000000000000000000000000000000000000602082015250565b7f5368696e7957686974656c69737465644e465444726f703a2057726f6e67206d60008201527f656d6265727368697020666565207472616e7366657272656400000000000000602082015250565b6142fb816138d7565b811461430657600080fd5b50565b614312816138e9565b811461431d57600080fd5b50565b614329816138f5565b811461433457600080fd5b50565b61434081613941565b811461434b57600080fd5b5056fea2646970667358221220837c311d7c28a78f7cb3354d2f9e6c2cb27ef4e6fb8df1c530bb300ac07767e564736f6c63430008070033
Deployed Bytecode Sourcemap
37236:6053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24061:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25006:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26565:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26088:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37890:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27315:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38292:565;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27725:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24700:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41448:656;;;;;;;;;;;;;:::i;:::-;;38991:1494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24430:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4799:103;;;;;;;;;;;;;:::i;:::-;;40560:880;;;:::i;:::-;;38047:94;;;;;;;;;;;;;:::i;:::-;;4148:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25175:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37460:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42333:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26858:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38149:135;;;;;;;;;;;;;:::i;:::-;;27981:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37426:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38865:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37542:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42589:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37508:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37377:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37329:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27084:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5057:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42148:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24061:305;24163:4;24215:25;24200:40;;;:11;:40;;;;:105;;;;24272:33;24257:48;;;:11;:48;;;;24200:105;:158;;;;24322:36;24346:11;24322:23;:36::i;:::-;24200:158;24180:178;;24061:305;;;:::o;25006:100::-;25060:13;25093:5;25086:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25006:100;:::o;26565:221::-;26641:7;26669:16;26677:7;26669;:16::i;:::-;26661:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26754:15;:24;26770:7;26754:24;;;;;;;;;;;;;;;;;;;;;26747:31;;26565:221;;;:::o;26088:411::-;26169:13;26185:23;26200:7;26185:14;:23::i;:::-;26169:39;;26233:5;26227:11;;:2;:11;;;;26219:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26327:5;26311:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26336:37;26353:5;26360:12;:10;:12::i;:::-;26336:16;:37::i;:::-;26311:62;26289:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26470:21;26479:2;26483:7;26470:8;:21::i;:::-;26158:341;26088:411;;:::o;37890:149::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38018:13:::1;;38002;:29;;;;;;;:::i;:::-;;37890:149:::0;;:::o;27315:339::-;27510:41;27529:12;:10;:12::i;:::-;27543:7;27510:18;:41::i;:::-;27502:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27618:28;27628:4;27634:2;27638:7;27618:9;:28::i;:::-;27315:339;;;:::o;38292:565::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37366:4:::1;38461:10;;:17;;38433:25;;:45;;;;:::i;:::-;:59;;38411:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;38594:20;38575:218;38648:10;;:17;;38633:12;:32;38575:218;;;38777:4;38721:27;:53;38749:10;;38760:12;38749:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;38721:53;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;38680:14;;;;;:::i;:::-;;;;38575:218;;;;38832:10;;:17;;38803:25;;:46;;;;;;;:::i;:::-;;;;;;;;38292:565:::0;;:::o;27725:185::-;27863:39;27880:4;27886:2;27890:7;27863:39;;;;;;;;;;;;:16;:39::i;:::-;27725:185;;;:::o;24700:239::-;24772:7;24792:13;24808:7;:16;24816:7;24808:16;;;;;;;;;;;;;;;;;;;;;24792:32;;24860:1;24843:19;;:5;:19;;;;24835:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24926:5;24919:12;;;24700:239;;;:::o;41448:656::-;41510:15;;;;;;;;;;;41488:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;41635:27;:39;41663:10;41635:39;;;;;;;;;;;;;;;;;;;;;;;;;41613:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;41784:35;:47;41820:10;41784:47;;;;;;;;;;;;;;;;;;;;;;;;;41783:48;41761:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;42019:4;41969:35;:47;42005:10;41969:47;;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;42059:37;42069:10;42083:12;;42081:14;;;;;:::i;:::-;;;;;;;42059:9;:37::i;:::-;41448:656::o;38991:1494::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39173:1:::1;39142:21;;:28;;:32;39120:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;39304:1;39272:21;;:28;;:33;;39250:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;39408:31;39389:1089;39484:21;;:28;;39458:23;:54;39389:1089;;;39660:27;:115;39710:21;;39732:23;39710:46;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39660:115;;;;;;;;;;;;;;;;;;;;;;;;;39634:225;;;;;;;;;;;;:::i;:::-;;;;;;;;;39901:35;:123;39959:21;;39981:23;39959:46;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;39901:123;;;;;;;;;;;;;;;;;;;;;;;;;39900:124;39874:242;;;;;;;;;;;;:::i;:::-;;;;;;;;;40296:4;40178:35;:115;40232:21;;40254:23;40232:46;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;40178:115;;;;;;;;;;;;;;;;:122;;;;;;;;;;;;;;;;;;40344;40372:21;;40394:23;40372:46;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;40439:12;;40437:14;;;;;:::i;:::-;;;;;;;40344:9;:122::i;:::-;39527:25;;;;;:::i;:::-;;;;39389:1089;;;;38991:1494:::0;;:::o;24430:208::-;24502:7;24547:1;24530:19;;:5;:19;;;;24522:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24614:9;:16;24624:5;24614:16;;;;;;;;;;;;;;;;24607:23;;24430:208;;;:::o;4799:103::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4864:30:::1;4891:1;4864:18;:30::i;:::-;4799:103::o:0;40560:880::-;40635:27;;;;;;;;;;;40613:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;37366:4;40780:25;;:38;40758:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;40922:27;:39;40950:10;40922:39;;;;;;;;;;;;;;;;;;;;;;;;;40921:40;40899:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;41086:13;;41073:9;:26;41051:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;41290:4;41248:27;:39;41276:10;41248:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41305:25;;:27;;;;;;;;;:::i;:::-;;;;;;41404:7;:5;:7::i;:::-;41396:25;;:36;41422:9;41396:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40560:880::o;38047:94::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38118:15:::1;;;;;;;;;;;38117:16;38099:15;;:34;;;;;;;;;;;;;;;;;;38047:94::o:0;4148:87::-;4194:7;4221:6;;;;;;;;;;;4214:13;;4148:87;:::o;25175:104::-;25231:13;25264:7;25257:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25175:104;:::o;37460:39::-;;;;;;;;;;;;;:::o;42333:150::-;42402:4;42426:35;:49;42462:12;42426:49;;;;;;;;;;;;;;;;;;;;;;;;;42419:56;;42333:150;;;:::o;26858:155::-;26953:52;26972:12;:10;:12::i;:::-;26986:8;26996;26953:18;:52::i;:::-;26858:155;;:::o;38149:135::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38249:27:::1;;;;;;;;;;;38248:28;38218:27;;:58;;;;;;;;;;;;;;;;;;38149:135::o:0;27981:328::-;28156:41;28175:12;:10;:12::i;:::-;28189:7;28156:18;:41::i;:::-;28148:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28262:39;28276:4;28282:2;28286:7;28295:5;28262:13;:39::i;:::-;27981:328;;;;:::o;37426:27::-;;;;;;;;;;;;;:::o;38865:118::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38961:14:::1;38945:13;:30;;;;38865:118:::0;:::o;37542:28::-;;;;:::o;42589:477::-;42707:13;42760:16;42768:7;42760;:16::i;:::-;42738:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;42873:21;42897:10;:8;:10::i;:::-;42873:34;;42962:1;42944:7;42938:21;:25;:120;;;;;;;;;;;;;;;;;43007:7;43016:18;:7;:16;:18::i;:::-;42990:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42938:120;42918:140;;;42589:477;;;:::o;37508:27::-;;;;:::o;37377:40::-;;;;:::o;37329:41::-;37366:4;37329:41;:::o;27084:164::-;27181:4;27205:18;:25;27224:5;27205:25;;;;;;;;;;;;;;;:35;27231:8;27205:35;;;;;;;;;;;;;;;;;;;;;;;;;27198:42;;27084:164;;;;:::o;5057:201::-;4379:12;:10;:12::i;:::-;4368:23;;:7;:5;:7::i;:::-;:23;;;4360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5166:1:::1;5146:22;;:8;:22;;;;5138:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5222:28;5241:8;5222:18;:28::i;:::-;5057:201:::0;:::o;42148:177::-;42247:4;42276:27;:41;42304:12;42276:41;;;;;;;;;;;;;;;;;;;;;;;;;42269:48;;42148:177;;;:::o;22507:157::-;22592:4;22631:25;22616:40;;;:11;:40;;;;22609:47;;22507:157;;;:::o;29819:127::-;29884:4;29936:1;29908:30;;:7;:16;29916:7;29908:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29901:37;;29819:127;;;:::o;2889:98::-;2942:7;2969:10;2962:17;;2889:98;:::o;33965:174::-;34067:2;34040:15;:24;34056:7;34040:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34123:7;34119:2;34085:46;;34094:23;34109:7;34094:14;:23::i;:::-;34085:46;;;;;;;;;;;;33965:174;;:::o;30113:348::-;30206:4;30231:16;30239:7;30231;:16::i;:::-;30223:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30307:13;30323:23;30338:7;30323:14;:23::i;:::-;30307:39;;30376:5;30365:16;;:7;:16;;;:51;;;;30409:7;30385:31;;:20;30397:7;30385:11;:20::i;:::-;:31;;;30365:51;:87;;;;30420:32;30437:5;30444:7;30420:16;:32::i;:::-;30365:87;30357:96;;;30113:348;;;;:::o;33222:625::-;33381:4;33354:31;;:23;33369:7;33354:14;:23::i;:::-;:31;;;33346:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33460:1;33446:16;;:2;:16;;;;33438:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33516:39;33537:4;33543:2;33547:7;33516:20;:39::i;:::-;33620:29;33637:1;33641:7;33620:8;:29::i;:::-;33681:1;33662:9;:15;33672:4;33662:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33710:1;33693:9;:13;33703:2;33693:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33741:2;33722:7;:16;33730:7;33722:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33780:7;33776:2;33761:27;;33770:4;33761:27;;;;;;;;;;;;33801:38;33821:4;33827:2;33831:7;33801:19;:38::i;:::-;33222:625;;;:::o;30803:110::-;30879:26;30889:2;30893:7;30879:26;;;;;;;;;;;;:9;:26::i;:::-;30803:110;;:::o;5418:191::-;5492:16;5511:6;;;;;;;;;;;5492:25;;5537:8;5528:6;;:17;;;;;;;;;;;;;;;;;;5592:8;5561:40;;5582:8;5561:40;;;;;;;;;;;;5481:128;5418:191;:::o;34281:315::-;34436:8;34427:17;;:5;:17;;;;34419:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34523:8;34485:18;:25;34504:5;34485:25;;;;;;;;;;;;;;;:35;34511:8;34485:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34569:8;34547:41;;34562:5;34547:41;;;34579:8;34547:41;;;;;;:::i;:::-;;;;;;;;34281:315;;;:::o;29191:::-;29348:28;29358:4;29364:2;29368:7;29348:9;:28::i;:::-;29395:48;29418:4;29424:2;29428:7;29437:5;29395:22;:48::i;:::-;29387:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29191:315;;;;:::o;43144:106::-;43196:13;43229;43222:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43144:106;:::o;466:723::-;522:13;752:1;743:5;:10;739:53;;;770:10;;;;;;;;;;;;;;;;;;;;;739:53;802:12;817:5;802:20;;833:14;858:78;873:1;865:4;:9;858:78;;891:8;;;;;:::i;:::-;;;;922:2;914:10;;;;;:::i;:::-;;;858:78;;;946:19;978:6;968:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;946:39;;996:154;1012:1;1003:5;:10;996:154;;1040:1;1030:11;;;;;:::i;:::-;;;1107:2;1099:5;:10;;;;:::i;:::-;1086:2;:24;;;;:::i;:::-;1073:39;;1056:6;1063;1056:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1136:2;1127:11;;;;;:::i;:::-;;;996:154;;;1174:6;1160:21;;;;;466:723;;;;:::o;36532:126::-;;;;:::o;37043:125::-;;;;:::o;31140:321::-;31270:18;31276:2;31280:7;31270:5;:18::i;:::-;31321:54;31352:1;31356:2;31360:7;31369:5;31321:22;:54::i;:::-;31299:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31140:321;;;:::o;35161:799::-;35316:4;35337:15;:2;:13;;;:15::i;:::-;35333:620;;;35389:2;35373:36;;;35410:12;:10;:12::i;:::-;35424:4;35430:7;35439:5;35373:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35369:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35632:1;35615:6;:13;:18;35611:272;;;35658:60;;;;;;;;;;:::i;:::-;;;;;;;;35611:272;35833:6;35827:13;35818:6;35814:2;35810:15;35803:38;35369:529;35506:41;;;35496:51;;;:6;:51;;;;35489:58;;;;;35333:620;35937:4;35930:11;;35161:799;;;;;;;:::o;31797:439::-;31891:1;31877:16;;:2;:16;;;;31869:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31950:16;31958:7;31950;:16::i;:::-;31949:17;31941:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32012:45;32041:1;32045:2;32049:7;32012:20;:45::i;:::-;32087:1;32070:9;:13;32080:2;32070:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32118:2;32099:7;:16;32107:7;32099:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32163:7;32159:2;32138:33;;32155:1;32138:33;;;;;;;;;;;;32184:44;32212:1;32216:2;32220:7;32184:19;:44::i;:::-;31797:439;;:::o;14389:326::-;14449:4;14706:1;14684:7;:19;;;:23;14677:30;;14389:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1959:553::-;2017:8;2027:6;2077:3;2070:4;2062:6;2058:17;2054:27;2044:122;;2085:79;;:::i;:::-;2044:122;2198:6;2185:20;2175:30;;2228:18;2220:6;2217:30;2214:117;;;2250:79;;:::i;:::-;2214:117;2364:4;2356:6;2352:17;2340:29;;2418:3;2410:4;2402:6;2398:17;2388:8;2384:32;2381:41;2378:128;;;2425:79;;:::i;:::-;2378:128;1959:553;;;;;:::o;2518:139::-;2564:5;2602:6;2589:20;2580:29;;2618:33;2645:5;2618:33;:::i;:::-;2518:139;;;;:::o;2663:329::-;2722:6;2771:2;2759:9;2750:7;2746:23;2742:32;2739:119;;;2777:79;;:::i;:::-;2739:119;2897:1;2922:53;2967:7;2958:6;2947:9;2943:22;2922:53;:::i;:::-;2912:63;;2868:117;2663:329;;;;:::o;2998:474::-;3066:6;3074;3123:2;3111:9;3102:7;3098:23;3094:32;3091:119;;;3129:79;;:::i;:::-;3091:119;3249:1;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3220:117;3376:2;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3347:118;2998:474;;;;;:::o;3478:619::-;3555:6;3563;3571;3620:2;3608:9;3599:7;3595:23;3591:32;3588:119;;;3626:79;;:::i;:::-;3588:119;3746:1;3771:53;3816:7;3807:6;3796:9;3792:22;3771:53;:::i;:::-;3761:63;;3717:117;3873:2;3899:53;3944:7;3935:6;3924:9;3920:22;3899:53;:::i;:::-;3889:63;;3844:118;4001:2;4027:53;4072:7;4063:6;4052:9;4048:22;4027:53;:::i;:::-;4017:63;;3972:118;3478:619;;;;;:::o;4103:943::-;4198:6;4206;4214;4222;4271:3;4259:9;4250:7;4246:23;4242:33;4239:120;;;4278:79;;:::i;:::-;4239:120;4398:1;4423:53;4468:7;4459:6;4448:9;4444:22;4423:53;:::i;:::-;4413:63;;4369:117;4525:2;4551:53;4596:7;4587:6;4576:9;4572:22;4551:53;:::i;:::-;4541:63;;4496:118;4653:2;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4624:118;4809:2;4798:9;4794:18;4781:32;4840:18;4832:6;4829:30;4826:117;;;4862:79;;:::i;:::-;4826:117;4967:62;5021:7;5012:6;5001:9;4997:22;4967:62;:::i;:::-;4957:72;;4752:287;4103:943;;;;;;;:::o;5052:468::-;5117:6;5125;5174:2;5162:9;5153:7;5149:23;5145:32;5142:119;;;5180:79;;:::i;:::-;5142:119;5300:1;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5271:117;5427:2;5453:50;5495:7;5486:6;5475:9;5471:22;5453:50;:::i;:::-;5443:60;;5398:115;5052:468;;;;;:::o;5526:474::-;5594:6;5602;5651:2;5639:9;5630:7;5626:23;5622:32;5619:119;;;5657:79;;:::i;:::-;5619:119;5777:1;5802:53;5847:7;5838:6;5827:9;5823:22;5802:53;:::i;:::-;5792:63;;5748:117;5904:2;5930:53;5975:7;5966:6;5955:9;5951:22;5930:53;:::i;:::-;5920:63;;5875:118;5526:474;;;;;:::o;6006:559::-;6092:6;6100;6149:2;6137:9;6128:7;6124:23;6120:32;6117:119;;;6155:79;;:::i;:::-;6117:119;6303:1;6292:9;6288:17;6275:31;6333:18;6325:6;6322:30;6319:117;;;6355:79;;:::i;:::-;6319:117;6468:80;6540:7;6531:6;6520:9;6516:22;6468:80;:::i;:::-;6450:98;;;;6246:312;6006:559;;;;;:::o;6571:327::-;6629:6;6678:2;6666:9;6657:7;6653:23;6649:32;6646:119;;;6684:79;;:::i;:::-;6646:119;6804:1;6829:52;6873:7;6864:6;6853:9;6849:22;6829:52;:::i;:::-;6819:62;;6775:116;6571:327;;;;:::o;6904:349::-;6973:6;7022:2;7010:9;7001:7;6997:23;6993:32;6990:119;;;7028:79;;:::i;:::-;6990:119;7148:1;7173:63;7228:7;7219:6;7208:9;7204:22;7173:63;:::i;:::-;7163:73;;7119:127;6904:349;;;;:::o;7259:529::-;7330:6;7338;7387:2;7375:9;7366:7;7362:23;7358:32;7355:119;;;7393:79;;:::i;:::-;7355:119;7541:1;7530:9;7526:17;7513:31;7571:18;7563:6;7560:30;7557:117;;;7593:79;;:::i;:::-;7557:117;7706:65;7763:7;7754:6;7743:9;7739:22;7706:65;:::i;:::-;7688:83;;;;7484:297;7259:529;;;;;:::o;7794:329::-;7853:6;7902:2;7890:9;7881:7;7877:23;7873:32;7870:119;;;7908:79;;:::i;:::-;7870:119;8028:1;8053:53;8098:7;8089:6;8078:9;8074:22;8053:53;:::i;:::-;8043:63;;7999:117;7794:329;;;;:::o;8129:118::-;8216:24;8234:5;8216:24;:::i;:::-;8211:3;8204:37;8129:118;;:::o;8253:109::-;8334:21;8349:5;8334:21;:::i;:::-;8329:3;8322:34;8253:109;;:::o;8368:360::-;8454:3;8482:38;8514:5;8482:38;:::i;:::-;8536:70;8599:6;8594:3;8536:70;:::i;:::-;8529:77;;8615:52;8660:6;8655:3;8648:4;8641:5;8637:16;8615:52;:::i;:::-;8692:29;8714:6;8692:29;:::i;:::-;8687:3;8683:39;8676:46;;8458:270;8368:360;;;;:::o;8734:364::-;8822:3;8850:39;8883:5;8850:39;:::i;:::-;8905:71;8969:6;8964:3;8905:71;:::i;:::-;8898:78;;8985:52;9030:6;9025:3;9018:4;9011:5;9007:16;8985:52;:::i;:::-;9062:29;9084:6;9062:29;:::i;:::-;9057:3;9053:39;9046:46;;8826:272;8734:364;;;;:::o;9104:377::-;9210:3;9238:39;9271:5;9238:39;:::i;:::-;9293:89;9375:6;9370:3;9293:89;:::i;:::-;9286:96;;9391:52;9436:6;9431:3;9424:4;9417:5;9413:16;9391:52;:::i;:::-;9468:6;9463:3;9459:16;9452:23;;9214:267;9104:377;;;;:::o;9487:366::-;9629:3;9650:67;9714:2;9709:3;9650:67;:::i;:::-;9643:74;;9726:93;9815:3;9726:93;:::i;:::-;9844:2;9839:3;9835:12;9828:19;;9487:366;;;:::o;9859:::-;10001:3;10022:67;10086:2;10081:3;10022:67;:::i;:::-;10015:74;;10098:93;10187:3;10098:93;:::i;:::-;10216:2;10211:3;10207:12;10200:19;;9859:366;;;:::o;10231:::-;10373:3;10394:67;10458:2;10453:3;10394:67;:::i;:::-;10387:74;;10470:93;10559:3;10470:93;:::i;:::-;10588:2;10583:3;10579:12;10572:19;;10231:366;;;:::o;10603:::-;10745:3;10766:67;10830:2;10825:3;10766:67;:::i;:::-;10759:74;;10842:93;10931:3;10842:93;:::i;:::-;10960:2;10955:3;10951:12;10944:19;;10603:366;;;:::o;10975:::-;11117:3;11138:67;11202:2;11197:3;11138:67;:::i;:::-;11131:74;;11214:93;11303:3;11214:93;:::i;:::-;11332:2;11327:3;11323:12;11316:19;;10975:366;;;:::o;11347:::-;11489:3;11510:67;11574:2;11569:3;11510:67;:::i;:::-;11503:74;;11586:93;11675:3;11586:93;:::i;:::-;11704:2;11699:3;11695:12;11688:19;;11347:366;;;:::o;11719:::-;11861:3;11882:67;11946:2;11941:3;11882:67;:::i;:::-;11875:74;;11958:93;12047:3;11958:93;:::i;:::-;12076:2;12071:3;12067:12;12060:19;;11719:366;;;:::o;12091:::-;12233:3;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12330:93;12419:3;12330:93;:::i;:::-;12448:2;12443:3;12439:12;12432:19;;12091:366;;;:::o;12463:::-;12605:3;12626:67;12690:2;12685:3;12626:67;:::i;:::-;12619:74;;12702:93;12791:3;12702:93;:::i;:::-;12820:2;12815:3;12811:12;12804:19;;12463:366;;;:::o;12835:::-;12977:3;12998:67;13062:2;13057:3;12998:67;:::i;:::-;12991:74;;13074:93;13163:3;13074:93;:::i;:::-;13192:2;13187:3;13183:12;13176:19;;12835:366;;;:::o;13207:::-;13349:3;13370:67;13434:2;13429:3;13370:67;:::i;:::-;13363:74;;13446:93;13535:3;13446:93;:::i;:::-;13564:2;13559:3;13555:12;13548:19;;13207:366;;;:::o;13579:::-;13721:3;13742:67;13806:2;13801:3;13742:67;:::i;:::-;13735:74;;13818:93;13907:3;13818:93;:::i;:::-;13936:2;13931:3;13927:12;13920:19;;13579:366;;;:::o;13951:::-;14093:3;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14190:93;14279:3;14190:93;:::i;:::-;14308:2;14303:3;14299:12;14292:19;;13951:366;;;:::o;14323:::-;14465:3;14486:67;14550:2;14545:3;14486:67;:::i;:::-;14479:74;;14562:93;14651:3;14562:93;:::i;:::-;14680:2;14675:3;14671:12;14664:19;;14323:366;;;:::o;14695:::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:::-;15209:3;15230:67;15294:2;15289:3;15230:67;:::i;:::-;15223:74;;15306:93;15395:3;15306:93;:::i;:::-;15424:2;15419:3;15415:12;15408:19;;15067:366;;;:::o;15439:::-;15581:3;15602:67;15666:2;15661:3;15602:67;:::i;:::-;15595:74;;15678:93;15767:3;15678:93;:::i;:::-;15796:2;15791:3;15787:12;15780:19;;15439:366;;;:::o;15811:::-;15953:3;15974:67;16038:2;16033:3;15974:67;:::i;:::-;15967:74;;16050:93;16139:3;16050:93;:::i;:::-;16168:2;16163:3;16159:12;16152:19;;15811:366;;;:::o;16183:::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:::-;17441:3;17462:67;17526:2;17521:3;17462:67;:::i;:::-;17455:74;;17538:93;17627:3;17538:93;:::i;:::-;17656:2;17651:3;17647:12;17640:19;;17299:366;;;:::o;17671:::-;17813:3;17834:67;17898:2;17893:3;17834:67;:::i;:::-;17827:74;;17910:93;17999:3;17910:93;:::i;:::-;18028:2;18023:3;18019:12;18012:19;;17671:366;;;:::o;18043:::-;18185:3;18206:67;18270:2;18265:3;18206:67;:::i;:::-;18199:74;;18282:93;18371:3;18282:93;:::i;:::-;18400:2;18395:3;18391:12;18384:19;;18043:366;;;:::o;18415:::-;18557:3;18578:67;18642:2;18637:3;18578:67;:::i;:::-;18571:74;;18654:93;18743:3;18654:93;:::i;:::-;18772:2;18767:3;18763:12;18756:19;;18415:366;;;:::o;18787:::-;18929:3;18950:67;19014:2;19009:3;18950:67;:::i;:::-;18943:74;;19026:93;19115:3;19026:93;:::i;:::-;19144:2;19139:3;19135:12;19128:19;;18787:366;;;:::o;19159:118::-;19246:24;19264:5;19246:24;:::i;:::-;19241:3;19234:37;19159:118;;:::o;19283:435::-;19463:3;19485:95;19576:3;19567:6;19485:95;:::i;:::-;19478:102;;19597:95;19688:3;19679:6;19597:95;:::i;:::-;19590:102;;19709:3;19702:10;;19283:435;;;;;:::o;19724:222::-;19817:4;19855:2;19844:9;19840:18;19832:26;;19868:71;19936:1;19925:9;19921:17;19912:6;19868:71;:::i;:::-;19724:222;;;;:::o;19952:640::-;20147:4;20185:3;20174:9;20170:19;20162:27;;20199:71;20267:1;20256:9;20252:17;20243:6;20199:71;:::i;:::-;20280:72;20348:2;20337:9;20333:18;20324:6;20280:72;:::i;:::-;20362;20430:2;20419:9;20415:18;20406:6;20362:72;:::i;:::-;20481:9;20475:4;20471:20;20466:2;20455:9;20451:18;20444:48;20509:76;20580:4;20571:6;20509:76;:::i;:::-;20501:84;;19952:640;;;;;;;:::o;20598:210::-;20685:4;20723:2;20712:9;20708:18;20700:26;;20736:65;20798:1;20787:9;20783:17;20774:6;20736:65;:::i;:::-;20598:210;;;;:::o;20814:313::-;20927:4;20965:2;20954:9;20950:18;20942:26;;21014:9;21008:4;21004:20;21000:1;20989:9;20985:17;20978:47;21042:78;21115:4;21106:6;21042:78;:::i;:::-;21034:86;;20814:313;;;;:::o;21133:419::-;21299:4;21337:2;21326:9;21322:18;21314:26;;21386:9;21380:4;21376:20;21372:1;21361:9;21357:17;21350:47;21414:131;21540:4;21414:131;:::i;:::-;21406:139;;21133:419;;;:::o;21558:::-;21724:4;21762:2;21751:9;21747:18;21739:26;;21811:9;21805:4;21801:20;21797:1;21786:9;21782:17;21775:47;21839:131;21965:4;21839:131;:::i;:::-;21831:139;;21558:419;;;:::o;21983:::-;22149:4;22187:2;22176:9;22172:18;22164:26;;22236:9;22230:4;22226:20;22222:1;22211:9;22207:17;22200:47;22264:131;22390:4;22264:131;:::i;:::-;22256:139;;21983:419;;;:::o;22408:::-;22574:4;22612:2;22601:9;22597:18;22589:26;;22661:9;22655:4;22651:20;22647:1;22636:9;22632:17;22625:47;22689:131;22815:4;22689:131;:::i;:::-;22681:139;;22408:419;;;:::o;22833:::-;22999:4;23037:2;23026:9;23022:18;23014:26;;23086:9;23080:4;23076:20;23072:1;23061:9;23057:17;23050:47;23114:131;23240:4;23114:131;:::i;:::-;23106:139;;22833:419;;;:::o;23258:::-;23424:4;23462:2;23451:9;23447:18;23439:26;;23511:9;23505:4;23501:20;23497:1;23486:9;23482:17;23475:47;23539:131;23665:4;23539:131;:::i;:::-;23531:139;;23258:419;;;:::o;23683:::-;23849:4;23887:2;23876:9;23872:18;23864:26;;23936:9;23930:4;23926:20;23922:1;23911:9;23907:17;23900:47;23964:131;24090:4;23964:131;:::i;:::-;23956:139;;23683:419;;;:::o;24108:::-;24274:4;24312:2;24301:9;24297:18;24289:26;;24361:9;24355:4;24351:20;24347:1;24336:9;24332:17;24325:47;24389:131;24515:4;24389:131;:::i;:::-;24381:139;;24108:419;;;:::o;24533:::-;24699:4;24737:2;24726:9;24722:18;24714:26;;24786:9;24780:4;24776:20;24772:1;24761:9;24757:17;24750:47;24814:131;24940:4;24814:131;:::i;:::-;24806:139;;24533:419;;;:::o;24958:::-;25124:4;25162:2;25151:9;25147:18;25139:26;;25211:9;25205:4;25201:20;25197:1;25186:9;25182:17;25175:47;25239:131;25365:4;25239:131;:::i;:::-;25231:139;;24958:419;;;:::o;25383:::-;25549:4;25587:2;25576:9;25572:18;25564:26;;25636:9;25630:4;25626:20;25622:1;25611:9;25607:17;25600:47;25664:131;25790:4;25664:131;:::i;:::-;25656:139;;25383:419;;;:::o;25808:::-;25974:4;26012:2;26001:9;25997:18;25989:26;;26061:9;26055:4;26051:20;26047:1;26036:9;26032:17;26025:47;26089:131;26215:4;26089:131;:::i;:::-;26081:139;;25808:419;;;:::o;26233:::-;26399:4;26437:2;26426:9;26422:18;26414:26;;26486:9;26480:4;26476:20;26472:1;26461:9;26457:17;26450:47;26514:131;26640:4;26514:131;:::i;:::-;26506:139;;26233:419;;;:::o;26658:::-;26824:4;26862:2;26851:9;26847:18;26839:26;;26911:9;26905:4;26901:20;26897:1;26886:9;26882:17;26875:47;26939:131;27065:4;26939:131;:::i;:::-;26931:139;;26658:419;;;:::o;27083:::-;27249:4;27287:2;27276:9;27272:18;27264:26;;27336:9;27330:4;27326:20;27322:1;27311:9;27307:17;27300:47;27364:131;27490:4;27364:131;:::i;:::-;27356:139;;27083:419;;;:::o;27508:::-;27674:4;27712:2;27701:9;27697:18;27689:26;;27761:9;27755:4;27751:20;27747:1;27736:9;27732:17;27725:47;27789:131;27915:4;27789:131;:::i;:::-;27781:139;;27508:419;;;:::o;27933:::-;28099:4;28137:2;28126:9;28122:18;28114:26;;28186:9;28180:4;28176:20;28172:1;28161:9;28157:17;28150:47;28214:131;28340:4;28214:131;:::i;:::-;28206:139;;27933:419;;;:::o;28358:::-;28524:4;28562:2;28551:9;28547:18;28539:26;;28611:9;28605:4;28601:20;28597:1;28586:9;28582:17;28575:47;28639:131;28765:4;28639:131;:::i;:::-;28631:139;;28358:419;;;:::o;28783:::-;28949:4;28987:2;28976:9;28972:18;28964:26;;29036:9;29030:4;29026:20;29022:1;29011:9;29007:17;29000:47;29064:131;29190:4;29064:131;:::i;:::-;29056:139;;28783:419;;;:::o;29208:::-;29374:4;29412:2;29401:9;29397:18;29389:26;;29461:9;29455:4;29451:20;29447:1;29436:9;29432:17;29425:47;29489:131;29615:4;29489:131;:::i;:::-;29481:139;;29208:419;;;:::o;29633:::-;29799:4;29837:2;29826:9;29822:18;29814:26;;29886:9;29880:4;29876:20;29872:1;29861:9;29857:17;29850:47;29914:131;30040:4;29914:131;:::i;:::-;29906:139;;29633:419;;;:::o;30058:::-;30224:4;30262:2;30251:9;30247:18;30239:26;;30311:9;30305:4;30301:20;30297:1;30286:9;30282:17;30275:47;30339:131;30465:4;30339:131;:::i;:::-;30331:139;;30058:419;;;:::o;30483:::-;30649:4;30687:2;30676:9;30672:18;30664:26;;30736:9;30730:4;30726:20;30722:1;30711:9;30707:17;30700:47;30764:131;30890:4;30764:131;:::i;:::-;30756:139;;30483:419;;;:::o;30908:::-;31074:4;31112:2;31101:9;31097:18;31089:26;;31161:9;31155:4;31151:20;31147:1;31136:9;31132:17;31125:47;31189:131;31315:4;31189:131;:::i;:::-;31181:139;;30908:419;;;:::o;31333:::-;31499:4;31537:2;31526:9;31522:18;31514:26;;31586:9;31580:4;31576:20;31572:1;31561:9;31557:17;31550:47;31614:131;31740:4;31614:131;:::i;:::-;31606:139;;31333:419;;;:::o;31758:::-;31924:4;31962:2;31951:9;31947:18;31939:26;;32011:9;32005:4;32001:20;31997:1;31986:9;31982:17;31975:47;32039:131;32165:4;32039:131;:::i;:::-;32031:139;;31758:419;;;:::o;32183:222::-;32276:4;32314:2;32303:9;32299:18;32291:26;;32327:71;32395:1;32384:9;32380:17;32371:6;32327:71;:::i;:::-;32183:222;;;;:::o;32411:129::-;32445:6;32472:20;;:::i;:::-;32462:30;;32501:33;32529:4;32521:6;32501:33;:::i;:::-;32411:129;;;:::o;32546:75::-;32579:6;32612:2;32606:9;32596:19;;32546:75;:::o;32627:307::-;32688:4;32778:18;32770:6;32767:30;32764:56;;;32800:18;;:::i;:::-;32764:56;32838:29;32860:6;32838:29;:::i;:::-;32830:37;;32922:4;32916;32912:15;32904:23;;32627:307;;;:::o;32940:98::-;32991:6;33025:5;33019:12;33009:22;;32940:98;;;:::o;33044:99::-;33096:6;33130:5;33124:12;33114:22;;33044:99;;;:::o;33149:168::-;33232:11;33266:6;33261:3;33254:19;33306:4;33301:3;33297:14;33282:29;;33149:168;;;;:::o;33323:169::-;33407:11;33441:6;33436:3;33429:19;33481:4;33476:3;33472:14;33457:29;;33323:169;;;;:::o;33498:148::-;33600:11;33637:3;33622:18;;33498:148;;;;:::o;33652:305::-;33692:3;33711:20;33729:1;33711:20;:::i;:::-;33706:25;;33745:20;33763:1;33745:20;:::i;:::-;33740:25;;33899:1;33831:66;33827:74;33824:1;33821:81;33818:107;;;33905:18;;:::i;:::-;33818:107;33949:1;33946;33942:9;33935:16;;33652:305;;;;:::o;33963:185::-;34003:1;34020:20;34038:1;34020:20;:::i;:::-;34015:25;;34054:20;34072:1;34054:20;:::i;:::-;34049:25;;34093:1;34083:35;;34098:18;;:::i;:::-;34083:35;34140:1;34137;34133:9;34128:14;;33963:185;;;;:::o;34154:191::-;34194:4;34214:20;34232:1;34214:20;:::i;:::-;34209:25;;34248:20;34266:1;34248:20;:::i;:::-;34243:25;;34287:1;34284;34281:8;34278:34;;;34292:18;;:::i;:::-;34278:34;34337:1;34334;34330:9;34322:17;;34154:191;;;;:::o;34351:96::-;34388:7;34417:24;34435:5;34417:24;:::i;:::-;34406:35;;34351:96;;;:::o;34453:90::-;34487:7;34530:5;34523:13;34516:21;34505:32;;34453:90;;;:::o;34549:149::-;34585:7;34625:66;34618:5;34614:78;34603:89;;34549:149;;;:::o;34704:126::-;34741:7;34781:42;34774:5;34770:54;34759:65;;34704:126;;;:::o;34836:77::-;34873:7;34902:5;34891:16;;34836:77;;;:::o;34919:154::-;35003:6;34998:3;34993;34980:30;35065:1;35056:6;35051:3;35047:16;35040:27;34919:154;;;:::o;35079:307::-;35147:1;35157:113;35171:6;35168:1;35165:13;35157:113;;;35256:1;35251:3;35247:11;35241:18;35237:1;35232:3;35228:11;35221:39;35193:2;35190:1;35186:10;35181:15;;35157:113;;;35288:6;35285:1;35282:13;35279:101;;;35368:1;35359:6;35354:3;35350:16;35343:27;35279:101;35128:258;35079:307;;;:::o;35392:320::-;35436:6;35473:1;35467:4;35463:12;35453:22;;35520:1;35514:4;35510:12;35541:18;35531:81;;35597:4;35589:6;35585:17;35575:27;;35531:81;35659:2;35651:6;35648:14;35628:18;35625:38;35622:84;;;35678:18;;:::i;:::-;35622:84;35443:269;35392:320;;;:::o;35718:281::-;35801:27;35823:4;35801:27;:::i;:::-;35793:6;35789:40;35931:6;35919:10;35916:22;35895:18;35883:10;35880:34;35877:62;35874:88;;;35942:18;;:::i;:::-;35874:88;35982:10;35978:2;35971:22;35761:238;35718:281;;:::o;36005:233::-;36044:3;36067:24;36085:5;36067:24;:::i;:::-;36058:33;;36113:66;36106:5;36103:77;36100:103;;;36183:18;;:::i;:::-;36100:103;36230:1;36223:5;36219:13;36212:20;;36005:233;;;:::o;36244:176::-;36276:1;36293:20;36311:1;36293:20;:::i;:::-;36288:25;;36327:20;36345:1;36327:20;:::i;:::-;36322:25;;36366:1;36356:35;;36371:18;;:::i;:::-;36356:35;36412:1;36409;36405:9;36400:14;;36244:176;;;;:::o;36426:180::-;36474:77;36471:1;36464:88;36571:4;36568:1;36561:15;36595:4;36592:1;36585:15;36612:180;36660:77;36657:1;36650:88;36757:4;36754:1;36747:15;36781:4;36778:1;36771:15;36798:180;36846:77;36843:1;36836:88;36943:4;36940:1;36933:15;36967:4;36964:1;36957:15;36984:180;37032:77;37029:1;37022:88;37129:4;37126:1;37119:15;37153:4;37150:1;37143:15;37170:180;37218:77;37215:1;37208:88;37315:4;37312:1;37305:15;37339:4;37336:1;37329:15;37356:117;37465:1;37462;37455:12;37479:117;37588:1;37585;37578:12;37602:117;37711:1;37708;37701:12;37725:117;37834:1;37831;37824:12;37848:117;37957:1;37954;37947:12;37971:117;38080:1;38077;38070:12;38094:102;38135:6;38186:2;38182:7;38177:2;38170:5;38166:14;38162:28;38152:38;;38094:102;;;:::o;38202:237::-;38342:34;38338:1;38330:6;38326:14;38319:58;38411:20;38406:2;38398:6;38394:15;38387:45;38202:237;:::o;38445:225::-;38585:34;38581:1;38573:6;38569:14;38562:58;38654:8;38649:2;38641:6;38637:15;38630:33;38445:225;:::o;38676:224::-;38816:34;38812:1;38804:6;38800:14;38793:58;38885:7;38880:2;38872:6;38868:15;38861:32;38676:224;:::o;38906:244::-;39046:34;39042:1;39034:6;39030:14;39023:58;39115:27;39110:2;39102:6;39098:15;39091:52;38906:244;:::o;39156:178::-;39296:30;39292:1;39284:6;39280:14;39273:54;39156:178;:::o;39340:235::-;39480:34;39476:1;39468:6;39464:14;39457:58;39549:18;39544:2;39536:6;39532:15;39525:43;39340:235;:::o;39581:223::-;39721:34;39717:1;39709:6;39705:14;39698:58;39790:6;39785:2;39777:6;39773:15;39766:31;39581:223;:::o;39810:235::-;39950:34;39946:1;39938:6;39934:14;39927:58;40019:18;40014:2;40006:6;40002:15;39995:43;39810:235;:::o;40051:175::-;40191:27;40187:1;40179:6;40175:14;40168:51;40051:175;:::o;40232:231::-;40372:34;40368:1;40360:6;40356:14;40349:58;40441:14;40436:2;40428:6;40424:15;40417:39;40232:231;:::o;40469:243::-;40609:34;40605:1;40597:6;40593:14;40586:58;40678:26;40673:2;40665:6;40661:15;40654:51;40469:243;:::o;40718:229::-;40858:34;40854:1;40846:6;40842:14;40835:58;40927:12;40922:2;40914:6;40910:15;40903:37;40718:229;:::o;40953:228::-;41093:34;41089:1;41081:6;41077:14;41070:58;41162:11;41157:2;41149:6;41145:15;41138:36;40953:228;:::o;41187:238::-;41327:34;41323:1;41315:6;41311:14;41304:58;41396:21;41391:2;41383:6;41379:15;41372:46;41187:238;:::o;41431:230::-;41571:34;41567:1;41559:6;41555:14;41548:58;41640:13;41635:2;41627:6;41623:15;41616:38;41431:230;:::o;41667:182::-;41807:34;41803:1;41795:6;41791:14;41784:58;41667:182;:::o;41855:231::-;41995:34;41991:1;41983:6;41979:14;41972:58;42064:14;42059:2;42051:6;42047:15;42040:39;41855:231;:::o;42092:182::-;42232:34;42228:1;42220:6;42216:14;42209:58;42092:182;:::o;42280:220::-;42420:34;42416:1;42408:6;42404:14;42397:58;42489:3;42484:2;42476:6;42472:15;42465:28;42280:220;:::o;42506:229::-;42646:34;42642:1;42634:6;42630:14;42623:58;42715:12;42710:2;42702:6;42698:15;42691:37;42506:229;:::o;42741:243::-;42881:34;42877:1;42869:6;42865:14;42858:58;42950:26;42945:2;42937:6;42933:15;42926:51;42741:243;:::o;42990:236::-;43130:34;43126:1;43118:6;43114:14;43107:58;43199:19;43194:2;43186:6;43182:15;43175:44;42990:236;:::o;43232:::-;43372:34;43368:1;43360:6;43356:14;43349:58;43441:19;43436:2;43428:6;43424:15;43417:44;43232:236;:::o;43474:243::-;43614:34;43610:1;43602:6;43598:14;43591:58;43683:26;43678:2;43670:6;43666:15;43659:51;43474:243;:::o;43723:224::-;43863:34;43859:1;43851:6;43847:14;43840:58;43932:7;43927:2;43919:6;43915:15;43908:32;43723:224;:::o;43953:244::-;44093:34;44089:1;44081:6;44077:14;44070:58;44162:27;44157:2;44149:6;44145:15;44138:52;43953:244;:::o;44203:122::-;44276:24;44294:5;44276:24;:::i;:::-;44269:5;44266:35;44256:63;;44315:1;44312;44305:12;44256:63;44203:122;:::o;44331:116::-;44401:21;44416:5;44401:21;:::i;:::-;44394:5;44391:32;44381:60;;44437:1;44434;44427:12;44381:60;44331:116;:::o;44453:120::-;44525:23;44542:5;44525:23;:::i;:::-;44518:5;44515:34;44505:62;;44563:1;44560;44553:12;44505:62;44453:120;:::o;44579:122::-;44652:24;44670:5;44652:24;:::i;:::-;44645:5;44642:35;44632:63;;44691:1;44688;44681:12;44632:63;44579:122;:::o
Swarm Source
ipfs://837c311d7c28a78f7cb3354d2f9e6c2cb27ef4e6fb8df1c530bb300ac07767e5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.