Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14503535 | 949 days ago | IN | 0 ETH | 0.23619313 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ERC721RandomizedCollectionV2
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-02 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // // // .;dkkkkkkkkkkkkkkkkkkd' .:xkkkkkkkkd, .:dk0XXXXXXXK0xdl,. .lxkkkkkkkkkkkkkkkkkk:.,okkkkkkko. .cxkkkkkkxc. ;dkkkkkko. // // ;xNMMMMMMMMMMMMMMMMMMMX: .:kNWMMMMMMMMWx. .l0NWWWWWMMMMMMMMMWNO;..lKWMMMMMMMMMMMMMMMMMMMKkKWMMMMMMMK, .c0WMMMMMMMMX: .;xXWMMMMMNo. // // .,lddddddddddddddddxKMMMK; .,lddddddx0WMMMX; .;llc::;;::cox0XWMMMMMWXdcoddddddddddddddddONMW0ddddddxXMMMK, .:odddddONMMMMO' .,lddddd0WWd. // // .. .dWWKl. . :XMMMWx. ... .,oKWMMMMWx. ,KMNc .kMMM0, .. .xWMMMWx'. 'kNk. // // .. .dKo' .. .xWMMMK; .. .'.. ,OWWMMWx. ,Okc' .kMMMK, .. ,0MMMMXl. .dNO' // // .. .:ooo;......,' . :XMMMWd. . .l0XXOc. ;xKMWNo. ,looc'......'... .kMMMK, .. cXMMM0, .oNK; // // .. '0MMMk. .. .kWMMMK,.' ;KMMMWNo. .;kNkc,. .dWMMK: .. .kMMMK, .. .dWMXc cXK: // // .. '0MMMXkxxxxxxxxd' . .:. cXMMMWd,' '0MMMMM0l;;;;;;:c;. .. .dWMMW0xxxxxxxxx; .kMMMK, .. 'ONd. :KXc // // .. '0MMMMMMMMMMMMMNc .. :O: .kMMMMK:. 'd0NWMWWWWWWWNXOl'... .dWMMMMMMMMMMMMWl .kMMMK, . :d' ;0No. // // .. .lkkkkkkkkkKWMMNc . .dNd. cNMMMWo.. .':dOXWMMMMMMMWXk:. :xkkkkkkkk0NMMWl .kMMMK, . . 'ONd. // // .. .oNMXd... '0M0' .kMMMM0, .. .;o0NMMMMMMWx. ,0MN0: .kMMMK, .. .kW0' // // .. cKk, . lNMNl cNMMMNo .',.. .;xXWMMMWx. 'O0c'. .kMMMK, .. .xWMO. // // .. .,ccc,.....,,. .. .kMMMk. .OMMMW0;'d0XX0xc,. :d0MMWx. ':cc:'....';. .. .kMMMK, .. .oNMMO. // // .. '0MMMk. .. ,kKKKk' lNMMMN0KWWWMMMWNKl. cXMWx. .dWMMX: .. .kMMMK, .. .OMMMO. // // .. '0MMMk'.......... ..... 'OMMKo:::::cxNMMMKl'. .OMWx. .dWMMXc.......... .kMMMK:.........,' .OMMMO. // // .. '0MMMNXKKKKKKKKd. lNM0' ;XMMMWN0c .OMWd. .dWMMWXKKKKKKKK0c .kMMMWXKKKKKKKKK0: .OMMMO. // // .. 'OWWWWWWWWWWMMNc 'llc' . '0MNc .kWMMMMX: ,KXx:. .oNWWWWWWWWWWMMWl .xWWWWWWWWWWWMMMN: .OMMMO. // // .. ,:::::::::cOWO. .xWWO' . oNMO' .lkOOx;. .'cd,... .::::::::::dXMWl '::::::::::xWMMX: .OMMWx. // // .. dNl ,0Xd. .. ,0MNo. . ..'. .. ,0WK: :NWOo, .OWKo. // // .' .oO, .co, .. .oOc.... ... .. ,xo,.. ckl..'. 'dd' // // ............................. .......... . .. . ..................... ..................... ......... // // // // // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address internal _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); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. * * This ERC721 Has been adjusted from OpenZepplins to have a totalSupply method. It also is set up to better handle * batch transactions. Namely it does not update _balances on a call to {_mint} and expects the minting method to do so. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; struct AddressData { uint128 balance; uint128 numberMinted; } // Token name string internal _name; // Token symbol string internal _symbol; // Tracking total minted // Only used when `_isSequential` is false uint256 internal _totalMinted; // Tracking total burned uint256 internal _totalBurned; // Tracking the next sequential mint uint256 internal _nextSequential; // This ensures that ownerOf() can still run in constant time // With a max runtime of checking 10 variables, but saves on batch mints tremendously. uint256 internal constant MAX_OWNER_SEQUENCE = 10; // Tracking if the collection is still sequentially minted bool internal _notSequentialMint; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping from token ID to burned // This is necessary because to optimize gas fees for multiple mints a token with // `_owners[tokenId] = address(0)` is not necessarily a token with no owner. mapping(uint256 => bool) internal _burned; // Mapping owner address to token count mapping(address => AddressData) internal _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner].balance; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: owner query for nonexistent token"); if (tokenId < _nextSequential) { uint256 lowestTokenToCheck; if (tokenId >= MAX_OWNER_SEQUENCE) { lowestTokenToCheck = tokenId - MAX_OWNER_SEQUENCE + 1; } for (uint256 i = tokenId; i >= lowestTokenToCheck; i--) { if (_owners[i] != address(0)) { return _owners[i]; } } } return _owners[tokenId]; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the total current supply of the contract. * * WARNING - Underlying variables do NOT get automatically updated on mints * so that we can save gas on transactions that mint multiple tokens. * */ function totalSupply() public view virtual returns (uint256) { return totalMinted() - _totalBurned; } /** * @dev Returns the total ever minted from this contract. * * WARNING - Underlying variable do NOT get automatically updated on mints * so that we can save gas on transactions that mint multiple tokens. * */ function totalMinted() public view virtual returns (uint256) { if (_notSequentialMint) { return _totalMinted; } return _nextSequential; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { address owner = ERC721.ownerOf(tokenId); require( _isApprovedOrOwner(_msgSender(), tokenId, owner), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId, owner); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * This was modified to not call _safeTransfer because that would require fetching * ownerOf() twice which is more expensive than doing it together. * _safeTransfer was not modified to take in owner because functions using that * method should be able to assume that it will check for the tokenOwner. * * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { address owner = ERC721.ownerOf(tokenId); require( _isApprovedOrOwner(_msgSender(), tokenId, owner), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId, owner); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId, ERC721.ownerOf(tokenId)); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { if (_burned[tokenId]) { return false; } if (tokenId < _nextSequential) { return true; } return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner( address spender, uint256 tokenId, address owner ) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * WARNING - this method does not update totalSupply or _balances, please update that externally. Doing so * will allow us to save gas on transactions that mint more than one NFT * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. * WARNING: This method does not update totalSupply, please update that externally. Doing so * will allow us to save gas on transactions */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * WARNING: This method does not update totalSupply or _balances, please update that externally. Doing so * will allow us to save gas on transactions that mint more than one NFT * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(_notSequentialMint, "_notSequentialMint must be true"); require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Mints from `_nextSequential` to `_nextSequential + quantity` and transfers it to `to`. * * WARNING: This method does not update totalSupply or _balances, please update that externally. Doing so * will allow us to save gas on transactions that mint more than one NFT * * Requirements: * * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _safeMintSequential(address to, uint256 quantity) internal virtual { require(!_notSequentialMint, "_notSequentialMint must be false"); require(to != address(0), "ERC721: mint to the zero address"); uint256 lastNum = _nextSequential + quantity; // ensures ownerOf runs quickly even if user is minting a large number like 100 for ( uint256 i = _nextSequential; i < lastNum; i += MAX_OWNER_SEQUENCE ) { _owners[i] = to; } // Gas is cheaper to have two separate for loops for (uint256 i = _nextSequential; i < lastNum; i++) { emit Transfer(address(0), to, i); require( _checkOnERC721Received(address(0), to, i, ""), "ERC721: transfer to non ERC721Receiver implementer" ); } _balances[to] = AddressData( _balances[to].balance + uint128(quantity), _balances[to].numberMinted + uint128(quantity) ); _nextSequential = lastNum; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); require(owner == _msgSender(), "Cannot burn a token you do not own"); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId, owner); _balances[owner].balance -= 1; _totalBurned += 1; _burned[tokenId] = true; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * WARNING this method assumes the passed in owner is the token owner. This is done because with the gas optimization * calling ownerOf can be an expensive calculation and should only be done once (in the outer most layer) * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId, address owner ) internal virtual { require(owner == 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, from); _balances[from].balance -= 1; _balances[to].balance += 1; _owners[tokenId] = to; uint256 nextTokenId = tokenId + 1; if (nextTokenId < _nextSequential) { if (_owners[nextTokenId] == address(0)) { _owners[nextTokenId] = from; } } emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) internal virtual { if (_tokenApprovals[tokenId] != to) { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * ERC165 bytes to add to interface array - set in parent contract * implementing this standard * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; * _registerInterface(_INTERFACE_ID_ERC2981); */ /** * @notice Called with the sale price to determine how much royalty * is owed and to whom. * @param _tokenId - the NFT asset queried for royalty information * @param _salePrice - the sale price of the NFT asset specified by _tokenId * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for _salePrice */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } /** * @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; uint8 v; assembly { s := and( vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ) v := add(shr(255, vs), 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 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) ); } } /** * @dev External interface of the EaselyPayout contract */ interface IEaselyPayout { /** * @dev Takes in a payable amount and splits it among the given royalties. * Also takes a cut of the payable amount depending on the sender and the primaryPayout address. * Ensures that this method never splits over 100% of the payin amount. */ function splitPayable( address primaryPayout, address[] memory royalties, uint256[] memory bps ) external payable; } /** * @dev Extension of the ERC721Enumerable contract that integrates a marketplace so that simple lazy-sales * do not have to be done on another contract. This saves gas fees on secondary sales because * buyers will not have to pay a gas fee to setApprovalForAll for another marketplace contract after buying. * * Easely will help power the lazy-selling as well as lazy minting that take place on * directly on the collection, which is why we take a cut of these transactions. Our cut can * be publically seen in the connected EaselyPayout contract and cannot exceed 5%. * * Owners also set an alternate signer which they can change at any time. This alternate signer helps enable * sales for large batches of addresses without needing to manually sign hundreds or thousands of hashes. */ abstract contract ERC721Marketplace is ERC721, Ownable { using ECDSA for bytes32; using Strings for uint256; /* see {IEaselyPayout} for more */ address public constant PAYOUT_CONTRACT_ADDRESS = 0x68f5C1e24677Ac4ae845Dde07504EAaD98f82572; uint256 public constant TIME_PER_DECREMENT = 300; uint256 public constant MAX_ROYALTIES_BPS = 9500; /* Optional basis points for the owner for secondary sales of this collection */ uint256 public constant MAX_SECONDARY_BPS = 1000; /* Let's the owner enable another address to lazy mint */ address public alternateSignerAddress; /* Optional basis points for the owner for secondary sales of this collection */ uint256 public ownerRoyaltyBPS; /* Optional addresses to distribute revenue of primary sales of this collection */ address[] public revenueShare; /* Optional basis points for revenue share for primary sales of this collection */ uint256[] public revenueShareBPS; /* Mapping to the active version for all signed transactions */ mapping(address => uint256) internal _addressToActiveVersion; /* Cancelled or finalized sales by hash to determine buyabliity */ mapping(bytes32 => bool) internal _cancelledOrFinalizedSales; // Events related to lazy selling event SaleCancelled(address indexed seller, bytes32 hash); event SaleCompleted( uint256 indexed tokenId, uint256 price, address indexed seller, address indexed buyer, bytes32 hash ); // Miscellaneous events event VersionChanged(address indexed seller, uint256 version); event AltSignerChanged(address newSigner); event BalanceWithdrawn(uint256 balance); event RoyaltyUpdated(uint256 bps); event RevenueShareUpdated( address address1, address address2, uint256 bps1, uint256 bps2 ); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(Ownable).interfaceId || interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @dev see {IERC2981-supportsInterface} */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { uint256 royalty = (_salePrice * ownerRoyaltyBPS) / 10000; return (owner(), royalty); } /** * @dev See {_currentPrice} */ function getCurrentPrice(uint256[4] memory pricesAndTimestamps) external view returns (uint256) { return _currentPrice(pricesAndTimestamps); } /** * @dev Returns the current activeVersion of an address both used to create signatures * and to verify signatures of {buyToken} and {buyNewToken} */ function getActiveVersion(address address_) external view returns (uint256) { return _addressToActiveVersion[address_]; } /** * This function, while callable by anybody will always ONLY withdraw the * contract's balance to: * * the owner's account * the addresses the owner has set up for revenue share * the easely payout contract cut - capped at 5% but can be lower for some users * * This is callable by anybody so that Easely can set up automatic payouts * after a contract has reached a certain minimum to save creators the gas fees * involved in withdrawing balances. */ function withdrawBalance(uint256 withdrawAmount) external { require(withdrawAmount <= address(this).balance); IEaselyPayout payoutContract = IEaselyPayout(PAYOUT_CONTRACT_ADDRESS); payoutContract.splitPayable{value: withdrawAmount}( owner(), revenueShare, revenueShareBPS ); emit BalanceWithdrawn(withdrawAmount); } /** * @dev Allows the owner to change who the alternate signer is */ function setAltSigner(address alt) external onlyOwner { alternateSignerAddress = alt; emit AltSignerChanged(alt); } /** * @dev see {_setRoyalties} */ function setRevenueShare( address[2] memory newAddresses, uint256[2] memory newBPS ) external onlyOwner { _setRevenueShare(newAddresses, newBPS); emit RevenueShareUpdated( newAddresses[0], newAddresses[1], newBPS[0], newBPS[1] ); } /** * @dev see {_setSecondary} */ function setRoyaltiesBPS(uint256 newBPS) external onlyOwner { _setRoyaltiesBPS(newBPS); emit RoyaltyUpdated(newBPS); } /** * @dev Usable by any user to update the version that they want their signatures to check. This is helpful if * an address wants to mass invalidate their signatures without having to call cancelSale on each one. */ function updateVersion(uint256 version) external { _addressToActiveVersion[_msgSender()] = version; emit VersionChanged(_msgSender(), version); } /** * @dev returns how many tokens the given address has minted. */ function mintCount(address addr) external view returns (uint256) { return _balances[addr].numberMinted; } /** * @dev Usable by the owner of any token initiate a sale for their token. This does not * lock the tokenId and the owner can freely trade their token, but doing so will * invalidate the ability for others to buy. */ function hashToSignToSellToken( uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) external view returns (bytes32) { require( _msgSender() == ERC721.ownerOf(tokenId), "Not the owner of the token" ); return _hashForSale( _msgSender(), version, nonce, tokenId, pricesAndTimestamps ); } /** * @dev With a hash signed by the method {hashToSignToSellToken} any user sending enough value can buy * the token from the seller. Tokens not owned by the contract owner are all considered secondary sales and * will give a cut to the owner of the contract based on the secondaryOwnerBPS. */ function buyToken( address seller, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps, bytes memory signature ) external payable { uint256 currentPrice = _currentPrice(pricesAndTimestamps); require( _addressToActiveVersion[seller] == version, "Incorrect signature version" ); require(msg.value >= currentPrice, "Not enough ETH to buy"); _markHashSold( seller, version, nonce, tokenId, pricesAndTimestamps, currentPrice, signature ); _safeTransfer(seller, _msgSender(), tokenId, ""); if (seller != owner()) { IEaselyPayout(PAYOUT_CONTRACT_ADDRESS).splitPayable{ value: currentPrice }(seller, _ownerRoyalties(), _ownerBPS()); } payable(_msgSender()).transfer(msg.value - currentPrice); } /** * @dev Usable to cancel hashes generated from {hashToSignToSellToken} */ function cancelSale( uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) external { bytes32 hash = _hashToCheckForSale( _msgSender(), version, nonce, tokenId, pricesAndTimestamps ); _cancelledOrFinalizedSales[hash] = true; emit SaleCancelled(_msgSender(), hash); } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual override returns (string memory) { return "ipfs://"; } /** * @dev helper method get ownerRoyalties into an array form */ function _ownerRoyalties() internal view returns (address[] memory) { address[] memory ownerRoyalties = new address[](1); ownerRoyalties[0] = owner(); return ownerRoyalties; } /** * @dev helper method get secondary BPS into array form */ function _ownerBPS() internal view returns (uint256[] memory) { uint256[] memory ownerBPS = new uint256[](1); ownerBPS[0] = ownerRoyaltyBPS; return ownerBPS; } /** * @dev Current price for a sale which is calculated for the case of a descending sale. So * the ending price must be less than the starting price and the timestamp is active. * Standard single fare sales will have a matching starting and ending price. */ function _currentPrice(uint256[4] memory pricesAndTimestamps) internal view returns (uint256) { uint256 startingPrice = pricesAndTimestamps[0]; uint256 endingPrice = pricesAndTimestamps[1]; uint256 startingTimestamp = pricesAndTimestamps[2]; uint256 endingTimestamp = pricesAndTimestamps[3]; uint256 currTime = block.timestamp; require(currTime >= startingTimestamp, "Has not started yet"); require( startingTimestamp < endingTimestamp, "Must end after it starts" ); require(startingPrice >= endingPrice, "Ending price cannot be bigger"); if (startingPrice == endingPrice || currTime > endingTimestamp) { return endingPrice; } uint256 diff = startingPrice - endingPrice; uint256 decrements = (currTime - startingTimestamp) / TIME_PER_DECREMENT; if (decrements == 0) { return startingPrice; } // decrements will equal 0 before totalDecrements does so we will not divide by 0 uint256 totalDecrements = (endingTimestamp - startingTimestamp) / TIME_PER_DECREMENT; return startingPrice - (diff / totalDecrements) * decrements; } /** * @dev Sets secondary BPS amount */ function _setRoyaltiesBPS(uint256 newBPS) internal { require( ownerRoyaltyBPS <= MAX_SECONDARY_BPS, "Cannot take more than 10% of secondaries" ); ownerRoyaltyBPS = newBPS; } /** * @dev Sets primary revenue share */ function _setRevenueShare( address[2] memory newAddresses, uint256[2] memory newBPS ) internal { require( newBPS[0] + newBPS[1] <= MAX_ROYALTIES_BPS, "Revenue share too high" ); revenueShare = newAddresses; revenueShareBPS = newBPS; } /** * @dev Checks if an address is either the owner, or the approved alternate signer. */ function _checkValidSigner(address signer) internal view { require( signer == owner() || signer == alternateSignerAddress, "Not valid signer." ); } /** * @dev First checks if a sale is valid by checking that the hash has not been cancelled or already completed * and that the correct address has given the signature. If both checks pass we mark the hash as complete and * emit an event. */ function _markHashSold( address seller, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps, uint256 salePrice, bytes memory signature ) internal { bytes32 hash = _hashToCheckForSale( seller, version, nonce, tokenId, pricesAndTimestamps ); require(!_cancelledOrFinalizedSales[hash], "Sale no longer active"); require( hash.recover(signature) == seller, "Not signed by current seller" ); _cancelledOrFinalizedSales[hash] = true; emit SaleCompleted(tokenId, salePrice, seller, _msgSender(), hash); } /** * @dev Hash an order, returning the hash that a client must sign, including the standard message prefix * @return Hash of message prefix and order hash per Ethereum format */ function _hashToCheckForSale( address owner, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return ECDSA.toEthSignedMessageHash( _hashForSale( owner, version, nonce, tokenId, pricesAndTimestamps ) ); } /** * @dev Hash an order, returning the hash that a client must sign, including the standard message prefix * @return Hash of message prefix and order hash per Ethereum format */ function _hashForSale( address owner, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return keccak256( abi.encode( address(this), block.chainid, owner, version, nonce, tokenId, pricesAndTimestamps ) ); } } /** * @dev This implements a lazy-minted, randomized collection of ERC721Marketplace. * It requires that the creator knows the total number of NFTs they want and has an IPFS * hash that is a directory with all the tokenIds from 0 to the #NFTs - 1. * * It has two main methods to lazy-mint, one allows the owner or alternate signer to approve single use signatures * for specific wallet addresses and the other allows a general mint signature that anyone can use. * * Minting from this collection is always random, this can be done either with a reveal * mechanism that has a random offset, or on-chain randomness if the collection is already revealed. */ contract ERC721RandomizedCollectionV2 is ERC721Marketplace { using ECDSA for bytes32; using Strings for uint256; bool public burnable; bool private hasInit = false; uint256 public constant MAX_SUPPLY_LIMIT = 10**9; uint256 public maxSupply; // Limits how much any single transaction can be uint256 public transactionMax; // Limits how much any single wallet can mint on a collection. uint256 public maxMint; // Used to shuffle tokenURI upon reveal uint256 public offset; // Mapping to enable constant time onchain randomness uint256[MAX_SUPPLY_LIMIT] private indices; string private ipfsHash; // Randomized Collection Events event Minted( address indexed buyer, uint256 amount, uint256 unitPrice, bytes32 hash ); event IpfsRevealed(string ipfsHash, bool locked); /** * @dev Constructor function */ constructor( bool[2] memory bools, address[3] memory addresses, uint256[6] memory uints, string[3] memory strings ) ERC721(strings[0], strings[1]) { addresses[0] = _msgSender(); _init(bools, addresses, uints, strings); } function init( bool[2] memory bools, address[3] memory addresses, uint256[6] memory uints, string[3] memory strings ) external { _init(bools, addresses, uints, strings); } function _init( bool[2] memory bools, address[3] memory addresses, uint256[6] memory uints, string[3] memory strings ) internal { require(!hasInit, "Already has be initiated"); hasInit = true; burnable = bools[0]; _notSequentialMint = bools[1]; _owner = msg.sender; address[2] memory revenueShare = [addresses[0], addresses[1]]; alternateSignerAddress = addresses[2]; _setRoyaltiesBPS(uints[0]); _setRevenueShare(revenueShare, [uints[1], uints[2]]); maxSupply = uints[3]; require(maxSupply < MAX_SUPPLY_LIMIT, "Collection is too big"); // Do not allow more than 100 mints a transaction so users cannot exceed gas limit if (uints[4] == 0 || uints[4] >= 25000) { transactionMax = 25000; } else { transactionMax = uints[4]; } maxMint = uints[5]; _name = strings[0]; _symbol = strings[1]; ipfsHash = strings[2]; if (_notSequentialMint) { emit IpfsRevealed(ipfsHash, false); } } function isRevealed() external view returns (bool) { return _notSequentialMint; } /** * @dev If this collection was created with burnable on, owners of tokens * can use this method to burn their tokens. Easely will keep track of * burns in case creators want to reward users for burning tokens. */ function burn(uint256 tokenId) external { require(burnable, "Tokens from this collection are not burnable"); _burn(tokenId); } /** * @dev Method used if the creator wants to keep their collection hidden until * a later release date. On reveal, a creator can decide if they want to * lock the unminted tokens or enable them for on-chain randomness minting. * * IMPORTANT - this function can only be called ONCE, if a wrong IPFS hash * is submitted by the owner, it cannot ever be switched to a different one. */ function lockTokenURI(string calldata revealIPFSHash, bool lockOnReveal) external onlyOwner { require(!_notSequentialMint, "The token URI has already been set"); offset = _random(maxSupply); ipfsHash = revealIPFSHash; _notSequentialMint = true; if (lockOnReveal) { // This will lock the unminted tokens at reveal time maxSupply = _nextSequential; } _totalMinted = _nextSequential; emit IpfsRevealed(revealIPFSHash, lockOnReveal); } /** * @dev tokenURI of a tokenId, will change to include the tokeId and an offset in * the URI once the collection has been revealed. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_notSequentialMint) { return string(abi.encodePacked(_baseURI(), ipfsHash)); } require(_exists(tokenId), "URI query for nonexistent token"); uint256 offsetId = (tokenId + offset) % maxSupply; return string( abi.encodePacked(_baseURI(), ipfsHash, "/", offsetId.toString()) ); } /** * @dev Hash that the owner or approved alternate signer then sign that the approved buyer * can use in order to call the {mintAllow} method. */ function hashToSignForAllowList( address allowedAddress, uint256 version, uint256 nonce, uint256 price, uint256 amount ) external view returns (bytes32) { _checkValidSigner(_msgSender()); return _hashForAllowList(allowedAddress, version, nonce, price, amount); } /** * @dev A way to invalidate a signature so the given params cannot be used in the {mintAllow} method. */ function cancelAllowList( address allowedAddress, uint256 version, uint256 nonce, uint256 price, uint256 amount ) external { _checkValidSigner(_msgSender()); bytes32 hash = _hashToCheckForAllowList( allowedAddress, version, nonce, price, amount ); _cancelledOrFinalizedSales[hash] = true; emit SaleCancelled(_msgSender(), hash); } /** * @dev Allows a user with an approved signature to mint at a price and quantity specified by the * contract. A user is still limited by totalSupply, transactionMax, and mintMax if populated. * signing with amount = 0 will allow any buyAmount less than the other limits. */ function mintAllow( address allowedAddress, uint256 version, uint256 nonce, uint256 price, uint256 amount, uint256 buyAmount, bytes memory signature ) external payable { require( totalMinted() + buyAmount <= maxSupply, "Over token supply limit" ); require(buyAmount == amount || amount == 0, "Over signature amount"); require(buyAmount <= transactionMax, "Over transaction limit"); require( version == _addressToActiveVersion[owner()], "This presale version is disabled" ); require(allowedAddress == _msgSender(), "Invalid sender"); uint256 totalPrice = price * buyAmount; require(msg.value >= totalPrice, "Msg value too small"); bytes32 hash = _hashToCheckForAllowList( allowedAddress, version, nonce, price, amount ); require( !_cancelledOrFinalizedSales[hash], "Signature no longer active" ); address signer = hash.recover(signature); _checkValidSigner(signer); _cancelledOrFinalizedSales[hash] = true; _mintRandom(_msgSender(), buyAmount); emit Minted(_msgSender(), buyAmount, price, hash); payable(_msgSender()).transfer(msg.value - totalPrice); } /** * @dev Hash that the owner or approved alternate signer then sign that buyers use * in order to call the {mint} method. */ function hashToSignForMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) external view returns (bytes32) { _checkValidSigner(_msgSender()); require(amount <= transactionMax, "Over transaction limit"); return _hashForMint(version, amount, pricesAndTimestamps); } /** * @dev A way to invalidate a signature so the given params cannot be used in the {mint} method. */ function cancelMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) external { _checkValidSigner(_msgSender()); bytes32 hash = _hashToCheckForMint( version, amount, pricesAndTimestamps ); _cancelledOrFinalizedSales[hash] = true; emit SaleCancelled(_msgSender(), hash); } /** * @dev Allows anyone to buy an amount of tokens at a price which matches * the signature that the owner or alternate signer has approved */ function mint( uint256 version, uint256 amount, uint256 buyAmount, uint256[4] memory pricesAndTimestamps, bytes memory signature ) external payable { require( totalMinted() + buyAmount <= maxSupply, "Over token supply limit" ); require(buyAmount == amount || amount == 0, "Over signature amount"); require(buyAmount <= transactionMax, "Over transaction limit"); require(version == _addressToActiveVersion[owner()], "Invalid version"); uint256 unitPrice = _currentPrice(pricesAndTimestamps); uint256 totalPrice = buyAmount * unitPrice; require(msg.value >= totalPrice, "Msg value too small"); bytes32 hash = _hashToCheckForMint( version, amount, pricesAndTimestamps ); require( !_cancelledOrFinalizedSales[hash], "Signature no longer active" ); address signer = hash.recover(signature); _checkValidSigner(signer); _mintRandom(_msgSender(), buyAmount); emit Minted(_msgSender(), buyAmount, totalPrice, hash); payable(_msgSender()).transfer(msg.value - totalPrice); } /** * @dev Hash an order that we need to check against the signature to see who the signer is. * see {_hashForAllowList} to see the hash that needs to be signed. */ function _hashToCheckForAllowList( address allowedAddress, uint256 nonce, uint256 version, uint256 price, uint256 amount ) internal view returns (bytes32) { return ECDSA.toEthSignedMessageHash( _hashForAllowList(allowedAddress, nonce, version, price, amount) ); } /** * @dev Hash that the owner or alternate wallet must sign to enable a {mintAllow} for a user * @return Hash of message prefix and order hash per Ethereum format */ function _hashForAllowList( address allowedAddress, uint256 nonce, uint256 version, uint256 price, uint256 amount ) internal view returns (bytes32) { return keccak256( abi.encode( address(this), block.chainid, owner(), allowedAddress, nonce, version, price, amount ) ); } /** * @dev Hash an order that we need to check against the signature to see who the signer is. * see {_hashForMint} to see the hash that needs to be signed. */ function _hashToCheckForMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return ECDSA.toEthSignedMessageHash( _hashForMint(version, amount, pricesAndTimestamps) ); } /** * @dev Hash that the owner or alternate wallet must sign to enable {mint} for all users */ function _hashForMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return keccak256( abi.encode( address(this), block.chainid, owner(), amount, pricesAndTimestamps, version ) ); } /// @notice Generates a pseudo random index of our tokens that has not been used so far function _mintRandomIndex(address buyer, uint256 amount) internal { // number of tokens left to create uint256 supplyLeft = maxSupply - _totalMinted; for (uint256 i = 0; i < amount; i++) { // generate a random index uint256 index = _random(supplyLeft); uint256 tokenAtPlace = indices[index]; uint256 tokenId; // if we havent stored a replacement token... if (tokenAtPlace == 0) { //... we just return the current index tokenId = index; } else { // else we take the replace we stored with logic below tokenId = tokenAtPlace; } // get the highest token id we havent handed out uint256 lastTokenAvailable = indices[supplyLeft - 1]; // we need to store a replacement token for the next time we roll the same index // if the last token is still unused... if (lastTokenAvailable == 0) { // ... we store the last token as index indices[index] = supplyLeft - 1; } else { // ... we store the token that was stored for the last token indices[index] = lastTokenAvailable; } _safeMint(buyer, tokenId + _nextSequential); supplyLeft--; } _balances[buyer] = AddressData( _balances[buyer].balance + uint128(amount), _balances[buyer].numberMinted + uint128(amount) ); } /// @notice Generates a pseudo random number based on arguments with decent entropy /// @param max The maximum value we want to receive /// @return A random number less than the max function _random(uint256 max) internal view returns (uint256) { if (max == 0) { return 0; } uint256 rand = uint256( keccak256( abi.encode( msg.sender, block.difficulty, block.timestamp, blockhash(block.number - 1) ) ) ); return rand % max; } /** * @dev Wrapper around {_mintRandomIndex} that incrementally if the collection has not * been revealed yet, which also checks the buyer has not exceeded maxMint count */ function _mintRandom(address buyer, uint256 amount) internal { require( maxMint == 0 || _balances[buyer].numberMinted + amount <= maxMint, "Buyer over mint maximum" ); if (_notSequentialMint) { _mintRandomIndex(buyer, amount); _totalMinted += amount; } else { _safeMintSequential(buyer, amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bool[2]","name":"bools","type":"bool[2]"},{"internalType":"address[3]","name":"addresses","type":"address[3]"},{"internalType":"uint256[6]","name":"uints","type":"uint256[6]"},{"internalType":"string[3]","name":"strings","type":"string[3]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"AltSignerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"BalanceWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"ipfsHash","type":"string"},{"indexed":false,"internalType":"bool","name":"locked","type":"bool"}],"name":"IpfsRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unitPrice","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Minted","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":"address1","type":"address"},{"indexed":false,"internalType":"address","name":"address2","type":"address"},{"indexed":false,"internalType":"uint256","name":"bps1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bps2","type":"uint256"}],"name":"RevenueShareUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"RoyaltyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"SaleCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"SaleCompleted","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"VersionChanged","type":"event"},{"inputs":[],"name":"MAX_ROYALTIES_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SECONDARY_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYOUT_CONTRACT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_PER_DECREMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alternateSignerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"buyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"cancelAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"cancelMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"cancelSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getActiveVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"hashToSignForAllowList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"hashToSignForMint","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"hashToSignToSellToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool[2]","name":"bools","type":"bool[2]"},{"internalType":"address[3]","name":"addresses","type":"address[3]"},{"internalType":"uint256[6]","name":"uints","type":"uint256[6]"},{"internalType":"string[3]","name":"strings","type":"string[3]"}],"name":"init","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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"revealIPFSHash","type":"string"},{"internalType":"bool","name":"lockOnReveal","type":"bool"}],"name":"lockTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMint","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":"version","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintAllow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerRoyaltyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revenueShare","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revenueShareBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"alt","type":"address"}],"name":"setAltSigner","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":"address[2]","name":"newAddresses","type":"address[2]"},{"internalType":"uint256[2]","name":"newBPS","type":"uint256[2]"}],"name":"setRevenueShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBPS","type":"uint256"}],"name":"setRoyaltiesBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"updateVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526012805461ff00191690553480156200001c57600080fd5b50604051620056d7380380620056d78339810160408190526200003f916200081e565b8051602080830151825190916200005c916000918501906200046e565b508051620000729060019060208401906200046e565b5050506200008f62000089620000aa60201b60201c565b620000ae565b338352620000a08484848462000100565b5050505062000a28565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601254610100900460ff16156200015e5760405162461bcd60e51b815260206004820152601860248201527f416c72656164792068617320626520696e69746961746564000000000000000060448201526064015b60405180910390fd5b601280548551151561ffff19909116176101001790556020808501516005805460ff1916911515919091179055600b8054336001600160a01b03199182161790915560408051808201825286516001600160a01b0390811682528785015181169482019490945290860151600c8054919094169216919091179091558251620001e79062000378565b6200023a816040518060400160405280866001600681106200020d576200020d620008eb565b60200201518152602001866002600681106200022d576200022d620008eb565b60200201519052620003e4565b60608301516013819055633b9aca0011620002985760405162461bcd60e51b815260206004820152601560248201527f436f6c6c656374696f6e20697320746f6f206269670000000000000000000000604482015260640162000155565b60808301511580620002b0575060808301516161a811155b15620002c2576161a8601455620002cb565b60808301516014555b60a083015160155581518051620002eb916000916020909101906200046e565b506020808301518051620003049260019201906200046e565b50604082015180516200032391633b9aca17916020909101906200046e565b5060055460ff161562000371577fb49211183e2638d94c3f410d8bdcba715a7dcae24a1058226cb9a46b68cd7357633b9aca176000604051620003689291906200093e565b60405180910390a15b5050505050565b6103e8600d541115620003df5760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f742074616b65206d6f7265207468616e20313025206f66207365636044820152676f6e64617269657360c01b606482015260840162000155565b600d55565b6020810151815161251c91620003fa9162000a01565b11156200044a5760405162461bcd60e51b815260206004820152601660248201527f526576656e756520736861726520746f6f206869676800000000000000000000604482015260640162000155565b62000459600e836002620004fd565b5062000469600f82600262000555565b505050565b8280546200047c9062000901565b90600052602060002090601f016020900481019282620004a05760008555620004eb565b82601f10620004bb57805160ff1916838001178555620004eb565b82800160010185558215620004eb579182015b82811115620004eb578251825591602001919060010190620004ce565b50620004f992915062000592565b5090565b828054828255906000526020600020908101928215620004eb579160200282015b82811115620004eb57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200051e565b828054828255906000526020600020908101928215620004eb5791602002820182811115620004eb578251825591602001919060010190620004ce565b5b80821115620004f9576000815560010162000593565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620005e457620005e4620005a9565b60405290565b604080519081016001600160401b0381118282101715620005e457620005e4620005a9565b604051601f8201601f191681016001600160401b03811182821017156200063a576200063a620005a9565b604052919050565b600082601f8301126200065457600080fd5b6200065e620005bf565b8060608401858111156200067157600080fd5b845b81811015620006a45780516001600160a01b0381168114620006955760008081fd5b84526020938401930162000673565b509095945050505050565b600082601f830112620006c157600080fd5b60405160c081016001600160401b0381118282101715620006e657620006e6620005a9565b6040528060c0840185811115620006fc57600080fd5b845b8181101562000718578051835260209283019201620006fe565b509195945050505050565b6000601f83818401126200073657600080fd5b62000740620005bf565b8060608501868111156200075357600080fd5b855b81811015620008125780516001600160401b0380821115620007775760008081fd5b818901915089878301126200078c5760008081fd5b815181811115620007a157620007a1620005a9565b60209150620007b8818901601f191683016200060f565b8181528b83838601011115620007ce5760008081fd5b60005b82811015620007ee578481018401518282018501528301620007d1565b82811115620008005760008484840101525b50875250909401935060200162000755565b50909695505050505050565b60008060008061018085870312156200083657600080fd5b85601f8601126200084657600080fd5b62000850620005ea565b8060408701888111156200086357600080fd5b875b818110156200088f5780518015158114620008805760008081fd5b84526020938401930162000865565b508196506200089f898262000642565b9550505050620008b38660a08701620006af565b6101608601519092506001600160401b03811115620008d157600080fd5b620008df8782880162000723565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200091657607f821691505b602082108114156200093857634e487b7160e01b600052602260045260246000fd5b50919050565b60408152600080845481600182811c9150808316806200095f57607f831692505b60208084108214156200098057634e487b7160e01b86526022600452602486fd5b6040880184905260608801828015620009a25760018114620009b457620009e1565b60ff19871682528282019750620009e1565b60008c81526020902060005b87811015620009db57815484820152908601908401620009c0565b83019850505b5050859650620009f48189018a15159052565b5050505050509392505050565b6000821982111562000a2357634e487b7160e01b600052601160045260246000fd5b500190565b614c9f8062000a386000396000f3fe6080604052600436106103355760003560e01c8063801ad21e116101ab578063bc1c741c116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610981578063f3b97901146109a1578063f7c84dda146109c1578063fdcb8d55146109f757600080fd5b8063e985e9c5146108d2578063ed9ec8881461091b578063f0656ae51461096157600080fd5b8063d5556544116100d1578063d555654414610870578063d5abeb0114610886578063d73e62781461089c578063da76d5cd146108b257600080fd5b8063bc1c741c14610808578063c53ac34714610830578063c87b56dd1461085057600080fd5b8063a2309ff811610164578063b5901fbc1161013e578063b5901fbc14610792578063b5917aa8146107b2578063b88d4fde146107c8578063bbb9f9d6146107e857600080fd5b8063a2309ff81461073d578063a87f884e14610752578063adf482b41461077257600080fd5b8063801ad21e146106905780638596dd27146106b05780638da5cb5b146106d057806395d89b41146106ee578063a07c7ce414610703578063a22cb4651461071d57600080fd5b806329600ce811610285578063617d11261161022357806370a08231116101fd57806370a0823114610625578063715018a614610645578063743717fc1461065a5780637501f7411461067a57600080fd5b8063617d1126146105cd5780636352211e146105e557806367b6f5d21461060557600080fd5b80633c8c76521161025f5780633c8c76521461055f57806342842e0e1461057557806342966c681461059557806354214f69146105b557600080fd5b806329600ce8146104ea5780632a55205a1461050a57806338053e761461054957600080fd5b806310844111116102f2578063168dbce8116102cc578063168dbce81461048257806317b0ba721461049557806318160ddd146104b557806323b872dd146104ca57600080fd5b8063108441111461042f578063118a9db31461044f578063131f67241461046f57600080fd5b806301ffc9a71461033a57806306fdde031461036f57806307b5c96614610391578063081812fc146103b5578063095ea7b3146103ed5780630b9526ee1461040f575b600080fd5b34801561034657600080fd5b5061035a610355366004613d14565b610a0a565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b50610384610a50565b6040516103669190613d89565b34801561039d57600080fd5b506103a7600d5481565b604051908152602001610366565b3480156103c157600080fd5b506103d56103d0366004613d9c565b610ae2565b6040516001600160a01b039091168152602001610366565b3480156103f957600080fd5b5061040d610408366004613dd1565b610b6f565b005b34801561041b57600080fd5b5061040d61042a366004613ec8565b610c86565b34801561043b57600080fd5b5061040d61044a366004613f08565b610d00565b34801561045b57600080fd5b506103d561046a366004613d9c565b610d99565b61040d61047d366004614054565b610dc3565b61040d6104903660046140d0565b610f7c565b3480156104a157600080fd5b5061040d6104b036600461413c565b611239565b3480156104c157600080fd5b506103a76112b8565b3480156104d657600080fd5b5061040d6104e5366004614157565b6112d4565b3480156104f657600080fd5b5061040d6105053660046142cb565b61131a565b34801561051657600080fd5b5061052a610525366004614380565b611326565b604080516001600160a01b039093168352602083019190915201610366565b34801561055557600080fd5b506103a761251c81565b34801561056b57600080fd5b506103a761012c81565b34801561058157600080fd5b5061040d610590366004614157565b611366565b3480156105a157600080fd5b5061040d6105b0366004613d9c565b611381565b3480156105c157600080fd5b5060055460ff1661035a565b3480156105d957600080fd5b506103a7633b9aca0081565b3480156105f157600080fd5b506103d5610600366004613d9c565b6113f4565b34801561061157600080fd5b506103a76106203660046143a2565b611500565b34801561063157600080fd5b506103a761064036600461413c565b61150b565b34801561065157600080fd5b5061040d61159b565b34801561066657600080fd5b506103a76106753660046143be565b6115d1565b34801561068657600080fd5b506103a760155481565b34801561069c57600080fd5b5061040d6106ab3660046143be565b611611565b3480156106bc57600080fd5b506103a76106cb3660046143f4565b611691565b3480156106dc57600080fd5b50600b546001600160a01b03166103d5565b3480156106fa57600080fd5b506103846116b3565b34801561070f57600080fd5b5060125461035a9060ff1681565b34801561072957600080fd5b5061040d610738366004614436565b6116c2565b34801561074957600080fd5b506103a7611787565b34801561075e57600080fd5b5061040d61076d366004613d9c565b6117a3565b34801561077e57600080fd5b5061040d61078d366004613d9c565b6117ec565b34801561079e57600080fd5b5061040d6107ad3660046143f4565b61184f565b3480156107be57600080fd5b506103a76103e881565b3480156107d457600080fd5b5061040d6107e3366004614469565b6118d3565b3480156107f457600080fd5b5061040d6108033660046144c4565b611942565b34801561081457600080fd5b506103d57368f5c1e24677ac4ae845dde07504eaad98f8257281565b34801561083c57600080fd5b506103a761084b366004613ec8565b611a49565b34801561085c57600080fd5b5061038461086b366004613d9c565b611aca565b34801561087c57600080fd5b506103a760165481565b34801561089257600080fd5b506103a760135481565b3480156108a857600080fd5b506103a760145481565b3480156108be57600080fd5b5061040d6108cd366004613d9c565b611bf0565b3480156108de57600080fd5b5061035a6108ed36600461453b565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b34801561092757600080fd5b506103a761093636600461413c565b6001600160a01b0316600090815260086020526040902054600160801b90046001600160801b031690565b34801561096d57600080fd5b50600c546103d5906001600160a01b031681565b34801561098d57600080fd5b5061040d61099c36600461413c565b611cb0565b3480156109ad57600080fd5b506103a76109bc366004613d9c565b611d48565b3480156109cd57600080fd5b506103a76109dc36600461413c565b6001600160a01b031660009081526010602052604090205490565b61040d610a05366004614565565b611d69565b60006001600160e01b03198216630704183b60e11b1480610a3b57506001600160e01b0319821663152a902d60e11b145b80610a4a5750610a4a82612092565b92915050565b606060008054610a5f906145e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b906145e2565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050905090565b6000610aed826120e2565b610b535760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600960205260409020546001600160a01b031690565b6000610b7a826113f4565b9050806001600160a01b0316836001600160a01b03161415610be85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b4a565b336001600160a01b0382161480610c045750610c0481336108ed565b610c765760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b4a565b610c81838383612131565b505050565b6000610c9533868686866121ae565b6000818152601160205260409020805460ff191660011790559050610cb73390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf782604051610cf191815260200190565b60405180910390a25050505050565b600b546001600160a01b03163314610d2a5760405162461bcd60e51b8152600401610b4a9061461d565b610d348282612213565b8151602080840151835184830151604080516001600160a01b03968716815295909316938501939093529083015260608201527faa933b519cfe6b8aa7b93fa7c0cc2ebd8c95f291d46ae16c912da4cf8b0cef93906080015b60405180910390a15050565b600e8181548110610da957600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610dce83612289565b6001600160a01b0388166000908152601060205260409020549091508614610e385760405162461bcd60e51b815260206004820152601b60248201527f496e636f7272656374207369676e61747572652076657273696f6e00000000006044820152606401610b4a565b80341015610e805760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f7567682045544820746f2062757960581b6044820152606401610b4a565b610e8f87878787878688612426565b610eaa87338660405180602001604052806000815250612579565b600b546001600160a01b03888116911614610f3c577368f5c1e24677ac4ae845dde07504eaad98f82572638b52e2cb8289610ee36125b5565b610eeb612617565b6040518563ffffffff1660e01b8152600401610f0993929190614668565b6000604051808303818588803b158015610f2257600080fd5b505af1158015610f36573d6000803e3d6000fd5b50505050505b336108fc610f4a8334614712565b6040518115909202916000818181858888f19350505050158015610f72573d6000803e3d6000fd5b5050505050505050565b60135483610f88611787565b610f929190614729565b1115610fda5760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610b4a565b83831480610fe6575083155b61102a5760405162461bcd60e51b815260206004820152601560248201527413dd995c881cda59db985d1d5c9948185b5bdd5b9d605a1b6044820152606401610b4a565b60145483111561104c5760405162461bcd60e51b8152600401610b4a90614741565b60106000611062600b546001600160a01b031690565b6001600160a01b03166001600160a01b031681526020019081526020016000205485146110c35760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103b32b939b4b7b760891b6044820152606401610b4a565b60006110ce83612289565b905060006110dc8286614771565b9050803410156111245760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610b4a565b6000611131888887612663565b60008181526011602052604090205490915060ff16156111935760405162461bcd60e51b815260206004820152601a60248201527f5369676e6174757265206e6f206c6f6e676572206163746976650000000000006044820152606401610b4a565b600061119f8286612673565b90506111aa81612697565b6111b43388612700565b6040805188815260208101859052808201849052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a2336108fc6112058534614712565b6040518115909202916000818181858888f1935050505015801561122d573d6000803e3d6000fd5b50505050505050505050565b600b546001600160a01b031633146112635760405162461bcd60e51b8152600401610b4a9061461d565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527fcd113b94fd57b95e85b4813e35825d9bd90e73685a46eb44c6cd7cf4e1cc0db0906020015b60405180910390a150565b60006003546112c5611787565b6112cf9190614712565b905090565b60006112df826113f4565b90506112ec3383836127d0565b6113085760405162461bcd60e51b8152600401610b4a90614790565b611314848484846128a9565b50505050565b61131484848484612ae5565b6000806000612710600d548561133c9190614771565b61134691906147f7565b905061135a600b546001600160a01b031690565b925090505b9250929050565b610c81838383604051806020016040528060008152506118d3565b60125460ff166113e85760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e732066726f6d207468697320636f6c6c656374696f6e206172652060448201526b6e6f74206275726e61626c6560a01b6064820152608401610b4a565b6113f181612d36565b50565b60006113ff826120e2565b61145d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b4a565b6004548210156114e4576000600a831061148a5761147c600a84614712565b611487906001614729565b90505b825b8181106114e1576000818152600660205260409020546001600160a01b0316156114cf576000908152600660205260409020546001600160a01b03169392505050565b806114d98161480b565b91505061148c565b50505b506000908152600660205260409020546001600160a01b031690565b6000610a4a82612289565b60006001600160a01b0382166115765760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b4a565b506001600160a01b03166000908152600860205260409020546001600160801b031690565b600b546001600160a01b031633146115c55760405162461bcd60e51b8152600401610b4a9061461d565b6115cf6000612e60565b565b60006115dc33612697565b6014548311156115fe5760405162461bcd60e51b8152600401610b4a90614741565b611609848484612eb2565b949350505050565b61161a33612697565b6000611627848484612663565b6000818152601160205260409020805460ff1916600117905590506116493390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf78260405161168391815260200190565b60405180910390a250505050565b600061169c33612697565b6116a98686868686612eff565b9695505050505050565b606060018054610a5f906145e2565b6001600160a01b03821633141561171b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b4a565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055460009060ff161561179c575060025490565b5060045490565b3360008181526010602090815260409182902084905590518381527f40c93307f56fc72b7eaf9af01e59f7a78540e7dc1a79dd0a73854fedbb6e7867910160405180910390a250565b600b546001600160a01b031633146118165760405162461bcd60e51b8152600401610b4a9061461d565b61181f81612f82565b6040518181527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b3906020016112ad565b61185833612697565b60006118678686868686612fec565b6000818152601160205260409020805460ff1916600117905590506118893390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf7826040516118c391815260200190565b60405180910390a2505050505050565b60006118de836113f4565b90506118eb3384836127d0565b6119075760405162461bcd60e51b8152600401610b4a90614790565b611913858585846128a9565b61191f85858585612ffe565b61193b5760405162461bcd60e51b8152600401610b4a90614822565b5050505050565b600b546001600160a01b0316331461196c5760405162461bcd60e51b8152600401610b4a9061461d565b60055460ff16156119ca5760405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e205552492068617320616c7265616479206265656e2073604482015261195d60f21b6064820152608401610b4a565b6119d5601354613108565b6016556119e7633b9aca178484613b62565b506005805460ff191660011790558015611a02576004546013555b6004546002556040517fb49211183e2638d94c3f410d8bdcba715a7dcae24a1058226cb9a46b68cd735790611a3c90859085908590614874565b60405180910390a1505050565b6000611a54836113f4565b6001600160a01b0316336001600160a01b031614611ab45760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e0000000000006044820152606401610b4a565b611ac1338686868661317a565b95945050505050565b60055460609060ff16611b2157604080518082019091526007815266697066733a2f2f60c81b6020820152633b9aca17604051602001611b0b92919061491b565b6040516020818303038152906040529050919050565b611b2a826120e2565b611b765760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610b4a565b600060135460165484611b899190614729565b611b939190614939565b9050611bb9604080518082019091526007815266697066733a2f2f60c81b602082015290565b633b9aca17611bc783613199565b604051602001611bd99392919061494d565b604051602081830303815290604052915050919050565b47811115611bfd57600080fd5b7368f5c1e24677ac4ae845dde07504eaad98f8257280638b52e2cb83611c2b600b546001600160a01b031690565b600e600f6040518563ffffffff1660e01b8152600401611c4d93929190614994565b6000604051808303818588803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050507f39f8b889424a1684bd36857c25ab79691ed71adf60bbeca32820cb4de3c5884c82604051610d8d91815260200190565b600b546001600160a01b03163314611cda5760405162461bcd60e51b8152600401610b4a9061461d565b6001600160a01b038116611d3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4a565b6113f181612e60565b600f8181548110611d5857600080fd5b600091825260209091200154905081565b60135482611d75611787565b611d7f9190614729565b1115611dc75760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610b4a565b82821480611dd3575082155b611e175760405162461bcd60e51b815260206004820152601560248201527413dd995c881cda59db985d1d5c9948185b5bdd5b9d605a1b6044820152606401610b4a565b601454821115611e395760405162461bcd60e51b8152600401610b4a90614741565b60106000611e4f600b546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020548614611ebe5760405162461bcd60e51b815260206004820181905260248201527f546869732070726573616c652076657273696f6e2069732064697361626c65646044820152606401610b4a565b6001600160a01b0387163314611f075760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610b4a565b6000611f138386614771565b905080341015611f5b5760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610b4a565b6000611f6a8989898989612fec565b60008181526011602052604090205490915060ff1615611fcc5760405162461bcd60e51b815260206004820152601a60248201527f5369676e6174757265206e6f206c6f6e676572206163746976650000000000006044820152606401610b4a565b6000611fd88285612673565b9050611fe381612697565b6000828152601160205260409020805460ff1916600117905561200c6120063390565b86612700565b6040805186815260208101899052808201849052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a2336108fc61205d8534614712565b6040518115909202916000818181858888f19350505050158015612085573d6000803e3d6000fd5b5050505050505050505050565b60006001600160e01b031982166380ac58cd60e01b14806120c357506001600160e01b03198216635b5e139f60e01b145b80610a4a57506301ffc9a760e01b6001600160e01b0319831614610a4a565b60008181526007602052604081205460ff161561210157506000919050565b60045482101561211357506001919050565b506000908152600660205260409020546001600160a01b0316151590565b6000828152600960205260409020546001600160a01b03848116911614610c815760008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006116a96121c0878787878761317a565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6020810151815161251c9161222791614729565b111561226e5760405162461bcd60e51b81526020600482015260166024820152750a4caeccadceaca40e6d0c2e4ca40e8dede40d0d2ced60531b6044820152606401610b4a565b61227b600e836002613be6565b50610c81600f826002613c3b565b805160208201516040830151606084015160009392919042828110156122e75760405162461bcd60e51b815260206004820152601360248201527212185cc81b9bdd081cdd185c9d1959081e595d606a1b6044820152606401610b4a565b8183106123365760405162461bcd60e51b815260206004820152601860248201527f4d75737420656e642061667465722069742073746172747300000000000000006044820152606401610b4a565b838510156123865760405162461bcd60e51b815260206004820152601d60248201527f456e64696e672070726963652063616e6e6f74206265206269676765720000006044820152606401610b4a565b8385148061239357508181115b156123a357509195945050505050565b60006123af8587614712565b9050600061012c6123c08685614712565b6123ca91906147f7565b9050806123de575094979650505050505050565b600061012c6123ed8787614712565b6123f791906147f7565b90508161240482856147f7565b61240e9190614771565b6124189089614712565b9a9950505050505050505050565b600061243588888888886121ae565b60008181526011602052604090205490915060ff161561248f5760405162461bcd60e51b815260206004820152601560248201527453616c65206e6f206c6f6e6765722061637469766560581b6044820152606401610b4a565b6001600160a01b0388166124a38284612673565b6001600160a01b0316146124f95760405162461bcd60e51b815260206004820152601c60248201527f4e6f74207369676e65642062792063757272656e742073656c6c6572000000006044820152606401610b4a565b6000818152601160205260409020805460ff191660011790556125193390565b6001600160a01b0316886001600160a01b0316867fa62b7b4b98af32f1225c87df197bc0b2f8d69b74285dc3f88b95ed70395496c58685604051612567929190918252602082015260400190565b60405180910390a45050505050505050565b61258d848484612588866113f4565b6128a9565b61259984848484612ffe565b6113145760405162461bcd60e51b8152600401610b4a90614822565b60408051600180825281830190925260609160009190602080830190803683375050600b54919250506001600160a01b0316816000815181106125fa576125fa614652565b6001600160a01b0390921660209283029190910190910152919050565b6040805160018082528183019092526060916000919060208083019080368337019050509050600d548160008151811061265357612653614652565b6020908102919091010152919050565b60006116096121c0858585612eb2565b60008060006126828585613296565b9150915061268f81613303565b509392505050565b600b546001600160a01b03828116911614806126c05750600c546001600160a01b038281169116145b6113f15760405162461bcd60e51b81526020600482015260116024820152702737ba103b30b634b21039b4b3b732b91760791b6044820152606401610b4a565b601554158061274457506015546001600160a01b038316600090815260086020526040902054612741908390600160801b90046001600160801b0316614729565b11155b6127905760405162461bcd60e51b815260206004820152601760248201527f4275796572206f766572206d696e74206d6178696d756d0000000000000000006044820152606401610b4a565b60055460ff16156127c2576127a582826134be565b80600260008282546127b79190614729565b909155506127cc9050565b6127cc828261367c565b5050565b60006127db836120e2565b61283c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b4a565b816001600160a01b0316846001600160a01b031614806128755750836001600160a01b031661286a84610ae2565b6001600160a01b0316145b8061160957506001600160a01b038083166000908152600a602090815260408083209388168352929052205460ff16611609565b836001600160a01b0316816001600160a01b03161461291d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a20207472616e73666572206f6620746f6b656e20746861742060448201526934b9903737ba1037bbb760b11b6064820152608401610b4a565b6001600160a01b03831661297f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b4a565b61298b60008386612131565b6001600160a01b03841660009081526008602052604081208054600192906129bd9084906001600160801b0316614a2d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03851660009081526008602052604081208054600194509092612a0991859116614a55565b82546101009290920a6001600160801b0381810219909316919092169190910217905550600082815260066020526040812080546001600160a01b0319166001600160a01b038616179055612a5f836001614729565b9050600454811015612aaf576000818152600660205260409020546001600160a01b0316612aaf57600081815260066020526040902080546001600160a01b0319166001600160a01b0387161790555b82846001600160a01b0316866001600160a01b0316600080516020614c4a83398151915260405160405180910390a45050505050565b601254610100900460ff1615612b3d5760405162461bcd60e51b815260206004820152601860248201527f416c72656164792068617320626520696e6974696174656400000000000000006044820152606401610b4a565b601280548551151561ffff19909116176101001790556020808501516005805460ff1916911515919091179055600b8054336001600160a01b03199182161790915560408051808201825286516001600160a01b0390811682528785015181169482019490945290860151600c8054919094169216919091179091558251612bc490612f82565b612c0f81604051806040016040528086600160068110612be657612be6614652565b6020020151815260200186600260068110612c0357612c03614652565b60200201519052612213565b60608301516013819055633b9aca0011612c635760405162461bcd60e51b8152602060048201526015602482015274436f6c6c656374696f6e20697320746f6f2062696760581b6044820152606401610b4a565b60808301511580612c7a575060808301516161a811155b15612c8a576161a8601455612c93565b60808301516014555b60a083015160155581518051612cb191600091602090910190613c76565b506020808301518051612cc8926001920190613c76565b5060408201518051612ce591633b9aca1791602090910190613c76565b5060055460ff161561193b577fb49211183e2638d94c3f410d8bdcba715a7dcae24a1058226cb9a46b68cd7357633b9aca176000604051612d27929190614a80565b60405180910390a15050505050565b6000612d41826113f4565b90506001600160a01b0381163314612da65760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206275726e206120746f6b656e20796f7520646f206e6f74206f6044820152613bb760f11b6064820152608401610b4a565b612db260008383612131565b6001600160a01b0381166000908152600860205260408120805460019290612de49084906001600160801b0316614a2d565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550600160036000828254612e1b9190614729565b9091555050600082815260076020526040808220805460ff19166001179055518391906001600160a01b03841690600080516020614c4a833981519152908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60003046612ec8600b546001600160a01b031690565b858588604051602001612ee096959493929190614b34565b6040516020818303038152906040528051906020012090509392505050565b60003046612f15600b546001600160a01b031690565b604080516001600160a01b0394851660208201529081019290925282166060820152908716608082015260a0810186905260c0810185905260e081018490526101008101839052610120015b60405160208183030381529060405280519060200120905095945050505050565b6103e8600d541115612fe75760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f742074616b65206d6f7265207468616e20313025206f66207365636044820152676f6e64617269657360c01b6064820152608401610b4a565b600d55565b60006116a96121c08787878787612eff565b60006001600160a01b0384163b1561310057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613042903390899088908890600401614b7a565b602060405180830381600087803b15801561305c57600080fd5b505af192505050801561308c575060408051601f3d908101601f1916820190925261308991810190614bad565b60015b6130e6573d8080156130ba576040519150601f19603f3d011682016040523d82523d6000602084013e6130bf565b606091505b5080516130de5760405162461bcd60e51b8152600401610b4a90614822565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611609565b506001611609565b60008161311757506000919050565b6000334442613127600143614712565b604080516001600160a01b039095166020860152840192909252606083015240608082015260a00160408051601f19818403018152919052805160209091012090506131738382614939565b9392505050565b600030468787878787604051602001612f619796959493929190614bca565b6060816131bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156131e757806131d181614c18565b91506131e09050600a836147f7565b91506131c1565b6000816001600160401b0381111561320157613201613dfb565b6040519080825280601f01601f19166020018201604052801561322b576020820181803683370190505b5090505b841561160957613240600183614712565b915061324d600a86614939565b613258906030614729565b60f81b81838151811061326d5761326d614652565b60200101906001600160f81b031916908160001a90535061328f600a866147f7565b945061322f565b6000808251604114156132cd5760208301516040840151606085015160001a6132c1878285856138b9565b9450945050505061135f565b8251604014156132f757602083015160408401516132ec8683836139a6565b93509350505061135f565b5060009050600261135f565b600081600481111561331757613317614c33565b14156133205750565b600181600481111561333457613334614c33565b14156133825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b4a565b600281600481111561339657613396614c33565b14156133e45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b4a565b60038160048111156133f8576133f8614c33565b14156134515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b4a565b600481600481111561346557613465614c33565b14156113f15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b4a565b60006002546013546134d09190614712565b905060005b828110156135bf5760006134e883613108565b90506000601782633b9aca00811061350257613502614652565b01549050600081613514575081613517565b50805b60006017613526600188614712565b633b9aca00811061353957613539614652565b015490508061356a5761354d600187614712565b601785633b9aca00811061356357613563614652565b0155613584565b80601785633b9aca00811061358157613581614652565b01555b61359b88600454846135969190614729565b6139d5565b856135a58161480b565b9650505050505080806135b790614c18565b9150506134d5565b506040805180820182526001600160a01b03851660009081526008602052919091205481906135f89085906001600160801b0316614a55565b6001600160801b0390811682526001600160a01b038616600090815260086020908152604090912054920191613637918691600160801b900416614a55565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b0291909416179092555050565b60055460ff16156136cf5760405162461bcd60e51b815260206004820181905260248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652066616c73656044820152606401610b4a565b6001600160a01b0382166137255760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b4a565b6000816004546137359190614729565b6004549091505b8181101561377d57600081815260066020526040902080546001600160a01b0319166001600160a01b038616179055613776600a82614729565b905061373c565b506004545b818110156137fa5760405181906001600160a01b03861690600090600080516020614c4a833981519152908290a46137cc6000858360405180602001604052806000815250612ffe565b6137e85760405162461bcd60e51b8152600401610b4a90614822565b806137f281614c18565b915050613782565b506040805180820182526001600160a01b03851660009081526008602052919091205481906138339085906001600160801b0316614a55565b6001600160801b0390811682526001600160a01b038616600090815260086020908152604090912054920191613872918691600160801b900416614a55565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b02919094161790925550600455565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156138f0575060009050600361399d565b8460ff16601b1415801561390857508460ff16601c14155b15613919575060009050600461399d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561396d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139965760006001925092505061399d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016139c7878288856138b9565b935093505050935093915050565b6127cc8282604051806020016040528060008152506139f48383613a1d565b613a016000848484612ffe565b610c815760405162461bcd60e51b8152600401610b4a90614822565b60055460ff16613a6f5760405162461bcd60e51b815260206004820152601f60248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652074727565006044820152606401610b4a565b6001600160a01b038216613ac55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b4a565b613ace816120e2565b15613b1b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b4a565b60008181526006602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614c4a833981519152908290a45050565b828054613b6e906145e2565b90600052602060002090601f016020900481019282613b905760008555613bd6565b82601f10613ba95782800160ff19823516178555613bd6565b82800160010185558215613bd6579182015b82811115613bd6578235825591602001919060010190613bbb565b50613be2929150613ce9565b5090565b828054828255906000526020600020908101928215613bd6579160200282015b82811115613bd657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c06565b828054828255906000526020600020908101928215613bd6579160200282015b82811115613bd6578251825591602001919060010190613c5b565b828054613c82906145e2565b90600052602060002090601f016020900481019282613ca45760008555613bd6565b82601f10613cbd57805160ff1916838001178555613bd6565b82800160010185558215613bd65791820182811115613bd6578251825591602001919060010190613c5b565b5b80821115613be25760008155600101613cea565b6001600160e01b0319811681146113f157600080fd5b600060208284031215613d2657600080fd5b813561317381613cfe565b60005b83811015613d4c578181015183820152602001613d34565b838111156113145750506000910152565b60008151808452613d75816020860160208601613d31565b601f01601f19169290920160200192915050565b6020815260006131736020830184613d5d565b600060208284031215613dae57600080fd5b5035919050565b80356001600160a01b0381168114613dcc57600080fd5b919050565b60008060408385031215613de457600080fd5b613ded83613db5565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613e3357613e33613dfb565b60405290565b604051606081016001600160401b0381118282101715613e3357613e33613dfb565b600082601f830112613e6c57600080fd5b604051608081018181106001600160401b0382111715613e8e57613e8e613dfb565b604052806080840185811115613ea357600080fd5b845b81811015613ebd578035835260209283019201613ea5565b509195945050505050565b60008060008060e08587031215613ede57600080fd5b843593506020850135925060408501359150613efd8660608701613e5b565b905092959194509250565b60008060808385031215613f1b57600080fd5b83601f840112613f2a57600080fd5b613f32613e11565b806040850186811115613f4457600080fd5b855b81811015613f6557613f5781613db5565b845260209384019301613f46565b5081945086605f870112613f7857600080fd5b613f80613e11565b92508291506080860187811115613f9657600080fd5b5b80821015613fb2578135845260209384019390910190613f97565b5093969095509350505050565b60006001600160401b0380841115613fd957613fd9613dfb565b604051601f8501601f19908116603f0116810190828211818310171561400157614001613dfb565b8160405280935085815286868601111561401a57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261404557600080fd5b61317383833560208501613fbf565b600080600080600080610120878903121561406e57600080fd5b61407787613db5565b955060208701359450604087013593506060870135925061409b8860808901613e5b565b91506101008701356001600160401b038111156140b757600080fd5b6140c389828a01614034565b9150509295509295509295565b600080600080600061010086880312156140e957600080fd5b8535945060208601359350604086013592506141088760608801613e5b565b915060e08601356001600160401b0381111561412357600080fd5b61412f88828901614034565b9150509295509295909350565b60006020828403121561414e57600080fd5b61317382613db5565b60008060006060848603121561416c57600080fd5b61417584613db5565b925061418360208501613db5565b9150604084013590509250925092565b80358015158114613dcc57600080fd5b600082601f8301126141b457600080fd5b6141bc613e39565b8060608401858111156141ce57600080fd5b845b818110156141ef576141e181613db5565b8452602093840193016141d0565b509095945050505050565b600082601f83011261420b57600080fd5b60405160c081018181106001600160401b038211171561422d5761422d613dfb565b6040528060c0840185811115613ea357600080fd5b6000601f838184011261425457600080fd5b61425c613e39565b80606085018681111561426e57600080fd5b855b818110156142bf5780356001600160401b0381111561428f5760008081fd5b870185810189136142a05760008081fd5b60206142b08a8335838501613fbf565b86529094019350602001614270565b50909695505050505050565b60008060008061018085870312156142e257600080fd5b85601f8601126142f157600080fd5b6142f9613e11565b80604087018881111561430b57600080fd5b875b8181101561432c5761431e81614193565b84526020938401930161430d565b5081965061433a89826141a3565b955050505061434c8660a087016141fa565b91506101608501356001600160401b0381111561436857600080fd5b61437487828801614242565b91505092959194509250565b6000806040838503121561439357600080fd5b50508035926020909101359150565b6000608082840312156143b457600080fd5b6131738383613e5b565b600080600060c084860312156143d357600080fd5b83359250602084013591506143eb8560408601613e5b565b90509250925092565b600080600080600060a0868803121561440c57600080fd5b61441586613db5565b97602087013597506040870135966060810135965060800135945092505050565b6000806040838503121561444957600080fd5b61445283613db5565b915061446060208401614193565b90509250929050565b6000806000806080858703121561447f57600080fd5b61448885613db5565b935061449660208601613db5565b92506040850135915060608501356001600160401b038111156144b857600080fd5b61437487828801614034565b6000806000604084860312156144d957600080fd5b83356001600160401b03808211156144f057600080fd5b818601915086601f83011261450457600080fd5b81358181111561451357600080fd5b87602082850101111561452557600080fd5b6020928301955093506143eb9186019050614193565b6000806040838503121561454e57600080fd5b61455783613db5565b915061446060208401613db5565b600080600080600080600060e0888a03121561458057600080fd5b61458988613db5565b96506020880135955060408801359450606088013593506080880135925060a0880135915060c08801356001600160401b038111156145c757600080fd5b6145d38a828b01614034565b91505092959891949750929550565b600181811c908216806145f657607f821691505b6020821081141561461757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038481168252606060208084018290528551918401829052600092868201929091906080860190855b818110156146b6578551851683529483019491830191600101614698565b5050858103604087015286518082529082019350915080860160005b838110156146ee578151855293820193908201906001016146d2565b509298975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600082821015614724576147246146fc565b500390565b6000821982111561473c5761473c6146fc565b500190565b60208082526016908201527513dd995c881d1c985b9cd858dd1a5bdb881b1a5b5a5d60521b604082015260600190565b600081600019048311821515161561478b5761478b6146fc565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082614806576148066147e1565b500490565b60008161481a5761481a6146fc565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6040815282604082015282846060830137600060608483018101919091529115156020820152601f909201601f191690910101919050565b600081546148b9816145e2565b600182811680156148d157600181146148e257614911565b60ff19841687528287019450614911565b8560005260208060002060005b858110156149085781548a8201529084019082016148ef565b50505082870194505b5050505092915050565b6000835161492d818460208801613d31565b611ac1818401856148ac565b600082614948576149486147e1565b500690565b6000845161495f818460208901613d31565b61496b818401866148ac565b9050602f60f81b81528351614987816001840160208801613d31565b0160010195945050505050565b60006060820160018060a01b038087168452602060608186015282875480855260808701915060009450888552828520855b828110156149e45781548616845292840192600191820191016149c6565b5050508581036040870152865480825287855282852091830193505b80851015614a1f57815484526001948501949383019390910190614a00565b509198975050505050505050565b60006001600160801b0383811690831681811015614a4d57614a4d6146fc565b039392505050565b60006001600160801b03808316818516808303821115614a7757614a776146fc565b01949350505050565b604081526000808454614a92816145e2565b8060408601526060600180841660008114614ab45760018114614ac857614af9565b60ff19851688840152608088019550614af9565b8960005260208060002060005b86811015614af05781548b8201870152908401908201614ad5565b8a018501975050505b50505050508091505082151560208301529392505050565b8060005b6004811015611314578151845260209384019390910190600101614b15565b6001600160a01b0387811682526020820187905285166040820152606081018490526101208101614b686080830185614b11565b82610100830152979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906116a990830184613d5d565b600060208284031215614bbf57600080fd5b815161317381613cfe565b6001600160a01b0388811682526020820188905286166040820152606081018590526080810184905260a081018390526101408101614c0c60c0830184614b11565b98975050505050505050565b6000600019821415614c2c57614c2c6146fc565b5060010190565b634e487b7160e01b600052602160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202a50520d7272e540d0c26989d4cd77b187f035dbb84e3e2a59ede1c8b0ef4fc864736f6c63430008090033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000006456173656c790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445415345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103355760003560e01c8063801ad21e116101ab578063bc1c741c116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610981578063f3b97901146109a1578063f7c84dda146109c1578063fdcb8d55146109f757600080fd5b8063e985e9c5146108d2578063ed9ec8881461091b578063f0656ae51461096157600080fd5b8063d5556544116100d1578063d555654414610870578063d5abeb0114610886578063d73e62781461089c578063da76d5cd146108b257600080fd5b8063bc1c741c14610808578063c53ac34714610830578063c87b56dd1461085057600080fd5b8063a2309ff811610164578063b5901fbc1161013e578063b5901fbc14610792578063b5917aa8146107b2578063b88d4fde146107c8578063bbb9f9d6146107e857600080fd5b8063a2309ff81461073d578063a87f884e14610752578063adf482b41461077257600080fd5b8063801ad21e146106905780638596dd27146106b05780638da5cb5b146106d057806395d89b41146106ee578063a07c7ce414610703578063a22cb4651461071d57600080fd5b806329600ce811610285578063617d11261161022357806370a08231116101fd57806370a0823114610625578063715018a614610645578063743717fc1461065a5780637501f7411461067a57600080fd5b8063617d1126146105cd5780636352211e146105e557806367b6f5d21461060557600080fd5b80633c8c76521161025f5780633c8c76521461055f57806342842e0e1461057557806342966c681461059557806354214f69146105b557600080fd5b806329600ce8146104ea5780632a55205a1461050a57806338053e761461054957600080fd5b806310844111116102f2578063168dbce8116102cc578063168dbce81461048257806317b0ba721461049557806318160ddd146104b557806323b872dd146104ca57600080fd5b8063108441111461042f578063118a9db31461044f578063131f67241461046f57600080fd5b806301ffc9a71461033a57806306fdde031461036f57806307b5c96614610391578063081812fc146103b5578063095ea7b3146103ed5780630b9526ee1461040f575b600080fd5b34801561034657600080fd5b5061035a610355366004613d14565b610a0a565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b50610384610a50565b6040516103669190613d89565b34801561039d57600080fd5b506103a7600d5481565b604051908152602001610366565b3480156103c157600080fd5b506103d56103d0366004613d9c565b610ae2565b6040516001600160a01b039091168152602001610366565b3480156103f957600080fd5b5061040d610408366004613dd1565b610b6f565b005b34801561041b57600080fd5b5061040d61042a366004613ec8565b610c86565b34801561043b57600080fd5b5061040d61044a366004613f08565b610d00565b34801561045b57600080fd5b506103d561046a366004613d9c565b610d99565b61040d61047d366004614054565b610dc3565b61040d6104903660046140d0565b610f7c565b3480156104a157600080fd5b5061040d6104b036600461413c565b611239565b3480156104c157600080fd5b506103a76112b8565b3480156104d657600080fd5b5061040d6104e5366004614157565b6112d4565b3480156104f657600080fd5b5061040d6105053660046142cb565b61131a565b34801561051657600080fd5b5061052a610525366004614380565b611326565b604080516001600160a01b039093168352602083019190915201610366565b34801561055557600080fd5b506103a761251c81565b34801561056b57600080fd5b506103a761012c81565b34801561058157600080fd5b5061040d610590366004614157565b611366565b3480156105a157600080fd5b5061040d6105b0366004613d9c565b611381565b3480156105c157600080fd5b5060055460ff1661035a565b3480156105d957600080fd5b506103a7633b9aca0081565b3480156105f157600080fd5b506103d5610600366004613d9c565b6113f4565b34801561061157600080fd5b506103a76106203660046143a2565b611500565b34801561063157600080fd5b506103a761064036600461413c565b61150b565b34801561065157600080fd5b5061040d61159b565b34801561066657600080fd5b506103a76106753660046143be565b6115d1565b34801561068657600080fd5b506103a760155481565b34801561069c57600080fd5b5061040d6106ab3660046143be565b611611565b3480156106bc57600080fd5b506103a76106cb3660046143f4565b611691565b3480156106dc57600080fd5b50600b546001600160a01b03166103d5565b3480156106fa57600080fd5b506103846116b3565b34801561070f57600080fd5b5060125461035a9060ff1681565b34801561072957600080fd5b5061040d610738366004614436565b6116c2565b34801561074957600080fd5b506103a7611787565b34801561075e57600080fd5b5061040d61076d366004613d9c565b6117a3565b34801561077e57600080fd5b5061040d61078d366004613d9c565b6117ec565b34801561079e57600080fd5b5061040d6107ad3660046143f4565b61184f565b3480156107be57600080fd5b506103a76103e881565b3480156107d457600080fd5b5061040d6107e3366004614469565b6118d3565b3480156107f457600080fd5b5061040d6108033660046144c4565b611942565b34801561081457600080fd5b506103d57368f5c1e24677ac4ae845dde07504eaad98f8257281565b34801561083c57600080fd5b506103a761084b366004613ec8565b611a49565b34801561085c57600080fd5b5061038461086b366004613d9c565b611aca565b34801561087c57600080fd5b506103a760165481565b34801561089257600080fd5b506103a760135481565b3480156108a857600080fd5b506103a760145481565b3480156108be57600080fd5b5061040d6108cd366004613d9c565b611bf0565b3480156108de57600080fd5b5061035a6108ed36600461453b565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b34801561092757600080fd5b506103a761093636600461413c565b6001600160a01b0316600090815260086020526040902054600160801b90046001600160801b031690565b34801561096d57600080fd5b50600c546103d5906001600160a01b031681565b34801561098d57600080fd5b5061040d61099c36600461413c565b611cb0565b3480156109ad57600080fd5b506103a76109bc366004613d9c565b611d48565b3480156109cd57600080fd5b506103a76109dc36600461413c565b6001600160a01b031660009081526010602052604090205490565b61040d610a05366004614565565b611d69565b60006001600160e01b03198216630704183b60e11b1480610a3b57506001600160e01b0319821663152a902d60e11b145b80610a4a5750610a4a82612092565b92915050565b606060008054610a5f906145e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b906145e2565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050905090565b6000610aed826120e2565b610b535760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600960205260409020546001600160a01b031690565b6000610b7a826113f4565b9050806001600160a01b0316836001600160a01b03161415610be85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b4a565b336001600160a01b0382161480610c045750610c0481336108ed565b610c765760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b4a565b610c81838383612131565b505050565b6000610c9533868686866121ae565b6000818152601160205260409020805460ff191660011790559050610cb73390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf782604051610cf191815260200190565b60405180910390a25050505050565b600b546001600160a01b03163314610d2a5760405162461bcd60e51b8152600401610b4a9061461d565b610d348282612213565b8151602080840151835184830151604080516001600160a01b03968716815295909316938501939093529083015260608201527faa933b519cfe6b8aa7b93fa7c0cc2ebd8c95f291d46ae16c912da4cf8b0cef93906080015b60405180910390a15050565b600e8181548110610da957600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610dce83612289565b6001600160a01b0388166000908152601060205260409020549091508614610e385760405162461bcd60e51b815260206004820152601b60248201527f496e636f7272656374207369676e61747572652076657273696f6e00000000006044820152606401610b4a565b80341015610e805760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f7567682045544820746f2062757960581b6044820152606401610b4a565b610e8f87878787878688612426565b610eaa87338660405180602001604052806000815250612579565b600b546001600160a01b03888116911614610f3c577368f5c1e24677ac4ae845dde07504eaad98f82572638b52e2cb8289610ee36125b5565b610eeb612617565b6040518563ffffffff1660e01b8152600401610f0993929190614668565b6000604051808303818588803b158015610f2257600080fd5b505af1158015610f36573d6000803e3d6000fd5b50505050505b336108fc610f4a8334614712565b6040518115909202916000818181858888f19350505050158015610f72573d6000803e3d6000fd5b5050505050505050565b60135483610f88611787565b610f929190614729565b1115610fda5760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610b4a565b83831480610fe6575083155b61102a5760405162461bcd60e51b815260206004820152601560248201527413dd995c881cda59db985d1d5c9948185b5bdd5b9d605a1b6044820152606401610b4a565b60145483111561104c5760405162461bcd60e51b8152600401610b4a90614741565b60106000611062600b546001600160a01b031690565b6001600160a01b03166001600160a01b031681526020019081526020016000205485146110c35760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103b32b939b4b7b760891b6044820152606401610b4a565b60006110ce83612289565b905060006110dc8286614771565b9050803410156111245760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610b4a565b6000611131888887612663565b60008181526011602052604090205490915060ff16156111935760405162461bcd60e51b815260206004820152601a60248201527f5369676e6174757265206e6f206c6f6e676572206163746976650000000000006044820152606401610b4a565b600061119f8286612673565b90506111aa81612697565b6111b43388612700565b6040805188815260208101859052808201849052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a2336108fc6112058534614712565b6040518115909202916000818181858888f1935050505015801561122d573d6000803e3d6000fd5b50505050505050505050565b600b546001600160a01b031633146112635760405162461bcd60e51b8152600401610b4a9061461d565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527fcd113b94fd57b95e85b4813e35825d9bd90e73685a46eb44c6cd7cf4e1cc0db0906020015b60405180910390a150565b60006003546112c5611787565b6112cf9190614712565b905090565b60006112df826113f4565b90506112ec3383836127d0565b6113085760405162461bcd60e51b8152600401610b4a90614790565b611314848484846128a9565b50505050565b61131484848484612ae5565b6000806000612710600d548561133c9190614771565b61134691906147f7565b905061135a600b546001600160a01b031690565b925090505b9250929050565b610c81838383604051806020016040528060008152506118d3565b60125460ff166113e85760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e732066726f6d207468697320636f6c6c656374696f6e206172652060448201526b6e6f74206275726e61626c6560a01b6064820152608401610b4a565b6113f181612d36565b50565b60006113ff826120e2565b61145d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b4a565b6004548210156114e4576000600a831061148a5761147c600a84614712565b611487906001614729565b90505b825b8181106114e1576000818152600660205260409020546001600160a01b0316156114cf576000908152600660205260409020546001600160a01b03169392505050565b806114d98161480b565b91505061148c565b50505b506000908152600660205260409020546001600160a01b031690565b6000610a4a82612289565b60006001600160a01b0382166115765760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b4a565b506001600160a01b03166000908152600860205260409020546001600160801b031690565b600b546001600160a01b031633146115c55760405162461bcd60e51b8152600401610b4a9061461d565b6115cf6000612e60565b565b60006115dc33612697565b6014548311156115fe5760405162461bcd60e51b8152600401610b4a90614741565b611609848484612eb2565b949350505050565b61161a33612697565b6000611627848484612663565b6000818152601160205260409020805460ff1916600117905590506116493390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf78260405161168391815260200190565b60405180910390a250505050565b600061169c33612697565b6116a98686868686612eff565b9695505050505050565b606060018054610a5f906145e2565b6001600160a01b03821633141561171b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b4a565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055460009060ff161561179c575060025490565b5060045490565b3360008181526010602090815260409182902084905590518381527f40c93307f56fc72b7eaf9af01e59f7a78540e7dc1a79dd0a73854fedbb6e7867910160405180910390a250565b600b546001600160a01b031633146118165760405162461bcd60e51b8152600401610b4a9061461d565b61181f81612f82565b6040518181527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b3906020016112ad565b61185833612697565b60006118678686868686612fec565b6000818152601160205260409020805460ff1916600117905590506118893390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf7826040516118c391815260200190565b60405180910390a2505050505050565b60006118de836113f4565b90506118eb3384836127d0565b6119075760405162461bcd60e51b8152600401610b4a90614790565b611913858585846128a9565b61191f85858585612ffe565b61193b5760405162461bcd60e51b8152600401610b4a90614822565b5050505050565b600b546001600160a01b0316331461196c5760405162461bcd60e51b8152600401610b4a9061461d565b60055460ff16156119ca5760405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e205552492068617320616c7265616479206265656e2073604482015261195d60f21b6064820152608401610b4a565b6119d5601354613108565b6016556119e7633b9aca178484613b62565b506005805460ff191660011790558015611a02576004546013555b6004546002556040517fb49211183e2638d94c3f410d8bdcba715a7dcae24a1058226cb9a46b68cd735790611a3c90859085908590614874565b60405180910390a1505050565b6000611a54836113f4565b6001600160a01b0316336001600160a01b031614611ab45760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e0000000000006044820152606401610b4a565b611ac1338686868661317a565b95945050505050565b60055460609060ff16611b2157604080518082019091526007815266697066733a2f2f60c81b6020820152633b9aca17604051602001611b0b92919061491b565b6040516020818303038152906040529050919050565b611b2a826120e2565b611b765760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610b4a565b600060135460165484611b899190614729565b611b939190614939565b9050611bb9604080518082019091526007815266697066733a2f2f60c81b602082015290565b633b9aca17611bc783613199565b604051602001611bd99392919061494d565b604051602081830303815290604052915050919050565b47811115611bfd57600080fd5b7368f5c1e24677ac4ae845dde07504eaad98f8257280638b52e2cb83611c2b600b546001600160a01b031690565b600e600f6040518563ffffffff1660e01b8152600401611c4d93929190614994565b6000604051808303818588803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050507f39f8b889424a1684bd36857c25ab79691ed71adf60bbeca32820cb4de3c5884c82604051610d8d91815260200190565b600b546001600160a01b03163314611cda5760405162461bcd60e51b8152600401610b4a9061461d565b6001600160a01b038116611d3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4a565b6113f181612e60565b600f8181548110611d5857600080fd5b600091825260209091200154905081565b60135482611d75611787565b611d7f9190614729565b1115611dc75760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610b4a565b82821480611dd3575082155b611e175760405162461bcd60e51b815260206004820152601560248201527413dd995c881cda59db985d1d5c9948185b5bdd5b9d605a1b6044820152606401610b4a565b601454821115611e395760405162461bcd60e51b8152600401610b4a90614741565b60106000611e4f600b546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020548614611ebe5760405162461bcd60e51b815260206004820181905260248201527f546869732070726573616c652076657273696f6e2069732064697361626c65646044820152606401610b4a565b6001600160a01b0387163314611f075760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610b4a565b6000611f138386614771565b905080341015611f5b5760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610b4a565b6000611f6a8989898989612fec565b60008181526011602052604090205490915060ff1615611fcc5760405162461bcd60e51b815260206004820152601a60248201527f5369676e6174757265206e6f206c6f6e676572206163746976650000000000006044820152606401610b4a565b6000611fd88285612673565b9050611fe381612697565b6000828152601160205260409020805460ff1916600117905561200c6120063390565b86612700565b6040805186815260208101899052808201849052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a2336108fc61205d8534614712565b6040518115909202916000818181858888f19350505050158015612085573d6000803e3d6000fd5b5050505050505050505050565b60006001600160e01b031982166380ac58cd60e01b14806120c357506001600160e01b03198216635b5e139f60e01b145b80610a4a57506301ffc9a760e01b6001600160e01b0319831614610a4a565b60008181526007602052604081205460ff161561210157506000919050565b60045482101561211357506001919050565b506000908152600660205260409020546001600160a01b0316151590565b6000828152600960205260409020546001600160a01b03848116911614610c815760008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006116a96121c0878787878761317a565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6020810151815161251c9161222791614729565b111561226e5760405162461bcd60e51b81526020600482015260166024820152750a4caeccadceaca40e6d0c2e4ca40e8dede40d0d2ced60531b6044820152606401610b4a565b61227b600e836002613be6565b50610c81600f826002613c3b565b805160208201516040830151606084015160009392919042828110156122e75760405162461bcd60e51b815260206004820152601360248201527212185cc81b9bdd081cdd185c9d1959081e595d606a1b6044820152606401610b4a565b8183106123365760405162461bcd60e51b815260206004820152601860248201527f4d75737420656e642061667465722069742073746172747300000000000000006044820152606401610b4a565b838510156123865760405162461bcd60e51b815260206004820152601d60248201527f456e64696e672070726963652063616e6e6f74206265206269676765720000006044820152606401610b4a565b8385148061239357508181115b156123a357509195945050505050565b60006123af8587614712565b9050600061012c6123c08685614712565b6123ca91906147f7565b9050806123de575094979650505050505050565b600061012c6123ed8787614712565b6123f791906147f7565b90508161240482856147f7565b61240e9190614771565b6124189089614712565b9a9950505050505050505050565b600061243588888888886121ae565b60008181526011602052604090205490915060ff161561248f5760405162461bcd60e51b815260206004820152601560248201527453616c65206e6f206c6f6e6765722061637469766560581b6044820152606401610b4a565b6001600160a01b0388166124a38284612673565b6001600160a01b0316146124f95760405162461bcd60e51b815260206004820152601c60248201527f4e6f74207369676e65642062792063757272656e742073656c6c6572000000006044820152606401610b4a565b6000818152601160205260409020805460ff191660011790556125193390565b6001600160a01b0316886001600160a01b0316867fa62b7b4b98af32f1225c87df197bc0b2f8d69b74285dc3f88b95ed70395496c58685604051612567929190918252602082015260400190565b60405180910390a45050505050505050565b61258d848484612588866113f4565b6128a9565b61259984848484612ffe565b6113145760405162461bcd60e51b8152600401610b4a90614822565b60408051600180825281830190925260609160009190602080830190803683375050600b54919250506001600160a01b0316816000815181106125fa576125fa614652565b6001600160a01b0390921660209283029190910190910152919050565b6040805160018082528183019092526060916000919060208083019080368337019050509050600d548160008151811061265357612653614652565b6020908102919091010152919050565b60006116096121c0858585612eb2565b60008060006126828585613296565b9150915061268f81613303565b509392505050565b600b546001600160a01b03828116911614806126c05750600c546001600160a01b038281169116145b6113f15760405162461bcd60e51b81526020600482015260116024820152702737ba103b30b634b21039b4b3b732b91760791b6044820152606401610b4a565b601554158061274457506015546001600160a01b038316600090815260086020526040902054612741908390600160801b90046001600160801b0316614729565b11155b6127905760405162461bcd60e51b815260206004820152601760248201527f4275796572206f766572206d696e74206d6178696d756d0000000000000000006044820152606401610b4a565b60055460ff16156127c2576127a582826134be565b80600260008282546127b79190614729565b909155506127cc9050565b6127cc828261367c565b5050565b60006127db836120e2565b61283c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b4a565b816001600160a01b0316846001600160a01b031614806128755750836001600160a01b031661286a84610ae2565b6001600160a01b0316145b8061160957506001600160a01b038083166000908152600a602090815260408083209388168352929052205460ff16611609565b836001600160a01b0316816001600160a01b03161461291d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a20207472616e73666572206f6620746f6b656e20746861742060448201526934b9903737ba1037bbb760b11b6064820152608401610b4a565b6001600160a01b03831661297f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b4a565b61298b60008386612131565b6001600160a01b03841660009081526008602052604081208054600192906129bd9084906001600160801b0316614a2d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03851660009081526008602052604081208054600194509092612a0991859116614a55565b82546101009290920a6001600160801b0381810219909316919092169190910217905550600082815260066020526040812080546001600160a01b0319166001600160a01b038616179055612a5f836001614729565b9050600454811015612aaf576000818152600660205260409020546001600160a01b0316612aaf57600081815260066020526040902080546001600160a01b0319166001600160a01b0387161790555b82846001600160a01b0316866001600160a01b0316600080516020614c4a83398151915260405160405180910390a45050505050565b601254610100900460ff1615612b3d5760405162461bcd60e51b815260206004820152601860248201527f416c72656164792068617320626520696e6974696174656400000000000000006044820152606401610b4a565b601280548551151561ffff19909116176101001790556020808501516005805460ff1916911515919091179055600b8054336001600160a01b03199182161790915560408051808201825286516001600160a01b0390811682528785015181169482019490945290860151600c8054919094169216919091179091558251612bc490612f82565b612c0f81604051806040016040528086600160068110612be657612be6614652565b6020020151815260200186600260068110612c0357612c03614652565b60200201519052612213565b60608301516013819055633b9aca0011612c635760405162461bcd60e51b8152602060048201526015602482015274436f6c6c656374696f6e20697320746f6f2062696760581b6044820152606401610b4a565b60808301511580612c7a575060808301516161a811155b15612c8a576161a8601455612c93565b60808301516014555b60a083015160155581518051612cb191600091602090910190613c76565b506020808301518051612cc8926001920190613c76565b5060408201518051612ce591633b9aca1791602090910190613c76565b5060055460ff161561193b577fb49211183e2638d94c3f410d8bdcba715a7dcae24a1058226cb9a46b68cd7357633b9aca176000604051612d27929190614a80565b60405180910390a15050505050565b6000612d41826113f4565b90506001600160a01b0381163314612da65760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206275726e206120746f6b656e20796f7520646f206e6f74206f6044820152613bb760f11b6064820152608401610b4a565b612db260008383612131565b6001600160a01b0381166000908152600860205260408120805460019290612de49084906001600160801b0316614a2d565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550600160036000828254612e1b9190614729565b9091555050600082815260076020526040808220805460ff19166001179055518391906001600160a01b03841690600080516020614c4a833981519152908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60003046612ec8600b546001600160a01b031690565b858588604051602001612ee096959493929190614b34565b6040516020818303038152906040528051906020012090509392505050565b60003046612f15600b546001600160a01b031690565b604080516001600160a01b0394851660208201529081019290925282166060820152908716608082015260a0810186905260c0810185905260e081018490526101008101839052610120015b60405160208183030381529060405280519060200120905095945050505050565b6103e8600d541115612fe75760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f742074616b65206d6f7265207468616e20313025206f66207365636044820152676f6e64617269657360c01b6064820152608401610b4a565b600d55565b60006116a96121c08787878787612eff565b60006001600160a01b0384163b1561310057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613042903390899088908890600401614b7a565b602060405180830381600087803b15801561305c57600080fd5b505af192505050801561308c575060408051601f3d908101601f1916820190925261308991810190614bad565b60015b6130e6573d8080156130ba576040519150601f19603f3d011682016040523d82523d6000602084013e6130bf565b606091505b5080516130de5760405162461bcd60e51b8152600401610b4a90614822565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611609565b506001611609565b60008161311757506000919050565b6000334442613127600143614712565b604080516001600160a01b039095166020860152840192909252606083015240608082015260a00160408051601f19818403018152919052805160209091012090506131738382614939565b9392505050565b600030468787878787604051602001612f619796959493929190614bca565b6060816131bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156131e757806131d181614c18565b91506131e09050600a836147f7565b91506131c1565b6000816001600160401b0381111561320157613201613dfb565b6040519080825280601f01601f19166020018201604052801561322b576020820181803683370190505b5090505b841561160957613240600183614712565b915061324d600a86614939565b613258906030614729565b60f81b81838151811061326d5761326d614652565b60200101906001600160f81b031916908160001a90535061328f600a866147f7565b945061322f565b6000808251604114156132cd5760208301516040840151606085015160001a6132c1878285856138b9565b9450945050505061135f565b8251604014156132f757602083015160408401516132ec8683836139a6565b93509350505061135f565b5060009050600261135f565b600081600481111561331757613317614c33565b14156133205750565b600181600481111561333457613334614c33565b14156133825760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b4a565b600281600481111561339657613396614c33565b14156133e45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b4a565b60038160048111156133f8576133f8614c33565b14156134515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b4a565b600481600481111561346557613465614c33565b14156113f15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b4a565b60006002546013546134d09190614712565b905060005b828110156135bf5760006134e883613108565b90506000601782633b9aca00811061350257613502614652565b01549050600081613514575081613517565b50805b60006017613526600188614712565b633b9aca00811061353957613539614652565b015490508061356a5761354d600187614712565b601785633b9aca00811061356357613563614652565b0155613584565b80601785633b9aca00811061358157613581614652565b01555b61359b88600454846135969190614729565b6139d5565b856135a58161480b565b9650505050505080806135b790614c18565b9150506134d5565b506040805180820182526001600160a01b03851660009081526008602052919091205481906135f89085906001600160801b0316614a55565b6001600160801b0390811682526001600160a01b038616600090815260086020908152604090912054920191613637918691600160801b900416614a55565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b0291909416179092555050565b60055460ff16156136cf5760405162461bcd60e51b815260206004820181905260248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652066616c73656044820152606401610b4a565b6001600160a01b0382166137255760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b4a565b6000816004546137359190614729565b6004549091505b8181101561377d57600081815260066020526040902080546001600160a01b0319166001600160a01b038616179055613776600a82614729565b905061373c565b506004545b818110156137fa5760405181906001600160a01b03861690600090600080516020614c4a833981519152908290a46137cc6000858360405180602001604052806000815250612ffe565b6137e85760405162461bcd60e51b8152600401610b4a90614822565b806137f281614c18565b915050613782565b506040805180820182526001600160a01b03851660009081526008602052919091205481906138339085906001600160801b0316614a55565b6001600160801b0390811682526001600160a01b038616600090815260086020908152604090912054920191613872918691600160801b900416614a55565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b02919094161790925550600455565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156138f0575060009050600361399d565b8460ff16601b1415801561390857508460ff16601c14155b15613919575060009050600461399d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561396d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139965760006001925092505061399d565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016139c7878288856138b9565b935093505050935093915050565b6127cc8282604051806020016040528060008152506139f48383613a1d565b613a016000848484612ffe565b610c815760405162461bcd60e51b8152600401610b4a90614822565b60055460ff16613a6f5760405162461bcd60e51b815260206004820152601f60248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652074727565006044820152606401610b4a565b6001600160a01b038216613ac55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b4a565b613ace816120e2565b15613b1b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b4a565b60008181526006602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614c4a833981519152908290a45050565b828054613b6e906145e2565b90600052602060002090601f016020900481019282613b905760008555613bd6565b82601f10613ba95782800160ff19823516178555613bd6565b82800160010185558215613bd6579182015b82811115613bd6578235825591602001919060010190613bbb565b50613be2929150613ce9565b5090565b828054828255906000526020600020908101928215613bd6579160200282015b82811115613bd657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c06565b828054828255906000526020600020908101928215613bd6579160200282015b82811115613bd6578251825591602001919060010190613c5b565b828054613c82906145e2565b90600052602060002090601f016020900481019282613ca45760008555613bd6565b82601f10613cbd57805160ff1916838001178555613bd6565b82800160010185558215613bd65791820182811115613bd6578251825591602001919060010190613c5b565b5b80821115613be25760008155600101613cea565b6001600160e01b0319811681146113f157600080fd5b600060208284031215613d2657600080fd5b813561317381613cfe565b60005b83811015613d4c578181015183820152602001613d34565b838111156113145750506000910152565b60008151808452613d75816020860160208601613d31565b601f01601f19169290920160200192915050565b6020815260006131736020830184613d5d565b600060208284031215613dae57600080fd5b5035919050565b80356001600160a01b0381168114613dcc57600080fd5b919050565b60008060408385031215613de457600080fd5b613ded83613db5565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613e3357613e33613dfb565b60405290565b604051606081016001600160401b0381118282101715613e3357613e33613dfb565b600082601f830112613e6c57600080fd5b604051608081018181106001600160401b0382111715613e8e57613e8e613dfb565b604052806080840185811115613ea357600080fd5b845b81811015613ebd578035835260209283019201613ea5565b509195945050505050565b60008060008060e08587031215613ede57600080fd5b843593506020850135925060408501359150613efd8660608701613e5b565b905092959194509250565b60008060808385031215613f1b57600080fd5b83601f840112613f2a57600080fd5b613f32613e11565b806040850186811115613f4457600080fd5b855b81811015613f6557613f5781613db5565b845260209384019301613f46565b5081945086605f870112613f7857600080fd5b613f80613e11565b92508291506080860187811115613f9657600080fd5b5b80821015613fb2578135845260209384019390910190613f97565b5093969095509350505050565b60006001600160401b0380841115613fd957613fd9613dfb565b604051601f8501601f19908116603f0116810190828211818310171561400157614001613dfb565b8160405280935085815286868601111561401a57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261404557600080fd5b61317383833560208501613fbf565b600080600080600080610120878903121561406e57600080fd5b61407787613db5565b955060208701359450604087013593506060870135925061409b8860808901613e5b565b91506101008701356001600160401b038111156140b757600080fd5b6140c389828a01614034565b9150509295509295509295565b600080600080600061010086880312156140e957600080fd5b8535945060208601359350604086013592506141088760608801613e5b565b915060e08601356001600160401b0381111561412357600080fd5b61412f88828901614034565b9150509295509295909350565b60006020828403121561414e57600080fd5b61317382613db5565b60008060006060848603121561416c57600080fd5b61417584613db5565b925061418360208501613db5565b9150604084013590509250925092565b80358015158114613dcc57600080fd5b600082601f8301126141b457600080fd5b6141bc613e39565b8060608401858111156141ce57600080fd5b845b818110156141ef576141e181613db5565b8452602093840193016141d0565b509095945050505050565b600082601f83011261420b57600080fd5b60405160c081018181106001600160401b038211171561422d5761422d613dfb565b6040528060c0840185811115613ea357600080fd5b6000601f838184011261425457600080fd5b61425c613e39565b80606085018681111561426e57600080fd5b855b818110156142bf5780356001600160401b0381111561428f5760008081fd5b870185810189136142a05760008081fd5b60206142b08a8335838501613fbf565b86529094019350602001614270565b50909695505050505050565b60008060008061018085870312156142e257600080fd5b85601f8601126142f157600080fd5b6142f9613e11565b80604087018881111561430b57600080fd5b875b8181101561432c5761431e81614193565b84526020938401930161430d565b5081965061433a89826141a3565b955050505061434c8660a087016141fa565b91506101608501356001600160401b0381111561436857600080fd5b61437487828801614242565b91505092959194509250565b6000806040838503121561439357600080fd5b50508035926020909101359150565b6000608082840312156143b457600080fd5b6131738383613e5b565b600080600060c084860312156143d357600080fd5b83359250602084013591506143eb8560408601613e5b565b90509250925092565b600080600080600060a0868803121561440c57600080fd5b61441586613db5565b97602087013597506040870135966060810135965060800135945092505050565b6000806040838503121561444957600080fd5b61445283613db5565b915061446060208401614193565b90509250929050565b6000806000806080858703121561447f57600080fd5b61448885613db5565b935061449660208601613db5565b92506040850135915060608501356001600160401b038111156144b857600080fd5b61437487828801614034565b6000806000604084860312156144d957600080fd5b83356001600160401b03808211156144f057600080fd5b818601915086601f83011261450457600080fd5b81358181111561451357600080fd5b87602082850101111561452557600080fd5b6020928301955093506143eb9186019050614193565b6000806040838503121561454e57600080fd5b61455783613db5565b915061446060208401613db5565b600080600080600080600060e0888a03121561458057600080fd5b61458988613db5565b96506020880135955060408801359450606088013593506080880135925060a0880135915060c08801356001600160401b038111156145c757600080fd5b6145d38a828b01614034565b91505092959891949750929550565b600181811c908216806145f657607f821691505b6020821081141561461757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038481168252606060208084018290528551918401829052600092868201929091906080860190855b818110156146b6578551851683529483019491830191600101614698565b5050858103604087015286518082529082019350915080860160005b838110156146ee578151855293820193908201906001016146d2565b509298975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600082821015614724576147246146fc565b500390565b6000821982111561473c5761473c6146fc565b500190565b60208082526016908201527513dd995c881d1c985b9cd858dd1a5bdb881b1a5b5a5d60521b604082015260600190565b600081600019048311821515161561478b5761478b6146fc565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082614806576148066147e1565b500490565b60008161481a5761481a6146fc565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6040815282604082015282846060830137600060608483018101919091529115156020820152601f909201601f191690910101919050565b600081546148b9816145e2565b600182811680156148d157600181146148e257614911565b60ff19841687528287019450614911565b8560005260208060002060005b858110156149085781548a8201529084019082016148ef565b50505082870194505b5050505092915050565b6000835161492d818460208801613d31565b611ac1818401856148ac565b600082614948576149486147e1565b500690565b6000845161495f818460208901613d31565b61496b818401866148ac565b9050602f60f81b81528351614987816001840160208801613d31565b0160010195945050505050565b60006060820160018060a01b038087168452602060608186015282875480855260808701915060009450888552828520855b828110156149e45781548616845292840192600191820191016149c6565b5050508581036040870152865480825287855282852091830193505b80851015614a1f57815484526001948501949383019390910190614a00565b509198975050505050505050565b60006001600160801b0383811690831681811015614a4d57614a4d6146fc565b039392505050565b60006001600160801b03808316818516808303821115614a7757614a776146fc565b01949350505050565b604081526000808454614a92816145e2565b8060408601526060600180841660008114614ab45760018114614ac857614af9565b60ff19851688840152608088019550614af9565b8960005260208060002060005b86811015614af05781548b8201870152908401908201614ad5565b8a018501975050505b50505050508091505082151560208301529392505050565b8060005b6004811015611314578151845260209384019390910190600101614b15565b6001600160a01b0387811682526020820187905285166040820152606081018490526101208101614b686080830185614b11565b82610100830152979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906116a990830184613d5d565b600060208284031215614bbf57600080fd5b815161317381613cfe565b6001600160a01b0388811682526020820188905286166040820152606081018590526080810184905260a081018390526101408101614c0c60c0830184614b11565b98975050505050505050565b6000600019821415614c2c57614c2c6146fc565b5060010190565b634e487b7160e01b600052602160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202a50520d7272e540d0c26989d4cd77b187f035dbb84e3e2a59ede1c8b0ef4fc864736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000006456173656c790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000445415345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : bools (bool[2]): False,False
Arg [1] : addresses (address[3]): 0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000000
Arg [2] : uints (uint256[6]): 0,0,0,100,1,1
Arg [3] : strings (string[3]): Easely,EASE,
-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [13] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [14] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [16] : 456173656c790000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [18] : 4541534500000000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
72717:15667:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59609:331;;;;;;;;;;-1:-1:-1;59609:331:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;59609:331:0;;;;;;;;29819:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58322:30::-;;;;;;;;;;;;;;;;;;;1489:25:1;;;1477:2;1462:18;58322:30:0;1343:177:1;32294:308:0;;;;;;;;;;-1:-1:-1;32294:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;32294:308:0;1710:203:1;31810:418:0;;;;;;;;;;-1:-1:-1;31810:418:0;;;;;:::i;:::-;;:::i;:::-;;65533:448;;;;;;;;;;-1:-1:-1;65533:448:0;;;;;:::i;:::-;;:::i;62104:338::-;;;;;;;;;;-1:-1:-1;62104:338:0;;;;;:::i;:::-;;:::i;58447:29::-;;;;;;;;;;-1:-1:-1;58447:29:0;;;;;:::i;:::-;;:::i;64390:1041::-;;;;;;:::i;:::-;;:::i;81701:1271::-;;;;;;:::i;:::-;;:::i;61907:138::-;;;;;;;;;;-1:-1:-1;61907:138:0;;;;;:::i;:::-;;:::i;30353:115::-;;;;;;;;;;;;;:::i;33353:385::-;;;;;;;;;;-1:-1:-1;33353:385:0;;;;;:::i;:::-;;:::i;73972:226::-;;;;;;;;;;-1:-1:-1;73972:226:0;;;;;:::i;:::-;;:::i;60012:266::-;;;;;;;;;;-1:-1:-1;60012:266:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;11735:32:1;;;11717:51;;11799:2;11784:18;;11777:34;;;;11690:18;60012:266:0;11543:274:1;57931:48:0;;;;;;;;;;;;57975:4;57931:48;;57874;;;;;;;;;;;;57919:3;57874:48;;33809:185;;;;;;;;;;-1:-1:-1;33809:185:0;;;;;:::i;:::-;;:::i;75719:149::-;;;;;;;;;;-1:-1:-1;75719:149:0;;;;;:::i;:::-;;:::i;75371:95::-;;;;;;;;;;-1:-1:-1;75440:18:0;;;;75371:95;;72911:48;;;;;;;;;;;;72954:5;72911:48;;29067:685;;;;;;;;;;-1:-1:-1;29067:685:0;;;;;:::i;:::-;;:::i;60337:188::-;;;;;;;;;;-1:-1:-1;60337:188:0;;;;;:::i;:::-;;:::i;28702:303::-;;;;;;;;;;-1:-1:-1;28702:303:0;;;;;:::i;:::-;;:::i;14703:94::-;;;;;;;;;;;;;:::i;80626:355::-;;;;;;;;;;-1:-1:-1;80626:355:0;;;;;:::i;:::-;;:::i;73155:22::-;;;;;;;;;;;;;;;;81109:417;;;;;;;;;;-1:-1:-1;81109:417:0;;;;;:::i;:::-;;:::i;77746:335::-;;;;;;;;;;-1:-1:-1;77746:335:0;;;;;:::i;:::-;;:::i;14052:87::-;;;;;;;;;;-1:-1:-1;14125:6:0;;-1:-1:-1;;;;;14125:6:0;14052:87;;29988:104;;;;;;;;;;;;;:::i;72847:20::-;;;;;;;;;;-1:-1:-1;72847:20:0;;;;;;;;32674:327;;;;;;;;;;-1:-1:-1;32674:327:0;;;;;:::i;:::-;;:::i;30728:184::-;;;;;;;;;;;;;:::i;62891:168::-;;;;;;;;;;-1:-1:-1;62891:168:0;;;;;:::i;:::-;;:::i;62501:141::-;;;;;;;;;;-1:-1:-1;62501:141:0;;;;;:::i;:::-;;:::i;78214:495::-;;;;;;;;;;-1:-1:-1;78214:495:0;;;;;:::i;:::-;;:::i;58072:48::-;;;;;;;;;;;;58116:4;58072:48;;34397:577;;;;;;;;;;-1:-1:-1;34397:577:0;;;;;:::i;:::-;;:::i;76307:561::-;;;;;;;;;;-1:-1:-1;76307:561:0;;;;;:::i;:::-;;:::i;57766:101::-;;;;;;;;;;;;57825:42;57766:101;;63527:531;;;;;;;;;;-1:-1:-1;63527:531:0;;;;;:::i;:::-;;:::i;77036:::-;;;;;;;;;;-1:-1:-1;77036:531:0;;;;;:::i;:::-;;:::i;73231:21::-;;;;;;;;;;;;;;;;72966:24;;;;;;;;;;;;;;;;73051:29;;;;;;;;;;;;;;;;61409:404;;;;;;;;;;-1:-1:-1;61409:404:0;;;;;:::i;:::-;;:::i;33072:214::-;;;;;;;;;;-1:-1:-1;33072:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;33243:25:0;;;33214:4;33243:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33072:214;63152:119;;;;;;;;;;-1:-1:-1;63152:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;63235:15:0;63208:7;63235:15;;;:9;:15;;;;;:28;-1:-1:-1;;;63235:28:0;;-1:-1:-1;;;;;63235:28:0;;63152:119;58192:37;;;;;;;;;;-1:-1:-1;58192:37:0;;;;-1:-1:-1;;;;;58192:37:0;;;14952:229;;;;;;;;;;-1:-1:-1;14952:229:0;;;;;:::i;:::-;;:::i;58571:32::-;;;;;;;;;;-1:-1:-1;58571:32:0;;;;;:::i;:::-;;:::i;60708:167::-;;;;;;;;;;-1:-1:-1;60708:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;60834:33:0;60802:7;60834:33;;;:23;:33;;;;;;;60708:167;79023:1445;;;;;;:::i;:::-;;:::i;59609:331::-;59739:4;-1:-1:-1;;;;;;59781:40:0;;-1:-1:-1;;;59781:40:0;;:98;;-1:-1:-1;;;;;;;59838:41:0;;-1:-1:-1;;;59838:41:0;59781:98;:151;;;;59896:36;59920:11;59896:23;:36::i;:::-;59761:171;59609:331;-1:-1:-1;;59609:331:0:o;29819:100::-;29873:13;29906:5;29899:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29819:100;:::o;32294:308::-;32415:7;32462:16;32470:7;32462;:16::i;:::-;32440:110;;;;-1:-1:-1;;;32440:110:0;;16154:2:1;32440:110:0;;;16136:21:1;16193:2;16173:18;;;16166:30;16232:34;16212:18;;;16205:62;-1:-1:-1;;;16283:18:1;;;16276:42;16335:19;;32440:110:0;;;;;;;;;-1:-1:-1;32570:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32570:24:0;;32294:308::o;31810:418::-;31891:13;31907:23;31922:7;31907:14;:23::i;:::-;31891:39;;31955:5;-1:-1:-1;;;;;31949:11:0;:2;-1:-1:-1;;;;;31949:11:0;;;31941:57;;;;-1:-1:-1;;;31941:57:0;;16567:2:1;31941:57:0;;;16549:21:1;16606:2;16586:18;;;16579:30;16645:34;16625:18;;;16618:62;-1:-1:-1;;;16696:18:1;;;16689:31;16737:19;;31941:57:0;16365:397:1;31941:57:0;12982:10;-1:-1:-1;;;;;32033:21:0;;;;:62;;-1:-1:-1;32058:37:0;32075:5;12982:10;33072:214;:::i;32058:37::-;32011:168;;;;-1:-1:-1;;;32011:168:0;;16969:2:1;32011:168:0;;;16951:21:1;17008:2;16988:18;;;16981:30;17047:34;17027:18;;;17020:62;17118:26;17098:18;;;17091:54;17162:19;;32011:168:0;16767:420:1;32011:168:0;32192:28;32201:2;32205:7;32214:5;32192:8;:28::i;:::-;31880:348;31810:418;;:::o;65533:448::-;65704:12;65719:155;12982:10;65780:7;65802:5;65822:7;65844:19;65719;:155::i;:::-;65885:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;65885:39:0;65920:4;65885:39;;;65704:170;-1:-1:-1;65954:12:0;12982:10;;12902:98;65954:12;-1:-1:-1;;;;;65940:33:0;;65968:4;65940:33;;;;1489:25:1;;1477:2;1462:18;;1343:177;65940:33:0;;;;;;;;65693:288;65533:448;;;;:::o;62104:338::-;14125:6;;-1:-1:-1;;;;;14125:6:0;12982:10;14272:23;14264:68;;;;-1:-1:-1;;;14264:68:0;;;;;;;:::i;:::-;62242:38:::1;62259:12;62273:6;62242:16;:38::i;:::-;62330:15:::0;;::::1;62360::::0;;::::1;::::0;62390:9;;62414;;::::1;::::0;62296:138:::1;::::0;;-1:-1:-1;;;;;17972:15:1;;;17954:34;;18024:15;;;;18004:18;;;17997:43;;;;18056:18;;;18049:34;18114:2;18099:18;;18092:34;62296:138:0::1;::::0;17903:3:1;17888:19;62296:138:0::1;;;;;;;;62104:338:::0;;:::o;58447:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58447:29:0;;-1:-1:-1;58447:29:0;:::o;64390:1041::-;64625:20;64648:34;64662:19;64648:13;:34::i;:::-;-1:-1:-1;;;;;64717:31:0;;;;;;:23;:31;;;;;;64625:57;;-1:-1:-1;64717:42:0;;64695:119;;;;-1:-1:-1;;;64695:119:0;;18339:2:1;64695:119:0;;;18321:21:1;18378:2;18358:18;;;18351:30;18417:29;18397:18;;;18390:57;18464:18;;64695:119:0;18137:351:1;64695:119:0;64846:12;64833:9;:25;;64825:59;;;;-1:-1:-1;;;64825:59:0;;18695:2:1;64825:59:0;;;18677:21:1;18734:2;18714:18;;;18707:30;-1:-1:-1;;;18753:18:1;;;18746:51;18814:18;;64825:59:0;18493:345:1;64825:59:0;64897:194;64925:6;64946:7;64968:5;64988:7;65010:19;65044:12;65071:9;64897:13;:194::i;:::-;65102:48;65116:6;12982:10;65138:7;65102:48;;;;;;;;;;;;:13;:48::i;:::-;14125:6;;-1:-1:-1;;;;;65167:17:0;;;14125:6;;65167:17;65163:194;;57825:42;65201:51;65278:12;65306:6;65314:17;:15;:17::i;:::-;65333:11;:9;:11::i;:::-;65201:144;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65163:194;12982:10;65367:56;65398:24;65410:12;65398:9;:24;:::i;:::-;65367:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64614:817;64390:1041;;;;;;:::o;81701:1271::-;81961:9;;81948;81932:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;81910:111;;;;-1:-1:-1;;;81910:111:0;;20723:2:1;81910:111:0;;;20705:21:1;20762:2;20742:18;;;20735:30;-1:-1:-1;;;20781:18:1;;;20774:53;20844:18;;81910:111:0;20521:347:1;81910:111:0;82053:6;82040:9;:19;:34;;;-1:-1:-1;82063:11:0;;82040:34;82032:68;;;;-1:-1:-1;;;82032:68:0;;21075:2:1;82032:68:0;;;21057:21:1;21114:2;21094:18;;;21087:30;-1:-1:-1;;;21133:18:1;;;21126:51;21194:18;;82032:68:0;20873:345:1;82032:68:0;82132:14;;82119:9;:27;;82111:62;;;;-1:-1:-1;;;82111:62:0;;;;;;;:::i;:::-;82203:23;:32;82227:7;14125:6;;-1:-1:-1;;;;;14125:6:0;;14052:87;82227:7;-1:-1:-1;;;;;82203:32:0;-1:-1:-1;;;;;82203:32:0;;;;;;;;;;;;;82192:7;:43;82184:71;;;;-1:-1:-1;;;82184:71:0;;21776:2:1;82184:71:0;;;21758:21:1;21815:2;21795:18;;;21788:30;-1:-1:-1;;;21834:18:1;;;21827:45;21889:18;;82184:71:0;21574:339:1;82184:71:0;82268:17;82288:34;82302:19;82288:13;:34::i;:::-;82268:54;-1:-1:-1;82333:18:0;82354:21;82268:54;82354:9;:21;:::i;:::-;82333:42;;82407:10;82394:9;:23;;82386:55;;;;-1:-1:-1;;;82386:55:0;;22293:2:1;82386:55:0;;;22275:21:1;22332:2;22312:18;;;22305:30;-1:-1:-1;;;22351:18:1;;;22344:49;22410:18;;82386:55:0;22091:343:1;82386:55:0;82454:12;82469:107;82503:7;82525:6;82546:19;82469;:107::i;:::-;82610:32;;;;:26;:32;;;;;;82454:122;;-1:-1:-1;82610:32:0;;82609:33;82587:109;;;;-1:-1:-1;;;82587:109:0;;22641:2:1;82587:109:0;;;22623:21:1;22680:2;22660:18;;;22653:30;22719:28;22699:18;;;22692:56;22765:18;;82587:109:0;22439:350:1;82587:109:0;82707:14;82724:23;:4;82737:9;82724:12;:23::i;:::-;82707:40;;82758:25;82776:6;82758:17;:25::i;:::-;82796:36;12982:10;82822:9;82796:11;:36::i;:::-;82848:49;;;22996:25:1;;;23052:2;23037:18;;23030:34;;;23080:18;;;23073:34;;;82848:49:0;;12982:10;;82848:49;;;;;;22984:2:1;82848:49:0;;;12982:10;82910:54;82941:22;82953:10;82941:9;:22;:::i;:::-;82910:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81899:1073;;;;81701:1271;;;;;:::o;61907:138::-;14125:6;;-1:-1:-1;;;;;14125:6:0;12982:10;14272:23;14264:68;;;;-1:-1:-1;;;14264:68:0;;;;;;;:::i;:::-;61972:22:::1;:28:::0;;-1:-1:-1;;;;;;61972:28:0::1;-1:-1:-1::0;;;;;61972:28:0;::::1;::::0;;::::1;::::0;;;62016:21:::1;::::0;1856:51:1;;;62016:21:0::1;::::0;1844:2:1;1829:18;62016:21:0::1;;;;;;;;61907:138:::0;:::o;30353:115::-;30405:7;30448:12;;30432:13;:11;:13::i;:::-;:28;;;;:::i;:::-;30425:35;;30353:115;:::o;33353:385::-;33487:13;33503:23;33518:7;33503:14;:23::i;:::-;33487:39;-1:-1:-1;33559:48:0;12982:10;33592:7;33601:5;33559:18;:48::i;:::-;33537:147;;;;-1:-1:-1;;;33537:147:0;;;;;;;:::i;:::-;33695:35;33705:4;33711:2;33715:7;33724:5;33695:9;:35::i;:::-;33476:262;33353:385;;;:::o;73972:226::-;74151:39;74157:5;74164:9;74175:5;74182:7;74151:5;:39::i;60012:266::-;60121:16;60139:21;60178:15;60229:5;60210:15;;60197:10;:28;;;;:::i;:::-;60196:38;;;;:::i;:::-;60178:56;;60253:7;14125:6;;-1:-1:-1;;;;;14125:6:0;;14052:87;60253:7;60245:25;-1:-1:-1;60262:7:0;-1:-1:-1;60012:266:0;;;;;;:::o;33809:185::-;33947:39;33964:4;33970:2;33974:7;33947:39;;;;;;;;;;;;:16;:39::i;75719:149::-;75778:8;;;;75770:65;;;;-1:-1:-1;;;75770:65:0;;23995:2:1;75770:65:0;;;23977:21:1;24034:2;24014:18;;;24007:30;24073:34;24053:18;;;24046:62;-1:-1:-1;;;24124:18:1;;;24117:42;24176:19;;75770:65:0;23793:408:1;75770:65:0;75846:14;75852:7;75846:5;:14::i;:::-;75719:149;:::o;29067:685::-;29184:7;29217:16;29225:7;29217;:16::i;:::-;29209:70;;;;-1:-1:-1;;;29209:70:0;;24408:2:1;29209:70:0;;;24390:21:1;24447:2;24427:18;;;24420:30;24486:34;24466:18;;;24459:62;-1:-1:-1;;;24537:18:1;;;24530:39;24586:19;;29209:70:0;24206:405:1;29209:70:0;29306:15;;29296:7;:25;29292:417;;;29338:26;27161:2;29383:7;:29;29379:123;;29454:28;27161:2;29454:7;:28;:::i;:::-;:32;;29485:1;29454:32;:::i;:::-;29433:53;;29379:123;29535:7;29518:180;29549:18;29544:1;:23;29518:180;;29619:1;29597:10;;;:7;:10;;;;;;-1:-1:-1;;;;;29597:10:0;:24;29593:90;;29653:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;29653:10:0;;29067:685;-1:-1:-1;;;29067:685:0:o;29593:90::-;29569:3;;;;:::i;:::-;;;;29518:180;;;;29323:386;29292:417;-1:-1:-1;29728:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;29728:16:0;;29067:685::o;60337:188::-;60451:7;60483:34;60497:19;60483:13;:34::i;28702:303::-;28819:7;-1:-1:-1;;;;;28866:19:0;;28844:111;;;;-1:-1:-1;;;28844:111:0;;24959:2:1;28844:111:0;;;24941:21:1;24998:2;24978:18;;;24971:30;25037:34;25017:18;;;25010:62;-1:-1:-1;;;25088:18:1;;;25081:40;25138:19;;28844:111:0;24757:406:1;28844:111:0;-1:-1:-1;;;;;;28973:16:0;;;;;:9;:16;;;;;:24;-1:-1:-1;;;;;28973:24:0;;28702:303::o;14703:94::-;14125:6;;-1:-1:-1;;;;;14125:6:0;12982:10;14272:23;14264:68;;;;-1:-1:-1;;;14264:68:0;;;;;;;:::i;:::-;14768:21:::1;14786:1;14768:9;:21::i;:::-;14703:94::o:0;80626:355::-;80782:7;80802:31;12982:10;80802:17;:31::i;:::-;80862:14;;80852:6;:24;;80844:59;;;;-1:-1:-1;;;80844:59:0;;;;;;;:::i;:::-;80923:50;80936:7;80945:6;80953:19;80923:12;:50::i;:::-;80916:57;80626:355;-1:-1:-1;;;;80626:355:0:o;81109:417::-;81255:31;12982:10;80802:17;:31::i;81255:::-;81297:12;81312:107;81346:7;81368:6;81389:19;81312;:107::i;:::-;81430:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;81430:39:0;81465:4;81430:39;;;81297:122;-1:-1:-1;81499:12:0;12982:10;;12902:98;81499:12;-1:-1:-1;;;;;81485:33:0;;81513:4;81485:33;;;;1489:25:1;;1477:2;1462:18;;1343:177;81485:33:0;;;;;;;;81244:282;81109:417;;;:::o;77746:335::-;77940:7;77960:31;12982:10;80802:17;:31::i;77960:::-;78009:64;78027:14;78043:7;78052:5;78059;78066:6;78009:17;:64::i;:::-;78002:71;77746:335;-1:-1:-1;;;;;;77746:335:0:o;29988:104::-;30044:13;30077:7;30070:14;;;;;:::i;32674:327::-;-1:-1:-1;;;;;32809:24:0;;12982:10;32809:24;;32801:62;;;;-1:-1:-1;;;32801:62:0;;25370:2:1;32801:62:0;;;25352:21:1;25409:2;25389:18;;;25382:30;25448:27;25428:18;;;25421:55;25493:18;;32801:62:0;25168:349:1;32801:62:0;12982:10;32876:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32876:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32876:53:0;;;;;;;;;;32945:48;;540:41:1;;;32876:42:0;;12982:10;32945:48;;513:18:1;32945:48:0;;;;;;;32674:327;;:::o;30728:184::-;30804:18;;30780:7;;30804:18;;30800:70;;;-1:-1:-1;30846:12:0;;;30728:184::o;30800:70::-;-1:-1:-1;30889:15:0;;;30728:184::o;62891:168::-;12982:10;62951:37;;;;:23;:37;;;;;;;;;:47;;;63014:37;;1489:25:1;;;63014:37:0;;1462:18:1;63014:37:0;;;;;;;62891:168;:::o;62501:141::-;14125:6;;-1:-1:-1;;;;;14125:6:0;12982:10;14272:23;14264:68;;;;-1:-1:-1;;;14264:68:0;;;;;;;:::i;:::-;62572:24:::1;62589:6;62572:16;:24::i;:::-;62612:22;::::0;1489:25:1;;;62612:22:0::1;::::0;1477:2:1;1462:18;62612:22:0::1;1343:177:1::0;78214:495:0;78398:31;12982:10;80802:17;:31::i;78398:::-;78440:12;78455:147;78494:14;78523:7;78545:5;78565;78585:6;78455:24;:147::i;:::-;78613:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;78613:39:0;78648:4;78613:39;;;78440:162;-1:-1:-1;78682:12:0;12982:10;;12902:98;78682:12;-1:-1:-1;;;;;78668:33:0;;78696:4;78668:33;;;;1489:25:1;;1477:2;1462:18;;1343:177;78668:33:0;;;;;;;;78387:322;78214:495;;;;;:::o;34397:577::-;34564:13;34580:23;34595:7;34580:14;:23::i;:::-;34564:39;-1:-1:-1;34636:48:0;12982:10;34669:7;34678:5;34636:18;:48::i;:::-;34614:147;;;;-1:-1:-1;;;34614:147:0;;;;;;;:::i;:::-;34772:35;34782:4;34788:2;34792:7;34801:5;34772:9;:35::i;:::-;34840:48;34863:4;34869:2;34873:7;34882:5;34840:22;:48::i;:::-;34818:148;;;;-1:-1:-1;;;34818:148:0;;;;;;;:::i;:::-;34553:421;34397:577;;;;:::o;76307:561::-;14125:6;;-1:-1:-1;;;;;14125:6:0;12982:10;14272:23;14264:68;;;;-1:-1:-1;;;14264:68:0;;;;;;;:::i;:::-;76442:18:::1;::::0;::::1;;76441:19;76433:66;;;::::0;-1:-1:-1;;;76433:66:0;;26143:2:1;76433:66:0::1;::::0;::::1;26125:21:1::0;26182:2;26162:18;;;26155:30;26221:34;26201:18;;;26194:62;-1:-1:-1;;;26272:18:1;;;26265:32;26314:19;;76433:66:0::1;25941:398:1::0;76433:66:0::1;76519:18;76527:9;;76519:7;:18::i;:::-;76510:6;:27:::0;76548:25:::1;:8;76559:14:::0;;76548:25:::1;:::i;:::-;-1:-1:-1::0;76584:18:0::1;:25:::0;;-1:-1:-1;;76584:25:0::1;76605:4;76584:25;::::0;;76622:138;::::1;;;76733:15;::::0;76721:9:::1;:27:::0;76622:138:::1;76787:15;::::0;76772:12:::1;:30:::0;76818:42:::1;::::0;::::1;::::0;::::1;::::0;76831:14;;;;76847:12;;76818:42:::1;:::i;:::-;;;;;;;;76307:561:::0;;;:::o;63527:531::-;63712:7;63770:23;63785:7;63770:14;:23::i;:::-;-1:-1:-1;;;;;63754:39:0;12982:10;-1:-1:-1;;;;;63754:39:0;;63732:115;;;;-1:-1:-1;;;63732:115:0;;27024:2:1;63732:115:0;;;27006:21:1;27063:2;27043:18;;;27036:30;27102:28;27082:18;;;27075:56;27148:18;;63732:115:0;26822:350:1;63732:115:0;63878:172;12982:10;63940:7;63966:5;63990:7;64016:19;63878:12;:172::i;:::-;63858:192;63527:531;-1:-1:-1;;;;;63527:531:0:o;77036:::-;77190:18;;77154:13;;77190:18;;77185:105;;66315:16;;;;;;;;;;;;-1:-1:-1;;;66315:16:0;;;;77268:8;77239:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77225:53;;77036:531;;;:::o;77185:105::-;77310:16;77318:7;77310;:16::i;:::-;77302:60;;;;-1:-1:-1;;;77302:60:0;;28438:2:1;77302:60:0;;;28420:21:1;28477:2;28457:18;;;28450:30;28516:33;28496:18;;;28489:61;28567:18;;77302:60:0;28236:355:1;77302:60:0;77375:16;77415:9;;77405:6;;77395:7;:16;;;;:::i;:::-;77394:30;;;;:::i;:::-;77375:49;;77497:10;66315:16;;;;;;;;;;;;-1:-1:-1;;;66315:16:0;;;;;66229:110;77497:10;77509:8;77524:19;:8;:17;:19::i;:::-;77480:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77435:124;;;77036:531;;;:::o;61409:404::-;61504:21;61486:14;:39;;61478:48;;;;;;57825:42;;61617:27;61652:14;61682:7;14125:6;;-1:-1:-1;;;;;14125:6:0;;14052:87;61682:7;61704:12;61731:15;61617:140;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61773:32;61790:14;61773:32;;;;1489:25:1;;1477:2;1462:18;;1343:177;14952:229:0;14125:6;;-1:-1:-1;;;;;14125:6:0;12982:10;14272:23;14264:68;;;;-1:-1:-1;;;14264:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15055:22:0;::::1;15033:110;;;::::0;-1:-1:-1;;;15033:110:0;;30957:2:1;15033:110:0::1;::::0;::::1;30939:21:1::0;30996:2;30976:18;;;30969:30;31035:34;31015:18;;;31008:62;-1:-1:-1;;;31086:18:1;;;31079:36;31132:19;;15033:110:0::1;30755:402:1::0;15033:110:0::1;15154:19;15164:8;15154:9;:19::i;58571:32::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58571:32:0;:::o;79023:1445::-;79321:9;;79308;79292:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;79270:111;;;;-1:-1:-1;;;79270:111:0;;20723:2:1;79270:111:0;;;20705:21:1;20762:2;20742:18;;;20735:30;-1:-1:-1;;;20781:18:1;;;20774:53;20844:18;;79270:111:0;20521:347:1;79270:111:0;79413:6;79400:9;:19;:34;;;-1:-1:-1;79423:11:0;;79400:34;79392:68;;;;-1:-1:-1;;;79392:68:0;;21075:2:1;79392:68:0;;;21057:21:1;21114:2;21094:18;;;21087:30;-1:-1:-1;;;21133:18:1;;;21126:51;21194:18;;79392:68:0;20873:345:1;79392:68:0;79492:14;;79479:9;:27;;79471:62;;;;-1:-1:-1;;;79471:62:0;;;;;;;:::i;:::-;79577:23;:32;79601:7;14125:6;;-1:-1:-1;;;;;14125:6:0;;14052:87;79601:7;-1:-1:-1;;;;;79577:32:0;-1:-1:-1;;;;;79577:32:0;;;;;;;;;;;;;79566:7;:43;79544:125;;;;-1:-1:-1;;;79544:125:0;;31364:2:1;79544:125:0;;;31346:21:1;;;31383:18;;;31376:30;31442:34;31422:18;;;31415:62;31494:18;;79544:125:0;31162:356:1;79544:125:0;-1:-1:-1;;;;;79688:30:0;;12982:10;79688:30;79680:57;;;;-1:-1:-1;;;79680:57:0;;31725:2:1;79680:57:0;;;31707:21:1;31764:2;31744:18;;;31737:30;-1:-1:-1;;;31783:18:1;;;31776:44;31837:18;;79680:57:0;31523:338:1;79680:57:0;79750:18;79771:17;79779:9;79771:5;:17;:::i;:::-;79750:38;;79820:10;79807:9;:23;;79799:55;;;;-1:-1:-1;;;79799:55:0;;22293:2:1;79799:55:0;;;22275:21:1;22332:2;22312:18;;;22305:30;-1:-1:-1;;;22351:18:1;;;22344:49;22410:18;;79799:55:0;22091:343:1;79799:55:0;79867:12;79882:147;79921:14;79950:7;79972:5;79992;80012:6;79882:24;:147::i;:::-;80063:32;;;;:26;:32;;;;;;79867:162;;-1:-1:-1;80063:32:0;;80062:33;80040:109;;;;-1:-1:-1;;;80040:109:0;;22641:2:1;80040:109:0;;;22623:21:1;22680:2;22660:18;;;22653:30;22719:28;22699:18;;;22692:56;22765:18;;80040:109:0;22439:350:1;80040:109:0;80160:14;80177:23;:4;80190:9;80177:12;:23::i;:::-;80160:40;;80211:25;80229:6;80211:17;:25::i;:::-;80247:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;80247:39:0;80282:4;80247:39;;;80299:36;80311:12;12982:10;;12902:98;80311:12;80325:9;80299:11;:36::i;:::-;80351:44;;;22996:25:1;;;23052:2;23037:18;;23030:34;;;23080:18;;;23073:34;;;80351:44:0;;12982:10;;80351:44;;;;;;22984:2:1;80351:44:0;;;12982:10;80406:54;80437:22;80449:10;80437:9;:22;:::i;:::-;80406:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79259:1209;;;79023:1445;;;;;;;:::o;28283:355::-;28430:4;-1:-1:-1;;;;;;28472:40:0;;-1:-1:-1;;;28472:40:0;;:105;;-1:-1:-1;;;;;;;28529:48:0;;-1:-1:-1;;;28529:48:0;28472:105;:158;;;-1:-1:-1;;;;;;;;;;5962:40:0;;;28594:36;5803:207;36546:281;36611:4;36632:16;;;:7;:16;;;;;;;;36628:61;;;-1:-1:-1;36672:5:0;;36546:281;-1:-1:-1;36546:281:0:o;36628:61::-;36715:15;;36705:7;:25;36701:69;;;-1:-1:-1;36754:4:0;;36546:281;-1:-1:-1;36546:281:0:o;36701:69::-;-1:-1:-1;36817:1:0;36789:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36789:16:0;:30;;;36546:281::o;43512:271::-;43640:24;;;;:15;:24;;;;;;-1:-1:-1;;;;;43640:30:0;;;:24;;:30;43636:140;;43687:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43687:29:0;-1:-1:-1;;;;;43687:29:0;;;;;;;;;43736:28;;43687:24;;43736:28;;;;;;;43512:271;;;:::o;70768:506::-;70975:7;71015:251;71062:189;71097:5;71125:7;71155:5;71183:7;71213:19;71062:12;:189::i;:::-;55548:58;;43232:66:1;55548:58:0;;;43220:79:1;43315:12;;;43308:28;;;55379:7:0;;43352:12:1;;55548:58:0;;;;;;;;;;;;55520:101;;;;;;55500:121;;55283:346;;;;68883:324;69046:9;;;;69034;;57975:4;;69034:21;;;:::i;:::-;:42;;69012:114;;;;-1:-1:-1;;;69012:114:0;;32068:2:1;69012:114:0;;;32050:21:1;32107:2;32087:18;;;32080:30;-1:-1:-1;;;32126:18:1;;;32119:52;32188:18;;69012:114:0;31866:346:1;69012:114:0;69137:27;:12;69152;69137:27;;:::i;:::-;-1:-1:-1;69175:24:0;:15;69193:6;69175:24;;:::i;67211:1310::-;67372:22;;;67427;;;67488;;;;67547;;;;67323:7;;67372:22;67427;67488;67601:15;67635:29;;;;67627:61;;;;-1:-1:-1;;;67627:61:0;;32419:2:1;67627:61:0;;;32401:21:1;32458:2;32438:18;;;32431:30;-1:-1:-1;;;32477:18:1;;;32470:49;32536:18;;67627:61:0;32217:343:1;67627:61:0;67741:15;67721:17;:35;67699:109;;;;-1:-1:-1;;;67699:109:0;;32767:2:1;67699:109:0;;;32749:21:1;32806:2;32786:18;;;32779:30;32845:26;32825:18;;;32818:54;32889:18;;67699:109:0;32565:348:1;67699:109:0;67844:11;67827:13;:28;;67819:70;;;;-1:-1:-1;;;67819:70:0;;33120:2:1;67819:70:0;;;33102:21:1;33159:2;33139:18;;;33132:30;33198:31;33178:18;;;33171:59;33247:18;;67819:70:0;32918:353:1;67819:70:0;67923:11;67906:13;:28;:58;;;;67949:15;67938:8;:26;67906:58;67902:109;;;-1:-1:-1;67988:11:0;;67211:1310;-1:-1:-1;;;;;67211:1310:0:o;67902:109::-;68023:12;68038:27;68054:11;68038:13;:27;:::i;:::-;68023:42;-1:-1:-1;68076:18:0;57919:3;68098:28;68109:17;68098:8;:28;:::i;:::-;68097:64;;;;:::i;:::-;68076:85;-1:-1:-1;68176:15:0;68172:68;;-1:-1:-1;68215:13:0;;67211:1310;-1:-1:-1;;;;;;;67211:1310:0:o;68172:68::-;68343:23;57919:3;68370:35;68388:17;68370:15;:35;:::i;:::-;68369:71;;;;:::i;:::-;68343:97;-1:-1:-1;68503:10:0;68477:22;68343:97;68477:4;:22;:::i;:::-;68476:37;;;;:::i;:::-;68460:53;;:13;:53;:::i;:::-;68453:60;67211:1310;-1:-1:-1;;;;;;;;;;67211:1310:0:o;69797:761::-;70057:12;70072:149;70106:6;70127:7;70149:5;70169:7;70191:19;70072;:149::i;:::-;70241:32;;;;:26;:32;;;;;;70057:164;;-1:-1:-1;70241:32:0;;70240:33;70232:67;;;;-1:-1:-1;;;70232:67:0;;33478:2:1;70232:67:0;;;33460:21:1;33517:2;33497:18;;;33490:30;-1:-1:-1;;;33536:18:1;;;33529:51;33597:18;;70232:67:0;33276:345:1;70232:67:0;-1:-1:-1;;;;;70332:33:0;;:23;:4;70345:9;70332:12;:23::i;:::-;-1:-1:-1;;;;;70332:33:0;;70310:111;;;;-1:-1:-1;;;70310:111:0;;33828:2:1;70310:111:0;;;33810:21:1;33867:2;33847:18;;;33840:30;33906;33886:18;;;33879:58;33954:18;;70310:111:0;33626:352:1;70310:111:0;70432:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;70432:39:0;70467:4;70432:39;;;70531:12;12982:10;;12902:98;70531:12;-1:-1:-1;;;;;70489:61:0;70523:6;-1:-1:-1;;;;;70489:61:0;70503:7;70489:61;70512:9;70545:4;70489:61;;;;;;34157:25:1;;;34213:2;34198:18;;34191:34;34145:2;34130:18;;33983:248;70489:61:0;;;;;;;;70046:512;69797:761;;;;;;;:::o;35856:377::-;36013:53;36023:4;36029:2;36033:7;36042:23;36057:7;36042:14;:23::i;:::-;36013:9;:53::i;:::-;36099:48;36122:4;36128:2;36132:7;36141:5;36099:22;:48::i;:::-;36077:148;;;;-1:-1:-1;;;36077:148:0;;;;;;;:::i;66430:207::-;66543:16;;;66557:1;66543:16;;;;;;;;;66480;;66509:31;;66543:16;;;;;;;;;;-1:-1:-1;;14125:6:0;;66509:50;;-1:-1:-1;;;;;;;14125:6:0;66570:14;66585:1;66570:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;66570:27:0;;;:17;;;;;;;;;;;:27;66615:14;66430:207;-1:-1:-1;66430:207:0:o;66724:191::-;66825:16;;;66839:1;66825:16;;;;;;;;;66768;;66797:25;;66825:16;;;;;;;;;;;;-1:-1:-1;66825:16:0;66797:44;;66866:15;;66852:8;66861:1;66852:11;;;;;;;;:::i;:::-;;;;;;;;;;:29;66899:8;66724:191;-1:-1:-1;66724:191:0:o;84490:318::-;84648:7;84688:112;84735:50;84748:7;84757:6;84765:19;84735:12;:50::i;51316:263::-;51421:7;51447:17;51466:18;51488:27;51499:4;51505:9;51488:10;:27::i;:::-;51446:69;;;;51526:18;51538:5;51526:11;:18::i;:::-;-1:-1:-1;51562:9:0;51316:263;-1:-1:-1;;;51316:263:0:o;69322:196::-;14125:6;;-1:-1:-1;;;;;69412:17:0;;;14125:6;;69412:17;;:53;;-1:-1:-1;69443:22:0;;-1:-1:-1;;;;;69433:32:0;;;69443:22;;69433:32;69412:53;69390:120;;;;-1:-1:-1;;;69390:120:0;;34438:2:1;69390:120:0;;;34420:21:1;34477:2;34457:18;;;34450:30;-1:-1:-1;;;34496:18:1;;;34489:47;34553:18;;69390:120:0;34236:341:1;87967:414:0;88061:7;;:12;;:65;;-1:-1:-1;88119:7:0;;-1:-1:-1;;;;;88077:16:0;;;;;;:9;:16;;;;;:29;:38;;88109:6;;-1:-1:-1;;;88077:29:0;;-1:-1:-1;;;;;88077:29:0;:38;:::i;:::-;:49;;88061:65;88039:138;;;;-1:-1:-1;;;88039:138:0;;34784:2:1;88039:138:0;;;34766:21:1;34823:2;34803:18;;;34796:30;34862:25;34842:18;;;34835:53;34905:18;;88039:138:0;34582:347:1;88039:138:0;88192:18;;;;88188:186;;;88227:31;88244:5;88251:6;88227:16;:31::i;:::-;88289:6;88273:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;88188:186:0;;-1:-1:-1;88188:186:0;;88328:34;88348:5;88355:6;88328:19;:34::i;:::-;87967:414;;:::o;36994:410::-;37136:4;37175:16;37183:7;37175;:16::i;:::-;37153:110;;;;-1:-1:-1;;;37153:110:0;;35136:2:1;37153:110:0;;;35118:21:1;35175:2;35155:18;;;35148:30;35214:34;35194:18;;;35187:62;-1:-1:-1;;;35265:18:1;;;35258:42;35317:19;;37153:110:0;34934:408:1;37153:110:0;37293:5;-1:-1:-1;;;;;37282:16:0;:7;-1:-1:-1;;;;;37282:16:0;;:64;;;;37339:7;-1:-1:-1;;;;;37315:31:0;:20;37327:7;37315:11;:20::i;:::-;-1:-1:-1;;;;;37315:31:0;;37282:64;:113;;;-1:-1:-1;;;;;;33243:25:0;;;33214:4;33243:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37363:32;33072:214;42568:826;42733:4;-1:-1:-1;;;;;42724:13:0;:5;-1:-1:-1;;;;;42724:13:0;;42716:68;;;;-1:-1:-1;;;42716:68:0;;35549:2:1;42716:68:0;;;35531:21:1;35588:2;35568:18;;;35561:30;35627:34;35607:18;;;35600:62;-1:-1:-1;;;35678:18:1;;;35671:40;35728:19;;42716:68:0;35347:406:1;42716:68:0;-1:-1:-1;;;;;42803:16:0;;42795:65;;;;-1:-1:-1;;;42795:65:0;;35960:2:1;42795:65:0;;;35942:21:1;35999:2;35979:18;;;35972:30;36038:34;36018:18;;;36011:62;-1:-1:-1;;;36089:18:1;;;36082:34;36133:19;;42795:65:0;35758:400:1;42795:65:0;42977:35;42994:1;42998:7;43007:4;42977:8;:35::i;:::-;-1:-1:-1;;;;;43025:15:0;;;;;;:9;:15;;;;;:28;;43052:1;;43025:15;:28;;43052:1;;-1:-1:-1;;;;;43025:28:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;43025:28:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43064:13:0;;-1:-1:-1;43064:13:0;;;:9;:13;;;;;:26;;-1:-1:-1;;;43064:13:0;;:26;;-1:-1:-1;;43064:26:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;43064:26:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;43101:16:0;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;43101:21:0;-1:-1:-1;;;;;43101:21:0;;;;;43157:11;43101:16;-1:-1:-1;43157:11:0;:::i;:::-;43135:33;;43197:15;;43183:11;:29;43179:163;;;43265:1;43233:20;;;:7;:20;;;;;;-1:-1:-1;;;;;43233:20:0;43229:102;;43288:20;;;;:7;:20;;;;;:27;;-1:-1:-1;;;;;;43288:27:0;-1:-1:-1;;;;;43288:27:0;;;;;43229:102;43378:7;43374:2;-1:-1:-1;;;;;43359:27:0;43368:4;-1:-1:-1;;;;;43359:27:0;-1:-1:-1;;;;;;;;;;;43359:27:0;;;;;;;;;42705:689;42568:826;;;;:::o;74206:1157::-;74395:7;;;;;;;74394:8;74386:45;;;;-1:-1:-1;;;74386:45:0;;36874:2:1;74386:45:0;;;36856:21:1;36913:2;36893:18;;;36886:30;36952:26;36932:18;;;36925:54;36996:18;;74386:45:0;36672:348:1;74386:45:0;74442:7;:14;;74480:8;;74469:19;;-1:-1:-1;;74469:19:0;;;;74442:14;74469:19;;;74480:8;74520;;;;74499:18;:29;;-1:-1:-1;;74499:29:0;;;;;;;;;;74541:6;:19;;74550:10;-1:-1:-1;;;;;;74541:19:0;;;;;;;74571:61;;;;;;;;74605:12;;-1:-1:-1;;;;;74571:61:0;;;;;74619:12;;;;74571:61;;;;;;;;;74668:12;;;;74643:22;:37;;;;;;;;;;;;;;;74710:8;;74693:26;;:16;:26::i;:::-;74730:52;74747:12;74730:52;;;;;;;;74762:5;74768:1;74762:8;;;;;;;:::i;:::-;;;;;74730:52;;;;74772:5;74778:1;74772:8;;;;;;;:::i;:::-;;;;;74730:52;;:16;:52::i;:::-;74805:8;;;;74793:9;:20;;;72954:5;-1:-1:-1;74824:62:0;;;;-1:-1:-1;;;74824:62:0;;37227:2:1;74824:62:0;;;37209:21:1;37266:2;37246:18;;;37239:30;-1:-1:-1;;;37285:18:1;;;37278:51;37346:18;;74824:62:0;37025:345:1;74824:62:0;74995:8;;;;:13;;:34;;-1:-1:-1;75012:8:0;;;;75024:5;-1:-1:-1;75012:17:0;74995:34;74991:147;;;75063:5;75046:14;:22;74991:147;;;75118:8;;;;75101:14;:25;74991:147;75158:8;;;;75148:7;:18;75187:10;;75179:18;;;;75195:1;;75158:8;75179:18;;;;;:::i;:::-;-1:-1:-1;75218:10:0;;;;;75208:20;;;;75226:1;;75208:20;;;:::i;:::-;-1:-1:-1;75250:10:0;;;;75239:21;;;;:8;;75250:10;75239:21;;;;;:::i;:::-;-1:-1:-1;75275:18:0;;;;75271:85;;;75315:29;75328:8;75338:5;75315:29;;;;;;;:::i;:::-;;;;;;;;74375:988;74206:1157;;;;:::o;41507:482::-;41567:13;41583:23;41598:7;41583:14;:23::i;:::-;41567:39;-1:-1:-1;;;;;;41625:21:0;;12982:10;41625:21;41617:68;;;;-1:-1:-1;;;41617:68:0;;38598:2:1;41617:68:0;;;38580:21:1;38637:2;38617:18;;;38610:30;38676:34;38656:18;;;38649:62;-1:-1:-1;;;38727:18:1;;;38720:32;38769:19;;41617:68:0;38396:398:1;41617:68:0;41787:36;41804:1;41808:7;41817:5;41787:8;:36::i;:::-;-1:-1:-1;;;;;41836:16:0;;;;;;:9;:16;;;;;:29;;41864:1;;41836:16;:29;;41864:1;;-1:-1:-1;;;;;41836:29:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;41836:29:0;;;;;-1:-1:-1;;;;;41836:29:0;;;;;;41892:1;41876:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;41904:16:0;;;;:7;:16;;;;;;:23;;-1:-1:-1;;41904:23:0;41923:4;41904:23;;;41945:36;41912:7;;41904:16;-1:-1:-1;;;;;41945:36:0;;;-1:-1:-1;;;;;;;;;;;41945:36:0;41904:16;;41945:36;41556:433;41507:482;:::o;15189:173::-;15264:6;;;-1:-1:-1;;;;;15281:17:0;;;-1:-1:-1;;;;;;15281:17:0;;;;;;;15314:40;;15264:6;;;15281:17;15264:6;;15314:40;;15245:16;;15314:40;15234:128;15189:173;:::o;84928:474::-;85079:7;85188:4;85216:13;85252:7;14125:6;;-1:-1:-1;;;;;14125:6:0;;14052:87;85252:7;85282:6;85311:19;85353:7;85147:232;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85119:275;;;;;;85099:295;;84928:474;;;;;:::o;83736:563::-;83925:7;84034:4;84062:13;84098:7;14125:6;;-1:-1:-1;;;;;14125:6:0;;14052:87;84098:7;83993:283;;;-1:-1:-1;;;;;40189:15:1;;;83993:283:0;;;40171:34:1;40221:18;;;40214:34;;;;40284:15;;40264:18;;;40257:43;40336:15;;;40316:18;;;40309:43;40368:19;;;40361:35;;;40412:19;;;40405:35;;;40456:19;;;40449:35;;;40500:19;;;40493:35;;;40105:19;;83993:283:0;;;;;;;;;;;;;83965:326;;;;;;83945:346;;83736:563;;;;;;;:::o;68586:231::-;58116:4;68670:15;;:36;;68648:126;;;;-1:-1:-1;;;68648:126:0;;40741:2:1;68648:126:0;;;40723:21:1;40780:2;40760:18;;;40753:30;40819:34;40799:18;;;40792:62;-1:-1:-1;;;40870:18:1;;;40863:38;40918:19;;68648:126:0;40539:404:1;68648:126:0;68785:15;:24;68586:231::o;83168:370::-;83364:7;83404:126;83451:64;83469:14;83485:5;83492:7;83501:5;83508:6;83451:17;:64::i;44348:980::-;44503:4;-1:-1:-1;;;;;44524:13:0;;16373:20;16421:8;44520:801;;44577:175;;-1:-1:-1;;;44577:175:0;;-1:-1:-1;;;;;44577:36:0;;;;;:175;;12982:10;;44671:4;;44698:7;;44728:5;;44577:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44577:175:0;;;;;;;;-1:-1:-1;;44577:175:0;;;;;;;;;;;;:::i;:::-;;;44556:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44935:13:0;;44931:320;;44978:108;;-1:-1:-1;;;44978:108:0;;;;;;;:::i;44931:320::-;45201:6;45195:13;45186:6;45182:2;45178:15;45171:38;44556:710;-1:-1:-1;;;;;;44816:51:0;-1:-1:-1;;;44816:51:0;;-1:-1:-1;44809:58:0;;44520:801;-1:-1:-1;45305:4:0;45298:11;;87313:450;87366:7;87390:8;87386:49;;-1:-1:-1;87422:1:0;;87313:450;-1:-1:-1;87313:450:0:o;87386:49::-;87447:12;87545:10;87578:16;87617:15;87665:16;87680:1;87665:12;:16;:::i;:::-;87512:189;;;-1:-1:-1;;;;;41945:32:1;;;87512:189:0;;;41927:51:1;41994:18;;41987:34;;;;42037:18;;;42030:34;87655:27:0;42080:18:1;;;42073:34;41899:19;;87512:189:0;;;-1:-1:-1;;87512:189:0;;;;;;;;;87484:232;;87512:189;87484:232;;;;;-1:-1:-1;87745:10:0;87752:3;87484:232;87745:10;:::i;:::-;87738:17;87313:450;-1:-1:-1;;;87313:450:0:o;71484:550::-;71684:7;71793:4;71821:13;71857:5;71885:7;71915:5;71943:7;71973:19;71752:259;;;;;;;;;;;;;;:::i;24074:723::-;24130:13;24351:10;24347:53;;-1:-1:-1;;24378:10:0;;;;;;;;;;;;-1:-1:-1;;;24378:10:0;;;;;24074:723::o;24347:53::-;24425:5;24410:12;24466:78;24473:9;;24466:78;;24499:8;;;;:::i;:::-;;-1:-1:-1;24522:10:0;;-1:-1:-1;24530:2:0;24522:10;;:::i;:::-;;;24466:78;;;24554:19;24586:6;-1:-1:-1;;;;;24576:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24576:17:0;;24554:39;;24604:154;24611:10;;24604:154;;24638:11;24648:1;24638:11;;:::i;:::-;;-1:-1:-1;24707:10:0;24715:2;24707:5;:10;:::i;:::-;24694:24;;:2;:24;:::i;:::-;24681:39;;24664:6;24671;24664:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24664:56:0;;;;;;;;-1:-1:-1;24735:11:0;24744:2;24735:11;;:::i;:::-;;;24604:154;;49174:1340;49282:7;49291:12;49521:9;:16;49541:2;49521:22;49517:990;;;49817:4;49802:20;;49796:27;49867:4;49852:20;;49846:27;49925:4;49910:20;;49904:27;49560:9;49896:36;49968:25;49979:4;49896:36;49796:27;49846;49968:10;:25::i;:::-;49961:32;;;;;;;;;49517:990;50015:9;:16;50035:2;50015:22;50011:496;;;50290:4;50275:20;;50269:27;50341:4;50326:20;;50320:27;50383:23;50394:4;50269:27;50320;50383:10;:23::i;:::-;50376:30;;;;;;;;50011:496;-1:-1:-1;50455:1:0;;-1:-1:-1;50459:35:0;50439:56;;47445:643;47523:20;47514:5;:29;;;;;;;;:::i;:::-;;47510:571;;;47445:643;:::o;47510:571::-;47621:29;47612:5;:38;;;;;;;;:::i;:::-;;47608:473;;;47667:34;;-1:-1:-1;;;47667:34:0;;43709:2:1;47667:34:0;;;43691:21:1;43748:2;43728:18;;;43721:30;43787:26;43767:18;;;43760:54;43831:18;;47667:34:0;43507:348:1;47608:473:0;47732:35;47723:5;:44;;;;;;;;:::i;:::-;;47719:362;;;47784:41;;-1:-1:-1;;;47784:41:0;;44062:2:1;47784:41:0;;;44044:21:1;44101:2;44081:18;;;44074:30;44140:33;44120:18;;;44113:61;44191:18;;47784:41:0;43860:355:1;47719:362:0;47856:30;47847:5;:39;;;;;;;;:::i;:::-;;47843:238;;;47903:44;;-1:-1:-1;;;47903:44:0;;44422:2:1;47903:44:0;;;44404:21:1;44461:2;44441:18;;;44434:30;44500:34;44480:18;;;44473:62;-1:-1:-1;;;44551:18:1;;;44544:32;44593:19;;47903:44:0;44220:398:1;47843:238:0;47978:30;47969:5;:39;;;;;;;;:::i;:::-;;47965:116;;;48025:44;;-1:-1:-1;;;48025:44:0;;44825:2:1;48025:44:0;;;44807:21:1;44864:2;44844:18;;;44837:30;44903:34;44883:18;;;44876:62;-1:-1:-1;;;44954:18:1;;;44947:32;44996:19;;48025:44:0;44623:398:1;85503:1605:0;85625:18;85658:12;;85646:9;;:24;;;;:::i;:::-;85625:45;;85688:9;85683:1245;85707:6;85703:1;:10;85683:1245;;;85775:13;85791:19;85799:10;85791:7;:19::i;:::-;85775:35;;85825:20;85848:7;85856:5;85848:14;;;;;;;:::i;:::-;;;;-1:-1:-1;85879:15:0;85972:17;85968:264;;-1:-1:-1;86076:5:0;85968:264;;;-1:-1:-1;86204:12:0;85968:264;86310:26;86339:7;86347:14;86360:1;86347:10;:14;:::i;:::-;86339:23;;;;;;;:::i;:::-;;;;-1:-1:-1;86528:23:0;86524:306;;86646:14;86659:1;86646:10;:14;:::i;:::-;86629:7;86637:5;86629:14;;;;;;;:::i;:::-;;:31;86524:306;;;86796:18;86779:7;86787:5;86779:14;;;;;;;:::i;:::-;;:35;86524:306;86846:43;86856:5;86873:15;;86863:7;:25;;;;:::i;:::-;86846:9;:43::i;:::-;86904:12;;;;:::i;:::-;;;;85720:1208;;;;85715:3;;;;;:::i;:::-;;;;85683:1245;;;-1:-1:-1;86959:141:0;;;;;;;;-1:-1:-1;;;;;86985:16:0;;-1:-1:-1;86985:16:0;;;:9;:16;;;;;;:24;86959:141;;86985:42;;87020:6;;-1:-1:-1;;;;;86985:24:0;:42;:::i;:::-;-1:-1:-1;;;;;86959:141:0;;;;;-1:-1:-1;;;;;87042:16:0;;;;;;:9;86959:141;87042:16;;;;;;;:29;86959:141;;;87042:47;;87082:6;;-1:-1:-1;;;87042:29:0;;;:47;:::i;:::-;-1:-1:-1;;;;;86959:141:0;;;;;;-1:-1:-1;;;;;86940:16:0;;;;;;;:9;:16;;;;;;;;:160;;;;;;;;;-1:-1:-1;;;86940:160:0;;;;;;;;;-1:-1:-1;;85503:1605:0:o;40147:1131::-;40266:18;;;;40265:19;40257:64;;;;-1:-1:-1;;;40257:64:0;;45228:2:1;40257:64:0;;;45210:21:1;;;45247:18;;;45240:30;45306:34;45286:18;;;45279:62;45358:18;;40257:64:0;45026:356:1;40257:64:0;-1:-1:-1;;;;;40340:16:0;;40332:61;;;;-1:-1:-1;;;40332:61:0;;45589:2:1;40332:61:0;;;45571:21:1;;;45608:18;;;45601:30;45667:34;45647:18;;;45640:62;45719:18;;40332:61:0;45387:356:1;40332:61:0;40406:15;40442:8;40424:15;;:26;;;;:::i;:::-;40581:15;;40406:44;;-1:-1:-1;40550:164:0;40615:7;40611:1;:11;40550:164;;;40687:10;;;;:7;:10;;;;;:15;;-1:-1:-1;;;;;;40687:15:0;-1:-1:-1;;;;;40687:15:0;;;;;40637:23;27161:2;40687:10;40637:23;:::i;:::-;;;40550:164;;;-1:-1:-1;40801:15:0;;40784:283;40822:7;40818:1;:11;40784:283;;;40856:27;;40881:1;;-1:-1:-1;;;;;40856:27:0;;;40873:1;;-1:-1:-1;;;;;;;;;;;40856:27:0;40873:1;;40856:27;40924:45;40955:1;40959:2;40963:1;40924:45;;;;;;;;;;;;:22;:45::i;:::-;40898:157;;;;-1:-1:-1;;;40898:157:0;;;;;;;:::i;:::-;40831:3;;;;:::i;:::-;;;;40784:283;;;-1:-1:-1;41095:139:0;;;;;;;;-1:-1:-1;;;;;41121:13:0;;-1:-1:-1;41121:13:0;;;:9;:13;;;;;;:21;41095:139;;41121:41;;41153:8;;-1:-1:-1;;;;;41121:21:0;:41;:::i;:::-;-1:-1:-1;;;;;41095:139:0;;;;;-1:-1:-1;;;;;41177:13:0;;;;;;:9;41095:139;41177:13;;;;;;;:26;41095:139;;;41177:46;;41214:8;;-1:-1:-1;;;41177:26:0;;;:46;:::i;:::-;-1:-1:-1;;;;;41095:139:0;;;;;;-1:-1:-1;;;;;41079:13:0;;;;;;;:9;:13;;;;;;;;:155;;;;;;;;;-1:-1:-1;;;41079:155:0;;;;;;;;;-1:-1:-1;41245:15:0;:25;40147:1131::o;52896:1669::-;53027:7;;53988:66;53962:92;;53944:200;;;-1:-1:-1;54097:1:0;;-1:-1:-1;54101:30:0;54081:51;;53944:200;54158:1;:7;;54163:2;54158:7;;:18;;;;;54169:1;:7;;54174:2;54169:7;;54158:18;54154:102;;;-1:-1:-1;54209:1:0;;-1:-1:-1;54213:30:0;54193:51;;54154:102;54370:24;;;54353:14;54370:24;;;;;;;;;45975:25:1;;;46048:4;46036:17;;46016:18;;;46009:45;;;;46070:18;;;46063:34;;;46113:18;;;46106:34;;;54370:24:0;;45947:19:1;;54370:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54370:24:0;;-1:-1:-1;;54370:24:0;;;-1:-1:-1;;;;;;;54409:20:0;;54405:103;;54462:1;54466:29;54446:50;;;;;;;54405:103;54528:6;-1:-1:-1;54536:20:0;;-1:-1:-1;52896:1669:0;;;;;;;;:::o;51842:440::-;51956:7;;-1:-1:-1;;;;;52057:124:0;;52208:3;52204:12;;;52218:2;52200:21;52249:25;52260:4;52200:21;52269:1;52057:124;52249:10;:25::i;:::-;52242:32;;;;;;51842:440;;;;;;:::o;37944:110::-;38020:26;38030:2;38034:7;38020:26;;;;;;;;;;;;38559:18;38565:2;38569:7;38559:5;:18::i;:::-;38610:54;38641:1;38645:2;38649:7;38658:5;38610:22;:54::i;:::-;38588:154;;;;-1:-1:-1;;;38588:154:0;;;;;;;:::i;39275:426::-;39355:18;;;;39347:62;;;;-1:-1:-1;;;39347:62:0;;46353:2:1;39347:62:0;;;46335:21:1;46392:2;46372:18;;;46365:30;46431:33;46411:18;;;46404:61;46482:18;;39347:62:0;46151:355:1;39347:62:0;-1:-1:-1;;;;;39428:16:0;;39420:61;;;;-1:-1:-1;;;39420:61:0;;45589:2:1;39420:61:0;;;45571:21:1;;;45608:18;;;45601:30;45667:34;45647:18;;;45640:62;45719:18;;39420:61:0;45387:356:1;39420:61:0;39501:16;39509:7;39501;:16::i;:::-;39500:17;39492:58;;;;-1:-1:-1;;;39492:58:0;;46713:2:1;39492:58:0;;;46695:21:1;46752:2;46732:18;;;46725:30;46791;46771:18;;;46764:58;46839:18;;39492:58:0;46511:352:1;39492:58:0;39621:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39621:21:0;-1:-1:-1;;;;;39621:21:0;;;;;;;;39660:33;;39621:16;;;-1:-1:-1;;;;;;;;;;;39660:33:0;39621:16;;39660:33;39275:426;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:252;2560:2;2554:9;;;2590:15;;-1:-1:-1;;;;;2620:34:1;;2656:22;;;2617:62;2614:88;;;2682:18;;:::i;:::-;2718:2;2711:22;2487:252;:::o;2744:246::-;2811:2;2805:9;2853:2;2841:15;;-1:-1:-1;;;;;2871:34:1;;2907:22;;;2868:62;2865:88;;;2933:18;;:::i;2995:659::-;3056:5;3109:3;3102:4;3094:6;3090:17;3086:27;3076:55;;3127:1;3124;3117:12;3076:55;3160:2;3154:9;3202:3;3194:6;3190:16;3272:6;3260:10;3257:22;-1:-1:-1;;;;;3224:10:1;3221:34;3218:62;3215:88;;;3283:18;;:::i;:::-;3319:2;3312:22;3354:6;3395:3;3383:16;;3411:15;;;3408:35;;;3439:1;3436;3429:12;3408:35;3463:6;3478:146;3494:6;3489:3;3486:15;3478:146;;;3562:17;;3550:30;;3609:4;3600:14;;;;3511;3478:146;;;-1:-1:-1;3642:6:1;;2995:659;-1:-1:-1;;;;;2995:659:1:o;3659:440::-;3768:6;3776;3784;3792;3845:3;3833:9;3824:7;3820:23;3816:33;3813:53;;;3862:1;3859;3852:12;3813:53;3898:9;3885:23;3875:33;;3955:2;3944:9;3940:18;3927:32;3917:42;;4006:2;3995:9;3991:18;3978:32;3968:42;;4029:64;4085:7;4080:2;4069:9;4065:18;4029:64;:::i;:::-;4019:74;;3659:440;;;;;;;:::o;4104:1102::-;4218:6;4226;4279:3;4267:9;4258:7;4254:23;4250:33;4247:53;;;4296:1;4293;4286:12;4247:53;4345:7;4338:4;4327:9;4323:20;4319:34;4309:62;;4367:1;4364;4357:12;4309:62;4391:23;;:::i;:::-;4436:3;4477:2;4466:9;4462:18;4503:7;4495:6;4492:19;4489:39;;;4524:1;4521;4514:12;4489:39;4548:9;4566:152;4582:6;4577:3;4574:15;4566:152;;;4650:23;4669:3;4650:23;:::i;:::-;4638:36;;4703:4;4694:14;;;;4599;4566:152;;;4570:3;4737:5;4727:15;;4785:7;4780:2;4769:9;4765:18;4761:32;4751:60;;4807:1;4804;4797:12;4751:60;4833:23;;:::i;:::-;4820:36;;4878:5;4865:18;;4923:3;4912:9;4908:19;4952:7;4942:8;4939:21;4936:41;;;4973:1;4970;4963:12;4936:41;5014:162;5032:8;5025:5;5022:19;5014:162;;;5108:19;;5094:34;;5161:4;5150:16;;;;5053;;;;5014:162;;;-1:-1:-1;4104:1102:1;;5195:5;;-1:-1:-1;4104:1102:1;-1:-1:-1;;;;4104:1102:1:o;5211:631::-;5275:5;-1:-1:-1;;;;;5346:2:1;5338:6;5335:14;5332:40;;;5352:18;;:::i;:::-;5427:2;5421:9;5395:2;5481:15;;-1:-1:-1;;5477:24:1;;;5503:2;5473:33;5469:42;5457:55;;;5527:18;;;5547:22;;;5524:46;5521:72;;;5573:18;;:::i;:::-;5613:10;5609:2;5602:22;5642:6;5633:15;;5672:6;5664;5657:22;5712:3;5703:6;5698:3;5694:16;5691:25;5688:45;;;5729:1;5726;5719:12;5688:45;5779:6;5774:3;5767:4;5759:6;5755:17;5742:44;5834:1;5827:4;5818:6;5810;5806:19;5802:30;5795:41;;;;5211:631;;;;;:::o;5847:220::-;5889:5;5942:3;5935:4;5927:6;5923:17;5919:27;5909:55;;5960:1;5957;5950:12;5909:55;5982:79;6057:3;6048:6;6035:20;6028:4;6020:6;6016:17;5982:79;:::i;6072:724::-;6208:6;6216;6224;6232;6240;6248;6301:3;6289:9;6280:7;6276:23;6272:33;6269:53;;;6318:1;6315;6308:12;6269:53;6341:29;6360:9;6341:29;:::i;:::-;6331:39;;6417:2;6406:9;6402:18;6389:32;6379:42;;6468:2;6457:9;6453:18;6440:32;6430:42;;6519:2;6508:9;6504:18;6491:32;6481:42;;6542:65;6599:7;6593:3;6582:9;6578:19;6542:65;:::i;:::-;6532:75;;6658:3;6647:9;6643:19;6630:33;-1:-1:-1;;;;;6678:6:1;6675:30;6672:50;;;6718:1;6715;6708:12;6672:50;6741:49;6782:7;6773:6;6762:9;6758:22;6741:49;:::i;:::-;6731:59;;;6072:724;;;;;;;;:::o;6801:649::-;6928:6;6936;6944;6952;6960;7013:3;7001:9;6992:7;6988:23;6984:33;6981:53;;;7030:1;7027;7020:12;6981:53;7066:9;7053:23;7043:33;;7123:2;7112:9;7108:18;7095:32;7085:42;;7174:2;7163:9;7159:18;7146:32;7136:42;;7197:64;7253:7;7248:2;7237:9;7233:18;7197:64;:::i;:::-;7187:74;;7312:3;7301:9;7297:19;7284:33;-1:-1:-1;;;;;7332:6:1;7329:30;7326:50;;;7372:1;7369;7362:12;7326:50;7395:49;7436:7;7427:6;7416:9;7412:22;7395:49;:::i;:::-;7385:59;;;6801:649;;;;;;;;:::o;7455:186::-;7514:6;7567:2;7555:9;7546:7;7542:23;7538:32;7535:52;;;7583:1;7580;7573:12;7535:52;7606:29;7625:9;7606:29;:::i;7646:328::-;7723:6;7731;7739;7792:2;7780:9;7771:7;7767:23;7763:32;7760:52;;;7808:1;7805;7798:12;7760:52;7831:29;7850:9;7831:29;:::i;:::-;7821:39;;7879:38;7913:2;7902:9;7898:18;7879:38;:::i;:::-;7869:48;;7964:2;7953:9;7949:18;7936:32;7926:42;;7646:328;;;;;:::o;7979:160::-;8044:20;;8100:13;;8093:21;8083:32;;8073:60;;8129:1;8126;8119:12;8144:485;8194:5;8247:3;8240:4;8232:6;8228:17;8224:27;8214:55;;8265:1;8262;8255:12;8214:55;8289:17;;:::i;:::-;8328:3;8366:2;8358:6;8354:15;8392:3;8384:6;8381:15;8378:35;;;8409:1;8406;8399:12;8378:35;8433:6;8448:152;8464:6;8459:3;8456:15;8448:152;;;8532:23;8551:3;8532:23;:::i;:::-;8520:36;;8585:4;8576:14;;;;8481;8448:152;;;-1:-1:-1;8618:5:1;;8144:485;-1:-1:-1;;;;;8144:485:1:o;8634:648::-;8684:5;8737:3;8730:4;8722:6;8718:17;8714:27;8704:55;;8755:1;8752;8745:12;8704:55;8788:2;8782:9;8830:3;8822:6;8818:16;8900:6;8888:10;8885:22;-1:-1:-1;;;;;8852:10:1;8849:34;8846:62;8843:88;;;8911:18;;:::i;:::-;8947:2;8940:22;8982:6;9023:3;9011:16;;9039:15;;;9036:35;;;9067:1;9064;9057:12;9287:942;9336:5;9366:4;9410:3;9405:2;9397:6;9393:15;9389:25;9379:53;;9428:1;9425;9418:12;9379:53;9452:17;;:::i;:::-;9491:3;9529:2;9521:6;9517:15;9555:3;9547:6;9544:15;9541:35;;;9572:1;9569;9562:12;9541:35;9596:6;9611:589;9627:6;9622:3;9619:15;9611:589;;;9715:3;9702:17;-1:-1:-1;;;;;9738:11:1;9735:35;9732:125;;;9811:1;9840:2;9836;9829:14;9732:125;9880:24;;9931:11;;;9927:21;-1:-1:-1;9917:119:1;;9990:1;10019:2;10015;10008:14;9917:119;10059:4;10088:69;10153:3;10148:2;10135:16;10130:2;10126;10122:11;10088:69;:::i;:::-;10076:82;;10178:12;;;;-1:-1:-1;9653:4:1;9644:14;9611:589;;;-1:-1:-1;10218:5:1;;9287:942;-1:-1:-1;;;;;;9287:942:1:o;10234:1051::-;10419:6;10427;10435;10443;10496:3;10484:9;10475:7;10471:23;10467:33;10464:53;;;10513:1;10510;10503:12;10464:53;10562:7;10555:4;10544:9;10540:20;10536:34;10526:62;;10584:1;10581;10574:12;10526:62;10608:23;;:::i;:::-;10653:3;10694:2;10683:9;10679:18;10720:7;10712:6;10709:19;10706:39;;;10741:1;10738;10731:12;10706:39;10765:9;10783:149;10799:6;10794:3;10791:15;10783:149;;;10867:20;10883:3;10867:20;:::i;:::-;10855:33;;10917:4;10908:14;;;;10816;10783:149;;;10787:3;10951:5;10941:15;;10975:41;11008:7;11000:6;10975:41;:::i;:::-;10965:51;;;;;11035:54;11081:7;11075:3;11064:9;11060:19;11035:54;:::i;:::-;11025:64;;11140:3;11129:9;11125:19;11112:33;-1:-1:-1;;;;;11160:6:1;11157:30;11154:50;;;11200:1;11197;11190:12;11154:50;11223:56;11271:7;11262:6;11251:9;11247:22;11223:56;:::i;:::-;11213:66;;;10234:1051;;;;;;;:::o;11290:248::-;11358:6;11366;11419:2;11407:9;11398:7;11394:23;11390:32;11387:52;;;11435:1;11432;11425:12;11387:52;-1:-1:-1;;11458:23:1;;;11528:2;11513:18;;;11500:32;;-1:-1:-1;11290:248:1:o;11822:236::-;11904:6;11957:3;11945:9;11936:7;11932:23;11928:33;11925:53;;;11974:1;11971;11964:12;11925:53;11997:55;12044:7;12033:9;11997:55;:::i;12063:372::-;12163:6;12171;12179;12232:3;12220:9;12211:7;12207:23;12203:33;12200:53;;;12249:1;12246;12239:12;12200:53;12285:9;12272:23;12262:33;;12342:2;12331:9;12327:18;12314:32;12304:42;;12365:64;12421:7;12416:2;12405:9;12401:18;12365:64;:::i;:::-;12355:74;;12063:372;;;;;:::o;12622:460::-;12717:6;12725;12733;12741;12749;12802:3;12790:9;12781:7;12777:23;12773:33;12770:53;;;12819:1;12816;12809:12;12770:53;12842:29;12861:9;12842:29;:::i;:::-;12832:39;12918:2;12903:18;;12890:32;;-1:-1:-1;12969:2:1;12954:18;;12941:32;;13020:2;13005:18;;12992:32;;-1:-1:-1;13071:3:1;13056:19;13043:33;;-1:-1:-1;12622:460:1;-1:-1:-1;;;12622:460:1:o;13087:254::-;13152:6;13160;13213:2;13201:9;13192:7;13188:23;13184:32;13181:52;;;13229:1;13226;13219:12;13181:52;13252:29;13271:9;13252:29;:::i;:::-;13242:39;;13300:35;13331:2;13320:9;13316:18;13300:35;:::i;:::-;13290:45;;13087:254;;;;;:::o;13346:537::-;13441:6;13449;13457;13465;13518:3;13506:9;13497:7;13493:23;13489:33;13486:53;;;13535:1;13532;13525:12;13486:53;13558:29;13577:9;13558:29;:::i;:::-;13548:39;;13606:38;13640:2;13629:9;13625:18;13606:38;:::i;:::-;13596:48;;13691:2;13680:9;13676:18;13663:32;13653:42;;13746:2;13735:9;13731:18;13718:32;-1:-1:-1;;;;;13765:6:1;13762:30;13759:50;;;13805:1;13802;13795:12;13759:50;13828:49;13869:7;13860:6;13849:9;13845:22;13828:49;:::i;13888:666::-;13965:6;13973;13981;14034:2;14022:9;14013:7;14009:23;14005:32;14002:52;;;14050:1;14047;14040:12;14002:52;14090:9;14077:23;-1:-1:-1;;;;;14160:2:1;14152:6;14149:14;14146:34;;;14176:1;14173;14166:12;14146:34;14214:6;14203:9;14199:22;14189:32;;14259:7;14252:4;14248:2;14244:13;14240:27;14230:55;;14281:1;14278;14271:12;14230:55;14321:2;14308:16;14347:2;14339:6;14336:14;14333:34;;;14363:1;14360;14353:12;14333:34;14410:7;14403:4;14394:6;14390:2;14386:15;14382:26;14379:39;14376:59;;;14431:1;14428;14421:12;14376:59;14462:4;14454:13;;;;-1:-1:-1;14486:6:1;-1:-1:-1;14511:37:1;;14527:20;;;-1:-1:-1;14511:37:1;:::i;14559:260::-;14627:6;14635;14688:2;14676:9;14667:7;14663:23;14659:32;14656:52;;;14704:1;14701;14694:12;14656:52;14727:29;14746:9;14727:29;:::i;:::-;14717:39;;14775:38;14809:2;14798:9;14794:18;14775:38;:::i;14824:738::-;14946:6;14954;14962;14970;14978;14986;14994;15047:3;15035:9;15026:7;15022:23;15018:33;15015:53;;;15064:1;15061;15054:12;15015:53;15087:29;15106:9;15087:29;:::i;:::-;15077:39;;15163:2;15152:9;15148:18;15135:32;15125:42;;15214:2;15203:9;15199:18;15186:32;15176:42;;15265:2;15254:9;15250:18;15237:32;15227:42;;15316:3;15305:9;15301:19;15288:33;15278:43;;15368:3;15357:9;15353:19;15340:33;15330:43;;15424:3;15413:9;15409:19;15396:33;-1:-1:-1;;;;;15444:6:1;15441:30;15438:50;;;15484:1;15481;15474:12;15438:50;15507:49;15548:7;15539:6;15528:9;15524:22;15507:49;:::i;:::-;15497:59;;;14824:738;;;;;;;;;;:::o;15567:380::-;15646:1;15642:12;;;;15689;;;15710:61;;15764:4;15756:6;15752:17;15742:27;;15710:61;15817:2;15809:6;15806:14;15786:18;15783:38;15780:161;;;15863:10;15858:3;15854:20;15851:1;15844:31;15898:4;15895:1;15888:15;15926:4;15923:1;15916:15;15780:161;;15567:380;;;:::o;17192:356::-;17394:2;17376:21;;;17413:18;;;17406:30;17472:34;17467:2;17452:18;;17445:62;17539:2;17524:18;;17192:356::o;17553:127::-;17614:10;17609:3;17605:20;17602:1;17595:31;17645:4;17642:1;17635:15;17669:4;17666:1;17659:15;18843:1278;-1:-1:-1;;;;;19207:15:1;;;19189:34;;19139:2;19242;19260:18;;;19253:30;;;19332:13;;19124:18;;;19354:22;;;19091:4;;19434:15;;;;19161:19;;19242:2;19407:3;19392:19;;;19091:4;19477:178;19491:6;19488:1;19485:13;19477:178;;;19556:13;;19552:22;;19540:35;;19630:15;;;;19595:12;;;;19513:1;19506:9;19477:178;;;-1:-1:-1;;19691:19:1;;;19686:2;19671:18;;19664:47;19761:13;;19783:21;;;19822:12;;;;-1:-1:-1;19761:13:1;-1:-1:-1;19859:15:1;;;19894:1;19904:189;19920:8;19915:3;19912:17;19904:189;;;19989:15;;19975:30;;20027:14;;;;20066:17;;;;19948:1;19939:11;19904:189;;;-1:-1:-1;20110:5:1;;18843:1278;-1:-1:-1;;;;;;;;18843:1278:1:o;20126:127::-;20187:10;20182:3;20178:20;20175:1;20168:31;20218:4;20215:1;20208:15;20242:4;20239:1;20232:15;20258:125;20298:4;20326:1;20323;20320:8;20317:34;;;20331:18;;:::i;:::-;-1:-1:-1;20368:9:1;;20258:125::o;20388:128::-;20428:3;20459:1;20455:6;20452:1;20449:13;20446:39;;;20465:18;;:::i;:::-;-1:-1:-1;20501:9:1;;20388:128::o;21223:346::-;21425:2;21407:21;;;21464:2;21444:18;;;21437:30;-1:-1:-1;;;21498:2:1;21483:18;;21476:52;21560:2;21545:18;;21223:346::o;21918:168::-;21958:7;22024:1;22020;22016:6;22012:14;22009:1;22006:21;22001:1;21994:9;21987:17;21983:45;21980:71;;;22031:18;;:::i;:::-;-1:-1:-1;22071:9:1;;21918:168::o;23118:413::-;23320:2;23302:21;;;23359:2;23339:18;;;23332:30;23398:34;23393:2;23378:18;;23371:62;-1:-1:-1;;;23464:2:1;23449:18;;23442:47;23521:3;23506:19;;23118:413::o;23536:127::-;23597:10;23592:3;23588:20;23585:1;23578:31;23628:4;23625:1;23618:15;23652:4;23649:1;23642:15;23668:120;23708:1;23734;23724:35;;23739:18;;:::i;:::-;-1:-1:-1;23773:9:1;;23668:120::o;24616:136::-;24655:3;24683:5;24673:39;;24692:18;;:::i;:::-;-1:-1:-1;;;24728:18:1;;24616:136::o;25522:414::-;25724:2;25706:21;;;25763:2;25743:18;;;25736:30;25802:34;25797:2;25782:18;;25775:62;-1:-1:-1;;;25868:2:1;25853:18;;25846:48;25926:3;25911:19;;25522:414::o;26344:473::-;26525:2;26514:9;26507:21;26564:6;26559:2;26548:9;26544:18;26537:34;26621:6;26613;26608:2;26597:9;26593:18;26580:48;26677:1;26672:2;26648:22;;;26644:31;;26637:42;;;;26795:14;;26788:22;26781:4;26766:20;;26759:52;26740:2;26719:15;;;-1:-1:-1;;26715:29:1;26700:45;;;26696:54;;;-1:-1:-1;26344:473:1:o;27177:693::-;27227:3;27268:5;27262:12;27297:36;27323:9;27297:36;:::i;:::-;27352:1;27369:18;;;27396:104;;;;27514:1;27509:355;;;;27362:502;;27396:104;-1:-1:-1;;27429:24:1;;27417:37;;27474:16;;;;-1:-1:-1;27396:104:1;;27509:355;27540:5;27537:1;27530:16;27569:4;27614:2;27611:1;27601:16;27639:1;27653:165;27667:6;27664:1;27661:13;27653:165;;;27745:14;;27732:11;;;27725:35;27788:16;;;;27682:10;;27653:165;;;27657:3;;;27847:6;27842:3;27838:16;27831:23;;27362:502;;;;;27177:693;;;;:::o;27875:356::-;28051:3;28089:6;28083:13;28105:53;28151:6;28146:3;28139:4;28131:6;28127:17;28105:53;:::i;:::-;28174:51;28217:6;28212:3;28208:16;28200:6;28174:51;:::i;28596:112::-;28628:1;28654;28644:35;;28659:18;;:::i;:::-;-1:-1:-1;28693:9:1;;28596:112::o;28713:682::-;29038:3;29076:6;29070:13;29092:53;29138:6;29133:3;29126:4;29118:6;29114:17;29092:53;:::i;:::-;29164:51;29207:6;29202:3;29198:16;29190:6;29164:51;:::i;:::-;29154:61;;-1:-1:-1;;;29231:2:1;29224:15;29270:6;29264:13;29286:62;29339:8;29335:1;29331:2;29327:10;29320:4;29312:6;29308:17;29286:62;:::i;:::-;29368:17;29387:1;29364:25;;28713:682;-1:-1:-1;;;;;28713:682:1:o;29400:1350::-;29642:4;29690:2;29679:9;29675:18;29729:1;29725;29720:3;29716:11;29712:19;29770:2;29762:6;29758:15;29747:9;29740:34;29793:2;29831;29826;29815:9;29811:18;29804:30;29854:6;29889;29883:13;29920:6;29912;29905:22;29958:3;29947:9;29943:19;29936:26;;29981:1;29971:11;;30002:6;29998:2;29991:18;30046:2;30042;30032:17;30067:2;30078:177;30092:6;30089:1;30086:13;30078:177;;;30157:13;;30153:22;;30141:35;;30196:12;;;;30243:1;30231:14;;;;30107:9;30078:177;;;-1:-1:-1;;;30291:19:1;;;30286:2;30271:18;;30264:47;30361:13;;30383:21;;;30443:18;;;30486:17;;;30422:12;;;;-1:-1:-1;30534:188:1;30550:8;30545:3;30542:17;30534:188;;;30619:15;;30605:30;;30710:1;30569:11;;;;30657:14;;;;30696:16;;;;30534:188;;;-1:-1:-1;30739:5:1;;29400:1350;-1:-1:-1;;;;;;;;29400:1350:1:o;36163:246::-;36203:4;-1:-1:-1;;;;;36316:10:1;;;;36286;;36338:12;;;36335:38;;;36353:18;;:::i;:::-;36390:13;;36163:246;-1:-1:-1;;;36163:246:1:o;36414:253::-;36454:3;-1:-1:-1;;;;;36543:2:1;36540:1;36536:10;36573:2;36570:1;36566:10;36604:3;36600:2;36596:12;36591:3;36588:21;36585:47;;;36612:18;;:::i;:::-;36648:13;;36414:253;-1:-1:-1;;;;36414:253:1:o;37375:1016::-;37543:2;37532:9;37525:21;37506:4;37566:1;37599:6;37593:13;37629:36;37655:9;37629:36;:::i;:::-;37701:6;37696:2;37685:9;37681:18;37674:34;37727:2;37748:1;37780:2;37769:9;37765:18;37797:1;37792:122;;;;37928:1;37923:381;;;;37758:546;;37792:122;-1:-1:-1;;37840:24:1;;37820:18;;;37813:52;37900:3;37885:19;;;-1:-1:-1;37792:122:1;;37923:381;37954:6;37951:1;37944:17;37984:4;38029:2;38026:1;38016:16;38054:1;38068:180;38082:6;38079:1;38076:13;38068:180;;;38175:14;;38151:17;;;38147:26;;38140:50;38218:16;;;;38097:10;;38068:180;;;38272:17;;38268:26;;;-1:-1:-1;;;37758:546:1;;;;;;38321:3;38313:11;;;38376:6;38369:14;38362:22;38355:4;38344:9;38340:20;38333:52;37375:1016;;;;;:::o;38799:326::-;38892:5;38915:1;38925:194;38939:4;38936:1;38933:11;38925:194;;;38998:13;;38986:26;;39035:4;39059:12;;;;39094:15;;;;38959:1;38952:9;38925:194;;39130:655;-1:-1:-1;;;;;39519:15:1;;;39501:34;;39566:2;39551:18;;39544:34;;;39614:15;;39609:2;39594:18;;39587:43;39661:2;39646:18;;39639:34;;;39450:3;39435:19;;39682:53;39730:3;39715:19;;39707:6;39682:53;:::i;:::-;39772:6;39766:3;39755:9;39751:19;39744:35;39130:655;;;;;;;;;:::o;40948:489::-;-1:-1:-1;;;;;41217:15:1;;;41199:34;;41269:15;;41264:2;41249:18;;41242:43;41316:2;41301:18;;41294:34;;;41364:3;41359:2;41344:18;;41337:31;;;41142:4;;41385:46;;41411:19;;41403:6;41385:46;:::i;41442:249::-;41511:6;41564:2;41552:9;41543:7;41539:23;41535:32;41532:52;;;41580:1;41577;41570:12;41532:52;41612:9;41606:16;41631:30;41655:5;41631:30;:::i;42118:727::-;-1:-1:-1;;;;;42535:15:1;;;42517:34;;42582:2;42567:18;;42560:34;;;42630:15;;42625:2;42610:18;;42603:43;42677:2;42662:18;;42655:34;;;42720:3;42705:19;;42698:35;;;42497:3;42749:19;;42742:35;;;42466:3;42451:19;;42786:53;42834:3;42819:19;;42811:6;42786:53;:::i;:::-;42118:727;;;;;;;;;;:::o;42850:135::-;42889:3;-1:-1:-1;;42910:17:1;;42907:43;;;42930:18;;:::i;:::-;-1:-1:-1;42977:1:1;42966:13;;42850:135::o;43375:127::-;43436:10;43431:3;43427:20;43424:1;43417:31;43467:4;43464:1;43457:15;43491:4;43488:1;43481:15
Swarm Source
ipfs://2a50520d7272e540d0c26989d4cd77b187f035dbb84e3e2a59ede1c8b0ef4fc8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.