ETH Price: $3,101.79 (+1.36%)
Gas: 7 Gwei

Token

WastedWhales (WW)
 

Overview

Max Total Supply

800 WW

Holders

126

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WW
0xbacf190b02b6f6f494489c8b4b29b06ba4cb3873
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to Wasted World. The first collection, The Pregame, consists of 800 whales divided into 4 distinct tribes.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WastedWhales

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-16
*/

// SPDX-License-Identifier: MIT
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);
	}
}

/**
 * @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);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
	/**
	 * @dev Returns true if `account` is a contract.
	 *
	 * [IMPORTANT]
	 * ====
	 * It is unsafe to assume that an address for which this function returns
	 * false is an externally-owned account (EOA) and not a contract.
	 *
	 * Among others, `isContract` will return false for the following
	 * types of addresses:
	 *
	 *  - an externally-owned account
	 *  - a contract in construction
	 *  - an address where a contract will be created
	 *  - an address where a contract lived, but was destroyed
	 * ====
	 */
	function isContract(address account) internal view returns (bool) {
		// This method relies on extcodesize, which returns 0 for contracts in
		// construction, since the code is only stored at the end of the
		// constructor execution.

		uint256 size;
		assembly {
			size := extcodesize(account)
		}
		return size > 0;
	}

	/**
	 * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
	 * `recipient`, forwarding all available gas and reverting on errors.
	 *
	 * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
	 * of certain opcodes, possibly making contracts go over the 2300 gas limit
	 * imposed by `transfer`, making them unable to receive funds via
	 * `transfer`. {sendValue} removes this limitation.
	 *
	 * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
	 *
	 * IMPORTANT: because control is transferred to `recipient`, care must be
	 * taken to not create reentrancy vulnerabilities. Consider using
	 * {ReentrancyGuard} or the
	 * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
	 */
	function sendValue(address payable recipient, uint256 amount) internal {
		require(address(this).balance >= amount, "Address: insufficient balance");

		(bool success, ) = recipient.call{value: amount}("");
		require(success, "Address: unable to send value, recipient may have reverted");
	}

	/**
	 * @dev Performs a Solidity function call using a low level `call`. A
	 * plain `call` is an unsafe replacement for a function call: use this
	 * function instead.
	 *
	 * If `target` reverts with a revert reason, it is bubbled up by this
	 * function (like regular Solidity function calls).
	 *
	 * Returns the raw returned data. To convert to the expected return value,
	 * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
	 *
	 * Requirements:
	 *
	 * - `target` must be a contract.
	 * - calling `target` with `data` must not revert.
	 *
	 * _Available since v3.1._
	 */
	function functionCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionCall(target, data, "Address: low-level call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
	 * `errorMessage` as a fallback revert reason when `target` reverts.
	 *
	 * _Available since v3.1._
	 */
	function functionCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but also transferring `value` wei to `target`.
	 *
	 * Requirements:
	 *
	 * - the calling contract must have an ETH balance of at least `value`.
	 * - the called Solidity function must be `payable`.
	 *
	 * _Available since v3.1._
	 */
	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
	 * with `errorMessage` as a fallback revert reason when `target` reverts.
	 *
	 * _Available since v3.1._
	 */
	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(address(this).balance >= value, "Address: insufficient balance for call");
		require(isContract(target), "Address: call to non-contract");

		(bool success, bytes memory returndata) = target.call{value: value}(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but performing a static call.
	 *
	 * _Available since v3.3._
	 */
	function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
		return functionStaticCall(target, data, "Address: low-level static call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
	 * but performing a static call.
	 *
	 * _Available since v3.3._
	 */
	function functionStaticCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal view returns (bytes memory) {
		require(isContract(target), "Address: static call to non-contract");

		(bool success, bytes memory returndata) = target.staticcall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but performing a delegate call.
	 *
	 * _Available since v3.4._
	 */
	function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionDelegateCall(target, data, "Address: low-level delegate call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
	 * but performing a delegate call.
	 *
	 * _Available since v3.4._
	 */
	function functionDelegateCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(isContract(target), "Address: delegate call to non-contract");

		(bool success, bytes memory returndata) = target.delegatecall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
	 * revert reason using the provided one.
	 *
	 * _Available since v4.3._
	 */
	function verifyCallResult(
		bool success,
		bytes memory returndata,
		string memory errorMessage
	) internal pure returns (bytes memory) {
		if (success) {
			return returndata;
		} else {
			// Look for revert reason and bubble it up if present
			if (returndata.length > 0) {
				// The easiest way to bubble the revert reason is using memory via assembly

				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}

/**
 * @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;
	}
}

/**
 * @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);
	}
}


/**
 * @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);
}

/**
 * @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;
	}
}


/**
 * @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;
}

/**
 * @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);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
	/**
	 * @dev Returns the total amount of tokens stored by the contract.
	 */
	function totalSupply() external view returns (uint256);

	/**
	 * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
	 * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
	 */
	function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

	/**
	 * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
	 * Use along with {totalSupply} to enumerate all tokens.
	 */
	function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
	using Address for address;
	using Strings for uint256;

	// Token name
	string private _name;

	// Token symbol
	string private _symbol;

	// Mapping from token ID to owner address
	mapping(uint256 => address) private _owners;

	// Mapping owner address to token count
	mapping(address => uint256) private _balances;

	// Mapping from token ID to approved address
	mapping(uint256 => address) private _tokenApprovals;

	// Mapping from owner to operator approvals
	mapping(address => mapping(address => bool)) private _operatorApprovals;

	/**
	 * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
	 */
	constructor(string memory name_, string memory symbol_) {
		_name = name_;
		_symbol = symbol_;
	}

	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
		return
			interfaceId == type(IERC721).interfaceId ||
			interfaceId == type(IERC721Metadata).interfaceId ||
			super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721-balanceOf}.
	 */
	function balanceOf(address owner) public view virtual override returns (uint256) {
		require(owner != address(0), "ERC721: balance query for the zero address");
		return _balances[owner];
	}

	/**
	 * @dev See {IERC721-ownerOf}.
	 */
	function ownerOf(uint256 tokenId) public view virtual override returns (address) {
		address owner = _owners[tokenId];
		require(owner != address(0), "ERC721: owner query for nonexistent token");
		return owner;
	}

	/**
	 * @dev See {IERC721Metadata-name}.
	 */
	function name() public view virtual override returns (string memory) {
		return _name;
	}

	/**
	 * @dev See {IERC721Metadata-symbol}.
	 */
	function symbol() public view virtual override returns (string memory) {
		return _symbol;
	}

	/**
	 * @dev See {IERC721Metadata-tokenURI}.
	 */
	function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
		require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

		string memory baseURI = _baseURI();
		return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
	}

	/**
	 * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
	 * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
	 * by default, can be overriden in child contracts.
	 */
	function _baseURI() internal view virtual returns (string memory) {
		return "";
	}

	/**
	 * @dev See {IERC721-approve}.
	 */
	function approve(address to, uint256 tokenId) public virtual override {
		address owner = ERC721.ownerOf(tokenId);
		require(to != owner, "ERC721: approval to current owner");

		require(
			_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
			"ERC721: approve caller is not owner nor approved for all"
		);

		_approve(to, tokenId);
	}

	/**
	 * @dev See {IERC721-getApproved}.
	 */
	function getApproved(uint256 tokenId) public view virtual override returns (address) {
		require(_exists(tokenId), "ERC721: approved query for nonexistent token");

		return _tokenApprovals[tokenId];
	}

	/**
	 * @dev See {IERC721-setApprovalForAll}.
	 */
	function setApprovalForAll(address operator, bool approved) public virtual override {
		require(operator != _msgSender(), "ERC721: approve to caller");

		_operatorApprovals[_msgSender()][operator] = approved;
		emit ApprovalForAll(_msgSender(), operator, approved);
	}

	/**
	 * @dev See {IERC721-isApprovedForAll}.
	 */
	function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
		return _operatorApprovals[owner][operator];
	}

	/**
	 * @dev See {IERC721-transferFrom}.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		//solhint-disable-next-line max-line-length
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

		_transfer(from, to, tokenId);
	}

	/**
	 * @dev See {IERC721-safeTransferFrom}.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		safeTransferFrom(from, to, tokenId, "");
	}

	/**
	 * @dev See {IERC721-safeTransferFrom}.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) public virtual override {
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
		_safeTransfer(from, to, tokenId, _data);
	}

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
	 *
	 * `_data` is additional data, it has no specified format and it is sent in call to `to`.
	 *
	 * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
	 * implement alternative mechanisms to perform token transfer, such as signature-based.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeTransfer(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_transfer(from, to, tokenId);
		require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
	}

	/**
	 * @dev Returns whether `tokenId` exists.
	 *
	 * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
	 *
	 * Tokens start existing when they are minted (`_mint`),
	 * and stop existing when they are burned (`_burn`).
	 */
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
		return _owners[tokenId] != address(0);
	}

	/**
	 * @dev Returns whether `spender` is allowed to manage `tokenId`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
		require(_exists(tokenId), "ERC721: operator query for nonexistent token");
		address owner = ERC721.ownerOf(tokenId);
		return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
	}

	/**
	 * @dev Safely mints `tokenId` and transfers it to `to`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeMint(address to, uint256 tokenId) internal virtual {
		_safeMint(to, tokenId, "");
	}

	/**
	 * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
	 * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
	 */
	function _safeMint(
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_mint(to, tokenId);
		require(
			_checkOnERC721Received(address(0), to, tokenId, _data),
			"ERC721: transfer to non ERC721Receiver implementer"
		);
	}

	/**
	 * @dev Mints `tokenId` and transfers it to `to`.
	 *
	 * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - `to` cannot be the zero address.
	 *
	 * Emits a {Transfer} event.
	 */
	function _mint(address to, uint256 tokenId) internal virtual {
		require(to != address(0), "ERC721: mint to the zero address");
		require(!_exists(tokenId), "ERC721: token already minted");

		_beforeTokenTransfer(address(0), to, tokenId);

		_balances[to] += 1;
		_owners[tokenId] = to;

		emit Transfer(address(0), to, tokenId);
	}

	/**
	 * @dev Destroys `tokenId`.
	 * The approval is cleared when the token is burned.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 *
	 * Emits a {Transfer} event.
	 */
	function _burn(uint256 tokenId) internal virtual {
		address owner = ERC721.ownerOf(tokenId);

		_beforeTokenTransfer(owner, address(0), tokenId);

		// Clear approvals
		_approve(address(0), tokenId);

		_balances[owner] -= 1;
		delete _owners[tokenId];

		emit Transfer(owner, address(0), tokenId);
	}

	/**
	 * @dev Transfers `tokenId` from `from` to `to`.
	 *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
	 *
	 * Requirements:
	 *
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must be owned by `from`.
	 *
	 * Emits a {Transfer} event.
	 */
	function _transfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {
		require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
		require(to != address(0), "ERC721: transfer to the zero address");

		_beforeTokenTransfer(from, to, tokenId);

		// Clear approvals from the previous owner
		_approve(address(0), tokenId);

		_balances[from] -= 1;
		_balances[to] += 1;
		_owners[tokenId] = to;

		emit Transfer(from, to, tokenId);
	}

	/**
	 * @dev Approve `to` to operate on `tokenId`
	 *
	 * Emits a {Approval} event.
	 */
	function _approve(address to, uint256 tokenId) internal virtual {
		_tokenApprovals[tokenId] = to;
		emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
	}

	/**
	 * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
	 * The call is not executed if the target address is not a contract.
	 *
	 * @param from address representing the previous owner of the given token ID
	 * @param to target address that will receive the tokens
	 * @param tokenId uint256 ID of the token to be transferred
	 * @param _data bytes optional data to send along with the call
	 * @return bool whether the call correctly returned the expected magic value
	 */
	function _checkOnERC721Received(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) private returns (bool) {
		if (to.isContract()) {
			try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
				return retval == IERC721Receiver.onERC721Received.selector;
			} catch (bytes memory reason) {
				if (reason.length == 0) {
					revert("ERC721: transfer to non ERC721Receiver implementer");
				} else {
					assembly {
						revert(add(32, reason), mload(reason))
					}
				}
			}
		} else {
			return true;
		}
	}

	/**
	 * @dev Hook that is called before any token transfer. This includes minting
	 * and burning.
	 *
	 * Calling conditions:
	 *
	 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
	 * transferred to `to`.
	 * - When `from` is zero, `tokenId` will be minted for `to`.
	 * - When `to` is zero, ``from``'s `tokenId` will be burned.
	 * - `from` and `to` are never both zero.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {}
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
	// Mapping from owner to list of owned token IDs
	mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

	// Mapping from token ID to index of the owner tokens list
	mapping(uint256 => uint256) private _ownedTokensIndex;

	// Array with all token ids, used for enumeration
	uint256[] private _allTokens;

	// Mapping from token id to position in the allTokens array
	mapping(uint256 => uint256) private _allTokensIndex;

	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
		return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
	 */
	function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
		require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
		return _ownedTokens[owner][index];
	}

	/**
	 * @dev See {IERC721Enumerable-totalSupply}.
	 */
	function totalSupply() public view virtual override returns (uint256) {
		return _allTokens.length;
	}

	/**
	 * @dev See {IERC721Enumerable-tokenByIndex}.
	 */
	function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
		require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
		return _allTokens[index];
	}

	/**
	 * @dev Hook that is called before any token transfer. This includes minting
	 * and burning.
	 *
	 * Calling conditions:
	 *
	 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
	 * transferred to `to`.
	 * - When `from` is zero, `tokenId` will be minted for `to`.
	 * - When `to` is zero, ``from``'s `tokenId` will be burned.
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual override {
		super._beforeTokenTransfer(from, to, tokenId);

		if (from == address(0)) {
			_addTokenToAllTokensEnumeration(tokenId);
		} else if (from != to) {
			_removeTokenFromOwnerEnumeration(from, tokenId);
		}
		if (to == address(0)) {
			_removeTokenFromAllTokensEnumeration(tokenId);
		} else if (to != from) {
			_addTokenToOwnerEnumeration(to, tokenId);
		}
	}

	/**
	 * @dev Private function to add a token to this extension's ownership-tracking data structures.
	 * @param to address representing the new owner of the given token ID
	 * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
	 */
	function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
		uint256 length = ERC721.balanceOf(to);
		_ownedTokens[to][length] = tokenId;
		_ownedTokensIndex[tokenId] = length;
	}

	/**
	 * @dev Private function to add a token to this extension's token tracking data structures.
	 * @param tokenId uint256 ID of the token to be added to the tokens list
	 */
	function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
		_allTokensIndex[tokenId] = _allTokens.length;
		_allTokens.push(tokenId);
	}

	/**
	 * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
	 * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
	 * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
	 * This has O(1) time complexity, but alters the order of the _ownedTokens array.
	 * @param from address representing the previous owner of the given token ID
	 * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
	 */
	function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
		// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
		// then delete the last slot (swap and pop).

		uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
		uint256 tokenIndex = _ownedTokensIndex[tokenId];

		// When the token to delete is the last token, the swap operation is unnecessary
		if (tokenIndex != lastTokenIndex) {
			uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

			_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
			_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
		}

		// This also deletes the contents at the last position of the array
		delete _ownedTokensIndex[tokenId];
		delete _ownedTokens[from][lastTokenIndex];
	}

	/**
	 * @dev Private function to remove a token from this extension's token tracking data structures.
	 * This has O(1) time complexity, but alters the order of the _allTokens array.
	 * @param tokenId uint256 ID of the token to be removed from the tokens list
	 */
	function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
		// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
		// then delete the last slot (swap and pop).

		uint256 lastTokenIndex = _allTokens.length - 1;
		uint256 tokenIndex = _allTokensIndex[tokenId];

		// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
		// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
		// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
		uint256 lastTokenId = _allTokens[lastTokenIndex];

		_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
		_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

		// This also deletes the contents at the last position of the array
		delete _allTokensIndex[tokenId];
		_allTokens.pop();
	}
}

