Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 42 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 15652890 | 695 days ago | IN | 0 ETH | 0.00044553 | ||||
Transfer | 15652866 | 695 days ago | IN | 0 ETH | 0.00012586 | ||||
Set Approval For... | 15643028 | 696 days ago | IN | 0 ETH | 0.00056707 | ||||
Next Index WL | 15631695 | 698 days ago | IN | 0 ETH | 0.00030057 | ||||
Mint White List | 15631643 | 698 days ago | IN | 0 ETH | 0.00439146 | ||||
Mint White List | 15627843 | 699 days ago | IN | 0 ETH | 0.004097 | ||||
Next Index WL | 15624691 | 699 days ago | IN | 0 ETH | 0.00061614 | ||||
Mint White List | 15623684 | 699 days ago | IN | 0 ETH | 0.00390867 | ||||
Mint White List | 15618471 | 700 days ago | IN | 0 ETH | 0.00950813 | ||||
Next Index WL | 15617475 | 700 days ago | IN | 0 ETH | 0.00017411 | ||||
Mint White List | 15615451 | 700 days ago | IN | 0 ETH | 0.00238295 | ||||
Mint White List | 15611065 | 701 days ago | IN | 0 ETH | 0.00429505 | ||||
Mint White List | 15610584 | 701 days ago | IN | 0 ETH | 0.00331347 | ||||
Next Index WL | 15610432 | 701 days ago | IN | 0 ETH | 0.00020401 | ||||
Set Approval For... | 15602803 | 702 days ago | IN | 0 ETH | 0.00025108 | ||||
Mint To Address | 15602788 | 702 days ago | IN | 0 ETH | 0.00228349 | ||||
Mint To Address | 15602785 | 702 days ago | IN | 0 ETH | 0.00229073 | ||||
Safe Transfer Fr... | 15602740 | 702 days ago | IN | 0 ETH | 0.00049554 | ||||
Mint White List | 15602730 | 702 days ago | IN | 0 ETH | 0.00255699 | ||||
Next Index WL | 15602306 | 702 days ago | IN | 0 ETH | 0.00018341 | ||||
Mint White List | 15595292 | 703 days ago | IN | 0 ETH | 0.00293478 | ||||
Next Index WL | 15594993 | 703 days ago | IN | 0 ETH | 0.00017534 | ||||
Mint White List | 15594926 | 703 days ago | IN | 0 ETH | 0.00301869 | ||||
Next Index WL | 15587821 | 704 days ago | IN | 0 ETH | 0.00024876 | ||||
Mint White List | 15581569 | 705 days ago | IN | 0 ETH | 0.00164117 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TenPercentNFT
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-13 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) 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; } } // File: contracts/WithLimitedSupply.sol pragma solidity ^0.8.0; /// @author 1001.digital /// @title A token tracker that limits the token supply and increments token IDs on each new mint. abstract contract WithLimitedSupply { using Counters for Counters.Counter; /// @dev Emitted when the supply of this collection changes event SupplyChanged(uint256 indexed supply); // Keeps track of how many we have minted Counters.Counter private _tokenCount; /// @dev The maximum count of tokens this token tracker will hold. uint256 private _totalSupply; /// Instanciate the contract /// @param totalSupply_ how many tokens this collection should hold constructor (uint256 totalSupply_) { _totalSupply = totalSupply_; } /// @dev Get the max Supply /// @return the maximum token count function maxSupply() public view virtual returns (uint256) { return _totalSupply; } /// @dev Get the current token count /// @return the created token count function tokenCount() public view returns (uint256) { return _tokenCount.current(); } /// @dev Check whether tokens are still available /// @return the available token count function availableTokenCount() public view returns (uint256) { return maxSupply() - tokenCount(); } /// @dev Increment the token count and fetch the latest count /// @return the next token id function nextToken() internal virtual returns (uint256) { uint256 token = _tokenCount.current(); _tokenCount.increment(); return token; } /// @dev Check whether another token is still available modifier ensureAvailability() { require(availableTokenCount() > 0, "No more tokens available"); _; } /// @param amount Check whether number of tokens are still available /// @dev Check whether tokens are still available modifier ensureAvailabilityFor(uint256 amount) { require(availableTokenCount() >= amount, "Requested number of tokens not available"); _; } /// Update the supply for the collection /// @param _supply the new token supply. /// @dev create additional token supply for this collection. function _setSupply(uint256 _supply) internal virtual { require(_supply > tokenCount(), "Can't set the supply to less than the current token count"); _totalSupply = _supply; emit SupplyChanged(maxSupply()); } } // File: contracts/RandomlyAssigned.sol pragma solidity ^0.8.0; /// @author 1001.digital /// @title Randomly assign tokenIDs from a given set of tokens. abstract contract RandomlyAssigned is WithLimitedSupply { // Used for random index assignment mapping(uint256 => uint256) private tokenMatrix; // The initial token ID uint256 private startFrom; uint private _lastToken; uint private _lastRandom; /// Instanciate the contract /// @param _totalSupply how many tokens this collection should hold /// @param _startFrom the tokenID with which to start counting constructor (uint256 _totalSupply, uint256 _startFrom) WithLimitedSupply(_totalSupply) { startFrom = _startFrom; } /// Get the next token ID /// @dev Randomly gets a new token ID and keeps track of the ones that are still available. /// @return the next token ID function nextToken() internal override ensureAvailability returns (uint256) { uint256 maxIndex = maxSupply() - tokenCount(); uint256 random = uint256(keccak256( abi.encodePacked( msg.sender, block.coinbase, block.difficulty, block.gaslimit, block.timestamp, _lastToken, _lastRandom ) )) % maxIndex; _lastRandom += random; uint256 value = 0; if (tokenMatrix[random] == 0) { // If this matrix position is empty, set the value to the generated random number. value = random; } else { // Otherwise, use the previously stored number from the matrix. value = tokenMatrix[random]; } // If the last available tokenID is still unused... if (tokenMatrix[maxIndex - 1] == 0) { // ...store that ID in the current matrix position. tokenMatrix[random] = maxIndex - 1; } else { // ...otherwise copy over the stored number to the current matrix position. tokenMatrix[random] = tokenMatrix[maxIndex - 1]; } // Increment counts super.nextToken(); return value + startFrom; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; //import "../ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721Enumerable { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contracts/TenPercent.sol pragma solidity ^0.8.10; //Documintation: https://tenpercentnft.gitbook.io/ten-percent-nft //Twitter: https://twitter.com/TenPercent_NFT contract TenPercentNFT is ERC721URIStorage, RandomlyAssigned{ using ECDSA for bytes32; uint public countLuck = 100; uint public countPublic = 100; uint public countSale = 400; uint public basicPoints; uint public baseVolume; uint public happyVolume; uint public blackVolume; uint public lastUpdated; uint public indexWL; uint private _lastRandom; bool public allPause = true; uint public cost = 0.5 ether; uint public costSale = 0.25 ether; uint public costWL = 0 ether; uint[3] public PriceLevels = [1 ether, 10 ether, 100 ether]; uint public ownerVolume; uint public ownerBlackVolume; uint public ownerHappyVolume; address private owner; address[3] private owners; // [0] ownerBurn; [1] ownerTrading; [2] ownerTradingNFT; mapping (uint => nft) private _baseNFT; mapping (address => bool) public mintedList; struct nft { string URI; uint tokenId; bool mint; uint basePercent; uint level; uint burn; uint myBaseVolume; uint myHappyVolume; uint myBlackVolume; } function _updateTimestamp() internal { lastUpdated = block.timestamp; _lastRandom++; } modifier onlyOwner() { require(owner == msg.sender, "Ownable: caller is not the owner"); _; } modifier Paused() { require(allPause == false, "This action is on pause"); _; } function AllPauseToggle() external onlyOwner{ allPause = !allPause; _lastRandom++; } function getMinimal(uint a, uint b)public pure returns(uint){ if (a>b){ return b; } return a; } function _random(uint Index,uint optionalId) view internal returns(uint){ uint random = uint(keccak256( abi.encodePacked( msg.sender, block.coinbase, block.difficulty, block.gaslimit, block.timestamp, optionalId, _lastRandom ) )) % Index; return random; } constructor(uint _startNoice) ERC721("TenPercentNFT", "TPN") RandomlyAssigned(1111, 1) { owner = msg.sender; owners[0] = 0x5dc547271a7a5fD7f5Bd7338612ef16bef5c3fE8; //[0] ownerBurn; owners[1] = 0x321581C2AD8F11DeB0282ab092F1c42e60c67f33; //[1] ownerTrading; owners[2] = 0xaF9b77FdE0Ed5208EE826A6f151d6F2380BaA6Ad; //[2] ownerTradingNFT; _genRar(_startNoice); _updateTimestamp(); } function _genRar(uint noice) private{ uint j; for (uint i;i<11;i++){ while (true) { uint tokenId = _random(1111, noice + i + 777 + j) + 1; _lastRandom +=tokenId; if (keccak256(abi.encodePacked(_baseNFT[tokenId].URI)) == keccak256("")) { if (i==10){ _baseNFT[tokenId].basePercent = 300; _baseNFT[tokenId].URI = "ipfs://bafybeih2olrptxkbjjayklvs2yfqc7qq7utz44xxlhifs5sf2aydpr6rii/"; _baseNFT[tokenId].tokenId = 1; break; } _baseNFT[tokenId].basePercent = 100; _baseNFT[tokenId].URI = "ipfs://bafybeigsh2x7nabddumggbonldlkdqybofcgj4jvf3aynbqli73ldk2qme/"; _baseNFT[tokenId].tokenId = i+1; break; }else{ j +=1; } } } } event Received(address, uint); receive() external payable { emit Received(msg.sender, msg.value); baseVolume += msg.value; } function _safeNFTMint(address sender) private { uint tokenId = nextToken(); _safeMint(sender, tokenId); if(keccak256(abi.encodePacked(_baseNFT[tokenId].URI)) == keccak256("")) { _baseNFT[tokenId].basePercent = 10; _baseNFT[tokenId].URI = "ipfs://bafybeihcgldustkiwpexsyfsnwm6iijt2tzgrdtqcvefmdyi4aug44lk24/"; _baseNFT[tokenId].tokenId = tokenId; _baseNFT[tokenId].myBaseVolume = baseVolume; } _baseNFT[tokenId].mint = true; basicPoints += _baseNFT[tokenId].basePercent; _setTokenURI(tokenId, string.concat(_baseNFT[tokenId].URI,Strings.toString(_baseNFT[tokenId].tokenId),"_00.json")); _lastRandom++; } function MintLuck() external payable ensureAvailabilityFor(1) Paused{ require(msg.value >= 0.06 ether, "Min price 0.06"); require(countLuck > 0, "MintLuck ended"); if(_random(9990,777)<999) { _safeNFTMint(msg.sender); countLuck--; } _lastRandom +=1; baseVolume += msg.value; } function MintWhiteList(bytes memory _signature) external payable ensureAvailabilityFor(1) Paused{ require(isWhiteList(_signature) == true , "You are not on the white list"); require(!mintedList[msg.sender] , "You have already been minted"); require(msg.value >= costWL, "Price must be >= costWL"); _safeNFTMint(msg.sender); mintedList[msg.sender] = true; baseVolume += msg.value; _lastRandom++; } function WlToPublic(uint count) external onlyOwner{ countPublic = countPublic + count; _lastRandom++; } function setCost(uint newCost) external onlyOwner{ cost = newCost; _lastRandom++; } function setWLCost(uint newWLCost) external onlyOwner{ costWL = newWLCost; _lastRandom++; } function nextIndexWL() external onlyOwner{ indexWL++; _lastRandom++; } function Mint() external payable ensureAvailabilityFor(1) Paused{ require(tokenCount()<1000, "Reached the current limit"); if(countSale >0) { require(msg.value >= costSale, "Price must be >= costSale"); countSale--; } else{ require(countPublic>0, "PublicMint ended"); require(msg.value >= cost, "Price must be >= cost"); countPublic--; } baseVolume += msg.value; mintedList[msg.sender] = true; _safeNFTMint(msg.sender); } function MintToAddress(address to) external onlyOwner{ _safeNFTMint(to); } function priceLevelUp(uint level1, uint level2, uint level3) external onlyOwner{ PriceLevels = [level1, level2, level3]; } function LevelUp(uint tokenId) external payable{ require(msg.sender == ownerOf(tokenId), "You are not the owner of token."); require(_baseNFT[tokenId].level < 3, "You have the maximum level."); if(_baseNFT[tokenId].level == 0){ require(msg.value >= PriceLevels[0], "To level up PriceLevels[0]"); } else if(_baseNFT[tokenId].level == 1){ require(msg.value >= PriceLevels[1], "To level up PriceLevels[1]"); } else{ require(msg.value >= PriceLevels[2], "To level up PriceLevels[2]"); } _updateBasePoints(_baseNFT[tokenId].level,_baseNFT[tokenId].level+1); _baseNFT[tokenId].level++; _setTokenURI(tokenId, string.concat(_baseNFT[tokenId].URI,Strings.toString(_baseNFT[tokenId].tokenId),"_",Strings.toString(_baseNFT[tokenId].level),Strings.toString(_baseNFT[tokenId].burn),".json")); baseVolume += msg.value; } function _updateBasePoints(uint oldLevel, uint newLevel) internal { uint newPoints; uint oldPoints; if (newLevel != 0){ newPoints = 3*(10**(newLevel-1)); } if (oldLevel != 0){ oldPoints = 3*(10**(oldLevel-1)); } basicPoints += newPoints; basicPoints -= oldPoints; } function _generateLevelUp(uint tokenId, uint LuckPercent) private { _lastRandom++; require(msg.sender == ownerOf(tokenId), "You are not the owner of token."); require(_baseNFT[tokenId].level < 3, "You have the maximum level."); if(_random(9990,777)<LuckPercent){ _updateBasePoints(_baseNFT[tokenId].level,_baseNFT[tokenId].level+1); _baseNFT[tokenId].level++; _baseNFT[tokenId].burn = 0; } else{ transferFrom(msg.sender,owners[0],tokenId); if (_baseNFT[tokenId].burn<5){ _baseNFT[tokenId].burn++; } else{ _updateBasePoints(_baseNFT[tokenId].level,0); _baseNFT[tokenId].level = 0; _baseNFT[tokenId].burn = 0; } } _setTokenURI(tokenId, string.concat(_baseNFT[tokenId].URI,Strings.toString(_baseNFT[tokenId].tokenId),"_",Strings.toString(_baseNFT[tokenId].level),Strings.toString(_baseNFT[tokenId].burn),".json")); } function LevelUpLuck(uint tokenId) external{ require(msg.sender == ownerOf(tokenId), "Not the owner of this token."); require(_baseNFT[tokenId].level < 3, "You have the maximum level."); if(_baseNFT[tokenId].level == 0){ _generateLevelUp(tokenId,999*6); } else if(_baseNFT[tokenId].level == 1){ _generateLevelUp(tokenId,999*3); } else if(_baseNFT[tokenId].level == 2){ _generateLevelUp(tokenId,999); } } function balanceToString(uint youBalance) pure internal returns(string memory){ string memory integer = Strings.toString(youBalance/(10**18)); string memory oneTenth = Strings.toString(youBalance/(10**17)-youBalance/(10**18)*10); string memory oneHundredth = Strings.toString(youBalance/(10**16)-youBalance/(10**17)*10); string memory oneThousandth = Strings.toString(youBalance/(10**15)-youBalance/(10**16)*10); string memory oneTenThousandth = Strings.toString(youBalance/(10**14)-youBalance/(10**15)*10); return string(abi.encodePacked(integer, ".", oneTenth, oneHundredth, oneThousandth, oneTenThousandth, " ETH")); } function getInfoToken(uint tokenId) external view returns(string memory){ if (tokenId < 1 || tokenId > 1111){ return "TokenId from 1 to 1111"; } else{ if (_baseNFT[tokenId].mint){ uint balanceToken = (baseVolume-_baseNFT[tokenId].myBaseVolume)*_baseNFT[tokenId].basePercent/1000/100; return string(abi.encodePacked("TokenId: ", Strings.toString(tokenId) , " Level: ", Strings.toString(_baseNFT[tokenId].level) , " Burn: ", Strings.toString(_baseNFT[tokenId].burn) , " You all balance: ", balanceToString(balanceToken))); } else{ return "TokenId not minted yet"; } } } function getMyBalance() external view returns(string memory){ require(balanceOf(msg.sender)>0,"You don't have the NFT."); uint tokenCount = balanceOf(msg.sender); uint sumBalance; uint tokenId; uint points; for (uint index = 0; index <tokenCount; index++){ tokenId = tokenOfOwnerByIndex(msg.sender,index); points = optimizePoint(tokenId); sumBalance += (baseVolume-_baseNFT[tokenId].myBaseVolume)*points/1000/100; sumBalance += (happyVolume - _baseNFT[tokenId].myHappyVolume)/1111; sumBalance += (blackVolume - _baseNFT[tokenId].myBlackVolume)/1111; } return string(abi.encodePacked("You all balance: ", balanceToString(sumBalance))); } function optimizePoint(uint tokenId) internal view returns(uint){ uint points; uint levelPoints; if (_baseNFT[tokenId].level != 0){ levelPoints = 3*(10**(_baseNFT[tokenId].level-1)); } points = (_baseNFT[tokenId].basePercent + _baseNFT[tokenId].burn + levelPoints); uint newPoints = points; if (_baseNFT[tokenId].basePercent == 10 && basicPoints>25000 && newPoints>13){ newPoints = 13 + ((newPoints-13)*(25000-(13*1111))/(basicPoints-(13*1111))); } return getMinimal(points,newPoints); } function getBalance(uint tokenId) internal returns(uint){ uint points; uint Balance; points = optimizePoint(tokenId); Balance += (baseVolume-_baseNFT[tokenId].myBaseVolume)*points/1000/100; Balance += (happyVolume - _baseNFT[tokenId].myHappyVolume)/1111; Balance += (blackVolume - _baseNFT[tokenId].myBlackVolume)/1111; _baseNFT[tokenId].myBaseVolume = baseVolume; _baseNFT[tokenId].myHappyVolume = happyVolume; _baseNFT[tokenId].myBlackVolume = blackVolume; return Balance; } function claim() external{ require(balanceOf(msg.sender)>0,"You don't have the NFT."); uint tokenId; uint tokenCount = balanceOf(msg.sender); uint sumBalance; for (uint index = 0; index <tokenCount; index++){ tokenId = tokenOfOwnerByIndex(msg.sender,index); sumBalance += getBalance(tokenId); } require(sumBalance/(10**14)>0,"You all balanceNFT<0.0001 ETH."); (bool success, ) = msg.sender.call{value:sumBalance}(""); require(success, "Transaction Failed!"); _lastRandom++; } function claimToken(uint tokenId) external{ require(msg.sender == ownerOf(tokenId), "Not the owner of this token."); uint Balance = getBalance(tokenId); require(Balance/(10**14)>0,"You all balanceNFT<0.0001 ETH."); (bool success, ) = msg.sender.call{value:Balance}(""); require(success, "Transaction Failed!"); _lastRandom++; } function ownerClaim() external onlyOwner{ uint sumBalance = baseVolume-ownerVolume-(blackVolume-ownerBlackVolume); require((sumBalance)/(10**14)>0,"You all balanceNFT<0.0001 ETH."); _updateTimestamp(); (bool successOwner, ) = owner.call{value:(sumBalance/(10**14))*50/100*(10**14)}(""); require(successOwner, "Transaction Failed!"); sumBalance = baseVolume-ownerVolume-(blackVolume-ownerBlackVolume)-(happyVolume-ownerHappyVolume); if(sumBalance>0){ (successOwner, ) = owners[1].call{value:(sumBalance/(10**14))*10/100*(10**14)}(""); (successOwner, ) = owners[2].call{value:(sumBalance/(10**14))*10/100*(10**14)}(""); } ownerBlackVolume = blackVolume; ownerHappyVolume = happyVolume; ownerVolume = baseVolume; _lastRandom = _lastRandom%99999; } function getBlackDay() public view returns(bool){ return ((block.timestamp - lastUpdated)/60/60/24)>365; } function setBlackDay() external { require(getBlackDay(), "Black day has not yet arrived."); blackVolume += baseVolume - ownerVolume - blackVolume; _updateTimestamp(); _lastRandom = _lastRandom%99999; } function setHappyDay(uint amountHappy) external onlyOwner{ happyVolume += amountHappy; _lastRandom++; } function isWhiteList(bytes memory _signature) public view returns (bool) { bytes32 messagehash = keccak256( abi.encodePacked(owners[0], msg.sender,indexWL) ); address signer = messagehash.toEthSignedMessageHash().recover( _signature ); if (owner == signer) { return (true); } else{ return (false); } } function withdrawToken(address _tokenAddress) public onlyOwner { IERC20 tokenAddress = IERC20(_tokenAddress); tokenAddress.transfer(msg.sender, tokenAddress.balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_startNoice","type":"uint256"}],"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":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"SupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AllPauseToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"LevelUp","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"LevelUpLuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MintLuck","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"MintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"MintWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PriceLevels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"WlToPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basicPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blackVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countLuck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlackDay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getInfoToken","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"getMinimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMyBalance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"happyVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"indexWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes","name":"_signature","type":"bytes"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextIndexWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerBlackVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerHappyVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"ownerVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level1","type":"uint256"},{"internalType":"uint256","name":"level2","type":"uint256"},{"internalType":"uint256","name":"level3","type":"uint256"}],"name":"priceLevelUp","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":[],"name":"setBlackDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountHappy","type":"uint256"}],"name":"setHappyDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWLCost","type":"uint256"}],"name":"setWLCost","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":[],"name":"tokenCount","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":"_tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60646011819055601255610190601355601b805460ff191660011790556706f05b59d3b20000601c556703782dace9d90000601d556000601e5560e0604052670de0b6b3a76400006080908152678ac7230489e8000060a05268056bc75e2d6310000060c0526200007590601f9060036200042b565b503480156200008357600080fd5b506040516200526138038062005261833981016040819052620000a69162000490565b6104576001816040518060400160405280600d81526020016c15195b94195c98d95b9d139195609a1b815250604051806040016040528060038152602001622a282760e91b8152508160009081620000ff91906200054e565b5060016200010e82826200054e565b505050600c55600e555060258054336001600160a01b031991821617909155602680548216735dc547271a7a5fd7f5bd7338612ef16bef5c3fe817905560278054821673321581c2ad8f11deb0282ab092f1c42e60c67f331790556028805490911673af9b77fde0ed5208ee826a6f151d6f2380baa6ad1790556200019381620001a4565b6200019d6200038f565b5062000703565b6000805b600b8110156200038a575b6000620001e961045784620001c9858862000630565b620001d79061030962000630565b620001e3919062000630565b620003ac565b620001f690600162000630565b905080601a60008282546200020c919062000630565b909155505060008181526029602090815260409182902091517fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47092620002559290910162000646565b60405160208183030381529060405280519060200120036200035f5781600a03620002e75761012c6029600083815260200190815260200160002060030181905550604051806080016040528060438152602001620051db60439139600082815260296020526040902090620002cc90826200054e565b50600090815260296020526040902060019081015562000375565b606460296000838152602001908152602001600020600301819055506040518060800160405280604381526020016200521e604391396000828152602960205260409020906200033890826200054e565b506200034682600162000630565b6000918252602960205260409091206001015562000375565b6200036c60018462000630565b925050620001b3565b806200038181620006c4565b915050620001a8565b505050565b42601855601a8054906000620003a583620006c4565b9190505550565b601a546040516001600160601b031933606090811b8216602084015241901b16603482015244604882015245606882015242608882015260a8810183905260c88101919091526000908190849060e8016040516020818303038152906040528051906020012060001c620004219190620006e0565b9150505b92915050565b826003810192821562000467579160200282015b828111156200046757825182906001600160481b03169055916020019190600101906200043f565b506200047592915062000479565b5090565b5b808211156200047557600081556001016200047a565b600060208284031215620004a357600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004d557607f821691505b602082108103620004f657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038a57600081815260208120601f850160051c81016020861015620005255750805b601f850160051c820191505b81811015620005465782815560010162000531565b505050505050565b81516001600160401b038111156200056a576200056a620004aa565b62000582816200057b8454620004c0565b84620004fc565b602080601f831160018114620005ba5760008415620005a15750858301515b600019600386901b1c1916600185901b17855562000546565b600085815260208120601f198616915b82811015620005eb57888601518255948401946001909101908401620005ca565b50858210156200060a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156200042557620004256200061a565b60008083546200065681620004c0565b600182811680156200067157600181146200068757620006b8565b60ff1984168752821515830287019450620006b8565b8760005260208060002060005b85811015620006af5781548a82015290840190820162000694565b50505082870194505b50929695505050505050565b600060018201620006d957620006d96200061a565b5060010190565b600082620006fe57634e487b7160e01b600052601260045260246000fd5b500690565b614ac880620007136000396000f3fe60806040526004361061039b5760003560e01c806370a08231116101dc578063c12d655311610102578063d5abeb01116100a0578063e391b3761161006f578063e391b376146109f0578063e985e9c514610a06578063f170902414610a4f578063ff61879f14610a6f57600080fd5b8063d5abeb011461099d578063db40e56f146109b2578063e14ca353146109c8578063e195385e146109dd57600080fd5b8063c87b56dd116100dc578063c87b56dd14610931578063cc200b1814610951578063d0b06f5d14610967578063d1d192131461097d57600080fd5b8063c12d6553146108d1578063c7817e1a146108f1578063c868a7501461091157600080fd5b806393a0be1e1161017a578063a440984a11610149578063a440984a14610874578063a9e7c2e514610889578063b88d4fde146108a9578063b912e7ae146108c957600080fd5b806393a0be1e1461081457806395d89b411461082a5780639f181b5e1461083f578063a22cb4651461085457600080fd5b806381ef5c8f116101b657806381ef5c8f146107b257806385fdd03e146107c857806389476069146107de57806389a3df4f146107fe57600080fd5b806370a082311461074d578063715057901461076d578063816877301461078257600080fd5b80632c3ab63b116102c15780634dbe58891161025f5780635dce691e1161022e5780635dce691e146106e45780636352211e1461070457806368f6559c146107245780636a1b6f911461073a57600080fd5b80634dbe58891461067a5780634e71d92d1461068f5780634f6ccce7146106a45780635c117d93146106c457600080fd5b806340cfd0951161029b57806340cfd0951461061057806342842e0e1461062557806344a0d68a146106455780634c7389091461066557600080fd5b80632c3ab63b146105d25780632f745c59146105e857806334c738841461060857600080fd5b80630c72e6a311610339578063153fc65511610308578063153fc6551461056357806318160ddd1461057d578063219a58231461059257806323b872dd146105b257600080fd5b80630c72e6a31461050257806311672bfb146105225780631199f27b1461053757806313faede61461054d57600080fd5b806306fdde031161037557806306fdde0314610466578063081812fc14610488578063095ea7b3146104c05780630a369303146104e257600080fd5b806301ffc9a7146103f7578063045551f41461042c57806306afd5921461045057600080fd5b366103f257604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a134601560008282546103ea9190613e39565b925050819055005b600080fd5b34801561040357600080fd5b50610417610412366004613e62565b610a85565b60405190151581526020015b60405180910390f35b34801561043857600080fd5b5061044260115481565b604051908152602001610423565b34801561045c57600080fd5b50610442601e5481565b34801561047257600080fd5b5061047b610ab0565b6040516104239190613ecf565b34801561049457600080fd5b506104a86104a3366004613ee2565b610b42565b6040516001600160a01b039091168152602001610423565b3480156104cc57600080fd5b506104e06104db366004613f12565b610b69565b005b3480156104ee57600080fd5b506104176104fd366004613fdf565b610c83565b34801561050e57600080fd5b5061044261051d366004613ee2565b610d66565b34801561052e57600080fd5b506104e0610d7d565b34801561054357600080fd5b5061044260155481565b34801561055957600080fd5b50610442601c5481565b34801561056f57600080fd5b50601b546104179060ff1681565b34801561058957600080fd5b50600854610442565b34801561059e57600080fd5b5061047b6105ad366004613ee2565b610e23565b3480156105be57600080fd5b506104e06105cd366004614014565b610f7e565b3480156105de57600080fd5b50610442601d5481565b3480156105f457600080fd5b50610442610603366004613f12565b610faf565b6104e0611045565b34801561061c57600080fd5b5061041761123f565b34801561063157600080fd5b506104e0610640366004614014565b61127b565b34801561065157600080fd5b506104e0610660366004613ee2565b611296565b34801561067157600080fd5b5061047b6112dd565b34801561068657600080fd5b506104e061146f565b34801561069b57600080fd5b506104e061172f565b3480156106b057600080fd5b506104426106bf366004613ee2565b611881565b3480156106d057600080fd5b506104426106df366004614050565b611914565b3480156106f057600080fd5b506104e06106ff366004613ee2565b61192c565b34801561071057600080fd5b506104a861071f366004613ee2565b61197d565b34801561073057600080fd5b5061044260125481565b6104e0610748366004613ee2565b6119dd565b34801561075957600080fd5b50610442610768366004614072565b611c84565b34801561077957600080fd5b506104e0611d0a565b34801561078e57600080fd5b5061041761079d366004614072565b602a6020526000908152604090205460ff1681565b3480156107be57600080fd5b5061044260225481565b3480156107d457600080fd5b5061044260235481565b3480156107ea57600080fd5b506104e06107f9366004614072565b611d60565b34801561080a57600080fd5b5061044260165481565b34801561082057600080fd5b5061044260175481565b34801561083657600080fd5b5061047b611e6d565b34801561084b57600080fd5b50610442611e7c565b34801561086057600080fd5b506104e061086f36600461409b565b611e8c565b34801561088057600080fd5b506104e0611e9b565b34801561089557600080fd5b506104e06108a4366004613ee2565b611ee7565b3480156108b557600080fd5b506104e06108c43660046140d2565b61200e565b6104e0612046565b3480156108dd57600080fd5b506104e06108ec366004613ee2565b61217f565b3480156108fd57600080fd5b506104e061090c366004613ee2565b612287565b34801561091d57600080fd5b506104e061092c36600461413a565b6122d2565b34801561093d57600080fd5b5061047b61094c366004613ee2565b612324565b34801561095d57600080fd5b5061044260195481565b34801561097357600080fd5b5061044260185481565b34801561098957600080fd5b506104e0610998366004613ee2565b612434565b3480156109a957600080fd5b50600c54610442565b3480156109be57600080fd5b5061044260135481565b3480156109d457600080fd5b50610442612473565b6104e06109eb366004613fdf565b61248a565b3480156109fc57600080fd5b5061044260145481565b348015610a1257600080fd5b50610417610a21366004614166565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a5b57600080fd5b506104e0610a6a366004614072565b612635565b348015610a7b57600080fd5b5061044260245481565b60006001600160e01b0319821663780e9d6360e01b1480610aaa5750610aaa82612668565b92915050565b606060008054610abf90614199565b80601f0160208091040260200160405190810160405280929190818152602001828054610aeb90614199565b8015610b385780601f10610b0d57610100808354040283529160200191610b38565b820191906000526020600020905b815481529060010190602001808311610b1b57829003601f168201915b5050505050905090565b6000610b4d826126b8565b506000908152600460205260409020546001600160a01b031690565b6000610b748261197d565b9050806001600160a01b0316836001600160a01b031603610be65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610c025750610c028133610a21565b610c745760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610bdd565b610c7e8383612717565b505050565b60008060268101546019546040516bffffffffffffffffffffffff19606093841b811660208301523390931b909216603483015260488201526068016040516020818303038152906040528051906020012090506000610d3a84610d34846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90612785565b6025549091506001600160a01b03808316911603610d5c575060019392505050565b5060009392505050565b601f8160038110610d7657600080fd5b0154905081565b610d8561123f565b610dd15760405162461bcd60e51b815260206004820152601e60248201527f426c61636b2064617920686173206e6f742079657420617272697665642e00006044820152606401610bdd565b601754602254601554610de491906141e9565b610dee91906141e9565b60176000828254610dff9190613e39565b90915550610e0d90506127a9565b6201869f601a54610e1e9190614212565b601a55565b60606001821080610e35575061045782115b15610e6c575050604080518082019091526016815275546f6b656e49642066726f6d203120746f203131313160501b602082015290565b60008281526029602052604090206002015460ff1615610f4757600082815260296020526040812060038101546006909101546015546064926103e8929091610eb591906141e9565b610ebf9190614226565b610ec99190614245565b610ed39190614245565b9050610ede836127bd565b600084815260296020526040902060040154610ef9906127bd565b600085815260296020526040902060050154610f14906127bd565b610f1d846128be565b604051602001610f309493929190614259565b604051602081830303815290604052915050919050565b5050604080518082019091526016815275151bdad95b9259081b9bdd081b5a5b9d1959081e595d60521b602082015290565b919050565b610f8833826129ee565b610fa45760405162461bcd60e51b8152600401610bdd9061430e565b610c7e838383612a6c565b6000610fba83611c84565b821061101c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bdd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600180611050612473565b101561106e5760405162461bcd60e51b8152600401610bdd9061435c565b601b5460ff16156110915760405162461bcd60e51b8152600401610bdd906143a4565b6103e861109c611e7c565b106110e95760405162461bcd60e51b815260206004820152601960248201527f52656163686564207468652063757272656e74206c696d6974000000000000006044820152606401610bdd565b6013541561115d57601d543410156111435760405162461bcd60e51b815260206004820152601960248201527f5072696365206d757374206265203e3d20636f737453616c65000000000000006044820152606401610bdd565b60138054906000611153836143db565b9190505550611202565b6000601254116111a25760405162461bcd60e51b815260206004820152601060248201526f141d589b1a58d35a5b9d08195b99195960821b6044820152606401610bdd565b601c543410156111ec5760405162461bcd60e51b8152602060048201526015602482015274141c9a58d9481b5d5cdd081899480f8f4818dbdcdd605a1b6044820152606401610bdd565b601280549060006111fc836143db565b91905055505b34601560008282546112149190613e39565b9091555050336000818152602a60205260409020805460ff1916600117905561123c90612c13565b50565b600061016d6018603c806018544261125791906141e9565b6112619190614245565b61126b9190614245565b6112759190614245565b11905090565b610c7e8383836040518060200160405280600081525061200e565b6025546001600160a01b031633146112c05760405162461bcd60e51b8152600401610bdd906143f2565b601c819055601a80549060006112d583614427565b919050555050565b606060006112ea33611c84565b116113315760405162461bcd60e51b81526020600482015260176024820152762cb7ba903237b713ba103430bb32903a34329027232a1760491b6044820152606401610bdd565b600061133c33611c84565b905060008080805b8481101561143d576113563382610faf565b925061136183612d70565b915060646103e883602960008781526020019081526020016000206006015460155461138d91906141e9565b6113979190614226565b6113a19190614245565b6113ab9190614245565b6113b59085613e39565b600084815260296020526040902060070154601654919550610457916113db91906141e9565b6113e59190614245565b6113ef9085613e39565b6000848152602960205260409020600801546017549195506104579161141591906141e9565b61141f9190614245565b6114299085613e39565b93508061143581614427565b915050611344565b50611447836128be565b6040516020016114579190614440565b60405160208183030381529060405294505050505090565b6025546001600160a01b031633146114995760405162461bcd60e51b8152600401610bdd906143f2565b60006023546017546114ab91906141e9565b6022546015546114bb91906141e9565b6114c591906141e9565b905060006114d9655af3107a400083614245565b116114f65760405162461bcd60e51b8152600401610bdd90614479565b6114fe6127a9565b6025546000906001600160a01b0316606461151f655af3107a400085614245565b61152a906032614226565b6115349190614245565b61154490655af3107a4000614226565b604051600081818185875af1925050503d8060008114611580576040519150601f19603f3d011682016040523d82523d6000602084013e611585565b606091505b50509050806115a65760405162461bcd60e51b8152600401610bdd906144b0565b6024546016546115b691906141e9565b6023546017546115c691906141e9565b6022546015546115d691906141e9565b6115e091906141e9565b6115ea91906141e9565b91508115611705576027546001600160a01b03166064611610655af3107a400085614245565b61161b90600a614226565b6116259190614245565b61163590655af3107a4000614226565b604051600081818185875af1925050503d8060008114611671576040519150601f19603f3d011682016040523d82523d6000602084013e611676565b606091505b50506028549091506001600160a01b03166064611699655af3107a400085614245565b6116a490600a614226565b6116ae9190614245565b6116be90655af3107a4000614226565b604051600081818185875af1925050503d80600081146116fa576040519150601f19603f3d011682016040523d82523d6000602084013e6116ff565b606091505b50909150505b601754602355601654602455601554602255601a54611728906201869f90614212565b601a555050565b600061173a33611c84565b116117815760405162461bcd60e51b81526020600482015260176024820152762cb7ba903237b713ba103430bb32903a34329027232a1760491b6044820152606401610bdd565b60008061178d33611c84565b90506000805b828110156117ce576117a53382610faf565b93506117b084612e7c565b6117ba9083613e39565b9150806117c681614427565b915050611793565b5060006117e1655af3107a400083614245565b116117fe5760405162461bcd60e51b8152600401610bdd90614479565b604051600090339083908381818185875af1925050503d8060008114611840576040519150601f19603f3d011682016040523d82523d6000602084013e611845565b606091505b50509050806118665760405162461bcd60e51b8152600401610bdd906144b0565b601a805490600061187683614427565b919050555050505050565b600061188c60085490565b82106118ef5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bdd565b60088281548110611902576119026141d3565b90600052602060002001549050919050565b600081831115611925575080610aaa565b5090919050565b6025546001600160a01b031633146119565760405162461bcd60e51b8152600401610bdd906143f2565b80601660008282546119689190613e39565b9091555050601a80549060006112d583614427565b6000818152600260205260408120546001600160a01b031680610aaa5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bdd565b6119e68161197d565b6001600160a01b0316336001600160a01b031614611a465760405162461bcd60e51b815260206004820152601f60248201527f596f7520617265206e6f7420746865206f776e6572206f6620746f6b656e2e006044820152606401610bdd565b600081815260296020526040902060040154600311611a775760405162461bcd60e51b8152600401610bdd906144dd565b6000818152602960205260408120600401549003611ae657601f54341015611ae15760405162461bcd60e51b815260206004820152601a60248201527f546f206c6576656c2075702050726963654c6576656c735b305d0000000000006044820152606401610bdd565b611ba3565b600081815260296020526040902060040154600103611b5157602054341015611ae15760405162461bcd60e51b815260206004820152601a60248201527f546f206c6576656c2075702050726963654c6576656c735b315d0000000000006044820152606401610bdd565b602154341015611ba35760405162461bcd60e51b815260206004820152601a60248201527f546f206c6576656c2075702050726963654c6576656c735b325d0000000000006044820152606401610bdd565b600081815260296020526040902060040154611bc990611bc4816001613e39565b612f88565b6000818152602960205260408120600401805491611be683614427565b909155505060008181526029602052604090206001810154611c6a918391611c0d906127bd565b600085815260296020526040902060040154611c28906127bd565b600086815260296020526040902060050154611c43906127bd565b604051602001611c569493929190614587565b604051602081830303815290604052613015565b3460156000828254611c7c9190613e39565b909155505050565b60006001600160a01b038216611cee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610bdd565b506001600160a01b031660009081526003602052604090205490565b6025546001600160a01b03163314611d345760405162461bcd60e51b8152600401610bdd906143f2565b60198054906000611d4483614427565b9091555050601a8054906000611d5983614427565b9190505550565b6025546001600160a01b03163314611d8a5760405162461bcd60e51b8152600401610bdd906143f2565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe91906145f6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e919061460f565b606060018054610abf90614199565b6000611e87600b5490565b905090565b611e973383836130a8565b5050565b6025546001600160a01b03163314611ec55760405162461bcd60e51b8152600401610bdd906143f2565b601b805460ff19811660ff90911615179055601a8054906000611d5983614427565b611ef08161197d565b6001600160a01b0316336001600160a01b031614611f505760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746865206f776e6572206f66207468697320746f6b656e2e000000006044820152606401610bdd565b6000611f5b82612e7c565b90506000611f6f655af3107a400083614245565b11611f8c5760405162461bcd60e51b8152600401610bdd90614479565b604051600090339083908381818185875af1925050503d8060008114611fce576040519150601f19603f3d011682016040523d82523d6000602084013e611fd3565b606091505b5050905080611ff45760405162461bcd60e51b8152600401610bdd906144b0565b601a805490600061200483614427565b9190505550505050565b61201833836129ee565b6120345760405162461bcd60e51b8152600401610bdd9061430e565b61204084848484613176565b50505050565b600180612051612473565b101561206f5760405162461bcd60e51b8152600401610bdd9061435c565b601b5460ff16156120925760405162461bcd60e51b8152600401610bdd906143a4565b66d529ae9e8600003410156120da5760405162461bcd60e51b815260206004820152600e60248201526d26b4b710383934b1b2901817181b60911b6044820152606401610bdd565b60006011541161211d5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d131d58dac8195b99195960921b6044820152606401610bdd565b6103e761212e6127066103096131a9565b10156121535761213d33612c13565b6011805490600061214d836143db565b91905055505b6001601a60008282546121669190613e39565b925050819055503460156000828254611c7c9190613e39565b6121888161197d565b6001600160a01b0316336001600160a01b0316146121e85760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746865206f776e6572206f66207468697320746f6b656e2e000000006044820152606401610bdd565b6000818152602960205260409020600401546003116122195760405162461bcd60e51b8152600401610bdd906144dd565b600081815260296020526040812060040154900361223d5761123c8161176a6131ef565b6000818152602960205260409020600401546001036122625761123c81610bb56131ef565b60008181526029602052604090206004015460020361123c5761123c816103e76131ef565b6025546001600160a01b031633146122b15760405162461bcd60e51b8152600401610bdd906143f2565b806012546122bf9190613e39565b601255601a80549060006112d583614427565b6025546001600160a01b031633146122fc5760405162461bcd60e51b8152600401610bdd906143f2565b604080516060810182528481526020810184905290810182905261204090601f906003613dd0565b606061232f826126b8565b6000828152600a60205260408120805461234890614199565b80601f016020809104026020016040519081016040528092919081815260200182805461237490614199565b80156123c15780601f10612396576101008083540402835291602001916123c1565b820191906000526020600020905b8154815290600101906020018083116123a457829003601f168201915b5050505050905060006123df60408051602081019091526000815290565b905080516000036123f1575092915050565b81511561242357808260405160200161240b92919061462c565b60405160208183030381529060405292505050919050565b61242c846133f4565b949350505050565b6025546001600160a01b0316331461245e5760405162461bcd60e51b8152600401610bdd906143f2565b601e819055601a80549060006112d583614427565b600061247d611e7c565b600c54611e8791906141e9565b600180612495612473565b10156124b35760405162461bcd60e51b8152600401610bdd9061435c565b601b5460ff16156124d65760405162461bcd60e51b8152600401610bdd906143a4565b6124df82610c83565b15156001146125305760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e20746865207768697465206c6973740000006044820152606401610bdd565b336000908152602a602052604090205460ff16156125905760405162461bcd60e51b815260206004820152601c60248201527f596f75206861766520616c7265616479206265656e206d696e746564000000006044820152606401610bdd565b601e543410156125e25760405162461bcd60e51b815260206004820152601760248201527f5072696365206d757374206265203e3d20636f7374574c0000000000000000006044820152606401610bdd565b6125eb33612c13565b336000908152602a60205260408120805460ff1916600117905560158054349290612617908490613e39565b9091555050601a805490600061262c83614427565b91905055505050565b6025546001600160a01b0316331461265f5760405162461bcd60e51b8152600401610bdd906143f2565b61123c81612c13565b60006001600160e01b031982166380ac58cd60e01b148061269957506001600160e01b03198216635b5e139f60e01b145b80610aaa57506301ffc9a760e01b6001600160e01b0319831614610aaa565b6000818152600260205260409020546001600160a01b031661123c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bdd565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061274c8261197d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060006127948585613458565b915091506127a18161349d565b509392505050565b42601855601a8054906000611d5983614427565b6060816000036127e45750506040805180820190915260018152600360fc1b602082015290565b8160005b811561280e57806127f881614427565b91506128079050600a83614245565b91506127e8565b60008167ffffffffffffffff81111561282957612829613f3c565b6040519080825280601f01601f191660200182016040528015612853576020820181803683370190505b5090505b841561242c576128686001836141e9565b9150612875600a86614212565b612880906030613e39565b60f81b818381518110612895576128956141d3565b60200101906001600160f81b031916908160001a9053506128b7600a86614245565b9450612857565b606060006128dc6128d7670de0b6b3a764000085614245565b6127bd565b9050600061291c6128f5670de0b6b3a764000086614245565b61290090600a614226565b61291267016345785d8a000087614245565b6128d791906141e9565b9050600061295161293567016345785d8a000087614245565b61294090600a614226565b612912662386f26fc1000088614245565b90506000612985612969662386f26fc1000088614245565b61297490600a614226565b61291266038d7ea4c6800089614245565b905060006129b861299d66038d7ea4c6800089614245565b6129a890600a614226565b612912655af3107a40008a614245565b905084848484846040516020016129d395949392919061465b565b60405160208183030381529060405295505050505050919050565b6000806129fa8361197d565b9050806001600160a01b0316846001600160a01b03161480612a4157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061242c5750836001600160a01b0316612a5a84610b42565b6001600160a01b031614949350505050565b826001600160a01b0316612a7f8261197d565b6001600160a01b031614612ae35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610bdd565b6001600160a01b038216612b455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bdd565b612b50838383613653565b612b5b600082612717565b6001600160a01b0383166000908152600360205260408120805460019290612b849084906141e9565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bb2908490613e39565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612c1d61370b565b9050612c29828261389b565b60008181526029602090815260409182902091517fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47092612c6b929091016146ed565b6040516020818303038152906040528051906020012003612cf457600a6029600083815260200190815260200160002060030181905550604051806080016040528060438152602001614a5060439139600082815260296020526040902090612cd49082614747565b506000818152602960205260409020600181018290556015546006909101555b600081815260296020526040812060028101805460ff19166001179055600301546014805491929091612d28908490613e39565b909155505060008181526029602052604090206001810154612d60918391612d4f906127bd565b604051602001611c56929190614807565b601a805490600061262c83614427565b6000818152602960205260408120600401548190819015612dc257600084815260296020526040902060040154612da9906001906141e9565b612db490600a614923565b612dbf906003614226565b90505b600084815260296020526040902060058101546003909101548291612de691613e39565b612df09190613e39565b6000858152602960205260409020600301549092508290600a148015612e1957506161a8601454115b8015612e255750600d81115b15612e695761386b601454612e3a91906141e9565b612e45600d836141e9565b612e519061293d614226565b612e5b9190614245565b612e6690600d613e39565b90505b612e738382611914565b95945050505050565b6000806000612e8a84612d70565b915060646103e8836029600088815260200190815260200160002060060154601554612eb691906141e9565b612ec09190614226565b612eca9190614245565b612ed49190614245565b612ede9082613e39565b60008581526029602052604090206007015460165491925061045791612f0491906141e9565b612f0e9190614245565b612f189082613e39565b60008581526029602052604090206008015460175491925061045791612f3e91906141e9565b612f489190614245565b612f529082613e39565b60155460009586526029602052604090952060068101959095556016546007860155601754600890950194909455509192915050565b6000808215612fb557612f9c6001846141e9565b612fa790600a614923565b612fb2906003614226565b91505b8315612fdf57612fc66001856141e9565b612fd190600a614923565b612fdc906003614226565b90505b8160146000828254612ff19190613e39565b92505081905550806014600082825461300a91906141e9565b909155505050505050565b6000828152600260205260409020546001600160a01b03166130905760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610bdd565b6000828152600a60205260409020610c7e8282614747565b816001600160a01b0316836001600160a01b0316036131095760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bdd565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613181848484612a6c565b61318d848484846138b5565b6120405760405162461bcd60e51b8152600401610bdd9061492f565b60008083334144454288601a546040516020016131cc9796959493929190614981565b6040516020818303038152906040528051906020012060001c61242c9190614212565b601a80549060006131ff83614427565b919050555061320d8261197d565b6001600160a01b0316336001600160a01b03161461326d5760405162461bcd60e51b815260206004820152601f60248201527f596f7520617265206e6f7420746865206f776e6572206f6620746f6b656e2e006044820152606401610bdd565b60008281526029602052604090206004015460031161329e5760405162461bcd60e51b8152600401610bdd906144dd565b806132ad6127066103096131a9565b101561330d576000828152602960205260409020600401546132d490611bc4816001613e39565b60008281526029602052604081206004018054916132f183614427565b909155505060008281526029602052604081206005015561339c565b613326336026600001546001600160a01b031684610f7e565b6000828152602960205260409020600590810154101561336757600082815260296020526040812060050180549161335d83614427565b919050555061339c565b60008281526029602052604081206004015461338291612f88565b600082815260296020526040812060048101829055600501555b60008281526029602052604090206001810154611e979184916133be906127bd565b6000868152602960205260409020600401546133d9906127bd565b600087815260296020526040902060050154611c43906127bd565b60606133ff826126b8565b600061341660408051602081019091526000815290565b905060008151116134365760405180602001604052806000815250613451565b80613440846127bd565b604051602001610f3092919061462c565b9392505050565b600080825160410361348e5760208301516040840151606085015160001a613482878285856139b6565b94509450505050613496565b506000905060025b9250929050565b60008160048111156134b1576134b16149c9565b036134b95750565b60018160048111156134cd576134cd6149c9565b0361351a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bdd565b600281600481111561352e5761352e6149c9565b0361357b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bdd565b600381600481111561358f5761358f6149c9565b036135e75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bdd565b60048160048111156135fb576135fb6149c9565b0361123c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bdd565b6001600160a01b0383166136ae576136a981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6136d1565b816001600160a01b0316836001600160a01b0316146136d1576136d18382613aa3565b6001600160a01b0382166136e857610c7e81613b40565b826001600160a01b0316826001600160a01b031614610c7e57610c7e8282613bef565b600080613716612473565b116137635760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c6500000000000000006044820152606401610bdd565b600061376d611e7c565b600c5461377a91906141e9565b90506000813341444542600f546010546040516020016137a09796959493929190614981565b6040516020818303038152906040528051906020012060001c6137c39190614212565b905080601060008282546137d79190613e39565b90915550506000818152600d602052604081205481036137f8575080613809565b506000818152600d60205260409020545b600d60006138186001866141e9565b81526020019081526020016000205460000361384d576138396001846141e9565b6000838152600d602052604090205561387d565b600d600061385c6001866141e9565b81526020808201929092526040908101600090812054858252600d90935220555b613885613c33565b50600e546138939082613e39565b935050505090565b611e97828260405180602001604052806000815250613c4f565b60006001600160a01b0384163b156139ab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906138f99033908990889088906004016149df565b6020604051808303816000875af1925050508015613934575060408051601f3d908101601f1916820190925261393191810190614a1c565b60015b613991573d808015613962576040519150601f19603f3d011682016040523d82523d6000602084013e613967565b606091505b5080516000036139895760405162461bcd60e51b8152600401610bdd9061492f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061242c565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156139ed5750600090506003613a9a565b8460ff16601b14158015613a0557508460ff16601c14155b15613a165750600090506004613a9a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613a6a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613a9357600060019250925050613a9a565b9150600090505b94509492505050565b60006001613ab084611c84565b613aba91906141e9565b600083815260076020526040902054909150808214613b0d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613b52906001906141e9565b60008381526009602052604081205460088054939450909284908110613b7a57613b7a6141d3565b906000526020600020015490508060088381548110613b9b57613b9b6141d3565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613bd357613bd3614a39565b6001900381819060005260206000200160009055905550505050565b6000613bfa83611c84565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600080613c3f600b5490565b9050610f79600b80546001019055565b613c598383613c82565b613c6660008484846138b5565b610c7e5760405162461bcd60e51b8152600401610bdd9061492f565b6001600160a01b038216613cd85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bdd565b6000818152600260205260409020546001600160a01b031615613d3d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bdd565b613d4960008383613653565b6001600160a01b0382166000908152600360205260408120805460019290613d72908490613e39565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8260038101928215613dfe579160200282015b82811115613dfe578251825591602001919060010190613de3565b50613e0a929150613e0e565b5090565b5b80821115613e0a5760008155600101613e0f565b634e487b7160e01b600052601160045260246000fd5b80820180821115610aaa57610aaa613e23565b6001600160e01b03198116811461123c57600080fd5b600060208284031215613e7457600080fd5b813561345181613e4c565b60005b83811015613e9a578181015183820152602001613e82565b50506000910152565b60008151808452613ebb816020860160208601613e7f565b601f01601f19169290920160200192915050565b6020815260006134516020830184613ea3565b600060208284031215613ef457600080fd5b5035919050565b80356001600160a01b0381168114610f7957600080fd5b60008060408385031215613f2557600080fd5b613f2e83613efb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613f6357600080fd5b813567ffffffffffffffff80821115613f7e57613f7e613f3c565b604051601f8301601f19908116603f01168101908282118183101715613fa657613fa6613f3c565b81604052838152866020858801011115613fbf57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613ff157600080fd5b813567ffffffffffffffff81111561400857600080fd5b61242c84828501613f52565b60008060006060848603121561402957600080fd5b61403284613efb565b925061404060208501613efb565b9150604084013590509250925092565b6000806040838503121561406357600080fd5b50508035926020909101359150565b60006020828403121561408457600080fd5b61345182613efb565b801515811461123c57600080fd5b600080604083850312156140ae57600080fd5b6140b783613efb565b915060208301356140c78161408d565b809150509250929050565b600080600080608085870312156140e857600080fd5b6140f185613efb565b93506140ff60208601613efb565b925060408501359150606085013567ffffffffffffffff81111561412257600080fd5b61412e87828801613f52565b91505092959194509250565b60008060006060848603121561414f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561417957600080fd5b61418283613efb565b915061419060208401613efb565b90509250929050565b600181811c908216806141ad57607f821691505b6020821081036141cd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610aaa57610aaa613e23565b634e487b7160e01b600052601260045260246000fd5b600082614221576142216141fc565b500690565b600081600019048311821515161561424057614240613e23565b500290565b600082614254576142546141fc565b500490565b6802a37b5b2b724b21d160bd1b81526000855161427d816009850160208a01613e7f565b670102632bb32b61d160c51b60099184019182015285516142a5816011840160208a01613e7f565b66010213ab9371d160cd1b6011929091019182015284516142cd816018840160208901613e7f565b710102cb7ba9030b636103130b630b731b29d160751b60189290910191820152835161430081602a840160208801613e7f565b01602a019695505050505050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526028908201527f526571756573746564206e756d626572206f6620746f6b656e73206e6f7420616040820152677661696c61626c6560c01b606082015260800190565b60208082526017908201527f5468697320616374696f6e206973206f6e207061757365000000000000000000604082015260600190565b6000816143ea576143ea613e23565b506000190190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001820161443957614439613e23565b5060010190565b7002cb7ba9030b636103130b630b731b29d1607d1b81526000825161446c816011850160208701613e7f565b9190910160110192915050565b6020808252601e908201527f596f7520616c6c2062616c616e63654e46543c302e30303031204554482e0000604082015260600190565b6020808252601390820152725472616e73616374696f6e204661696c65642160681b604082015260600190565b6020808252601b908201527f596f75206861766520746865206d6178696d756d206c6576656c2e0000000000604082015260600190565b6000815461452181614199565b60018281168015614539576001811461454e5761457d565b60ff198416875282151583028701945061457d565b8560005260208060002060005b858110156145745781548a82015290840190820161455b565b50505082870194505b5050505092915050565b60006145938287614514565b85516145a3818360208a01613e7f565b605f60f81b910190815284516145c0816001840160208901613e7f565b84519101906145d6816001840160208801613e7f565b64173539b7b760d91b600192909101918201526006019695505050505050565b60006020828403121561460857600080fd5b5051919050565b60006020828403121561462157600080fd5b81516134518161408d565b6000835161463e818460208801613e7f565b835190830190614652818360208801613e7f565b01949350505050565b6000865161466d818460208b01613e7f565b601760f91b908301908152865161468b816001840160208b01613e7f565b86519101906146a1816001840160208a01613e7f565b85519101906146b7816001840160208901613e7f565b84519101906146cd816001840160208801613e7f565b630408aa8960e31b60019290910191820152600501979650505050505050565b60006134518284614514565b601f821115610c7e57600081815260208120601f850160051c810160208610156147205750805b601f850160051c820191505b8181101561473f5782815560010161472c565b505050505050565b815167ffffffffffffffff81111561476157614761613f3c565b6147758161476f8454614199565b846146f9565b602080601f8311600181146147aa57600084156147925750858301515b600019600386901b1c1916600185901b17855561473f565b600085815260208120601f198616915b828110156147d9578886015182559484019460019091019084016147ba565b50858210156147f75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006148138285614514565b8351614823818360208801613e7f565b672f9818173539b7b760c11b9101908152600801949350505050565b600181815b8085111561487a57816000190482111561486057614860613e23565b8085161561486d57918102915b93841c9390800290614844565b509250929050565b60008261489157506001610aaa565b8161489e57506000610aaa565b81600181146148b457600281146148be576148da565b6001915050610aaa565b60ff8411156148cf576148cf613e23565b50506001821b610aaa565b5060208310610133831016604e8410600b84101617156148fd575081810a610aaa565b614907838361483f565b806000190482111561491b5761491b613e23565b029392505050565b60006134518383614882565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6bffffffffffffffffffffffff19606098891b811682529690971b9095166014870152602886019390935260488501919091526068840152608883015260a882015260c80190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a1290830184613ea3565b9695505050505050565b600060208284031215614a2e57600080fd5b815161345181613e4c565b634e487b7160e01b600052603160045260246000fdfe697066733a2f2f626166796265696863676c647573746b6977706578737966736e776d3669696a7432747a6772647471637665666d6479693461756734346c6b32342fa264697066735822122027faa2a16de9aefe6df03878ffea4484ab9187d21979ba8fa56e0a5eaec170c264736f6c63430008100033697066733a2f2f6261667962656968326f6c727074786b626a6a61796b6c767332796671633771713775747a343478786c68696673357366326179647072367269692f697066733a2f2f626166796265696773683278376e61626464756d6767626f6e6c646c6b647179626f6663676a346a76663361796e62716c6937336c646b32716d652f0000000000000000000000000000000000002734207b2c6757e49f323970a2b2
Deployed Bytecode
0x60806040526004361061039b5760003560e01c806370a08231116101dc578063c12d655311610102578063d5abeb01116100a0578063e391b3761161006f578063e391b376146109f0578063e985e9c514610a06578063f170902414610a4f578063ff61879f14610a6f57600080fd5b8063d5abeb011461099d578063db40e56f146109b2578063e14ca353146109c8578063e195385e146109dd57600080fd5b8063c87b56dd116100dc578063c87b56dd14610931578063cc200b1814610951578063d0b06f5d14610967578063d1d192131461097d57600080fd5b8063c12d6553146108d1578063c7817e1a146108f1578063c868a7501461091157600080fd5b806393a0be1e1161017a578063a440984a11610149578063a440984a14610874578063a9e7c2e514610889578063b88d4fde146108a9578063b912e7ae146108c957600080fd5b806393a0be1e1461081457806395d89b411461082a5780639f181b5e1461083f578063a22cb4651461085457600080fd5b806381ef5c8f116101b657806381ef5c8f146107b257806385fdd03e146107c857806389476069146107de57806389a3df4f146107fe57600080fd5b806370a082311461074d578063715057901461076d578063816877301461078257600080fd5b80632c3ab63b116102c15780634dbe58891161025f5780635dce691e1161022e5780635dce691e146106e45780636352211e1461070457806368f6559c146107245780636a1b6f911461073a57600080fd5b80634dbe58891461067a5780634e71d92d1461068f5780634f6ccce7146106a45780635c117d93146106c457600080fd5b806340cfd0951161029b57806340cfd0951461061057806342842e0e1461062557806344a0d68a146106455780634c7389091461066557600080fd5b80632c3ab63b146105d25780632f745c59146105e857806334c738841461060857600080fd5b80630c72e6a311610339578063153fc65511610308578063153fc6551461056357806318160ddd1461057d578063219a58231461059257806323b872dd146105b257600080fd5b80630c72e6a31461050257806311672bfb146105225780631199f27b1461053757806313faede61461054d57600080fd5b806306fdde031161037557806306fdde0314610466578063081812fc14610488578063095ea7b3146104c05780630a369303146104e257600080fd5b806301ffc9a7146103f7578063045551f41461042c57806306afd5921461045057600080fd5b366103f257604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a134601560008282546103ea9190613e39565b925050819055005b600080fd5b34801561040357600080fd5b50610417610412366004613e62565b610a85565b60405190151581526020015b60405180910390f35b34801561043857600080fd5b5061044260115481565b604051908152602001610423565b34801561045c57600080fd5b50610442601e5481565b34801561047257600080fd5b5061047b610ab0565b6040516104239190613ecf565b34801561049457600080fd5b506104a86104a3366004613ee2565b610b42565b6040516001600160a01b039091168152602001610423565b3480156104cc57600080fd5b506104e06104db366004613f12565b610b69565b005b3480156104ee57600080fd5b506104176104fd366004613fdf565b610c83565b34801561050e57600080fd5b5061044261051d366004613ee2565b610d66565b34801561052e57600080fd5b506104e0610d7d565b34801561054357600080fd5b5061044260155481565b34801561055957600080fd5b50610442601c5481565b34801561056f57600080fd5b50601b546104179060ff1681565b34801561058957600080fd5b50600854610442565b34801561059e57600080fd5b5061047b6105ad366004613ee2565b610e23565b3480156105be57600080fd5b506104e06105cd366004614014565b610f7e565b3480156105de57600080fd5b50610442601d5481565b3480156105f457600080fd5b50610442610603366004613f12565b610faf565b6104e0611045565b34801561061c57600080fd5b5061041761123f565b34801561063157600080fd5b506104e0610640366004614014565b61127b565b34801561065157600080fd5b506104e0610660366004613ee2565b611296565b34801561067157600080fd5b5061047b6112dd565b34801561068657600080fd5b506104e061146f565b34801561069b57600080fd5b506104e061172f565b3480156106b057600080fd5b506104426106bf366004613ee2565b611881565b3480156106d057600080fd5b506104426106df366004614050565b611914565b3480156106f057600080fd5b506104e06106ff366004613ee2565b61192c565b34801561071057600080fd5b506104a861071f366004613ee2565b61197d565b34801561073057600080fd5b5061044260125481565b6104e0610748366004613ee2565b6119dd565b34801561075957600080fd5b50610442610768366004614072565b611c84565b34801561077957600080fd5b506104e0611d0a565b34801561078e57600080fd5b5061041761079d366004614072565b602a6020526000908152604090205460ff1681565b3480156107be57600080fd5b5061044260225481565b3480156107d457600080fd5b5061044260235481565b3480156107ea57600080fd5b506104e06107f9366004614072565b611d60565b34801561080a57600080fd5b5061044260165481565b34801561082057600080fd5b5061044260175481565b34801561083657600080fd5b5061047b611e6d565b34801561084b57600080fd5b50610442611e7c565b34801561086057600080fd5b506104e061086f36600461409b565b611e8c565b34801561088057600080fd5b506104e0611e9b565b34801561089557600080fd5b506104e06108a4366004613ee2565b611ee7565b3480156108b557600080fd5b506104e06108c43660046140d2565b61200e565b6104e0612046565b3480156108dd57600080fd5b506104e06108ec366004613ee2565b61217f565b3480156108fd57600080fd5b506104e061090c366004613ee2565b612287565b34801561091d57600080fd5b506104e061092c36600461413a565b6122d2565b34801561093d57600080fd5b5061047b61094c366004613ee2565b612324565b34801561095d57600080fd5b5061044260195481565b34801561097357600080fd5b5061044260185481565b34801561098957600080fd5b506104e0610998366004613ee2565b612434565b3480156109a957600080fd5b50600c54610442565b3480156109be57600080fd5b5061044260135481565b3480156109d457600080fd5b50610442612473565b6104e06109eb366004613fdf565b61248a565b3480156109fc57600080fd5b5061044260145481565b348015610a1257600080fd5b50610417610a21366004614166565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a5b57600080fd5b506104e0610a6a366004614072565b612635565b348015610a7b57600080fd5b5061044260245481565b60006001600160e01b0319821663780e9d6360e01b1480610aaa5750610aaa82612668565b92915050565b606060008054610abf90614199565b80601f0160208091040260200160405190810160405280929190818152602001828054610aeb90614199565b8015610b385780601f10610b0d57610100808354040283529160200191610b38565b820191906000526020600020905b815481529060010190602001808311610b1b57829003601f168201915b5050505050905090565b6000610b4d826126b8565b506000908152600460205260409020546001600160a01b031690565b6000610b748261197d565b9050806001600160a01b0316836001600160a01b031603610be65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610c025750610c028133610a21565b610c745760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610bdd565b610c7e8383612717565b505050565b60008060268101546019546040516bffffffffffffffffffffffff19606093841b811660208301523390931b909216603483015260488201526068016040516020818303038152906040528051906020012090506000610d3a84610d34846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90612785565b6025549091506001600160a01b03808316911603610d5c575060019392505050565b5060009392505050565b601f8160038110610d7657600080fd5b0154905081565b610d8561123f565b610dd15760405162461bcd60e51b815260206004820152601e60248201527f426c61636b2064617920686173206e6f742079657420617272697665642e00006044820152606401610bdd565b601754602254601554610de491906141e9565b610dee91906141e9565b60176000828254610dff9190613e39565b90915550610e0d90506127a9565b6201869f601a54610e1e9190614212565b601a55565b60606001821080610e35575061045782115b15610e6c575050604080518082019091526016815275546f6b656e49642066726f6d203120746f203131313160501b602082015290565b60008281526029602052604090206002015460ff1615610f4757600082815260296020526040812060038101546006909101546015546064926103e8929091610eb591906141e9565b610ebf9190614226565b610ec99190614245565b610ed39190614245565b9050610ede836127bd565b600084815260296020526040902060040154610ef9906127bd565b600085815260296020526040902060050154610f14906127bd565b610f1d846128be565b604051602001610f309493929190614259565b604051602081830303815290604052915050919050565b5050604080518082019091526016815275151bdad95b9259081b9bdd081b5a5b9d1959081e595d60521b602082015290565b919050565b610f8833826129ee565b610fa45760405162461bcd60e51b8152600401610bdd9061430e565b610c7e838383612a6c565b6000610fba83611c84565b821061101c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610bdd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600180611050612473565b101561106e5760405162461bcd60e51b8152600401610bdd9061435c565b601b5460ff16156110915760405162461bcd60e51b8152600401610bdd906143a4565b6103e861109c611e7c565b106110e95760405162461bcd60e51b815260206004820152601960248201527f52656163686564207468652063757272656e74206c696d6974000000000000006044820152606401610bdd565b6013541561115d57601d543410156111435760405162461bcd60e51b815260206004820152601960248201527f5072696365206d757374206265203e3d20636f737453616c65000000000000006044820152606401610bdd565b60138054906000611153836143db565b9190505550611202565b6000601254116111a25760405162461bcd60e51b815260206004820152601060248201526f141d589b1a58d35a5b9d08195b99195960821b6044820152606401610bdd565b601c543410156111ec5760405162461bcd60e51b8152602060048201526015602482015274141c9a58d9481b5d5cdd081899480f8f4818dbdcdd605a1b6044820152606401610bdd565b601280549060006111fc836143db565b91905055505b34601560008282546112149190613e39565b9091555050336000818152602a60205260409020805460ff1916600117905561123c90612c13565b50565b600061016d6018603c806018544261125791906141e9565b6112619190614245565b61126b9190614245565b6112759190614245565b11905090565b610c7e8383836040518060200160405280600081525061200e565b6025546001600160a01b031633146112c05760405162461bcd60e51b8152600401610bdd906143f2565b601c819055601a80549060006112d583614427565b919050555050565b606060006112ea33611c84565b116113315760405162461bcd60e51b81526020600482015260176024820152762cb7ba903237b713ba103430bb32903a34329027232a1760491b6044820152606401610bdd565b600061133c33611c84565b905060008080805b8481101561143d576113563382610faf565b925061136183612d70565b915060646103e883602960008781526020019081526020016000206006015460155461138d91906141e9565b6113979190614226565b6113a19190614245565b6113ab9190614245565b6113b59085613e39565b600084815260296020526040902060070154601654919550610457916113db91906141e9565b6113e59190614245565b6113ef9085613e39565b6000848152602960205260409020600801546017549195506104579161141591906141e9565b61141f9190614245565b6114299085613e39565b93508061143581614427565b915050611344565b50611447836128be565b6040516020016114579190614440565b60405160208183030381529060405294505050505090565b6025546001600160a01b031633146114995760405162461bcd60e51b8152600401610bdd906143f2565b60006023546017546114ab91906141e9565b6022546015546114bb91906141e9565b6114c591906141e9565b905060006114d9655af3107a400083614245565b116114f65760405162461bcd60e51b8152600401610bdd90614479565b6114fe6127a9565b6025546000906001600160a01b0316606461151f655af3107a400085614245565b61152a906032614226565b6115349190614245565b61154490655af3107a4000614226565b604051600081818185875af1925050503d8060008114611580576040519150601f19603f3d011682016040523d82523d6000602084013e611585565b606091505b50509050806115a65760405162461bcd60e51b8152600401610bdd906144b0565b6024546016546115b691906141e9565b6023546017546115c691906141e9565b6022546015546115d691906141e9565b6115e091906141e9565b6115ea91906141e9565b91508115611705576027546001600160a01b03166064611610655af3107a400085614245565b61161b90600a614226565b6116259190614245565b61163590655af3107a4000614226565b604051600081818185875af1925050503d8060008114611671576040519150601f19603f3d011682016040523d82523d6000602084013e611676565b606091505b50506028549091506001600160a01b03166064611699655af3107a400085614245565b6116a490600a614226565b6116ae9190614245565b6116be90655af3107a4000614226565b604051600081818185875af1925050503d80600081146116fa576040519150601f19603f3d011682016040523d82523d6000602084013e6116ff565b606091505b50909150505b601754602355601654602455601554602255601a54611728906201869f90614212565b601a555050565b600061173a33611c84565b116117815760405162461bcd60e51b81526020600482015260176024820152762cb7ba903237b713ba103430bb32903a34329027232a1760491b6044820152606401610bdd565b60008061178d33611c84565b90506000805b828110156117ce576117a53382610faf565b93506117b084612e7c565b6117ba9083613e39565b9150806117c681614427565b915050611793565b5060006117e1655af3107a400083614245565b116117fe5760405162461bcd60e51b8152600401610bdd90614479565b604051600090339083908381818185875af1925050503d8060008114611840576040519150601f19603f3d011682016040523d82523d6000602084013e611845565b606091505b50509050806118665760405162461bcd60e51b8152600401610bdd906144b0565b601a805490600061187683614427565b919050555050505050565b600061188c60085490565b82106118ef5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610bdd565b60088281548110611902576119026141d3565b90600052602060002001549050919050565b600081831115611925575080610aaa565b5090919050565b6025546001600160a01b031633146119565760405162461bcd60e51b8152600401610bdd906143f2565b80601660008282546119689190613e39565b9091555050601a80549060006112d583614427565b6000818152600260205260408120546001600160a01b031680610aaa5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bdd565b6119e68161197d565b6001600160a01b0316336001600160a01b031614611a465760405162461bcd60e51b815260206004820152601f60248201527f596f7520617265206e6f7420746865206f776e6572206f6620746f6b656e2e006044820152606401610bdd565b600081815260296020526040902060040154600311611a775760405162461bcd60e51b8152600401610bdd906144dd565b6000818152602960205260408120600401549003611ae657601f54341015611ae15760405162461bcd60e51b815260206004820152601a60248201527f546f206c6576656c2075702050726963654c6576656c735b305d0000000000006044820152606401610bdd565b611ba3565b600081815260296020526040902060040154600103611b5157602054341015611ae15760405162461bcd60e51b815260206004820152601a60248201527f546f206c6576656c2075702050726963654c6576656c735b315d0000000000006044820152606401610bdd565b602154341015611ba35760405162461bcd60e51b815260206004820152601a60248201527f546f206c6576656c2075702050726963654c6576656c735b325d0000000000006044820152606401610bdd565b600081815260296020526040902060040154611bc990611bc4816001613e39565b612f88565b6000818152602960205260408120600401805491611be683614427565b909155505060008181526029602052604090206001810154611c6a918391611c0d906127bd565b600085815260296020526040902060040154611c28906127bd565b600086815260296020526040902060050154611c43906127bd565b604051602001611c569493929190614587565b604051602081830303815290604052613015565b3460156000828254611c7c9190613e39565b909155505050565b60006001600160a01b038216611cee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610bdd565b506001600160a01b031660009081526003602052604090205490565b6025546001600160a01b03163314611d345760405162461bcd60e51b8152600401610bdd906143f2565b60198054906000611d4483614427565b9091555050601a8054906000611d5983614427565b9190505550565b6025546001600160a01b03163314611d8a5760405162461bcd60e51b8152600401610bdd906143f2565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe91906145f6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e919061460f565b606060018054610abf90614199565b6000611e87600b5490565b905090565b611e973383836130a8565b5050565b6025546001600160a01b03163314611ec55760405162461bcd60e51b8152600401610bdd906143f2565b601b805460ff19811660ff90911615179055601a8054906000611d5983614427565b611ef08161197d565b6001600160a01b0316336001600160a01b031614611f505760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746865206f776e6572206f66207468697320746f6b656e2e000000006044820152606401610bdd565b6000611f5b82612e7c565b90506000611f6f655af3107a400083614245565b11611f8c5760405162461bcd60e51b8152600401610bdd90614479565b604051600090339083908381818185875af1925050503d8060008114611fce576040519150601f19603f3d011682016040523d82523d6000602084013e611fd3565b606091505b5050905080611ff45760405162461bcd60e51b8152600401610bdd906144b0565b601a805490600061200483614427565b9190505550505050565b61201833836129ee565b6120345760405162461bcd60e51b8152600401610bdd9061430e565b61204084848484613176565b50505050565b600180612051612473565b101561206f5760405162461bcd60e51b8152600401610bdd9061435c565b601b5460ff16156120925760405162461bcd60e51b8152600401610bdd906143a4565b66d529ae9e8600003410156120da5760405162461bcd60e51b815260206004820152600e60248201526d26b4b710383934b1b2901817181b60911b6044820152606401610bdd565b60006011541161211d5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d131d58dac8195b99195960921b6044820152606401610bdd565b6103e761212e6127066103096131a9565b10156121535761213d33612c13565b6011805490600061214d836143db565b91905055505b6001601a60008282546121669190613e39565b925050819055503460156000828254611c7c9190613e39565b6121888161197d565b6001600160a01b0316336001600160a01b0316146121e85760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746865206f776e6572206f66207468697320746f6b656e2e000000006044820152606401610bdd565b6000818152602960205260409020600401546003116122195760405162461bcd60e51b8152600401610bdd906144dd565b600081815260296020526040812060040154900361223d5761123c8161176a6131ef565b6000818152602960205260409020600401546001036122625761123c81610bb56131ef565b60008181526029602052604090206004015460020361123c5761123c816103e76131ef565b6025546001600160a01b031633146122b15760405162461bcd60e51b8152600401610bdd906143f2565b806012546122bf9190613e39565b601255601a80549060006112d583614427565b6025546001600160a01b031633146122fc5760405162461bcd60e51b8152600401610bdd906143f2565b604080516060810182528481526020810184905290810182905261204090601f906003613dd0565b606061232f826126b8565b6000828152600a60205260408120805461234890614199565b80601f016020809104026020016040519081016040528092919081815260200182805461237490614199565b80156123c15780601f10612396576101008083540402835291602001916123c1565b820191906000526020600020905b8154815290600101906020018083116123a457829003601f168201915b5050505050905060006123df60408051602081019091526000815290565b905080516000036123f1575092915050565b81511561242357808260405160200161240b92919061462c565b60405160208183030381529060405292505050919050565b61242c846133f4565b949350505050565b6025546001600160a01b0316331461245e5760405162461bcd60e51b8152600401610bdd906143f2565b601e819055601a80549060006112d583614427565b600061247d611e7c565b600c54611e8791906141e9565b600180612495612473565b10156124b35760405162461bcd60e51b8152600401610bdd9061435c565b601b5460ff16156124d65760405162461bcd60e51b8152600401610bdd906143a4565b6124df82610c83565b15156001146125305760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f74206f6e20746865207768697465206c6973740000006044820152606401610bdd565b336000908152602a602052604090205460ff16156125905760405162461bcd60e51b815260206004820152601c60248201527f596f75206861766520616c7265616479206265656e206d696e746564000000006044820152606401610bdd565b601e543410156125e25760405162461bcd60e51b815260206004820152601760248201527f5072696365206d757374206265203e3d20636f7374574c0000000000000000006044820152606401610bdd565b6125eb33612c13565b336000908152602a60205260408120805460ff1916600117905560158054349290612617908490613e39565b9091555050601a805490600061262c83614427565b91905055505050565b6025546001600160a01b0316331461265f5760405162461bcd60e51b8152600401610bdd906143f2565b61123c81612c13565b60006001600160e01b031982166380ac58cd60e01b148061269957506001600160e01b03198216635b5e139f60e01b145b80610aaa57506301ffc9a760e01b6001600160e01b0319831614610aaa565b6000818152600260205260409020546001600160a01b031661123c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610bdd565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061274c8261197d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008060006127948585613458565b915091506127a18161349d565b509392505050565b42601855601a8054906000611d5983614427565b6060816000036127e45750506040805180820190915260018152600360fc1b602082015290565b8160005b811561280e57806127f881614427565b91506128079050600a83614245565b91506127e8565b60008167ffffffffffffffff81111561282957612829613f3c565b6040519080825280601f01601f191660200182016040528015612853576020820181803683370190505b5090505b841561242c576128686001836141e9565b9150612875600a86614212565b612880906030613e39565b60f81b818381518110612895576128956141d3565b60200101906001600160f81b031916908160001a9053506128b7600a86614245565b9450612857565b606060006128dc6128d7670de0b6b3a764000085614245565b6127bd565b9050600061291c6128f5670de0b6b3a764000086614245565b61290090600a614226565b61291267016345785d8a000087614245565b6128d791906141e9565b9050600061295161293567016345785d8a000087614245565b61294090600a614226565b612912662386f26fc1000088614245565b90506000612985612969662386f26fc1000088614245565b61297490600a614226565b61291266038d7ea4c6800089614245565b905060006129b861299d66038d7ea4c6800089614245565b6129a890600a614226565b612912655af3107a40008a614245565b905084848484846040516020016129d395949392919061465b565b60405160208183030381529060405295505050505050919050565b6000806129fa8361197d565b9050806001600160a01b0316846001600160a01b03161480612a4157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061242c5750836001600160a01b0316612a5a84610b42565b6001600160a01b031614949350505050565b826001600160a01b0316612a7f8261197d565b6001600160a01b031614612ae35760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610bdd565b6001600160a01b038216612b455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bdd565b612b50838383613653565b612b5b600082612717565b6001600160a01b0383166000908152600360205260408120805460019290612b849084906141e9565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bb2908490613e39565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612c1d61370b565b9050612c29828261389b565b60008181526029602090815260409182902091517fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47092612c6b929091016146ed565b6040516020818303038152906040528051906020012003612cf457600a6029600083815260200190815260200160002060030181905550604051806080016040528060438152602001614a5060439139600082815260296020526040902090612cd49082614747565b506000818152602960205260409020600181018290556015546006909101555b600081815260296020526040812060028101805460ff19166001179055600301546014805491929091612d28908490613e39565b909155505060008181526029602052604090206001810154612d60918391612d4f906127bd565b604051602001611c56929190614807565b601a805490600061262c83614427565b6000818152602960205260408120600401548190819015612dc257600084815260296020526040902060040154612da9906001906141e9565b612db490600a614923565b612dbf906003614226565b90505b600084815260296020526040902060058101546003909101548291612de691613e39565b612df09190613e39565b6000858152602960205260409020600301549092508290600a148015612e1957506161a8601454115b8015612e255750600d81115b15612e695761386b601454612e3a91906141e9565b612e45600d836141e9565b612e519061293d614226565b612e5b9190614245565b612e6690600d613e39565b90505b612e738382611914565b95945050505050565b6000806000612e8a84612d70565b915060646103e8836029600088815260200190815260200160002060060154601554612eb691906141e9565b612ec09190614226565b612eca9190614245565b612ed49190614245565b612ede9082613e39565b60008581526029602052604090206007015460165491925061045791612f0491906141e9565b612f0e9190614245565b612f189082613e39565b60008581526029602052604090206008015460175491925061045791612f3e91906141e9565b612f489190614245565b612f529082613e39565b60155460009586526029602052604090952060068101959095556016546007860155601754600890950194909455509192915050565b6000808215612fb557612f9c6001846141e9565b612fa790600a614923565b612fb2906003614226565b91505b8315612fdf57612fc66001856141e9565b612fd190600a614923565b612fdc906003614226565b90505b8160146000828254612ff19190613e39565b92505081905550806014600082825461300a91906141e9565b909155505050505050565b6000828152600260205260409020546001600160a01b03166130905760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610bdd565b6000828152600a60205260409020610c7e8282614747565b816001600160a01b0316836001600160a01b0316036131095760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bdd565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613181848484612a6c565b61318d848484846138b5565b6120405760405162461bcd60e51b8152600401610bdd9061492f565b60008083334144454288601a546040516020016131cc9796959493929190614981565b6040516020818303038152906040528051906020012060001c61242c9190614212565b601a80549060006131ff83614427565b919050555061320d8261197d565b6001600160a01b0316336001600160a01b03161461326d5760405162461bcd60e51b815260206004820152601f60248201527f596f7520617265206e6f7420746865206f776e6572206f6620746f6b656e2e006044820152606401610bdd565b60008281526029602052604090206004015460031161329e5760405162461bcd60e51b8152600401610bdd906144dd565b806132ad6127066103096131a9565b101561330d576000828152602960205260409020600401546132d490611bc4816001613e39565b60008281526029602052604081206004018054916132f183614427565b909155505060008281526029602052604081206005015561339c565b613326336026600001546001600160a01b031684610f7e565b6000828152602960205260409020600590810154101561336757600082815260296020526040812060050180549161335d83614427565b919050555061339c565b60008281526029602052604081206004015461338291612f88565b600082815260296020526040812060048101829055600501555b60008281526029602052604090206001810154611e979184916133be906127bd565b6000868152602960205260409020600401546133d9906127bd565b600087815260296020526040902060050154611c43906127bd565b60606133ff826126b8565b600061341660408051602081019091526000815290565b905060008151116134365760405180602001604052806000815250613451565b80613440846127bd565b604051602001610f3092919061462c565b9392505050565b600080825160410361348e5760208301516040840151606085015160001a613482878285856139b6565b94509450505050613496565b506000905060025b9250929050565b60008160048111156134b1576134b16149c9565b036134b95750565b60018160048111156134cd576134cd6149c9565b0361351a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bdd565b600281600481111561352e5761352e6149c9565b0361357b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bdd565b600381600481111561358f5761358f6149c9565b036135e75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bdd565b60048160048111156135fb576135fb6149c9565b0361123c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bdd565b6001600160a01b0383166136ae576136a981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6136d1565b816001600160a01b0316836001600160a01b0316146136d1576136d18382613aa3565b6001600160a01b0382166136e857610c7e81613b40565b826001600160a01b0316826001600160a01b031614610c7e57610c7e8282613bef565b600080613716612473565b116137635760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c6500000000000000006044820152606401610bdd565b600061376d611e7c565b600c5461377a91906141e9565b90506000813341444542600f546010546040516020016137a09796959493929190614981565b6040516020818303038152906040528051906020012060001c6137c39190614212565b905080601060008282546137d79190613e39565b90915550506000818152600d602052604081205481036137f8575080613809565b506000818152600d60205260409020545b600d60006138186001866141e9565b81526020019081526020016000205460000361384d576138396001846141e9565b6000838152600d602052604090205561387d565b600d600061385c6001866141e9565b81526020808201929092526040908101600090812054858252600d90935220555b613885613c33565b50600e546138939082613e39565b935050505090565b611e97828260405180602001604052806000815250613c4f565b60006001600160a01b0384163b156139ab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906138f99033908990889088906004016149df565b6020604051808303816000875af1925050508015613934575060408051601f3d908101601f1916820190925261393191810190614a1c565b60015b613991573d808015613962576040519150601f19603f3d011682016040523d82523d6000602084013e613967565b606091505b5080516000036139895760405162461bcd60e51b8152600401610bdd9061492f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061242c565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156139ed5750600090506003613a9a565b8460ff16601b14158015613a0557508460ff16601c14155b15613a165750600090506004613a9a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613a6a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613a9357600060019250925050613a9a565b9150600090505b94509492505050565b60006001613ab084611c84565b613aba91906141e9565b600083815260076020526040902054909150808214613b0d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613b52906001906141e9565b60008381526009602052604081205460088054939450909284908110613b7a57613b7a6141d3565b906000526020600020015490508060088381548110613b9b57613b9b6141d3565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613bd357613bd3614a39565b6001900381819060005260206000200160009055905550505050565b6000613bfa83611c84565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600080613c3f600b5490565b9050610f79600b80546001019055565b613c598383613c82565b613c6660008484846138b5565b610c7e5760405162461bcd60e51b8152600401610bdd9061492f565b6001600160a01b038216613cd85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bdd565b6000818152600260205260409020546001600160a01b031615613d3d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bdd565b613d4960008383613653565b6001600160a01b0382166000908152600360205260408120805460019290613d72908490613e39565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8260038101928215613dfe579160200282015b82811115613dfe578251825591602001919060010190613de3565b50613e0a929150613e0e565b5090565b5b80821115613e0a5760008155600101613e0f565b634e487b7160e01b600052601160045260246000fd5b80820180821115610aaa57610aaa613e23565b6001600160e01b03198116811461123c57600080fd5b600060208284031215613e7457600080fd5b813561345181613e4c565b60005b83811015613e9a578181015183820152602001613e82565b50506000910152565b60008151808452613ebb816020860160208601613e7f565b601f01601f19169290920160200192915050565b6020815260006134516020830184613ea3565b600060208284031215613ef457600080fd5b5035919050565b80356001600160a01b0381168114610f7957600080fd5b60008060408385031215613f2557600080fd5b613f2e83613efb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613f6357600080fd5b813567ffffffffffffffff80821115613f7e57613f7e613f3c565b604051601f8301601f19908116603f01168101908282118183101715613fa657613fa6613f3c565b81604052838152866020858801011115613fbf57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613ff157600080fd5b813567ffffffffffffffff81111561400857600080fd5b61242c84828501613f52565b60008060006060848603121561402957600080fd5b61403284613efb565b925061404060208501613efb565b9150604084013590509250925092565b6000806040838503121561406357600080fd5b50508035926020909101359150565b60006020828403121561408457600080fd5b61345182613efb565b801515811461123c57600080fd5b600080604083850312156140ae57600080fd5b6140b783613efb565b915060208301356140c78161408d565b809150509250929050565b600080600080608085870312156140e857600080fd5b6140f185613efb565b93506140ff60208601613efb565b925060408501359150606085013567ffffffffffffffff81111561412257600080fd5b61412e87828801613f52565b91505092959194509250565b60008060006060848603121561414f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561417957600080fd5b61418283613efb565b915061419060208401613efb565b90509250929050565b600181811c908216806141ad57607f821691505b6020821081036141cd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610aaa57610aaa613e23565b634e487b7160e01b600052601260045260246000fd5b600082614221576142216141fc565b500690565b600081600019048311821515161561424057614240613e23565b500290565b600082614254576142546141fc565b500490565b6802a37b5b2b724b21d160bd1b81526000855161427d816009850160208a01613e7f565b670102632bb32b61d160c51b60099184019182015285516142a5816011840160208a01613e7f565b66010213ab9371d160cd1b6011929091019182015284516142cd816018840160208901613e7f565b710102cb7ba9030b636103130b630b731b29d160751b60189290910191820152835161430081602a840160208801613e7f565b01602a019695505050505050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526028908201527f526571756573746564206e756d626572206f6620746f6b656e73206e6f7420616040820152677661696c61626c6560c01b606082015260800190565b60208082526017908201527f5468697320616374696f6e206973206f6e207061757365000000000000000000604082015260600190565b6000816143ea576143ea613e23565b506000190190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001820161443957614439613e23565b5060010190565b7002cb7ba9030b636103130b630b731b29d1607d1b81526000825161446c816011850160208701613e7f565b9190910160110192915050565b6020808252601e908201527f596f7520616c6c2062616c616e63654e46543c302e30303031204554482e0000604082015260600190565b6020808252601390820152725472616e73616374696f6e204661696c65642160681b604082015260600190565b6020808252601b908201527f596f75206861766520746865206d6178696d756d206c6576656c2e0000000000604082015260600190565b6000815461452181614199565b60018281168015614539576001811461454e5761457d565b60ff198416875282151583028701945061457d565b8560005260208060002060005b858110156145745781548a82015290840190820161455b565b50505082870194505b5050505092915050565b60006145938287614514565b85516145a3818360208a01613e7f565b605f60f81b910190815284516145c0816001840160208901613e7f565b84519101906145d6816001840160208801613e7f565b64173539b7b760d91b600192909101918201526006019695505050505050565b60006020828403121561460857600080fd5b5051919050565b60006020828403121561462157600080fd5b81516134518161408d565b6000835161463e818460208801613e7f565b835190830190614652818360208801613e7f565b01949350505050565b6000865161466d818460208b01613e7f565b601760f91b908301908152865161468b816001840160208b01613e7f565b86519101906146a1816001840160208a01613e7f565b85519101906146b7816001840160208901613e7f565b84519101906146cd816001840160208801613e7f565b630408aa8960e31b60019290910191820152600501979650505050505050565b60006134518284614514565b601f821115610c7e57600081815260208120601f850160051c810160208610156147205750805b601f850160051c820191505b8181101561473f5782815560010161472c565b505050505050565b815167ffffffffffffffff81111561476157614761613f3c565b6147758161476f8454614199565b846146f9565b602080601f8311600181146147aa57600084156147925750858301515b600019600386901b1c1916600185901b17855561473f565b600085815260208120601f198616915b828110156147d9578886015182559484019460019091019084016147ba565b50858210156147f75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006148138285614514565b8351614823818360208801613e7f565b672f9818173539b7b760c11b9101908152600801949350505050565b600181815b8085111561487a57816000190482111561486057614860613e23565b8085161561486d57918102915b93841c9390800290614844565b509250929050565b60008261489157506001610aaa565b8161489e57506000610aaa565b81600181146148b457600281146148be576148da565b6001915050610aaa565b60ff8411156148cf576148cf613e23565b50506001821b610aaa565b5060208310610133831016604e8410600b84101617156148fd575081810a610aaa565b614907838361483f565b806000190482111561491b5761491b613e23565b029392505050565b60006134518383614882565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6bffffffffffffffffffffffff19606098891b811682529690971b9095166014870152602886019390935260488501919091526068840152608883015260a882015260c80190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a1290830184613ea3565b9695505050505050565b600060208284031215614a2e57600080fd5b815161345181613e4c565b634e487b7160e01b600052603160045260246000fdfe697066733a2f2f626166796265696863676c647573746b6977706578737966736e776d3669696a7432747a6772647471637665666d6479693461756734346c6b32342fa264697066735822122027faa2a16de9aefe6df03878ffea4484ab9187d21979ba8fa56e0a5eaec170c264736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000002734207b2c6757e49f323970a2b2
-----Decoded View---------------
Arg [0] : _startNoice (uint256): 795143891421037460978265291268786
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000002734207b2c6757e49f323970a2b2
Deployed Bytecode Sourcemap
63861:16311:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67706:31;;;67715:10;188:51:1;;67727:9:0;270:2:1;255:18;;248:34;67706:31:0;;161:18:1;67706:31:0;;;;;;;67762:9;67748:10;;:23;;;;;;;:::i;:::-;;;;;;;;63861:16311;;;;55526:224;;;;;;;;;;-1:-1:-1;55526:224:0;;;;;:::i;:::-;;:::i;:::-;;;1106:14:1;;1099:22;1081:41;;1069:2;1054:18;55526:224:0;;;;;;;;63960:27;;;;;;;;;;;;;;;;;;;1279:25:1;;;1267:2;1252:18;63960:27:0;1133:177:1;64379:28:0;;;;;;;;;;;;;;;;42260:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43773:171::-;;;;;;;;;;-1:-1:-1;43773:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2420:32:1;;;2402:51;;2390:2;2375:18;43773:171:0;2256:203:1;43290:417:0;;;;;;;;;;-1:-1:-1;43290:417:0;;;;;:::i;:::-;;:::i;:::-;;79490:461;;;;;;;;;;-1:-1:-1;79490:461:0;;;;;:::i;:::-;;:::i;64414:59::-;;;;;;;;;;-1:-1:-1;64414:59:0;;;;;:::i;:::-;;:::i;79106:242::-;;;;;;;;;;;;;:::i;64094:22::-;;;;;;;;;;;;;;;;64304:28;;;;;;;;;;;;;;;;64270:27;;;;;;;;;;-1:-1:-1;64270:27:0;;;;;;;;56166:113;;;;;;;;;;-1:-1:-1;56254:10:0;:17;56166:113;;74303:787;;;;;;;;;;-1:-1:-1;74303:787:0;;;;;:::i;:::-;;:::i;44473:336::-;;;;;;;;;;-1:-1:-1;44473:336:0;;;;;:::i;:::-;;:::i;64339:33::-;;;;;;;;;;;;;;;;55834:256;;;;;;;;;;-1:-1:-1;55834:256:0;;;;;:::i;:::-;;:::i;69854:565::-;;;:::i;78978:120::-;;;;;;;;;;;;;:::i;44880:185::-;;;;;;;;;;-1:-1:-1;44880:185:0;;;;;:::i;:::-;;:::i;69519:106::-;;;;;;;;;;-1:-1:-1;69519:106:0;;;;;:::i;:::-;;:::i;75098:780::-;;;;;;;;;;;;;:::i;78087:883::-;;;;;;;;;;;;;:::i;77085:600::-;;;;;;;;;;;;;:::i;56356:233::-;;;;;;;;;;-1:-1:-1;56356:233:0;;;;;:::i;:::-;;:::i;65508:140::-;;;;;;;;;;-1:-1:-1;65508:140:0;;;;;:::i;:::-;;:::i;79356:126::-;;;;;;;;;;-1:-1:-1;79356:126:0;;;;;:::i;:::-;;:::i;41971:222::-;;;;;;;;;;-1:-1:-1;41971:222:0;;;;;:::i;:::-;;:::i;63994:29::-;;;;;;;;;;;;;;;;70667:962;;;;;;:::i;:::-;;:::i;41702:207::-;;;;;;;;;;-1:-1:-1;41702:207:0;;;;;:::i;:::-;;:::i;69753:93::-;;;;;;;;;;;;;:::i;64742:43::-;;;;;;;;;;-1:-1:-1;64742:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;64480:23;;;;;;;;;;;;;;;;64510:28;;;;;;;;;;;;;;;;79959:208;;;;;;;;;;-1:-1:-1;79959:208:0;;;;;:::i;:::-;;:::i;64123:23::-;;;;;;;;;;;;;;;;64153;;;;;;;;;;;;;;;;42429:104;;;;;;;;;;;;;:::i;2562:99::-;;;;;;;;;;;;;:::i;44016:155::-;;;;;;;;;;-1:-1:-1;44016:155:0;;;;;:::i;:::-;;:::i;65393:107::-;;;;;;;;;;;;;:::i;77693:386::-;;;;;;;;;;-1:-1:-1;77693:386:0;;;;;:::i;:::-;;:::i;45136:323::-;;;;;;;;;;-1:-1:-1;45136:323:0;;;;;:::i;:::-;;:::i;68537:370::-;;;:::i;73085:522::-;;;;;;;;;;-1:-1:-1;73085:522:0;;;;;:::i;:::-;;:::i;69385:126::-;;;;;;;;;;-1:-1:-1;69385:126:0;;;;;:::i;:::-;;:::i;70523:136::-;;;;;;;;;;-1:-1:-1;70523:136:0;;;;;:::i;:::-;;:::i;62239:624::-;;;;;;;;;;-1:-1:-1;62239:624:0;;;;;:::i;:::-;;:::i;64213:19::-;;;;;;;;;;;;;;;;64183:23;;;;;;;;;;;;;;;;69631:114;;;;;;;;;;-1:-1:-1;69631:114:0;;;;;:::i;:::-;;:::i;2374:97::-;;;;;;;;;;-1:-1:-1;2451:12:0;;2374:97;;64030:27;;;;;;;;;;;;;;;;2767:113;;;;;;;;;;;;;:::i;68915:464::-;;;;;;:::i;:::-;;:::i;64064:23::-;;;;;;;;;;;;;;;;44242:164;;;;;;;;;;-1:-1:-1;44242:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44363:25:0;;;44339:4;44363:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44242:164;70427:88;;;;;;;;;;-1:-1:-1;70427:88:0;;;;;:::i;:::-;;:::i;64545:28::-;;;;;;;;;;;;;;;;55526:224;55628:4;-1:-1:-1;;;;;;55652:50:0;;-1:-1:-1;;;55652:50:0;;:90;;;55706:36;55730:11;55706:23;:36::i;:::-;55645:97;55526:224;-1:-1:-1;;55526:224:0:o;42260:100::-;42314:13;42347:5;42340:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42260:100;:::o;43773:171::-;43849:7;43869:23;43884:7;43869:14;:23::i;:::-;-1:-1:-1;43912:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43912:24:0;;43773:171::o;43290:417::-;43371:13;43387:23;43402:7;43387:14;:23::i;:::-;43371:39;;43435:5;-1:-1:-1;;;;;43429:11:0;:2;-1:-1:-1;;;;;43429:11:0;;43421:57;;;;-1:-1:-1;;;43421:57:0;;7016:2:1;43421:57:0;;;6998:21:1;7055:2;7035:18;;;7028:30;7094:34;7074:18;;;7067:62;-1:-1:-1;;;7145:18:1;;;7138:31;7186:19;;43421:57:0;;;;;;;;;18593:10;-1:-1:-1;;;;;43513:21:0;;;;:62;;-1:-1:-1;43538:37:0;43555:5;18593:10;44242:164;:::i;43538:37::-;43491:174;;;;-1:-1:-1;;;43491:174:0;;7418:2:1;43491:174:0;;;7400:21:1;7457:2;7437:18;;;7430:30;7496:34;7476:18;;;7469:62;7567:32;7547:18;;;7540:60;7617:19;;43491:174:0;7216:426:1;43491:174:0;43678:21;43687:2;43691:7;43678:8;:21::i;:::-;43360:347;43290:417;;:::o;79490:461::-;79572:4;;79657:6;79572:4;79657:9;;79679:7;;79640:47;;-1:-1:-1;;8034:2:1;8030:15;;;;;79640:47:0;;;8014:37:1;79668:10:0;8085:15:1;;;8081:24;;;8067:12;;;8060:46;8122:12;;;8115:28;8159:12;;79640:47:0;;;;;;;;;;;;79616:82;;;;;;79594:104;;79709:14;79726:80;79785:10;79726:36;:11;16721:58;;24263:66:1;16721:58:0;;;24251:79:1;24346:12;;;24339:28;;;16588:7:0;;24383:12:1;;16721:58:0;;;;;;;;;;;;16711:69;;;;;;16704:76;;16519:269;;;;79726:36;:44;;:80::i;:::-;79823:5;;79709:97;;-1:-1:-1;;;;;;79823:15:0;;;:5;;:15;79819:116;;-1:-1:-1;79863:4:0;;79490:461;-1:-1:-1;;;79490:461:0:o;79819:116::-;-1:-1:-1;79917:5:0;;79490:461;-1:-1:-1;;;79490:461:0:o;64414:59::-;;;;;;;;;;;;;;;-1:-1:-1;64414:59:0;:::o;79106:242::-;79157:13;:11;:13::i;:::-;79149:56;;;;-1:-1:-1;;;79149:56:0;;8384:2:1;79149:56:0;;;8366:21:1;8423:2;8403:18;;;8396:30;8462:32;8442:18;;;8435:60;8512:18;;79149:56:0;8182:354:1;79149:56:0;79258:11;;79244;;79231:10;;:24;;;;:::i;:::-;:38;;;;:::i;:::-;79216:11;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;79280:18:0;;-1:-1:-1;79280:16:0;:18::i;:::-;79335:5;79323:11;;:17;;;;:::i;:::-;79309:11;:31;79106:242::o;74303:787::-;74361:13;74400:1;74390:7;:11;:29;;;;74415:4;74405:7;:14;74390:29;74386:697;;;-1:-1:-1;;74435:31:0;;;;;;;;;;;;-1:-1:-1;;;74435:31:0;;;;;74303:787::o;74386:697::-;74511:17;;;;:8;:17;;;;;:22;;;;;74507:565;;;74553:17;74617;;;:8;:17;;;;;:29;;;;74585:30;;;;;74574:10;;74652:3;;74647:4;;74617:29;;74574:41;;74585:30;74574:41;:::i;:::-;74573:73;;;;:::i;:::-;:78;;;;:::i;:::-;:82;;;;:::i;:::-;74553:102;;74718:25;74735:7;74718:16;:25::i;:::-;74796:17;;;;:8;:17;;;;;:23;;;74779:41;;:16;:41::i;:::-;74872:17;;;;:8;:17;;;;;:22;;;74855:40;;:16;:40::i;:::-;74941:29;74957:12;74941:15;:29::i;:::-;74688:283;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74674:298;;;74303:787;;;:::o;74507:565::-;-1:-1:-1;;75025:31:0;;;;;;;;;;;;-1:-1:-1;;;75025:31:0;;;;;74303:787::o;74507:565::-;74303:787;;;:::o;44473:336::-;44668:41;18593:10;44701:7;44668:18;:41::i;:::-;44660:100;;;;-1:-1:-1;;;44660:100:0;;;;;;;:::i;:::-;44773:28;44783:4;44789:2;44793:7;44773:9;:28::i;55834:256::-;55931:7;55967:23;55984:5;55967:16;:23::i;:::-;55959:5;:31;55951:87;;;;-1:-1:-1;;;55951:87:0;;11335:2:1;55951:87:0;;;11317:21:1;11374:2;11354:18;;;11347:30;11413:34;11393:18;;;11386:62;-1:-1:-1;;;11464:18:1;;;11457:41;11515:19;;55951:87:0;11133:407:1;55951:87:0;-1:-1:-1;;;;;;56056:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;55834:256::o;69854:565::-;69909:1;3583:6;3558:21;:19;:21::i;:::-;:31;;3550:84;;;;-1:-1:-1;;;3550:84:0;;;;;;;:::i;:::-;65320:8:::1;::::0;::::1;;:17;65312:53;;;;-1:-1:-1::0;;;65312:53:0::1;;;;;;;:::i;:::-;69950:4:::2;69937:12;:10;:12::i;:::-;:17;69929:55;;;::::0;-1:-1:-1;;;69929:55:0;;12508:2:1;69929:55:0::2;::::0;::::2;12490:21:1::0;12547:2;12527:18;;;12520:30;12586:27;12566:18;;;12559:55;12631:18;;69929:55:0::2;12306:349:1::0;69929:55:0::2;70000:9;::::0;:12;69997:306:::2;;70050:8;;70037:9;:21;;70029:59;;;::::0;-1:-1:-1;;;70029:59:0;;12862:2:1;70029:59:0::2;::::0;::::2;12844:21:1::0;12901:2;12881:18;;;12874:30;12940:27;12920:18;;;12913:55;12985:18;;70029:59:0::2;12660:349:1::0;70029:59:0::2;70103:9;:11:::0;;;:9:::2;:11;::::0;::::2;:::i;:::-;;;;;;69997:306;;;70175:1;70163:11;;:13;70155:42;;;::::0;-1:-1:-1;;;70155:42:0;;13357:2:1;70155:42:0::2;::::0;::::2;13339:21:1::0;13396:2;13376:18;;;13369:30;-1:-1:-1;;;13415:18:1;;;13408:46;13471:18;;70155:42:0::2;13155:340:1::0;70155:42:0::2;70233:4;;70220:9;:17;;70212:51;;;::::0;-1:-1:-1;;;70212:51:0;;13702:2:1;70212:51:0::2;::::0;::::2;13684:21:1::0;13741:2;13721:18;;;13714:30;-1:-1:-1;;;13760:18:1;;;13753:51;13821:18;;70212:51:0::2;13500:345:1::0;70212:51:0::2;70278:11;:13:::0;;;:11:::2;:13;::::0;::::2;:::i;:::-;;;;;;69997:306;70327:9;70313:10;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;70358:10:0::2;70347:22;::::0;;;:10:::2;:22;::::0;;;;:29;;-1:-1:-1;;70347:29:0::2;70372:4;70347:29;::::0;;70387:24:::2;::::0;:12:::2;:24::i;:::-;69854:565:::0;:::o;78978:120::-;79021:4;79087:3;79083:2;79080;79077;79064:11;;79046:15;:29;;;;:::i;:::-;79045:34;;;;:::i;:::-;:37;;;;:::i;:::-;:40;;;;:::i;:::-;79044:46;79037:53;;78978:120;:::o;44880:185::-;45018:39;45035:4;45041:2;45045:7;45018:39;;;;;;;;;;;;:16;:39::i;69519:106::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;69579:4:::1;:14:::0;;;69604:11:::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;69519:106:::0;:::o;75098:780::-;75144:13;75199:1;75177:21;75187:10;75177:9;:21::i;:::-;:23;75169:58;;;;-1:-1:-1;;;75169:58:0;;14553:2:1;75169:58:0;;;14535:21:1;14592:2;14572:18;;;14565:30;-1:-1:-1;;;14611:18:1;;;14604:53;14674:18;;75169:58:0;14351:347:1;75169:58:0;75238:15;75256:21;75266:10;75256:9;:21::i;:::-;75238:39;-1:-1:-1;75288:15:0;;;;75359:418;75387:10;75380:5;:17;75359:418;;;75432:37;75452:10;75463:5;75432:19;:37::i;:::-;75422:47;;75493:22;75507:7;75493:13;:22::i;:::-;75484:31;;75600:3;75595:4;75588:6;75556:8;:17;75565:7;75556:17;;;;;;;;;;;:30;;;75545:10;;:41;;;;:::i;:::-;75544:50;;;;:::i;:::-;:55;;;;:::i;:::-;:59;;;;:::i;:::-;75530:73;;;;:::i;:::-;75647:17;;;;:8;:17;;;;;:31;;;75633:11;;75530:73;;-1:-1:-1;75680:4:0;;75633:45;;75647:31;75633:45;:::i;:::-;75632:52;;;;:::i;:::-;75618:66;;;;:::i;:::-;75728:17;;;;:8;:17;;;;;:31;;;75714:11;;75618:66;;-1:-1:-1;75761:4:0;;75714:45;;75728:31;75714:45;:::i;:::-;75713:52;;;;:::i;:::-;75699:66;;;;:::i;:::-;;-1:-1:-1;75399:7:0;;;;:::i;:::-;;;;75359:418;;;;75841:27;75857:10;75841:15;:27::i;:::-;75803:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;75789:81;;;;;;75098:780;:::o;78087:883::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;78138:15:::1;78192:16;;78180:11;;:28;;;;:::i;:::-;78167:11;;78156:10;;:22;;;;:::i;:::-;:53;;;;:::i;:::-;78138:71:::0;-1:-1:-1;78250:1:0::1;78228:21;78242:6;78138:71:::0;78228:21:::1;:::i;:::-;:23;78220:65;;;;-1:-1:-1::0;;;78220:65:0::1;;;;;;;:::i;:::-;78296:18;:16;:18::i;:::-;78349:5;::::0;78326:17:::1;::::0;-1:-1:-1;;;;;78349:5:0::1;78391:3;78367:19;78379:6;78367:10:::0;:19:::1;:::i;:::-;78366:24;::::0;78388:2:::1;78366:24;:::i;:::-;:28;;;;:::i;:::-;:37;::::0;78396:6:::1;78366:37;:::i;:::-;78349:59;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78325:83;;;78427:12;78419:44;;;;-1:-1:-1::0;;;78419:44:0::1;;;;;;;:::i;:::-;78554:16;;78542:11;;:28;;;;:::i;:::-;78523:16;;78511:11;;:28;;;;:::i;:::-;78498:11;;78487:10;;:22;;;;:::i;:::-;:53;;;;:::i;:::-;:84;;;;:::i;:::-;78474:97:::0;-1:-1:-1;78585:12:0;;78582:222:::1;;78632:9:::0;;-1:-1:-1;;;;;78632:9:0::1;78678:3;78654:19;78666:6;78654:10:::0;:19:::1;:::i;:::-;78653:24;::::0;78675:2:::1;78653:24;:::i;:::-;:28;;;;:::i;:::-;:37;::::0;78683:6:::1;78653:37;:::i;:::-;78632:63;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;78729:9:0;;78613:82;;-1:-1:-1;;;;;;78729:9:0::1;78775:3;78751:19;78763:6;78751:10:::0;:19:::1;:::i;:::-;78750:24;::::0;78772:2:::1;78750:24;:::i;:::-;:28;;;;:::i;:::-;:37;::::0;78780:6:::1;78750:37;:::i;:::-;78729:63;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;78710:82:0;;-1:-1:-1;;78582:222:0::1;78833:11;::::0;78814:16:::1;:30:::0;78874:11:::1;::::0;78855:16:::1;:30:::0;78910:10:::1;::::0;78896:11:::1;:24:::0;78945:11:::1;::::0;:17:::1;::::0;78957:5:::1;::::0;78945:17:::1;:::i;:::-;78931:11;:31:::0;-1:-1:-1;;78087:883:0:o;77085:600::-;77151:1;77129:21;77139:10;77129:9;:21::i;:::-;:23;77121:58;;;;-1:-1:-1;;;77121:58:0;;14553:2:1;77121:58:0;;;14535:21:1;14592:2;14572:18;;;14565:30;-1:-1:-1;;;14611:18:1;;;14604:53;14674:18;;77121:58:0;14351:347:1;77121:58:0;77192:12;77215:15;77233:21;77243:10;77233:9;:21::i;:::-;77215:39;-1:-1:-1;77265:15:0;;77293:170;77321:10;77314:5;:17;77293:170;;;77366:37;77386:10;77397:5;77366:19;:37::i;:::-;77356:47;;77432:19;77443:7;77432:10;:19::i;:::-;77418:33;;;;:::i;:::-;;-1:-1:-1;77333:7:0;;;;:::i;:::-;;;;77293:170;;;-1:-1:-1;77501:1:0;77481:19;77493:6;77481:10;:19;:::i;:::-;:21;77473:63;;;;-1:-1:-1;;;77473:63:0;;;;;;;:::i;:::-;77566:37;;77548:12;;77566:10;;77588;;77548:12;77566:37;77548:12;77566:37;77588:10;77566;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77547:56;;;77622:7;77614:39;;;;-1:-1:-1;;;77614:39:0;;;;;;;:::i;:::-;77664:11;:13;;;:11;:13;;;:::i;:::-;;;;;;77110:575;;;;77085:600::o;56356:233::-;56431:7;56467:30;56254:10;:17;;56166:113;56467:30;56459:5;:38;56451:95;;;;-1:-1:-1;;;56451:95:0;;16276:2:1;56451:95:0;;;16258:21:1;16315:2;16295:18;;;16288:30;16354:34;16334:18;;;16327:62;-1:-1:-1;;;16405:18:1;;;16398:42;16457:19;;56451:95:0;16074:408:1;56451:95:0;56564:10;56575:5;56564:17;;;;;;;;:::i;:::-;;;;;;;;;56557:24;;56356:233;;;:::o;65508:140::-;65563:4;65585:1;65583;:3;65579:43;;;-1:-1:-1;65609:1:0;65602:8;;65579:43;-1:-1:-1;65639:1:0;;65508:140;-1:-1:-1;65508:140:0:o;79356:126::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;79439:11:::1;79424;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;79461:11:0::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;41971:222::-:0;42043:7;42079:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42079:16:0;;42106:56;;;;-1:-1:-1;;;42106:56:0;;16689:2:1;42106:56:0;;;16671:21:1;16728:2;16708:18;;;16701:30;-1:-1:-1;;;16747:18:1;;;16740:54;16811:18;;42106:56:0;16487:348:1;70667:962:0;70747:16;70755:7;70747;:16::i;:::-;-1:-1:-1;;;;;70733:30:0;:10;-1:-1:-1;;;;;70733:30:0;;70725:74;;;;-1:-1:-1;;;70725:74:0;;17042:2:1;70725:74:0;;;17024:21:1;17081:2;17061:18;;;17054:30;17120:33;17100:18;;;17093:61;17171:18;;70725:74:0;16840:355:1;70725:74:0;70818:17;;;;:8;:17;;;;;:23;;;70845:1;-1:-1:-1;70810:68:0;;;;-1:-1:-1;;;70810:68:0;;;;;;;:::i;:::-;70892:17;;;;:8;:17;;;;;:23;;;:29;;70889:374;;70958:11;:14;70945:9;:27;;70937:66;;;;-1:-1:-1;;;70937:66:0;;17758:2:1;70937:66:0;;;17740:21:1;17797:2;17777:18;;;17770:30;17836:28;17816:18;;;17809:56;17882:18;;70937:66:0;17556:350:1;70937:66:0;70889:374;;;71033:17;;;;:8;:17;;;;;:23;;;71061:1;71033:29;71030:233;;71099:14;;71086:9;:27;;71078:66;;;;-1:-1:-1;;;71078:66:0;;18113:2:1;71078:66:0;;;18095:21:1;18152:2;18132:18;;;18125:30;18191:28;18171:18;;;18164:56;18237:18;;71078:66:0;17911:350:1;71030:233:0;71206:14;;71193:9;:27;;71185:66;;;;-1:-1:-1;;;71185:66:0;;18468:2:1;71185:66:0;;;18450:21:1;18507:2;18487:18;;;18480:30;18546:28;18526:18;;;18519:56;18592:18;;71185:66:0;18266:350:1;71185:66:0;71291:17;;;;:8;:17;;;;;:23;;;71273:68;;71315:25;71291:23;71339:1;71315:25;:::i;:::-;71273:17;:68::i;:::-;71352:17;;;;:8;:17;;;;;:23;;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;71425:17:0;;;;:8;:17;;;;;71464:25;;;;71388:199;;71401:7;;71447:43;;:16;:43::i;:::-;71512:17;;;;:8;:17;;;;;:23;;;71495:41;;:16;:41::i;:::-;71554:17;;;;:8;:17;;;;;:22;;;71537:40;;:16;:40::i;:::-;71411:175;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71388:12;:199::i;:::-;71612:9;71598:10;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;70667:962:0:o;41702:207::-;41774:7;-1:-1:-1;;;;;41802:19:0;;41794:73;;;;-1:-1:-1;;;41794:73:0;;20763:2:1;41794:73:0;;;20745:21:1;20802:2;20782:18;;;20775:30;20841:34;20821:18;;;20814:62;-1:-1:-1;;;20892:18:1;;;20885:39;20941:19;;41794:73:0;20561:405:1;41794:73:0;-1:-1:-1;;;;;;41885:16:0;;;;;:9;:16;;;;;;;41702:207::o;69753:93::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;69805:7:::1;:9:::0;;;:7:::1;:9;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;69825:11:0::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;69753:93::o:0;79959:208::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;80121:37:::1;::::0;-1:-1:-1;;;80121:37:0;;80152:4:::1;80121:37;::::0;::::1;2402:51:1::0;80062:13:0;;-1:-1:-1;;;;;80087:21:0;::::1;::::0;::::1;::::0;80109:10:::1;::::0;80087:21;;80121:22:::1;::::0;2375:18:1;;80121:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80087:72;::::0;-1:-1:-1;;;;;;80087:72:0::1;::::0;;;;;;-1:-1:-1;;;;;206:32:1;;;80087:72:0::1;::::0;::::1;188:51:1::0;255:18;;;248:34;161:18;;80087:72:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42429:104::-:0;42485:13;42518:7;42511:14;;;;;:::i;2562:99::-;2605:7;2632:21;:11;997:14;;905:114;2632:21;2625:28;;2562:99;:::o;44016:155::-;44111:52;18593:10;44144:8;44154;44111:18;:52::i;:::-;44016:155;;:::o;65393:107::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;65460:8:::1;::::0;;-1:-1:-1;;65448:20:0;::::1;65460:8;::::0;;::::1;65459:9;65448:20;::::0;;65479:11:::1;:13:::0;;;65460:8:::1;65479:13;::::0;::::1;:::i;77693:386::-:0;77768:16;77776:7;77768;:16::i;:::-;-1:-1:-1;;;;;77754:30:0;:10;-1:-1:-1;;;;;77754:30:0;;77746:71;;;;-1:-1:-1;;;77746:71:0;;21612:2:1;77746:71:0;;;21594:21:1;21651:2;21631:18;;;21624:30;21690;21670:18;;;21663:58;21738:18;;77746:71:0;21410:352:1;77746:71:0;77828:12;77843:19;77854:7;77843:10;:19::i;:::-;77828:34;-1:-1:-1;77898:1:0;77881:16;77890:6;77828:34;77881:16;:::i;:::-;:18;77873:60;;;;-1:-1:-1;;;77873:60:0;;;;;;;:::i;:::-;77963:34;;77945:12;;77963:10;;77985:7;;77945:12;77963:34;77945:12;77963:34;77985:7;77963:10;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77944:53;;;78016:7;78008:39;;;;-1:-1:-1;;;78008:39:0;;;;;;;:::i;:::-;78058:11;:13;;;:11;:13;;;:::i;:::-;;;;;;77735:344;;77693:386;:::o;45136:323::-;45310:41;18593:10;45343:7;45310:18;:41::i;:::-;45302:100;;;;-1:-1:-1;;;45302:100:0;;;;;;;:::i;:::-;45413:38;45427:4;45433:2;45437:7;45446:4;45413:13;:38::i;:::-;45136:323;;;;:::o;68537:370::-;68596:1;3583:6;3558:21;:19;:21::i;:::-;:31;;3550:84;;;;-1:-1:-1;;;3550:84:0;;;;;;;:::i;:::-;65320:8:::1;::::0;::::1;;:17;65312:53;;;;-1:-1:-1::0;;;65312:53:0::1;;;;;;;:::i;:::-;68637:10:::2;68624:9;:23;;68616:50;;;::::0;-1:-1:-1;;;68616:50:0;;21969:2:1;68616:50:0::2;::::0;::::2;21951:21:1::0;22008:2;21988:18;;;21981:30;-1:-1:-1;;;22027:18:1;;;22020:44;22081:18;;68616:50:0::2;21767:338:1::0;68616:50:0::2;68697:1;68685:9;;:13;68677:40;;;::::0;-1:-1:-1;;;68677:40:0;;22312:2:1;68677:40:0::2;::::0;::::2;22294:21:1::0;22351:2;22331:18;;;22324:30;-1:-1:-1;;;22370:18:1;;;22363:44;22424:18;;68677:40:0::2;22110:338:1::0;68677:40:0::2;68749:3;68731:17;68739:4;68744:3;68731:7;:17::i;:::-;:21;68728:112;;;68778:24;68791:10;68778:12;:24::i;:::-;68817:9;:11:::0;;;:9:::2;:11;::::0;::::2;:::i;:::-;;;;;;68728:112;68864:1;68850:11;;:15;;;;;;;:::i;:::-;;;;;;;;68890:9;68876:10;;:23;;;;;;;:::i;73085:522::-:0;73161:16;73169:7;73161;:16::i;:::-;-1:-1:-1;;;;;73147:30:0;:10;-1:-1:-1;;;;;73147:30:0;;73139:71;;;;-1:-1:-1;;;73139:71:0;;21612:2:1;73139:71:0;;;21594:21:1;21651:2;21631:18;;;21624:30;21690;21670:18;;;21663:58;21738:18;;73139:71:0;21410:352:1;73139:71:0;73229:17;;;;:8;:17;;;;;:23;;;73255:1;-1:-1:-1;73221:67:0;;;;-1:-1:-1;;;73221:67:0;;;;;;;:::i;:::-;73302:17;;;;:8;:17;;;;;:23;;;:29;;73299:301;;73347:31;73364:7;73372:5;73347:16;:31::i;73299:301::-;73408:17;;;;:8;:17;;;;;:23;;;73436:1;73408:29;73405:195;;73453:31;73470:7;73478:5;73453:16;:31::i;73405:195::-;73514:17;;;;:8;:17;;;;;:23;;;73542:1;73514:29;73511:89;;73559:29;73576:7;73584:3;73559:16;:29::i;69385:126::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;69474:5:::1;69460:11;;:19;;;;:::i;:::-;69446:11;:33:::0;69490:11:::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;70523:136::-:0;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;70613:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;:11:::1;::::0;:38:::1;;:::i;62239:624::-:0;62312:13;62338:23;62353:7;62338:14;:23::i;:::-;62374;62400:19;;;:10;:19;;;;;62374:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62430:18;62451:10;43211:9;;;;;;;;;-1:-1:-1;43211:9:0;;;43134:94;62451:10;62430:31;;62543:4;62537:18;62559:1;62537:23;62533:72;;-1:-1:-1;62584:9:0;62239:624;-1:-1:-1;;62239:624:0:o;62533:72::-;62709:23;;:27;62705:108;;62784:4;62790:9;62767:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62753:48;;;;62239:624;;;:::o;62705:108::-;62832:23;62847:7;62832:14;:23::i;:::-;62825:30;62239:624;-1:-1:-1;;;;62239:624:0:o;69631:114::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;69695:6:::1;:18:::0;;;69724:11:::1;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;2767:113::-:0;2819:7;2860:12;:10;:12::i;:::-;2451;;2846:26;;;;:::i;68915:464::-;69002:1;3583:6;3558:21;:19;:21::i;:::-;:31;;3550:84;;;;-1:-1:-1;;;3550:84:0;;;;;;;:::i;:::-;65320:8:::1;::::0;::::1;;:17;65312:53;;;;-1:-1:-1::0;;;65312:53:0::1;;;;;;;:::i;:::-;69030:23:::2;69042:10;69030:11;:23::i;:::-;:31;;69057:4;69030:31;69022:74;;;::::0;-1:-1:-1;;;69022:74:0;;23156:2:1;69022:74:0::2;::::0;::::2;23138:21:1::0;23195:2;23175:18;;;23168:30;23234:31;23214:18;;;23207:59;23283:18;;69022:74:0::2;22954:353:1::0;69022:74:0::2;69127:10;69116:22;::::0;;;:10:::2;:22;::::0;;;;;::::2;;69115:23;69107:65;;;::::0;-1:-1:-1;;;69107:65:0;;23514:2:1;69107:65:0::2;::::0;::::2;23496:21:1::0;23553:2;23533:18;;;23526:30;23592;23572:18;;;23565:58;23640:18;;69107:65:0::2;23312:352:1::0;69107:65:0::2;69204:6;;69191:9;:19;;69183:55;;;::::0;-1:-1:-1;;;69183:55:0;;23871:2:1;69183:55:0::2;::::0;::::2;23853:21:1::0;23910:2;23890:18;;;23883:30;23949:25;23929:18;;;23922:53;23992:18;;69183:55:0::2;23669:347:1::0;69183:55:0::2;69249:24;69262:10;69249:12;:24::i;:::-;69295:10;69284:22;::::0;;;:10:::2;:22;::::0;;;;:29;;-1:-1:-1;;69284:29:0::2;69309:4;69284:29;::::0;;69324:10:::2;:23:::0;;69338:9:::2;::::0;69284:22;69324:23:::2;::::0;69338:9;;69324:23:::2;:::i;:::-;::::0;;;-1:-1:-1;;69358:11:0::2;:13:::0;;;:11:::2;:13;::::0;::::2;:::i;:::-;;;;;;68915:464:::0;;:::o;70427:88::-;65201:5;;-1:-1:-1;;;;;65201:5:0;65210:10;65201:19;65193:64;;;;-1:-1:-1;;;65193:64:0;;;;;;;:::i;:::-;70491:16:::1;70504:2;70491:12;:16::i;41333:305::-:0;41435:4;-1:-1:-1;;;;;;41472:40:0;;-1:-1:-1;;;41472:40:0;;:105;;-1:-1:-1;;;;;;;41529:48:0;;-1:-1:-1;;;41529:48:0;41472:105;:158;;;-1:-1:-1;;;;;;;;;;29171:40:0;;;41594:36;29062:157;51748:135;47031:4;47055:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47055:16:0;51822:53;;;;-1:-1:-1;;;51822:53:0;;16689:2:1;51822:53:0;;;16671:21:1;16728:2;16708:18;;;16701:30;-1:-1:-1;;;16747:18:1;;;16740:54;16811:18;;51822:53:0;16487:348:1;51027:174:0;51102:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51102:29:0;-1:-1:-1;;;;;51102:29:0;;;;;;;;:24;;51156:23;51102:24;51156:14;:23::i;:::-;-1:-1:-1;;;;;51147:46:0;;;;;;;;;;;51027:174;;:::o;12717:231::-;12795:7;12816:17;12835:18;12857:27;12868:4;12874:9;12857:10;:27::i;:::-;12815:69;;;;12895:18;12907:5;12895:11;:18::i;:::-;-1:-1:-1;12931:9:0;12717:231;-1:-1:-1;;;12717:231:0:o;65044:109::-;65106:15;65092:11;:29;65132:11;:13;;;:11;:13;;;:::i;6794:723::-;6850:13;7071:5;7080:1;7071:10;7067:53;;-1:-1:-1;;7098:10:0;;;;;;;;;;;;-1:-1:-1;;;7098:10:0;;;;;6794:723::o;7067:53::-;7145:5;7130:12;7186:78;7193:9;;7186:78;;7219:8;;;;:::i;:::-;;-1:-1:-1;7242:10:0;;-1:-1:-1;7250:2:0;7242:10;;:::i;:::-;;;7186:78;;;7274:19;7306:6;7296:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7296:17:0;;7274:39;;7324:154;7331:10;;7324:154;;7358:11;7368:1;7358:11;;:::i;:::-;;-1:-1:-1;7427:10:0;7435:2;7427:5;:10;:::i;:::-;7414:24;;:2;:24;:::i;:::-;7401:39;;7384:6;7391;7384:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7384:56:0;;;;;;;;-1:-1:-1;7455:11:0;7464:2;7455:11;;:::i;:::-;;;7324:154;;73615:680;73679:13;73704:21;73728:37;73745:19;73757:6;73745:10;:19;:::i;:::-;73728:16;:37::i;:::-;73704:61;-1:-1:-1;73776:22:0;73801:60;73838:19;73850:6;73838:10;:19;:::i;:::-;:22;;73858:2;73838:22;:::i;:::-;73818:19;73830:6;73818:10;:19;:::i;:::-;:42;;;;:::i;73801:60::-;73776:85;-1:-1:-1;73872:26:0;73901:60;73938:19;73950:6;73938:10;:19;:::i;:::-;:22;;73958:2;73938:22;:::i;:::-;73918:19;73930:6;73918:10;:19;:::i;73901:60::-;73872:89;-1:-1:-1;73972:27:0;74002:60;74039:19;74051:6;74039:10;:19;:::i;:::-;:22;;74059:2;74039:22;:::i;:::-;74019:19;74031:6;74019:10;:19;:::i;74002:60::-;73972:90;-1:-1:-1;74073:30:0;74106:60;74143:19;74155:6;74143:10;:19;:::i;:::-;:22;;74163:2;74143:22;:::i;:::-;74123:19;74135:6;74123:10;:19;:::i;74106:60::-;74073:93;;74208:7;74222:8;74232:12;74246:13;74261:16;74191:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74177:110;;;;;;;73615:680;;;:::o;47260:264::-;47353:4;47370:13;47386:23;47401:7;47386:14;:23::i;:::-;47370:39;;47439:5;-1:-1:-1;;;;;47428:16:0;:7;-1:-1:-1;;;;;47428:16:0;;:52;;;-1:-1:-1;;;;;;44363:25:0;;;44339:4;44363:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47448:32;47428:87;;;;47508:7;-1:-1:-1;;;;;47484:31:0;:20;47496:7;47484:11;:20::i;:::-;-1:-1:-1;;;;;47484:31:0;;47420:96;47260:264;-1:-1:-1;;;;47260:264:0:o;50283:625::-;50442:4;-1:-1:-1;;;;;50415:31:0;:23;50430:7;50415:14;:23::i;:::-;-1:-1:-1;;;;;50415:31:0;;50407:81;;;;-1:-1:-1;;;50407:81:0;;26028:2:1;50407:81:0;;;26010:21:1;26067:2;26047:18;;;26040:30;26106:34;26086:18;;;26079:62;-1:-1:-1;;;26157:18:1;;;26150:35;26202:19;;50407:81:0;25826:401:1;50407:81:0;-1:-1:-1;;;;;50507:16:0;;50499:65;;;;-1:-1:-1;;;50499:65:0;;26434:2:1;50499:65:0;;;26416:21:1;26473:2;26453:18;;;26446:30;26512:34;26492:18;;;26485:62;-1:-1:-1;;;26563:18:1;;;26556:34;26607:19;;50499:65:0;26232:400:1;50499:65:0;50577:39;50598:4;50604:2;50608:7;50577:20;:39::i;:::-;50681:29;50698:1;50702:7;50681:8;:29::i;:::-;-1:-1:-1;;;;;50723:15:0;;;;;;:9;:15;;;;;:20;;50742:1;;50723:15;:20;;50742:1;;50723:20;:::i;:::-;;;;-1:-1:-1;;;;;;;50754:13:0;;;;;;:9;:13;;;;;:18;;50771:1;;50754:13;:18;;50771:1;;50754:18;:::i;:::-;;;;-1:-1:-1;;50783:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50783:21:0;-1:-1:-1;;;;;50783:21:0;;;;;;;;;50822:27;;50783:16;;50822:27;;;;;;;43360:347;43290:417;;:::o;67787:742::-;67846:12;67861:11;:9;:11::i;:::-;67846:26;;67883;67893:6;67901:7;67883:9;:26::i;:::-;67950:17;;;;:8;:17;;;;;;;;;67933:39;;67977:13;;67933:39;;67950:17;;67933:39;;:::i;:::-;;;;;;;;;;;;;67923:50;;;;;;:67;67920:358;;68048:2;68016:8;:17;68025:7;68016:17;;;;;;;;;;;:29;;:34;;;;68065:93;;;;;;;;;;;;;;;;;:17;;;;:8;:17;;;;;;:93;;:17;:93;:::i;:::-;-1:-1:-1;68173:17:0;;;;:8;:17;;;;;:25;;;:35;;;68256:10;;68223:30;;;;:43;67920:358;68288:17;;;;:8;:17;;;;;:22;;;:29;;-1:-1:-1;;68288:29:0;68313:4;68288:29;;;68343;;;68328:11;:44;;68343:29;;68328:11;;:44;;68343:29;;68328:44;:::i;:::-;;;;-1:-1:-1;;68419:17:0;;;;:8;:17;;;;;68458:25;;;;68383:114;;68396:7;;68441:43;;:16;:43::i;:::-;68405:91;;;;;;;;;:::i;68383:114::-;68508:11;:13;;;:11;:13;;;:::i;75886:608::-;75945:4;76014:17;;;:8;:17;;;;;:23;;;75945:4;;;;76014:28;76010:109;;76080:17;;;;:8;:17;;;;;:23;;;:25;;76104:1;;76080:25;:::i;:::-;76075:31;;:2;:31;:::i;:::-;76072:35;;:1;:35;:::i;:::-;76058:49;;76010:109;76171:17;;;;:8;:17;;;;;:22;;;;76139:29;;;;;76205:11;;76139:54;;;:::i;:::-;:77;;;;:::i;:::-;76228:14;76266:17;;;:8;:17;;;;;:29;;;76129:88;;-1:-1:-1;76129:88:0;;76299:2;76266:35;:56;;;;;76317:5;76305:11;;:17;76266:56;:72;;;;;76336:2;76326:9;:12;76266:72;76262:179;;;76419:7;76406:11;;:21;;;;:::i;:::-;76373:12;76383:2;76373:9;:12;:::i;:::-;76372:32;;76388:15;76372:32;:::i;:::-;:56;;;;:::i;:::-;76366:63;;:2;:63;:::i;:::-;76354:75;;76262:179;76458:28;76469:6;76476:9;76458:10;:28::i;:::-;76451:35;75886:608;-1:-1:-1;;;;;75886:608:0:o;76502:575::-;76553:4;76569:11;76591:12;76625:22;76639:7;76625:13;:22::i;:::-;76616:31;;76725:3;76720:4;76713:6;76681:8;:17;76690:7;76681:17;;;;;;;;;;;:30;;;76670:10;;:41;;;;:::i;:::-;76669:50;;;;:::i;:::-;:55;;;;:::i;:::-;:59;;;;:::i;:::-;76658:70;;;;:::i;:::-;76765:17;;;;:8;:17;;;;;:31;;;76751:11;;76658:70;;-1:-1:-1;76798:4:0;;76751:45;;76765:31;76751:45;:::i;:::-;76750:52;;;;:::i;:::-;76739:63;;;;:::i;:::-;76839:17;;;;:8;:17;;;;;:31;;;76825:11;;76739:63;;-1:-1:-1;76872:4:0;;76825:45;;76839:31;76825:45;:::i;:::-;76824:52;;;;:::i;:::-;76813:63;;;;:::i;:::-;76920:10;;76887:17;;;;:8;:17;;;;;;:30;;;:43;;;;76975:11;;76941:31;;;:45;77031:11;;76997:31;;;;:45;;;;-1:-1:-1;76813:63:0;;76502:575;-1:-1:-1;;76502:575:0:o;71637:368::-;71714:14;;71768:13;;71764:77;;71817:10;71826:1;71817:8;:10;:::i;:::-;71812:16;;:2;:16;:::i;:::-;71809:20;;:1;:20;:::i;:::-;71797:32;;71764:77;71855:13;;71851:77;;71904:10;71913:1;71904:8;:10;:::i;:::-;71899:16;;:2;:16;:::i;:::-;71896:20;;:1;:20;:::i;:::-;71884:32;;71851:77;71953:9;71938:11;;:24;;;;;;;:::i;:::-;;;;;;;;71988:9;71973:11;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;71637:368:0:o;63019:217::-;47031:4;47055:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47055:16:0;63111:75;;;;-1:-1:-1;;;63111:75:0;;31046:2:1;63111:75:0;;;31028:21:1;31085:2;31065:18;;;31058:30;31124:34;31104:18;;;31097:62;-1:-1:-1;;;31175:18:1;;;31168:44;31229:19;;63111:75:0;30844:410:1;63111:75:0;63197:19;;;;:10;:19;;;;;:31;63219:9;63197:19;:31;:::i;51344:315::-;51499:8;-1:-1:-1;;;;;51490:17:0;:5;-1:-1:-1;;;;;51490:17:0;;51482:55;;;;-1:-1:-1;;;51482:55:0;;31461:2:1;51482:55:0;;;31443:21:1;31500:2;31480:18;;;31473:30;31539:27;31519:18;;;31512:55;31584:18;;51482:55:0;31259:349:1;51482:55:0;-1:-1:-1;;;;;51548:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;51548:46:0;;;;;;;;;;51610:41;;1081::1;;;51610::0;;1054:18:1;51610:41:0;;;;;;;51344:315;;;:::o;46340:313::-;46496:28;46506:4;46512:2;46516:7;46496:9;:28::i;:::-;46543:47;46566:4;46572:2;46576:7;46585:4;46543:22;:47::i;:::-;46535:110;;;;-1:-1:-1;;;46535:110:0;;;;;;;:::i;65656:472::-;65723:4;65739:11;66091:5;65825:10;65858:14;65895:16;65934:14;65971:15;66009:10;66042:11;;65786:286;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65758:329;;;;;;65753:335;;:343;;;;:::i;72013:1064::-;72090:11;:13;;;:11;:13;;;:::i;:::-;;;;;;72136:16;72144:7;72136;:16::i;:::-;-1:-1:-1;;;;;72122:30:0;:10;-1:-1:-1;;;;;72122:30:0;;72114:74;;;;-1:-1:-1;;;72114:74:0;;17042:2:1;72114:74:0;;;17024:21:1;17081:2;17061:18;;;17054:30;17120:33;17100:18;;;17093:61;17171:18;;72114:74:0;16840:355:1;72114:74:0;72207:17;;;;:8;:17;;;;;:23;;;72234:1;-1:-1:-1;72199:68:0;;;;-1:-1:-1;;;72199:68:0;;;;;;;:::i;:::-;72299:11;72281:17;72289:4;72294:3;72281:7;:17::i;:::-;:29;72278:582;;;72344:17;;;;:8;:17;;;;;:23;;;72326:68;;72368:25;72344:23;72392:1;72368:25;:::i;72326:68::-;72409:17;;;;:8;:17;;;;;:23;;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;72474:1:0;72449:17;;;:8;:17;;;;;:22;;:26;72278:582;;;72516:42;72529:10;72540:6;72547:1;72540:9;;-1:-1:-1;;;;;72540:9:0;72550:7;72516:12;:42::i;:::-;72577:17;;;;:8;:17;;;;;72600:1;72577:22;;;;:24;72573:276;;;72621:17;;;;:8;:17;;;;;:22;;:24;;;;;;:::i;:::-;;;;;;72573:276;;;72716:17;;;;:8;:17;;;;;:23;;;72698:44;;:17;:44::i;:::-;72787:1;72761:17;;;:8;:17;;;;;:23;;;:27;;;72807:22;;:26;72573:276;72907:17;;;;:8;:17;;;;;72946:25;;;;72870:199;;72883:7;;72929:43;;:16;:43::i;:::-;72994:17;;;;:8;:17;;;;;:23;;;72977:41;;:16;:41::i;:::-;73036:17;;;;:8;:17;;;;;:22;;;73019:40;;:16;:40::i;42604:281::-;42677:13;42703:23;42718:7;42703:14;:23::i;:::-;42739:21;42763:10;43211:9;;;;;;;;;-1:-1:-1;43211:9:0;;;43134:94;42763:10;42739:34;;42815:1;42797:7;42791:21;:25;:86;;;;;;;;;;;;;;;;;42843:7;42852:18;:7;:16;:18::i;:::-;42826:45;;;;;;;;;:::i;42791:86::-;42784:93;42604:281;-1:-1:-1;;;42604:281:0:o;11168:747::-;11249:7;11258:12;11287:9;:16;11307:2;11287:22;11283:625;;11631:4;11616:20;;11610:27;11681:4;11666:20;;11660:27;11739:4;11724:20;;11718:27;11326:9;11710:36;11782:25;11793:4;11710:36;11610:27;11660;11782:10;:25::i;:::-;11775:32;;;;;;;;;11283:625;-1:-1:-1;11856:1:0;;-1:-1:-1;11860:35:0;11283:625;11168:747;;;;;:::o;9439:643::-;9517:20;9508:5;:29;;;;;;;;:::i;:::-;;9504:571;;9439:643;:::o;9504:571::-;9615:29;9606:5;:38;;;;;;;;:::i;:::-;;9602:473;;9661:34;;-1:-1:-1;;;9661:34:0;;33049:2:1;9661:34:0;;;33031:21:1;33088:2;33068:18;;;33061:30;33127:26;33107:18;;;33100:54;33171:18;;9661:34:0;32847:348:1;9602:473:0;9726:35;9717:5;:44;;;;;;;;:::i;:::-;;9713:362;;9778:41;;-1:-1:-1;;;9778:41:0;;33402:2:1;9778:41:0;;;33384:21:1;33441:2;33421:18;;;33414:30;33480:33;33460:18;;;33453:61;33531:18;;9778:41:0;33200:355:1;9713:362:0;9850:30;9841:5;:39;;;;;;;;:::i;:::-;;9837:238;;9897:44;;-1:-1:-1;;;9897:44:0;;33762:2:1;9897:44:0;;;33744:21:1;33801:2;33781:18;;;33774:30;33840:34;33820:18;;;33813:62;-1:-1:-1;;;33891:18:1;;;33884:32;33933:19;;9897:44:0;33560:398:1;9837:238:0;9972:30;9963:5;:39;;;;;;;;:::i;:::-;;9959:116;;10019:44;;-1:-1:-1;;;10019:44:0;;34165:2:1;10019:44:0;;;34147:21:1;34204:2;34184:18;;;34177:30;34243:34;34223:18;;;34216:62;-1:-1:-1;;;34294:18:1;;;34287:32;34336:19;;10019:44:0;33963:398:1;57202:589:0;-1:-1:-1;;;;;57408:18:0;;57404:187;;57443:40;57475:7;58618:10;:17;;58591:24;;;;:15;:24;;;;;:44;;;58646:24;;;;;;;;;;;;58514:164;57443:40;57404:187;;;57513:2;-1:-1:-1;;;;;57505:10:0;:4;-1:-1:-1;;;;;57505:10:0;;57501:90;;57532:47;57565:4;57571:7;57532:32;:47::i;:::-;-1:-1:-1;;;;;57605:16:0;;57601:183;;57638:45;57675:7;57638:36;:45::i;57601:183::-;57711:4;-1:-1:-1;;;;;57705:10:0;:2;-1:-1:-1;;;;;57705:10:0;;57701:83;;57732:40;57760:2;57764:7;57732:27;:40::i;5006:1351::-;5073:7;3305:1;3281:21;:19;:21::i;:::-;:25;3273:62;;;;-1:-1:-1;;;3273:62:0;;34568:2:1;3273:62:0;;;34550:21:1;34607:2;34587:18;;;34580:30;34646:26;34626:18;;;34619:54;34690:18;;3273:62:0;34366:348:1;3273:62:0;5093:16:::1;5126:12;:10;:12::i;:::-;2451::::0;;5112:26:::1;;;;:::i;:::-;5093:45;;5149:14;5467:8;5233:10;5262:14;5295:16;5330:14;5363:15;5397:10;;5426:11;;5198:254;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5174:289;;;;;;5166:298;;:309;;;;:::i;:::-;5149:326;;5501:6;5486:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;5518:13:0::1;5550:19:::0;;;:11:::1;:19;::::0;;;;;:24;;5546:304:::1;;-1:-1:-1::0;5695:6:0;5546:304:::1;;;-1:-1:-1::0;5819:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;5546:304:::1;5927:11;:25;5939:12;5950:1;5939:8:::0;:12:::1;:::i;:::-;5927:25;;;;;;;;;;;;5956:1;5927:30:::0;5923:331:::1;;6061:12;6072:1;6061:8:::0;:12:::1;:::i;:::-;6039:19;::::0;;;:11:::1;:19;::::0;;;;:34;5923:331:::1;;;6217:11;:25;6229:12;6240:1;6229:8:::0;:12:::1;:::i;:::-;6217:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;6217:25:0;;;;6195:19;;;:11:::1;:19:::0;;;;:47;5923:331:::1;6295:17;:15;:17::i;:::-;-1:-1:-1::0;6340:9:0::1;::::0;6332:17:::1;::::0;:5;:17:::1;:::i;:::-;6325:24;;;;;5006:1351:::0;:::o;47866:110::-;47942:26;47952:2;47956:7;47942:26;;;;;;;;;;;;:9;:26::i;52447:853::-;52601:4;-1:-1:-1;;;;;52622:13:0;;20255:19;:23;52618:675;;52658:71;;-1:-1:-1;;;52658:71:0;;-1:-1:-1;;;;;52658:36:0;;;;;:71;;18593:10;;52709:4;;52715:7;;52724:4;;52658:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52658:71:0;;;;;;;;-1:-1:-1;;52658:71:0;;;;;;;;;;;;:::i;:::-;;;52654:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52899:6;:13;52916:1;52899:18;52895:328;;52942:60;;-1:-1:-1;;;52942:60:0;;;;;;;:::i;52895:328::-;53173:6;53167:13;53158:6;53154:2;53150:15;53143:38;52654:584;-1:-1:-1;;;;;;52780:51:0;-1:-1:-1;;;52780:51:0;;-1:-1:-1;52773:58:0;;52618:675;-1:-1:-1;53277:4:0;52447:853;;;;;;:::o;14169:1632::-;14300:7;;15234:66;15221:79;;15217:163;;;-1:-1:-1;15333:1:0;;-1:-1:-1;15337:30:0;15317:51;;15217:163;15394:1;:7;;15399:2;15394:7;;:18;;;;;15405:1;:7;;15410:2;15405:7;;15394:18;15390:102;;;-1:-1:-1;15445:1:0;;-1:-1:-1;15449:30:0;15429:51;;15390:102;15606:24;;;15589:14;15606:24;;;;;;;;;35694:25:1;;;35767:4;35755:17;;35735:18;;;35728:45;;;;35789:18;;;35782:34;;;35832:18;;;35825:34;;;15606:24:0;;35666:19:1;;15606:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15606:24:0;;-1:-1:-1;;15606:24:0;;;-1:-1:-1;;;;;;;15645:20:0;;15641:103;;15698:1;15702:29;15682:50;;;;;;;15641:103;15764:6;-1:-1:-1;15772:20:0;;-1:-1:-1;14169:1632:0;;;;;;;;:::o;59305:988::-;59571:22;59621:1;59596:22;59613:4;59596:16;:22::i;:::-;:26;;;;:::i;:::-;59633:18;59654:26;;;:17;:26;;;;;;59571:51;;-1:-1:-1;59787:28:0;;;59783:328;;-1:-1:-1;;;;;59854:18:0;;59832:19;59854:18;;;:12;:18;;;;;;;;:34;;;;;;;;;59905:30;;;;;;:44;;;60022:30;;:17;:30;;;;;:43;;;59783:328;-1:-1:-1;60207:26:0;;;;:17;:26;;;;;;;;60200:33;;;-1:-1:-1;;;;;60251:18:0;;;;;:12;:18;;;;;:34;;;;;;;60244:41;59305:988::o;60588:1079::-;60866:10;:17;60841:22;;60866:21;;60886:1;;60866:21;:::i;:::-;60898:18;60919:24;;;:15;:24;;;;;;61292:10;:26;;60841:46;;-1:-1:-1;60919:24:0;;60841:46;;61292:26;;;;;;:::i;:::-;;;;;;;;;61270:48;;61356:11;61331:10;61342;61331:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;61436:28;;;:15;:28;;;;;;;:41;;;61608:24;;;;;61601:31;61643:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;60659:1008;;;60588:1079;:::o;58092:221::-;58177:14;58194:20;58211:2;58194:16;:20::i;:::-;-1:-1:-1;;;;;58225:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;58270:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;58092:221:0:o;2990:173::-;3037:7;3057:13;3073:21;:11;997:14;;905:114;3073:21;3057:37;;3107:23;:11;1116:19;;1134:1;1116:19;;;1027:127;48203:319;48332:18;48338:2;48342:7;48332:5;:18::i;:::-;48383:53;48414:1;48418:2;48422:7;48431:4;48383:22;:53::i;:::-;48361:153;;;;-1:-1:-1;;;48361:153:0;;;;;;;:::i;48858:439::-;-1:-1:-1;;;;;48938:16:0;;48930:61;;;;-1:-1:-1;;;48930:61:0;;36204:2:1;48930:61:0;;;36186:21:1;;;36223:18;;;36216:30;36282:34;36262:18;;;36255:62;36334:18;;48930:61:0;36002:356:1;48930:61:0;47031:4;47055:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47055:16:0;:30;49002:58;;;;-1:-1:-1;;;49002:58:0;;36565:2:1;49002:58:0;;;36547:21:1;36604:2;36584:18;;;36577:30;36643;36623:18;;;36616:58;36691:18;;49002:58:0;36363:352:1;49002:58:0;49073:45;49102:1;49106:2;49110:7;49073:20;:45::i;:::-;-1:-1:-1;;;;;49131:13:0;;;;;;:9;:13;;;;;:18;;49148:1;;49131:13;:18;;49148:1;;49131:18;:::i;:::-;;;;-1:-1:-1;;49160:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49160:21:0;-1:-1:-1;;;;;49160:21:0;;;;;;;;49199:33;;49160:16;;;49199:33;;49160:16;;49199:33;44016:155;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:127:1;354:10;349:3;345:20;342:1;335:31;385:4;382:1;375:15;409:4;406:1;399:15;425:125;490:9;;;511:10;;;508:36;;;524:18;;:::i;555:131::-;-1:-1:-1;;;;;;629:32:1;;619:43;;609:71;;676:1;673;666:12;691:245;749:6;802:2;790:9;781:7;777:23;773:32;770:52;;;818:1;815;808:12;770:52;857:9;844:23;876:30;900:5;876:30;:::i;1315:250::-;1400:1;1410:113;1424:6;1421:1;1418:13;1410:113;;;1500:11;;;1494:18;1481:11;;;1474:39;1446:2;1439:10;1410:113;;;-1:-1:-1;;1557:1:1;1539:16;;1532:27;1315:250::o;1570:271::-;1612:3;1650:5;1644:12;1677:6;1672:3;1665:19;1693:76;1762:6;1755:4;1750:3;1746:14;1739:4;1732:5;1728:16;1693:76;:::i;:::-;1823:2;1802:15;-1:-1:-1;;1798:29:1;1789:39;;;;1830:4;1785:50;;1570:271;-1:-1:-1;;1570:271:1:o;1846:220::-;1995:2;1984:9;1977:21;1958:4;2015:45;2056:2;2045:9;2041:18;2033:6;2015:45;:::i;2071:180::-;2130:6;2183:2;2171:9;2162:7;2158:23;2154:32;2151:52;;;2199:1;2196;2189:12;2151:52;-1:-1:-1;2222:23:1;;2071:180;-1:-1:-1;2071:180:1:o;2464:173::-;2532:20;;-1:-1:-1;;;;;2581:31:1;;2571:42;;2561:70;;2627:1;2624;2617:12;2642:254;2710:6;2718;2771:2;2759:9;2750:7;2746:23;2742:32;2739:52;;;2787:1;2784;2777:12;2739:52;2810:29;2829:9;2810:29;:::i;:::-;2800:39;2886:2;2871:18;;;;2858:32;;-1:-1:-1;;;2642:254:1:o;2901:127::-;2962:10;2957:3;2953:20;2950:1;2943:31;2993:4;2990:1;2983:15;3017:4;3014:1;3007:15;3033:718;3075:5;3128:3;3121:4;3113:6;3109:17;3105:27;3095:55;;3146:1;3143;3136:12;3095:55;3182:6;3169:20;3208:18;3245:2;3241;3238:10;3235:36;;;3251:18;;:::i;:::-;3326:2;3320:9;3294:2;3380:13;;-1:-1:-1;;3376:22:1;;;3400:2;3372:31;3368:40;3356:53;;;3424:18;;;3444:22;;;3421:46;3418:72;;;3470:18;;:::i;:::-;3510:10;3506:2;3499:22;3545:2;3537:6;3530:18;3591:3;3584:4;3579:2;3571:6;3567:15;3563:26;3560:35;3557:55;;;3608:1;3605;3598:12;3557:55;3672:2;3665:4;3657:6;3653:17;3646:4;3638:6;3634:17;3621:54;3719:1;3712:4;3707:2;3699:6;3695:15;3691:26;3684:37;3739:6;3730:15;;;;;;3033:718;;;;:::o;3756:320::-;3824:6;3877:2;3865:9;3856:7;3852:23;3848:32;3845:52;;;3893:1;3890;3883:12;3845:52;3933:9;3920:23;3966:18;3958:6;3955:30;3952:50;;;3998:1;3995;3988:12;3952:50;4021:49;4062:7;4053:6;4042:9;4038:22;4021:49;:::i;4081:328::-;4158:6;4166;4174;4227:2;4215:9;4206:7;4202:23;4198:32;4195:52;;;4243:1;4240;4233:12;4195:52;4266:29;4285:9;4266:29;:::i;:::-;4256:39;;4314:38;4348:2;4337:9;4333:18;4314:38;:::i;:::-;4304:48;;4399:2;4388:9;4384:18;4371:32;4361:42;;4081:328;;;;;:::o;4414:248::-;4482:6;4490;4543:2;4531:9;4522:7;4518:23;4514:32;4511:52;;;4559:1;4556;4549:12;4511:52;-1:-1:-1;;4582:23:1;;;4652:2;4637:18;;;4624:32;;-1:-1:-1;4414:248:1:o;4667:186::-;4726:6;4779:2;4767:9;4758:7;4754:23;4750:32;4747:52;;;4795:1;4792;4785:12;4747:52;4818:29;4837:9;4818:29;:::i;4858:118::-;4944:5;4937:13;4930:21;4923:5;4920:32;4910:60;;4966:1;4963;4956:12;4981:315;5046:6;5054;5107:2;5095:9;5086:7;5082:23;5078:32;5075:52;;;5123:1;5120;5113:12;5075:52;5146:29;5165:9;5146:29;:::i;:::-;5136:39;;5225:2;5214:9;5210:18;5197:32;5238:28;5260:5;5238:28;:::i;:::-;5285:5;5275:15;;;4981:315;;;;;:::o;5301:537::-;5396:6;5404;5412;5420;5473:3;5461:9;5452:7;5448:23;5444:33;5441:53;;;5490:1;5487;5480:12;5441:53;5513:29;5532:9;5513:29;:::i;:::-;5503:39;;5561:38;5595:2;5584:9;5580:18;5561:38;:::i;:::-;5551:48;;5646:2;5635:9;5631:18;5618:32;5608:42;;5701:2;5690:9;5686:18;5673:32;5728:18;5720:6;5717:30;5714:50;;;5760:1;5757;5750:12;5714:50;5783:49;5824:7;5815:6;5804:9;5800:22;5783:49;:::i;:::-;5773:59;;;5301:537;;;;;;;:::o;5843:316::-;5920:6;5928;5936;5989:2;5977:9;5968:7;5964:23;5960:32;5957:52;;;6005:1;6002;5995:12;5957:52;-1:-1:-1;;6028:23:1;;;6098:2;6083:18;;6070:32;;-1:-1:-1;6149:2:1;6134:18;;;6121:32;;5843:316;-1:-1:-1;5843:316:1:o;6164:260::-;6232:6;6240;6293:2;6281:9;6272:7;6268:23;6264:32;6261:52;;;6309:1;6306;6299:12;6261:52;6332:29;6351:9;6332:29;:::i;:::-;6322:39;;6380:38;6414:2;6403:9;6399:18;6380:38;:::i;:::-;6370:48;;6164:260;;;;;:::o;6429:380::-;6508:1;6504:12;;;;6551;;;6572:61;;6626:4;6618:6;6614:17;6604:27;;6572:61;6679:2;6671:6;6668:14;6648:18;6645:38;6642:161;;6725:10;6720:3;6716:20;6713:1;6706:31;6760:4;6757:1;6750:15;6788:4;6785:1;6778:15;6642:161;;6429:380;;;:::o;7647:127::-;7708:10;7703:3;7699:20;7696:1;7689:31;7739:4;7736:1;7729:15;7763:4;7760:1;7753:15;8541:128;8608:9;;;8629:11;;;8626:37;;;8643:18;;:::i;8674:127::-;8735:10;8730:3;8726:20;8723:1;8716:31;8766:4;8763:1;8756:15;8790:4;8787:1;8780:15;8806:112;8838:1;8864;8854:35;;8869:18;;:::i;:::-;-1:-1:-1;8903:9:1;;8806:112::o;8923:168::-;8963:7;9029:1;9025;9021:6;9017:14;9014:1;9011:21;9006:1;8999:9;8992:17;8988:45;8985:71;;;9036:18;;:::i;:::-;-1:-1:-1;9076:9:1;;8923:168::o;9096:120::-;9136:1;9162;9152:35;;9167:18;;:::i;:::-;-1:-1:-1;9201:9:1;;9096:120::o;9221:1492::-;-1:-1:-1;;;9925:3:1;9918:24;9900:3;9971:6;9965:13;9987:74;10054:6;10050:1;10045:3;10041:11;10034:4;10026:6;10022:17;9987:74;:::i;:::-;-1:-1:-1;;;10120:1:1;10080:16;;;10112:10;;;10105:30;10160:13;;10182:76;10160:13;10244:2;10236:11;;10229:4;10217:17;;10182:76;:::i;:::-;-1:-1:-1;;;10318:2:1;10277:17;;;;10310:11;;;10303:30;10358:13;;10380:76;10358:13;10442:2;10434:11;;10427:4;10415:17;;10380:76;:::i;:::-;-1:-1:-1;;;10516:2:1;10475:17;;;;10508:11;;;10501:41;10567:13;;10589:76;10567:13;10651:2;10643:11;;10636:4;10624:17;;10589:76;:::i;:::-;10685:17;10704:2;10681:26;;9221:1492;-1:-1:-1;;;;;;9221:1492:1:o;10718:410::-;10920:2;10902:21;;;10959:2;10939:18;;;10932:30;10998:34;10993:2;10978:18;;10971:62;-1:-1:-1;;;11064:2:1;11049:18;;11042:44;11118:3;11103:19;;10718:410::o;11545:404::-;11747:2;11729:21;;;11786:2;11766:18;;;11759:30;11825:34;11820:2;11805:18;;11798:62;-1:-1:-1;;;11891:2:1;11876:18;;11869:38;11939:3;11924:19;;11545:404::o;11954:347::-;12156:2;12138:21;;;12195:2;12175:18;;;12168:30;12234:25;12229:2;12214:18;;12207:53;12292:2;12277:18;;11954:347::o;13014:136::-;13053:3;13081:5;13071:39;;13090:18;;:::i;:::-;-1:-1:-1;;;13126:18:1;;13014:136::o;13850:356::-;14052:2;14034:21;;;14071:18;;;14064:30;14130:34;14125:2;14110:18;;14103:62;14197:2;14182:18;;13850:356::o;14211:135::-;14250:3;14271:17;;;14268:43;;14291:18;;:::i;:::-;-1:-1:-1;14338:1:1;14327:13;;14211:135::o;14703:449::-;-1:-1:-1;;;14960:3:1;14953:32;14935:3;15014:6;15008:13;15030:75;15098:6;15093:2;15088:3;15084:12;15077:4;15069:6;15065:17;15030:75;:::i;:::-;15125:16;;;;15143:2;15121:25;;14703:449;-1:-1:-1;;14703:449:1:o;15157:354::-;15359:2;15341:21;;;15398:2;15378:18;;;15371:30;15437:32;15432:2;15417:18;;15410:60;15502:2;15487:18;;15157:354::o;15726:343::-;15928:2;15910:21;;;15967:2;15947:18;;;15940:30;-1:-1:-1;;;16001:2:1;15986:18;;15979:49;16060:2;16045:18;;15726:343::o;17200:351::-;17402:2;17384:21;;;17441:2;17421:18;;;17414:30;17480:29;17475:2;17460:18;;17453:57;17542:2;17527:18;;17200:351::o;18747:722::-;18797:3;18838:5;18832:12;18867:36;18893:9;18867:36;:::i;:::-;18922:1;18939:18;;;18966:133;;;;19113:1;19108:355;;;;18932:531;;18966:133;-1:-1:-1;;18999:24:1;;18987:37;;19072:14;;19065:22;19053:35;;19044:45;;;-1:-1:-1;18966:133:1;;19108:355;19139:5;19136:1;19129:16;19168:4;19213:2;19210:1;19200:16;19238:1;19252:165;19266:6;19263:1;19260:13;19252:165;;;19344:14;;19331:11;;;19324:35;19387:16;;;;19281:10;;19252:165;;;19256:3;;;19446:6;19441:3;19437:16;19430:23;;18932:531;;;;;18747:722;;;;:::o;19474:1082::-;19926:3;19954:38;19988:3;19980:6;19954:38;:::i;:::-;20021:6;20015:13;20037:65;20095:6;20091:2;20084:4;20076:6;20072:17;20037:65;:::i;:::-;-1:-1:-1;;;20124:15:1;;20148:18;;;20191:13;;20213:78;20191:13;20278:1;20267:13;;20260:4;20248:17;;20213:78;:::i;:::-;20355:13;;20310:20;;;20377:75;20355:13;20439:1;20431:10;;20424:4;20412:17;;20377:75;:::i;:::-;-1:-1:-1;;;20512:1:1;20471:17;;;;20504:10;;;20497:27;20548:1;20540:10;;19474:1082;-1:-1:-1;;;;;;19474:1082:1:o;20971:184::-;21041:6;21094:2;21082:9;21073:7;21069:23;21065:32;21062:52;;;21110:1;21107;21100:12;21062:52;-1:-1:-1;21133:16:1;;20971:184;-1:-1:-1;20971:184:1:o;21160:245::-;21227:6;21280:2;21268:9;21259:7;21255:23;21251:32;21248:52;;;21296:1;21293;21286:12;21248:52;21328:9;21322:16;21347:28;21369:5;21347:28;:::i;22453:496::-;22632:3;22670:6;22664:13;22686:66;22745:6;22740:3;22733:4;22725:6;22721:17;22686:66;:::i;:::-;22815:13;;22774:16;;;;22837:70;22815:13;22774:16;22884:4;22872:17;;22837:70;:::i;:::-;22923:20;;22453:496;-1:-1:-1;;;;22453:496:1:o;24406:1415::-;24931:3;24969:6;24963:13;24985:66;25044:6;25039:3;25032:4;25024:6;25020:17;24985:66;:::i;:::-;-1:-1:-1;;;25073:16:1;;;25098:18;;;25141:13;;25163:78;25141:13;25228:1;25217:13;;25210:4;25198:17;;25163:78;:::i;:::-;25305:13;;25260:20;;;25327:75;25305:13;25389:1;25381:10;;25374:4;25362:17;;25327:75;:::i;:::-;25463:13;;25421:17;;;25485:75;25463:13;25547:1;25539:10;;25532:4;25520:17;;25485:75;:::i;:::-;25621:13;;25579:17;;;25643:75;25621:13;25705:1;25697:10;;25690:4;25678:17;;25643:75;:::i;:::-;-1:-1:-1;;;25778:1:1;25737:17;;;;25770:10;;;25763:26;25813:1;25805:10;;24406:1415;-1:-1:-1;;;;;;;24406:1415:1:o;26637:197::-;26765:3;26790:38;26824:3;26816:6;26790:38;:::i;26839:545::-;26941:2;26936:3;26933:11;26930:448;;;26977:1;27002:5;26998:2;26991:17;27047:4;27043:2;27033:19;27117:2;27105:10;27101:19;27098:1;27094:27;27088:4;27084:38;27153:4;27141:10;27138:20;27135:47;;;-1:-1:-1;27176:4:1;27135:47;27231:2;27226:3;27222:12;27219:1;27215:20;27209:4;27205:31;27195:41;;27286:82;27304:2;27297:5;27294:13;27286:82;;;27349:17;;;27330:1;27319:13;27286:82;;;27290:3;;;26839:545;;;:::o;27560:1352::-;27686:3;27680:10;27713:18;27705:6;27702:30;27699:56;;;27735:18;;:::i;:::-;27764:97;27854:6;27814:38;27846:4;27840:11;27814:38;:::i;:::-;27808:4;27764:97;:::i;:::-;27916:4;;27980:2;27969:14;;27997:1;27992:663;;;;28699:1;28716:6;28713:89;;;-1:-1:-1;28768:19:1;;;28762:26;28713:89;-1:-1:-1;;27517:1:1;27513:11;;;27509:24;27505:29;27495:40;27541:1;27537:11;;;27492:57;28815:81;;27962:944;;27992:663;18694:1;18687:14;;;18731:4;18718:18;;-1:-1:-1;;28028:20:1;;;28146:236;28160:7;28157:1;28154:14;28146:236;;;28249:19;;;28243:26;28228:42;;28341:27;;;;28309:1;28297:14;;;;28176:19;;28146:236;;;28150:3;28410:6;28401:7;28398:19;28395:201;;;28471:19;;;28465:26;-1:-1:-1;;28554:1:1;28550:14;;;28566:3;28546:24;28542:37;28538:42;28523:58;28508:74;;28395:201;-1:-1:-1;;;;;28642:1:1;28626:14;;;28622:22;28609:36;;-1:-1:-1;27560:1352:1:o;28917:548::-;29183:3;29211:38;29245:3;29237:6;29211:38;:::i;:::-;29278:6;29272:13;29294:65;29352:6;29348:2;29341:4;29333:6;29329:17;29294:65;:::i;:::-;-1:-1:-1;;;29381:15:1;;29405:25;;;29457:1;29446:13;;28917:548;-1:-1:-1;;;;28917:548:1:o;29470:422::-;29559:1;29602:5;29559:1;29616:270;29637:7;29627:8;29624:21;29616:270;;;29696:4;29692:1;29688:6;29684:17;29678:4;29675:27;29672:53;;;29705:18;;:::i;:::-;29755:7;29745:8;29741:22;29738:55;;;29775:16;;;;29738:55;29854:22;;;;29814:15;;;;29616:270;;;29620:3;29470:422;;;;;:::o;29897:806::-;29946:5;29976:8;29966:80;;-1:-1:-1;30017:1:1;30031:5;;29966:80;30065:4;30055:76;;-1:-1:-1;30102:1:1;30116:5;;30055:76;30147:4;30165:1;30160:59;;;;30233:1;30228:130;;;;30140:218;;30160:59;30190:1;30181:10;;30204:5;;;30228:130;30265:3;30255:8;30252:17;30249:43;;;30272:18;;:::i;:::-;-1:-1:-1;;30328:1:1;30314:16;;30343:5;;30140:218;;30442:2;30432:8;30429:16;30423:3;30417:4;30414:13;30410:36;30404:2;30394:8;30391:16;30386:2;30380:4;30377:12;30373:35;30370:77;30367:159;;;-1:-1:-1;30479:19:1;;;30511:5;;30367:159;30558:34;30583:8;30577:4;30558:34;:::i;:::-;30628:6;30624:1;30620:6;30616:19;30607:7;30604:32;30601:58;;;30639:18;;:::i;:::-;30677:20;;29897:806;-1:-1:-1;;;29897:806:1:o;30708:131::-;30768:5;30797:36;30824:8;30818:4;30797:36;:::i;31613:414::-;31815:2;31797:21;;;31854:2;31834:18;;;31827:30;31893:34;31888:2;31873:18;;31866:62;-1:-1:-1;;;31959:2:1;31944:18;;31937:48;32017:3;32002:19;;31613:414::o;32032:678::-;-1:-1:-1;;32415:2:1;32411:15;;;32407:24;;32395:37;;32466:15;;;;32462:24;;;32457:2;32448:12;;32441:46;32512:2;32503:12;;32496:28;;;;32549:2;32540:12;;32533:28;;;;32586:3;32577:13;;32570:29;32624:3;32615:13;;32608:29;32662:3;32653:13;;32646:29;32700:3;32691:13;;32032:678::o;32715:127::-;32776:10;32771:3;32767:20;32764:1;32757:31;32807:4;32804:1;32797:15;32831:4;32828:1;32821:15;34719:489;-1:-1:-1;;;;;34988:15:1;;;34970:34;;35040:15;;35035:2;35020:18;;35013:43;35087:2;35072:18;;35065:34;;;35135:3;35130:2;35115:18;;35108:31;;;34913:4;;35156:46;;35182:19;;35174:6;35156:46;:::i;:::-;35148:54;34719:489;-1:-1:-1;;;;;;34719:489:1:o;35213:249::-;35282:6;35335:2;35323:9;35314:7;35310:23;35306:32;35303:52;;;35351:1;35348;35341:12;35303:52;35383:9;35377:16;35402:30;35426:5;35402:30;:::i;35870:127::-;35931:10;35926:3;35922:20;35919:1;35912:31;35962:4;35959:1;35952:15;35986:4;35983:1;35976:15
Swarm Source
ipfs://27faa2a16de9aefe6df03878ffea4484ab9187d21979ba8fa56e0a5eaec170c2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.