Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
120 TOOLB
Holders
73
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TOOLBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Toolb
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-09 */ // // TTTTTTTTTTTTTTTTTTTTTTT OOOOOOOOO OOOOOOOOO LLLLLLLLLLL BBBBBBBBBBBBBBBBB // T:::::::::::::::::::::T OO:::::::::OO OO:::::::::OO L:::::::::L B::::::::::::::::B // T:::::::::::::::::::::T OO:::::::::::::OO OO:::::::::::::OO L:::::::::L B::::::BBBBBB:::::B // T:::::TT:::::::TT:::::TO:::::::OOO:::::::OO:::::::OOO:::::::OLL:::::::LL BB:::::B B:::::B // TTTTTT T:::::T TTTTTTO::::::O O::::::OO::::::O O::::::O L:::::L B::::B B:::::B // T:::::T O:::::O O:::::OO:::::O O:::::O L:::::L B::::B B:::::B // T:::::T O:::::O O:::::OO:::::O O:::::O L:::::L B::::BBBBBB:::::B // T:::::T O:::::O O:::::OO:::::O O:::::O L:::::L B:::::::::::::BB // T:::::T O:::::O O:::::OO:::::O O:::::O L:::::L B::::BBBBBB:::::B // T:::::T O:::::O O:::::OO:::::O O:::::O L:::::L B::::B B:::::B // T:::::T O:::::O O:::::OO:::::O O:::::O L:::::L B::::B B:::::B // T:::::T O::::::O O::::::OO::::::O O::::::O L:::::L LLLLLL B::::B B:::::B // TT:::::::TT O:::::::OOO:::::::OO:::::::OOO:::::::OLL:::::::LLLLLLLLL:::::LBB:::::BBBBBB::::::B // T:::::::::T OO:::::::::::::OO OO:::::::::::::OO L::::::::::::::::::::::LB:::::::::::::::::B // T:::::::::T OO:::::::::OO OO:::::::::OO L::::::::::::::::::::::LB::::::::::::::::B // TTTTTTTTTTT OOOOOOOOO OOOOOOOOO LLLLLLLLLLLLLLLLLLLLLLLLBBBBBBBBBBBBBBBBB // // TOOLB si yllacisab sselhtrow. // // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @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 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; } /** * @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); } } /* * @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 Dand * 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() { _setOwner(_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"); _; } modifier onlyContributors() { require( owner() == _msgSender() || address(0x6e7592ff3C32c93A520A11020379d66Ab844Bf5B) == _msgSender() || address(0x697D01147ddA54cd4279498892d8C59e4BEd00a4) == _msgSender() || address(0x1cD69A22D7685E692d283159679397B2D6F1882C) == _msgSender() , "Caller must be owner or a contributor"); _; } /** * @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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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); } /** * @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); } /** * @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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 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 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(to).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 {} } /** * @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 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 Toolb is ERC721Enumerable, ReentrancyGuard, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; mapping(string => uint256) snoitpo; mapping(string => mapping(uint256 => string)) pamtoolb; mapping(uint256 => uint256) detaerCnehw; constructor() ERC721("TOOLB", "TOOLB") Ownable() { toolbWenDda("snopaew", "Tsoptihs"); toolbWenDda("snopaew", "Teewt"); toolbWenDda("snopaew", "Tnim"); toolbWenDda("snopaew", "Regdel"); toolbWenDda("snopaew", "Eidooh"); toolbWenDda("snopaew", "Etteugab"); toolbWenDda("snopaew", "Tsopllihs"); toolbWenDda("snopaew", "Pmup"); toolbWenDda("snopaew", "Niahckcolb"); toolbWenDda("snopaew", "Tellaw Ytpme"); toolbWenDda("snopaew", "GEPJ"); toolbWenDda("snopaew", "Raw Sag"); toolbWenDda("snopaew", "Tsop MG"); toolbWenDda("snopaew", "MD"); toolbWenDda("snopaew", "Tcartnoc Trams"); toolbWenDda("snopaew", "Gnipmud"); toolbWenDda("snopaew", "Ecaps Rettiwt"); toolbWenDda("snopaew", "Remmah Nab"); toolbWenDda("romrAtsehc", "Ebor Erusaelp"); toolbWenDda("romrAtsehc", "Ebor Yppirt"); toolbWenDda("romrAtsehc", "Riah Tsehc Tpmeknu"); toolbWenDda("romrAtsehc", "Gnir Elppin Revlis"); toolbWenDda("romrAtsehc", "Knat Deniatstaews"); toolbWenDda("romrAtsehc", "Taoc Pmip"); toolbWenDda("romrAtsehc", "Tiusecaps"); toolbWenDda("romrAtsehc", "Tius Kcalb"); toolbWenDda("romrAtsehc", "Romra Erar Repus"); toolbWenDda("romrAtsehc", "Epac Lanoitadnuof"); toolbWenDda("romrAtsehc", "Tsehc Deottat"); toolbWenDda("romrAtsehc", "Romra Siseneg"); toolbWenDda("romrAtsehc", "Taoc Knim Tnim"); toolbWenDda("romrAtsehc", "Triks Ixam"); toolbWenDda("romrAtsehc", "Tlep Yloh"); toolbWenDda("romrAdaeh", "Pac Relleporp"); toolbWenDda("romrAdaeh", "Sessalg D3"); toolbWenDda("romrAdaeh", "Ksam Atem"); toolbWenDda("romrAdaeh", "Tah S'Niatpac"); toolbWenDda("romrAdaeh", "Tah Pot"); toolbWenDda("romrAdaeh", "Riah Ygnirts"); toolbWenDda("romrAdaeh", "Epip Gnikoms"); toolbWenDda("romrAdaeh", "Selggog Rv"); toolbWenDda("romrAdaeh", "Nworc S'Gnik"); toolbWenDda("romrAdaeh", "Kcuf Dlab"); toolbWenDda("romrAdaeh", "Seye Oloh"); toolbWenDda("romrAdaeh", "Htuom Azzip"); toolbWenDda("romrAdaeh", "Tah Ytrap"); toolbWenDda("romrAdaeh", "Daehodlid"); toolbWenDda("romrAtsiaw", "Tleb Rehtael"); toolbWenDda("romrAtsiaw", "Toor Yhtrig"); toolbWenDda("romrAtsiaw", "Hsas Dnomaid"); toolbWenDda("romrAtsiaw", "Dnab"); toolbWenDda("romrAtsiaw", "Parts"); toolbWenDda("romrAtsiaw", "Pool Gnidaol"); toolbWenDda("romrAtsiaw", "Parts Nedlog"); toolbWenDda("romrAtsiaw", "Hsas Nrot"); toolbWenDda("romrAtsiaw", "Parts Elbuod"); toolbWenDda("romrAtsiaw", "Pool Nrow"); toolbWenDda("romrAtsiaw", "Tleb Ytitsahc"); toolbWenDda("romrAtsiaw", "Hsas"); toolbWenDda("romrAtsiaw", "Tleb"); toolbWenDda("romrAtsiaw", "Hsas Ittehgaps"); toolbWenDda("romrAtsiaw", "Pilc Yenom"); toolbWenDda("romrAtoof", "Seohs"); toolbWenDda("romrAtoof", "Skcik Dettod"); toolbWenDda("romrAtoof", "Srekciktihs Ytrid"); toolbWenDda("romrAtoof", "Srepmots Llort"); toolbWenDda("romrAtoof", "Stoob Deotleets"); toolbWenDda("romrAtoof", "Seohs Roolf"); toolbWenDda("romrAtoof", "Seohs Yttihs"); toolbWenDda("romrAtoof", "Spolfpilf Yggos"); toolbWenDda("romrAtoof", "Stoob Niar"); toolbWenDda("romrAtoof", "Seohs Noom"); toolbWenDda("romrAtoof", "Skcik Knup"); toolbWenDda("romrAtoof", "Secal"); toolbWenDda("romrAtoof", "Skcik Pu Depmup"); toolbWenDda("romrAdnah", "Sevolg Dedduts"); toolbWenDda("romrAdnah", "Sdnah Dnomaid"); toolbWenDda("romrAdnah", "Sdnah Repap"); toolbWenDda("romrAdnah", "Sdnah Eldoon"); toolbWenDda("romrAdnah", "Sdnah Kaew"); toolbWenDda("romrAdnah", "Sregnif Rettiwt"); toolbWenDda("romrAdnah", "Sevolg Nemhcneh"); toolbWenDda("romrAdnah", "Sdnah S'Kilativ"); toolbWenDda("romrAdnah", "Sdnah Relkcit"); toolbWenDda("romrAdnah", "Selkcunk Ssarb"); toolbWenDda("romrAdnah", "Snettim Atem"); toolbWenDda("secalkcen", "Tnadnep"); toolbWenDda("secalkcen", "Niahc"); toolbWenDda("secalkcen", "Rekohc"); toolbWenDda("secalkcen", "Teknirt"); toolbWenDda("secalkcen", "Gag Llab"); toolbWenDda("sgnir", "Gnir Kcoc"); toolbWenDda("sgnir", "Yek Obmal"); toolbWenDda("sgnir", "Gnir Dlog"); toolbWenDda("sgnir", "Gnir Ruf Epa"); toolbWenDda("sgnir", "Dnab Detalexip"); toolbWenDda("sgnir", "Gnir Gniddew S'knufg"); toolbWenDda("sgnir", "Regnir"); toolbWenDda("sexiffus", "Epoc Fo"); toolbWenDda("sexiffus", "DUF Fo"); toolbWenDda("sexiffus", "Tihs Fo"); toolbWenDda("sexiffus", "Egar Fo"); toolbWenDda("sexiffus", "Loirtiv Fo"); toolbWenDda("sexiffus", "Gnimraf Tnemegagne Fo"); toolbWenDda("sexiffus", "IMGN Fo"); toolbWenDda("sexiffus", "IMGAW Fo"); toolbWenDda("sexiffus", "Sgur Gnillup Fo"); toolbWenDda("sexiffus", "LDOH Fo"); toolbWenDda("sexiffus", "OMOF Fo"); toolbWenDda("sexiffus", "Sag Fo"); toolbWenDda("sexiffus", "Sraet Llort 0001 Fo"); toolbWenDda("sexiffus", "Sniag Fo"); toolbWenDda("sexiffus", "Htaed Fo"); toolbWenDda("sexiffus", "Kcuf Fo"); toolbWenDda("sexiffus", "Kcoc Fo"); toolbWenDda("sexiferPeman", "Ysknarp"); toolbWenDda("sexiferPeman", "Delgnafwen"); toolbWenDda("sexiferPeman", "Atem"); toolbWenDda("sexiferPeman", "Elahw"); toolbWenDda("sexiferPeman", "Tsxhg"); toolbWenDda("sexiferPeman", "Redlohgab"); toolbWenDda("sexiferPeman", "Noom"); toolbWenDda("sexiferPeman", "Tker"); toolbWenDda("sexiferPeman", "Epa"); toolbWenDda("sexiferPeman", "Bulc Thcay"); toolbWenDda("sexiferPeman", "Knup"); toolbWenDda("sexiferPeman", "Pordria"); toolbWenDda("sexiferPeman", "Gab"); toolbWenDda("sexiferPeman", "OAD"); toolbWenDda("sexiferPeman", "Neged"); toolbWenDda("sexiferPeman", "ROYD"); toolbWenDda("sexiferPeman", "127-CRE"); toolbWenDda("sexiferPeman", "5511-CRE"); toolbWenDda("sexiferPeman", "02-CRE"); toolbWenDda("sexiferPeman", "TFN"); toolbWenDda("sexiferPeman", "Llup Gur"); toolbWenDda("sexiferPeman", "Pid"); toolbWenDda("sexiferPeman", "Gnineppilf"); toolbWenDda("sexiferPeman", "Boon"); toolbWenDda("sexiferPeman", "Raeb"); toolbWenDda("sexiferPeman", "Llub"); toolbWenDda("sexiferPeman", "Ixam"); toolbWenDda("sexiferPeman", "Kcolb Tra"); toolbWenDda("sexiferPeman", "Dnegel"); toolbWenDda("sexiferPeman", "Retsam"); toolbWenDda("sexiferPeman", "Eibmoz"); toolbWenDda("sexiferPeman", "Neila"); toolbWenDda("sexiferPeman", "Taog"); toolbWenDda("sexiferPeman", "YPOCX"); toolbWenDda("sexiferPeman", "Tac Looc"); toolbWenDda("sexiferPeman", "1N0"); toolbWenDda("sexiferPeman", "Niugnep"); toolbWenDda("sexiferPeman", "Dneirfeev"); toolbWenDda("sexiferPeman", "Tacnoom"); toolbWenDda("sexiferPeman", "Hpylgotua"); toolbWenDda("sexiferPeman", "Noteleks"); toolbWenDda("sexiferPeman", "Ssa"); toolbWenDda("sexiferPeman", "Sinep"); toolbWenDda("sexiferPeman", "Htaed"); toolbWenDda("sexiferPeman", "Roolf"); toolbWenDda("sexiferPeman", "Gniliec"); toolbWenDda("sexiferPeman", "Einaeb"); toolbWenDda("sexiferPeman", "Llerro"); toolbWenDda("sexiferPeman", "RemraFoport"); toolbWenDda("sexiferPeman", "Renob"); toolbWenDda("sexiferPeman", "Itey"); toolbWenDda("sexiferPeman", "Aznedif"); toolbWenDda("sexiferPeman", "Ybbuhc"); toolbWenDda("sexiferPeman", "Maerc"); toolbWenDda("sexiferPeman", "Tcartnoc"); toolbWenDda("sexiferPeman", "Dlofinam"); toolbWenDda("sexiferPeman", "Ralohcs Eixa"); toolbWenDda("sexiferPeman", "Evitavired"); toolbWenDda("sexiferPeman", "Gnik"); toolbWenDda("sexiferPeman", "Neeuq"); toolbWenDda("sexiferPeman", "Noitacifirev"); toolbWenDda("sexiferPeman", "Niap"); toolbWenDda("sexiferPeman", "Ytidiuqil"); toolbWenDda("sexiferPeman", "Ezeed"); toolbWenDda("sexiferPeman", "Knufg"); toolbWenDda("sexiffuSeman", "Repsihw"); toolbWenDda("sexiffuSeman", "Pmud"); toolbWenDda("sexiffuSeman", "Raet"); toolbWenDda("sexiffuSeman", "Hctib"); toolbWenDda("sexiffuSeman", "Noom"); toolbWenDda("sexiffuSeman", "Hcnelc"); toolbWenDda("sexiffuSeman", "Msij"); toolbWenDda("sexiffuSeman", "Repmihw"); toolbWenDda("sexiffuSeman", "Lleh"); toolbWenDda("sexiffuSeman", "Xes"); toolbWenDda("sexiffuSeman", "Pot"); toolbWenDda("sexiffuSeman", "Retniw"); toolbWenDda("sexiffuSeman", "Noitalutipac"); toolbWenDda("sexiffuSeman", "Roop"); toolbWenDda("sexiffuSeman", "S'DlanoDcM"); } function toolbWenDda(string memory yek, string memory eulav) internal returns(bool success) { uint256 tnuoc_snoitpo = snoitpo[yek]; pamtoolb[yek][tnuoc_snoitpo] = eulav; snoitpo[yek]=tnuoc_snoitpo+1; return true; } function modnar(uint256 tokenId, string memory tupni) internal view returns (uint256) { string memory detaerCnekot = toString(detaerCnehw[tokenId]); return uint256(keccak256(abi.encodePacked(string(abi.encodePacked("Block:", detaerCnekot, "Domain:", tupni))))); } function kculp(uint256 tokenId, string memory xiferPyek) internal view returns (string memory, string memory, uint256) { string memory rts_tokenId = toString(tokenId); uint256 dnar = modnar(tokenId, string(abi.encodePacked(xiferPyek, rts_tokenId))); uint256 sepyt = snoitpo[xiferPyek]; string memory tuptuo = pamtoolb[xiferPyek][dnar % sepyt]; string memory elpmis = tuptuo; uint256 ssentaerg = dnar % 21; if (ssentaerg > 14) { uint256 dnar_sexiffus = modnar(tokenId, string(abi.encodePacked(xiferPyek, rts_tokenId))); uint256 nel_sexiffus = snoitpo["sexiffus"]; tuptuo = string(abi.encodePacked(pamtoolb["sexiffus"][dnar_sexiffus % nel_sexiffus], " ", tuptuo)); } if (ssentaerg >= 19) { uint256 dnar_sexiferPeman = modnar(tokenId, string(abi.encodePacked(xiferPyek, "sexiferPeman", rts_tokenId))); uint256 nel_sexiferPeman = snoitpo["sexiferPeman"]; uint256 dnar_sexiffuSeman = modnar(tokenId, string(abi.encodePacked(xiferPyek, "sexiffuSeman", rts_tokenId))); uint256 nel_sexiffuSeman = snoitpo["sexiffuSeman"]; string memory xiferPeman = pamtoolb["sexiferPeman"][dnar_sexiferPeman % nel_sexiferPeman]; string memory xiffuSeman = pamtoolb["sexiffuSeman"][dnar_sexiffuSeman % nel_sexiffuSeman]; if (ssentaerg == 19) { tuptuo = string(abi.encodePacked(tuptuo, ' "', xiffuSeman, ' ', xiferPeman, '"')); } else { tuptuo = string(abi.encodePacked("1+ ", tuptuo, ' "', xiffuSeman, ' ', xiferPeman, '"')); } } return (tuptuo, elpmis, ssentaerg); } function toolbteg(uint256 dInoket, uint256 yrtne, string memory dleif, string[10] memory strap, string[10] memory setubirtta) internal view returns (uint256) { uint256 xedni = yrtne + 1; string memory meti; string memory elpmis; uint256 ssentaerg = 0; (meti, elpmis, ssentaerg) = kculp(dInoket, dleif); strap[xedni] = string(abi.encodePacked('<text x="10" y="', toString(20 * xedni), '" class="base">', meti, '</text>')); setubirtta[xedni] = string(abi.encodePacked('{"trait_type": "', dleif,'", "value": "', elpmis, '"},')); return ssentaerg; } function tokenURI(uint256 tokenId) override public view returns (string memory) { require(detaerCnehw[tokenId] > 0, "Token not yet created"); uint256 ssentaerg = 0; string[10] memory strap; string[10] memory setubirtta; strap[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: black; font-family: serifs; font-size: 14px; }</style><rect width="100%" height="100%" fill="#00FFFF" />'; setubirtta[0] = '"attributes": ['; ssentaerg += toolbteg(tokenId, 0, "snopaew", strap, setubirtta); ssentaerg += toolbteg(tokenId, 1, "romrAtsehc", strap, setubirtta); ssentaerg += toolbteg(tokenId, 2, "romrAdaeh", strap, setubirtta); ssentaerg += toolbteg(tokenId, 3, "romrAtsiaw", strap, setubirtta); ssentaerg += toolbteg(tokenId, 4, "romrAtoof", strap, setubirtta); ssentaerg += toolbteg(tokenId, 5, "romrAdnah", strap, setubirtta); ssentaerg += toolbteg(tokenId, 6, "secalkcen", strap, setubirtta); ssentaerg += toolbteg(tokenId, 7, "sgnir", strap, setubirtta); strap[9] = '</svg>'; setubirtta[9] = string(abi.encodePacked('{"trait_type": "ssentaerg", "value": ', toString(ssentaerg), '}]')); string memory tuptuo = string(abi.encodePacked(strap[0], strap[1], strap[2], strap[3], strap[4], strap[5], strap[6], strap[7])); tuptuo = string(abi.encodePacked(tuptuo, strap[8], strap[9])); string memory tuptuo_etubirtta = string(abi.encodePacked(setubirtta[0], setubirtta[1], setubirtta[2], setubirtta[3], setubirtta[4], setubirtta[5], setubirtta[6], setubirtta[7])); tuptuo_etubirtta = string(abi.encodePacked(tuptuo_etubirtta, setubirtta[8], setubirtta[9])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "TOOLB #', toString(tokenId), '", "description": ".sselhtrow yllacisab si TOOLB", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(tuptuo)), '", ', tuptuo_etubirtta, '}')))); tuptuo = string(abi.encodePacked('data:application/json;base64,', json)); return tuptuo; } function mint(uint8 _quantityToMint) public payable { require(_quantityToMint >= 1, "Must mint at least 1"); require(_quantityToMint <= 7, "Limit of 7 per txn"); require((_quantityToMint + ERC721.balanceOf(_msgSender())) <= 40, "Max tokens per address is 40"); require((_quantityToMint + totalSupply()) <= 4004, "Requested mint exceeds max"); require(msg.value == (10_000_000_000_000_000 * _quantityToMint), "Minting fee is 0.01 eth per token"); for (uint8 i = 0; i < _quantityToMint; i++) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _safeMint(_msgSender(), newItemId); detaerCnehw[newItemId] = block.number; } } // Function to receive Ether. msg.data must be empty receive() external payable {} // Withdraw ether from contract function withdraw() public onlyContributors { require(address(this).balance > 0, "Balance must be positive"); address payable a = payable(address(0x6e7592ff3C32c93A520A11020379d66Ab844Bf5B)); address payable b = payable(address(0x697D01147ddA54cd4279498892d8C59e4BEd00a4)); address payable c = payable(address(0x1cD69A22D7685E692d283159679397B2D6F1882C)); uint256 share = address(this).balance/3; (bool success, ) = a.call{value: share}(""); require(success == true, "Failed to withdraw ether"); (success, ) = b.call{value: share}(""); require(success == true, "Failed to withdraw ether"); (success, ) = c.call{value: share}(""); require(success == true, "Failed to withdraw ether"); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040805180820182526005808252642a27a7a62160d91b6020808401828152855180870190965292855284015281519192916200005291600091620042b8565b50805162000068906001906020840190620042b8565b50506001600a55506200007b33620041be565b620000cc60405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600881526020016754736f707469687360c01b8152506200421060201b60201c565b506200011b60405180604001604052806007815260200166736e6f7061657760c81b815250604051806040016040528060058152602001641519595ddd60da1b8152506200421060201b60201c565b506200016960405180604001604052806007815260200166736e6f7061657760c81b81525060405180604001604052806004815260200163546e696d60e01b8152506200421060201b60201c565b50620001b960405180604001604052806007815260200166736e6f7061657760c81b81525060405180604001604052806006815260200165149959d9195b60d21b8152506200421060201b60201c565b506200020960405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600681526020016508ad2c8deded60d31b8152506200421060201b60201c565b506200025b60405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600881526020016722ba3a32bab3b0b160c11b8152506200421060201b60201c565b50620002ae60405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600981526020016854736f706c6c69687360b81b8152506200421060201b60201c565b50620002fc60405180604001604052806007815260200166736e6f7061657760c81b815250604051806040016040528060048152602001630506d75760e41b8152506200421060201b60201c565b506200035060405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600a8152602001692734b0b431b5b1b7b63160b11b8152506200421060201b60201c565b50620003a660405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600c81526020016b54656c6c6177205974706d6560a01b8152506200421060201b60201c565b50620003f460405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600481526020016323a2a82560e11b8152506200421060201b60201c565b506200044560405180604001604052806007815260200166736e6f7061657760c81b815250604051806040016040528060078152602001665261772053616760c81b8152506200421060201b60201c565b506200049660405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600781526020016654736f70204d4760c81b8152506200421060201b60201c565b50620004e260405180604001604052806007815260200166736e6f7061657760c81b81525060405180604001604052806002815260200161135160f21b8152506200421060201b60201c565b506200053a60405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600e81526020016d54636172746e6f63205472616d7360901b8152506200421060201b60201c565b506200058b60405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600781526020016611db9a5c1b5d5960ca1b8152506200421060201b60201c565b50620005e260405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600d81526020016c1158d85c1cc814995d1d1a5ddd609a1b8152506200421060201b60201c565b506200063660405180604001604052806007815260200166736e6f7061657760c81b8152506040518060400160405280600a8152602001692932b6b6b0b4102730b160b11b8152506200421060201b60201c565b50620006906040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600d81526020016c045626f72204572757361656c7609c1b8152506200421060201b60201c565b50620006e86040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600b81526020016a11589bdc88165c1c1a5c9d60aa1b8152506200421060201b60201c565b50620007476040518060400160405280600a815260200169726f6d7241747365686360b01b81525060405180604001604052806012815260200171526961682054736568632054706d656b6e7560701b8152506200421060201b60201c565b50620007a66040518060400160405280600a815260200169726f6d7241747365686360b01b81525060405180604001604052806012815260200171476e697220456c7070696e205265766c697360701b8152506200421060201b60201c565b50620008046040518060400160405280600a815260200169726f6d7241747365686360b01b815250604051806040016040528060118152602001704b6e61742044656e69617473746165777360781b8152506200421060201b60201c565b506200085a6040518060400160405280600a815260200169726f6d7241747365686360b01b81525060405180604001604052806009815260200168054616f6320506d69760bc1b8152506200421060201b60201c565b50620008b06040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600981526020016854697573656361707360b81b8152506200421060201b60201c565b50620009076040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600a8152602001692a34bab99025b1b0b63160b11b8152506200421060201b60201c565b50620009646040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280601081526020016f526f6d7261204572617220526570757360801b8152506200421060201b60201c565b50620009c26040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280601181526020017022b830b1902630b737b4ba30b2373ab7b360791b8152506200421060201b60201c565b5062000a1c6040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600d81526020016c151cd95a18c811195bdd1d185d609a1b8152506200421060201b60201c565b5062000a766040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600d81526020016c526f6d726120536973656e656760981b8152506200421060201b60201c565b5062000ad16040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600e81526020016d54616f63204b6e696d20546e696d60901b8152506200421060201b60201c565b5062000b286040518060400160405280600a815260200169726f6d7241747365686360b01b8152506040518060400160405280600a8152602001695472696b73204978616d60b01b8152506200421060201b60201c565b5062000b7e6040518060400160405280600a815260200169726f6d7241747365686360b01b815250604051806040016040528060098152602001680a8d8cae040b2d8ded60bb1b8152506200421060201b60201c565b5062000bd7604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600d81526020016c05061632052656c6c65706f727609c1b8152506200421060201b60201c565b5062000c2d604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600a81526020016953657373616c6720443360b01b8152506200421060201b60201c565b5062000c82604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b815250604051806040016040528060098152602001684b73616d204174656d60b81b8152506200421060201b60201c565b5062000cdb604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600d81526020016c5461682053274e69617470616360981b8152506200421060201b60201c565b5062000d2e604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600781526020016615185a08141bdd60ca1b8152506200421060201b60201c565b5062000d86604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600c81526020016b526961682059676e6972747360a01b8152506200421060201b60201c565b5062000dde604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600c81526020016b4570697020476e696b6f6d7360a01b8152506200421060201b60201c565b5062000e34604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600a81526020016929b2b633b3b7b390293b60b11b8152506200421060201b60201c565b5062000e8c604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600c81526020016b4e776f7263205327476e696b60a01b8152506200421060201b60201c565b5062000ee1604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600981526020016825b1bab310223630b160b91b8152506200421060201b60201c565b5062000f36604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b815250604051806040016040528060098152602001680a6caf2ca409ed8ded60bb1b8152506200421060201b60201c565b5062000f8d604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600b81526020016a04874756f6d20417a7a69760ac1b8152506200421060201b60201c565b5062000fe2604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152506040518060400160405280600981526020016805461682059747261760bc1b8152506200421060201b60201c565b5062001037604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b815250604051806040016040528060098152602001681118595a1bd91b1a5960ba1b8152506200421060201b60201c565b50620010906040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600c81526020016b151b19588814995a1d18595b60a21b8152506200421060201b60201c565b50620010e86040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600b81526020016a546f6f722059687472696760a81b8152506200421060201b60201c565b50620011416040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600c81526020016b121cd85cc8111b9bdb585a5960a21b8152506200421060201b60201c565b50620011926040518060400160405280600a815260200169726f6d7241747369617760b01b81525060405180604001604052806004815260200163223730b160e11b8152506200421060201b60201c565b50620011e46040518060400160405280600a815260200169726f6d7241747369617760b01b81525060405180604001604052806005815260200164506172747360d81b8152506200421060201b60201c565b506200123d6040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600c81526020016b141bdbdb0811db9a59185bdb60a21b8152506200421060201b60201c565b50620012966040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600c81526020016b5061727473204e65646c6f6760a01b8152506200421060201b60201c565b50620012ec6040518060400160405280600a815260200169726f6d7241747369617760b01b81525060405180604001604052806009815260200168121cd85cc8139c9bdd60ba1b8152506200421060201b60201c565b50620013456040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600c81526020016b14185c9d1cc8115b189d5bd960a21b8152506200421060201b60201c565b506200139b6040518060400160405280600a815260200169726f6d7241747369617760b01b81525060405180604001604052806009815260200168506f6f6c204e726f7760b81b8152506200421060201b60201c565b50620013f56040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600d81526020016c546c656220597469747361686360981b8152506200421060201b60201c565b50620014466040518060400160405280600a815260200169726f6d7241747369617760b01b815250604051806040016040528060048152602001634873617360e01b8152506200421060201b60201c565b50620014976040518060400160405280600a815260200169726f6d7241747369617760b01b815250604051806040016040528060048152602001632a3632b160e11b8152506200421060201b60201c565b50620014f26040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600e81526020016d487361732049747465686761707360901b8152506200421060201b60201c565b50620015496040518060400160405280600a815260200169726f6d7241747369617760b01b8152506040518060400160405280600a81526020016950696c632059656e6f6d60b01b8152506200421060201b60201c565b506200159a604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600581526020016453656f687360d81b8152506200421060201b60201c565b50620015f2604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600c81526020016b14dad8da5ac811195d1d1bd960a21b8152506200421060201b60201c565b506200164f604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280601181526020017014dc995ad8da5add1a5a1cc8165d1c9a59607a1b8152506200421060201b60201c565b50620016a9604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600e81526020016d14dc995c1b5bdd1cc8131b1bdc9d60921b8152506200421060201b60201c565b5062001704604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600f81526020016e53746f6f622044656f746c6565747360881b8152506200421060201b60201c565b506200175b604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600b81526020016a29b2b7b439902937b7b63360a91b8152506200421060201b60201c565b50620017b3604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600c81526020016b53656f68732059747469687360a01b8152506200421060201b60201c565b506200180e604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600f81526020016e53706f6c6670696c66205967676f7360881b8152506200421060201b60201c565b5062001864604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600a81526020016929ba37b7b1102734b0b960b11b8152506200421060201b60201c565b50620018ba604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600a81526020016953656f6873204e6f6f6d60b01b8152506200421060201b60201c565b5062001910604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600a8152602001690536b63696b204b6e75760b41b8152506200421060201b60201c565b5062001961604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600581526020016414d958d85b60da1b8152506200421060201b60201c565b50620019bc604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152506040518060400160405280600f81526020016e0536b63696b205075204465706d757608c1b8152506200421060201b60201c565b5062001a16604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600e81526020016d5365766f6c67204465646475747360901b8152506200421060201b60201c565b5062001a6f604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600d81526020016c14d91b985a08111b9bdb585a59609a1b8152506200421060201b60201c565b5062001ac6604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600b81526020016a053646e61682052657061760ac1b8152506200421060201b60201c565b5062001b1e604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600c81526020016b29b23730b41022b63237b7b760a11b8152506200421060201b60201c565b5062001b74604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600a81526020016953646e6168204b61657760b01b8152506200421060201b60201c565b5062001bcf604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600f81526020016e14dc9959db9a598814995d1d1a5ddd608a1b8152506200421060201b60201c565b5062001c2a604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600f81526020016e0a6caecded8ce409ccadad0c6dccad608b1b8152506200421060201b60201c565b5062001c85604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600f81526020016e29b23730b4102993a5b4b630ba34bb60891b8152506200421060201b60201c565b5062001cde604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600d81526020016c14d91b985a0814995b1ad8da5d609a1b8152506200421060201b60201c565b5062001d38604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600e81526020016d29b2b635b1bab7359029b9b0b93160911b8152506200421060201b60201c565b5062001d90604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152506040518060400160405280600c81526020016b536e657474696d204174656d60a01b8152506200421060201b60201c565b5062001de36040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b815250604051806040016040528060078152602001660546e61646e65760cc1b8152506200421060201b60201c565b5062001e346040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b815250604051806040016040528060058152602001644e6961686360d81b8152506200421060201b60201c565b5062001e866040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b8152506040518060400160405280600681526020016552656b6f686360d01b8152506200421060201b60201c565b5062001ed96040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b8152506040518060400160405280600781526020016615195adb9a5c9d60ca1b8152506200421060201b60201c565b5062001f2d6040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b8152506040518060400160405280600881526020016723b0b390263630b160c11b8152506200421060201b60201c565b5062001f7e6040518060400160405280600581526020016439b3b734b960d91b81525060405180604001604052806009815260200168476e6972204b636f6360b81b8152506200421060201b60201c565b5062001fcf6040518060400160405280600581526020016439b3b734b960d91b8152506040518060400160405280600981526020016816595ac813d89b585b60ba1b8152506200421060201b60201c565b50620020206040518060400160405280600581526020016439b3b734b960d91b81525060405180604001604052806009815260200168476e697220446c6f6760b81b8152506200421060201b60201c565b50620020746040518060400160405280600581526020016439b3b734b960d91b8152506040518060400160405280600c81526020016b476e6972205275662045706160a01b8152506200421060201b60201c565b50620020ca6040518060400160405280600581526020016439b3b734b960d91b8152506040518060400160405280600e81526020016d0446e616220446574616c657869760941b8152506200421060201b60201c565b506200212f6040518060400160405280600581526020016439b3b734b960d91b8152506040518060400160405280601481526020017f476e697220476e69646465772053276b6e7566670000000000000000000000008152506200421060201b60201c565b506200217d6040518060400160405280600581526020016439b3b734b960d91b815250604051806040016040528060068152602001652932b3b734b960d11b8152506200421060201b60201c565b50620021cf60405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280600781526020016645706f6320466f60c81b8152506200421060201b60201c565b506200222060405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280600681526020016544554620466f60d01b8152506200421060201b60201c565b506200227260405180604001604052806008815260200167736578696666757360c01b815250604051806040016040528060078152602001665469687320466f60c81b8152506200421060201b60201c565b50620022c460405180604001604052806008815260200167736578696666757360c01b815250604051806040016040528060078152602001664567617220466f60c81b8152506200421060201b60201c565b506200231960405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280600a8152602001694c6f697274697620466f60b01b8152506200421060201b60201c565b506200238160405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280601581526020017f476e696d72616620546e656d656761676e6520466f00000000000000000000008152506200421060201b60201c565b50620023d360405180604001604052806008815260200167736578696666757360c01b81525060405180604001604052806007815260200166494d474e20466f60c81b8152506200421060201b60201c565b506200242660405180604001604052806008815260200167736578696666757360c01b81525060405180604001604052806008815260200167494d47415720466f60c01b8152506200421060201b60201c565b506200248060405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280600f81526020016e5367757220476e696c6c757020466f60881b8152506200421060201b60201c565b50620024d260405180604001604052806008815260200167736578696666757360c01b815250604051806040016040528060078152602001664c444f4820466f60c81b8152506200421060201b60201c565b506200252460405180604001604052806008815260200167736578696666757360c01b815250604051806040016040528060078152602001664f4d4f4620466f60c81b8152506200421060201b60201c565b506200257560405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280600681526020016553616720466f60d01b8152506200421060201b60201c565b50620025dd60405180604001604052806008815260200167736578696666757360c01b8152506040518060400160405280601381526020017f5372616574204c6c6f7274203030303120466f000000000000000000000000008152506200421060201b60201c565b506200263060405180604001604052806008815260200167736578696666757360c01b81525060405180604001604052806008815260200167536e69616720466f60c01b8152506200421060201b60201c565b506200268360405180604001604052806008815260200167736578696666757360c01b81525060405180604001604052806008815260200167487461656420466f60c01b8152506200421060201b60201c565b50620026d560405180604001604052806008815260200167736578696666757360c01b815250604051806040016040528060078152602001664b63756620466f60c81b8152506200421060201b60201c565b506200272760405180604001604052806008815260200167736578696666757360c01b815250604051806040016040528060078152602001664b636f6320466f60c81b8152506200421060201b60201c565b506200277d6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806007815260200166059736b6e6172760cc1b8152506200421060201b60201c565b50620027d66040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600a8152602001692232b633b730b33bb2b760b11b8152506200421060201b60201c565b50620028296040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001634174656d60e01b8152506200421060201b60201c565b506200287d6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806005815260200164456c61687760d81b8152506200421060201b60201c565b50620028d16040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806005815260200164547378686760d81b8152506200421060201b60201c565b50620029296040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060098152602001682932b23637b433b0b160b91b8152506200421060201b60201c565b506200297c6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001634e6f6f6d60e01b8152506200421060201b60201c565b50620029cf6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001632a35b2b960e11b8152506200421060201b60201c565b5062002a216040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600381526020016245706160e81b8152506200421060201b60201c565b5062002a7a6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600a81526020016942756c6320546863617960b01b8152506200421060201b60201c565b5062002acd6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600481526020016304b6e75760e41b8152506200421060201b60201c565b5062002b236040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806007815260200166506f726472696160c81b8152506200421060201b60201c565b5062002b756040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600381526020016223b0b160e91b8152506200421060201b60201c565b5062002bc76040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600381526020016213d05160ea1b8152506200421060201b60201c565b5062002c1b6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806005815260200164139959d95960da1b8152506200421060201b60201c565b5062002c6e6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001631493d65160e21b8152506200421060201b60201c565b5062002cc46040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060078152602001663132372d43524560c81b8152506200421060201b60201c565b5062002d1b6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806008815260200167353531312d43524560c01b8152506200421060201b60201c565b5062002d706040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600681526020016530322d43524560d01b8152506200421060201b60201c565b5062002dc26040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060038152602001622a232760e91b8152506200421060201b60201c565b5062002e196040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600881526020016726363ab81023bab960c11b8152506200421060201b60201c565b5062002e6b6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806003815260200162141a5960ea1b8152506200421060201b60201c565b5062002ec46040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600a81526020016923b734b732b83834b63360b11b8152506200421060201b60201c565b5062002f176040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001632137b7b760e11b8152506200421060201b60201c565b5062002f6a6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001632930b2b160e11b8152506200421060201b60201c565b5062002fbd6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600481526020016326363ab160e11b8152506200421060201b60201c565b50620030106040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001634978616d60e01b8152506200421060201b60201c565b50620030686040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060098152602001684b636f6c622054726160b81b8152506200421060201b60201c565b50620030bd6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806006815260200165111b9959d95b60d21b8152506200421060201b60201c565b50620031126040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600681526020016552657473616d60d01b8152506200421060201b60201c565b50620031676040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600681526020016522b4b136b7bd60d11b8152506200421060201b60201c565b50620031bb6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001644e65696c6160d81b8152506200421060201b60201c565b506200320e6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600481526020016354616f6760e01b8152506200421060201b60201c565b50620032626040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001640b2a09e86b60db1b8152506200421060201b60201c565b50620032b96040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806008815260200167546163204c6f6f6360c01b8152506200421060201b60201c565b506200330b6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060038152602001620314e360ec1b8152506200421060201b60201c565b50620033616040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600781526020016604e6975676e65760cc1b8152506200421060201b60201c565b50620033b96040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806009815260200168223732b4b93332b2bb60b91b8152506200421060201b60201c565b506200340f6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060078152602001665461636e6f6f6d60c81b8152506200421060201b60201c565b50620034676040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060098152602001684870796c676f74756160b81b8152506200421060201b60201c565b50620034be6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060088152602001674e6f74656c656b7360c01b8152506200421060201b60201c565b50620035106040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600381526020016253736160e81b8152506200421060201b60201c565b50620035646040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806005815260200164053696e65760dc1b8152506200421060201b60201c565b50620035b86040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806005815260200164121d18595960da1b8152506200421060201b60201c565b506200360c6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001642937b7b63360d91b8152506200421060201b60201c565b50620036626040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806007815260200166476e696c69656360c81b8152506200421060201b60201c565b50620036b76040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600681526020016522b4b730b2b160d11b8152506200421060201b60201c565b506200370c6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060068152602001654c6c6572726f60d01b8152506200421060201b60201c565b50620037666040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600b81526020016a14995b5c98519bdc1bdc9d60aa1b8152506200421060201b60201c565b50620037ba6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001642932b737b160d91b8152506200421060201b60201c565b506200380d6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060048152602001634974657960e01b8152506200421060201b60201c565b50620038636040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600781526020016620bd3732b234b360c91b8152506200421060201b60201c565b50620038b86040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600681526020016559626275686360d01b8152506200421060201b60201c565b506200390c6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001644d6165726360d81b8152506200421060201b60201c565b50620039636040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600881526020016754636172746e6f6360c01b8152506200421060201b60201c565b50620039ba6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806008815260200167446c6f66696e616d60c01b8152506200421060201b60201c565b5062003a156040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600c81526020016b52616c6f686373204569786160a01b8152506200421060201b60201c565b5062003a6e6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600a815260200169115d9a5d185d9a5c995960b21b8152506200421060201b60201c565b5062003ac16040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806004815260200163476e696b60e01b8152506200421060201b60201c565b5062003b156040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001644e6565757160d81b8152506200421060201b60201c565b5062003b706040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600c81526020016b2737b4ba30b1b4b334b932bb60a11b8152506200421060201b60201c565b5062003bc36040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b8152506040518060400160405280600481526020016304e6961760e41b8152506200421060201b60201c565b5062003c1b6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806009815260200168165d1a591a5d5c5a5b60ba1b8152506200421060201b60201c565b5062003c6f6040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b81525060405180604001604052806005815260200164115e99595960da1b8152506200421060201b60201c565b5062003cc36040518060400160405280600c81526020016b39b2bc34b332b92832b6b0b760a11b815250604051806040016040528060058152602001644b6e75666760d81b8152506200421060201b60201c565b5062003d196040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060078152602001665265707369687760c81b8152506200421060201b60201c565b5062003d6c6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b81525060405180604001604052806004815260200163141b5d5960e21b8152506200421060201b60201c565b5062003dbf6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060048152602001631498595d60e21b8152506200421060201b60201c565b5062003e136040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060058152602001642431ba34b160d91b8152506200421060201b60201c565b5062003e666040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060048152602001634e6f6f6d60e01b8152506200421060201b60201c565b5062003ebb6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b8152506040518060400160405280600681526020016548636e656c6360d01b8152506200421060201b60201c565b5062003f0e6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b8152506040518060400160405280600481526020016326b9b4b560e11b8152506200421060201b60201c565b5062003f646040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060078152602001665265706d69687760c81b8152506200421060201b60201c565b5062003fb76040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b81525060405180604001604052806004815260200163098d8cad60e31b8152506200421060201b60201c565b50620040096040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b8152506040518060400160405280600381526020016258657360e81b8152506200421060201b60201c565b506200405b6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b81525060405180604001604052806003815260200162141bdd60ea1b8152506200421060201b60201c565b50620040b06040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060068152602001655265746e697760d01b8152506200421060201b60201c565b506200410b6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b8152506040518060400160405280600c81526020016b4e6f6974616c75746970616360a01b8152506200421060201b60201c565b506200415e6040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b815250604051806040016040528060048152602001630526f6f760e41b8152506200421060201b60201c565b50620041b76040518060400160405280600c81526020016b39b2bc34b3333aa9b2b6b0b760a11b8152506040518060400160405280600a8152602001695327446c616e6f44634d60b01b8152506200421060201b60201c565b5062004400565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600d846040516200422591906200435e565b908152602001604051809103902054905082600e856040516200424991906200435e565b9081526020016040518091039020600083815260200190815260200160002090805190602001906200427d929190620042b8565b506200428b8160016200439c565b600d856040516200429d91906200435e565b90815260405190819003602001902055506001905092915050565b828054620042c690620043c3565b90600052602060002090601f016020900481019282620042ea576000855562004335565b82601f106200430557805160ff191683800117855562004335565b8280016001018555821562004335579182015b828111156200433557825182559160200191906001019062004318565b506200434392915062004347565b5090565b5b8082111562004343576000815560010162004348565b6000825160005b8181101562004381576020818601810151858301520162004365565b8181111562004391576000828501525b509190910192915050565b60008219821115620043be57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620043d857607f821691505b60208210811415620043fa57634e487b7160e01b600052602260045260246000fd5b50919050565b6132c180620044106000396000f3fe60806040526004361061012e5760003560e01c80636352211e116100ab57806395d89b411161006f57806395d89b4114610325578063a22cb4651461033a578063b88d4fde1461035a578063c87b56dd1461037a578063e985e9c51461039a578063f2fde38b146103e357600080fd5b80636352211e1461029f5780636ecd2306146102bf57806370a08231146102d2578063715018a6146102f25780638da5cb5b1461030757600080fd5b806323b872dd116100f257806323b872dd1461020a5780632f745c591461022a5780633ccfd60b1461024a57806342842e0e1461025f5780634f6ccce71461027f57600080fd5b806301ffc9a71461013a57806306fdde031461016f578063081812fc14610191578063095ea7b3146101c957806318160ddd146101eb57600080fd5b3661013557005b600080fd5b34801561014657600080fd5b5061015a610155366004612785565b610403565b60405190151581526020015b60405180910390f35b34801561017b57600080fd5b5061018461042e565b6040516101669190612eb4565b34801561019d57600080fd5b506101b16101ac3660046127bf565b6104c0565b6040516001600160a01b039091168152602001610166565b3480156101d557600080fd5b506101e96101e436600461275b565b61055a565b005b3480156101f757600080fd5b506008545b604051908152602001610166565b34801561021657600080fd5b506101e9610225366004612607565b610670565b34801561023657600080fd5b506101fc61024536600461275b565b6106a1565b34801561025657600080fd5b506101e9610737565b34801561026b57600080fd5b506101e961027a366004612607565b610a01565b34801561028b57600080fd5b506101fc61029a3660046127bf565b610a1c565b3480156102ab57600080fd5b506101b16102ba3660046127bf565b610aaf565b6101e96102cd3660046127d8565b610b26565b3480156102de57600080fd5b506101fc6102ed3660046125b2565b610d59565b3480156102fe57600080fd5b506101e9610de0565b34801561031357600080fd5b50600b546001600160a01b03166101b1565b34801561033157600080fd5b50610184610e46565b34801561034657600080fd5b506101e961035536600461271f565b610e55565b34801561036657600080fd5b506101e9610375366004612643565b610f1a565b34801561038657600080fd5b506101846103953660046127bf565b610f52565b3480156103a657600080fd5b5061015a6103b53660046125d4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156103ef57600080fd5b506101e96103fe3660046125b2565b61138d565b60006001600160e01b0319821663780e9d6360e01b1480610428575061042882611458565b92915050565b60606000805461043d9061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546104699061305e565b80156104b65780601f1061048b576101008083540402835291602001916104b6565b820191906000526020600020905b81548152906001019060200180831161049957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661053e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061056582610aaf565b9050806001600160a01b0316836001600160a01b031614156105d35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610535565b336001600160a01b03821614806105ef57506105ef81336103b5565b6106615760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610535565b61066b83836114a8565b505050565b61067a3382611516565b6106965760405162461bcd60e51b815260040161053590612f50565b61066b83838361160d565b60006106ac83610d59565b821061070e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610535565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b03163314806107635750736e7592ff3c32c93a520a11020379d66ab844bf5b33145b80610781575073697d01147dda54cd4279498892d8c59e4bed00a433145b8061079f5750731cd69a22d7685e692d283159679397b2d6f1882c33145b6107f95760405162461bcd60e51b815260206004820152602560248201527f43616c6c6572206d757374206265206f776e6572206f72206120636f6e747269604482015264313aba37b960d91b6064820152608401610535565b600047116108495760405162461bcd60e51b815260206004820152601860248201527f42616c616e6365206d75737420626520706f73697469766500000000000000006044820152606401610535565b736e7592ff3c32c93a520a11020379d66ab844bf5b73697d01147dda54cd4279498892d8c59e4bed00a4731cd69a22d7685e692d283159679397b2d6f1882c6000610895600347612fb9565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146108e4576040519150601f19603f3d011682016040523d82523d6000602084013e6108e9565b606091505b50909150506001811515146109105760405162461bcd60e51b815260040161053590612f19565b6040516001600160a01b038516908390600081818185875af1925050503d8060008114610959576040519150601f19603f3d011682016040523d82523d6000602084013e61095e565b606091505b50909150506001811515146109855760405162461bcd60e51b815260040161053590612f19565b6040516001600160a01b038416908390600081818185875af1925050503d80600081146109ce576040519150601f19603f3d011682016040523d82523d6000602084013e6109d3565b606091505b50909150506001811515146109fa5760405162461bcd60e51b815260040161053590612f19565b5050505050565b61066b83838360405180602001604052806000815250610f1a565b6000610a2760085490565b8210610a8a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610535565b60088281548110610a9d57610a9d61312a565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104285760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610535565b60018160ff161015610b715760405162461bcd60e51b81526020600482015260146024820152734d757374206d696e74206174206c65617374203160601b6044820152606401610535565b60078160ff161115610bba5760405162461bcd60e51b81526020600482015260126024820152712634b6b4ba1037b3101b903832b9103a3c3760711b6044820152606401610535565b6028610bc533610d59565b610bd29060ff8416612fa1565b1115610c205760405162461bcd60e51b815260206004820152601c60248201527f4d617820746f6b656e73207065722061646472657373206973203430000000006044820152606401610535565b610fa4610c2c60085490565b610c399060ff8416612fa1565b1115610c875760405162461bcd60e51b815260206004820152601a60248201527f526571756573746564206d696e742065786365656473206d61780000000000006044820152606401610535565b610c9b60ff8216662386f26fc10000612fec565b66ffffffffffffff163414610cfc5760405162461bcd60e51b815260206004820152602160248201527f4d696e74696e672066656520697320302e3031206574682070657220746f6b656044820152603760f91b6064820152608401610535565b60005b8160ff168160ff161015610d5557610d1b600c80546001019055565b6000610d26600c5490565b9050610d3233826117b8565b6000908152600f6020526040902043905580610d4d816130b4565b915050610cff565b5050565b60006001600160a01b038216610dc45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610535565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610e3a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610535565b610e4460006117d2565b565b60606001805461043d9061305e565b6001600160a01b038216331415610eae5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610535565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f243383611516565b610f405760405162461bcd60e51b815260040161053590612f50565b610f4c84848484611824565b50505050565b6000818152600f6020526040902054606090610fa85760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081e595d0818dc99585d1959605a1b6044820152606401610535565b6000610fb261256e565b610fba61256e565b60405180610100016040528060df81526020016131ad60df91398252604080518082018252600f81526e2261747472696275746573223a205b60881b60208083019190915290835281518083019092526007825266736e6f7061657760c81b9082015261102d9086906000908585611857565b6110379084612fa1565b92506110698560016040518060400160405280600a815260200169726f6d7241747365686360b01b8152508585611857565b6110739084612fa1565b92506110a4856002604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152508585611857565b6110ae9084612fa1565b92506110e08560036040518060400160405280600a815260200169726f6d7241747369617760b01b8152508585611857565b6110ea9084612fa1565b925061111b856004604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152508585611857565b6111259084612fa1565b9250611156856005604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152508585611857565b6111609084612fa1565b92506111918560066040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b8152508585611857565b61119b9084612fa1565b92506111c88560076040518060400160405280600581526020016439b3b734b960d91b8152508585611857565b6111d29084612fa1565b6040805180820190915260068152651e17b9bb339f60d11b6020820152610120840152925061120083611911565b6040516020016112109190612e18565b60408051808303601f190181529181526101208301919091528251602084810151858401516060870151608088015160a089015160c08a015160e08b0151985160009961126099989091016128d1565b60408051808303601f190181529082905261010085015161012086015191935061128f9284929060200161288e565b60408051808303601f190181528282528451602080870151938701516060880151608089015160a08a015160c08b015160e08c0151979a506000996112e099979895969495939492939192016128d1565b60408051808303601f190181529082905261010085015161012086015191935061130f9284929060200161288e565b6040516020818303038152906040529050600061135e61132e89611911565b61133785611a0f565b8460405160200161134a93929190612d23565b604051602081830303815290604052611a0f565b9050806040516020016113719190612cde565b60408051601f1981840301815291905298975050505050505050565b600b546001600160a01b031633146113e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610535565b6001600160a01b03811661144c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610535565b611455816117d2565b50565b60006001600160e01b031982166380ac58cd60e01b148061148957506001600160e01b03198216635b5e139f60e01b145b8061042857506301ffc9a760e01b6001600160e01b0319831614610428565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114dd82610aaf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661158f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610535565b600061159a83610aaf565b9050806001600160a01b0316846001600160a01b031614806115d55750836001600160a01b03166115ca846104c0565b6001600160a01b0316145b8061160557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661162082610aaf565b6001600160a01b0316146116885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610535565b6001600160a01b0382166116ea5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610535565b6116f5838383611b75565b6117006000826114a8565b6001600160a01b038316600090815260036020526040812080546001929061172990849061301b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611757908490612fa1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d55828260405180602001604052806000815250611c2d565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61182f84848461160d565b61183b84848484611c60565b610f4c5760405162461bcd60e51b815260040161053590612ec7565b600080611865866001612fa1565b905060608060006118768a89611d6d565b9194509250905061189061188b856014612fcd565b611911565b836040516020016118a2929190612b92565b6040516020818303038152906040528785600a81106118c3576118c361312a565b602002018190525087826040516020016118de929190612b1d565b6040516020818303038152906040528685600a81106118ff576118ff61312a565b60200201529998505050505050505050565b6060816119355750506040805180820190915260018152600360fc1b602082015290565b8160005b811561195f578061194981613099565b91506119589050600a83612fb9565b9150611939565b60008167ffffffffffffffff81111561197a5761197a613140565b6040519080825280601f01601f1916602001820160405280156119a4576020820181803683370190505b5090505b8415611605576119b960018361301b565b91506119c6600a866130d4565b6119d1906030612fa1565b60f81b8183815181106119e6576119e661312a565b60200101906001600160f81b031916908160001a905350611a08600a86612fb9565b94506119a8565b805160609080611a2f575050604080516020810190915260008152919050565b60006003611a3e836002612fa1565b611a489190612fb9565b611a53906004612fcd565b90506000611a62826020612fa1565b67ffffffffffffffff811115611a7a57611a7a613140565b6040519080825280601f01601f191660200182016040528015611aa4576020820181803683370190505b509050600060405180606001604052806040815260200161316d604091399050600181016020830160005b86811015611b30576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611acf565b506003860660018114611b4a5760028114611b5b57611b67565b613d3d60f01b600119830152611b67565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b038316611bd057611bcb81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611bf3565b816001600160a01b0316836001600160a01b031614611bf357611bf38382612224565b6001600160a01b038216611c0a5761066b816122c1565b826001600160a01b0316826001600160a01b03161461066b5761066b8282612370565b611c3783836123b4565b611c446000848484611c60565b61066b5760405162461bcd60e51b815260040161053590612ec7565b60006001600160a01b0384163b15611d6257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ca4903390899088908890600401612e77565b602060405180830381600087803b158015611cbe57600080fd5b505af1925050508015611cee575060408051601f3d908101601f19168201909252611ceb918101906127a2565b60015b611d48573d808015611d1c576040519150601f19603f3d011682016040523d82523d6000602084013e611d21565b606091505b508051611d405760405162461bcd60e51b815260040161053590612ec7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611605565b506001949350505050565b606080600080611d7c86611911565b90506000611dab878784604051602001611d9792919061285f565b604051602081830303815290604052612502565b90506000600d87604051611dbf9190612843565b90815260200160405180910390205490506000600e88604051611de29190612843565b9081526040519081900360200190206000611dfd84866130d4565b81526020019081526020016000208054611e169061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e429061305e565b8015611e8f5780601f10611e6457610100808354040283529160200191611e8f565b820191906000526020600020905b815481529060010190602001808311611e7257829003601f168201915b5050505050905060008190506000601585611eaa91906130d4565b9050600e811115611f64576000611ece8c8c89604051602001611d9792919061285f565b90506000600d604051611eef9067736578696666757360c01b815260080190565b9081526040519081900360200181205467736578696666757360c01b82529150600e906008019081526040519081900360200190206000611f3083856130d4565b815260200190815260200160002085604051602001611f50929190612a66565b604051602081830303815290604052945050505b60138110612213576000611f858c8c89604051602001611d979291906129bd565b90506000600d604051611faa906b39b2bc34b332b92832b6b0b760a11b8152600c0190565b90815260200160405180910390205490506000611fd48e8e8b604051602001611d97929190612976565b90506000600d604051611ff9906b39b2bc34b3333aa9b2b6b0b760a11b8152600c0190565b908152604051908190036020018120546b39b2bc34b332b92832b6b0b760a11b82529150600090600e90600c01908152604051908190036020019020600061204186886130d4565b8152602001908152602001600020805461205a9061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546120869061305e565b80156120d35780601f106120a8576101008083540402835291602001916120d3565b820191906000526020600020905b8154815290600101906020018083116120b657829003601f168201915b505050505090506000600e6040516120fd906b39b2bc34b3333aa9b2b6b0b760a11b8152600c0190565b908152604051908190036020019020600061211885876130d4565b815260200190815260200160002080546121319061305e565b80601f016020809104026020016040519081016040528092919081815260200182805461215d9061305e565b80156121aa5780601f1061217f576101008083540402835291602001916121aa565b820191906000526020600020905b81548152906001019060200180831161218d57829003601f168201915b5050505050905086601314156121e5578881836040516020016121cf939291906129f8565b604051602081830303815290604052985061220c565b8881836040516020016121fa93929190612c0d565b60405160208183030381529060405298505b5050505050505b919750955093505050509250925092565b6000600161223184610d59565b61223b919061301b565b60008381526007602052604090205490915080821461228e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906122d39060019061301b565b600083815260096020526040812054600880549394509092849081106122fb576122fb61312a565b90600052602060002001549050806008838154811061231c5761231c61312a565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061235457612354613114565b6001900381819060005260206000200160009055905550505050565b600061237b83610d59565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661240a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610535565b6000818152600260205260409020546001600160a01b03161561246f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610535565b61247b60008383611b75565b6001600160a01b03821660009081526003602052604081208054600192906124a4908490612fa1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000828152600f6020526040812054819061251c90611911565b90508083604051602001612531929190612c8a565b60408051601f198184030181529082905261254e91602001612843565b60408051601f198184030181529190528051602090910120949350505050565b604051806101400160405280600a905b606081526020019060019003908161257e5790505090565b80356001600160a01b03811681146125ad57600080fd5b919050565b6000602082840312156125c457600080fd5b6125cd82612596565b9392505050565b600080604083850312156125e757600080fd5b6125f083612596565b91506125fe60208401612596565b90509250929050565b60008060006060848603121561261c57600080fd5b61262584612596565b925061263360208501612596565b9150604084013590509250925092565b6000806000806080858703121561265957600080fd5b61266285612596565b935061267060208601612596565b925060408501359150606085013567ffffffffffffffff8082111561269457600080fd5b818701915087601f8301126126a857600080fd5b8135818111156126ba576126ba613140565b604051601f8201601f19908116603f011681019083821181831017156126e2576126e2613140565b816040528281528a60208487010111156126fb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561273257600080fd5b61273b83612596565b91506020830135801515811461275057600080fd5b809150509250929050565b6000806040838503121561276e57600080fd5b61277783612596565b946020939093013593505050565b60006020828403121561279757600080fd5b81356125cd81613156565b6000602082840312156127b457600080fd5b81516125cd81613156565b6000602082840312156127d157600080fd5b5035919050565b6000602082840312156127ea57600080fd5b813560ff811681146125cd57600080fd5b60008151808452612813816020860160208601613032565b601f01601f19169290920160200192915050565b60008151612839818560208601613032565b9290920192915050565b60008251612855818460208701613032565b9190910192915050565b60008351612871818460208801613032565b835190830190612885818360208801613032565b01949350505050565b600084516128a0818460208901613032565b8451908301906128b4818360208901613032565b84519101906128c7818360208801613032565b0195945050505050565b6000895160206128e48285838f01613032565b8a51918401916128f78184848f01613032565b8a519201916129098184848e01613032565b895192019161291b8184848d01613032565b885192019161292d8184848c01613032565b875192019161293f8184848b01613032565b86519201916129518184848a01613032565b85519201916129638184848901613032565b919091019b9a5050505050505050505050565b60008351612988818460208801613032565b6b39b2bc34b3333aa9b2b6b0b760a11b90830190815283516129b181600c840160208801613032565b01600c01949350505050565b600083516129cf818460208801613032565b6b39b2bc34b332b92832b6b0b760a11b90830190815283516129b181600c840160208801613032565b60008451612a0a818460208901613032565b61101160f11b9083019081528451612a29816002840160208901613032565b600160fd1b600292909101918201528351612a4b816003840160208801613032565b601160f91b6003929091019182015260040195945050505050565b600080845481600182811c915080831680612a8257607f831692505b6020808410821415612aa257634e487b7160e01b86526022600452602486fd5b818015612ab65760018114612ac757612af4565b60ff19861689528489019650612af4565b60008b81526020902060005b86811015612aec5781548b820152908501908301612ad3565b505084890196505b505050505050612b14612b0e82600160fd1b815260010190565b85612827565b95945050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528251600090612b49816010850160208801613032565b6c111610113b30b63ab2911d101160991b6010918401918201528351612b7681601d840160208801613032565b62089f4b60ea1b601d9290910191820152602001949350505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528251600090612bbe816010850160208801613032565b6e111031b630b9b99e913130b9b2911f60891b6010918401918201528351612bed81601f840160208801613032565b661e17ba32bc3a1f60c91b601f9290910191820152602601949350505050565b6201895960ed1b815260008451612c2b816003850160208901613032565b61101160f11b6003918401918201528451612c4d816005840160208901613032565b600160fd1b600592909101918201528351612c6f816006840160208801613032565b601160f91b6006929091019182015260070195945050505050565b65213637b1b59d60d11b815260008351612cab816006850160208801613032565b662237b6b0b4b71d60c91b6006918401918201528351612cd281600d840160208801613032565b01600d01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612d1681601d850160208701613032565b91909101601d0192915050565b707b226e616d65223a2022544f4f4c42202360781b81528351600090612d50816011850160208901613032565b7f222c20226465736372697074696f6e223a20222e7373656c6874726f7720796c6011918401918201527f6c61636973616220736920544f4f4c42222c2022696d616765223a202264617460318201527f613a696d6167652f7376672b786d6c3b6261736536342c00000000000000000060518201528451612dd9816068840160208901613032565b6201116160ed1b606892909101918201528351612dfd81606b840160208801613032565b607d60f81b606b9290910191820152606c0195945050505050565b7f7b2274726169745f74797065223a20227373656e7461657267222c202276616c81526403ab2911d160dd1b602082015260008251612e5e816025850160208701613032565b617d5d60f01b6025939091019283015250602701919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eaa908301846127fb565b9695505050505050565b6020815260006125cd60208301846127fb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4661696c656420746f2077697468647261772065746865720000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612fb457612fb46130e8565b500190565b600082612fc857612fc86130fe565b500490565b6000816000190483118215151615612fe757612fe76130e8565b500290565b600066ffffffffffffff80831681851681830481118215151615613012576130126130e8565b02949350505050565b60008282101561302d5761302d6130e8565b500390565b60005b8381101561304d578181015183820152602001613035565b83811115610f4c5750506000910152565b600181811c9082168061307257607f821691505b6020821081141561309357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130ad576130ad6130e8565b5060010190565b600060ff821660ff8114156130cb576130cb6130e8565b60010192915050565b6000826130e3576130e36130fe565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461145557600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a207365726966733b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330304646464622202f3ea26469706673582212204ed0b3ac7a6d8641fea4cab02a41c461db6d4a7737074b2494b7bb506a41f81364736f6c63430008070033
Deployed Bytecode
0x60806040526004361061012e5760003560e01c80636352211e116100ab57806395d89b411161006f57806395d89b4114610325578063a22cb4651461033a578063b88d4fde1461035a578063c87b56dd1461037a578063e985e9c51461039a578063f2fde38b146103e357600080fd5b80636352211e1461029f5780636ecd2306146102bf57806370a08231146102d2578063715018a6146102f25780638da5cb5b1461030757600080fd5b806323b872dd116100f257806323b872dd1461020a5780632f745c591461022a5780633ccfd60b1461024a57806342842e0e1461025f5780634f6ccce71461027f57600080fd5b806301ffc9a71461013a57806306fdde031461016f578063081812fc14610191578063095ea7b3146101c957806318160ddd146101eb57600080fd5b3661013557005b600080fd5b34801561014657600080fd5b5061015a610155366004612785565b610403565b60405190151581526020015b60405180910390f35b34801561017b57600080fd5b5061018461042e565b6040516101669190612eb4565b34801561019d57600080fd5b506101b16101ac3660046127bf565b6104c0565b6040516001600160a01b039091168152602001610166565b3480156101d557600080fd5b506101e96101e436600461275b565b61055a565b005b3480156101f757600080fd5b506008545b604051908152602001610166565b34801561021657600080fd5b506101e9610225366004612607565b610670565b34801561023657600080fd5b506101fc61024536600461275b565b6106a1565b34801561025657600080fd5b506101e9610737565b34801561026b57600080fd5b506101e961027a366004612607565b610a01565b34801561028b57600080fd5b506101fc61029a3660046127bf565b610a1c565b3480156102ab57600080fd5b506101b16102ba3660046127bf565b610aaf565b6101e96102cd3660046127d8565b610b26565b3480156102de57600080fd5b506101fc6102ed3660046125b2565b610d59565b3480156102fe57600080fd5b506101e9610de0565b34801561031357600080fd5b50600b546001600160a01b03166101b1565b34801561033157600080fd5b50610184610e46565b34801561034657600080fd5b506101e961035536600461271f565b610e55565b34801561036657600080fd5b506101e9610375366004612643565b610f1a565b34801561038657600080fd5b506101846103953660046127bf565b610f52565b3480156103a657600080fd5b5061015a6103b53660046125d4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156103ef57600080fd5b506101e96103fe3660046125b2565b61138d565b60006001600160e01b0319821663780e9d6360e01b1480610428575061042882611458565b92915050565b60606000805461043d9061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546104699061305e565b80156104b65780601f1061048b576101008083540402835291602001916104b6565b820191906000526020600020905b81548152906001019060200180831161049957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661053e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061056582610aaf565b9050806001600160a01b0316836001600160a01b031614156105d35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610535565b336001600160a01b03821614806105ef57506105ef81336103b5565b6106615760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610535565b61066b83836114a8565b505050565b61067a3382611516565b6106965760405162461bcd60e51b815260040161053590612f50565b61066b83838361160d565b60006106ac83610d59565b821061070e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610535565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b03163314806107635750736e7592ff3c32c93a520a11020379d66ab844bf5b33145b80610781575073697d01147dda54cd4279498892d8c59e4bed00a433145b8061079f5750731cd69a22d7685e692d283159679397b2d6f1882c33145b6107f95760405162461bcd60e51b815260206004820152602560248201527f43616c6c6572206d757374206265206f776e6572206f72206120636f6e747269604482015264313aba37b960d91b6064820152608401610535565b600047116108495760405162461bcd60e51b815260206004820152601860248201527f42616c616e6365206d75737420626520706f73697469766500000000000000006044820152606401610535565b736e7592ff3c32c93a520a11020379d66ab844bf5b73697d01147dda54cd4279498892d8c59e4bed00a4731cd69a22d7685e692d283159679397b2d6f1882c6000610895600347612fb9565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146108e4576040519150601f19603f3d011682016040523d82523d6000602084013e6108e9565b606091505b50909150506001811515146109105760405162461bcd60e51b815260040161053590612f19565b6040516001600160a01b038516908390600081818185875af1925050503d8060008114610959576040519150601f19603f3d011682016040523d82523d6000602084013e61095e565b606091505b50909150506001811515146109855760405162461bcd60e51b815260040161053590612f19565b6040516001600160a01b038416908390600081818185875af1925050503d80600081146109ce576040519150601f19603f3d011682016040523d82523d6000602084013e6109d3565b606091505b50909150506001811515146109fa5760405162461bcd60e51b815260040161053590612f19565b5050505050565b61066b83838360405180602001604052806000815250610f1a565b6000610a2760085490565b8210610a8a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610535565b60088281548110610a9d57610a9d61312a565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104285760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610535565b60018160ff161015610b715760405162461bcd60e51b81526020600482015260146024820152734d757374206d696e74206174206c65617374203160601b6044820152606401610535565b60078160ff161115610bba5760405162461bcd60e51b81526020600482015260126024820152712634b6b4ba1037b3101b903832b9103a3c3760711b6044820152606401610535565b6028610bc533610d59565b610bd29060ff8416612fa1565b1115610c205760405162461bcd60e51b815260206004820152601c60248201527f4d617820746f6b656e73207065722061646472657373206973203430000000006044820152606401610535565b610fa4610c2c60085490565b610c399060ff8416612fa1565b1115610c875760405162461bcd60e51b815260206004820152601a60248201527f526571756573746564206d696e742065786365656473206d61780000000000006044820152606401610535565b610c9b60ff8216662386f26fc10000612fec565b66ffffffffffffff163414610cfc5760405162461bcd60e51b815260206004820152602160248201527f4d696e74696e672066656520697320302e3031206574682070657220746f6b656044820152603760f91b6064820152608401610535565b60005b8160ff168160ff161015610d5557610d1b600c80546001019055565b6000610d26600c5490565b9050610d3233826117b8565b6000908152600f6020526040902043905580610d4d816130b4565b915050610cff565b5050565b60006001600160a01b038216610dc45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610535565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610e3a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610535565b610e4460006117d2565b565b60606001805461043d9061305e565b6001600160a01b038216331415610eae5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610535565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f243383611516565b610f405760405162461bcd60e51b815260040161053590612f50565b610f4c84848484611824565b50505050565b6000818152600f6020526040902054606090610fa85760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081e595d0818dc99585d1959605a1b6044820152606401610535565b6000610fb261256e565b610fba61256e565b60405180610100016040528060df81526020016131ad60df91398252604080518082018252600f81526e2261747472696275746573223a205b60881b60208083019190915290835281518083019092526007825266736e6f7061657760c81b9082015261102d9086906000908585611857565b6110379084612fa1565b92506110698560016040518060400160405280600a815260200169726f6d7241747365686360b01b8152508585611857565b6110739084612fa1565b92506110a4856002604051806040016040528060098152602001680e4dedae482c8c2cad60bb1b8152508585611857565b6110ae9084612fa1565b92506110e08560036040518060400160405280600a815260200169726f6d7241747369617760b01b8152508585611857565b6110ea9084612fa1565b925061111b856004604051806040016040528060098152602001683937b6b920ba37b7b360b91b8152508585611857565b6111259084612fa1565b9250611156856005604051806040016040528060098152602001680e4dedae482c8dcc2d60bb1b8152508585611857565b6111609084612fa1565b92506111918560066040518060400160405280600981526020016839b2b1b0b635b1b2b760b91b8152508585611857565b61119b9084612fa1565b92506111c88560076040518060400160405280600581526020016439b3b734b960d91b8152508585611857565b6111d29084612fa1565b6040805180820190915260068152651e17b9bb339f60d11b6020820152610120840152925061120083611911565b6040516020016112109190612e18565b60408051808303601f190181529181526101208301919091528251602084810151858401516060870151608088015160a089015160c08a015160e08b0151985160009961126099989091016128d1565b60408051808303601f190181529082905261010085015161012086015191935061128f9284929060200161288e565b60408051808303601f190181528282528451602080870151938701516060880151608089015160a08a015160c08b015160e08c0151979a506000996112e099979895969495939492939192016128d1565b60408051808303601f190181529082905261010085015161012086015191935061130f9284929060200161288e565b6040516020818303038152906040529050600061135e61132e89611911565b61133785611a0f565b8460405160200161134a93929190612d23565b604051602081830303815290604052611a0f565b9050806040516020016113719190612cde565b60408051601f1981840301815291905298975050505050505050565b600b546001600160a01b031633146113e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610535565b6001600160a01b03811661144c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610535565b611455816117d2565b50565b60006001600160e01b031982166380ac58cd60e01b148061148957506001600160e01b03198216635b5e139f60e01b145b8061042857506301ffc9a760e01b6001600160e01b0319831614610428565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114dd82610aaf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661158f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610535565b600061159a83610aaf565b9050806001600160a01b0316846001600160a01b031614806115d55750836001600160a01b03166115ca846104c0565b6001600160a01b0316145b8061160557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661162082610aaf565b6001600160a01b0316146116885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610535565b6001600160a01b0382166116ea5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610535565b6116f5838383611b75565b6117006000826114a8565b6001600160a01b038316600090815260036020526040812080546001929061172990849061301b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611757908490612fa1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d55828260405180602001604052806000815250611c2d565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61182f84848461160d565b61183b84848484611c60565b610f4c5760405162461bcd60e51b815260040161053590612ec7565b600080611865866001612fa1565b905060608060006118768a89611d6d565b9194509250905061189061188b856014612fcd565b611911565b836040516020016118a2929190612b92565b6040516020818303038152906040528785600a81106118c3576118c361312a565b602002018190525087826040516020016118de929190612b1d565b6040516020818303038152906040528685600a81106118ff576118ff61312a565b60200201529998505050505050505050565b6060816119355750506040805180820190915260018152600360fc1b602082015290565b8160005b811561195f578061194981613099565b91506119589050600a83612fb9565b9150611939565b60008167ffffffffffffffff81111561197a5761197a613140565b6040519080825280601f01601f1916602001820160405280156119a4576020820181803683370190505b5090505b8415611605576119b960018361301b565b91506119c6600a866130d4565b6119d1906030612fa1565b60f81b8183815181106119e6576119e661312a565b60200101906001600160f81b031916908160001a905350611a08600a86612fb9565b94506119a8565b805160609080611a2f575050604080516020810190915260008152919050565b60006003611a3e836002612fa1565b611a489190612fb9565b611a53906004612fcd565b90506000611a62826020612fa1565b67ffffffffffffffff811115611a7a57611a7a613140565b6040519080825280601f01601f191660200182016040528015611aa4576020820181803683370190505b509050600060405180606001604052806040815260200161316d604091399050600181016020830160005b86811015611b30576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611acf565b506003860660018114611b4a5760028114611b5b57611b67565b613d3d60f01b600119830152611b67565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b038316611bd057611bcb81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611bf3565b816001600160a01b0316836001600160a01b031614611bf357611bf38382612224565b6001600160a01b038216611c0a5761066b816122c1565b826001600160a01b0316826001600160a01b03161461066b5761066b8282612370565b611c3783836123b4565b611c446000848484611c60565b61066b5760405162461bcd60e51b815260040161053590612ec7565b60006001600160a01b0384163b15611d6257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ca4903390899088908890600401612e77565b602060405180830381600087803b158015611cbe57600080fd5b505af1925050508015611cee575060408051601f3d908101601f19168201909252611ceb918101906127a2565b60015b611d48573d808015611d1c576040519150601f19603f3d011682016040523d82523d6000602084013e611d21565b606091505b508051611d405760405162461bcd60e51b815260040161053590612ec7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611605565b506001949350505050565b606080600080611d7c86611911565b90506000611dab878784604051602001611d9792919061285f565b604051602081830303815290604052612502565b90506000600d87604051611dbf9190612843565b90815260200160405180910390205490506000600e88604051611de29190612843565b9081526040519081900360200190206000611dfd84866130d4565b81526020019081526020016000208054611e169061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e429061305e565b8015611e8f5780601f10611e6457610100808354040283529160200191611e8f565b820191906000526020600020905b815481529060010190602001808311611e7257829003601f168201915b5050505050905060008190506000601585611eaa91906130d4565b9050600e811115611f64576000611ece8c8c89604051602001611d9792919061285f565b90506000600d604051611eef9067736578696666757360c01b815260080190565b9081526040519081900360200181205467736578696666757360c01b82529150600e906008019081526040519081900360200190206000611f3083856130d4565b815260200190815260200160002085604051602001611f50929190612a66565b604051602081830303815290604052945050505b60138110612213576000611f858c8c89604051602001611d979291906129bd565b90506000600d604051611faa906b39b2bc34b332b92832b6b0b760a11b8152600c0190565b90815260200160405180910390205490506000611fd48e8e8b604051602001611d97929190612976565b90506000600d604051611ff9906b39b2bc34b3333aa9b2b6b0b760a11b8152600c0190565b908152604051908190036020018120546b39b2bc34b332b92832b6b0b760a11b82529150600090600e90600c01908152604051908190036020019020600061204186886130d4565b8152602001908152602001600020805461205a9061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546120869061305e565b80156120d35780601f106120a8576101008083540402835291602001916120d3565b820191906000526020600020905b8154815290600101906020018083116120b657829003601f168201915b505050505090506000600e6040516120fd906b39b2bc34b3333aa9b2b6b0b760a11b8152600c0190565b908152604051908190036020019020600061211885876130d4565b815260200190815260200160002080546121319061305e565b80601f016020809104026020016040519081016040528092919081815260200182805461215d9061305e565b80156121aa5780601f1061217f576101008083540402835291602001916121aa565b820191906000526020600020905b81548152906001019060200180831161218d57829003601f168201915b5050505050905086601314156121e5578881836040516020016121cf939291906129f8565b604051602081830303815290604052985061220c565b8881836040516020016121fa93929190612c0d565b60405160208183030381529060405298505b5050505050505b919750955093505050509250925092565b6000600161223184610d59565b61223b919061301b565b60008381526007602052604090205490915080821461228e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906122d39060019061301b565b600083815260096020526040812054600880549394509092849081106122fb576122fb61312a565b90600052602060002001549050806008838154811061231c5761231c61312a565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061235457612354613114565b6001900381819060005260206000200160009055905550505050565b600061237b83610d59565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661240a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610535565b6000818152600260205260409020546001600160a01b03161561246f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610535565b61247b60008383611b75565b6001600160a01b03821660009081526003602052604081208054600192906124a4908490612fa1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000828152600f6020526040812054819061251c90611911565b90508083604051602001612531929190612c8a565b60408051601f198184030181529082905261254e91602001612843565b60408051601f198184030181529190528051602090910120949350505050565b604051806101400160405280600a905b606081526020019060019003908161257e5790505090565b80356001600160a01b03811681146125ad57600080fd5b919050565b6000602082840312156125c457600080fd5b6125cd82612596565b9392505050565b600080604083850312156125e757600080fd5b6125f083612596565b91506125fe60208401612596565b90509250929050565b60008060006060848603121561261c57600080fd5b61262584612596565b925061263360208501612596565b9150604084013590509250925092565b6000806000806080858703121561265957600080fd5b61266285612596565b935061267060208601612596565b925060408501359150606085013567ffffffffffffffff8082111561269457600080fd5b818701915087601f8301126126a857600080fd5b8135818111156126ba576126ba613140565b604051601f8201601f19908116603f011681019083821181831017156126e2576126e2613140565b816040528281528a60208487010111156126fb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561273257600080fd5b61273b83612596565b91506020830135801515811461275057600080fd5b809150509250929050565b6000806040838503121561276e57600080fd5b61277783612596565b946020939093013593505050565b60006020828403121561279757600080fd5b81356125cd81613156565b6000602082840312156127b457600080fd5b81516125cd81613156565b6000602082840312156127d157600080fd5b5035919050565b6000602082840312156127ea57600080fd5b813560ff811681146125cd57600080fd5b60008151808452612813816020860160208601613032565b601f01601f19169290920160200192915050565b60008151612839818560208601613032565b9290920192915050565b60008251612855818460208701613032565b9190910192915050565b60008351612871818460208801613032565b835190830190612885818360208801613032565b01949350505050565b600084516128a0818460208901613032565b8451908301906128b4818360208901613032565b84519101906128c7818360208801613032565b0195945050505050565b6000895160206128e48285838f01613032565b8a51918401916128f78184848f01613032565b8a519201916129098184848e01613032565b895192019161291b8184848d01613032565b885192019161292d8184848c01613032565b875192019161293f8184848b01613032565b86519201916129518184848a01613032565b85519201916129638184848901613032565b919091019b9a5050505050505050505050565b60008351612988818460208801613032565b6b39b2bc34b3333aa9b2b6b0b760a11b90830190815283516129b181600c840160208801613032565b01600c01949350505050565b600083516129cf818460208801613032565b6b39b2bc34b332b92832b6b0b760a11b90830190815283516129b181600c840160208801613032565b60008451612a0a818460208901613032565b61101160f11b9083019081528451612a29816002840160208901613032565b600160fd1b600292909101918201528351612a4b816003840160208801613032565b601160f91b6003929091019182015260040195945050505050565b600080845481600182811c915080831680612a8257607f831692505b6020808410821415612aa257634e487b7160e01b86526022600452602486fd5b818015612ab65760018114612ac757612af4565b60ff19861689528489019650612af4565b60008b81526020902060005b86811015612aec5781548b820152908501908301612ad3565b505084890196505b505050505050612b14612b0e82600160fd1b815260010190565b85612827565b95945050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528251600090612b49816010850160208801613032565b6c111610113b30b63ab2911d101160991b6010918401918201528351612b7681601d840160208801613032565b62089f4b60ea1b601d9290910191820152602001949350505050565b6f1e3a32bc3a103c1e91189811103c9e9160811b81528251600090612bbe816010850160208801613032565b6e111031b630b9b99e913130b9b2911f60891b6010918401918201528351612bed81601f840160208801613032565b661e17ba32bc3a1f60c91b601f9290910191820152602601949350505050565b6201895960ed1b815260008451612c2b816003850160208901613032565b61101160f11b6003918401918201528451612c4d816005840160208901613032565b600160fd1b600592909101918201528351612c6f816006840160208801613032565b601160f91b6006929091019182015260070195945050505050565b65213637b1b59d60d11b815260008351612cab816006850160208801613032565b662237b6b0b4b71d60c91b6006918401918201528351612cd281600d840160208801613032565b01600d01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612d1681601d850160208701613032565b91909101601d0192915050565b707b226e616d65223a2022544f4f4c42202360781b81528351600090612d50816011850160208901613032565b7f222c20226465736372697074696f6e223a20222e7373656c6874726f7720796c6011918401918201527f6c61636973616220736920544f4f4c42222c2022696d616765223a202264617460318201527f613a696d6167652f7376672b786d6c3b6261736536342c00000000000000000060518201528451612dd9816068840160208901613032565b6201116160ed1b606892909101918201528351612dfd81606b840160208801613032565b607d60f81b606b9290910191820152606c0195945050505050565b7f7b2274726169745f74797065223a20227373656e7461657267222c202276616c81526403ab2911d160dd1b602082015260008251612e5e816025850160208701613032565b617d5d60f01b6025939091019283015250602701919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eaa908301846127fb565b9695505050505050565b6020815260006125cd60208301846127fb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4661696c656420746f2077697468647261772065746865720000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612fb457612fb46130e8565b500190565b600082612fc857612fc86130fe565b500490565b6000816000190483118215151615612fe757612fe76130e8565b500290565b600066ffffffffffffff80831681851681830481118215151615613012576130126130e8565b02949350505050565b60008282101561302d5761302d6130e8565b500390565b60005b8381101561304d578181015183820152602001613035565b83811115610f4c5750506000910152565b600181811c9082168061307257607f821691505b6020821081141561309357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130ad576130ad6130e8565b5060010190565b600060ff821660ff8114156130cb576130cb6130e8565b60010192915050565b6000826130e3576130e36130fe565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461145557600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a207365726966733b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330304646464622202f3ea26469706673582212204ed0b3ac7a6d8641fea4cab02a41c461db6d4a7737074b2494b7bb506a41f81364736f6c63430008070033
Deployed Bytecode Sourcemap
48176:17879:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42028:224;;;;;;;;;;-1:-1:-1;42028:224:0;;;;;:::i;:::-;;:::i;:::-;;;19573:14:1;;19566:22;19548:41;;19536:2;19521:18;42028:224:0;;;;;;;;29156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30715:221::-;;;;;;;;;;-1:-1:-1;30715:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18871:32:1;;;18853:51;;18841:2;18826:18;30715:221:0;18707:203:1;30238:411:0;;;;;;;;;;-1:-1:-1;30238:411:0;;;;;:::i;:::-;;:::i;:::-;;42668:113;;;;;;;;;;-1:-1:-1;42756:10:0;:17;42668:113;;;30033:25:1;;;30021:2;30006:18;42668:113:0;29887:177:1;31605:339:0;;;;;;;;;;-1:-1:-1;31605:339:0;;;;;:::i;:::-;;:::i;42336:256::-;;;;;;;;;;-1:-1:-1;42336:256:0;;;;;:::i;:::-;;:::i;64486:841::-;;;;;;;;;;;;;:::i;32015:185::-;;;;;;;;;;-1:-1:-1;32015:185:0;;;;;:::i;:::-;;:::i;42858:233::-;;;;;;;;;;-1:-1:-1;42858:233:0;;;;;:::i;:::-;;:::i;28850:239::-;;;;;;;;;;-1:-1:-1;28850:239:0;;;;;:::i;:::-;;:::i;63590:758::-;;;;;;:::i;:::-;;:::i;28580:208::-;;;;;;;;;;-1:-1:-1;28580:208:0;;;;;:::i;:::-;;:::i;13620:94::-;;;;;;;;;;;;;:::i;12540:87::-;;;;;;;;;;-1:-1:-1;12613:6:0;;-1:-1:-1;;;;;12613:6:0;12540:87;;29325:104;;;;;;;;;;;;;:::i;31008:295::-;;;;;;;;;;-1:-1:-1;31008:295:0;;;;;:::i;:::-;;:::i;32271:328::-;;;;;;;;;;-1:-1:-1;32271:328:0;;;;;:::i;:::-;;:::i;61380:2202::-;;;;;;;;;;-1:-1:-1;61380:2202:0;;;;;:::i;:::-;;:::i;31374:164::-;;;;;;;;;;-1:-1:-1;31374:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31495:25:0;;;31471:4;31495:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31374:164;13869:192;;;;;;;;;;-1:-1:-1;13869:192:0;;;;;:::i;:::-;;:::i;42028:224::-;42130:4;-1:-1:-1;;;;;;42154:50:0;;-1:-1:-1;;;42154:50:0;;:90;;;42208:36;42232:11;42208:23;:36::i;:::-;42147:97;42028:224;-1:-1:-1;;42028:224:0:o;29156:100::-;29210:13;29243:5;29236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29156:100;:::o;30715:221::-;30791:7;34198:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34198:16:0;30811:73;;;;-1:-1:-1;;;30811:73:0;;25859:2:1;30811:73:0;;;25841:21:1;25898:2;25878:18;;;25871:30;25937:34;25917:18;;;25910:62;-1:-1:-1;;;25988:18:1;;;25981:42;26040:19;;30811:73:0;;;;;;;;;-1:-1:-1;30904:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30904:24:0;;30715:221::o;30238:411::-;30319:13;30335:23;30350:7;30335:14;:23::i;:::-;30319:39;;30383:5;-1:-1:-1;;;;;30377:11:0;:2;-1:-1:-1;;;;;30377:11:0;;;30369:57;;;;-1:-1:-1;;;30369:57:0;;27751:2:1;30369:57:0;;;27733:21:1;27790:2;27770:18;;;27763:30;27829:34;27809:18;;;27802:62;-1:-1:-1;;;27880:18:1;;;27873:31;27921:19;;30369:57:0;27549:397:1;30369:57:0;11496:10;-1:-1:-1;;;;;30461:21:0;;;;:62;;-1:-1:-1;30486:37:0;30503:5;11496:10;31374:164;:::i;30486:37::-;30439:168;;;;-1:-1:-1;;;30439:168:0;;24252:2:1;30439:168:0;;;24234:21:1;24291:2;24271:18;;;24264:30;24330:34;24310:18;;;24303:62;24401:26;24381:18;;;24374:54;24445:19;;30439:168:0;24050:420:1;30439:168:0;30620:21;30629:2;30633:7;30620:8;:21::i;:::-;30308:341;30238:411;;:::o;31605:339::-;31800:41;11496:10;31833:7;31800:18;:41::i;:::-;31792:103;;;;-1:-1:-1;;;31792:103:0;;;;;;;:::i;:::-;31908:28;31918:4;31924:2;31928:7;31908:9;:28::i;42336:256::-;42433:7;42469:23;42486:5;42469:16;:23::i;:::-;42461:5;:31;42453:87;;;;-1:-1:-1;;;42453:87:0;;21132:2:1;42453:87:0;;;21114:21:1;21171:2;21151:18;;;21144:30;21210:34;21190:18;;;21183:62;-1:-1:-1;;;21261:18:1;;;21254:41;21312:19;;42453:87:0;20930:407:1;42453:87:0;-1:-1:-1;;;;;;42558:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42336:256::o;64486:841::-;12613:6;;-1:-1:-1;;;;;12613:6:0;11496:10;12898:23;;:112;;-1:-1:-1;12951:42:0;11496:10;12943:67;12898:112;:201;;;-1:-1:-1;13040:42:0;11496:10;13032:67;12898:201;:290;;;-1:-1:-1;13129:42:0;11496:10;13121:67;12898:290;12887:362;;;;-1:-1:-1;;;12887:362:0;;28852:2:1;12887:362:0;;;28834:21:1;28891:2;28871:18;;;28864:30;28930:34;28910:18;;;28903:62;-1:-1:-1;;;28981:18:1;;;28974:35;29026:19;;12887:362:0;28650:401:1;12887:362:0;64573:1:::1;64549:21;:25;64541:62;;;::::0;-1:-1:-1;;;64541:62:0;;22727:2:1;64541:62:0::1;::::0;::::1;22709:21:1::0;22766:2;22746:18;;;22739:30;22805:26;22785:18;;;22778:54;22849:18;;64541:62:0::1;22525:348:1::0;64541:62:0::1;64660:42;64751;64842;64624:17;64923:23;64945:1;64923:21;:23;:::i;:::-;64907:39;;64968:12;64986:1;-1:-1:-1::0;;;;;64986:6:0::1;65000:5;64986:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;64967:43:0;;-1:-1:-1;;65040:4:0::1;65029:15:::0;::::1;;;65021:52;;;;-1:-1:-1::0;;;65021:52:0::1;;;;;;;:::i;:::-;65108:24;::::0;-1:-1:-1;;;;;65108:6:0;::::1;::::0;65122:5;;65108:24:::1;::::0;;;65122:5;65108:6;:24:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;65094:38:0;;-1:-1:-1;;65162:4:0::1;65151:15:::0;::::1;;;65143:52;;;;-1:-1:-1::0;;;65143:52:0::1;;;;;;;:::i;:::-;65230:24;::::0;-1:-1:-1;;;;;65230:6:0;::::1;::::0;65244:5;;65230:24:::1;::::0;;;65244:5;65230:6;:24:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;65216:38:0;;-1:-1:-1;;65284:4:0::1;65273:15:::0;::::1;;;65265:52;;;;-1:-1:-1::0;;;65265:52:0::1;;;;;;;:::i;:::-;64530:797;;;;;64486:841::o:0;32015:185::-;32153:39;32170:4;32176:2;32180:7;32153:39;;;;;;;;;;;;:16;:39::i;42858:233::-;42933:7;42969:30;42756:10;:17;;42668:113;42969:30;42961:5;:38;42953:95;;;;-1:-1:-1;;;42953:95:0;;29676:2:1;42953:95:0;;;29658:21:1;29715:2;29695:18;;;29688:30;29754:34;29734:18;;;29727:62;-1:-1:-1;;;29805:18:1;;;29798:42;29857:19;;42953:95:0;29474:408:1;42953:95:0;43066:10;43077:5;43066:17;;;;;;;;:::i;:::-;;;;;;;;;43059:24;;42858:233;;;:::o;28850:239::-;28922:7;28958:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28958:16:0;28993:19;28985:73;;;;-1:-1:-1;;;28985:73:0;;25088:2:1;28985:73:0;;;25070:21:1;25127:2;25107:18;;;25100:30;25166:34;25146:18;;;25139:62;-1:-1:-1;;;25217:18:1;;;25210:39;25266:19;;28985:73:0;24886:405:1;63590:758:0;63680:1;63661:15;:20;;;;63653:53;;;;-1:-1:-1;;;63653:53:0;;28503:2:1;63653:53:0;;;28485:21:1;28542:2;28522:18;;;28515:30;-1:-1:-1;;;28561:18:1;;;28554:50;28621:18;;63653:53:0;28301:344:1;63653:53:0;63744:1;63725:15;:20;;;;63717:51;;;;-1:-1:-1;;;63717:51:0;;20026:2:1;63717:51:0;;;20008:21:1;20065:2;20045:18;;;20038:30;-1:-1:-1;;;20084:18:1;;;20077:48;20142:18;;63717:51:0;19824:342:1;63717:51:0;63841:2;63806:30;11496:10;28580:208;:::i;63806:30::-;63788:48;;;;;;:::i;:::-;63787:56;;63779:97;;;;-1:-1:-1;;;63779:97:0;;20373:2:1;63779:97:0;;;20355:21:1;20412:2;20392:18;;;20385:30;20451;20431:18;;;20424:58;20499:18;;63779:97:0;20171:352:1;63779:97:0;63932:4;63914:13;42756:10;:17;;42668:113;63914:13;63896:31;;;;;;:::i;:::-;63895:41;;63887:80;;;;-1:-1:-1;;;63887:80:0;;27396:2:1;63887:80:0;;;27378:21:1;27435:2;27415:18;;;27408:30;27474:28;27454:18;;;27447:56;27520:18;;63887:80:0;27194:350:1;63887:80:0;64000:40;;;;:22;:40;:::i;:::-;63986:55;;:9;:55;63978:101;;;;-1:-1:-1;;;63978:101:0;;20730:2:1;63978:101:0;;;20712:21:1;20769:2;20749:18;;;20742:30;20808:34;20788:18;;;20781:62;-1:-1:-1;;;20859:18:1;;;20852:31;20900:19;;63978:101:0;20528:397:1;63978:101:0;64097:7;64092:249;64114:15;64110:19;;:1;:19;;;64092:249;;;64151:21;:9;3052:19;;3070:1;3052:19;;;2963:127;64151:21;64189:17;64209:19;:9;2933:14;;2841:114;64209:19;64189:39;-1:-1:-1;64243:34:0;11496:10;64267:9;64243;:34::i;:::-;64292:22;;;;:11;:22;;;;;64317:12;64292:37;;64131:3;;;;:::i;:::-;;;;64092:249;;;;63590:758;:::o;28580:208::-;28652:7;-1:-1:-1;;;;;28680:19:0;;28672:74;;;;-1:-1:-1;;;28672:74:0;;24677:2:1;28672:74:0;;;24659:21:1;24716:2;24696:18;;;24689:30;24755:34;24735:18;;;24728:62;-1:-1:-1;;;24806:18:1;;;24799:40;24856:19;;28672:74:0;24475:406:1;28672:74:0;-1:-1:-1;;;;;;28764:16:0;;;;;:9;:16;;;;;;;28580:208::o;13620:94::-;12613:6;;-1:-1:-1;;;;;12613:6:0;11496:10;12760:23;12752:68;;;;-1:-1:-1;;;12752:68:0;;26272:2:1;12752:68:0;;;26254:21:1;;;26291:18;;;26284:30;26350:34;26330:18;;;26323:62;26402:18;;12752:68:0;26070:356:1;12752:68:0;13685:21:::1;13703:1;13685:9;:21::i;:::-;13620:94::o:0;29325:104::-;29381:13;29414:7;29407:14;;;;;:::i;31008:295::-;-1:-1:-1;;;;;31111:24:0;;11496:10;31111:24;;31103:62;;;;-1:-1:-1;;;31103:62:0;;23485:2:1;31103:62:0;;;23467:21:1;23524:2;23504:18;;;23497:30;23563:27;23543:18;;;23536:55;23608:18;;31103:62:0;23283:349:1;31103:62:0;11496:10;31178:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31178:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31178:53:0;;;;;;;;;;31247:48;;19548:41:1;;;31178:42:0;;11496:10;31247:48;;19521:18:1;31247:48:0;;;;;;;31008:295;;:::o;32271:328::-;32446:41;11496:10;32479:7;32446:18;:41::i;:::-;32438:103;;;;-1:-1:-1;;;32438:103:0;;;;;;;:::i;:::-;32552:39;32566:4;32572:2;32576:7;32585:5;32552:13;:39::i;:::-;32271:328;;;;:::o;61380:2202::-;61502:1;61479:20;;;:11;:20;;;;;;61445:13;;61471:58;;;;-1:-1:-1;;;61471:58:0;;28153:2:1;61471:58:0;;;28135:21:1;28192:2;28172:18;;;28165:30;-1:-1:-1;;;28211:18:1;;;28204:51;28272:18;;61471:58:0;27951:345:1;61471:58:0;61540:17;61572:23;;:::i;:::-;61606:28;;:::i;:::-;61645:236;;;;;;;;;;;;;;;;;;;61892:33;;;;;;;;;;;-1:-1:-1;;;61645:8:0;61892:33;;;;;;;;;;61951:53;;;;;;;;;;;-1:-1:-1;;;61951:53:0;;;;;;61960:7;;-1:-1:-1;;61645:236:0;61892:10;61951:8;:53::i;:::-;61938:66;;;;:::i;:::-;;;62028:53;62037:7;62046:1;62028:53;;;;;;;;;;;;;-1:-1:-1;;;62028:53:0;;;62063:5;62070:10;62028:8;:53::i;:::-;62015:66;;;;:::i;:::-;;;62105:53;62114:7;62123:1;62105:53;;;;;;;;;;;;;-1:-1:-1;;;62105:53:0;;;62140:5;62147:10;62105:8;:53::i;:::-;62092:66;;;;:::i;:::-;;;62182:53;62191:7;62200:1;62182:53;;;;;;;;;;;;;-1:-1:-1;;;62182:53:0;;;62217:5;62224:10;62182:8;:53::i;:::-;62169:66;;;;:::i;:::-;;;62259:53;62268:7;62277:1;62259:53;;;;;;;;;;;;;-1:-1:-1;;;62259:53:0;;;62294:5;62301:10;62259:8;:53::i;:::-;62246:66;;;;:::i;:::-;;;62336:53;62345:7;62354:1;62336:53;;;;;;;;;;;;;-1:-1:-1;;;62336:53:0;;;62371:5;62378:10;62336:8;:53::i;:::-;62323:66;;;;:::i;:::-;;;62413:53;62422:7;62431:1;62413:53;;;;;;;;;;;;;-1:-1:-1;;;62413:53:0;;;62448:5;62455:10;62413:8;:53::i;:::-;62400:66;;;;:::i;:::-;;;62490:53;62499:7;62508:1;62490:53;;;;;;;;;;;;;-1:-1:-1;;;62490:53:0;;;62525:5;62532:10;62490:8;:53::i;:::-;62477:66;;;;:::i;:::-;62556:19;;;;;;;;;;;;-1:-1:-1;;;62556:19:0;;;;:8;;;:19;62477:66;-1:-1:-1;62667:19:0;62477:66;62667:8;:19::i;:::-;62609:84;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;62609:84:0;;;;;;62586:13;;;:108;;;;62754:8;;62586:13;62764:8;;;;62774;;;;62784;;;;62794;;;;62804;;;;62814;;;;62824;;;;62737:96;;62707:20;;62737:96;;62754:8;62824;;62737:96;;:::i;:::-;;;;;;;-1:-1:-1;;62737:96:0;;;;;;;62886:8;;;;62896;;;;62737:96;;-1:-1:-1;62861:44:0;;62737:96;;62896:8;62886;62861:44;;:::i;:::-;;;;;;;-1:-1:-1;;62861:44:0;;;;;;62974:13;;;62989;;;;63004;;;;63019;;;;63034;;;;63049;;;;63064;;;;63079;;;;62861:44;;-1:-1:-1;62917:30:0;;62957:136;;62974:13;;63004;;63019;;63034;;63049;;63064;;62957:136;;:::i;:::-;;;;;;;-1:-1:-1;;62957:136:0;;;;;;;63166:13;;;;63181;;;;62957:136;;-1:-1:-1;63131:64:0;;62957:136;;63181:13;63166;63131:64;;:::i;:::-;;;;;;;;;;;;;63105:91;;63207:18;63228:237;63293:17;63302:7;63293:8;:17::i;:::-;63403:28;63423:6;63403:13;:28::i;:::-;63440:16;63255:207;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63228:13;:237::i;:::-;63207:258;;63542:4;63492:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63492:55:0;;;;;;;;;;61380:2202;-1:-1:-1;;;;;;;;61380:2202:0:o;13869:192::-;12613:6;;-1:-1:-1;;;;;12613:6:0;11496:10;12760:23;12752:68;;;;-1:-1:-1;;;12752:68:0;;26272:2:1;12752:68:0;;;26254:21:1;;;26291:18;;;26284:30;26350:34;26330:18;;;26323:62;26402:18;;12752:68:0;26070:356:1;12752:68:0;-1:-1:-1;;;;;13958:22:0;::::1;13950:73;;;::::0;-1:-1:-1;;;13950:73:0;;21963:2:1;13950:73:0::1;::::0;::::1;21945:21:1::0;22002:2;21982:18;;;21975:30;22041:34;22021:18;;;22014:62;-1:-1:-1;;;22092:18:1;;;22085:36;22138:19;;13950:73:0::1;21761:402:1::0;13950:73:0::1;14034:19;14044:8;14034:9;:19::i;:::-;13869:192:::0;:::o;28211:305::-;28313:4;-1:-1:-1;;;;;;28350:40:0;;-1:-1:-1;;;28350:40:0;;:105;;-1:-1:-1;;;;;;;28407:48:0;;-1:-1:-1;;;28407:48:0;28350:105;:158;;;-1:-1:-1;;;;;;;;;;26929:40:0;;;28472:36;26820:157;38091:174;38166:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38166:29:0;-1:-1:-1;;;;;38166:29:0;;;;;;;;:24;;38220:23;38166:24;38220:14;:23::i;:::-;-1:-1:-1;;;;;38211:46:0;;;;;;;;;;;38091:174;;:::o;34403:348::-;34496:4;34198:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34198:16:0;34513:73;;;;-1:-1:-1;;;34513:73:0;;23839:2:1;34513:73:0;;;23821:21:1;23878:2;23858:18;;;23851:30;23917:34;23897:18;;;23890:62;-1:-1:-1;;;23968:18:1;;;23961:42;24020:19;;34513:73:0;23637:408:1;34513:73:0;34597:13;34613:23;34628:7;34613:14;:23::i;:::-;34597:39;;34666:5;-1:-1:-1;;;;;34655:16:0;:7;-1:-1:-1;;;;;34655:16:0;;:51;;;;34699:7;-1:-1:-1;;;;;34675:31:0;:20;34687:7;34675:11;:20::i;:::-;-1:-1:-1;;;;;34675:31:0;;34655:51;:87;;;-1:-1:-1;;;;;;31495:25:0;;;31471:4;31495:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34710:32;34647:96;34403:348;-1:-1:-1;;;;34403:348:0:o;37395:578::-;37554:4;-1:-1:-1;;;;;37527:31:0;:23;37542:7;37527:14;:23::i;:::-;-1:-1:-1;;;;;37527:31:0;;37519:85;;;;-1:-1:-1;;;37519:85:0;;26633:2:1;37519:85:0;;;26615:21:1;26672:2;26652:18;;;26645:30;26711:34;26691:18;;;26684:62;-1:-1:-1;;;26762:18:1;;;26755:39;26811:19;;37519:85:0;26431:405:1;37519:85:0;-1:-1:-1;;;;;37623:16:0;;37615:65;;;;-1:-1:-1;;;37615:65:0;;23080:2:1;37615:65:0;;;23062:21:1;23119:2;23099:18;;;23092:30;23158:34;23138:18;;;23131:62;-1:-1:-1;;;23209:18:1;;;23202:34;23253:19;;37615:65:0;22878:400:1;37615:65:0;37693:39;37714:4;37720:2;37724:7;37693:20;:39::i;:::-;37797:29;37814:1;37818:7;37797:8;:29::i;:::-;-1:-1:-1;;;;;37839:15:0;;;;;;:9;:15;;;;;:20;;37858:1;;37839:15;:20;;37858:1;;37839:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37870:13:0;;;;;;:9;:13;;;;;:18;;37887:1;;37870:13;:18;;37887:1;;37870:18;:::i;:::-;;;;-1:-1:-1;;37899:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37899:21:0;-1:-1:-1;;;;;37899:21:0;;;;;;;;;37938:27;;37899:16;;37938:27;;;;;;;37395:578;;;:::o;35093:110::-;35169:26;35179:2;35183:7;35169:26;;;;;;;;;;;;:9;:26::i;14069:173::-;14144:6;;;-1:-1:-1;;;;;14161:17:0;;;-1:-1:-1;;;;;;14161:17:0;;;;;;;14194:40;;14144:6;;;14161:17;14144:6;;14194:40;;14125:16;;14194:40;14114:128;14069:173;:::o;33481:315::-;33638:28;33648:4;33654:2;33658:7;33638:9;:28::i;:::-;33685:48;33708:4;33714:2;33718:7;33727:5;33685:22;:48::i;:::-;33677:111;;;;-1:-1:-1;;;33677:111:0;;;;;;;:::i;60748:624::-;60897:7;;60933:9;:5;60941:1;60933:9;:::i;:::-;60917:25;;60953:18;60982:20;61013:17;61073:21;61079:7;61088:5;61073;:21::i;:::-;61045:49;;-1:-1:-1;61045:49:0;-1:-1:-1;61045:49:0;-1:-1:-1;61166:20:0;61175:10;61180:5;61175:2;:10;:::i;:::-;61166:8;:20::i;:::-;61207:4;61129:94;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61107:5;61113;61107:12;;;;;;;:::i;:::-;;;;:117;;;;61299:5;61322:6;61262:74;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61235:10;61246:5;61235:17;;;;;;;:::i;:::-;;;;:102;61355:9;60748:624;-1:-1:-1;;;;;;;;;60748:624:0:o;65335:715::-;65391:13;65604:10;65600:53;;-1:-1:-1;;65631:10:0;;;;;;;;;;;;-1:-1:-1;;;65631:10:0;;;;;65335:715::o;65600:53::-;65678:5;65663:12;65719:78;65726:9;;65719:78;;65752:8;;;;:::i;:::-;;-1:-1:-1;65775:10:0;;-1:-1:-1;65783:2:0;65775:10;;:::i;:::-;;;65719:78;;;65807:19;65839:6;65829:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65829:17:0;;65807:39;;65857:154;65864:10;;65857:154;;65891:11;65901:1;65891:11;;:::i;:::-;;-1:-1:-1;65960:10:0;65968:2;65960:5;:10;:::i;:::-;65947:24;;:2;:24;:::i;:::-;65934:39;;65917:6;65924;65917:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;65917:56:0;;;;;;;;-1:-1:-1;65988:11:0;65997:2;65988:11;;:::i;:::-;;;65857:154;;66406:1607;66504:11;;66464:13;;66530:8;66526:23;;-1:-1:-1;;66540:9:0;;;;;;;;;-1:-1:-1;66540:9:0;;;66406:1607;-1:-1:-1;66406:1607:0:o;66526:23::-;66601:18;66639:1;66628:7;:3;66634:1;66628:7;:::i;:::-;66627:13;;;;:::i;:::-;66622:19;;:1;:19;:::i;:::-;66601:40;-1:-1:-1;66699:19:0;66731:15;66601:40;66744:2;66731:15;:::i;:::-;66721:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66721:26:0;;66699:48;;66760:18;66781:5;;;;;;;;;;;;;;;;;66760:26;;66850:1;66843:5;66839:13;66895:2;66887:6;66883:15;66946:1;66914:777;66969:3;66966:1;66963:10;66914:777;;;67024:1;67067:12;;;;;67061:19;67162:4;67150:2;67146:14;;;;;67128:40;;67122:47;67271:2;67267:14;;;67263:25;;67249:40;;67243:47;67400:1;67396:13;;;67392:24;;67378:39;;67372:46;67520:16;;;;67506:31;;67500:38;67198:1;67194:11;;;67292:4;67239:58;;;67230:68;67323:11;;67368:57;;;67359:67;;;;67451:11;;67496:49;;67487:59;67575:3;67571:13;67604:22;;67674:1;67659:17;;;;67017:9;66914:777;;;66918:44;67723:1;67718:3;67714:11;67744:1;67739:84;;;;67842:1;67837:82;;;;67707:212;;67739:84;-1:-1:-1;;;;;67772:17:0;;67765:43;67739:84;;67837:82;-1:-1:-1;;;;;67870:17:0;;67863:41;67707:212;-1:-1:-1;;;67935:26:0;;;67942:6;66406:1607;-1:-1:-1;;;;66406:1607:0:o;43704:589::-;-1:-1:-1;;;;;43910:18:0;;43906:187;;43945:40;43977:7;45120:10;:17;;45093:24;;;;:15;:24;;;;;:44;;;45148:24;;;;;;;;;;;;45016:164;43945:40;43906:187;;;44015:2;-1:-1:-1;;;;;44007:10:0;:4;-1:-1:-1;;;;;44007:10:0;;44003:90;;44034:47;44067:4;44073:7;44034:32;:47::i;:::-;-1:-1:-1;;;;;44107:16:0;;44103:183;;44140:45;44177:7;44140:36;:45::i;44103:183::-;44213:4;-1:-1:-1;;;;;44207:10:0;:2;-1:-1:-1;;;;;44207:10:0;;44203:83;;44234:40;44262:2;44266:7;44234:27;:40::i;35430:321::-;35560:18;35566:2;35570:7;35560:5;:18::i;:::-;35611:54;35642:1;35646:2;35650:7;35659:5;35611:22;:54::i;:::-;35589:154;;;;-1:-1:-1;;;35589:154:0;;;;;;;:::i;38830:803::-;38985:4;-1:-1:-1;;;;;39006:13:0;;19331:20;19379:8;39002:624;;39042:72;;-1:-1:-1;;;39042:72:0;;-1:-1:-1;;;;;39042:36:0;;;;;:72;;11496:10;;39093:4;;39099:7;;39108:5;;39042:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39042:72:0;;;;;;;;-1:-1:-1;;39042:72:0;;;;;;;;;;;;:::i;:::-;;;39038:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39288:13:0;;39284:272;;39331:60;;-1:-1:-1;;;39331:60:0;;;;;;;:::i;39284:272::-;39506:6;39500:13;39491:6;39487:2;39483:15;39476:38;39038:533;-1:-1:-1;;;;;;39165:55:0;-1:-1:-1;;;39165:55:0;;-1:-1:-1;39158:62:0;;39002:624;-1:-1:-1;39610:4:0;38830:803;;;;;;:::o;58990:1750::-;59070:13;59085;59100:7;59120:25;59148:17;59157:7;59148:8;:17::i;:::-;59120:45;;59176:12;59191:65;59198:7;59231:9;59242:11;59214:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59191:6;:65::i;:::-;59176:80;;59267:13;59283:7;59291:9;59283:18;;;;;;:::i;:::-;;;;;;;;;;;;;;59267:34;;59312:20;59335:8;59344:9;59335:19;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;59355:12;59362:5;59355:4;:12;:::i;:::-;59335:33;;;;;;;;;;;59312:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59379:20;59402:6;59379:29;;59419:17;59446:2;59439:4;:9;;;;:::i;:::-;59419:29;;59477:2;59465:9;:14;59461:306;;;59496:21;59520:65;59527:7;59560:9;59571:11;59543:40;;;;;;;;;:::i;59520:65::-;59496:89;;59600:20;59623:7;:19;;;;-1:-1:-1;;;18646:23:1;;18694:1;18685:11;;18444:258;59623:19:0;;;;;;;;;;;;;;;-1:-1:-1;;;18646:23:1;;59623:19:0;-1:-1:-1;59690:8:0;;18694:1:1;18685:11;59690:20:0;;;;;;;;;;;;;:50;59711:28;59727:12;59711:13;:28;:::i;:::-;59690:50;;;;;;;;;;;59747:6;59673:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59657:98;;59481:286;;59461:306;59794:2;59781:9;:15;59777:911;;59813:25;59841:81;59848:7;59881:9;59908:11;59864:56;;;;;;;;;:::i;59841:81::-;59813:109;;59937:24;59964:7;:23;;;;-1:-1:-1;;;12503:27:1;;12555:2;12546:12;;12301:263;59964:23:0;;;;;;;;;;;;;;59937:50;;60004:25;60032:81;60039:7;60072:9;60099:11;60055:56;;;;;;;;;:::i;60032:81::-;60004:109;;60128:24;60155:7;:23;;;;-1:-1:-1;;;11236:27:1;;11288:2;11279:12;;11034:263;60155:23:0;;;;;;;;;;;;;;;-1:-1:-1;;;12503:27:1;;60155:23:0;-1:-1:-1;60203:24:0;;60230:8;;12555:2:1;12546:12;60230:24:0;;;;;;;;;;;;;:62;60255:36;60275:16;60255:17;:36;:::i;:::-;60230:62;;;;;;;;;;;60203:89;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60307:24;60334:8;:24;;;;-1:-1:-1;;;11236:27:1;;11288:2;11279:12;;11034:263;60334:24:0;;;;;;;;;;;;;;:62;60359:36;60379:16;60359:17;:36;:::i;:::-;60334:62;;;;;;;;;;;60307:89;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60415:9;60428:2;60415:15;60411:266;;;60484:6;60498:10;60515;60467:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60451:81;;60411:266;;;60613:6;60627:10;60644;60589:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60573:88;;60411:266;59798:890;;;;;;59777:911;60706:6;;-1:-1:-1;60714:6:0;-1:-1:-1;60722:9:0;-1:-1:-1;;;;58990:1750:0;;;;;:::o;45807:988::-;46073:22;46123:1;46098:22;46115:4;46098:16;:22::i;:::-;:26;;;;:::i;:::-;46135:18;46156:26;;;:17;:26;;;;;;46073:51;;-1:-1:-1;46289:28:0;;;46285:328;;-1:-1:-1;;;;;46356:18:0;;46334:19;46356:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46407:30;;;;;;:44;;;46524:30;;:17;:30;;;;;:43;;;46285:328;-1:-1:-1;46709:26:0;;;;:17;:26;;;;;;;;46702:33;;;-1:-1:-1;;;;;46753:18:0;;;;;:12;:18;;;;;:34;;;;;;;46746:41;45807:988::o;47090:1079::-;47368:10;:17;47343:22;;47368:21;;47388:1;;47368:21;:::i;:::-;47400:18;47421:24;;;:15;:24;;;;;;47794:10;:26;;47343:46;;-1:-1:-1;47421:24:0;;47343:46;;47794:26;;;;;;:::i;:::-;;;;;;;;;47772:48;;47858:11;47833:10;47844;47833:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47938:28;;;:15;:28;;;;;;;:41;;;48110:24;;;;;48103:31;48145:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47161:1008;;;47090:1079;:::o;44594:221::-;44679:14;44696:20;44713:2;44696:16;:20::i;:::-;-1:-1:-1;;;;;44727:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44772:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44594:221:0:o;36087:382::-;-1:-1:-1;;;;;36167:16:0;;36159:61;;;;-1:-1:-1;;;36159:61:0;;25498:2:1;36159:61:0;;;25480:21:1;;;25517:18;;;25510:30;25576:34;25556:18;;;25549:62;25628:18;;36159:61:0;25296:356:1;36159:61:0;34174:4;34198:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34198:16:0;:30;36231:58;;;;-1:-1:-1;;;36231:58:0;;22370:2:1;36231:58:0;;;22352:21:1;22409:2;22389:18;;;22382:30;22448;22428:18;;;22421:58;22496:18;;36231:58:0;22168:352:1;36231:58:0;36302:45;36331:1;36335:2;36339:7;36302:20;:45::i;:::-;-1:-1:-1;;;;;36360:13:0;;;;;;:9;:13;;;;;:18;;36377:1;;36360:13;:18;;36377:1;;36360:18;:::i;:::-;;;;-1:-1:-1;;36389:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36389:21:0;-1:-1:-1;;;;;36389:21:0;;;;;;;;36428:33;;36389:16;;;36428:33;;36389:16;;36428:33;36087:382;;:::o;58696:286::-;58773:7;58831:20;;;:11;:20;;;;;;58773:7;;58822:30;;:8;:30::i;:::-;58793:59;;58939:12;58964:5;58912:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58912:58:0;;;;;;;;;;58888:84;;58912:58;58888:84;;:::i;:::-;;;;-1:-1:-1;;58888:84:0;;;;;;;;;58878:95;;58888:84;58878:95;;;;;58696:286;-1:-1:-1;;;;58696:286:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:269::-;3481:6;3534:2;3522:9;3513:7;3509:23;3505:32;3502:52;;;3550:1;3547;3540:12;3502:52;3589:9;3576:23;3639:4;3632:5;3628:16;3621:5;3618:27;3608:55;;3659:1;3656;3649:12;3698:257;3739:3;3777:5;3771:12;3804:6;3799:3;3792:19;3820:63;3876:6;3869:4;3864:3;3860:14;3853:4;3846:5;3842:16;3820:63;:::i;:::-;3937:2;3916:15;-1:-1:-1;;3912:29:1;3903:39;;;;3944:4;3899:50;;3698:257;-1:-1:-1;;3698:257:1:o;3960:185::-;4002:3;4040:5;4034:12;4055:52;4100:6;4095:3;4088:4;4081:5;4077:16;4055:52;:::i;:::-;4123:16;;;;;3960:185;-1:-1:-1;;3960:185:1:o;4269:276::-;4400:3;4438:6;4432:13;4454:53;4500:6;4495:3;4488:4;4480:6;4476:17;4454:53;:::i;:::-;4523:16;;;;;4269:276;-1:-1:-1;;4269:276:1:o;4550:470::-;4729:3;4767:6;4761:13;4783:53;4829:6;4824:3;4817:4;4809:6;4805:17;4783:53;:::i;:::-;4899:13;;4858:16;;;;4921:57;4899:13;4858:16;4955:4;4943:17;;4921:57;:::i;:::-;4994:20;;4550:470;-1:-1:-1;;;;4550:470:1:o;5025:664::-;5252:3;5290:6;5284:13;5306:53;5352:6;5347:3;5340:4;5332:6;5328:17;5306:53;:::i;:::-;5422:13;;5381:16;;;;5444:57;5422:13;5381:16;5478:4;5466:17;;5444:57;:::i;:::-;5568:13;;5523:20;;;5590:57;5568:13;5523:20;5624:4;5612:17;;5590:57;:::i;:::-;5663:20;;5025:664;-1:-1:-1;;;;;5025:664:1:o;5694:1641::-;6161:3;6199:6;6193:13;6225:4;6238:51;6282:6;6277:3;6272:2;6264:6;6260:15;6238:51;:::i;:::-;6352:13;;6311:16;;;;6374:55;6352:13;6311:16;6396:15;;;6374:55;:::i;:::-;6496:13;;6451:20;;;6518:55;6496:13;6451:20;6540:15;;;6518:55;:::i;:::-;6640:13;;6595:20;;;6662:55;6640:13;6595:20;6684:15;;;6662:55;:::i;:::-;6784:13;;6739:20;;;6806:55;6784:13;6739:20;6828:15;;;6806:55;:::i;:::-;6928:13;;6883:20;;;6950:55;6928:13;6883:20;6972:15;;;6950:55;:::i;:::-;7072:13;;7027:20;;;7094:55;7072:13;7027:20;7116:15;;;7094:55;:::i;:::-;7216:13;;7171:20;;;7238:55;7216:13;7171:20;7260:15;;;7238:55;:::i;:::-;7309:20;;;;;5694:1641;-1:-1:-1;;;;;;;;;;;5694:1641:1:o;7340:627::-;7620:3;7658:6;7652:13;7674:53;7720:6;7715:3;7708:4;7700:6;7696:17;7674:53;:::i;:::-;-1:-1:-1;;;7749:16:1;;;7774:29;;;7828:13;;7850:66;7828:13;7902:2;7891:14;;7884:4;7872:17;;7850:66;:::i;:::-;7936:20;7958:2;7932:29;;7340:627;-1:-1:-1;;;;7340:627:1:o;7972:::-;8252:3;8290:6;8284:13;8306:53;8352:6;8347:3;8340:4;8332:6;8328:17;8306:53;:::i;:::-;-1:-1:-1;;;8381:16:1;;;8406:29;;;8460:13;;8482:66;8460:13;8534:2;8523:14;;8516:4;8504:17;;8482:66;:::i;8604:1114::-;9134:3;9172:6;9166:13;9188:53;9234:6;9229:3;9222:4;9214:6;9210:17;9188:53;:::i;:::-;-1:-1:-1;;;9263:16:1;;;9288:29;;;9342:13;;9364:65;9342:13;9416:1;9405:13;;9398:4;9386:17;;9364:65;:::i;:::-;-1:-1:-1;;;9492:1:1;9448:20;;;;9484:10;;;9477:23;9525:13;;9547:62;9525:13;9596:1;9588:10;;9581:4;9569:17;;9547:62;:::i;:::-;-1:-1:-1;;;9669:1:1;9628:17;;;;9661:10;;;9654:32;9710:1;9702:10;;8604:1114;-1:-1:-1;;;;;8604:1114:1:o;9723:1306::-;10000:3;10029:1;10062:6;10056:13;10092:3;10114:1;10142:9;10138:2;10134:18;10124:28;;10202:2;10191:9;10187:18;10224;10214:61;;10268:4;10260:6;10256:17;10246:27;;10214:61;10294:2;10342;10334:6;10331:14;10311:18;10308:38;10305:165;;;-1:-1:-1;;;10369:33:1;;10425:4;10422:1;10415:15;10455:4;10376:3;10443:17;10305:165;10486:18;10513:104;;;;10631:1;10626:320;;;;10479:467;;10513:104;-1:-1:-1;;10546:24:1;;10534:37;;10591:16;;;;-1:-1:-1;10513:104:1;;10626:320;30142:1;30135:14;;;30179:4;30166:18;;10721:1;10735:165;10749:6;10746:1;10743:13;10735:165;;;10827:14;;10814:11;;;10807:35;10870:16;;;;10764:10;;10735:165;;;10739:3;;10929:6;10924:3;10920:16;10913:23;;10479:467;;;;;;;10962:61;10988:34;11018:3;-1:-1:-1;;;4215:16:1;;4256:1;4247:11;;4150:114;10988:34;10980:6;10962:61;:::i;:::-;10955:68;9723:1306;-1:-1:-1;;;;;9723:1306:1:o;11302:994::-;-1:-1:-1;;;11802:57:1;;11882:13;;11784:3;;11904:62;11882:13;11954:2;11945:12;;11938:4;11926:17;;11904:62;:::i;:::-;-1:-1:-1;;;12025:2:1;11985:16;;;12017:11;;;12010:59;12094:13;;12116:63;12094:13;12165:2;12157:11;;12150:4;12138:17;;12116:63;:::i;:::-;-1:-1:-1;;;12239:2:1;12198:17;;;;12231:11;;;12224:37;12285:4;12277:13;;11302:994;-1:-1:-1;;;;11302:994:1:o;12569:989::-;-1:-1:-1;;;13069:57:1;;13149:13;;13051:3;;13171:62;13149:13;13221:2;13212:12;;13205:4;13193:17;;13171:62;:::i;:::-;-1:-1:-1;;;13292:2:1;13252:16;;;13284:11;;;13277:63;13365:13;;13387:63;13365:13;13436:2;13428:11;;13421:4;13409:17;;13387:63;:::i;:::-;-1:-1:-1;;;13510:2:1;13469:17;;;;13502:11;;;13495:30;13549:2;13541:11;;12569:989;-1:-1:-1;;;;12569:989:1:o;13563:1246::-;-1:-1:-1;;;14219:3:1;14212:18;14194:3;14259:6;14253:13;14275:61;14329:6;14325:1;14320:3;14316:11;14309:4;14301:6;14297:17;14275:61;:::i;:::-;-1:-1:-1;;;14395:1:1;14355:16;;;14387:10;;;14380:34;14439:13;;14461:62;14439:13;14510:1;14502:10;;14495:4;14483:17;;14461:62;:::i;:::-;-1:-1:-1;;;14583:1:1;14542:17;;;;14575:10;;;14568:23;14616:13;;14638:62;14616:13;14687:1;14679:10;;14672:4;14660:17;;14638:62;:::i;:::-;-1:-1:-1;;;14760:1:1;14719:17;;;;14752:10;;;14745:32;14801:1;14793:10;;13563:1246;-1:-1:-1;;;;;13563:1246:1:o;14814:757::-;-1:-1:-1;;;15220:3:1;15213:21;15195:3;15263:6;15257:13;15279:61;15333:6;15329:1;15324:3;15320:11;15313:4;15305:6;15301:17;15279:61;:::i;:::-;-1:-1:-1;;;15399:1:1;15359:16;;;15391:10;;;15384:29;15438:13;;15460:63;15438:13;15509:2;15501:11;;15494:4;15482:17;;15460:63;:::i;:::-;15543:17;15562:2;15539:26;;14814:757;-1:-1:-1;;;;14814:757:1:o;15576:448::-;15838:31;15833:3;15826:44;15808:3;15899:6;15893:13;15915:62;15970:6;15965:2;15960:3;15956:12;15949:4;15941:6;15937:17;15915:62;:::i;:::-;15997:16;;;;16015:2;15993:25;;15576:448;-1:-1:-1;;15576:448:1:o;16239:1505::-;-1:-1:-1;;;16888:59:1;;16970:13;;16870:3;;16992:62;16970:13;17042:2;17033:12;;17026:4;17014:17;;16992:62;:::i;:::-;17118:66;17113:2;17073:16;;;17105:11;;;17098:87;17214:66;17209:2;17201:11;;17194:87;17310:25;17305:2;17297:11;;17290:46;17361:13;;17383:64;17361:13;17432:3;17424:12;;17417:4;17405:17;;17383:64;:::i;:::-;-1:-1:-1;;;17507:3:1;17466:17;;;;17499:12;;;17492:37;17554:13;;17576:64;17554:13;17625:3;17617:12;;17610:4;17598:17;;17576:64;:::i;:::-;-1:-1:-1;;;17700:3:1;17659:17;;;;17692:12;;;17685:25;17734:3;17726:12;;16239:1505;-1:-1:-1;;;;;16239:1505:1:o;17749:690::-;18112:66;18107:3;18100:79;18218:12;18213:3;18209:22;18204:2;18199:3;18195:12;18188:44;18082:3;18261:6;18255:13;18277:60;18330:6;18325:2;18320:3;18316:12;18311:2;18303:6;18299:15;18277:60;:::i;:::-;-1:-1:-1;;;18396:2:1;18356:16;;;;18388:11;;;18381:25;-1:-1:-1;18430:2:1;18422:11;;17749:690;-1:-1:-1;17749:690:1:o;18915:488::-;-1:-1:-1;;;;;19184:15:1;;;19166:34;;19236:15;;19231:2;19216:18;;19209:43;19283:2;19268:18;;19261:34;;;19331:3;19326:2;19311:18;;19304:31;;;19109:4;;19352:45;;19377:19;;19369:6;19352:45;:::i;:::-;19344:53;18915:488;-1:-1:-1;;;;;;18915:488:1:o;19600:219::-;19749:2;19738:9;19731:21;19712:4;19769:44;19809:2;19798:9;19794:18;19786:6;19769:44;:::i;21342:414::-;21544:2;21526:21;;;21583:2;21563:18;;;21556:30;21622:34;21617:2;21602:18;;21595:62;-1:-1:-1;;;21688:2:1;21673:18;;21666:48;21746:3;21731:19;;21342:414::o;26841:348::-;27043:2;27025:21;;;27082:2;27062:18;;;27055:30;27121:26;27116:2;27101:18;;27094:54;27180:2;27165:18;;26841:348::o;29056:413::-;29258:2;29240:21;;;29297:2;29277:18;;;29270:30;29336:34;29331:2;29316:18;;29309:62;-1:-1:-1;;;29402:2:1;29387:18;;29380:47;29459:3;29444:19;;29056:413::o;30195:128::-;30235:3;30266:1;30262:6;30259:1;30256:13;30253:39;;;30272:18;;:::i;:::-;-1:-1:-1;30308:9:1;;30195:128::o;30328:120::-;30368:1;30394;30384:35;;30399:18;;:::i;:::-;-1:-1:-1;30433:9:1;;30328:120::o;30453:168::-;30493:7;30559:1;30555;30551:6;30547:14;30544:1;30541:21;30536:1;30529:9;30522:17;30518:45;30515:71;;;30566:18;;:::i;:::-;-1:-1:-1;30606:9:1;;30453:168::o;30626:268::-;30665:7;30697:16;30740:2;30737:1;30733:10;30770:2;30767:1;30763:10;30826:3;30822:2;30818:12;30813:3;30810:21;30803:3;30796:11;30789:19;30785:47;30782:73;;;30835:18;;:::i;:::-;30875:13;;30626:268;-1:-1:-1;;;;30626:268:1:o;30899:125::-;30939:4;30967:1;30964;30961:8;30958:34;;;30972:18;;:::i;:::-;-1:-1:-1;31009:9:1;;30899:125::o;31029:258::-;31101:1;31111:113;31125:6;31122:1;31119:13;31111:113;;;31201:11;;;31195:18;31182:11;;;31175:39;31147:2;31140:10;31111:113;;;31242:6;31239:1;31236:13;31233:48;;;-1:-1:-1;;31277:1:1;31259:16;;31252:27;31029:258::o;31292:380::-;31371:1;31367:12;;;;31414;;;31435:61;;31489:4;31481:6;31477:17;31467:27;;31435:61;31542:2;31534:6;31531:14;31511:18;31508:38;31505:161;;;31588:10;31583:3;31579:20;31576:1;31569:31;31623:4;31620:1;31613:15;31651:4;31648:1;31641:15;31505:161;;31292:380;;;:::o;31677:135::-;31716:3;-1:-1:-1;;31737:17:1;;31734:43;;;31757:18;;:::i;:::-;-1:-1:-1;31804:1:1;31793:13;;31677:135::o;31817:175::-;31854:3;31898:4;31891:5;31887:16;31927:4;31918:7;31915:17;31912:43;;;31935:18;;:::i;:::-;31984:1;31971:15;;31817:175;-1:-1:-1;;31817:175:1:o;31997:112::-;32029:1;32055;32045:35;;32060:18;;:::i;:::-;-1:-1:-1;32094:9:1;;31997:112::o;32114:127::-;32175:10;32170:3;32166:20;32163:1;32156:31;32206:4;32203:1;32196:15;32230:4;32227:1;32220:15;32246:127;32307:10;32302:3;32298:20;32295:1;32288:31;32338:4;32335:1;32328:15;32362:4;32359:1;32352:15;32378:127;32439:10;32434:3;32430:20;32427:1;32420:31;32470:4;32467:1;32460:15;32494:4;32491:1;32484:15;32510:127;32571:10;32566:3;32562:20;32559:1;32552:31;32602:4;32599:1;32592:15;32626:4;32623:1;32616:15;32642:127;32703:10;32698:3;32694:20;32691:1;32684:31;32734:4;32731:1;32724:15;32758:4;32755:1;32748:15;32774:131;-1:-1:-1;;;;;;32848:32:1;;32838:43;;32828:71;;32895:1;32892;32885:12
Swarm Source
ipfs://4ed0b3ac7a6d8641fea4cab02a41c461db6d4a7737074b2494b7bb506a41f813
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.