contract WastedWhales is ERC721Enumerable, Ownable {

	using Strings for uint256;

	string _baseTokenURI;
	uint256 private _reserved = 14;
	uint256 private _price = 0.069 ether;
	bool public _paused = true;
	bool public _wlPaused = true;
	string private _uri;

	// withdraw address
	address t1;

	constructor(string memory baseURI) ERC721("WastedWhales", "WW")  {
		setBaseURI(baseURI);
		t1 = msg.sender;
	}

	function mintWhale(uint256 num) public payable {
		uint256 supply = totalSupply();
		require( !_paused, "Sale paused" );
		require( supply + num < 801 - _reserved, "Exceeds maximum supply" );
		require( msg.value >= _price * num, "Incorrect ether amount" );

		for(uint256 i; i < num; i++){
			_safeMint(msg.sender, supply + i);
		}
	}

	function mintWhaleWL(uint256 num, string memory id) public payable {
		uint256 supply = totalSupply();
		require( !_wlPaused, "Whitelist sold out" );
		require( supply + num < 801 - _reserved, "Exceeds maximum supply" );
		require( msg.value >= _price * num, "Incorrect ether amount" );
		require( keccak256(bytes(id)) == keccak256(bytes(_uri)), "Not whitelisted" );

		for(uint256 i; i < num; i++){
			_safeMint(msg.sender, supply + i);
		}
	}

	function walletOfOwner(address _owner) public view returns(uint256[] memory) {
		uint256 tokenCount = balanceOf(_owner);

		uint256[] memory tokensId = new uint256[](tokenCount);
		for(uint256 i; i < tokenCount; i++){
			tokensId[i] = tokenOfOwnerByIndex(_owner, i);
		}
		return tokensId;
	}

	// Just in case Eth does some crazy stuff
	function setPrice(uint256 _newPrice) public onlyOwner {
		_price = _newPrice;
	}

	function _baseURI() internal view virtual override returns (string memory) {
		return _baseTokenURI;
	}

	function setBaseURI(string memory baseURI) public onlyOwner {
		_baseTokenURI = baseURI;
	}

	function getPrice() public view returns (uint256) {
		return _price;
	}

	function whitelist(string memory addr) public onlyOwner {
		_uri = addr;
	}

	function giveAway(address _to, uint256 _amount) external onlyOwner {
		require( _amount <= _reserved, "Amount exceeds reserved amount for giveaways" );
		uint256 supply = totalSupply();
		for(uint256 i; i < _amount; i++){
			_safeMint( _to, supply + i );
		}
		_reserved -= _amount;
	}

	function pause(bool val) public onlyOwner {
		_paused = val;
	}

	function wlPause(bool val) public onlyOwner {
		_wlPaused = val;
	}

	function withdrawAll() public onlyOwner {
		address payable _to = payable(t1);
		uint256 _balance = address(this).balance;
		_to.transfer(_balance);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_wlPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintWhale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"string","name":"id","type":"string"}],"name":"mintWhaleWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"addr","type":"string"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"wlPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600e600c5566f5232269808000600d556001600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff0219169083151502179055503480156200005757600080fd5b5060405162004b9738038062004b9783398181016040528101906200007d91906200045b565b6040518060400160405280600c81526020017f5761737465645768616c657300000000000000000000000000000000000000008152506040518060400160405280600281526020017f575700000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010192919062000339565b5080600190805190602001906200011a92919062000339565b5050506200013d620001316200019660201b60201c565b6200019e60201b60201c565b6200014e816200026460201b60201c565b33601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000646565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002746200019660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200029a6200030f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ea90620004e2565b60405180910390fd5b80600b90805190602001906200030b92919062000339565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200034790620005b2565b90600052602060002090601f0160209004810192826200036b5760008555620003b7565b82601f106200038657805160ff1916838001178555620003b7565b82800160010185558215620003b7579182015b82811115620003b657825182559160200191906001019062000399565b5b509050620003c69190620003ca565b5090565b5b80821115620003e5576000816000905550600101620003cb565b5090565b600062000400620003fa8462000538565b62000504565b9050828152602081018484840111156200041957600080fd5b620004268482856200057c565b509392505050565b600082601f8301126200044057600080fd5b815162000452848260208601620003e9565b91505092915050565b6000602082840312156200046e57600080fd5b600082015167ffffffffffffffff8111156200048957600080fd5b62000497848285016200042e565b91505092915050565b6000620004af6020836200056b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620004fd81620004a0565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200052e576200052d62000617565b5b8060405250919050565b600067ffffffffffffffff82111562000556576200055562000617565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200059c5780820151818401526020810190506200057f565b83811115620005ac576000848401525b50505050565b60006002820490506001821680620005cb57607f821691505b60208210811415620005e257620005e1620005e8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61454180620006566000396000f3fe6080604052600436106101e35760003560e01c80636352211e11610102578063a22cb46511610095578063ca80014411610064578063ca800144146106d2578063e985e9c5146106fb578063f2fde38b14610738578063f9ce571814610761576101e3565b8063a22cb4651461061a578063b88d4fde14610643578063c4ebdb7c1461066c578063c87b56dd14610695576101e3565b80638da5cb5b116100d15780638da5cb5b1461057057806391b7f5ed1461059b57806395d89b41146105c457806398d5fdca146105ef576101e3565b80636352211e146104c857806370a0823114610505578063715018a614610542578063853828b614610559576101e3565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103fc578063438b6300146104255780634f6ccce71461046257806355f804b31461049f576101e3565b806323b872dd1461035e5780632f745c591461038757806334bccaee146103c4578063355b01be146103e0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b65780630d80bf64146102df57806316c61ccc1461030857806318160ddd14610333576101e3565b806301ffc9a7146101e857806302329a291461022557806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613104565b61078c565b60405161021c9190613ce6565b60405180910390f35b34801561023157600080fd5b5061024c600480360381019061024791906130db565b610806565b005b34801561025a57600080fd5b5061026361089f565b6040516102709190613d01565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190613197565b610931565b6040516102ad9190613c5d565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d8919061309f565b6109b6565b005b3480156102eb57600080fd5b5061030660048036038101906103019190613156565b610ace565b005b34801561031457600080fd5b5061031d610b64565b60405161032a9190613ce6565b60405180910390f35b34801561033f57600080fd5b50610348610b77565b6040516103559190614023565b60405180910390f35b34801561036a57600080fd5b5061038560048036038101906103809190612f99565b610b84565b005b34801561039357600080fd5b506103ae60048036038101906103a9919061309f565b610be4565b6040516103bb9190614023565b60405180910390f35b6103de60048036038101906103d991906131c0565b610c89565b005b6103fa60048036038101906103f59190613197565b610e29565b005b34801561040857600080fd5b50610423600480360381019061041e9190612f99565b610f69565b005b34801561043157600080fd5b5061044c60048036038101906104479190612f34565b610f89565b6040516104599190613cc4565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613197565b611083565b6040516104969190614023565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613156565b61111a565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613197565b6111b0565b6040516104fc9190613c5d565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190612f34565b611262565b6040516105399190614023565b60405180910390f35b34801561054e57600080fd5b5061055761131a565b005b34801561056557600080fd5b5061056e6113a2565b005b34801561057c57600080fd5b50610585611495565b6040516105929190613c5d565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190613197565b6114bf565b005b3480156105d057600080fd5b506105d9611545565b6040516105e69190613d01565b60405180910390f35b3480156105fb57600080fd5b506106046115d7565b6040516106119190614023565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613063565b6115e1565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612fe8565b611762565b005b34801561067857600080fd5b50610693600480360381019061068e91906130db565b6117c4565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190613197565b61185d565b6040516106c99190613d01565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061309f565b611904565b005b34801561070757600080fd5b50610722600480360381019061071d9190612f5d565b611a23565b60405161072f9190613ce6565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a9190612f34565b611ab7565b005b34801561076d57600080fd5b50610776611baf565b6040516107839190613ce6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ff57506107fe82611bc2565b5b9050919050565b61080e611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661082c611495565b73ffffffffffffffffffffffffffffffffffffffff1614610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613f23565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546108ae90614336565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90614336565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b5050505050905090565b600061093c82611cac565b61097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290613f03565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c1826111b0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990613f83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a51611ca4565b73ffffffffffffffffffffffffffffffffffffffff161480610a805750610a7f81610a7a611ca4565b611a23565b5b610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab690613e43565b60405180910390fd5b610ac98383611d18565b505050565b610ad6611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610af4611495565b73ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613f23565b60405180910390fd5b80600f9080519060200190610b60929190612d58565b5050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b610b95610b8f611ca4565b82611dd1565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90613fc3565b60405180910390fd5b610bdf838383611eaf565b505050565b6000610bef83611262565b8210610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790613d43565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610c93610b77565b9050600e60019054906101000a900460ff1615610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90613dc3565b60405180910390fd5b600c54610321610cf5919061424c565b8382610d01919061416b565b10610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890613fa3565b60405180910390fd5b82600d54610d4f91906141f2565b341015610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890614003565b60405180910390fd5b600f604051610da09190613c22565b6040518091039020828051906020012014610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790613e63565b60405180910390fd5b60005b83811015610e2357610e10338284610e0b919061416b565b61210b565b8080610e1b90614368565b915050610df3565b50505050565b6000610e33610b77565b9050600e60009054906101000a900460ff1615610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90613d23565b60405180910390fd5b600c54610321610e95919061424c565b8282610ea1919061416b565b10610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613fa3565b60405180910390fd5b81600d54610eef91906141f2565b341015610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2890614003565b60405180910390fd5b60005b82811015610f6457610f51338284610f4c919061416b565b61210b565b8080610f5c90614368565b915050610f34565b505050565b610f8483838360405180602001604052806000815250611762565b505050565b60606000610f9683611262565b905060008167ffffffffffffffff811115610fda577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110085781602001602082028036833780820191505090505b50905060005b82811015611078576110208582610be4565b828281518110611059577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061107090614368565b91505061100e565b508092505050919050565b600061108d610b77565b82106110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613fe3565b60405180910390fd5b60088281548110611108577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611122611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611140611495565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90613f23565b60405180910390fd5b80600b90805190602001906111ac929190612d58565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090613ea3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613e83565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611322611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611340611495565b73ffffffffffffffffffffffffffffffffffffffff1614611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613f23565b60405180910390fd5b6113a06000612129565b565b6113aa611ca4565b73ffffffffffffffffffffffffffffffffffffffff166113c8611495565b73ffffffffffffffffffffffffffffffffffffffff161461141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590613f23565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611490573d6000803e3d6000fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114c7611ca4565b73ffffffffffffffffffffffffffffffffffffffff166114e5611495565b73ffffffffffffffffffffffffffffffffffffffff161461153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153290613f23565b60405180910390fd5b80600d8190555050565b60606001805461155490614336565b80601f016020809104026020016040519081016040528092919081815260200182805461158090614336565b80156115cd5780601f106115a2576101008083540402835291602001916115cd565b820191906000526020600020905b8154815290600101906020018083116115b057829003601f168201915b5050505050905090565b6000600d54905090565b6115e9611ca4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e90613e03565b60405180910390fd5b8060056000611664611ca4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611711611ca4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117569190613ce6565b60405180910390a35050565b61177361176d611ca4565b83611dd1565b6117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990613fc3565b60405180910390fd5b6117be848484846121ef565b50505050565b6117cc611ca4565b73ffffffffffffffffffffffffffffffffffffffff166117ea611495565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613f23565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b606061186882611cac565b6118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e90613f63565b60405180910390fd5b60006118b161224b565b905060008151116118d157604051806020016040528060008152506118fc565b806118db846122dd565b6040516020016118ec929190613c39565b6040516020818303038152906040525b915050919050565b61190c611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661192a611495565b73ffffffffffffffffffffffffffffffffffffffff1614611980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197790613f23565b60405180910390fd5b600c548111156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613ec3565b60405180910390fd5b60006119cf610b77565b905060005b82811015611a04576119f18482846119ec919061416b565b61210b565b80806119fc90614368565b9150506119d4565b5081600c6000828254611a17919061424c565b92505081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611abf611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611add611495565b73ffffffffffffffffffffffffffffffffffffffff1614611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90613f23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90613d83565b60405180910390fd5b611bac81612129565b50565b600e60019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c8d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c9d5750611c9c8261248a565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d8b836111b0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ddc82611cac565b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1290613e23565b60405180910390fd5b6000611e26836111b0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e9557508373ffffffffffffffffffffffffffffffffffffffff16611e7d84610931565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ea65750611ea58185611a23565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ecf826111b0565b73ffffffffffffffffffffffffffffffffffffffff1614611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613f43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90613de3565b60405180910390fd5b611fa08383836124f4565b611fab600082611d18565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffb919061424c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612052919061416b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612125828260405180602001604052806000815250612608565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121fa848484611eaf565b61220684848484612663565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90613d63565b60405180910390fd5b50505050565b6060600b805461225a90614336565b80601f016020809104026020016040519081016040528092919081815260200182805461228690614336565b80156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b5050505050905090565b60606000821415612325576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612485565b600082905060005b6000821461235757808061234090614368565b915050600a8261235091906141c1565b915061232d565b60008167ffffffffffffffff811115612399577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123cb5781602001600182028036833780820191505090505b5090505b6000851461247e576001826123e4919061424c565b9150600a856123f391906143b1565b60306123ff919061416b565b60f81b81838151811061243b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561247791906141c1565b94506123cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124ff8383836127fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125425761253d816127ff565b612581565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125805761257f8382612848565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c4576125bf816129b5565b612603565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612602576126018282612af8565b5b5b505050565b6126128383612b77565b61261f6000848484612663565b61265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590613d63565b60405180910390fd5b505050565b60006126848473ffffffffffffffffffffffffffffffffffffffff16612d45565b156127ed578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ad611ca4565b8786866040518563ffffffff1660e01b81526004016126cf9493929190613c78565b602060405180830381600087803b1580156126e957600080fd5b505af192505050801561271a57506040513d601f19601f82011682018060405250810190612717919061312d565b60015b61279d573d806000811461274a576040519150601f19603f3d011682016040523d82523d6000602084013e61274f565b606091505b50600081511415612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c90613d63565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161285584611262565b61285f919061424c565b9050600060076000848152602001908152602001600020549050818114612944576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129c9919061424c565b9050600060096000848152602001908152602001600020549050600060088381548110612a1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612adc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b0383611262565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bde90613ee3565b60405180910390fd5b612bf081611cac565b15612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790613da3565b60405180910390fd5b612c3c600083836124f4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8c919061416b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d6490614336565b90600052602060002090601f016020900481019282612d865760008555612dcd565b82601f10612d9f57805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcc578251825591602001919060010190612db1565b5b509050612dda9190612dde565b5090565b5b80821115612df7576000816000905550600101612ddf565b5090565b6000612e0e612e098461406f565b61403e565b905082815260208101848484011115612e2657600080fd5b612e318482856142f4565b509392505050565b6000612e4c612e478461409f565b61403e565b905082815260208101848484011115612e6457600080fd5b612e6f8482856142f4565b509392505050565b600081359050612e86816144af565b92915050565b600081359050612e9b816144c6565b92915050565b600081359050612eb0816144dd565b92915050565b600081519050612ec5816144dd565b92915050565b600082601f830112612edc57600080fd5b8135612eec848260208601612dfb565b91505092915050565b600082601f830112612f0657600080fd5b8135612f16848260208601612e39565b91505092915050565b600081359050612f2e816144f4565b92915050565b600060208284031215612f4657600080fd5b6000612f5484828501612e77565b91505092915050565b60008060408385031215612f7057600080fd5b6000612f7e85828601612e77565b9250506020612f8f85828601612e77565b9150509250929050565b600080600060608486031215612fae57600080fd5b6000612fbc86828701612e77565b9350506020612fcd86828701612e77565b9250506040612fde86828701612f1f565b9150509250925092565b60008060008060808587031215612ffe57600080fd5b600061300c87828801612e77565b945050602061301d87828801612e77565b935050604061302e87828801612f1f565b925050606085013567ffffffffffffffff81111561304b57600080fd5b61305787828801612ecb565b91505092959194509250565b6000806040838503121561307657600080fd5b600061308485828601612e77565b925050602061309585828601612e8c565b9150509250929050565b600080604083850312156130b257600080fd5b60006130c085828601612e77565b92505060206130d185828601612f1f565b9150509250929050565b6000602082840312156130ed57600080fd5b60006130fb84828501612e8c565b91505092915050565b60006020828403121561311657600080fd5b600061312484828501612ea1565b91505092915050565b60006020828403121561313f57600080fd5b600061314d84828501612eb6565b91505092915050565b60006020828403121561316857600080fd5b600082013567ffffffffffffffff81111561318257600080fd5b61318e84828501612ef5565b91505092915050565b6000602082840312156131a957600080fd5b60006131b784828501612f1f565b91505092915050565b600080604083850312156131d357600080fd5b60006131e185828601612f1f565b925050602083013567ffffffffffffffff8111156131fe57600080fd5b61320a85828601612ef5565b9150509250929050565b60006132208383613c04565b60208301905092915050565b61323581614280565b82525050565b6000613246826140f4565b6132508185614122565b935061325b836140cf565b8060005b8381101561328c5781516132738882613214565b975061327e83614115565b92505060018101905061325f565b5085935050505092915050565b6132a281614292565b82525050565b60006132b3826140ff565b6132bd8185614133565b93506132cd818560208601614303565b6132d68161449e565b840191505092915050565b600081546132ee81614336565b6132f88186614144565b94506001821660008114613313576001811461332457613357565b60ff19831686528186019350613357565b61332d856140df565b60005b8381101561334f57815481890152600182019150602081019050613330565b838801955050505b50505092915050565b600061336b8261410a565b613375818561414f565b9350613385818560208601614303565b61338e8161449e565b840191505092915050565b60006133a48261410a565b6133ae8185614160565b93506133be818560208601614303565b80840191505092915050565b60006133d7600b8361414f565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b6000613417602b8361414f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061347d60328361414f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134e360268361414f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613549601c8361414f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061358960128361414f565b91507f57686974656c69737420736f6c64206f757400000000000000000000000000006000830152602082019050919050565b60006135c960248361414f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061362f60198361414f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061366f602c8361414f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006136d560388361414f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061373b600f8361414f565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b600061377b602a8361414f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e160298361414f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613847602c8361414f565b91507f416d6f756e74206578636565647320726573657276656420616d6f756e74206660008301527f6f722067697665617761797300000000000000000000000000000000000000006020830152604082019050919050565b60006138ad60208361414f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006138ed602c8361414f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061395360208361414f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061399360298361414f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f9602f8361414f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613a5f60218361414f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ac560168361414f565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b6000613b0560318361414f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613b6b602c8361414f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613bd160168361414f565b91507f496e636f727265637420657468657220616d6f756e74000000000000000000006000830152602082019050919050565b613c0d816142ea565b82525050565b613c1c816142ea565b82525050565b6000613c2e82846132e1565b915081905092915050565b6000613c458285613399565b9150613c518284613399565b91508190509392505050565b6000602082019050613c72600083018461322c565b92915050565b6000608082019050613c8d600083018761322c565b613c9a602083018661322c565b613ca76040830185613c13565b8181036060830152613cb981846132a8565b905095945050505050565b60006020820190508181036000830152613cde818461323b565b905092915050565b6000602082019050613cfb6000830184613299565b92915050565b60006020820190508181036000830152613d1b8184613360565b905092915050565b60006020820190508181036000830152613d3c816133ca565b9050919050565b60006020820190508181036000830152613d5c8161340a565b9050919050565b60006020820190508181036000830152613d7c81613470565b9050919050565b60006020820190508181036000830152613d9c816134d6565b9050919050565b60006020820190508181036000830152613dbc8161353c565b9050919050565b60006020820190508181036000830152613ddc8161357c565b9050919050565b60006020820190508181036000830152613dfc816135bc565b9050919050565b60006020820190508181036000830152613e1c81613622565b9050919050565b60006020820190508181036000830152613e3c81613662565b9050919050565b60006020820190508181036000830152613e5c816136c8565b9050919050565b60006020820190508181036000830152613e7c8161372e565b9050919050565b60006020820190508181036000830152613e9c8161376e565b9050919050565b60006020820190508181036000830152613ebc816137d4565b9050919050565b60006020820190508181036000830152613edc8161383a565b9050919050565b60006020820190508181036000830152613efc816138a0565b9050919050565b60006020820190508181036000830152613f1c816138e0565b9050919050565b60006020820190508181036000830152613f3c81613946565b9050919050565b60006020820190508181036000830152613f5c81613986565b9050919050565b60006020820190508181036000830152613f7c816139ec565b9050919050565b60006020820190508181036000830152613f9c81613a52565b9050919050565b60006020820190508181036000830152613fbc81613ab8565b9050919050565b60006020820190508181036000830152613fdc81613af8565b9050919050565b60006020820190508181036000830152613ffc81613b5e565b9050919050565b6000602082019050818103600083015261401c81613bc4565b9050919050565b60006020820190506140386000830184613c13565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140655761406461446f565b5b8060405250919050565b600067ffffffffffffffff82111561408a5761408961446f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156140ba576140b961446f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614176826142ea565b9150614181836142ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141b6576141b56143e2565b5b828201905092915050565b60006141cc826142ea565b91506141d7836142ea565b9250826141e7576141e6614411565b5b828204905092915050565b60006141fd826142ea565b9150614208836142ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614241576142406143e2565b5b828202905092915050565b6000614257826142ea565b9150614262836142ea565b925082821015614275576142746143e2565b5b828203905092915050565b600061428b826142ca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614321578082015181840152602081019050614306565b83811115614330576000848401525b50505050565b6000600282049050600182168061434e57607f821691505b6020821081141561436257614361614440565b5b50919050565b6000614373826142ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143a6576143a56143e2565b5b600182019050919050565b60006143bc826142ea565b91506143c7836142ea565b9250826143d7576143d6614411565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144b881614280565b81146144c357600080fd5b50565b6144cf81614292565b81146144da57600080fd5b50565b6144e68161429e565b81146144f157600080fd5b50565b6144fd816142ea565b811461450857600080fd5b5056fea2646970667358221220888be0b43f9492f32414bab45e59de4763c7e12dcc55dad81c0d3fa27361480964736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636352211e11610102578063a22cb46511610095578063ca80014411610064578063ca800144146106d2578063e985e9c5146106fb578063f2fde38b14610738578063f9ce571814610761576101e3565b8063a22cb4651461061a578063b88d4fde14610643578063c4ebdb7c1461066c578063c87b56dd14610695576101e3565b80638da5cb5b116100d15780638da5cb5b1461057057806391b7f5ed1461059b57806395d89b41146105c457806398d5fdca146105ef576101e3565b80636352211e146104c857806370a0823114610505578063715018a614610542578063853828b614610559576101e3565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103fc578063438b6300146104255780634f6ccce71461046257806355f804b31461049f576101e3565b806323b872dd1461035e5780632f745c591461038757806334bccaee146103c4578063355b01be146103e0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b65780630d80bf64146102df57806316c61ccc1461030857806318160ddd14610333576101e3565b806301ffc9a7146101e857806302329a291461022557806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613104565b61078c565b60405161021c9190613ce6565b60405180910390f35b34801561023157600080fd5b5061024c600480360381019061024791906130db565b610806565b005b34801561025a57600080fd5b5061026361089f565b6040516102709190613d01565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190613197565b610931565b6040516102ad9190613c5d565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d8919061309f565b6109b6565b005b3480156102eb57600080fd5b5061030660048036038101906103019190613156565b610ace565b005b34801561031457600080fd5b5061031d610b64565b60405161032a9190613ce6565b60405180910390f35b34801561033f57600080fd5b50610348610b77565b6040516103559190614023565b60405180910390f35b34801561036a57600080fd5b5061038560048036038101906103809190612f99565b610b84565b005b34801561039357600080fd5b506103ae60048036038101906103a9919061309f565b610be4565b6040516103bb9190614023565b60405180910390f35b6103de60048036038101906103d991906131c0565b610c89565b005b6103fa60048036038101906103f59190613197565b610e29565b005b34801561040857600080fd5b50610423600480360381019061041e9190612f99565b610f69565b005b34801561043157600080fd5b5061044c60048036038101906104479190612f34565b610f89565b6040516104599190613cc4565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613197565b611083565b6040516104969190614023565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190613156565b61111a565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613197565b6111b0565b6040516104fc9190613c5d565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190612f34565b611262565b6040516105399190614023565b60405180910390f35b34801561054e57600080fd5b5061055761131a565b005b34801561056557600080fd5b5061056e6113a2565b005b34801561057c57600080fd5b50610585611495565b6040516105929190613c5d565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190613197565b6114bf565b005b3480156105d057600080fd5b506105d9611545565b6040516105e69190613d01565b60405180910390f35b3480156105fb57600080fd5b506106046115d7565b6040516106119190614023565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613063565b6115e1565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612fe8565b611762565b005b34801561067857600080fd5b50610693600480360381019061068e91906130db565b6117c4565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190613197565b61185d565b6040516106c99190613d01565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061309f565b611904565b005b34801561070757600080fd5b50610722600480360381019061071d9190612f5d565b611a23565b60405161072f9190613ce6565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a9190612f34565b611ab7565b005b34801561076d57600080fd5b50610776611baf565b6040516107839190613ce6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ff57506107fe82611bc2565b5b9050919050565b61080e611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661082c611495565b73ffffffffffffffffffffffffffffffffffffffff1614610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613f23565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6060600080546108ae90614336565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90614336565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b5050505050905090565b600061093c82611cac565b61097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290613f03565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c1826111b0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990613f83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a51611ca4565b73ffffffffffffffffffffffffffffffffffffffff161480610a805750610a7f81610a7a611ca4565b611a23565b5b610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab690613e43565b60405180910390fd5b610ac98383611d18565b505050565b610ad6611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610af4611495565b73ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613f23565b60405180910390fd5b80600f9080519060200190610b60929190612d58565b5050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b610b95610b8f611ca4565b82611dd1565b610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90613fc3565b60405180910390fd5b610bdf838383611eaf565b505050565b6000610bef83611262565b8210610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790613d43565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610c93610b77565b9050600e60019054906101000a900460ff1615610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90613dc3565b60405180910390fd5b600c54610321610cf5919061424c565b8382610d01919061416b565b10610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890613fa3565b60405180910390fd5b82600d54610d4f91906141f2565b341015610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890614003565b60405180910390fd5b600f604051610da09190613c22565b6040518091039020828051906020012014610df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de790613e63565b60405180910390fd5b60005b83811015610e2357610e10338284610e0b919061416b565b61210b565b8080610e1b90614368565b915050610df3565b50505050565b6000610e33610b77565b9050600e60009054906101000a900460ff1615610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90613d23565b60405180910390fd5b600c54610321610e95919061424c565b8282610ea1919061416b565b10610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613fa3565b60405180910390fd5b81600d54610eef91906141f2565b341015610f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2890614003565b60405180910390fd5b60005b82811015610f6457610f51338284610f4c919061416b565b61210b565b8080610f5c90614368565b915050610f34565b505050565b610f8483838360405180602001604052806000815250611762565b505050565b60606000610f9683611262565b905060008167ffffffffffffffff811115610fda577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110085781602001602082028036833780820191505090505b50905060005b82811015611078576110208582610be4565b828281518110611059577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061107090614368565b91505061100e565b508092505050919050565b600061108d610b77565b82106110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613fe3565b60405180910390fd5b60088281548110611108577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611122611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611140611495565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90613f23565b60405180910390fd5b80600b90805190602001906111ac929190612d58565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090613ea3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613e83565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611322611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611340611495565b73ffffffffffffffffffffffffffffffffffffffff1614611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613f23565b60405180910390fd5b6113a06000612129565b565b6113aa611ca4565b73ffffffffffffffffffffffffffffffffffffffff166113c8611495565b73ffffffffffffffffffffffffffffffffffffffff161461141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590613f23565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611490573d6000803e3d6000fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114c7611ca4565b73ffffffffffffffffffffffffffffffffffffffff166114e5611495565b73ffffffffffffffffffffffffffffffffffffffff161461153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153290613f23565b60405180910390fd5b80600d8190555050565b60606001805461155490614336565b80601f016020809104026020016040519081016040528092919081815260200182805461158090614336565b80156115cd5780601f106115a2576101008083540402835291602001916115cd565b820191906000526020600020905b8154815290600101906020018083116115b057829003601f168201915b5050505050905090565b6000600d54905090565b6115e9611ca4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e90613e03565b60405180910390fd5b8060056000611664611ca4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611711611ca4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117569190613ce6565b60405180910390a35050565b61177361176d611ca4565b83611dd1565b6117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990613fc3565b60405180910390fd5b6117be848484846121ef565b50505050565b6117cc611ca4565b73ffffffffffffffffffffffffffffffffffffffff166117ea611495565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613f23565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b606061186882611cac565b6118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e90613f63565b60405180910390fd5b60006118b161224b565b905060008151116118d157604051806020016040528060008152506118fc565b806118db846122dd565b6040516020016118ec929190613c39565b6040516020818303038152906040525b915050919050565b61190c611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661192a611495565b73ffffffffffffffffffffffffffffffffffffffff1614611980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197790613f23565b60405180910390fd5b600c548111156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613ec3565b60405180910390fd5b60006119cf610b77565b905060005b82811015611a04576119f18482846119ec919061416b565b61210b565b80806119fc90614368565b9150506119d4565b5081600c6000828254611a17919061424c565b92505081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611abf611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611add611495565b73ffffffffffffffffffffffffffffffffffffffff1614611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90613f23565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90613d83565b60405180910390fd5b611bac81612129565b50565b600e60019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c8d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c9d5750611c9c8261248a565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d8b836111b0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ddc82611cac565b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1290613e23565b60405180910390fd5b6000611e26836111b0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e9557508373ffffffffffffffffffffffffffffffffffffffff16611e7d84610931565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ea65750611ea58185611a23565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ecf826111b0565b73ffffffffffffffffffffffffffffffffffffffff1614611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613f43565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90613de3565b60405180910390fd5b611fa08383836124f4565b611fab600082611d18565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffb919061424c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612052919061416b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612125828260405180602001604052806000815250612608565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121fa848484611eaf565b61220684848484612663565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90613d63565b60405180910390fd5b50505050565b6060600b805461225a90614336565b80601f016020809104026020016040519081016040528092919081815260200182805461228690614336565b80156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b5050505050905090565b60606000821415612325576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612485565b600082905060005b6000821461235757808061234090614368565b915050600a8261235091906141c1565b915061232d565b60008167ffffffffffffffff811115612399577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123cb5781602001600182028036833780820191505090505b5090505b6000851461247e576001826123e4919061424c565b9150600a856123f391906143b1565b60306123ff919061416b565b60f81b81838151811061243b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561247791906141c1565b94506123cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124ff8383836127fa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125425761253d816127ff565b612581565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125805761257f8382612848565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c4576125bf816129b5565b612603565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612602576126018282612af8565b5b5b505050565b6126128383612b77565b61261f6000848484612663565b61265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590613d63565b60405180910390fd5b505050565b60006126848473ffffffffffffffffffffffffffffffffffffffff16612d45565b156127ed578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ad611ca4565b8786866040518563ffffffff1660e01b81526004016126cf9493929190613c78565b602060405180830381600087803b1580156126e957600080fd5b505af192505050801561271a57506040513d601f19601f82011682018060405250810190612717919061312d565b60015b61279d573d806000811461274a576040519150601f19603f3d011682016040523d82523d6000602084013e61274f565b606091505b50600081511415612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c90613d63565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161285584611262565b61285f919061424c565b9050600060076000848152602001908152602001600020549050818114612944576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129c9919061424c565b9050600060096000848152602001908152602001600020549050600060088381548110612a1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612a67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612adc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b0383611262565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bde90613ee3565b60405180910390fd5b612bf081611cac565b15612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790613da3565b60405180910390fd5b612c3c600083836124f4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c8c919061416b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d6490614336565b90600052602060002090601f016020900481019282612d865760008555612dcd565b82601f10612d9f57805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcc578251825591602001919060010190612db1565b5b509050612dda9190612dde565b5090565b5b80821115612df7576000816000905550600101612ddf565b5090565b6000612e0e612e098461406f565b61403e565b905082815260208101848484011115612e2657600080fd5b612e318482856142f4565b509392505050565b6000612e4c612e478461409f565b61403e565b905082815260208101848484011115612e6457600080fd5b612e6f8482856142f4565b509392505050565b600081359050612e86816144af565b92915050565b600081359050612e9b816144c6565b92915050565b600081359050612eb0816144dd565b92915050565b600081519050612ec5816144dd565b92915050565b600082601f830112612edc57600080fd5b8135612eec848260208601612dfb565b91505092915050565b600082601f830112612f0657600080fd5b8135612f16848260208601612e39565b91505092915050565b600081359050612f2e816144f4565b92915050565b600060208284031215612f4657600080fd5b6000612f5484828501612e77565b91505092915050565b60008060408385031215612f7057600080fd5b6000612f7e85828601612e77565b9250506020612f8f85828601612e77565b9150509250929050565b600080600060608486031215612fae57600080fd5b6000612fbc86828701612e77565b9350506020612fcd86828701612e77565b9250506040612fde86828701612f1f565b9150509250925092565b60008060008060808587031215612ffe57600080fd5b600061300c87828801612e77565b945050602061301d87828801612e77565b935050604061302e87828801612f1f565b925050606085013567ffffffffffffffff81111561304b57600080fd5b61305787828801612ecb565b91505092959194509250565b6000806040838503121561307657600080fd5b600061308485828601612e77565b925050602061309585828601612e8c565b9150509250929050565b600080604083850312156130b257600080fd5b60006130c085828601612e77565b92505060206130d185828601612f1f565b9150509250929050565b6000602082840312156130ed57600080fd5b60006130fb84828501612e8c565b91505092915050565b60006020828403121561311657600080fd5b600061312484828501612ea1565b91505092915050565b60006020828403121561313f57600080fd5b600061314d84828501612eb6565b91505092915050565b60006020828403121561316857600080fd5b600082013567ffffffffffffffff81111561318257600080fd5b61318e84828501612ef5565b91505092915050565b6000602082840312156131a957600080fd5b60006131b784828501612f1f565b91505092915050565b600080604083850312156131d357600080fd5b60006131e185828601612f1f565b925050602083013567ffffffffffffffff8111156131fe57600080fd5b61320a85828601612ef5565b9150509250929050565b60006132208383613c04565b60208301905092915050565b61323581614280565b82525050565b6000613246826140f4565b6132508185614122565b935061325b836140cf565b8060005b8381101561328c5781516132738882613214565b975061327e83614115565b92505060018101905061325f565b5085935050505092915050565b6132a281614292565b82525050565b60006132b3826140ff565b6132bd8185614133565b93506132cd818560208601614303565b6132d68161449e565b840191505092915050565b600081546132ee81614336565b6132f88186614144565b94506001821660008114613313576001811461332457613357565b60ff19831686528186019350613357565b61332d856140df565b60005b8381101561334f57815481890152600182019150602081019050613330565b838801955050505b50505092915050565b600061336b8261410a565b613375818561414f565b9350613385818560208601614303565b61338e8161449e565b840191505092915050565b60006133a48261410a565b6133ae8185614160565b93506133be818560208601614303565b80840191505092915050565b60006133d7600b8361414f565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b6000613417602b8361414f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061347d60328361414f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134e360268361414f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613549601c8361414f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061358960128361414f565b91507f57686974656c69737420736f6c64206f757400000000000000000000000000006000830152602082019050919050565b60006135c960248361414f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061362f60198361414f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061366f602c8361414f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006136d560388361414f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061373b600f8361414f565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b600061377b602a8361414f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e160298361414f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613847602c8361414f565b91507f416d6f756e74206578636565647320726573657276656420616d6f756e74206660008301527f6f722067697665617761797300000000000000000000000000000000000000006020830152604082019050919050565b60006138ad60208361414f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006138ed602c8361414f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061395360208361414f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061399360298361414f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f9602f8361414f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613a5f60218361414f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ac560168361414f565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b6000613b0560318361414f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613b6b602c8361414f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613bd160168361414f565b91507f496e636f727265637420657468657220616d6f756e74000000000000000000006000830152602082019050919050565b613c0d816142ea565b82525050565b613c1c816142ea565b82525050565b6000613c2e82846132e1565b915081905092915050565b6000613c458285613399565b9150613c518284613399565b91508190509392505050565b6000602082019050613c72600083018461322c565b92915050565b6000608082019050613c8d600083018761322c565b613c9a602083018661322c565b613ca76040830185613c13565b8181036060830152613cb981846132a8565b905095945050505050565b60006020820190508181036000830152613cde818461323b565b905092915050565b6000602082019050613cfb6000830184613299565b92915050565b60006020820190508181036000830152613d1b8184613360565b905092915050565b60006020820190508181036000830152613d3c816133ca565b9050919050565b60006020820190508181036000830152613d5c8161340a565b9050919050565b60006020820190508181036000830152613d7c81613470565b9050919050565b60006020820190508181036000830152613d9c816134d6565b9050919050565b60006020820190508181036000830152613dbc8161353c565b9050919050565b60006020820190508181036000830152613ddc8161357c565b9050919050565b60006020820190508181036000830152613dfc816135bc565b9050919050565b60006020820190508181036000830152613e1c81613622565b9050919050565b60006020820190508181036000830152613e3c81613662565b9050919050565b60006020820190508181036000830152613e5c816136c8565b9050919050565b60006020820190508181036000830152613e7c8161372e565b9050919050565b60006020820190508181036000830152613e9c8161376e565b9050919050565b60006020820190508181036000830152613ebc816137d4565b9050919050565b60006020820190508181036000830152613edc8161383a565b9050919050565b60006020820190508181036000830152613efc816138a0565b9050919050565b60006020820190508181036000830152613f1c816138e0565b9050919050565b60006020820190508181036000830152613f3c81613946565b9050919050565b60006020820190508181036000830152613f5c81613986565b9050919050565b60006020820190508181036000830152613f7c816139ec565b9050919050565b60006020820190508181036000830152613f9c81613a52565b9050919050565b60006020820190508181036000830152613fbc81613ab8565b9050919050565b60006020820190508181036000830152613fdc81613af8565b9050919050565b60006020820190508181036000830152613ffc81613b5e565b9050919050565b6000602082019050818103600083015261401c81613bc4565b9050919050565b60006020820190506140386000830184613c13565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140655761406461446f565b5b8060405250919050565b600067ffffffffffffffff82111561408a5761408961446f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156140ba576140b961446f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614176826142ea565b9150614181836142ea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141b6576141b56143e2565b5b828201905092915050565b60006141cc826142ea565b91506141d7836142ea565b9250826141e7576141e6614411565b5b828204905092915050565b60006141fd826142ea565b9150614208836142ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614241576142406143e2565b5b828202905092915050565b6000614257826142ea565b9150614262836142ea565b925082821015614275576142746143e2565b5b828203905092915050565b600061428b826142ca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614321578082015181840152602081019050614306565b83811115614330576000848401525b50505050565b6000600282049050600182168061434e57607f821691505b6020821081141561436257614361614440565b5b50919050565b6000614373826142ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143a6576143a56143e2565b5b600182019050919050565b60006143bc826142ea565b91506143c7836142ea565b9250826143d7576143d6614411565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144b881614280565b81146144c357600080fd5b50565b6144cf81614292565b81146144da57600080fd5b50565b6144e68161429e565b81146144f157600080fd5b50565b6144fd816142ea565b811461450857600080fd5b5056fea2646970667358221220888be0b43f9492f32414bab45e59de4763c7e12dcc55dad81c0d3fa27361480964736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38289:2641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32660:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40628:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21982:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23376:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22962:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40249:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38475:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33252:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24185:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32947:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39068:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38719:344;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24541:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39527:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33421:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40073:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21709:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21466:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11952:94;;;;;;;;;;;;;:::i;:::-;;40772:155;;;;;;;;;;;;;:::i;:::-;;11361:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39876:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22130:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40171:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23642:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24755:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40698:69;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22284:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40331:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23975:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12186:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38505:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32660:215;32762:4;32795:35;32780:50;;;:11;:50;;;;:90;;;;32834:36;32858:11;32834:23;:36::i;:::-;32780:90;32773:97;;32660:215;;;:::o;40628:65::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40685:3:::1;40675:7;;:13;;;;;;;;;;;;;;;;;;40628:65:::0;:::o;21982:91::-;22036:13;22063:5;22056:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21982:91;:::o;23376:206::-;23452:7;23474:16;23482:7;23474;:16::i;:::-;23466:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23553:15;:24;23569:7;23553:24;;;;;;;;;;;;;;;;;;;;;23546:31;;23376:206;;;:::o;22962:360::-;23037:13;23053:23;23068:7;23053:14;:23::i;:::-;23037:39;;23095:5;23089:11;;:2;:11;;;;23081:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23174:5;23158:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23183:37;23200:5;23207:12;:10;:12::i;:::-;23183:16;:37::i;:::-;23158:62;23145:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;23296:21;23305:2;23309:7;23296:8;:21::i;:::-;22962:360;;;:::o;40249:77::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40317:4:::1;40310;:11;;;;;;;;;;;;:::i;:::-;;40249:77:::0;:::o;38475:26::-;;;;;;;;;;;;;:::o;33252:104::-;33313:7;33334:10;:17;;;;33327:24;;33252:104;:::o;24185:297::-;24347:41;24366:12;:10;:12::i;:::-;24380:7;24347:18;:41::i;:::-;24339:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24449:28;24459:4;24465:2;24469:7;24449:9;:28::i;:::-;24185:297;;;:::o;32947:241::-;33044:7;33074:23;33091:5;33074:16;:23::i;:::-;33066:5;:31;33058:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33157:12;:19;33170:5;33157:19;;;;;;;;;;;;;;;:26;33177:5;33157:26;;;;;;;;;;;;33150:33;;32947:241;;;;:::o;39068:454::-;39140:14;39157:13;:11;:13::i;:::-;39140:30;;39185:9;;;;;;;;;;;39184:10;39175:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39253:9;;39247:3;:15;;;;:::i;:::-;39241:3;39232:6;:12;;;;:::i;:::-;:30;39223:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39326:3;39317:6;;:12;;;;:::i;:::-;39304:9;:25;;39295:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39411:4;39395:22;;;;;;:::i;:::-;;;;;;;;39387:2;39371:20;;;;;;:46;39362:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39449:9;39445:73;39464:3;39460:1;:7;39445:73;;;39479:33;39489:10;39510:1;39501:6;:10;;;;:::i;:::-;39479:9;:33::i;:::-;39469:3;;;;;:::i;:::-;;;;39445:73;;;;39068:454;;;:::o;38719:344::-;38771:14;38788:13;:11;:13::i;:::-;38771:30;;38816:7;;;;;;;;;;;38815:8;38806:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;38875:9;;38869:3;:15;;;;:::i;:::-;38863:3;38854:6;:12;;;;:::i;:::-;:30;38845:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38948:3;38939:6;;:12;;;;:::i;:::-;38926:9;:25;;38917:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;38990:9;38986:73;39005:3;39001:1;:7;38986:73;;;39020:33;39030:10;39051:1;39042:6;:10;;;;:::i;:::-;39020:9;:33::i;:::-;39010:3;;;;;:::i;:::-;;;;38986:73;;;;38719:344;;:::o;24541:155::-;24652:39;24669:4;24675:2;24679:7;24652:39;;;;;;;;;;;;:16;:39::i;:::-;24541:155;;;:::o;39527:300::-;39586:16;39609:18;39630:17;39640:6;39630:9;:17::i;:::-;39609:38;;39654:25;39696:10;39682:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39654:53;;39716:9;39712:91;39731:10;39727:1;:14;39712:91;;;39767:30;39787:6;39795:1;39767:19;:30::i;:::-;39753:8;39762:1;39753:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;39743:3;;;;;:::i;:::-;;;;39712:91;;;;39814:8;39807:15;;;;39527:300;;;:::o;33421:218::-;33496:7;33526:30;:28;:30::i;:::-;33518:5;:38;33510:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;33617:10;33628:5;33617:17;;;;;;;;;;;;;;;;;;;;;;;;33610:24;;33421:218;;;:::o;40073:93::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40154:7:::1;40138:13;:23;;;;;;;;;;;;:::i;:::-;;40073:93:::0;:::o;21709:218::-;21781:7;21795:13;21811:7;:16;21819:7;21811:16;;;;;;;;;;;;;;;;;;;;;21795:32;;21857:1;21840:19;;:5;:19;;;;21832:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21917:5;21910:12;;;21709:218;;;:::o;21466:193::-;21538:7;21577:1;21560:19;;:5;:19;;;;21552:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21638:9;:16;21648:5;21638:16;;;;;;;;;;;;;;;;21631:23;;21466:193;;;:::o;11952:94::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12011:30:::1;12038:1;12011:18;:30::i;:::-;11952:94::o:0;40772:155::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40817:19:::1;40847:2;;;;;;;;;;;40817:33;;40855:16;40874:21;40855:40;;40900:3;:12;;:22;40913:8;40900:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;11619:1;;40772:155::o:0;11361:78::-;11407:7;11428:6;;;;;;;;;;;11421:13;;11361:78;:::o;39876:82::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39944:9:::1;39935:6;:18;;;;39876:82:::0;:::o;22130:95::-;22186:13;22213:7;22206:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22130:95;:::o;40171:73::-;40212:7;40233:6;;40226:13;;40171:73;:::o;23642:274::-;23751:12;:10;:12::i;:::-;23739:24;;:8;:24;;;;23731:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23845:8;23800:18;:32;23819:12;:10;:12::i;:::-;23800:32;;;;;;;;;;;;;;;:42;23833:8;23800:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23892:8;23863:48;;23878:12;:10;:12::i;:::-;23863:48;;;23902:8;23863:48;;;;;;:::i;:::-;;;;;;;;23642:274;;:::o;24755:286::-;24897:41;24916:12;:10;:12::i;:::-;24930:7;24897:18;:41::i;:::-;24889:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24997:39;25011:4;25017:2;25021:7;25030:5;24997:13;:39::i;:::-;24755:286;;;;:::o;40698:69::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40759:3:::1;40747:9;;:15;;;;;;;;;;;;;;;;;;40698:69:::0;:::o;22284:313::-;22357:13;22385:16;22393:7;22385;:16::i;:::-;22377:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22460:21;22484:10;:8;:10::i;:::-;22460:34;;22530:1;22512:7;22506:21;:25;:86;;;;;;;;;;;;;;;;;22558:7;22567:18;:7;:16;:18::i;:::-;22541:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22506:86;22499:93;;;22284:313;;;:::o;40331:292::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40423:9:::1;;40412:7;:20;;40403:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;40487:14;40504:13;:11;:13::i;:::-;40487:30;;40526:9;40522:72;40541:7;40537:1;:11;40522:72;;;40560:28;40571:3;40585:1;40576:6;:10;;;;:::i;:::-;40560:9;:28::i;:::-;40550:3;;;;;:::i;:::-;;;;40522:72;;;;40611:7;40598:9;;:20;;;;;;;:::i;:::-;;;;;;;;11619:1;40331:292:::0;;:::o;23975:155::-;24072:4;24090:18;:25;24109:5;24090:25;;;;;;;;;;;;;;;:35;24116:8;24090:35;;;;;;;;;;;;;;;;;;;;;;;;;24083:42;;23975:155;;;;:::o;12186:186::-;11565:12;:10;:12::i;:::-;11554:23;;:7;:5;:7::i;:::-;:23;;;11546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12289:1:::1;12269:22;;:8;:22;;;;12261:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12339:28;12358:8;12339:18;:28::i;:::-;12186:186:::0;:::o;38505:28::-;;;;;;;;;;;;;:::o;21145:269::-;21247:4;21284:25;21269:40;;;:11;:40;;;;:96;;;;21332:33;21317:48;;;:11;:48;;;;21269:96;:140;;;;21373:36;21397:11;21373:23;:36::i;:::-;21269:140;21258:151;;21145:269;;;:::o;10288:89::-;10341:7;10362:10;10355:17;;10288:89;:::o;26425:118::-;26490:4;26536:1;26508:30;;:7;:16;26516:7;26508:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26501:37;;26425:118;;;:::o;29948:159::-;30044:2;30017:15;:24;30033:7;30017:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30094:7;30090:2;30056:46;;30065:23;30080:7;30065:14;:23::i;:::-;30056:46;;;;;;;;;;;;29948:159;;:::o;26686:327::-;26779:4;26798:16;26806:7;26798;:16::i;:::-;26790:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26868:13;26884:23;26899:7;26884:14;:23::i;:::-;26868:39;;26931:5;26920:16;;:7;:16;;;:51;;;;26964:7;26940:31;;:20;26952:7;26940:11;:20::i;:::-;:31;;;26920:51;:87;;;;26975:32;26992:5;26999:7;26975:16;:32::i;:::-;26920:87;26912:96;;;26686:327;;;;:::o;29348:500::-;29480:4;29453:31;;:23;29468:7;29453:14;:23::i;:::-;:31;;;29445:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29557:1;29543:16;;:2;:16;;;;29535:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29607:39;29628:4;29634:2;29638:7;29607:20;:39::i;:::-;29699:29;29716:1;29720:7;29699:8;:29::i;:::-;29754:1;29735:9;:15;29745:4;29735:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29777:1;29760:9;:13;29770:2;29760:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29802:2;29783:7;:16;29791:7;29783:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29835:7;29831:2;29816:27;;29825:4;29816:27;;;;;;;;;;;;29348:500;;;:::o;27322:101::-;27392:26;27402:2;27406:7;27392:26;;;;;;;;;;;;:9;:26::i;:::-;27322:101;;:::o;12517:170::-;12585:16;12604:6;;;;;;;;;;;12585:25;;12624:8;12615:6;;:17;;;;;;;;;;;;;;;;;;12673:8;12642:40;;12663:8;12642:40;;;;;;;;;;;;12517:170;;:::o;25866:273::-;25990:28;26000:4;26006:2;26010:7;25990:9;:28::i;:::-;26031:48;26054:4;26060:2;26064:7;26073:5;26031:22;:48::i;:::-;26023:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25866:273;;;;:::o;39963:105::-;40023:13;40050;40043:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39963:105;:::o;273:594::-;329:13;541:1;532:5;:10;528:38;;;550:10;;;;;;;;;;;;;;;;;;;;;528:38;570:12;585:5;570:20;;595:14;614:54;629:1;621:4;:9;614:54;;638:8;;;;;:::i;:::-;;;;660:2;652:10;;;;;:::i;:::-;;;614:54;;;672:19;704:6;694:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;672:39;;716:121;732:1;723:5;:10;716:121;;751:1;741:11;;;;;:::i;:::-;;;809:2;801:5;:10;;;;:::i;:::-;788:2;:24;;;;:::i;:::-;775:39;;758:6;765;758:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;829:2;820:11;;;;;:::i;:::-;;;716:121;;;855:6;841:21;;;;;273:594;;;;:::o;14105:148::-;14190:4;14223:25;14208:40;;;:11;:40;;;;14201:47;;14105:148;;;:::o;34204:487::-;34321:45;34348:4;34354:2;34358:7;34321:26;:45::i;:::-;34393:1;34377:18;;:4;:18;;;34373:157;;;34403:40;34435:7;34403:31;:40::i;:::-;34373:157;;;34467:2;34459:10;;:4;:10;;;34455:75;;34477:47;34510:4;34516:7;34477:32;:47::i;:::-;34455:75;34373:157;34552:1;34538:16;;:2;:16;;;34534:153;;;34562:45;34599:7;34562:36;:45::i;:::-;34534:153;;;34629:4;34623:10;;:2;:10;;;34619:68;;34641:40;34669:2;34673:7;34641:27;:40::i;:::-;34619:68;34534:153;34204:487;;;:::o;27635:261::-;27738:18;27744:2;27748:7;27738:5;:18::i;:::-;27774:54;27805:1;27809:2;27813:7;27822:5;27774:22;:54::i;:::-;27761:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;27635:261;;;:::o;30639:604::-;30767:4;30782:15;:2;:13;;;:15::i;:::-;30778:461;;;30825:2;30809:36;;;30846:12;:10;:12::i;:::-;30860:4;30866:7;30875:5;30809:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30805:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31035:1;31018:6;:13;:18;31014:185;;;31046:60;;;;;;;;;;:::i;:::-;;;;;;;;31014:185;31176:6;31170:13;31161:6;31157:2;31153:15;31146:38;30805:400;30930:41;;;30920:51;;;:6;:51;;;;30913:58;;;;;30778:461;31229:4;31222:11;;30639:604;;;;;;;:::o;31770:105::-;;;;:::o;35360:149::-;35458:10;:17;;;;35431:15;:24;35447:7;35431:24;;;;;;;;;;;:44;;;;35480:10;35496:7;35480:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35360:149;:::o;36109:898::-;36357:22;36407:1;36382:22;36399:4;36382:16;:22::i;:::-;:26;;;;:::i;:::-;36357:51;;36413:18;36434:17;:26;36452:7;36434:26;;;;;;;;;;;;36413:47;;36569:14;36555:10;:28;36551:295;;36591:19;36613:12;:18;36626:4;36613:18;;;;;;;;;;;;;;;:34;36632:14;36613:34;;;;;;;;;;;;36591:56;;36688:11;36655:12;:18;36668:4;36655:18;;;;;;;;;;;;;;;:30;36674:10;36655:30;;;;;;;;;;;:44;;;;36796:10;36763:17;:30;36781:11;36763:30;;;;;;;;;;;:43;;;;36551:295;;36930:17;:26;36948:7;36930:26;;;;;;;;;;;36923:33;;;36968:12;:18;36981:4;36968:18;;;;;;;;;;;;;;;:34;36987:14;36968:34;;;;;;;;;;;36961:41;;;36109:898;;;;:::o;37284:998::-;37519:22;37564:1;37544:10;:17;;;;:21;;;;:::i;:::-;37519:46;;37570:18;37591:15;:24;37607:7;37591:24;;;;;;;;;;;;37570:45;;37918:19;37940:10;37951:14;37940:26;;;;;;;;;;;;;;;;;;;;;;;;37918:48;;37998:11;37973:10;37984;37973:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;38103:10;38072:15;:28;38088:11;38072:28;;;;;;;;;;;:41;;;;38232:15;:24;38248:7;38232:24;;;;;;;;;;;38225:31;;;38261:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37284:998;;;;:::o;34974:200::-;35053:14;35070:20;35087:2;35070:16;:20::i;:::-;35053:37;;35122:7;35095:12;:16;35108:2;35095:16;;;;;;;;;;;;;;;:24;35112:6;35095:24;;;;;;;;;;;:34;;;;35163:6;35134:17;:26;35152:7;35134:26;;;;;;;;;;;:35;;;;34974:200;;;:::o;28193:343::-;28281:1;28267:16;;:2;:16;;;;28259:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28334:16;28342:7;28334;:16::i;:::-;28333:17;28325:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28390:45;28419:1;28423:2;28427:7;28390:20;:45::i;:::-;28459:1;28442:9;:13;28452:2;28442:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28484:2;28465:7;:16;28473:7;28465:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28523:7;28519:2;28498:33;;28515:1;28498:33;;;;;;;;;;;;28193:343;;:::o;3176:333::-;3236:4;3420:12;3472:7;3460:20;3452:28;;3503:1;3496:4;:8;3489:15;;;3176:333;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:520::-;;;6481:2;6469:9;6460:7;6456:23;6452:32;6449:2;;;6497:1;6494;6487:12;6449:2;6540:1;6565:53;6610:7;6601:6;6590:9;6586:22;6565:53;:::i;:::-;6555:63;;6511:117;6695:2;6684:9;6680:18;6667:32;6726:18;6718:6;6715:30;6712:2;;;6758:1;6755;6748:12;6712:2;6786:63;6841:7;6832:6;6821:9;6817:22;6786:63;:::i;:::-;6776:73;;6638:221;6439:427;;;;;:::o;6872:179::-;;6962:46;7004:3;6996:6;6962:46;:::i;:::-;7040:4;7035:3;7031:14;7017:28;;6952:99;;;;:::o;7057:118::-;7144:24;7162:5;7144:24;:::i;:::-;7139:3;7132:37;7122:53;;:::o;7211:732::-;;7359:54;7407:5;7359:54;:::i;:::-;7429:86;7508:6;7503:3;7429:86;:::i;:::-;7422:93;;7539:56;7589:5;7539:56;:::i;:::-;7618:7;7649:1;7634:284;7659:6;7656:1;7653:13;7634:284;;;7735:6;7729:13;7762:63;7821:3;7806:13;7762:63;:::i;:::-;7755:70;;7848:60;7901:6;7848:60;:::i;:::-;7838:70;;7694:224;7681:1;7678;7674:9;7669:14;;7634:284;;;7638:14;7934:3;7927:10;;7335:608;;;;;;;:::o;7949:109::-;8030:21;8045:5;8030:21;:::i;:::-;8025:3;8018:34;8008:50;;:::o;8064:360::-;;8178:38;8210:5;8178:38;:::i;:::-;8232:70;8295:6;8290:3;8232:70;:::i;:::-;8225:77;;8311:52;8356:6;8351:3;8344:4;8337:5;8333:16;8311:52;:::i;:::-;8388:29;8410:6;8388:29;:::i;:::-;8383:3;8379:39;8372:46;;8154:270;;;;;:::o;8452:849::-;;8594:5;8588:12;8623:36;8649:9;8623:36;:::i;:::-;8675:88;8756:6;8751:3;8675:88;:::i;:::-;8668:95;;8794:1;8783:9;8779:17;8810:1;8805:137;;;;8956:1;8951:344;;;;8772:523;;8805:137;8889:4;8885:9;8874;8870:25;8865:3;8858:38;8925:6;8920:3;8916:16;8909:23;;8805:137;;8951:344;9018:41;9053:5;9018:41;:::i;:::-;9081:1;9095:154;9109:6;9106:1;9103:13;9095:154;;;9183:7;9177:14;9173:1;9168:3;9164:11;9157:35;9233:1;9224:7;9220:15;9209:26;;9131:4;9128:1;9124:12;9119:17;;9095:154;;;9278:6;9273:3;9269:16;9262:23;;8958:337;;8772:523;;8561:740;;;;;;:::o;9307:364::-;;9423:39;9456:5;9423:39;:::i;:::-;9478:71;9542:6;9537:3;9478:71;:::i;:::-;9471:78;;9558:52;9603:6;9598:3;9591:4;9584:5;9580:16;9558:52;:::i;:::-;9635:29;9657:6;9635:29;:::i;:::-;9630:3;9626:39;9619:46;;9399:272;;;;;:::o;9677:377::-;;9811:39;9844:5;9811:39;:::i;:::-;9866:89;9948:6;9943:3;9866:89;:::i;:::-;9859:96;;9964:52;10009:6;10004:3;9997:4;9990:5;9986:16;9964:52;:::i;:::-;10041:6;10036:3;10032:16;10025:23;;9787:267;;;;;:::o;10060:309::-;;10223:67;10287:2;10282:3;10223:67;:::i;:::-;10216:74;;10320:13;10316:1;10311:3;10307:11;10300:34;10360:2;10355:3;10351:12;10344:19;;10206:163;;;:::o;10375:375::-;;10538:67;10602:2;10597:3;10538:67;:::i;:::-;10531:74;;10635:34;10631:1;10626:3;10622:11;10615:55;10701:13;10696:2;10691:3;10687:12;10680:35;10741:2;10736:3;10732:12;10725:19;;10521:229;;;:::o;10756:382::-;;10919:67;10983:2;10978:3;10919:67;:::i;:::-;10912:74;;11016:34;11012:1;11007:3;11003:11;10996:55;11082:20;11077:2;11072:3;11068:12;11061:42;11129:2;11124:3;11120:12;11113:19;;10902:236;;;:::o;11144:370::-;;11307:67;11371:2;11366:3;11307:67;:::i;:::-;11300:74;;11404:34;11400:1;11395:3;11391:11;11384:55;11470:8;11465:2;11460:3;11456:12;11449:30;11505:2;11500:3;11496:12;11489:19;;11290:224;;;:::o;11520:326::-;;11683:67;11747:2;11742:3;11683:67;:::i;:::-;11676:74;;11780:30;11776:1;11771:3;11767:11;11760:51;11837:2;11832:3;11828:12;11821:19;;11666:180;;;:::o;11852:316::-;;12015:67;12079:2;12074:3;12015:67;:::i;:::-;12008:74;;12112:20;12108:1;12103:3;12099:11;12092:41;12159:2;12154:3;12150:12;12143:19;;11998:170;;;:::o;12174:368::-;;12337:67;12401:2;12396:3;12337:67;:::i;:::-;12330:74;;12434:34;12430:1;12425:3;12421:11;12414:55;12500:6;12495:2;12490:3;12486:12;12479:28;12533:2;12528:3;12524:12;12517:19;;12320:222;;;:::o;12548:323::-;;12711:67;12775:2;12770:3;12711:67;:::i;:::-;12704:74;;12808:27;12804:1;12799:3;12795:11;12788:48;12862:2;12857:3;12853:12;12846:19;;12694:177;;;:::o;12877:376::-;;13040:67;13104:2;13099:3;13040:67;:::i;:::-;13033:74;;13137:34;13133:1;13128:3;13124:11;13117:55;13203:14;13198:2;13193:3;13189:12;13182:36;13244:2;13239:3;13235:12;13228:19;;13023:230;;;:::o;13259:388::-;;13422:67;13486:2;13481:3;13422:67;:::i;:::-;13415:74;;13519:34;13515:1;13510:3;13506:11;13499:55;13585:26;13580:2;13575:3;13571:12;13564:48;13638:2;13633:3;13629:12;13622:19;;13405:242;;;:::o;13653:313::-;;13816:67;13880:2;13875:3;13816:67;:::i;:::-;13809:74;;13913:17;13909:1;13904:3;13900:11;13893:38;13957:2;13952:3;13948:12;13941:19;;13799:167;;;:::o;13972:374::-;;14135:67;14199:2;14194:3;14135:67;:::i;:::-;14128:74;;14232:34;14228:1;14223:3;14219:11;14212:55;14298:12;14293:2;14288:3;14284:12;14277:34;14337:2;14332:3;14328:12;14321:19;;14118:228;;;:::o;14352:373::-;;14515:67;14579:2;14574:3;14515:67;:::i;:::-;14508:74;;14612:34;14608:1;14603:3;14599:11;14592:55;14678:11;14673:2;14668:3;14664:12;14657:33;14716:2;14711:3;14707:12;14700:19;;14498:227;;;:::o;14731:376::-;;14894:67;14958:2;14953:3;14894:67;:::i;:::-;14887:74;;14991:34;14987:1;14982:3;14978:11;14971:55;15057:14;15052:2;15047:3;15043:12;15036:36;15098:2;15093:3;15089:12;15082:19;;14877:230;;;:::o;15113:330::-;;15276:67;15340:2;15335:3;15276:67;:::i;:::-;15269:74;;15373:34;15369:1;15364:3;15360:11;15353:55;15434:2;15429:3;15425:12;15418:19;;15259:184;;;:::o;15449:376::-;;15612:67;15676:2;15671:3;15612:67;:::i;:::-;15605:74;;15709:34;15705:1;15700:3;15696:11;15689:55;15775:14;15770:2;15765:3;15761:12;15754:36;15816:2;15811:3;15807:12;15800:19;;15595:230;;;:::o;15831:330::-;;15994:67;16058:2;16053:3;15994:67;:::i;:::-;15987:74;;16091:34;16087:1;16082:3;16078:11;16071:55;16152:2;16147:3;16143:12;16136:19;;15977:184;;;:::o;16167:373::-;;16330:67;16394:2;16389:3;16330:67;:::i;:::-;16323:74;;16427:34;16423:1;16418:3;16414:11;16407:55;16493:11;16488:2;16483:3;16479:12;16472:33;16531:2;16526:3;16522:12;16515:19;;16313:227;;;:::o;16546:379::-;;16709:67;16773:2;16768:3;16709:67;:::i;:::-;16702:74;;16806:34;16802:1;16797:3;16793:11;16786:55;16872:17;16867:2;16862:3;16858:12;16851:39;16916:2;16911:3;16907:12;16900:19;;16692:233;;;:::o;16931:365::-;;17094:67;17158:2;17153:3;17094:67;:::i;:::-;17087:74;;17191:34;17187:1;17182:3;17178:11;17171:55;17257:3;17252:2;17247:3;17243:12;17236:25;17287:2;17282:3;17278:12;17271:19;;17077:219;;;:::o;17302:320::-;;17465:67;17529:2;17524:3;17465:67;:::i;:::-;17458:74;;17562:24;17558:1;17553:3;17549:11;17542:45;17613:2;17608:3;17604:12;17597:19;;17448:174;;;:::o;17628:381::-;;17791:67;17855:2;17850:3;17791:67;:::i;:::-;17784:74;;17888:34;17884:1;17879:3;17875:11;17868:55;17954:19;17949:2;17944:3;17940:12;17933:41;18000:2;17995:3;17991:12;17984:19;;17774:235;;;:::o;18015:376::-;;18178:67;18242:2;18237:3;18178:67;:::i;:::-;18171:74;;18275:34;18271:1;18266:3;18262:11;18255:55;18341:14;18336:2;18331:3;18327:12;18320:36;18382:2;18377:3;18373:12;18366:19;;18161:230;;;:::o;18397:320::-;;18560:67;18624:2;18619:3;18560:67;:::i;:::-;18553:74;;18657:24;18653:1;18648:3;18644:11;18637:45;18708:2;18703:3;18699:12;18692:19;;18543:174;;;:::o;18723:108::-;18800:24;18818:5;18800:24;:::i;:::-;18795:3;18788:37;18778:53;;:::o;18837:118::-;18924:24;18942:5;18924:24;:::i;:::-;18919:3;18912:37;18902:53;;:::o;18961:273::-;;19114:94;19204:3;19195:6;19114:94;:::i;:::-;19107:101;;19225:3;19218:10;;19096:138;;;;:::o;19240:435::-;;19442:95;19533:3;19524:6;19442:95;:::i;:::-;19435:102;;19554:95;19645:3;19636:6;19554:95;:::i;:::-;19547:102;;19666:3;19659:10;;19424:251;;;;;:::o;19681:222::-;;19812:2;19801:9;19797:18;19789:26;;19825:71;19893:1;19882:9;19878:17;19869:6;19825:71;:::i;:::-;19779:124;;;;:::o;19909:640::-;;20142:3;20131:9;20127:19;20119:27;;20156:71;20224:1;20213:9;20209:17;20200:6;20156:71;:::i;:::-;20237:72;20305:2;20294:9;20290:18;20281:6;20237:72;:::i;:::-;20319;20387:2;20376:9;20372:18;20363:6;20319:72;:::i;:::-;20438:9;20432:4;20428:20;20423:2;20412:9;20408:18;20401:48;20466:76;20537:4;20528:6;20466:76;:::i;:::-;20458:84;;20109:440;;;;;;;:::o;20555:373::-;;20736:2;20725:9;20721:18;20713:26;;20785:9;20779:4;20775:20;20771:1;20760:9;20756:17;20749:47;20813:108;20916:4;20907:6;20813:108;:::i;:::-;20805:116;;20703:225;;;;:::o;20934:210::-;;21059:2;21048:9;21044:18;21036:26;;21072:65;21134:1;21123:9;21119:17;21110:6;21072:65;:::i;:::-;21026:118;;;;:::o;21150:313::-;;21301:2;21290:9;21286:18;21278:26;;21350:9;21344:4;21340:20;21336:1;21325:9;21321:17;21314:47;21378:78;21451:4;21442:6;21378:78;:::i;:::-;21370:86;;21268:195;;;;:::o;21469:419::-;;21673:2;21662:9;21658:18;21650:26;;21722:9;21716:4;21712:20;21708:1;21697:9;21693:17;21686:47;21750:131;21876:4;21750:131;:::i;:::-;21742:139;;21640:248;;;:::o;21894:419::-;;22098:2;22087:9;22083:18;22075:26;;22147:9;22141:4;22137:20;22133:1;22122:9;22118:17;22111:47;22175:131;22301:4;22175:131;:::i;:::-;22167:139;;22065:248;;;:::o;22319:419::-;;22523:2;22512:9;22508:18;22500:26;;22572:9;22566:4;22562:20;22558:1;22547:9;22543:17;22536:47;22600:131;22726:4;22600:131;:::i;:::-;22592:139;;22490:248;;;:::o;22744:419::-;;22948:2;22937:9;22933:18;22925:26;;22997:9;22991:4;22987:20;22983:1;22972:9;22968:17;22961:47;23025:131;23151:4;23025:131;:::i;:::-;23017:139;;22915:248;;;:::o;23169:419::-;;23373:2;23362:9;23358:18;23350:26;;23422:9;23416:4;23412:20;23408:1;23397:9;23393:17;23386:47;23450:131;23576:4;23450:131;:::i;:::-;23442:139;;23340:248;;;:::o;23594:419::-;;23798:2;23787:9;23783:18;23775:26;;23847:9;23841:4;23837:20;23833:1;23822:9;23818:17;23811:47;23875:131;24001:4;23875:131;:::i;:::-;23867:139;;23765:248;;;:::o;24019:419::-;;24223:2;24212:9;24208:18;24200:26;;24272:9;24266:4;24262:20;24258:1;24247:9;24243:17;24236:47;24300:131;24426:4;24300:131;:::i;:::-;24292:139;;24190:248;;;:::o;24444:419::-;;24648:2;24637:9;24633:18;24625:26;;24697:9;24691:4;24687:20;24683:1;24672:9;24668:17;24661:47;24725:131;24851:4;24725:131;:::i;:::-;24717:139;;24615:248;;;:::o;24869:419::-;;25073:2;25062:9;25058:18;25050:26;;25122:9;25116:4;25112:20;25108:1;25097:9;25093:17;25086:47;25150:131;25276:4;25150:131;:::i;:::-;25142:139;;25040:248;;;:::o;25294:419::-;;25498:2;25487:9;25483:18;25475:26;;25547:9;25541:4;25537:20;25533:1;25522:9;25518:17;25511:47;25575:131;25701:4;25575:131;:::i;:::-;25567:139;;25465:248;;;:::o;25719:419::-;;25923:2;25912:9;25908:18;25900:26;;25972:9;25966:4;25962:20;25958:1;25947:9;25943:17;25936:47;26000:131;26126:4;26000:131;:::i;:::-;25992:139;;25890:248;;;:::o;26144:419::-;;26348:2;26337:9;26333:18;26325:26;;26397:9;26391:4;26387:20;26383:1;26372:9;26368:17;26361:47;26425:131;26551:4;26425:131;:::i;:::-;26417:139;;26315:248;;;:::o;26569:419::-;;26773:2;26762:9;26758:18;26750:26;;26822:9;26816:4;26812:20;26808:1;26797:9;26793:17;26786:47;26850:131;26976:4;26850:131;:::i;:::-;26842:139;;26740:248;;;:::o;26994:419::-;;27198:2;27187:9;27183:18;27175:26;;27247:9;27241:4;27237:20;27233:1;27222:9;27218:17;27211:47;27275:131;27401:4;27275:131;:::i;:::-;27267:139;;27165:248;;;:::o;27419:419::-;;27623:2;27612:9;27608:18;27600:26;;27672:9;27666:4;27662:20;27658:1;27647:9;27643:17;27636:47;27700:131;27826:4;27700:131;:::i;:::-;27692:139;;27590:248;;;:::o;27844:419::-;;28048:2;28037:9;28033:18;28025:26;;28097:9;28091:4;28087:20;28083:1;28072:9;28068:17;28061:47;28125:131;28251:4;28125:131;:::i;:::-;28117:139;;28015:248;;;:::o;28269:419::-;;28473:2;28462:9;28458:18;28450:26;;28522:9;28516:4;28512:20;28508:1;28497:9;28493:17;28486:47;28550:131;28676:4;28550:131;:::i;:::-;28542:139;;28440:248;;;:::o;28694:419::-;;28898:2;28887:9;28883:18;28875:26;;28947:9;28941:4;28937:20;28933:1;28922:9;28918:17;28911:47;28975:131;29101:4;28975:131;:::i;:::-;28967:139;;28865:248;;;:::o;29119:419::-;;29323:2;29312:9;29308:18;29300:26;;29372:9;29366:4;29362:20;29358:1;29347:9;29343:17;29336:47;29400:131;29526:4;29400:131;:::i;:::-;29392:139;;29290:248;;;:::o;29544:419::-;;29748:2;29737:9;29733:18;29725:26;;29797:9;29791:4;29787:20;29783:1;29772:9;29768:17;29761:47;29825:131;29951:4;29825:131;:::i;:::-;29817:139;;29715:248;;;:::o;29969:419::-;;30173:2;30162:9;30158:18;30150:26;;30222:9;30216:4;30212:20;30208:1;30197:9;30193:17;30186:47;30250:131;30376:4;30250:131;:::i;:::-;30242:139;;30140:248;;;:::o;30394:419::-;;30598:2;30587:9;30583:18;30575:26;;30647:9;30641:4;30637:20;30633:1;30622:9;30618:17;30611:47;30675:131;30801:4;30675:131;:::i;:::-;30667:139;;30565:248;;;:::o;30819:419::-;;31023:2;31012:9;31008:18;31000:26;;31072:9;31066:4;31062:20;31058:1;31047:9;31043:17;31036:47;31100:131;31226:4;31100:131;:::i;:::-;31092:139;;30990:248;;;:::o;31244:419::-;;31448:2;31437:9;31433:18;31425:26;;31497:9;31491:4;31487:20;31483:1;31472:9;31468:17;31461:47;31525:131;31651:4;31525:131;:::i;:::-;31517:139;;31415:248;;;:::o;31669:222::-;;31800:2;31789:9;31785:18;31777:26;;31813:71;31881:1;31870:9;31866:17;31857:6;31813:71;:::i;:::-;31767:124;;;;:::o;31897:283::-;;31963:2;31957:9;31947:19;;32005:4;31997:6;31993:17;32112:6;32100:10;32097:22;32076:18;32064:10;32061:34;32058:62;32055:2;;;32123:18;;:::i;:::-;32055:2;32163:10;32159:2;32152:22;31937:243;;;;:::o;32186:331::-;;32337:18;32329:6;32326:30;32323:2;;;32359:18;;:::i;:::-;32323:2;32444:4;32440:9;32433:4;32425:6;32421:17;32417:33;32409:41;;32505:4;32499;32495:15;32487:23;;32252:265;;;:::o;32523:332::-;;32675:18;32667:6;32664:30;32661:2;;;32697:18;;:::i;:::-;32661:2;32782:4;32778:9;32771:4;32763:6;32759:17;32755:33;32747:41;;32843:4;32837;32833:15;32825:23;;32590:265;;;:::o;32861:132::-;;32951:3;32943:11;;32981:4;32976:3;32972:14;32964:22;;32933:60;;;:::o;32999:144::-;;33074:3;33066:11;;33097:3;33094:1;33087:14;33131:4;33128:1;33118:18;33110:26;;33056:87;;;:::o;33149:114::-;;33250:5;33244:12;33234:22;;33223:40;;;:::o;33269:98::-;;33354:5;33348:12;33338:22;;33327:40;;;:::o;33373:99::-;;33459:5;33453:12;33443:22;;33432:40;;;:::o;33478:113::-;;33580:4;33575:3;33571:14;33563:22;;33553:38;;;:::o;33597:184::-;;33730:6;33725:3;33718:19;33770:4;33765:3;33761:14;33746:29;;33708:73;;;;:::o;33787:168::-;;33904:6;33899:3;33892:19;33944:4;33939:3;33935:14;33920:29;;33882:73;;;;:::o;33961:147::-;;34099:3;34084:18;;34074:34;;;;:::o;34114:169::-;;34232:6;34227:3;34220:19;34272:4;34267:3;34263:14;34248:29;;34210:73;;;;:::o;34289:148::-;;34428:3;34413:18;;34403:34;;;;:::o;34443:305::-;;34502:20;34520:1;34502:20;:::i;:::-;34497:25;;34536:20;34554:1;34536:20;:::i;:::-;34531:25;;34690:1;34622:66;34618:74;34615:1;34612:81;34609:2;;;34696:18;;:::i;:::-;34609:2;34740:1;34737;34733:9;34726:16;;34487:261;;;;:::o;34754:185::-;;34811:20;34829:1;34811:20;:::i;:::-;34806:25;;34845:20;34863:1;34845:20;:::i;:::-;34840:25;;34884:1;34874:2;;34889:18;;:::i;:::-;34874:2;34931:1;34928;34924:9;34919:14;;34796:143;;;;:::o;34945:348::-;;35008:20;35026:1;35008:20;:::i;:::-;35003:25;;35042:20;35060:1;35042:20;:::i;:::-;35037:25;;35230:1;35162:66;35158:74;35155:1;35152:81;35147:1;35140:9;35133:17;35129:105;35126:2;;;35237:18;;:::i;:::-;35126:2;35285:1;35282;35278:9;35267:20;;34993:300;;;;:::o;35299:191::-;;35359:20;35377:1;35359:20;:::i;:::-;35354:25;;35393:20;35411:1;35393:20;:::i;:::-;35388:25;;35432:1;35429;35426:8;35423:2;;;35437:18;;:::i;:::-;35423:2;35482:1;35479;35475:9;35467:17;;35344:146;;;;:::o;35496:96::-;;35562:24;35580:5;35562:24;:::i;:::-;35551:35;;35541:51;;;:::o;35598:90::-;;35675:5;35668:13;35661:21;35650:32;;35640:48;;;:::o;35694:149::-;;35770:66;35763:5;35759:78;35748:89;;35738:105;;;:::o;35849:126::-;;35926:42;35919:5;35915:54;35904:65;;35894:81;;;:::o;35981:77::-;;36047:5;36036:16;;36026:32;;;:::o;36064:154::-;36148:6;36143:3;36138;36125:30;36210:1;36201:6;36196:3;36192:16;36185:27;36115:103;;;:::o;36224:307::-;36292:1;36302:113;36316:6;36313:1;36310:13;36302:113;;;36401:1;36396:3;36392:11;36386:18;36382:1;36377:3;36373:11;36366:39;36338:2;36335:1;36331:10;36326:15;;36302:113;;;36433:6;36430:1;36427:13;36424:2;;;36513:1;36504:6;36499:3;36495:16;36488:27;36424:2;36273:258;;;;:::o;36537:320::-;;36618:1;36612:4;36608:12;36598:22;;36665:1;36659:4;36655:12;36686:18;36676:2;;36742:4;36734:6;36730:17;36720:27;;36676:2;36804;36796:6;36793:14;36773:18;36770:38;36767:2;;;36823:18;;:::i;:::-;36767:2;36588:269;;;;:::o;36863:233::-;;36925:24;36943:5;36925:24;:::i;:::-;36916:33;;36971:66;36964:5;36961:77;36958:2;;;37041:18;;:::i;:::-;36958:2;37088:1;37081:5;37077:13;37070:20;;36906:190;;;:::o;37102:176::-;;37151:20;37169:1;37151:20;:::i;:::-;37146:25;;37185:20;37203:1;37185:20;:::i;:::-;37180:25;;37224:1;37214:2;;37229:18;;:::i;:::-;37214:2;37270:1;37267;37263:9;37258:14;;37136:142;;;;:::o;37284:180::-;37332:77;37329:1;37322:88;37429:4;37426:1;37419:15;37453:4;37450:1;37443:15;37470:180;37518:77;37515:1;37508:88;37615:4;37612:1;37605:15;37639:4;37636:1;37629:15;37656:180;37704:77;37701:1;37694:88;37801:4;37798:1;37791:15;37825:4;37822:1;37815:15;37842:180;37890:77;37887:1;37880:88;37987:4;37984:1;37977:15;38011:4;38008:1;38001:15;38028:102;;38120:2;38116:7;38111:2;38104:5;38100:14;38096:28;38086:38;;38076:54;;;:::o;38136:122::-;38209:24;38227:5;38209:24;:::i;:::-;38202:5;38199:35;38189:2;;38248:1;38245;38238:12;38189:2;38179:79;:::o;38264:116::-;38334:21;38349:5;38334:21;:::i;:::-;38327:5;38324:32;38314:2;;38370:1;38367;38360:12;38314:2;38304:76;:::o;38386:120::-;38458:23;38475:5;38458:23;:::i;:::-;38451:5;38448:34;38438:2;;38496:1;38493;38486:12;38438:2;38428:78;:::o;38512:122::-;38585:24;38603:5;38585:24;:::i;:::-;38578:5;38575:35;38565:2;;38624:1;38621;38614:12;38565:2;38555:79;:::o

Swarm Source

ipfs://888be0b43f9492f32414bab45e59de4763c7e12dcc55dad81c0d3fa273614809
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.