ERC-721
Overview
Max Total Supply
1,259 ANON
Holders
294
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 ANONLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ANONMODE
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; import "./ECDSA.sol"; import "./EIP712.sol"; import "./Payment.sol"; contract ANONMODE is ERC721Enumerable, EIP712, Ownable, Payment { using Strings for uint256; string public baseURI; //signature string private constant SINGING_DOMAIN = "ANONMODE"; string private constant SIGNATURE_VERSION = "1"; //settings uint256 public maxSupply = 8888; bool public whitelist1Status = false; bool public whitelist2Status = false; bool public whitelist3Status = false; bool public publicStatus = false; uint256 private priceWhitelist1 = 0.035 ether; uint256 private priceWhitelist2 = 0.045 ether; uint256 private priceWhitelist3 = 0.055 ether; uint256 private pricePublic = 0.07 ether; uint256 public maxMintPerTxWhitelist1 = 7; uint256 public maxMintPerTxWhitelist2 = 7; uint256 public maxMintPerTxWhitelist3 = 7; uint256 public maxMintPerTxPublic = 7; uint256 public maxMintPerWalletWhitelist1 = 7; uint256 public maxMintPerWalletWhitelist2 = 7; uint256 public maxMintPerWalletWhitelist3 = 7; //mappings mapping(address => uint256) private mintCountMapWhitelist1; mapping(address => uint256) private allowedMintCountMapWhitelist1; mapping(address => uint256) private mintCountMapWhitelist2; mapping(address => uint256) private allowedMintCountMapWhitelist2; mapping(address => uint256) private mintCountMapWhitelist3; mapping(address => uint256) private allowedMintCountMapWhitelist3; //shares address[] private addressList = [ 0x355c000d78F087821517378e5be3f13dB29b9014, 0x5a1a77e341D751451793B8E061dC47AFD24a1092, 0xEcc03efB7C0A7BD09A5cC7e954Ac42E8f949A0B5 ]; uint[] private shareList = [73, 7, 20]; constructor( string memory _name, string memory _symbol, string memory _initBaseURI ) ERC721(_name, _symbol) EIP712(SINGING_DOMAIN, SIGNATURE_VERSION) Payment(addressList, shareList) { setURI(_initBaseURI); } function mintWhitelist1(uint256 _tokenAmount, string memory name, bytes memory signature) public payable { uint256 s = totalSupply(); require(check(name, signature) == msg.sender, "Signature Invalid"); //server side signature require(whitelist1Status,"Public sale is not active"); require(_tokenAmount > 0, "Mint more than 0" ); require(_tokenAmount <= maxMintPerTxWhitelist1, "Mint less"); require( s + _tokenAmount <= maxSupply, "Mint less"); require(msg.value >= priceWhitelist1 * _tokenAmount, "ETH input is wrong"); require(allowedMintCountWhitelist1(msg.sender) == maxMintPerWalletWhitelist1,"You already minted"); //check if already minted for (uint256 i = 0; i < _tokenAmount + 1; ++i) { _safeMint(msg.sender, s + i, ""); } } function mintWhitelist2(uint256 _tokenAmount, string memory name, bytes memory signature) public payable { uint256 s = totalSupply(); require(check(name, signature) == msg.sender, "Signature Invalid"); //server side signature require(whitelist2Status,"Public sale is not active"); require(_tokenAmount > 0, "Mint more than 0" ); require(_tokenAmount <= maxMintPerTxWhitelist2, "Mint less"); require( s + _tokenAmount <= maxSupply, "Mint less"); require(msg.value >= priceWhitelist2 * _tokenAmount, "ETH input is wrong"); require(allowedMintCountWhitelist2(msg.sender) >= 1,"You minted too many"); for (uint256 i = 0; i < _tokenAmount; ++i) { _safeMint(msg.sender, s + i, ""); } delete s; updateMintCountWhitelist2(msg.sender, _tokenAmount); } function mintWhitelist3(uint256 _tokenAmount, string memory name, bytes memory signature) public payable { uint256 s = totalSupply(); require(check(name, signature) == msg.sender, "Signature Invalid"); //server side signature require(whitelist3Status,"Public sale is not active"); require(_tokenAmount > 0, "Mint more than 0" ); require(_tokenAmount <= maxMintPerTxWhitelist3, "Mint less"); require( s + _tokenAmount <= maxSupply, "Mint less"); require(msg.value >= priceWhitelist3 * _tokenAmount, "ETH input is wrong"); require(allowedMintCountWhitelist3(msg.sender) >= 1,"You minted too many"); for (uint256 i = 0; i < _tokenAmount; ++i) { _safeMint(msg.sender, s + i, ""); } delete s; updateMintCountWhitelist3(msg.sender, _tokenAmount); } function mintPublic(uint256 _tokenAmount) public payable { uint256 s = totalSupply(); require(publicStatus,"Public sale is not active"); require(_tokenAmount > 0, "Mint more than 0" ); require(_tokenAmount <= maxMintPerTxPublic, "Mint less"); require( s + _tokenAmount <= maxSupply, "Mint less"); require(msg.value >= pricePublic * _tokenAmount, "ETH input is wrong"); for (uint256 i = 0; i < _tokenAmount; ++i) { _safeMint(msg.sender, s + i, ""); } delete s; } // admin minting function gift(uint[] calldata gifts, address[] calldata recipient) external onlyOwner{ require(gifts.length == recipient.length); uint g = 0; uint256 s = totalSupply(); for(uint i = 0; i < gifts.length; ++i){ g += gifts[i]; } require( s + g <= maxSupply, "Too many" ); delete g; for(uint i = 0; i < recipient.length; ++i){ for(uint j = 0; j < gifts[i]; ++j){ _safeMint( recipient[i], s++, "" ); } } delete s; } function check(string memory name, bytes memory signature) public view returns (address) { return _verify( name, signature); } function _verify(string memory name, bytes memory signature) internal view returns (address) { bytes32 digest = _hash(name); return ECDSA.recover(digest, signature); } function _hash(string memory name) internal view returns (bytes32) { return _hashTypedDataV4(keccak256(abi.encode( keccak256("Web3Struct(string name)"), keccak256(bytes(name)) ))); } //allow list + max per wallet counters function allowedMintCountWhitelist1(address minter) public view returns (uint256) { return maxMintPerWalletWhitelist1 - mintCountMapWhitelist1[minter]; } function allowedMintCountWhitelist2(address minter) public view returns (uint256) { return maxMintPerWalletWhitelist2 - mintCountMapWhitelist2[minter]; } function allowedMintCountWhitelist3(address minter) public view returns (uint256) { return maxMintPerWalletWhitelist3 - mintCountMapWhitelist3[minter]; } function updateMintCountWhitelist1(address minter, uint256 count) private { mintCountMapWhitelist1[minter] += count; } function updateMintCountWhitelist2(address minter, uint256 count) private { mintCountMapWhitelist2[minter] += count; } function updateMintCountWhitelist3(address minter, uint256 count) private { mintCountMapWhitelist3[minter] += count; } //read metadata function _baseURI() internal view virtual returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId <= maxSupply); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : ""; } //price switch function setPriceWL1(uint256 _newPrice) public onlyOwner { priceWhitelist1 = _newPrice; } function setPriceWL2(uint256 _newPrice) public onlyOwner { priceWhitelist2 = _newPrice; } function setPriceWL3(uint256 _newPrice) public onlyOwner { priceWhitelist3 = _newPrice; } function setPricePublic(uint256 _newPrice) public onlyOwner { pricePublic = _newPrice; } //max switch function setMaxPerTxWhitelist1(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerTxWhitelist1 = _newMaxMintAmount; } function setMaxPerTxWhitelist2(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerTxWhitelist2 = _newMaxMintAmount; } function setMaxPerTxWhitelist3(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerTxWhitelist3 = _newMaxMintAmount; } function setMaxPerTxPublic(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerTxPublic = _newMaxMintAmount; } //max switch function setMaxPerWalletWhitelist1(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWalletWhitelist1 = _newMaxMintAmount; } function setMaxPerWalletWhitelist2(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWalletWhitelist2 = _newMaxMintAmount; } function setMaxPerWalletWhitelist3(uint256 _newMaxMintAmount) public onlyOwner { maxMintPerWalletWhitelist3 = _newMaxMintAmount; } //onoff switch function setWhitelist1(bool _wlstatus) public onlyOwner { whitelist1Status = _wlstatus; } function setWhitelist2(bool _wlstatus) public onlyOwner { whitelist2Status = _wlstatus; } function setWhitelist3(bool _wlstatus) public onlyOwner { whitelist3Status = _wlstatus; } function setP(bool _pstatus) public onlyOwner { publicStatus = _pstatus; } //write metadata function setURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @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) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ 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. 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 if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } 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)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.10; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; string private _name; string private _symbol; address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count = 0; uint length = _owners.length; for( uint i = 0; i < length; ++i ){ if( owner == _owners[i] ){ ++count; } } delete length; return count; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } 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"); } function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } 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" ); } 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); _owners.push(to); emit Transfer(address(0), to, tokenId); } function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _owners[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.10; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) { require(index < ERC721.balanceOf(owner), "ERC721Enum: owner ioob"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ){ if( count == index ) return i; else ++count; } } require(false, "ERC721Enum: owner ioob"); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { require(0 < ERC721.balanceOf(owner), "ERC721Enum: owner ioob"); uint256 tokenCount = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } return tokenIds; } function totalSupply() public view virtual override returns (uint256) { return _owners.length; } function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enum: global ioob"); return index; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract Guard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier noRentry() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Address.sol"; import "./Context.sol"; import "./SafeMath.sol"; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. */ contract Payment is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + _totalReleased; uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account]; require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] = _released[account] + payment; _totalReleased = _totalReleased + payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCountWhitelist1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCountWhitelist2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"allowedMintCountWhitelist3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gifts","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxWhitelist1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxWhitelist2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxWhitelist3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWalletWhitelist1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWalletWhitelist2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWalletWhitelist3","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":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWhitelist1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWhitelist2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWhitelist3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerTxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerTxWhitelist1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerTxWhitelist2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerTxWhitelist3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWalletWhitelist1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWalletWhitelist2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxPerWalletWhitelist3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pstatus","type":"bool"}],"name":"setP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPricePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceWL1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceWL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceWL3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_wlstatus","type":"bool"}],"name":"setWhitelist1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_wlstatus","type":"bool"}],"name":"setWhitelist2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_wlstatus","type":"bool"}],"name":"setWhitelist3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelist1Status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist2Status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist3Status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6122b8600c55600d805463ffffffff19169055667c585087238000600e55669fdf42f6e48000600f5566c3663566a5800060105566f8b0a10e47000060115560076012819055601381905560148190556015819055601681905560178190556018556101a060405273355c000d78f087821517378e5be3f13db29b9014610140908152735a1a77e341d751451793b8e061dc47afd24a10926101605273ecc03efb7c0a7bd09a5cc7e954ac42e8f949a0b561018052620000c490601f906003620006e1565b5060408051606081018252604981526007602080830191909152601492820192909252620000f5919060036200074b565b503480156200010357600080fd5b5060405162005521380380620055218339810160408190526200012691620008ef565b601f8054806020026020016040519081016040528092919081815260200182805480156200017e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200015f575b50505050506020805480602002602001604051908101604052809291908181526020018280548015620001d157602002820191906000526020600020905b815481526020019060010190808311620001bc575b505050505060405180604001604052806008815260200167414e4f4e4d4f444560c01b815250604051806040016040528060018152602001603160f81b815250868681600090805190602001906200022b9291906200078e565b508051620002419060019060208401906200078e565b5050825160209384012082519284019290922060e08390526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301979097526060810194909452608080850193909352308483018190528151808603909301835260c0948501909152815191909601209052929092526101205250620002de336200042c565b8051825114620003505760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620003a35760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000347565b60005b82518110156200040f57620003fa838281518110620003c957620003c962000980565b6020026020010151838381518110620003e657620003e662000980565b60200260200101516200047e60201b60201c565b806200040681620009ac565b915050620003a6565b50505062000423816200066c60201b60201c565b50505062000a22565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004eb5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000347565b600081116200053d5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000347565b6001600160a01b03821660009081526008602052604090205415620005b95760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000347565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038416908117909155600090815260086020526040902081905560065462000623908290620009ca565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6005546001600160a01b03163314620006c85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000347565b8051620006dd90600b9060208401906200078e565b5050565b82805482825590600052602060002090810192821562000739579160200282015b828111156200073957825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000702565b50620007479291506200080b565b5090565b82805482825590600052602060002090810192821562000739579160200282015b8281111562000739578251829060ff169055916020019190600101906200076c565b8280546200079c90620009e5565b90600052602060002090601f016020900481019282620007c0576000855562000739565b82601f10620007db57805160ff191683800117855562000739565b8280016001018555821562000739579182015b8281111562000739578251825591602001919060010190620007ee565b5b808211156200074757600081556001016200080c565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200084a57600080fd5b81516001600160401b038082111562000867576200086762000822565b604051601f8301601f19908116603f0116810190828211818310171562000892576200089262000822565b81604052838152602092508683858801011115620008af57600080fd5b600091505b83821015620008d35785820183015181830184015290820190620008b4565b83821115620008e55760008385830101525b9695505050505050565b6000806000606084860312156200090557600080fd5b83516001600160401b03808211156200091d57600080fd5b6200092b8783880162000838565b945060208601519150808211156200094257600080fd5b620009508783880162000838565b935060408601519150808211156200096757600080fd5b50620009768682870162000838565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620009c357620009c362000996565b5060010190565b60008219821115620009e057620009e062000996565b500190565b600181811c90821680620009fa57607f821691505b6020821081141562000a1c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051614aaf62000a726000396000613ff8015260006140470152600061402201526000613f7b01526000613fa501526000613fcf0152614aaf6000f3fe6080604052600436106103e25760003560e01c806384a303d61161020d578063d085c6cf11610128578063e33b7de3116100bb578063efd0cbf91161008a578063f452472e1161006f578063f452472e14610bf4578063f91798b114610c14578063f923fcb314610c3557600080fd5b8063efd0cbf914610bc1578063f2fde38b14610bd457600080fd5b8063e33b7de314610b16578063e6b2bff114610b2b578063e985e9c514610b4b578063ef08acae14610ba157600080fd5b8063d5f56270116100f7578063d5f5627014610aaa578063d75d65aa14610ac0578063d7c9ed6914610ae0578063df0cb35014610af657600080fd5b8063d085c6cf14610a48578063d48a89d514610a5e578063d5abeb0114610a74578063d5d385a114610a8a57600080fd5b8063a7c587ee116101a0578063b88d4fde1161016f578063b88d4fde146109a5578063c87b56dd146109c5578063cce62b9d146109e5578063ce7c2ac214610a0557600080fd5b8063a7c587ee1461093c578063ac9384b91461095c578063b465a5d314610972578063b8822e581461099257600080fd5b806395d89b41116101dc57806395d89b41146108a457806396ea3a47146108b95780639852595c146108d9578063a22cb4651461091c57600080fd5b806384a303d6146108195780638618329f146108395780638b83209b146108595780638da5cb5b1461087957600080fd5b80633af4c280116102fd5780636352211e1161029057806370a082311161025f57806370a0823114610797578063715018a6146107b757806380e1299e146107cc5780638462151c146107ec57600080fd5b80636352211e14610739578063692f2d1f146107595780636c0360eb1461076f5780636dea1bb11461078457600080fd5b80634530a832116102cc5780634530a832146106c657806348808c10146106e65780634a56491e146107065780634f6ccce71461071957600080fd5b80633af4c2801461065f5780633c36d7d61461067e5780633ccfd60b1461069e57806342842e0e146106a657600080fd5b8063191655871161037557806323b872dd1161034457806323b872dd146105f05780632f13e710146106105780632f745c591461062a5780633a98ef391461064a57600080fd5b8063191655871461057a5780631bba917d1461059a5780631cab9555146105ba578063237e0778146105d057600080fd5b8063081812fc116103b1578063081812fc146104d6578063095ea7b31461051b57806309a9bcbd1461053b57806318160ddd1461055b57600080fd5b806301ffc9a71461043d578063022d8ac81461047257806302fe53051461049457806306fdde03146104b457600080fd5b36610438577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770336040805173ffffffffffffffffffffffffffffffffffffffff90921682523460208301520160405180910390a1005b600080fd5b34801561044957600080fd5b5061045d6104583660046142bd565b610c55565b60405190151581526020015b60405180910390f35b34801561047e57600080fd5b5061049261048d3660046142da565b610cb1565b005b3480156104a057600080fd5b506104926104af3660046143cd565b610d22565b3480156104c057600080fd5b506104c9610da0565b6040516104699190614478565b3480156104e257600080fd5b506104f66104f13660046142da565b610e32565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610469565b34801561052757600080fd5b506104926105363660046144ad565b610ed8565b34801561054757600080fd5b50600d5461045d9062010000900460ff1681565b34801561056757600080fd5b506002545b604051908152602001610469565b34801561058657600080fd5b506104926105953660046144d9565b611031565b3480156105a657600080fd5b506104926105b53660046142da565b61126c565b3480156105c657600080fd5b5061056c60135481565b3480156105dc57600080fd5b506104926105eb3660046142da565b6112d8565b3480156105fc57600080fd5b5061049261060b3660046144f6565b611344565b34801561061c57600080fd5b50600d5461045d9060ff1681565b34801561063657600080fd5b5061056c6106453660046144ad565b6113cb565b34801561065657600080fd5b5060065461056c565b34801561066b57600080fd5b50600d5461045d90610100900460ff1681565b34801561068a57600080fd5b506104926106993660046142da565b6114e7565b610492611553565b3480156106b257600080fd5b506104926106c13660046144f6565b611612565b3480156106d257600080fd5b506104926106e13660046142da565b61162d565b3480156106f257600080fd5b506104f6610701366004614537565b611699565b61049261071436600461459b565b6116ac565b34801561072557600080fd5b5061056c6107343660046142da565b611984565b34801561074557600080fd5b506104f66107543660046142da565b6119e1565b34801561076557600080fd5b5061056c60165481565b34801561077b57600080fd5b506104c9611a8e565b61049261079236600461459b565b611b1c565b3480156107a357600080fd5b5061056c6107b23660046144d9565b611dd6565b3480156107c357600080fd5b50610492611ed5565b3480156107d857600080fd5b5061056c6107e73660046144d9565b611f48565b3480156107f857600080fd5b5061080c6108073660046144d9565b611f7b565b6040516104699190614608565b34801561082557600080fd5b50610492610834366004614661565b612075565b34801561084557600080fd5b5061056c6108543660046144d9565b612115565b34801561086557600080fd5b506104f66108743660046142da565b612148565b34801561088557600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166104f6565b3480156108b057600080fd5b506104c9612185565b3480156108c557600080fd5b506104926108d43660046146c1565b612194565b3480156108e557600080fd5b5061056c6108f43660046144d9565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b34801561092857600080fd5b5061049261093736600461472d565b612359565b34801561094857600080fd5b50610492610957366004614661565b612456565b34801561096857600080fd5b5061056c60155481565b34801561097e57600080fd5b5061049261098d3660046142da565b6124f5565b6104926109a036600461459b565b612561565b3480156109b157600080fd5b506104926109c0366004614762565b61281f565b3480156109d157600080fd5b506104c96109e03660046142da565b6128a7565b3480156109f157600080fd5b50610492610a00366004614661565b612913565b348015610a1157600080fd5b5061056c610a203660046144d9565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205490565b348015610a5457600080fd5b5061056c60145481565b348015610a6a57600080fd5b5061056c60125481565b348015610a8057600080fd5b5061056c600c5481565b348015610a9657600080fd5b50610492610aa53660046142da565b6129b1565b348015610ab657600080fd5b5061056c60185481565b348015610acc57600080fd5b50610492610adb3660046142da565b612a1d565b348015610aec57600080fd5b5061056c60175481565b348015610b0257600080fd5b5061056c610b113660046144d9565b612a89565b348015610b2257600080fd5b5060075461056c565b348015610b3757600080fd5b50610492610b463660046142da565b612abc565b348015610b5757600080fd5b5061045d610b663660046147ce565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610bad57600080fd5b50610492610bbc366004614661565b612b28565b610492610bcf3660046142da565b612bc0565b348015610be057600080fd5b50610492610bef3660046144d9565b612daa565b348015610c0057600080fd5b50610492610c0f3660046142da565b612ea3565b348015610c2057600080fd5b50600d5461045d906301000000900460ff1681565b348015610c4157600080fd5b50610492610c503660046142da565b612f0f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610cab5750610cab82612f7b565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d1d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601255565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b8051610d9c90600b9060208401906141ff565b5050565b606060008054610daf90614807565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddb90614807565b8015610e285780601f10610dfd57610100808354040283529160200191610e28565b820191906000526020600020905b815481529060010190602001808311610e0b57829003601f168201915b5050505050905090565b6000610e3d8261305e565b610eaf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610d14565b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610ee3826119e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610d14565b3373ffffffffffffffffffffffffffffffffffffffff82161480610fb05750610fb08133610b66565b6110225760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d14565b61102c83836130c2565b505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600860205260409020546110c95760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610d14565b6000600754476110d9919061488a565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020908152604080832054600654600890935290832054939450919261111d90856148a2565b611127919061490e565b6111319190614922565b9050806111a65760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610d14565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020546111d790829061488a565b73ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205560075461120b90829061488a565b6007556112188382613162565b6040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146112d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601455565b60055473ffffffffffffffffffffffffffffffffffffffff16331461133f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601355565b61134e3382613288565b6113c05760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d14565b61102c8383836133c4565b60006113d683611dd6565b82106114245760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610d14565b6000805b60025481101561149e576002818154811061144557611445614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8681169116141561148e5783821415611482579150610cab9050565b61148b82614968565b91505b61149781614968565b9050611428565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610d14565b60055473ffffffffffffffffffffffffffffffffffffffff16331461154e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600f55565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b604051600090339047908381818185875af1925050503d80600081146115fc576040519150601f19603f3d011682016040523d82523d6000602084013e611601565b606091505b505090508061160f57600080fd5b50565b61102c8383836040518060200160405280600081525061281f565b60055473ffffffffffffffffffffffffffffffffffffffff1633146116945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601155565b60006116a58383613593565b9392505050565b60006116b760025490565b9050336116c48484611699565b73ffffffffffffffffffffffffffffffffffffffff16146117275760405162461bcd60e51b815260206004820152601160248201527f5369676e617475726520496e76616c69640000000000000000000000000000006044820152606401610d14565b600d54610100900460ff1661177e5760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b600084116117ce5760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b6013548411156118205760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c5461182d858361488a565b111561187b5760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b83600f5461188991906148a2565b3410156118d85760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b60016118e333612a89565b10156119315760405162461bcd60e51b815260206004820152601360248201527f596f75206d696e74656420746f6f206d616e79000000000000000000000000006044820152606401610d14565b60005b8481101561196f5761195f3361194a838561488a565b604051806020016040528060008152506135ab565b61196881614968565b9050611934565b506000905061197e3385613634565b50505050565b600061198f60025490565b82106119dd5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610d14565b5090565b600080600283815481106119f7576119f7614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905080610cab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610d14565b600b8054611a9b90614807565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac790614807565b8015611b145780601f10611ae957610100808354040283529160200191611b14565b820191906000526020600020905b815481529060010190602001808311611af757829003601f168201915b505050505081565b6000611b2760025490565b905033611b348484611699565b73ffffffffffffffffffffffffffffffffffffffff1614611b975760405162461bcd60e51b815260206004820152601160248201527f5369676e617475726520496e76616c69640000000000000000000000000000006044820152606401610d14565b600d5460ff16611be95760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b60008411611c395760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b601254841115611c8b5760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c54611c98858361488a565b1115611ce65760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b83600e54611cf491906148a2565b341015611d435760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b601654611d4f33612115565b14611d9c5760405162461bcd60e51b815260206004820152601260248201527f596f7520616c7265616479206d696e74656400000000000000000000000000006044820152606401610d14565b60005b611daa85600161488a565b811015611dcf57611dbf3361194a838561488a565b611dc881614968565b9050611d9f565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff8216611e615760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610d14565b600254600090815b81811015611ecc5760028181548110611e8457611e84614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415611ebc57611eb983614968565b92505b611ec581614968565b9050611e69565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611f3c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b611f466000613672565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601d6020526040812054601854610cab9190614922565b6060611f8682611dd6565b600010611fd55760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610d14565b6000611fe083611dd6565b905060008167ffffffffffffffff811115611ffd57611ffd6142f3565b604051908082528060200260200182016040528015612026578160200160208202803683370190505b50905060005b8281101561206d5761203e85826113cb565b82828151811061205057612050614939565b60209081029190910101528061206581614968565b91505061202c565b509392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146120dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d80549115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260196020526040812054601654610cab9190614922565b6000600a828154811061215d5761215d614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692915050565b606060018054610daf90614807565b60055473ffffffffffffffffffffffffffffffffffffffff1633146121fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b82811461220757600080fd5b60008061221360025490565b905060005b858110156122565786868281811061223257612232614939565b9050602002013583612244919061488a565b925061224f81614968565b9050612218565b50600c54612264838361488a565b11156122b25760405162461bcd60e51b815260206004820152600860248201527f546f6f206d616e790000000000000000000000000000000000000000000000006044820152606401610d14565b6000915060005b838110156123505760005b8787838181106122d6576122d6614939565b9050602002013581101561233f5761232f8686848181106122f9576122f9614939565b905060200201602081019061230e91906144d9565b8461231881614968565b9550604051806020016040528060008152506135ab565b61233881614968565b90506122c4565b5061234981614968565b90506122b9565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156123bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d14565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146124bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461255c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601055565b600061256c60025490565b9050336125798484611699565b73ffffffffffffffffffffffffffffffffffffffff16146125dc5760405162461bcd60e51b815260206004820152601160248201527f5369676e617475726520496e76616c69640000000000000000000000000000006044820152606401610d14565b600d5462010000900460ff166126345760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b600084116126845760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b6014548411156126d65760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c546126e3858361488a565b11156127315760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b8360105461273f91906148a2565b34101561278e5760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b600161279933611f48565b10156127e75760405162461bcd60e51b815260206004820152601360248201527f596f75206d696e74656420746f6f206d616e79000000000000000000000000006044820152606401610d14565b60005b84811015612810576128003361194a838561488a565b61280981614968565b90506127ea565b506000905061197e33856136e9565b6128293383613288565b61289b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d14565b61197e8484848461371e565b6060600c548211156128b857600080fd5b60006128c26137a7565b905060008151116128e257604051806020016040528060008152506116a5565b806128ec846137b6565b6040516020016128fd9291906149a1565b6040516020818303038152906040529392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461297a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601855565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601655565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601b6020526040812054601754610cab9190614922565b60055473ffffffffffffffffffffffffffffffffffffffff163314612b235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601755565b60055473ffffffffffffffffffffffffffffffffffffffff163314612b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000612bcb60025490565b600d549091506301000000900460ff16612c275760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b60008211612c775760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b601554821115612cc95760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c54612cd6838361488a565b1115612d245760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b81601154612d3291906148a2565b341015612d815760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b60005b8281101561102c57612d9a3361194a838561488a565b612da381614968565b9050612d84565b60055473ffffffffffffffffffffffffffffffffffffffff163314612e115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b73ffffffffffffffffffffffffffffffffffffffff8116612e9a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d14565b61160f81613672565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601555565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061300e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610cab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610cab565b60025460009082108015610cab5750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061309857613098614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061311c826119e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156131b25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d14565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461320c576040519150601f19603f3d011682016040523d82523d6000602084013e613211565b606091505b505090508061102c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d14565b60006132938261305e565b6133055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610d14565b6000613310836119e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061337f57508373ffffffffffffffffffffffffffffffffffffffff1661336784610e32565b73ffffffffffffffffffffffffffffffffffffffff16145b806133bc575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166133e4826119e1565b73ffffffffffffffffffffffffffffffffffffffff161461346d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610d14565b73ffffffffffffffffffffffffffffffffffffffff82166134f55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610d14565b6135006000826130c2565b816002828154811061351457613514614939565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60008061359f846138e8565b90506133bc818461394b565b6135b58383613967565b6135c26000848484613ac1565b61102c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d14565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601b60205260408120805483929061366990849061488a565b90915550505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601d60205260408120805483929061366990849061488a565b6137298484846133c4565b61373584848484613ac1565b61197e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d14565b6060600b8054610daf90614807565b6060816137f657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613820578061380a81614968565b91506138199050600a8361490e565b91506137fa565b60008167ffffffffffffffff81111561383b5761383b6142f3565b6040519080825280601f01601f191660200182016040528015613865576020820181803683370190505b5090505b84156133bc5761387a600183614922565b9150613887600a866149d0565b61389290603061488a565b60f81b8183815181106138a7576138a7614939565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506138e1600a8661490e565b9450613869565b6000610cab7f28bcf37b3cf2bc5fb85e4153569e33942b67dedd3a52f5007e880261d298bb9c8380519060200120604051602001613930929190918252602082015260400190565b60405160208183030381529060405280519060200120613c97565b600080600061395a8585613d00565b9150915061206d81613d70565b73ffffffffffffffffffffffffffffffffffffffff82166139ca5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d14565b6139d38161305e565b15613a205760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d14565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15613c8c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613b389033908990889088906004016149e4565b6020604051808303816000875af1925050508015613b91575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613b8e91810190614a2d565b60015b613c41573d808015613bbf576040519150601f19603f3d011682016040523d82523d6000602084013e613bc4565b606091505b508051613c395760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d14565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506133bc565b506001949350505050565b6000610cab613ca4613f61565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080825160411415613d375760208301516040840151606085015160001a613d2b87828585614095565b94509450505050613d69565b825160401415613d615760208301516040840151613d568683836141ad565b935093505050613d69565b506000905060025b9250929050565b6000816004811115613d8457613d84614a4a565b1415613d8d5750565b6001816004811115613da157613da1614a4a565b1415613def5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d14565b6002816004811115613e0357613e03614a4a565b1415613e515760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d14565b6003816004811115613e6557613e65614a4a565b1415613ed95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d14565b6004816004811115613eed57613eed614a4a565b141561160f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d14565b60003073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015613fc757507f000000000000000000000000000000000000000000000000000000000000000046145b15613ff157507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156140cc57506000905060036141a4565b8460ff16601b141580156140e457508460ff16601c14155b156140f557506000905060046141a4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614149573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661419d576000600192509250506141a4565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816141e360ff86901c601b61488a565b90506141f187828885614095565b935093505050935093915050565b82805461420b90614807565b90600052602060002090601f01602090048101928261422d5760008555614273565b82601f1061424657805160ff1916838001178555614273565b82800160010185558215614273579182015b82811115614273578251825591602001919060010190614258565b506119dd9291505b808211156119dd576000815560010161427b565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461160f57600080fd5b6000602082840312156142cf57600080fd5b81356116a58161428f565b6000602082840312156142ec57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261433357600080fd5b813567ffffffffffffffff8082111561434e5761434e6142f3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614394576143946142f3565b816040528381528660208588010111156143ad57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156143df57600080fd5b813567ffffffffffffffff8111156143f657600080fd5b6133bc84828501614322565b60005b8381101561441d578181015183820152602001614405565b8381111561197e5750506000910152565b60008151808452614446816020860160208601614402565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116a5602083018461442e565b73ffffffffffffffffffffffffffffffffffffffff8116811461160f57600080fd5b600080604083850312156144c057600080fd5b82356144cb8161448b565b946020939093013593505050565b6000602082840312156144eb57600080fd5b81356116a58161448b565b60008060006060848603121561450b57600080fd5b83356145168161448b565b925060208401356145268161448b565b929592945050506040919091013590565b6000806040838503121561454a57600080fd5b823567ffffffffffffffff8082111561456257600080fd5b61456e86838701614322565b9350602085013591508082111561458457600080fd5b5061459185828601614322565b9150509250929050565b6000806000606084860312156145b057600080fd5b83359250602084013567ffffffffffffffff808211156145cf57600080fd5b6145db87838801614322565b935060408601359150808211156145f157600080fd5b506145fe86828701614322565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561464057835183529284019291840191600101614624565b50909695505050505050565b8035801515811461465c57600080fd5b919050565b60006020828403121561467357600080fd5b6116a58261464c565b60008083601f84011261468e57600080fd5b50813567ffffffffffffffff8111156146a657600080fd5b6020830191508360208260051b8501011115613d6957600080fd5b600080600080604085870312156146d757600080fd5b843567ffffffffffffffff808211156146ef57600080fd5b6146fb8883890161467c565b9096509450602087013591508082111561471457600080fd5b506147218782880161467c565b95989497509550505050565b6000806040838503121561474057600080fd5b823561474b8161448b565b91506147596020840161464c565b90509250929050565b6000806000806080858703121561477857600080fd5b84356147838161448b565b935060208501356147938161448b565b925060408501359150606085013567ffffffffffffffff8111156147b657600080fd5b6147c287828801614322565b91505092959194509250565b600080604083850312156147e157600080fd5b82356147ec8161448b565b915060208301356147fc8161448b565b809150509250929050565b600181811c9082168061481b57607f821691505b60208210811415614855577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561489d5761489d61485b565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148da576148da61485b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261491d5761491d6148df565b500490565b6000828210156149345761493461485b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561499a5761499a61485b565b5060010190565b600083516149b3818460208801614402565b8351908301906149c7818360208801614402565b01949350505050565b6000826149df576149df6148df565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614a23608083018461442e565b9695505050505050565b600060208284031215614a3f57600080fd5b81516116a58161428f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220bcf6951d7ed4f556a1de856882fd8cd1535000c97d9d4568cdf24aafca2b9ef264736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000008414e4f4e6d6f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004414e4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596b63634e353464555636613147385a7458644858736b67586d70517764504c67597851315a534c746d6b412f000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103e25760003560e01c806384a303d61161020d578063d085c6cf11610128578063e33b7de3116100bb578063efd0cbf91161008a578063f452472e1161006f578063f452472e14610bf4578063f91798b114610c14578063f923fcb314610c3557600080fd5b8063efd0cbf914610bc1578063f2fde38b14610bd457600080fd5b8063e33b7de314610b16578063e6b2bff114610b2b578063e985e9c514610b4b578063ef08acae14610ba157600080fd5b8063d5f56270116100f7578063d5f5627014610aaa578063d75d65aa14610ac0578063d7c9ed6914610ae0578063df0cb35014610af657600080fd5b8063d085c6cf14610a48578063d48a89d514610a5e578063d5abeb0114610a74578063d5d385a114610a8a57600080fd5b8063a7c587ee116101a0578063b88d4fde1161016f578063b88d4fde146109a5578063c87b56dd146109c5578063cce62b9d146109e5578063ce7c2ac214610a0557600080fd5b8063a7c587ee1461093c578063ac9384b91461095c578063b465a5d314610972578063b8822e581461099257600080fd5b806395d89b41116101dc57806395d89b41146108a457806396ea3a47146108b95780639852595c146108d9578063a22cb4651461091c57600080fd5b806384a303d6146108195780638618329f146108395780638b83209b146108595780638da5cb5b1461087957600080fd5b80633af4c280116102fd5780636352211e1161029057806370a082311161025f57806370a0823114610797578063715018a6146107b757806380e1299e146107cc5780638462151c146107ec57600080fd5b80636352211e14610739578063692f2d1f146107595780636c0360eb1461076f5780636dea1bb11461078457600080fd5b80634530a832116102cc5780634530a832146106c657806348808c10146106e65780634a56491e146107065780634f6ccce71461071957600080fd5b80633af4c2801461065f5780633c36d7d61461067e5780633ccfd60b1461069e57806342842e0e146106a657600080fd5b8063191655871161037557806323b872dd1161034457806323b872dd146105f05780632f13e710146106105780632f745c591461062a5780633a98ef391461064a57600080fd5b8063191655871461057a5780631bba917d1461059a5780631cab9555146105ba578063237e0778146105d057600080fd5b8063081812fc116103b1578063081812fc146104d6578063095ea7b31461051b57806309a9bcbd1461053b57806318160ddd1461055b57600080fd5b806301ffc9a71461043d578063022d8ac81461047257806302fe53051461049457806306fdde03146104b457600080fd5b36610438577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770336040805173ffffffffffffffffffffffffffffffffffffffff90921682523460208301520160405180910390a1005b600080fd5b34801561044957600080fd5b5061045d6104583660046142bd565b610c55565b60405190151581526020015b60405180910390f35b34801561047e57600080fd5b5061049261048d3660046142da565b610cb1565b005b3480156104a057600080fd5b506104926104af3660046143cd565b610d22565b3480156104c057600080fd5b506104c9610da0565b6040516104699190614478565b3480156104e257600080fd5b506104f66104f13660046142da565b610e32565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610469565b34801561052757600080fd5b506104926105363660046144ad565b610ed8565b34801561054757600080fd5b50600d5461045d9062010000900460ff1681565b34801561056757600080fd5b506002545b604051908152602001610469565b34801561058657600080fd5b506104926105953660046144d9565b611031565b3480156105a657600080fd5b506104926105b53660046142da565b61126c565b3480156105c657600080fd5b5061056c60135481565b3480156105dc57600080fd5b506104926105eb3660046142da565b6112d8565b3480156105fc57600080fd5b5061049261060b3660046144f6565b611344565b34801561061c57600080fd5b50600d5461045d9060ff1681565b34801561063657600080fd5b5061056c6106453660046144ad565b6113cb565b34801561065657600080fd5b5060065461056c565b34801561066b57600080fd5b50600d5461045d90610100900460ff1681565b34801561068a57600080fd5b506104926106993660046142da565b6114e7565b610492611553565b3480156106b257600080fd5b506104926106c13660046144f6565b611612565b3480156106d257600080fd5b506104926106e13660046142da565b61162d565b3480156106f257600080fd5b506104f6610701366004614537565b611699565b61049261071436600461459b565b6116ac565b34801561072557600080fd5b5061056c6107343660046142da565b611984565b34801561074557600080fd5b506104f66107543660046142da565b6119e1565b34801561076557600080fd5b5061056c60165481565b34801561077b57600080fd5b506104c9611a8e565b61049261079236600461459b565b611b1c565b3480156107a357600080fd5b5061056c6107b23660046144d9565b611dd6565b3480156107c357600080fd5b50610492611ed5565b3480156107d857600080fd5b5061056c6107e73660046144d9565b611f48565b3480156107f857600080fd5b5061080c6108073660046144d9565b611f7b565b6040516104699190614608565b34801561082557600080fd5b50610492610834366004614661565b612075565b34801561084557600080fd5b5061056c6108543660046144d9565b612115565b34801561086557600080fd5b506104f66108743660046142da565b612148565b34801561088557600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166104f6565b3480156108b057600080fd5b506104c9612185565b3480156108c557600080fd5b506104926108d43660046146c1565b612194565b3480156108e557600080fd5b5061056c6108f43660046144d9565b73ffffffffffffffffffffffffffffffffffffffff1660009081526009602052604090205490565b34801561092857600080fd5b5061049261093736600461472d565b612359565b34801561094857600080fd5b50610492610957366004614661565b612456565b34801561096857600080fd5b5061056c60155481565b34801561097e57600080fd5b5061049261098d3660046142da565b6124f5565b6104926109a036600461459b565b612561565b3480156109b157600080fd5b506104926109c0366004614762565b61281f565b3480156109d157600080fd5b506104c96109e03660046142da565b6128a7565b3480156109f157600080fd5b50610492610a00366004614661565b612913565b348015610a1157600080fd5b5061056c610a203660046144d9565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205490565b348015610a5457600080fd5b5061056c60145481565b348015610a6a57600080fd5b5061056c60125481565b348015610a8057600080fd5b5061056c600c5481565b348015610a9657600080fd5b50610492610aa53660046142da565b6129b1565b348015610ab657600080fd5b5061056c60185481565b348015610acc57600080fd5b50610492610adb3660046142da565b612a1d565b348015610aec57600080fd5b5061056c60175481565b348015610b0257600080fd5b5061056c610b113660046144d9565b612a89565b348015610b2257600080fd5b5060075461056c565b348015610b3757600080fd5b50610492610b463660046142da565b612abc565b348015610b5757600080fd5b5061045d610b663660046147ce565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610bad57600080fd5b50610492610bbc366004614661565b612b28565b610492610bcf3660046142da565b612bc0565b348015610be057600080fd5b50610492610bef3660046144d9565b612daa565b348015610c0057600080fd5b50610492610c0f3660046142da565b612ea3565b348015610c2057600080fd5b50600d5461045d906301000000900460ff1681565b348015610c4157600080fd5b50610492610c503660046142da565b612f0f565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610cab5750610cab82612f7b565b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d1d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601255565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b8051610d9c90600b9060208401906141ff565b5050565b606060008054610daf90614807565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddb90614807565b8015610e285780601f10610dfd57610100808354040283529160200191610e28565b820191906000526020600020905b815481529060010190602001808311610e0b57829003601f168201915b5050505050905090565b6000610e3d8261305e565b610eaf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610d14565b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610ee3826119e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610d14565b3373ffffffffffffffffffffffffffffffffffffffff82161480610fb05750610fb08133610b66565b6110225760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d14565b61102c83836130c2565b505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600860205260409020546110c95760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f73686172657300000000000000000000000000000000000000000000000000006064820152608401610d14565b6000600754476110d9919061488a565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020908152604080832054600654600890935290832054939450919261111d90856148a2565b611127919061490e565b6111319190614922565b9050806111a65760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e740000000000000000000000000000000000000000006064820152608401610d14565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020546111d790829061488a565b73ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205560075461120b90829061488a565b6007556112188382613162565b6040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146112d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601455565b60055473ffffffffffffffffffffffffffffffffffffffff16331461133f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601355565b61134e3382613288565b6113c05760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d14565b61102c8383836133c4565b60006113d683611dd6565b82106114245760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610d14565b6000805b60025481101561149e576002818154811061144557611445614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8681169116141561148e5783821415611482579150610cab9050565b61148b82614968565b91505b61149781614968565b9050611428565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610d14565b60055473ffffffffffffffffffffffffffffffffffffffff16331461154e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600f55565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b604051600090339047908381818185875af1925050503d80600081146115fc576040519150601f19603f3d011682016040523d82523d6000602084013e611601565b606091505b505090508061160f57600080fd5b50565b61102c8383836040518060200160405280600081525061281f565b60055473ffffffffffffffffffffffffffffffffffffffff1633146116945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601155565b60006116a58383613593565b9392505050565b60006116b760025490565b9050336116c48484611699565b73ffffffffffffffffffffffffffffffffffffffff16146117275760405162461bcd60e51b815260206004820152601160248201527f5369676e617475726520496e76616c69640000000000000000000000000000006044820152606401610d14565b600d54610100900460ff1661177e5760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b600084116117ce5760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b6013548411156118205760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c5461182d858361488a565b111561187b5760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b83600f5461188991906148a2565b3410156118d85760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b60016118e333612a89565b10156119315760405162461bcd60e51b815260206004820152601360248201527f596f75206d696e74656420746f6f206d616e79000000000000000000000000006044820152606401610d14565b60005b8481101561196f5761195f3361194a838561488a565b604051806020016040528060008152506135ab565b61196881614968565b9050611934565b506000905061197e3385613634565b50505050565b600061198f60025490565b82106119dd5760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610d14565b5090565b600080600283815481106119f7576119f7614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905080610cab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610d14565b600b8054611a9b90614807565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac790614807565b8015611b145780601f10611ae957610100808354040283529160200191611b14565b820191906000526020600020905b815481529060010190602001808311611af757829003601f168201915b505050505081565b6000611b2760025490565b905033611b348484611699565b73ffffffffffffffffffffffffffffffffffffffff1614611b975760405162461bcd60e51b815260206004820152601160248201527f5369676e617475726520496e76616c69640000000000000000000000000000006044820152606401610d14565b600d5460ff16611be95760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b60008411611c395760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b601254841115611c8b5760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c54611c98858361488a565b1115611ce65760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b83600e54611cf491906148a2565b341015611d435760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b601654611d4f33612115565b14611d9c5760405162461bcd60e51b815260206004820152601260248201527f596f7520616c7265616479206d696e74656400000000000000000000000000006044820152606401610d14565b60005b611daa85600161488a565b811015611dcf57611dbf3361194a838561488a565b611dc881614968565b9050611d9f565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff8216611e615760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610d14565b600254600090815b81811015611ecc5760028181548110611e8457611e84614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415611ebc57611eb983614968565b92505b611ec581614968565b9050611e69565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611f3c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b611f466000613672565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601d6020526040812054601854610cab9190614922565b6060611f8682611dd6565b600010611fd55760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610d14565b6000611fe083611dd6565b905060008167ffffffffffffffff811115611ffd57611ffd6142f3565b604051908082528060200260200182016040528015612026578160200160208202803683370190505b50905060005b8281101561206d5761203e85826113cb565b82828151811061205057612050614939565b60209081029190910101528061206581614968565b91505061202c565b509392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146120dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d80549115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260196020526040812054601654610cab9190614922565b6000600a828154811061215d5761215d614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692915050565b606060018054610daf90614807565b60055473ffffffffffffffffffffffffffffffffffffffff1633146121fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b82811461220757600080fd5b60008061221360025490565b905060005b858110156122565786868281811061223257612232614939565b9050602002013583612244919061488a565b925061224f81614968565b9050612218565b50600c54612264838361488a565b11156122b25760405162461bcd60e51b815260206004820152600860248201527f546f6f206d616e790000000000000000000000000000000000000000000000006044820152606401610d14565b6000915060005b838110156123505760005b8787838181106122d6576122d6614939565b9050602002013581101561233f5761232f8686848181106122f9576122f9614939565b905060200201602081019061230e91906144d9565b8461231881614968565b9550604051806020016040528060008152506135ab565b61233881614968565b90506122c4565b5061234981614968565b90506122b9565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156123bf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d14565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146124bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff16331461255c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601055565b600061256c60025490565b9050336125798484611699565b73ffffffffffffffffffffffffffffffffffffffff16146125dc5760405162461bcd60e51b815260206004820152601160248201527f5369676e617475726520496e76616c69640000000000000000000000000000006044820152606401610d14565b600d5462010000900460ff166126345760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b600084116126845760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b6014548411156126d65760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c546126e3858361488a565b11156127315760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b8360105461273f91906148a2565b34101561278e5760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b600161279933611f48565b10156127e75760405162461bcd60e51b815260206004820152601360248201527f596f75206d696e74656420746f6f206d616e79000000000000000000000000006044820152606401610d14565b60005b84811015612810576128003361194a838561488a565b61280981614968565b90506127ea565b506000905061197e33856136e9565b6128293383613288565b61289b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610d14565b61197e8484848461371e565b6060600c548211156128b857600080fd5b60006128c26137a7565b905060008151116128e257604051806020016040528060008152506116a5565b806128ec846137b6565b6040516020016128fd9291906149a1565b6040516020818303038152906040529392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461297a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a185760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601855565b60055473ffffffffffffffffffffffffffffffffffffffff163314612a845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601655565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601b6020526040812054601754610cab9190614922565b60055473ffffffffffffffffffffffffffffffffffffffff163314612b235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601755565b60055473ffffffffffffffffffffffffffffffffffffffff163314612b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000612bcb60025490565b600d549091506301000000900460ff16612c275760405162461bcd60e51b815260206004820152601960248201527f5075626c69632073616c65206973206e6f7420616374697665000000000000006044820152606401610d14565b60008211612c775760405162461bcd60e51b815260206004820152601060248201527f4d696e74206d6f7265207468616e2030000000000000000000000000000000006044820152606401610d14565b601554821115612cc95760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b600c54612cd6838361488a565b1115612d245760405162461bcd60e51b815260206004820152600960248201527f4d696e74206c65737300000000000000000000000000000000000000000000006044820152606401610d14565b81601154612d3291906148a2565b341015612d815760405162461bcd60e51b815260206004820152601260248201527f45544820696e7075742069732077726f6e6700000000000000000000000000006044820152606401610d14565b60005b8281101561102c57612d9a3361194a838561488a565b612da381614968565b9050612d84565b60055473ffffffffffffffffffffffffffffffffffffffff163314612e115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b73ffffffffffffffffffffffffffffffffffffffff8116612e9a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d14565b61160f81613672565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f0a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b601555565b60055473ffffffffffffffffffffffffffffffffffffffff163314612f765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d14565b600e55565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061300e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610cab57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610cab565b60025460009082108015610cab5750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061309857613098614939565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061311c826119e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156131b25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d14565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461320c576040519150601f19603f3d011682016040523d82523d6000602084013e613211565b606091505b505090508061102c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d14565b60006132938261305e565b6133055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610d14565b6000613310836119e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061337f57508373ffffffffffffffffffffffffffffffffffffffff1661336784610e32565b73ffffffffffffffffffffffffffffffffffffffff16145b806133bc575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff166133e4826119e1565b73ffffffffffffffffffffffffffffffffffffffff161461346d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610d14565b73ffffffffffffffffffffffffffffffffffffffff82166134f55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610d14565b6135006000826130c2565b816002828154811061351457613514614939565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60008061359f846138e8565b90506133bc818461394b565b6135b58383613967565b6135c26000848484613ac1565b61102c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d14565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601b60205260408120805483929061366990849061488a565b90915550505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601d60205260408120805483929061366990849061488a565b6137298484846133c4565b61373584848484613ac1565b61197e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d14565b6060600b8054610daf90614807565b6060816137f657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613820578061380a81614968565b91506138199050600a8361490e565b91506137fa565b60008167ffffffffffffffff81111561383b5761383b6142f3565b6040519080825280601f01601f191660200182016040528015613865576020820181803683370190505b5090505b84156133bc5761387a600183614922565b9150613887600a866149d0565b61389290603061488a565b60f81b8183815181106138a7576138a7614939565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506138e1600a8661490e565b9450613869565b6000610cab7f28bcf37b3cf2bc5fb85e4153569e33942b67dedd3a52f5007e880261d298bb9c8380519060200120604051602001613930929190918252602082015260400190565b60405160208183030381529060405280519060200120613c97565b600080600061395a8585613d00565b9150915061206d81613d70565b73ffffffffffffffffffffffffffffffffffffffff82166139ca5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d14565b6139d38161305e565b15613a205760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d14565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15613c8c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613b389033908990889088906004016149e4565b6020604051808303816000875af1925050508015613b91575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613b8e91810190614a2d565b60015b613c41573d808015613bbf576040519150601f19603f3d011682016040523d82523d6000602084013e613bc4565b606091505b508051613c395760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610d14565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506133bc565b506001949350505050565b6000610cab613ca4613f61565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080825160411415613d375760208301516040840151606085015160001a613d2b87828585614095565b94509450505050613d69565b825160401415613d615760208301516040840151613d568683836141ad565b935093505050613d69565b506000905060025b9250929050565b6000816004811115613d8457613d84614a4a565b1415613d8d5750565b6001816004811115613da157613da1614a4a565b1415613def5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d14565b6002816004811115613e0357613e03614a4a565b1415613e515760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d14565b6003816004811115613e6557613e65614a4a565b1415613ed95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d14565b6004816004811115613eed57613eed614a4a565b141561160f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d14565b60003073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c50798bef32f8008b75bc428e4ecef65a656bd5516148015613fc757507f000000000000000000000000000000000000000000000000000000000000000146145b15613ff157507f3685f67ede7811a8e87673ecced5650b8086b2d2233589e30d913abd28b124f390565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fdd30ffb5c8f59fa0380253cdeec7a15faf3a65662a681c015509694dfcbde50c828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156140cc57506000905060036141a4565b8460ff16601b141580156140e457508460ff16601c14155b156140f557506000905060046141a4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614149573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661419d576000600192509250506141a4565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816141e360ff86901c601b61488a565b90506141f187828885614095565b935093505050935093915050565b82805461420b90614807565b90600052602060002090601f01602090048101928261422d5760008555614273565b82601f1061424657805160ff1916838001178555614273565b82800160010185558215614273579182015b82811115614273578251825591602001919060010190614258565b506119dd9291505b808211156119dd576000815560010161427b565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461160f57600080fd5b6000602082840312156142cf57600080fd5b81356116a58161428f565b6000602082840312156142ec57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261433357600080fd5b813567ffffffffffffffff8082111561434e5761434e6142f3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614394576143946142f3565b816040528381528660208588010111156143ad57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156143df57600080fd5b813567ffffffffffffffff8111156143f657600080fd5b6133bc84828501614322565b60005b8381101561441d578181015183820152602001614405565b8381111561197e5750506000910152565b60008151808452614446816020860160208601614402565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116a5602083018461442e565b73ffffffffffffffffffffffffffffffffffffffff8116811461160f57600080fd5b600080604083850312156144c057600080fd5b82356144cb8161448b565b946020939093013593505050565b6000602082840312156144eb57600080fd5b81356116a58161448b565b60008060006060848603121561450b57600080fd5b83356145168161448b565b925060208401356145268161448b565b929592945050506040919091013590565b6000806040838503121561454a57600080fd5b823567ffffffffffffffff8082111561456257600080fd5b61456e86838701614322565b9350602085013591508082111561458457600080fd5b5061459185828601614322565b9150509250929050565b6000806000606084860312156145b057600080fd5b83359250602084013567ffffffffffffffff808211156145cf57600080fd5b6145db87838801614322565b935060408601359150808211156145f157600080fd5b506145fe86828701614322565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561464057835183529284019291840191600101614624565b50909695505050505050565b8035801515811461465c57600080fd5b919050565b60006020828403121561467357600080fd5b6116a58261464c565b60008083601f84011261468e57600080fd5b50813567ffffffffffffffff8111156146a657600080fd5b6020830191508360208260051b8501011115613d6957600080fd5b600080600080604085870312156146d757600080fd5b843567ffffffffffffffff808211156146ef57600080fd5b6146fb8883890161467c565b9096509450602087013591508082111561471457600080fd5b506147218782880161467c565b95989497509550505050565b6000806040838503121561474057600080fd5b823561474b8161448b565b91506147596020840161464c565b90509250929050565b6000806000806080858703121561477857600080fd5b84356147838161448b565b935060208501356147938161448b565b925060408501359150606085013567ffffffffffffffff8111156147b657600080fd5b6147c287828801614322565b91505092959194509250565b600080604083850312156147e157600080fd5b82356147ec8161448b565b915060208301356147fc8161448b565b809150509250929050565b600181811c9082168061481b57607f821691505b60208210811415614855577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561489d5761489d61485b565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148da576148da61485b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261491d5761491d6148df565b500490565b6000828210156149345761493461485b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561499a5761499a61485b565b5060010190565b600083516149b3818460208801614402565b8351908301906149c7818360208801614402565b01949350505050565b6000826149df576149df6148df565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614a23608083018461442e565b9695505050505050565b600060208284031215614a3f57600080fd5b81516116a58161428f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220bcf6951d7ed4f556a1de856882fd8cd1535000c97d9d4568cdf24aafca2b9ef264736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000008414e4f4e6d6f64650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004414e4f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d596b63634e353464555636613147385a7458644858736b67586d70517764504c67597851315a534c746d6b412f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): ANONmode
Arg [1] : _symbol (string): ANON
Arg [2] : _initBaseURI (string): https://gateway.pinata.cloud/ipfs/QmYkccN54dUV6a1G8ZtXdHXskgXmpQwdPLgYxQ1ZSLtmkA/
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 414e4f4e6d6f6465000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 414e4f4e00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [8] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [9] : 732f516d596b63634e353464555636613147385a7458644858736b67586d7051
Arg [10] : 7764504c67597851315a534c746d6b412f000000000000000000000000000000
Deployed Bytecode Sourcemap
184:9316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2627:40:15;682:10:2;2627:40:15;;;218:42:18;206:55;;;188:74;;2657:9:15;293:2:18;278:18;;271:34;161:18;2627:40:15;;;;;;;184:9316:0;;;;;193:224:7;;;;;;;;;;-1:-1:-1;193:224:7;;;;;:::i;:::-;;:::i;:::-;;;913:14:18;;906:22;888:41;;876:2;861:18;193:224:7;;;;;;;;7921:125:0;;;;;;;;;;-1:-1:-1;7921:125:0;;;;;:::i;:::-;;:::i;:::-;;9253:89;;;;;;;;;;-1:-1:-1;9253:89:0;;;;;:::i;:::-;;:::i;1672:100:6:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2305:221::-;;;;;;;;;;-1:-1:-1;2305:221:6;;;;;:::i;:::-;;:::i;:::-;;;3410:42:18;3398:55;;;3380:74;;3368:2;3353:18;2305:221:6;3234:226:18;1888:411:6;;;;;;;;;;-1:-1:-1;1888:411:6;;;;;:::i;:::-;;:::i;570:36:0:-;;;;;;;;;;-1:-1:-1;570:36:0;;;;;;;;;;;1351:110:7;;;;;;;;;;-1:-1:-1;1439:7:7;:14;1351:110;;;4090:25:18;;;4078:2;4063:18;1351:110:7;3944:177:18;3791:600:15;;;;;;;;;;-1:-1:-1;3791:600:15;;;;;:::i;:::-;;:::i;8175:125:0:-;;;;;;;;;;-1:-1:-1;8175:125:0;;;;;:::i;:::-;;:::i;875:41::-;;;;;;;;;;;;;;;;8048:125;;;;;;;;;;-1:-1:-1;8048:125:0;;;;;:::i;:::-;;:::i;3003:339:6:-;;;;;;;;;;-1:-1:-1;3003:339:6;;;;;:::i;:::-;;:::i;489:36:0:-;;;;;;;;;;-1:-1:-1;489:36:0;;;;;;;;423:499:7;;;;;;;;;;-1:-1:-1;423:499:7;;;;;:::i;:::-;;:::i;2752:89:15:-;;;;;;;;;;-1:-1:-1;2822:12:15;;2752:89;;528:36:0;;;;;;;;;;-1:-1:-1;528:36:0;;;;;;;;;;;7625:92;;;;;;;;;;-1:-1:-1;7625:92:0;;;;;:::i;:::-;;:::i;9348:149::-;;;:::i;3348:185:6:-;;;;;;;;;;-1:-1:-1;3348:185:6;;;;;:::i;:::-;;:::i;7813:91:0:-;;;;;;;;;;-1:-1:-1;7813:91:0;;;;;:::i;:::-;;:::i;5604:138::-;;;;;;;;;;-1:-1:-1;5604:138:0;;;;;:::i;:::-;;:::i;2917:834::-;;;;;;:::i;:::-;;:::i;1467:200:7:-;;;;;;;;;;-1:-1:-1;1467:200:7;;;;;:::i;:::-;;:::i;1427:239:6:-;;;;;;;;;;-1:-1:-1;1427:239:6;;;;;:::i;:::-;;:::i;1006:45:0:-;;;;;;;;;;;;;;;;286:21;;;;;;;;;;;;;:::i;2090:823::-;;;;;;:::i;:::-;;:::i;1007:414:6:-;;;;;;;;;;-1:-1:-1;1007:414:6;;;;;:::i;:::-;;:::i;1648:94:14:-;;;;;;;;;;;;;:::i;6553:163:0:-;;;;;;;;;;-1:-1:-1;6553:163:0;;;;;:::i;:::-;;:::i;928:417:7:-;;;;;;;;;;-1:-1:-1;928:417:7;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9155:77:0:-;;;;;;;;;;-1:-1:-1;9155:77:0;;;;;:::i;:::-;;:::i;6217:163::-;;;;;;;;;;-1:-1:-1;6217:163:0;;;;;:::i;:::-;;:::i;3499:98:15:-;;;;;;;;;;-1:-1:-1;3499:98:15;;;;;:::i;:::-;;:::i;997:87:14:-;;;;;;;;;;-1:-1:-1;1070:6:14;;;;997:87;;1778:104:6;;;;;;;;;;;;;:::i;5155:443:0:-;;;;;;;;;;-1:-1:-1;5155:443:0;;;;;:::i;:::-;;:::i;3306:107:15:-;;;;;;;;;;-1:-1:-1;3306:107:15;;;;;:::i;:::-;3388:18;;3362:7;3388:18;;;:9;:18;;;;;;;3306:107;2532:295:6;;;;;;;;;;-1:-1:-1;2532:295:6;;;;;:::i;:::-;;:::i;9061:92:0:-;;;;;;;;;;-1:-1:-1;9061:92:0;;;;;:::i;:::-;;:::i;963:37::-;;;;;;;;;;;;;;;;7719:92;;;;;;;;;;-1:-1:-1;7719:92:0;;;;;:::i;:::-;;:::i;3755:834::-;;;;;;:::i;:::-;;:::i;3539:328:6:-;;;;;;;;;;-1:-1:-1;3539:328:6;;;;;:::i;:::-;;:::i;7225:282:0:-;;;;;;;;;;-1:-1:-1;7225:282:0;;;;;:::i;:::-;;:::i;8967:92::-;;;;;;;;;;-1:-1:-1;8967:92:0;;;;;:::i;:::-;;:::i;3109:103:15:-;;;;;;;;;;-1:-1:-1;3109:103:15;;;;;:::i;:::-;3189:16;;3163:7;3189:16;;;:7;:16;;;;;;;3109:103;919:41:0;;;;;;;;;;;;;;;;831;;;;;;;;;;;;;;;;455:31;;;;;;;;;;;;;;;;8715:136;;;;;;;;;;-1:-1:-1;8715:136:0;;;;;:::i;:::-;;:::i;1102:45::-;;;;;;;;;;;;;;;;8439:136;;;;;;;;;;-1:-1:-1;8439:136:0;;;;;:::i;:::-;;:::i;1054:45::-;;;;;;;;;;;;;;;;6385:163;;;;;;;;;;-1:-1:-1;6385:163:0;;;;;:::i;:::-;;:::i;2930:93:15:-;;;;;;;;;;-1:-1:-1;3002:14:15;;2930:93;;8577:136:0;;;;;;;;;;-1:-1:-1;8577:136:0;;;;;:::i;:::-;;:::i;2833:164:6:-;;;;;;;;;;-1:-1:-1;2833:164:6;;;;;:::i;:::-;2954:25;;;;2930:4;2954:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;2833:164;8873:92:0;;;;;;;;;;-1:-1:-1;8873:92:0;;;;;:::i;:::-;;:::i;4595:535::-;;;;;;:::i;:::-;;:::i;1897:192:14:-;;;;;;;;;;-1:-1:-1;1897:192:14;;;;;:::i;:::-;;:::i;8302:117:0:-;;;;;;;;;;-1:-1:-1;8302:117:0;;;;;:::i;:::-;;:::i;609:32::-;;;;;;;;;;-1:-1:-1;609:32:0;;;;;;;;;;;7531:92;;;;;;;;;;-1:-1:-1;7531:92:0;;;;;:::i;:::-;;:::i;193:224:7:-;295:4;319:50;;;334:35;319:50;;:90;;;373:36;397:11;373:23;:36::i;:::-;312:97;193:224;-1:-1:-1;;193:224:7:o;7921:125:0:-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;;;;;;;;;8000:22:0::1;:42:::0;7921:125::o;9253:89::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;9317:21:0;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;9253:89:::0;:::o;1672:100:6:-;1726:13;1759:5;1752:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1672:100;:::o;2305:221::-;2381:7;2409:16;2417:7;2409;:16::i;:::-;2401:73;;;;-1:-1:-1;;;2401:73:6;;10787:2:18;2401:73:6;;;10769:21:18;10826:2;10806:18;;;10799:30;10865:34;10845:18;;;10838:62;10936:14;10916:18;;;10909:42;10968:19;;2401:73:6;10585:408:18;2401:73:6;-1:-1:-1;2494:24:6;;;;:15;:24;;;;;;;;;2305:221::o;1888:411::-;1969:13;1985:23;2000:7;1985:14;:23::i;:::-;1969:39;;2033:5;2027:11;;:2;:11;;;;2019:57;;;;-1:-1:-1;;;2019:57:6;;11200:2:18;2019:57:6;;;11182:21:18;11239:2;11219:18;;;11212:30;11278:34;11258:18;;;11251:62;11349:3;11329:18;;;11322:31;11370:19;;2019:57:6;10998:397:18;2019:57:6;682:10:2;2111:21:6;;;;;:62;;-1:-1:-1;2136:37:6;2153:5;682:10:2;2833:164:6;:::i;2136:37::-;2089:168;;;;-1:-1:-1;;;2089:168:6;;11602:2:18;2089:168:6;;;11584:21:18;11641:2;11621:18;;;11614:30;11680:34;11660:18;;;11653:62;11751:26;11731:18;;;11724:54;11795:19;;2089:168:6;11400:420:18;2089:168:6;2270:21;2279:2;2283:7;2270:8;:21::i;:::-;1958:341;1888:411;;:::o;3791:600:15:-;3866:16;;;3885:1;3866:16;;;:7;:16;;;;;;3858:71;;;;-1:-1:-1;;;3858:71:15;;12027:2:18;3858:71:15;;;12009:21:18;12066:2;12046:18;;;12039:30;12105:34;12085:18;;;12078:62;12176:8;12156:18;;;12149:36;12202:19;;3858:71:15;11825:402:18;3858:71:15;3940:21;3988:14;;3964:21;:38;;;;:::i;:::-;4082:18;;;4012:15;4082:18;;;:9;:18;;;;;;;;;4067:12;;4047:7;:16;;;;;;;3940:62;;-1:-1:-1;4012:15:15;;4031:32;;3940:62;4031:32;:::i;:::-;4030:49;;;;:::i;:::-;:70;;;;:::i;:::-;4012:88;-1:-1:-1;4119:12:15;4111:68;;;;-1:-1:-1;;;4111:68:15;;13433:2:18;4111:68:15;;;13415:21:18;13472:2;13452:18;;;13445:30;13511:34;13491:18;;;13484:62;13582:13;13562:18;;;13555:41;13613:19;;4111:68:15;13231:407:18;4111:68:15;4211:18;;;;;;;:9;:18;;;;;;:28;;4232:7;;4211:28;:::i;:::-;4190:18;;;;;;;:9;:18;;;;;:49;4266:14;;:24;;4283:7;;4266:24;:::i;:::-;4249:14;:41;4301:35;4319:7;4328;4301:17;:35::i;:::-;4351:33;;;218:42:18;206:55;;188:74;;293:2;278:18;;271:34;;;4351:33:15;;161:18:18;4351:33:15;;;;;;;3848:543;;3791:600;:::o;8175:125:0:-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8254:22:0::1;:42:::0;8175:125::o;8048:::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8127:22:0::1;:42:::0;8048:125::o;3003:339:6:-;3198:41;682:10:2;3231:7:6;3198:18;:41::i;:::-;3190:103;;;;-1:-1:-1;;;3190:103:6;;14155:2:18;3190:103:6;;;14137:21:18;14194:2;14174:18;;;14167:30;14233:34;14213:18;;;14206:62;14304:19;14284:18;;;14277:47;14341:19;;3190:103:6;13953:413:18;3190:103:6;3306:28;3316:4;3322:2;3326:7;3306:9;:28::i;423:499:7:-;512:15;556:23;573:5;556:16;:23::i;:::-;548:5;:31;540:66;;;;-1:-1:-1;;;540:66:7;;14573:2:18;540:66:7;;;14555:21:18;14612:2;14592:18;;;14585:30;14651:24;14631:18;;;14624:52;14693:18;;540:66:7;14371:346:18;540:66:7;617:10;643:6;638:226;655:7;:14;651:18;;638:226;;;704:7;712:1;704:10;;;;;;;;:::i;:::-;;;;;;;;;;;;695:19;;;704:10;;695:19;691:162;;;748:5;739;:14;735:102;;;784:1;-1:-1:-1;777:8:7;;-1:-1:-1;777:8:7;735:102;830:7;;;:::i;:::-;;;735:102;671:3;;;:::i;:::-;;;638:226;;;-1:-1:-1;874:40:7;;-1:-1:-1;;;874:40:7;;14573:2:18;874:40:7;;;14555:21:18;14612:2;14592:18;;;14585:30;14651:24;14631:18;;;14624:52;14693:18;;874:40:7;14371:346:18;7625:92:0;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;7686:15:0::1;:27:::0;7625:92::o;9348:149::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;9415:58:0::1;::::0;9397:12:::1;::::0;9423:10:::1;::::0;9447:21:::1;::::0;9397:12;9415:58;9397:12;9415:58;9447:21;9423:10;9415:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9396:77;;;9485:7;9477:16;;;::::0;::::1;;9393:104;9348:149::o:0;3348:185:6:-;3486:39;3503:4;3509:2;3513:7;3486:39;;;;;;;;;;;;:16;:39::i;7813:91:0:-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;7877:11:0::1;:23:::0;7813:91::o;5604:138::-;5684:7;5710:25;5719:4;5725:9;5710:7;:25::i;:::-;5703:32;5604:138;-1:-1:-1;;;5604:138:0:o;2917:834::-;3027:9;3039:13;1439:7:7;:14;;1351:110;3039:13:0;3027:25;-1:-1:-1;3096:10:0;3070:22;3076:4;3082:9;3070:5;:22::i;:::-;:36;;;3062:66;;;;-1:-1:-1;;;3062:66:0;;15523:2:18;3062:66:0;;;15505:21:18;15562:2;15542:18;;;15535:30;15601:19;15581:18;;;15574:47;15638:18;;3062:66:0;15321:341:18;3062:66:0;3170:16;;;;;;;3162:53;;;;-1:-1:-1;;;3162:53:0;;15869:2:18;3162:53:0;;;15851:21:18;15908:2;15888:18;;;15881:30;15947:27;15927:18;;;15920:55;15992:18;;3162:53:0;15667:349:18;3162:53:0;3248:1;3233:12;:16;3225:46;;;;-1:-1:-1;;;3225:46:0;;16223:2:18;3225:46:0;;;16205:21:18;16262:2;16242:18;;;16235:30;16301:18;16281;;;16274:46;16337:18;;3225:46:0;16021:340:18;3225:46:0;3302:22;;3286:12;:38;;3278:60;;;;-1:-1:-1;;;3278:60:0;;16568:2:18;3278:60:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;3278:60:0;16366:332:18;3278:60:0;3374:9;;3354:16;3358:12;3354:1;:16;:::i;:::-;:29;;3345:52;;;;-1:-1:-1;;;3345:52:0;;16568:2:18;3345:52:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;3345:52:0;16366:332:18;3345:52:0;3443:12;3425:15;;:30;;;;:::i;:::-;3412:9;:43;;3404:74;;;;-1:-1:-1;;;3404:74:0;;16905:2:18;3404:74:0;;;16887:21:18;16944:2;16924:18;;;16917:30;16983:20;16963:18;;;16956:48;17021:18;;3404:74:0;16703:342:18;3404:74:0;3538:1;3496:38;3523:10;3496:26;:38::i;:::-;:43;;3488:74;;;;-1:-1:-1;;;3488:74:0;;17252:2:18;3488:74:0;;;17234:21:18;17291:2;17271:18;;;17264:30;17330:21;17310:18;;;17303:49;17369:18;;3488:74:0;17050:343:18;3488:74:0;3576:9;3571:95;3595:12;3591:1;:16;3571:95;;;3623:32;3633:10;3645:5;3649:1;3645;:5;:::i;:::-;3623:32;;;;;;;;;;;;:9;:32::i;:::-;3609:3;;;:::i;:::-;;;3571:95;;;;3675:8;;;3693:51;3719:10;3731:12;3693:25;:51::i;:::-;3022:729;2917:834;;;:::o;1467:200:7:-;1542:7;1578:30;1439:7;:14;;1351:110;1578:30;1570:5;:38;1562:74;;;;-1:-1:-1;;;1562:74:7;;17600:2:18;1562:74:7;;;17582:21:18;17639:2;17619:18;;;17612:30;17678:25;17658:18;;;17651:53;17721:18;;1562:74:7;17398:347:18;1562:74:7;-1:-1:-1;1654:5:7;1467:200::o;1427:239:6:-;1499:7;1519:13;1535:7;1543;1535:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;1570:19:6;1562:73;;;;-1:-1:-1;;;1562:73:6;;17952:2:18;1562:73:6;;;17934:21:18;17991:2;17971:18;;;17964:30;18030:34;18010:18;;;18003:62;18101:11;18081:18;;;18074:39;18130:19;;1562:73:6;17750:405:18;286:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2090:823::-;2204:9;2216:13;1439:7:7;:14;;1351:110;2216:13:0;2204:25;-1:-1:-1;2273:10:0;2247:22;2253:4;2259:9;2247:5;:22::i;:::-;:36;;;2239:66;;;;-1:-1:-1;;;2239:66:0;;15523:2:18;2239:66:0;;;15505:21:18;15562:2;15542:18;;;15535:30;15601:19;15581:18;;;15574:47;15638:18;;2239:66:0;15321:341:18;2239:66:0;2347:16;;;;2339:53;;;;-1:-1:-1;;;2339:53:0;;15869:2:18;2339:53:0;;;15851:21:18;15908:2;15888:18;;;15881:30;15947:27;15927:18;;;15920:55;15992:18;;2339:53:0;15667:349:18;2339:53:0;2425:1;2410:12;:16;2402:46;;;;-1:-1:-1;;;2402:46:0;;16223:2:18;2402:46:0;;;16205:21:18;16262:2;16242:18;;;16235:30;16301:18;16281;;;16274:46;16337:18;;2402:46:0;16021:340:18;2402:46:0;2479:22;;2463:12;:38;;2455:60;;;;-1:-1:-1;;;2455:60:0;;16568:2:18;2455:60:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;2455:60:0;16366:332:18;2455:60:0;2551:9;;2531:16;2535:12;2531:1;:16;:::i;:::-;:29;;2522:52;;;;-1:-1:-1;;;2522:52:0;;16568:2:18;2522:52:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;2522:52:0;16366:332:18;2522:52:0;2620:12;2602:15;;:30;;;;:::i;:::-;2589:9;:43;;2581:74;;;;-1:-1:-1;;;2581:74:0;;16905:2:18;2581:74:0;;;16887:21:18;16944:2;16924:18;;;16917:30;16983:20;16963:18;;;16956:48;17021:18;;2581:74:0;16703:342:18;2581:74:0;2715:26;;2673:38;2700:10;2673:26;:38::i;:::-;:68;2665:98;;;;-1:-1:-1;;;2665:98:0;;18362:2:18;2665:98:0;;;18344:21:18;18401:2;18381:18;;;18374:30;18440:20;18420:18;;;18413:48;18478:18;;2665:98:0;18160:342:18;2665:98:0;2808:9;2803:104;2827:16;:12;2842:1;2827:16;:::i;:::-;2823:1;:20;2803:104;;;2864:32;2874:10;2886:5;2890:1;2886;:5;:::i;2864:32::-;2845:3;;;:::i;:::-;;;2803:104;;;;2195:718;2090:823;;;:::o;1007:414:6:-;1079:7;1107:19;;;1099:74;;;;-1:-1:-1;;;1099:74:6;;18709:2:18;1099:74:6;;;18691:21:18;18748:2;18728:18;;;18721:30;18787:34;18767:18;;;18760:62;18858:12;18838:18;;;18831:40;18888:19;;1099:74:6;18507:406:18;1099:74:6;1223:7;:14;1184:10;;;1248:119;1269:6;1265:1;:10;1248:119;;;1308:7;1316:1;1308:10;;;;;;;;:::i;:::-;;;;;;;;;;;;1299:19;;;1308:10;;1299:19;1295:61;;;1335:7;;;:::i;:::-;;;1295:61;1277:3;;;:::i;:::-;;;1248:119;;;-1:-1:-1;1408:5:6;;1007:414;-1:-1:-1;;;1007:414:6:o;1648:94:14:-;1070:6;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;1713:21:::1;1731:1;1713:9;:21::i;:::-;1648:94::o:0;6553:163:0:-;6678:30;;;6626:7;6678:30;;;:22;:30;;;;;;6649:26;;:59;;6678:30;6649:59;:::i;928:417:7:-;987:16;1028:23;1045:5;1028:16;:23::i;:::-;1024:1;:27;1016:62;;;;-1:-1:-1;;;1016:62:7;;14573:2:18;1016:62:7;;;14555:21:18;14612:2;14592:18;;;14585:30;14651:24;14631:18;;;14624:52;14693:18;;1016:62:7;14371:346:18;1016:62:7;1089:18;1110:16;1120:5;1110:9;:16::i;:::-;1089:37;;1137:25;1179:10;1165:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1165:25:7;;1137:53;;1206:9;1201:111;1225:10;1221:1;:14;1201:111;;;1271:29;1291:5;1298:1;1271:19;:29::i;:::-;1257:8;1266:1;1257:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;1237:3;;;;:::i;:::-;;;;1201:111;;;-1:-1:-1;1329:8:7;928:417;-1:-1:-1;;;928:417:7:o;9155:77:0:-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;9205:12:0::1;:23:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;9155:77::o;6217:163::-;6342:30;;;6290:7;6342:30;;;:22;:30;;;;;;6313:26;;:59;;6342:30;6313:59;:::i;3499:98:15:-;3550:7;3576;3584:5;3576:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;3499:98;-1:-1:-1;;3499:98:15:o;1778:104:6:-;1834:13;1867:7;1860:14;;;;;:::i;5155:443:0:-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;5251:32:0;;::::1;5243:41;;;::::0;::::1;;5288:6;5302:9:::0;5314:13:::1;1439:7:7::0;:14;;1351:110;5314:13:0::1;5302:25;;5336:6;5332:61;5348:16:::0;;::::1;5332:61;;;5380:5;;5386:1;5380:8;;;;;;;:::i;:::-;;;;;;;5375:13;;;;;:::i;:::-;::::0;-1:-1:-1;5366:3:0::1;::::0;::::1;:::i;:::-;;;5332:61;;;-1:-1:-1::0;5413:9:0::1;::::0;5404:5:::1;5408:1:::0;5404;:5:::1;:::i;:::-;:18;;5395:41;;;::::0;-1:-1:-1;;;5395:41:0;;19120:2:18;5395:41:0::1;::::0;::::1;19102:21:18::0;19159:1;19139:18;;;19132:29;19197:10;19177:18;;;19170:38;19225:18;;5395:41:0::1;18918:331:18::0;5395:41:0::1;5440:8;;;5457:6;5453:129;5469:20:::0;;::::1;5453:129;;;5504:6;5500:78;5520:5;;5526:1;5520:8;;;;;;;:::i;:::-;;;;;;;5516:1;:12;5500:78;;;5538:34;5549:9;;5559:1;5549:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5563:3:::0;::::1;::::0;::::1;:::i;:::-;;;5538:34;;;;;;;;;;;::::0;:9:::1;:34::i;:::-;5530:3;::::0;::::1;:::i;:::-;;;5500:78;;;-1:-1:-1::0;5491:3:0::1;::::0;::::1;:::i;:::-;;;5453:129;;;-1:-1:-1::0;;;;;;;5155:443:0:o;2532:295:6:-;2635:24;;;682:10:2;2635:24:6;;2627:62;;;;-1:-1:-1;;;2627:62:6;;19456:2:18;2627:62:6;;;19438:21:18;19495:2;19475:18;;;19468:30;19534:27;19514:18;;;19507:55;19579:18;;2627:62:6;19254:349:18;2627:62:6;682:10:2;2702:32:6;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;2771:48;;888:41:18;;;2702:42:6;;682:10:2;2771:48:6;;861:18:18;2771:48:6;;;;;;;2532:295;;:::o;9061:92:0:-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;9121:16:0::1;:28:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;9061:92::o;7719:::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;7780:15:0::1;:27:::0;7719:92::o;3755:834::-;3865:9;3877:13;1439:7:7;:14;;1351:110;3877:13:0;3865:25;-1:-1:-1;3934:10:0;3908:22;3914:4;3920:9;3908:5;:22::i;:::-;:36;;;3900:66;;;;-1:-1:-1;;;3900:66:0;;15523:2:18;3900:66:0;;;15505:21:18;15562:2;15542:18;;;15535:30;15601:19;15581:18;;;15574:47;15638:18;;3900:66:0;15321:341:18;3900:66:0;4008:16;;;;;;;4000:53;;;;-1:-1:-1;;;4000:53:0;;15869:2:18;4000:53:0;;;15851:21:18;15908:2;15888:18;;;15881:30;15947:27;15927:18;;;15920:55;15992:18;;4000:53:0;15667:349:18;4000:53:0;4086:1;4071:12;:16;4063:46;;;;-1:-1:-1;;;4063:46:0;;16223:2:18;4063:46:0;;;16205:21:18;16262:2;16242:18;;;16235:30;16301:18;16281;;;16274:46;16337:18;;4063:46:0;16021:340:18;4063:46:0;4140:22;;4124:12;:38;;4116:60;;;;-1:-1:-1;;;4116:60:0;;16568:2:18;4116:60:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;4116:60:0;16366:332:18;4116:60:0;4212:9;;4192:16;4196:12;4192:1;:16;:::i;:::-;:29;;4183:52;;;;-1:-1:-1;;;4183:52:0;;16568:2:18;4183:52:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;4183:52:0;16366:332:18;4183:52:0;4281:12;4263:15;;:30;;;;:::i;:::-;4250:9;:43;;4242:74;;;;-1:-1:-1;;;4242:74:0;;16905:2:18;4242:74:0;;;16887:21:18;16944:2;16924:18;;;16917:30;16983:20;16963:18;;;16956:48;17021:18;;4242:74:0;16703:342:18;4242:74:0;4376:1;4334:38;4361:10;4334:26;:38::i;:::-;:43;;4326:74;;;;-1:-1:-1;;;4326:74:0;;17252:2:18;4326:74:0;;;17234:21:18;17291:2;17271:18;;;17264:30;17330:21;17310:18;;;17303:49;17369:18;;4326:74:0;17050:343:18;4326:74:0;4414:9;4409:95;4433:12;4429:1;:16;4409:95;;;4461:32;4471:10;4483:5;4487:1;4483;:5;:::i;4461:32::-;4447:3;;;:::i;:::-;;;4409:95;;;;4513:8;;;4531:51;4557:10;4569:12;4531:25;:51::i;3539:328:6:-;3714:41;682:10:2;3747:7:6;3714:18;:41::i;:::-;3706:103;;;;-1:-1:-1;;;3706:103:6;;14155:2:18;3706:103:6;;;14137:21:18;14194:2;14174:18;;;14167:30;14233:34;14213:18;;;14206:62;14304:19;14284:18;;;14277:47;14341:19;;3706:103:6;13953:413:18;3706:103:6;3820:39;3834:4;3840:2;3844:7;3853:5;3820:13;:39::i;7225:282:0:-;7298:13;7336:9;;7325:7;:20;;7317:29;;;;;;7350:28;7381:10;:8;:10::i;:::-;7350:41;;7434:1;7409:14;7403:28;:32;:100;;;;;;;;;;;;;;;;;7462:14;7478:18;:7;:16;:18::i;:::-;7445:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7396:107;7225:282;-1:-1:-1;;;7225:282:0:o;8967:92::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;9027:16:0::1;:28:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;8967:92::o;8715:136::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8801:26:0::1;:46:::0;8715:136::o;8439:::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8525:26:0::1;:46:::0;8439:136::o;6385:163::-;6510:30;;;6458:7;6510:30;;;:22;:30;;;;;;6481:26;;:59;;6510:30;6481:59;:::i;8577:136::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8663:26:0::1;:46:::0;8577:136::o;8873:92::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8933:16:0::1;:28:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;8873:92::o;4595:535::-;4657:9;4669:13;1439:7:7;:14;;1351:110;4669:13:0;4700:12;;4657:25;;-1:-1:-1;4700:12:0;;;;;4692:49;;;;-1:-1:-1;;;4692:49:0;;15869:2:18;4692:49:0;;;15851:21:18;15908:2;15888:18;;;15881:30;15947:27;15927:18;;;15920:55;15992:18;;4692:49:0;15667:349:18;4692:49:0;4774:1;4759:12;:16;4751:46;;;;-1:-1:-1;;;4751:46:0;;16223:2:18;4751:46:0;;;16205:21:18;16262:2;16242:18;;;16235:30;16301:18;16281;;;16274:46;16337:18;;4751:46:0;16021:340:18;4751:46:0;4828:18;;4812:12;:34;;4804:56;;;;-1:-1:-1;;;4804:56:0;;16568:2:18;4804:56:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;4804:56:0;16366:332:18;4804:56:0;4896:9;;4876:16;4880:12;4876:1;:16;:::i;:::-;:29;;4867:52;;;;-1:-1:-1;;;4867:52:0;;16568:2:18;4867:52:0;;;16550:21:18;16607:1;16587:18;;;16580:29;16645:11;16625:18;;;16618:39;16674:18;;4867:52:0;16366:332:18;4867:52:0;4961:12;4947:11;;:26;;;;:::i;:::-;4934:9;:39;;4926:70;;;;-1:-1:-1;;;4926:70:0;;16905:2:18;4926:70:0;;;16887:21:18;16944:2;16924:18;;;16917:30;16983:20;16963:18;;;16956:48;17021:18;;4926:70:0;16703:342:18;4926:70:0;5010:9;5005:101;5029:12;5025:1;:16;5005:101;;;5063:32;5073:10;5085:5;5089:1;5085;:5;:::i;5063:32::-;5043:3;;;:::i;:::-;;;5005:101;;1897:192:14;1070:6;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;1986:22:::1;::::0;::::1;1978:73;;;::::0;-1:-1:-1;;;1978:73:14;;20285:2:18;1978:73:14::1;::::0;::::1;20267:21:18::0;20324:2;20304:18;;;20297:30;20363:34;20343:18;;;20336:62;20434:8;20414:18;;;20407:36;20460:19;;1978:73:14::1;20083:402:18::0;1978:73:14::1;2062:19;2072:8;2062:9;:19::i;8302:117:0:-:0;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;8377:18:0::1;:38:::0;8302:117::o;7531:92::-;1070:6:14;;1217:23;1070:6;682:10:2;1217:23:14;1209:68;;;;-1:-1:-1;;;1209:68:14;;9984:2:18;1209:68:14;;;9966:21:18;;;10003:18;;;9996:30;10062:34;10042:18;;;10035:62;10114:18;;1209:68:14;9782:356:18;1209:68:14;7592:15:0::1;:27:::0;7531:92::o;696:305:6:-;798:4;835:40;;;850:25;835:40;;:105;;-1:-1:-1;892:48:6;;;907:33;892:48;835:105;:158;;;-1:-1:-1;886:25:5;871:40;;;;957:36:6;763:155:5;4196::6;4295:7;:14;4261:4;;4285:24;;:58;;;;;4341:1;4313:30;;:7;4321;4313:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;4278:65;4196:155;-1:-1:-1;;4196:155:6:o;6345:174::-;6420:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;6474:23;6420:24;6474:14;:23::i;:::-;6465:46;;;;;;;;;;;;6345:174;;:::o;2065:317:1:-;2180:6;2155:21;:31;;2147:73;;;;-1:-1:-1;;;2147:73:1;;20692:2:18;2147:73:1;;;20674:21:18;20731:2;20711:18;;;20704:30;20770:31;20750:18;;;20743:59;20819:18;;2147:73:1;20490:353:18;2147:73:1;2234:12;2252:9;:14;;2274:6;2252:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2233:52;;;2304:7;2296:78;;;;-1:-1:-1;;;2296:78:1;;21050:2:18;2296:78:1;;;21032:21:18;21089:2;21069:18;;;21062:30;21128:34;21108:18;;;21101:62;21199:28;21179:18;;;21172:56;21245:19;;2296:78:1;20848:422:18;4354:348:6;4447:4;4472:16;4480:7;4472;:16::i;:::-;4464:73;;;;-1:-1:-1;;;4464:73:6;;21477:2:18;4464:73:6;;;21459:21:18;21516:2;21496:18;;;21489:30;21555:34;21535:18;;;21528:62;21626:14;21606:18;;;21599:42;21658:19;;4464:73:6;21275:408:18;4464:73:6;4548:13;4564:23;4579:7;4564:14;:23::i;:::-;4548:39;;4617:5;4606:16;;:7;:16;;;:51;;;;4650:7;4626:31;;:20;4638:7;4626:11;:20::i;:::-;:31;;;4606:51;:87;;;-1:-1:-1;2954:25:6;;;;2930:4;2954:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;4661:32;4598:96;4354:348;-1:-1:-1;;;;4354:348:6:o;5826:516::-;5985:4;5958:31;;:23;5973:7;5958:14;:23::i;:::-;:31;;;5950:85;;;;-1:-1:-1;;;5950:85:6;;21890:2:18;5950:85:6;;;21872:21:18;21929:2;21909:18;;;21902:30;21968:34;21948:18;;;21941:62;22039:11;22019:18;;;22012:39;22068:19;;5950:85:6;21688:405:18;5950:85:6;6054:16;;;6046:65;;;;-1:-1:-1;;;6046:65:6;;22300:2:18;6046:65:6;;;22282:21:18;22339:2;22319:18;;;22312:30;22378:34;22358:18;;;22351:62;22449:6;22429:18;;;22422:34;22473:19;;6046:65:6;22098:400:18;6046:65:6;6228:29;6245:1;6249:7;6228:8;:29::i;:::-;6287:2;6268:7;6276;6268:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;6307:27;;6326:7;;6307:27;;;;;;;;;;6268:16;6307:27;5826:516;;;:::o;5748:187:0:-;5832:7;5851:14;5868:11;5874:4;5868:5;:11::i;:::-;5851:28;;5896:32;5910:6;5918:9;5896:13;:32::i;4818:321:6:-;4948:18;4954:2;4958:7;4948:5;:18::i;:::-;4999:54;5030:1;5034:2;5038:7;5047:5;4999:22;:54::i;:::-;4977:154;;;;-1:-1:-1;;;4977:154:6;;22705:2:18;4977:154:6;;;22687:21:18;22744:2;22724:18;;;22717:30;22783:34;22763:18;;;22756:62;22854:20;22834:18;;;22827:48;22892:19;;4977:154:6;22503:414:18;6854:128:0;6935:30;;;;;;;:22;:30;;;;;:39;;6969:5;;6935:30;:39;;6969:5;;6935:39;:::i;:::-;;;;-1:-1:-1;;;;6854:128:0:o;2097:173:14:-;2172:6;;;;2189:17;;;;;;;;;;;2222:40;;2172:6;;;2189:17;2172:6;;2222:40;;2153:16;;2222:40;2142:128;2097:173;:::o;6987:128:0:-;7068:30;;;;;;;:22;:30;;;;;:39;;7102:5;;7068:30;:39;;7102:5;;7068:39;:::i;3878:315:6:-;4035:28;4045:4;4051:2;4055:7;4035:9;:28::i;:::-;4082:48;4105:4;4111:2;4115:7;4124:5;4082:22;:48::i;:::-;4074:111;;;;-1:-1:-1;;;4074:111:6;;22705:2:18;4074:111:6;;;22687:21:18;22744:2;22724:18;;;22717:30;22783:34;22763:18;;;22756:62;22854:20;22834:18;;;22827:48;22892:19;;4074:111:6;22503:414:18;7135:88:0;7186:13;7212:7;7205:14;;;;;:::i;288:723:17:-;344:13;565:10;561:53;;-1:-1:-1;;592:10:17;;;;;;;;;;;;;;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:17;;-1:-1:-1;744:2:17;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:17;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:17;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;949:11:17;958:2;949:11;;:::i;:::-;;;818:154;;5941:230:0;5999:7;6025:135;6076:36;6142:4;6126:22;;;;;;6052:106;;;;;;;;23213:25:18;;;23269:2;23254:18;;23247:34;23201:2;23186:18;;23039:248;6052:106:0;;;;;;;;;;;;;6042:117;;;;;;6025:16;:135::i;4393:231:3:-;4471:7;4492:17;4511:18;4533:27;4544:4;4550:9;4533:10;:27::i;:::-;4491:69;;;;4571:18;4583:5;4571:11;:18::i;5142:346:6:-;5222:16;;;5214:61;;;;-1:-1:-1;;;5214:61:6;;23494:2:18;5214:61:6;;;23476:21:18;;;23513:18;;;23506:30;23572:34;23552:18;;;23545:62;23624:18;;5214:61:6;23292:356:18;5214:61:6;5295:16;5303:7;5295;:16::i;:::-;5294:17;5286:58;;;;-1:-1:-1;;;5286:58:6;;23855:2:18;5286:58:6;;;23837:21:18;23894:2;23874:18;;;23867:30;23933;23913:18;;;23906:58;23981:18;;5286:58:6;23653:352:18;5286:58:6;5413:7;:16;;;;;;;-1:-1:-1;5413:16:6;;;;;;;;;;;;;;;;;;5447:33;;5472:7;;-1:-1:-1;5447:33:6;;-1:-1:-1;;5447:33:6;5142:346;;:::o;6522:799::-;6677:4;6698:13;;;1066:20:1;1114:8;6694:620:6;;6734:72;;;;;:36;;;;;;:72;;682:10:2;;6785:4:6;;6791:7;;6800:5;;6734:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6734:72:6;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6730:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6976:13:6;;6972:272;;7019:60;;-1:-1:-1;;;7019:60:6;;22705:2:18;7019:60:6;;;22687:21:18;22744:2;22724:18;;;22717:30;22783:34;22763:18;;;22756:62;22854:20;22834:18;;;22827:48;22892:19;;7019:60:6;22503:414:18;6972:272:6;7194:6;7188:13;7179:6;7175:2;7171:15;7164:38;6730:529;6857:51;;6867:41;6857:51;;-1:-1:-1;6850:58:6;;6694:620;-1:-1:-1;7298:4:6;6522:799;;;;;;:::o;4439:167:4:-;4516:7;4543:55;4565:20;:18;:20::i;:::-;4587:10;9437:57:3;;26759:66:18;9437:57:3;;;26747:79:18;26842:11;;;26835:27;;;26878:12;;;26871:28;;;9400:7:3;;26915:12:18;;9437:57:3;;;;;;;;;;;;9427:68;;;;;;9420:75;;9307:196;;;;;2283:1308;2364:7;2373:12;2598:9;:16;2618:2;2598:22;2594:990;;;2894:4;2879:20;;2873:27;2944:4;2929:20;;2923:27;3002:4;2987:20;;2981:27;2637:9;2973:36;3045:25;3056:4;2973:36;2873:27;2923;3045:10;:25::i;:::-;3038:32;;;;;;;;;2594:990;3092:9;:16;3112:2;3092:22;3088:496;;;3367:4;3352:20;;3346:27;3418:4;3403:20;;3397:27;3460:23;3471:4;3346:27;3397;3460:10;:23::i;:::-;3453:30;;;;;;;;3088:496;-1:-1:-1;3532:1:3;;-1:-1:-1;3536:35:3;3088:496;2283:1308;;;;;:::o;554:643::-;632:20;623:5;:29;;;;;;;;:::i;:::-;;619:571;;;554:643;:::o;619:571::-;730:29;721:5;:38;;;;;;;;:::i;:::-;;717:473;;;776:34;;-1:-1:-1;;;776:34:3;;25172:2:18;776:34:3;;;25154:21:18;25211:2;25191:18;;;25184:30;25250:26;25230:18;;;25223:54;25294:18;;776:34:3;24970:348:18;717:473:3;841:35;832:5;:44;;;;;;;;:::i;:::-;;828:362;;;893:41;;-1:-1:-1;;;893:41:3;;25525:2:18;893:41:3;;;25507:21:18;25564:2;25544:18;;;25537:30;25603:33;25583:18;;;25576:61;25654:18;;893:41:3;25323:355:18;828:362:3;965:30;956:5;:39;;;;;;;;:::i;:::-;;952:238;;;1012:44;;-1:-1:-1;;;1012:44:3;;25885:2:18;1012:44:3;;;25867:21:18;25924:2;25904:18;;;25897:30;25963:34;25943:18;;;25936:62;26034:4;26014:18;;;26007:32;26056:19;;1012:44:3;25683:398:18;952:238:3;1087:30;1078:5;:39;;;;;;;;:::i;:::-;;1074:116;;;1134:44;;-1:-1:-1;;;1134:44:3;;26288:2:18;1134:44:3;;;26270:21:18;26327:2;26307:18;;;26300:30;26366:34;26346:18;;;26339:62;26437:4;26417:18;;;26410:32;26459:19;;1134:44:3;26086:398:18;3212:314:4;3265:7;3297:4;3289:29;3306:12;3289:29;;:66;;;;;3339:16;3322:13;:33;3289:66;3285:234;;;-1:-1:-1;3379:24:4;;3212:314::o;3285:234::-;-1:-1:-1;3715:73:4;;;3465:10;3715:73;;;;27600:25:18;;;;3477:12:4;27641:18:18;;;27634:34;3491:15:4;27684:18:18;;;27677:34;3759:13:4;27727:18:18;;;27720:34;3782:4:4;27770:19:18;;;;27763:84;;;;3715:73:4;;;;;;;;;;27572:19:18;;;;3715:73:4;;;3705:84;;;;;;3212:314::o;5845:1632:3:-;5976:7;;6910:66;6897:79;;6893:163;;;-1:-1:-1;7009:1:3;;-1:-1:-1;7013:30:3;6993:51;;6893:163;7070:1;:7;;7075:2;7070:7;;:18;;;;;7081:1;:7;;7086:2;7081:7;;7070:18;7066:102;;;-1:-1:-1;7121:1:3;;-1:-1:-1;7125:30:3;7105:51;;7066:102;7282:24;;;7265:14;7282:24;;;;;;;;;27165:25:18;;;27238:4;27226:17;;27206:18;;;27199:45;;;;27260:18;;;27253:34;;;27303:18;;;27296:34;;;7282:24:3;;27137:19:18;;7282:24:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7282:24:3;;;;;;-1:-1:-1;;7321:20:3;;;7317:103;;7374:1;7378:29;7358:50;;;;;;;7317:103;7440:6;-1:-1:-1;7448:20:3;;-1:-1:-1;5845:1632:3;;;;;;;;:::o;4887:344::-;5001:7;;5060:66;5047:80;;5001:7;5154:25;5170:3;5155:18;;;5177:2;5154:25;:::i;:::-;5138:42;;5198:25;5209:4;5215:1;5218;5221;5198:10;:25::i;:::-;5191:32;;;;;;4887:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;316:177:18;401:66;394:5;390:78;383:5;380:89;370:117;;483:1;480;473:12;498:245;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;664:9;651:23;683:30;707:5;683:30;:::i;940:180::-;999:6;1052:2;1040:9;1031:7;1027:23;1023:32;1020:52;;;1068:1;1065;1058:12;1020:52;-1:-1:-1;1091:23:18;;940:180;-1:-1:-1;940:180:18:o;1125:184::-;1177:77;1174:1;1167:88;1274:4;1271:1;1264:15;1298:4;1295:1;1288:15;1314:778;1357:5;1410:3;1403:4;1395:6;1391:17;1387:27;1377:55;;1428:1;1425;1418:12;1377:55;1464:6;1451:20;1490:18;1527:2;1523;1520:10;1517:36;;;1533:18;;:::i;:::-;1667:2;1661:9;1729:4;1721:13;;1572:66;1717:22;;;1741:2;1713:31;1709:40;1697:53;;;1765:18;;;1785:22;;;1762:46;1759:72;;;1811:18;;:::i;:::-;1851:10;1847:2;1840:22;1886:2;1878:6;1871:18;1932:3;1925:4;1920:2;1912:6;1908:15;1904:26;1901:35;1898:55;;;1949:1;1946;1939:12;1898:55;2013:2;2006:4;1998:6;1994:17;1987:4;1979:6;1975:17;1962:54;2060:1;2053:4;2048:2;2040:6;2036:15;2032:26;2025:37;2080:6;2071:15;;;;;;1314:778;;;;:::o;2097:322::-;2166:6;2219:2;2207:9;2198:7;2194:23;2190:32;2187:52;;;2235:1;2232;2225:12;2187:52;2275:9;2262:23;2308:18;2300:6;2297:30;2294:50;;;2340:1;2337;2330:12;2294:50;2363;2405:7;2396:6;2385:9;2381:22;2363:50;:::i;2424:258::-;2496:1;2506:113;2520:6;2517:1;2514:13;2506:113;;;2596:11;;;2590:18;2577:11;;;2570:39;2542:2;2535:10;2506:113;;;2637:6;2634:1;2631:13;2628:48;;;-1:-1:-1;;2672:1:18;2654:16;;2647:27;2424:258::o;2687:317::-;2729:3;2767:5;2761:12;2794:6;2789:3;2782:19;2810:63;2866:6;2859:4;2854:3;2850:14;2843:4;2836:5;2832:16;2810:63;:::i;:::-;2918:2;2906:15;2923:66;2902:88;2893:98;;;;2993:4;2889:109;;2687:317;-1:-1:-1;;2687:317:18:o;3009:220::-;3158:2;3147:9;3140:21;3121:4;3178:45;3219:2;3208:9;3204:18;3196:6;3178:45;:::i;3465:154::-;3551:42;3544:5;3540:54;3533:5;3530:65;3520:93;;3609:1;3606;3599:12;3624:315;3692:6;3700;3753:2;3741:9;3732:7;3728:23;3724:32;3721:52;;;3769:1;3766;3759:12;3721:52;3808:9;3795:23;3827:31;3852:5;3827:31;:::i;:::-;3877:5;3929:2;3914:18;;;;3901:32;;-1:-1:-1;;;3624:315:18:o;4126:255::-;4193:6;4246:2;4234:9;4225:7;4221:23;4217:32;4214:52;;;4262:1;4259;4252:12;4214:52;4301:9;4288:23;4320:31;4345:5;4320:31;:::i;4386:456::-;4463:6;4471;4479;4532:2;4520:9;4511:7;4507:23;4503:32;4500:52;;;4548:1;4545;4538:12;4500:52;4587:9;4574:23;4606:31;4631:5;4606:31;:::i;:::-;4656:5;-1:-1:-1;4713:2:18;4698:18;;4685:32;4726:33;4685:32;4726:33;:::i;:::-;4386:456;;4778:7;;-1:-1:-1;;;4832:2:18;4817:18;;;;4804:32;;4386:456::o;4847:542::-;4934:6;4942;4995:2;4983:9;4974:7;4970:23;4966:32;4963:52;;;5011:1;5008;5001:12;4963:52;5051:9;5038:23;5080:18;5121:2;5113:6;5110:14;5107:34;;;5137:1;5134;5127:12;5107:34;5160:50;5202:7;5193:6;5182:9;5178:22;5160:50;:::i;:::-;5150:60;;5263:2;5252:9;5248:18;5235:32;5219:48;;5292:2;5282:8;5279:16;5276:36;;;5308:1;5305;5298:12;5276:36;;5331:52;5375:7;5364:8;5353:9;5349:24;5331:52;:::i;:::-;5321:62;;;4847:542;;;;;:::o;5394:610::-;5490:6;5498;5506;5559:2;5547:9;5538:7;5534:23;5530:32;5527:52;;;5575:1;5572;5565:12;5527:52;5611:9;5598:23;5588:33;;5672:2;5661:9;5657:18;5644:32;5695:18;5736:2;5728:6;5725:14;5722:34;;;5752:1;5749;5742:12;5722:34;5775:50;5817:7;5808:6;5797:9;5793:22;5775:50;:::i;:::-;5765:60;;5878:2;5867:9;5863:18;5850:32;5834:48;;5907:2;5897:8;5894:16;5891:36;;;5923:1;5920;5913:12;5891:36;;5946:52;5990:7;5979:8;5968:9;5964:24;5946:52;:::i;:::-;5936:62;;;5394:610;;;;;:::o;6261:632::-;6432:2;6484:21;;;6554:13;;6457:18;;;6576:22;;;6403:4;;6432:2;6655:15;;;;6629:2;6614:18;;;6403:4;6698:169;6712:6;6709:1;6706:13;6698:169;;;6773:13;;6761:26;;6842:15;;;;6807:12;;;;6734:1;6727:9;6698:169;;;-1:-1:-1;6884:3:18;;6261:632;-1:-1:-1;;;;;;6261:632:18:o;6898:160::-;6963:20;;7019:13;;7012:21;7002:32;;6992:60;;7048:1;7045;7038:12;6992:60;6898:160;;;:::o;7063:180::-;7119:6;7172:2;7160:9;7151:7;7147:23;7143:32;7140:52;;;7188:1;7185;7178:12;7140:52;7211:26;7227:9;7211:26;:::i;7248:367::-;7311:8;7321:6;7375:3;7368:4;7360:6;7356:17;7352:27;7342:55;;7393:1;7390;7383:12;7342:55;-1:-1:-1;7416:20:18;;7459:18;7448:30;;7445:50;;;7491:1;7488;7481:12;7445:50;7528:4;7520:6;7516:17;7504:29;;7588:3;7581:4;7571:6;7568:1;7564:14;7556:6;7552:27;7548:38;7545:47;7542:67;;;7605:1;7602;7595:12;7620:773;7742:6;7750;7758;7766;7819:2;7807:9;7798:7;7794:23;7790:32;7787:52;;;7835:1;7832;7825:12;7787:52;7875:9;7862:23;7904:18;7945:2;7937:6;7934:14;7931:34;;;7961:1;7958;7951:12;7931:34;8000:70;8062:7;8053:6;8042:9;8038:22;8000:70;:::i;:::-;8089:8;;-1:-1:-1;7974:96:18;-1:-1:-1;8177:2:18;8162:18;;8149:32;;-1:-1:-1;8193:16:18;;;8190:36;;;8222:1;8219;8212:12;8190:36;;8261:72;8325:7;8314:8;8303:9;8299:24;8261:72;:::i;:::-;7620:773;;;;-1:-1:-1;8352:8:18;-1:-1:-1;;;;7620:773:18:o;8398:315::-;8463:6;8471;8524:2;8512:9;8503:7;8499:23;8495:32;8492:52;;;8540:1;8537;8530:12;8492:52;8579:9;8566:23;8598:31;8623:5;8598:31;:::i;:::-;8648:5;-1:-1:-1;8672:35:18;8703:2;8688:18;;8672:35;:::i;:::-;8662:45;;8398:315;;;;;:::o;8718:666::-;8813:6;8821;8829;8837;8890:3;8878:9;8869:7;8865:23;8861:33;8858:53;;;8907:1;8904;8897:12;8858:53;8946:9;8933:23;8965:31;8990:5;8965:31;:::i;:::-;9015:5;-1:-1:-1;9072:2:18;9057:18;;9044:32;9085:33;9044:32;9085:33;:::i;:::-;9137:7;-1:-1:-1;9191:2:18;9176:18;;9163:32;;-1:-1:-1;9246:2:18;9231:18;;9218:32;9273:18;9262:30;;9259:50;;;9305:1;9302;9295:12;9259:50;9328;9370:7;9361:6;9350:9;9346:22;9328:50;:::i;:::-;9318:60;;;8718:666;;;;;;;:::o;9389:388::-;9457:6;9465;9518:2;9506:9;9497:7;9493:23;9489:32;9486:52;;;9534:1;9531;9524:12;9486:52;9573:9;9560:23;9592:31;9617:5;9592:31;:::i;:::-;9642:5;-1:-1:-1;9699:2:18;9684:18;;9671:32;9712:33;9671:32;9712:33;:::i;:::-;9764:7;9754:17;;;9389:388;;;;;:::o;10143:437::-;10222:1;10218:12;;;;10265;;;10286:61;;10340:4;10332:6;10328:17;10318:27;;10286:61;10393:2;10385:6;10382:14;10362:18;10359:38;10356:218;;;10430:77;10427:1;10420:88;10531:4;10528:1;10521:15;10559:4;10556:1;10549:15;10356:218;;10143:437;;;:::o;12232:184::-;12284:77;12281:1;12274:88;12381:4;12378:1;12371:15;12405:4;12402:1;12395:15;12421:128;12461:3;12492:1;12488:6;12485:1;12482:13;12479:39;;;12498:18;;:::i;:::-;-1:-1:-1;12534:9:18;;12421:128::o;12554:228::-;12594:7;12720:1;12652:66;12648:74;12645:1;12642:81;12637:1;12630:9;12623:17;12619:105;12616:131;;;12727:18;;:::i;:::-;-1:-1:-1;12767:9:18;;12554:228::o;12787:184::-;12839:77;12836:1;12829:88;12936:4;12933:1;12926:15;12960:4;12957:1;12950:15;12976:120;13016:1;13042;13032:35;;13047:18;;:::i;:::-;-1:-1:-1;13081:9:18;;12976:120::o;13101:125::-;13141:4;13169:1;13166;13163:8;13160:34;;;13174:18;;:::i;:::-;-1:-1:-1;13211:9:18;;13101:125::o;14722:184::-;14774:77;14771:1;14764:88;14871:4;14868:1;14861:15;14895:4;14892:1;14885:15;14911:195;14950:3;14981:66;14974:5;14971:77;14968:103;;;15051:18;;:::i;:::-;-1:-1:-1;15098:1:18;15087:13;;14911:195::o;19608:470::-;19787:3;19825:6;19819:13;19841:53;19887:6;19882:3;19875:4;19867:6;19863:17;19841:53;:::i;:::-;19957:13;;19916:16;;;;19979:57;19957:13;19916:16;20013:4;20001:17;;19979:57;:::i;:::-;20052:20;;19608:470;-1:-1:-1;;;;19608:470:18:o;22922:112::-;22954:1;22980;22970:35;;22985:18;;:::i;:::-;-1:-1:-1;23019:9:18;;22922:112::o;24010:512::-;24204:4;24233:42;24314:2;24306:6;24302:15;24291:9;24284:34;24366:2;24358:6;24354:15;24349:2;24338:9;24334:18;24327:43;;24406:6;24401:2;24390:9;24386:18;24379:34;24449:3;24444:2;24433:9;24429:18;24422:31;24470:46;24511:3;24500:9;24496:19;24488:6;24470:46;:::i;:::-;24462:54;24010:512;-1:-1:-1;;;;;;24010:512:18:o;24527:249::-;24596:6;24649:2;24637:9;24628:7;24624:23;24620:32;24617:52;;;24665:1;24662;24655:12;24617:52;24697:9;24691:16;24716:30;24740:5;24716:30;:::i;24781:184::-;24833:77;24830:1;24823:88;24930:4;24927:1;24920:15;24954:4;24951:1;24944:15
Swarm Source
ipfs://bcf6951d7ed4f556a1de856882fd8cd1535000c97d9d4568cdf24aafca2b9ef2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.