Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
Main
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-11-10 */ // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/main.sol //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.16; //import "hardhat/console.sol"; contract Main is Ownable, IERC721Receiver { using SafeERC20 for IERC20; using SafeERC20 for IERC721; uint rnd_index; enum STATUS {ACTIVE, FINISHED, CANCELLED, EXPIRED} struct Raffle { uint id; STATUS status; uint max_per_user; // max raffle by user uint total; // raffle size address nft; uint nft_id; address winner; address[] users; uint users_length; address seller; uint price; uint amount; uint endtime; } address FEE_RECIPIENT1; constructor() { FEE_RECIPIENT1 = msg.sender; } struct NFT { STATUS status; uint fee; uint royalties; address royalties_recipient; uint listing_fee; address listing_fee_recipient; string name; string twitter; string tg; uint category; } mapping(address => NFT) public properties; address[] public all_contracts; uint public cancelFee = 10 ether; Raffle[] public raffles; mapping(address => uint[]) rafflesByUser; event Create_Raffle(uint _max_per_user, address _nft, uint _nft_id, uint _price, uint _total, uint index, uint endtime); event Buy(uint amount, uint raffle_id, uint value, uint users, uint total, uint ticket); event Refund(address user, uint value, uint paid, uint total); event Trigger(uint raffle_id, uint amount, uint fee, uint royalties, address winner, uint number); event Revert(uint raffle_id); event collectFee(address user, uint listing_fee, uint fee, uint caller_fee, uint collectFee); function add_nft(address nft, uint fee, address royalties_recipient, uint royalties, uint listing_fee, address listing_fee_recipient, STATUS status, string memory name, string memory twitter, string memory tg, uint category) external onlyOwner { require(properties[nft].fee == 0, "already exists"); all_contracts.push(nft); _nft(nft, fee, royalties_recipient, royalties, listing_fee, listing_fee_recipient, status, name, twitter, tg, category); } function edit_nft(address nft, uint fee, address royalties_recipient, uint royalties, uint listing_fee, address listing_fee_recipient, STATUS status, string memory name, string memory twitter, string memory tg, uint category) external onlyOwner { _nft(nft, fee, royalties_recipient, royalties, listing_fee, listing_fee_recipient, status, name, twitter, tg, category); } function _nft(address nft, uint fee, address royalties_recipient, uint royalties, uint listing_fee, address listing_fee_recipient, STATUS status, string memory name, string memory twitter, string memory tg, uint category) internal { properties[nft].fee = fee; properties[nft].status = status; properties[nft].royalties_recipient = royalties_recipient; properties[nft].royalties = royalties; properties[nft].listing_fee = listing_fee; properties[nft].listing_fee_recipient = listing_fee_recipient; properties[nft].name = name; properties[nft].twitter = twitter; properties[nft].tg = tg; properties[nft].category = category; collect_fee_from_expired(); // process expired } function setFeeRecipient(address treasure) public onlyOwner { FEE_RECIPIENT1 = treasure; } function moreRand() public view returns (uint, bytes32) { uint _previousBlockNumber; bytes32 _previousBlockHash; _previousBlockNumber = uint(block.number - 1); _previousBlockHash = bytes32(blockhash(_previousBlockNumber)); return (_previousBlockNumber, _previousBlockHash); } function getAllNnft() public view returns (address[] memory){ return all_contracts; } function getUsersByRaffleId(uint id) public view returns (address[] memory){ return raffles[id].users; } function getActiveRaffles() public view returns (Raffle[] memory){ return getRafflesByStatus(STATUS.ACTIVE); } function getFinishedRaffles() public view returns (Raffle[] memory){ return getRafflesByStatus(STATUS.FINISHED); } function getCancelledRaffles() public view returns (Raffle[] memory){ return getRafflesByStatus(STATUS.CANCELLED); } function getRafflesByStatus(STATUS s) public view returns (Raffle[] memory){ uint total; for (uint i = 0; i < raffles.length; i++) { if (raffles[i].status != s) continue; total++; } Raffle[] memory r = new Raffle[](total); uint j; for (uint i = 0; i < raffles.length; i++) { if (raffles[i].status != s) continue; r[j++] = raffles[i]; } return r; } function getRafflesByNftAndStatus(address nft, STATUS s) public view returns (Raffle[] memory){ uint total; for (uint i = 0; i < raffles.length; i++) { if( raffles[i].nft != nft ) continue; if (raffles[i].status != s) continue; total++; } Raffle[] memory r = new Raffle[](total); uint j; for (uint i = 0; i < raffles.length; i++) { if( raffles[i].nft != nft ) continue; if (raffles[i].status != s) continue; r[j++] = raffles[i]; } return r; } function getRafflesByCategory(uint category, STATUS s) public view returns (Raffle[] memory){ uint total; for (uint i = 0; i < raffles.length; i++) { address nft = raffles[i].nft; if( properties[nft].category != category ) continue; if (raffles[i].status != s) continue; total++; } Raffle[] memory r = new Raffle[](total); uint j; for (uint i = 0; i < raffles.length; i++) { address nft = raffles[i].nft; if( properties[nft].category != category ) continue; if (raffles[i].status != s) continue; r[j++] = raffles[i]; } return r; } function create_raffle(uint _max_per_user, address _nft, uint _nft_id, uint _price, uint _total, uint _endtime) public payable { require(_max_per_user > 0, "E1"); require(_price > 10000, "E2"); require(_total > 2, "E3"); require(_nft != address(0), "E4"); require(properties[_nft].status != STATUS.ACTIVE, "E5"); require(properties[_nft].listing_fee == 0 || properties[_nft].listing_fee == msg.value, "E6"); require(_endtime >= 1 hours && _endtime <= 90 days, "E7"); address[] memory _users = new address[](0); Raffle memory raffle = Raffle({ id : raffles.length, status : STATUS.ACTIVE, max_per_user : _max_per_user, total : _total, nft : _nft, nft_id : _nft_id, winner : address(0), users : _users, users_length : 0, seller : msg.sender, price : _price, amount : 0, endtime : block.timestamp + _endtime}); raffles.push(raffle); rafflesByUser[msg.sender].push( raffle.id ); IERC721 token = IERC721(raffle.nft); require( token.ownerOf(raffle.nft_id) == msg.sender, "NFT is not owned by caller" ); token.safeTransferFrom(msg.sender, address(this), raffle.nft_id); emit Create_Raffle(_max_per_user, _nft, _nft_id, _price, _total, raffles.length - 1, _endtime); collect_fee_from_expired(); // process expired } function buy(uint amount, uint raffle_id) payable public { Raffle storage raffle = raffles[raffle_id]; require(raffle.status == STATUS.ACTIVE, "!ACTIVE"); require(msg.value >= raffle.price * amount, "Price incorrect"); uint paid = 0; for (uint i = 0; i < amount; i ++) { raffle.users.push(msg.sender); raffle.users_length ++; paid += raffle.price; emit Buy(amount, raffle_id, msg.value, raffle.users.length, raffle.total, i); //console.log('users=%s total=%s', raffle.users.length, raffle.total); if (raffle.users.length >= raffle.total) { _trigger(raffle_id); break; } } raffle.amount += paid; if (msg.value - paid > 0) { // refund user (bool success, bytes memory data) = msg.sender.call{value : msg.value - paid}(""); require(success, "error refunding user."); emit Refund(msg.sender, msg.value, paid, msg.value - paid); } collect_fee_from_expired(); // process expired } function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } function _trigger(uint raffle_id) internal { //console.log('trigger!'); Raffle storage raffle = raffles[raffle_id]; (uint _previousBlockNumber, bytes32 _previousBlockHash) = moreRand(); uint total = raffle.users.length; uint256 _mod = total - 1; uint256 _randomNumber; bytes32 _structHash = keccak256(abi.encode(msg.sender, block.difficulty, gasleft(), block.timestamp, _previousBlockNumber, _previousBlockHash, ++rnd_index)); _randomNumber = uint256(_structHash); assembly {_randomNumber := mod(_randomNumber, _mod)} raffle.winner = raffle.users[_randomNumber]; raffle.status = STATUS.FINISHED; //console.log('raffle.winner=%s _randomNumber=%s', raffle.winner, _randomNumber); IERC721(raffle.nft).safeTransferFrom(address(this), raffle.winner, raffle.nft_id); payments(raffle_id, _randomNumber); collect_fee(raffle_id); } function payments(uint raffle_id, uint _randomNumber) internal { Raffle storage raffle = raffles[raffle_id]; uint total = raffle.amount; uint amount = 0; uint fee = 0; uint royalties = 0; if (properties[raffle.nft].fee > 0) { fee = (total * properties[raffle.nft].fee) / 100; amount = total - fee; if (properties[raffle.nft].royalties > 0) { royalties = (fee * properties[raffle.nft].royalties) / 100; fee -= royalties; (bool success, bytes memory data) = properties[raffle.nft].royalties_recipient.call{value : royalties}(""); require(success, "error paying royalties"); } (bool success, bytes memory data) = FEE_RECIPIENT1.call{value : fee}(""); require(success, "error paying fee"); } (bool success, bytes memory data) = raffle.seller.call{value : amount}(""); require(success, "error paying seller"); emit Trigger(raffle_id, amount, fee, royalties, raffle.winner, _randomNumber); } // owner can cancel the raffle any time and refund everyone function setCancelFee(uint newFee) public onlyOwner { cancelFee = newFee; } function cancel(uint raffle_id) public payable { if( cancelFee > 0 ){ (bool success1, bytes memory data1) = FEE_RECIPIENT1.call{value : msg.value}(""); require(success1, "error paying cancel fee"); } Raffle storage raffle = raffles[raffle_id]; require(raffle.seller == msg.sender, "not owner"); _revert(raffle_id); } function _revert(uint raffle_id) internal { Raffle storage raffle = raffles[raffle_id]; require(raffle.status == STATUS.ACTIVE, "!ACTIVE"); for (uint i = 0; i < raffle.users.length; i ++) { //console.log('i=%s total=%s', i, raffle.total); (bool success, bytes memory data) = raffle.users[i].call{value : raffle.price}(""); require(success, "error refunding user"); } // IERC721(raffle.nft).safeTransferFrom(address(this), msg.sender, raffle.nft_id); raffle.status = STATUS.EXPIRED; collect_fee(raffle_id); emit Revert(raffle_id); } uint public _collectFee = 10; function setCallerFee(uint _fee) public onlyOwner { _collectFee = _fee; } function collect_fee(uint raffle_id) internal { Raffle storage raffle = raffles[raffle_id]; NFT storage nft = properties[raffle.nft]; uint fee = nft.listing_fee; if (fee > 0) { uint caller_fee = (fee * _collectFee) / 100; fee -= caller_fee; (bool success1, bytes memory data1) = nft.listing_fee_recipient.call{value : fee}(""); require(success1, "error paying listing fee"); (bool success2, bytes memory data2) = msg.sender.call{value : caller_fee}(""); require(success2, "error paying sender"); emit collectFee(msg.sender, nft.listing_fee, fee, caller_fee, _collectFee); } } function collect_fee_from_expired() public { for (uint raffle_id = 0; raffle_id < raffles.length; raffle_id++) { Raffle storage raffle = raffles[raffle_id]; if (raffle.status != STATUS.ACTIVE) continue; if (block.timestamp < raffle.endtime) continue; _revert(raffle_id); } } // how much is fee available to collect? function amount_fee_from_expired() public view returns (uint) { uint total; for (uint raffle_id = 0; raffle_id < raffles.length; raffle_id++) { Raffle storage raffle = raffles[raffle_id]; if (raffle.status != STATUS.ACTIVE) continue; if (block.timestamp < raffle.endtime) continue; NFT storage nft = properties[raffle.nft]; total += (nft.listing_fee * _collectFee) / 100; } return total; } function getRafflesByUser( address user ) public view returns(uint[] memory){ return rafflesByUser[user]; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"raffle_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"users","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ticket","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_max_per_user","type":"uint256"},{"indexed":false,"internalType":"address","name":"_nft","type":"address"},{"indexed":false,"internalType":"uint256","name":"_nft_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endtime","type":"uint256"}],"name":"Create_Raffle","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raffle_id","type":"uint256"}],"name":"Revert","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raffle_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"royalties","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"number","type":"uint256"}],"name":"Trigger","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"listing_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"caller_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collectFee","type":"uint256"}],"name":"collectFee","type":"event"},{"inputs":[],"name":"_collectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"royalties_recipient","type":"address"},{"internalType":"uint256","name":"royalties","type":"uint256"},{"internalType":"uint256","name":"listing_fee","type":"uint256"},{"internalType":"address","name":"listing_fee_recipient","type":"address"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"twitter","type":"string"},{"internalType":"string","name":"tg","type":"string"},{"internalType":"uint256","name":"category","type":"uint256"}],"name":"add_nft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"all_contracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amount_fee_from_expired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"raffle_id","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"raffle_id","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cancelFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collect_fee_from_expired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_per_user","type":"uint256"},{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_nft_id","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_endtime","type":"uint256"}],"name":"create_raffle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"address","name":"royalties_recipient","type":"address"},{"internalType":"uint256","name":"royalties","type":"uint256"},{"internalType":"uint256","name":"listing_fee","type":"uint256"},{"internalType":"address","name":"listing_fee_recipient","type":"address"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"twitter","type":"string"},{"internalType":"string","name":"tg","type":"string"},{"internalType":"uint256","name":"category","type":"uint256"}],"name":"edit_nft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveRaffles","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"internalType":"struct Main.Raffle[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllNnft","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCancelledRaffles","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"internalType":"struct Main.Raffle[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinishedRaffles","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"internalType":"struct Main.Raffle[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"category","type":"uint256"},{"internalType":"enum Main.STATUS","name":"s","type":"uint8"}],"name":"getRafflesByCategory","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"internalType":"struct Main.Raffle[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"enum Main.STATUS","name":"s","type":"uint8"}],"name":"getRafflesByNftAndStatus","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"internalType":"struct Main.Raffle[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Main.STATUS","name":"s","type":"uint8"}],"name":"getRafflesByStatus","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"internalType":"struct Main.Raffle[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getRafflesByUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getUsersByRaffleId","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moreRand","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"properties","outputs":[{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"royalties","type":"uint256"},{"internalType":"address","name":"royalties_recipient","type":"address"},{"internalType":"uint256","name":"listing_fee","type":"uint256"},{"internalType":"address","name":"listing_fee_recipient","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"twitter","type":"string"},{"internalType":"string","name":"tg","type":"string"},{"internalType":"uint256","name":"category","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"raffles","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Main.STATUS","name":"status","type":"uint8"},{"internalType":"uint256","name":"max_per_user","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"users_length","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setCancelFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasure","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052678ac7230489e80000600555600a6008553480156200002257600080fd5b506200002e3362000046565b600280546001600160a01b0319163317905562000096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61356180620000a66000396000f3fe6080604052600436106101c25760003560e01c80636ed23cbe116100f75780638da5cb5b11610095578063d6febde811610064578063d6febde81461051a578063e74b981b1461052d578063f2fde38b1461054d578063fee25de91461056d57600080fd5b80638da5cb5b146104b4578063a4d2e685146104d2578063c2fffd6b146104e7578063c8841a191461050757600080fd5b806384141ec4116100d157806384141ec41461044957806384f8859a1461045e578063864ecf481461047e5780638659ca7c1461049457600080fd5b80636ed23cbe146103f2578063715018a6146104075780637ce3ff571461041c57600080fd5b80633dc70c161161016457806353aa7dcd1161013e57806353aa7dcd1461037057806359f4cc2d146103905780635d4bc0ce146103a55780636d33476c146103dd57600080fd5b80633dc70c161461032657806340e58ee51461033b5780635113d8de1461035057600080fd5b806317614a58116101a057806317614a581461026c57806325ec77d714610299578063296a6b56146102cf5780632fab4d92146102f957600080fd5b8063118716aa146101c757806314025dcd14610204578063150b7a0214610228575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612c38565b61058d565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021057600080fd5b5061021a60055481565b6040519081526020016101fb565b34801561023457600080fd5b50610253610243366004612d02565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101fb565b34801561027857600080fd5b5061028c610287366004612d91565b6105b7565b6040516101fb9190612e42565b3480156102a557600080fd5b506102b96102b4366004612f60565b610909565b6040516101fb9a99989796959493929190612fca565b3480156102db57600080fd5b506102e4610b05565b604080519283526020830191909152016101fb565b34801561030557600080fd5b50610319610314366004612f60565b610b20565b6040516101fb919061305a565b34801561033257600080fd5b5061028c610b8c565b61034e610349366004612c38565b610b9d565b005b34801561035c57600080fd5b5061028c61036b36600461309e565b610cd3565b34801561037c57600080fd5b5061034e61038b366004612c38565b611052565b34801561039c57600080fd5b5061021a61105f565b3480156103b157600080fd5b506103c56103c0366004612c38565b61112f565b6040516101fb9c9b9a999897969594939291906130c1565b3480156103e957600080fd5b5061028c6111b2565b3480156103fe57600080fd5b5061034e6111be565b34801561041357600080fd5b5061034e611247565b34801561042857600080fd5b5061043c610437366004612c38565b61125b565b6040516101fb9190613136565b34801561045557600080fd5b5061043c6112e0565b34801561046a57600080fd5b5061028c610479366004613177565b611342565b34801561048a57600080fd5b5061021a60085481565b3480156104a057600080fd5b5061034e6104af3660046131b2565b611613565b3480156104c057600080fd5b506000546001600160a01b03166101e7565b3480156104de57600080fd5b5061028c61163b565b3480156104f357600080fd5b5061034e610502366004612c38565b611647565b61034e6105153660046132ad565b611654565b61034e6105283660046132fd565b611c01565b34801561053957600080fd5b5061034e610548366004612f60565b611ee3565b34801561055957600080fd5b5061034e610568366004612f60565b611f0d565b34801561057957600080fd5b5061034e6105883660046131b2565b611f83565b6004818154811061059d57600080fd5b6000918252602090912001546001600160a01b0316905081565b60606000805b60065481101561067857846001600160a01b0316600682815481106105e4576105e461331f565b600091825260209091206004600d9092020101546001600160a01b0316036106665783600381111561061857610618612dc6565b6006828154811061062b5761062b61331f565b600091825260209091206001600d90920201015460ff16600381111561065357610653612dc6565b0361066657816106628161334b565b9250505b806106708161334b565b9150506105bd565b5060008167ffffffffffffffff81111561069457610694612c76565b6040519080825280602002602001820160405280156106cd57816020015b6106ba612b3a565b8152602001906001900390816106b25790505b5090506000805b6006548110156108fc57866001600160a01b0316600682815481106106fb576106fb61331f565b600091825260209091206004600d9092020101546001600160a01b0316036108ea5785600381111561072f5761072f612dc6565b600682815481106107425761074261331f565b600091825260209091206001600d90920201015460ff16600381111561076a5761076a612dc6565b036108ea57600681815481106107825761078261331f565b90600052602060002090600d0201604051806101a0016040529081600082015481526020016001820160009054906101000a900460ff1660038111156107ca576107ca612dc6565b60038111156107db576107db612dc6565b81526002820154602080830191909152600383015460408084019190915260048401546001600160a01b0390811660608501526005850154608085015260068501541660a084015260078401805482518185028101850190935280835260c090940193919290919083018282801561087c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161085e575b50505091835250506008820154602082015260098201546001600160a01b03166040820152600a8201546060820152600b8201546080820152600c9091015460a09091015283836108cc8161334b565b9450815181106108de576108de61331f565b60200260200101819052505b806108f48161334b565b9150506106d4565b5090925050505b92915050565b6003602081905260009182526040909120805460018201546002830154938301546004840154600585015460068601805460ff90961697949694956001600160a01b03948516959394909216929161096090613364565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90613364565b80156109d95780601f106109ae576101008083540402835291602001916109d9565b820191906000526020600020905b8154815290600101906020018083116109bc57829003601f168201915b5050505050908060070180546109ee90613364565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1a90613364565b8015610a675780601f10610a3c57610100808354040283529160200191610a67565b820191906000526020600020905b815481529060010190602001808311610a4a57829003601f168201915b505050505090806008018054610a7c90613364565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890613364565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b505050505090806009015490508a565b6000808080610b15600143613398565b948540945092505050565b6001600160a01b038116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015610b8057602002820191906000526020600020905b815481526020019060010190808311610b6c575b50505050509050919050565b6060610b986000611342565b905090565b60055415610c555760025460405160009182916001600160a01b039091169034908381818185875af1925050503d8060008114610bf6576040519150601f19603f3d011682016040523d82523d6000602084013e610bfb565b606091505b509150915081610c525760405162461bcd60e51b815260206004820152601760248201527f6572726f7220706179696e672063616e63656c2066656500000000000000000060448201526064015b60405180910390fd5b50505b600060068281548110610c6a57610c6a61331f565b600091825260209091206009600d90920201908101549091506001600160a01b03163314610cc65760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c49565b610ccf82612043565b5050565b60606000805b600654811015610db157600060068281548110610cf857610cf861331f565b600091825260208083206004600d9093020191909101546001600160a01b031680835260039091526040909120600901549091508614610d385750610d9f565b846003811115610d4a57610d4a612dc6565b60068381548110610d5d57610d5d61331f565b600091825260209091206001600d90920201015460ff166003811115610d8557610d85612dc6565b14610d905750610d9f565b82610d9a8161334b565b935050505b80610da98161334b565b915050610cd9565b5060008167ffffffffffffffff811115610dcd57610dcd612c76565b604051908082528060200260200182016040528015610e0657816020015b610df3612b3a565b815260200190600190039081610deb5790505b5090506000805b6006548110156108fc57600060068281548110610e2c57610e2c61331f565b600091825260208083206004600d9093020191909101546001600160a01b031680835260039091526040909120600901549091508814610e6c5750611040565b866003811115610e7e57610e7e612dc6565b60068381548110610e9157610e9161331f565b600091825260209091206001600d90920201015460ff166003811115610eb957610eb9612dc6565b14610ec45750611040565b60068281548110610ed757610ed761331f565b90600052602060002090600d0201604051806101a0016040529081600082015481526020016001820160009054906101000a900460ff166003811115610f1f57610f1f612dc6565b6003811115610f3057610f30612dc6565b81526002820154602080830191909152600383015460408084019190915260048401546001600160a01b0390811660608501526005850154608085015260068501541660a084015260078401805482518185028101850190935280835260c0909401939192909190830182828015610fd157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fb3575b50505091835250506008820154602082015260098201546001600160a01b03166040820152600a8201546060820152600b8201546080820152600c9091015460a09091015284846110218161334b565b9550815181106110335761103361331f565b6020026020010181905250505b8061104a8161334b565b915050610e0d565b61105a61225c565b600855565b60008060005b600654811015611129576000600682815481106110845761108461331f565b600091825260208220600d909102019150600182015460ff1660038111156110ae576110ae612dc6565b146110b95750611117565b80600c01544210156110cb5750611117565b6004808201546001600160a01b031660009081526003602052604090206008549181015490916064916110fe91906133ab565b61110891906133ca565b61111290856133ec565b935050505b806111218161334b565b915050611065565b50919050565b6006818154811061113f57600080fd5b60009182526020909120600d90910201805460018201546002830154600384015460048501546005860154600687015460088801546009890154600a8a0154600b8b0154600c909b0154999b5060ff90981699969895976001600160a01b0395861697949693861695929491909216928c565b6060610b986002611342565b60005b600654811015611244576000600682815481106111e0576111e061331f565b600091825260208220600d909102019150600182015460ff16600381111561120a5761120a612dc6565b146112155750611232565b80600c01544210156112275750611232565b61123082612043565b505b8061123c8161334b565b9150506111c1565b50565b61124f61225c565b61125960006122b6565b565b6060600682815481106112705761127061331f565b90600052602060002090600d0201600701805480602002602001604051908101604052809291908181526020018280548015610b8057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112b75750505050509050919050565b6060600480548060200260200160405190810160405280929190818152602001828054801561133857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161131a575b5050505050905090565b60606000805b6006548110156113c45783600381111561136457611364612dc6565b600682815481106113775761137761331f565b600091825260209091206001600d90920201015460ff16600381111561139f5761139f612dc6565b036113b257816113ae8161334b565b9250505b806113bc8161334b565b915050611348565b5060008167ffffffffffffffff8111156113e0576113e0612c76565b60405190808252806020026020018201604052801561141957816020015b611406612b3a565b8152602001906001900390816113fe5790505b5090506000805b6006548110156116095785600381111561143c5761143c612dc6565b6006828154811061144f5761144f61331f565b600091825260209091206001600d90920201015460ff16600381111561147757611477612dc6565b036115f7576006818154811061148f5761148f61331f565b90600052602060002090600d0201604051806101a0016040529081600082015481526020016001820160009054906101000a900460ff1660038111156114d7576114d7612dc6565b60038111156114e8576114e8612dc6565b81526002820154602080830191909152600383015460408084019190915260048401546001600160a01b0390811660608501526005850154608085015260068501541660a084015260078401805482518185028101850190935280835260c090940193919290919083018282801561158957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161156b575b50505091835250506008820154602082015260098201546001600160a01b03166040820152600a8201546060820152600b8201546080820152600c9091015460a09091015283836115d98161334b565b9450815181106115eb576115eb61331f565b60200260200101819052505b806116018161334b565b915050611420565b5090949350505050565b61161b61225c565b61162e8b8b8b8b8b8b8b8b8b8b8b612306565b5050505050505050505050565b6060610b986001611342565b61164f61225c565b600555565b600086116116895760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610c49565b61271083116116bf5760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610c49565b600282116116f45760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401610c49565b6001600160a01b03851661172f5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610c49565b6001600160a01b038516600090815260036020819052604082205460ff169081111561175d5761175d612dc6565b0361178f5760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610c49565b6001600160a01b03851660009081526003602052604090206004015415806117d157506001600160a01b03851660009081526003602052604090206004015434145b6118025760405162461bcd60e51b8152602060048201526002602482015261229b60f11b6044820152606401610c49565b610e10811015801561181757506276a7008111155b6118485760405162461bcd60e51b8152602060048201526002602482015261453760f01b6044820152606401610c49565b6040805160008082526101c0820183526006546020830190815292820181905260608201899052608082018590526001600160a01b03881660a083015260c0820187905260e0820181905261010082018290526101208201819052336101408301526101608201869052610180820181905290916101a083016118cb85426133ec565b9052600680546001808201835560009290925282517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600d90920291820190815560208401517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909201805494955085949193909160ff19169083600381111561195757611957612dc6565b0217905550604082015160028201556060820151600382015560808201516004820180546001600160a01b039283166001600160a01b03199182161790915560a0840151600584015560c084015160068401805491909316911617905560e082015180516119cf916007840191602090910190612bbe565b5061010082015160088201556101208201516009820180546001600160a01b0319166001600160a01b03928316179055610140830151600a830155610160830151600b83015561018090920151600c90910155336000818152600760209081526040808320865181546001810183559185529290932090920155608084015160a085015191516331a9108f60e11b8152600481019290925292831690636352211e90602401602060405180830381865afa158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab591906133ff565b6001600160a01b031614611b0b5760405162461bcd60e51b815260206004820152601a60248201527f4e4654206973206e6f74206f776e65642062792063616c6c65720000000000006044820152606401610c49565b60a0820151604051632142170760e11b815233600482015230602482015260448101919091526001600160a01b038216906342842e0e90606401600060405180830381600087803b158015611b5f57600080fd5b505af1158015611b73573d6000803e3d6000fd5b505050507ffd18c2ad778bff003b9a1a08da08b3ad583f480963cea8dfaa5f59c50f6a38d389898989896001600680549050611baf9190613398565b604080519687526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c0810186905260e00160405180910390a1611bf66111be565b505050505050505050565b600060068281548110611c1657611c1661331f565b600091825260208220600d909102019150600182015460ff166003811115611c4057611c40612dc6565b14611c775760405162461bcd60e51b81526020600482015260076024820152662141435449564560c81b6044820152606401610c49565b8281600a0154611c8791906133ab565b341015611cc85760405162461bcd60e51b815260206004820152600f60248201526e141c9a58d9481a5b98dbdc9c9958dd608a1b6044820152606401610c49565b6000805b84811015611db1576007830180546001810182556000918252602082200180546001600160a01b0319163317905560088401805491611d0a8361334b565b9091555050600a830154611d1e90836133ec565b60078401546003850154604080518981526020810189905234918101919091526060810192909252608082015260a081018390529092507f6ed895650a0d70b4c8112d5192b0a971582409a5cbc19ead321c8700e7d52da89060c00160405180910390a16003830154600784015410611d9f57611d9a84612420565b611db1565b80611da98161334b565b915050611ccc565b508082600b016000828254611dc691906133ec565b9091555060009050611dd88234613398565b1115611ed55760008033611dec8434613398565b604051600081818185875af1925050503d8060008114611e28576040519150601f19603f3d011682016040523d82523d6000602084013e611e2d565b606091505b509150915081611e775760405162461bcd60e51b815260206004820152601560248201527432b93937b9103932b33ab73234b733903ab9b2b91760591b6044820152606401610c49565b7fb7048c2ad36aadee977bb16b4543a18866044d27a2ca753e1c7dbcfa7d7a6962333485611ea58183613398565b604080516001600160a01b039095168552602085019390935291830152606082015260800160405180910390a150505b611edd6111be565b50505050565b611eeb61225c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b611f1561225c565b6001600160a01b038116611f7a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c49565b611244816122b6565b611f8b61225c565b6001600160a01b038b1660009081526003602052604090206001015415611fe55760405162461bcd60e51b815260206004820152600e60248201526d616c72656164792065786973747360901b6044820152606401610c49565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b038d1617905561162e8b8b8b8b8b8b8b8b8b8b8b612306565b6000600682815481106120585761205861331f565b600091825260208220600d909102019150600182015460ff16600381111561208257612082612dc6565b146120b95760405162461bcd60e51b81526020600482015260076024820152662141435449564560c81b6044820152606401610c49565b60005b600782015481101561219c576000808360070183815481106120e0576120e061331f565b6000918252602082200154600a8601546040516001600160a01b039092169290919081818185875af1925050503d8060008114612139576040519150601f19603f3d011682016040523d82523d6000602084013e61213e565b606091505b5091509150816121875760405162461bcd60e51b815260206004820152601460248201527332b93937b9103932b33ab73234b733903ab9b2b960611b6044820152606401610c49565b505080806121949061334b565b9150506120bc565b506004818101546005830154604051632142170760e11b8152309381019390935233602484015260448301526001600160a01b0316906342842e0e90606401600060405180830381600087803b1580156121f557600080fd5b505af1158015612209573d6000803e3d6000fd5b5050505060018101805460ff19166003179055612225826125c4565b6040518281527f9d434160922b3be2ebb540e22251e55f8a180264254d73b5e8179ad541997ace9060200160405180910390a15050565b6000546001600160a01b031633146112595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c49565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038b16600090815260036020819052604090912060018082018d90558154889360ff199091169190849081111561234657612346612dc6565b02179055506001600160a01b038b8116600090815260036020819052604090912090810180546001600160a01b03199081168d851617909155600282018b9055600482018a9055600582018054909116928916929092179091556006016123ad858261346b565b506001600160a01b038b1660009081526003602052604090206007016123d3848261346b565b506001600160a01b038b1660009081526003602052604090206008016123f9838261346b565b506001600160a01b038b16600090815260036020526040902060090181905561162e6111be565b6000600682815481106124355761243561331f565b90600052602060002090600d02019050600080612450610b05565b600785015491935091506000612467600183613398565b905060008033445a4289896001600081546124819061334b565b9182905550604080516001600160a01b0390981660208901528701959095526060860193909352608085019190915260a084015260c083015260e0820152610100016040516020818303038152906040528051906020012090508060001c915082820691508660070182815481106124fb576124fb61331f565b6000918252602090912001546006880180546001600160a01b039283166001600160a01b031990911681179091556001808a01805460ff191690911790556004808a015460058b0154604051632142170760e11b81523093810193909352602483019390935260448201929092529116906342842e0e90606401600060405180830381600087803b15801561258f57600080fd5b505af11580156125a3573d6000803e3d6000fd5b505050506125b188836127d7565b6125ba886125c4565b5050505050505050565b6000600682815481106125d9576125d961331f565b600091825260208083206004600d90930201828101546001600160a01b031684526003909152604090922090810154919250908015611edd57600060646008548361262491906133ab565b61262e91906133ca565b905061263a8183613398565b600584015460405191935060009182916001600160a01b03169085908381818185875af1925050503d806000811461268e576040519150601f19603f3d011682016040523d82523d6000602084013e612693565b606091505b5091509150816126e55760405162461bcd60e51b815260206004820152601860248201527f6572726f7220706179696e67206c697374696e672066656500000000000000006044820152606401610c49565b6040516000908190339086908381818185875af1925050503d8060008114612729576040519150601f19603f3d011682016040523d82523d6000602084013e61272e565b606091505b5091509150816127765760405162461bcd60e51b815260206004820152601360248201527232b93937b9103830bcb4b7339039b2b73232b960691b6044820152606401610c49565b600487015460085460408051338152602081019390935282018890526060820187905260808201527f071f2d4b1d1550e49d38fcf938a148069b8404c342e35f67f4ee5f0161b3800d9060a0015b60405180910390a1505050505050505050565b6000600683815481106127ec576127ec61331f565b60009182526020808320600b600d909302019182015460048301546001600160a01b031684526003909152604083206001015491935091908190819015612a395760048501546001600160a01b031660009081526003602052604090206001015460649061285a90866133ab565b61286491906133ca565b91506128708285613398565b60048601546001600160a01b03166000908152600360205260409020600201549093501561299b5760048501546001600160a01b03166000908152600360205260409020600201546064906128c590846133ab565b6128cf91906133ca565b90506128db8183613398565b60048601546001600160a01b03908116600090815260036020819052604080832090910154905193955090928392919091169084908381818185875af1925050503d8060008114612948576040519150601f19603f3d011682016040523d82523d6000602084013e61294d565b606091505b5091509150816129985760405162461bcd60e51b81526020600482015260166024820152756572726f7220706179696e6720726f79616c7469657360501b6044820152606401610c49565b50505b60025460405160009182916001600160a01b039091169085908381818185875af1925050503d80600081146129ec576040519150601f19603f3d011682016040523d82523d6000602084013e6129f1565b606091505b509150915081612a365760405162461bcd60e51b815260206004820152601060248201526f6572726f7220706179696e672066656560801b6044820152606401610c49565b50505b600985015460405160009182916001600160a01b039091169086908381818185875af1925050503d8060008114612a8c576040519150601f19603f3d011682016040523d82523d6000602084013e612a91565b606091505b509150915081612ad95760405162461bcd60e51b815260206004820152601360248201527232b93937b9103830bcb4b7339039b2b63632b960691b6044820152606401610c49565b6006870154604080518b815260208101889052908101869052606081018590526001600160a01b03909116608082015260a081018990527f2a11e2fb9c873ea5c7c3464b2fbd959556b3adc3bc600858302f23b4ac5baa199060c0016127c4565b604080516101a08101909152600080825260208201908152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001606081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215612c13579160200282015b82811115612c1357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612bde565b50612c1f929150612c23565b5090565b5b80821115612c1f5760008155600101612c24565b600060208284031215612c4a57600080fd5b5035919050565b6001600160a01b038116811461124457600080fd5b8035612c7181612c51565b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612ca757612ca7612c76565b604051601f8501601f19908116603f01168101908282118183101715612ccf57612ccf612c76565b81604052809350858152868686011115612ce857600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215612d1857600080fd5b8435612d2381612c51565b93506020850135612d3381612c51565b925060408501359150606085013567ffffffffffffffff811115612d5657600080fd5b8501601f81018713612d6757600080fd5b612d7687823560208401612c8c565b91505092959194509250565b803560048110612c7157600080fd5b60008060408385031215612da457600080fd5b8235612daf81612c51565b9150612dbd60208401612d82565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110612dfa57634e487b7160e01b600052602160045260246000fd5b9052565b600081518084526020808501945080840160005b83811015612e375781516001600160a01b031687529582019590820190600101612e12565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015612f5257603f1989840301855281516101a08151855288820151612e938a870182612ddc565b508782015185890152606080830151908601526080808301516001600160a01b03811682880152505060a0828101519086015260c0808301516001600160a01b03811682880152505060e0808301518282880152612ef383880182612dfe565b9250505061010080830151818701525061012080830151612f1e828801826001600160a01b03169052565b5050610140828101519086015261016080830151908601526101809182015191909401529386019390860190600101612e69565b509098975050505050505050565b600060208284031215612f7257600080fd5b8135612f7d81612c51565b9392505050565b6000815180845260005b81811015612faa57602081850181015186830182015201612f8e565b506000602082860101526020601f19601f83011685010191505092915050565b6000610140612fd9838e612ddc565b602083018c9052604083018b90526001600160a01b038a81166060850152608084018a9052881660a084015260c0830181905261301881840188612f84565b905082810360e084015261302c8187612f84565b90508281036101008401526130418186612f84565b915050826101208301529b9a5050505050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561309257835183529284019291840191600101613076565b50909695505050505050565b600080604083850312156130b157600080fd5b82359150612dbd60208401612d82565b8c815261018081016130d6602083018e612ddc565b604082019b909b5260608101999099526001600160a01b0397881660808a015260a089019690965293861660c088015260e08701929092529093166101008501526101208401929092526101408301919091526101609091015292915050565b6020808252825182820181905260009190848201906040850190845b818110156130925783516001600160a01b031683529284019291840191600101613152565b60006020828403121561318957600080fd5b612f7d82612d82565b600082601f8301126131a357600080fd5b612f7d83833560208501612c8c565b60008060008060008060008060008060006101608c8e0312156131d457600080fd5b6131dd8c612c66565b9a5060208c013599506131f260408d01612c66565b985060608c0135975060808c0135965061320e60a08d01612c66565b955061321c60c08d01612d82565b945067ffffffffffffffff8060e08e0135111561323857600080fd5b6132488e60e08f01358f01613192565b9450806101008e0135111561325c57600080fd5b61326d8e6101008f01358f01613192565b9350806101208e0135111561328157600080fd5b506132938d6101208e01358e01613192565b91506101408c013590509295989b509295989b9093969950565b60008060008060008060c087890312156132c657600080fd5b8635955060208701356132d881612c51565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6000806040838503121561331057600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161335d5761335d613335565b5060010190565b600181811c9082168061337857607f821691505b60208210810361112957634e487b7160e01b600052602260045260246000fd5b8181038181111561090357610903613335565b60008160001904831182151516156133c5576133c5613335565b500290565b6000826133e757634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561090357610903613335565b60006020828403121561341157600080fd5b8151612f7d81612c51565b601f82111561346657600081815260208120601f850160051c810160208610156134435750805b601f850160051c820191505b818110156134625782815560010161344f565b5050505b505050565b815167ffffffffffffffff81111561348557613485612c76565b613499816134938454613364565b8461341c565b602080601f8311600181146134ce57600084156134b65750858301515b600019600386901b1c1916600185901b178555613462565b600085815260208120601f198616915b828110156134fd578886015182559484019460019091019084016134de565b508582101561351b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea26469706673582212206786a5162e76c168bd01bda0704e4ed122ecd051fe3b346b31e8a02f4fea57d764736f6c63430008100033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80636ed23cbe116100f75780638da5cb5b11610095578063d6febde811610064578063d6febde81461051a578063e74b981b1461052d578063f2fde38b1461054d578063fee25de91461056d57600080fd5b80638da5cb5b146104b4578063a4d2e685146104d2578063c2fffd6b146104e7578063c8841a191461050757600080fd5b806384141ec4116100d157806384141ec41461044957806384f8859a1461045e578063864ecf481461047e5780638659ca7c1461049457600080fd5b80636ed23cbe146103f2578063715018a6146104075780637ce3ff571461041c57600080fd5b80633dc70c161161016457806353aa7dcd1161013e57806353aa7dcd1461037057806359f4cc2d146103905780635d4bc0ce146103a55780636d33476c146103dd57600080fd5b80633dc70c161461032657806340e58ee51461033b5780635113d8de1461035057600080fd5b806317614a58116101a057806317614a581461026c57806325ec77d714610299578063296a6b56146102cf5780632fab4d92146102f957600080fd5b8063118716aa146101c757806314025dcd14610204578063150b7a0214610228575b600080fd5b3480156101d357600080fd5b506101e76101e2366004612c38565b61058d565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021057600080fd5b5061021a60055481565b6040519081526020016101fb565b34801561023457600080fd5b50610253610243366004612d02565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101fb565b34801561027857600080fd5b5061028c610287366004612d91565b6105b7565b6040516101fb9190612e42565b3480156102a557600080fd5b506102b96102b4366004612f60565b610909565b6040516101fb9a99989796959493929190612fca565b3480156102db57600080fd5b506102e4610b05565b604080519283526020830191909152016101fb565b34801561030557600080fd5b50610319610314366004612f60565b610b20565b6040516101fb919061305a565b34801561033257600080fd5b5061028c610b8c565b61034e610349366004612c38565b610b9d565b005b34801561035c57600080fd5b5061028c61036b36600461309e565b610cd3565b34801561037c57600080fd5b5061034e61038b366004612c38565b611052565b34801561039c57600080fd5b5061021a61105f565b3480156103b157600080fd5b506103c56103c0366004612c38565b61112f565b6040516101fb9c9b9a999897969594939291906130c1565b3480156103e957600080fd5b5061028c6111b2565b3480156103fe57600080fd5b5061034e6111be565b34801561041357600080fd5b5061034e611247565b34801561042857600080fd5b5061043c610437366004612c38565b61125b565b6040516101fb9190613136565b34801561045557600080fd5b5061043c6112e0565b34801561046a57600080fd5b5061028c610479366004613177565b611342565b34801561048a57600080fd5b5061021a60085481565b3480156104a057600080fd5b5061034e6104af3660046131b2565b611613565b3480156104c057600080fd5b506000546001600160a01b03166101e7565b3480156104de57600080fd5b5061028c61163b565b3480156104f357600080fd5b5061034e610502366004612c38565b611647565b61034e6105153660046132ad565b611654565b61034e6105283660046132fd565b611c01565b34801561053957600080fd5b5061034e610548366004612f60565b611ee3565b34801561055957600080fd5b5061034e610568366004612f60565b611f0d565b34801561057957600080fd5b5061034e6105883660046131b2565b611f83565b6004818154811061059d57600080fd5b6000918252602090912001546001600160a01b0316905081565b60606000805b60065481101561067857846001600160a01b0316600682815481106105e4576105e461331f565b600091825260209091206004600d9092020101546001600160a01b0316036106665783600381111561061857610618612dc6565b6006828154811061062b5761062b61331f565b600091825260209091206001600d90920201015460ff16600381111561065357610653612dc6565b0361066657816106628161334b565b9250505b806106708161334b565b9150506105bd565b5060008167ffffffffffffffff81111561069457610694612c76565b6040519080825280602002602001820160405280156106cd57816020015b6106ba612b3a565b8152602001906001900390816106b25790505b5090506000805b6006548110156108fc57866001600160a01b0316600682815481106106fb576106fb61331f565b600091825260209091206004600d9092020101546001600160a01b0316036108ea5785600381111561072f5761072f612dc6565b600682815481106107425761074261331f565b600091825260209091206001600d90920201015460ff16600381111561076a5761076a612dc6565b036108ea57600681815481106107825761078261331f565b90600052602060002090600d0201604051806101a0016040529081600082015481526020016001820160009054906101000a900460ff1660038111156107ca576107ca612dc6565b60038111156107db576107db612dc6565b81526002820154602080830191909152600383015460408084019190915260048401546001600160a01b0390811660608501526005850154608085015260068501541660a084015260078401805482518185028101850190935280835260c090940193919290919083018282801561087c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161085e575b50505091835250506008820154602082015260098201546001600160a01b03166040820152600a8201546060820152600b8201546080820152600c9091015460a09091015283836108cc8161334b565b9450815181106108de576108de61331f565b60200260200101819052505b806108f48161334b565b9150506106d4565b5090925050505b92915050565b6003602081905260009182526040909120805460018201546002830154938301546004840154600585015460068601805460ff90961697949694956001600160a01b03948516959394909216929161096090613364565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90613364565b80156109d95780601f106109ae576101008083540402835291602001916109d9565b820191906000526020600020905b8154815290600101906020018083116109bc57829003601f168201915b5050505050908060070180546109ee90613364565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1a90613364565b8015610a675780601f10610a3c57610100808354040283529160200191610a67565b820191906000526020600020905b815481529060010190602001808311610a4a57829003601f168201915b505050505090806008018054610a7c90613364565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890613364565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b505050505090806009015490508a565b6000808080610b15600143613398565b948540945092505050565b6001600160a01b038116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015610b8057602002820191906000526020600020905b815481526020019060010190808311610b6c575b50505050509050919050565b6060610b986000611342565b905090565b60055415610c555760025460405160009182916001600160a01b039091169034908381818185875af1925050503d8060008114610bf6576040519150601f19603f3d011682016040523d82523d6000602084013e610bfb565b606091505b509150915081610c525760405162461bcd60e51b815260206004820152601760248201527f6572726f7220706179696e672063616e63656c2066656500000000000000000060448201526064015b60405180910390fd5b50505b600060068281548110610c6a57610c6a61331f565b600091825260209091206009600d90920201908101549091506001600160a01b03163314610cc65760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610c49565b610ccf82612043565b5050565b60606000805b600654811015610db157600060068281548110610cf857610cf861331f565b600091825260208083206004600d9093020191909101546001600160a01b031680835260039091526040909120600901549091508614610d385750610d9f565b846003811115610d4a57610d4a612dc6565b60068381548110610d5d57610d5d61331f565b600091825260209091206001600d90920201015460ff166003811115610d8557610d85612dc6565b14610d905750610d9f565b82610d9a8161334b565b935050505b80610da98161334b565b915050610cd9565b5060008167ffffffffffffffff811115610dcd57610dcd612c76565b604051908082528060200260200182016040528015610e0657816020015b610df3612b3a565b815260200190600190039081610deb5790505b5090506000805b6006548110156108fc57600060068281548110610e2c57610e2c61331f565b600091825260208083206004600d9093020191909101546001600160a01b031680835260039091526040909120600901549091508814610e6c5750611040565b866003811115610e7e57610e7e612dc6565b60068381548110610e9157610e9161331f565b600091825260209091206001600d90920201015460ff166003811115610eb957610eb9612dc6565b14610ec45750611040565b60068281548110610ed757610ed761331f565b90600052602060002090600d0201604051806101a0016040529081600082015481526020016001820160009054906101000a900460ff166003811115610f1f57610f1f612dc6565b6003811115610f3057610f30612dc6565b81526002820154602080830191909152600383015460408084019190915260048401546001600160a01b0390811660608501526005850154608085015260068501541660a084015260078401805482518185028101850190935280835260c0909401939192909190830182828015610fd157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fb3575b50505091835250506008820154602082015260098201546001600160a01b03166040820152600a8201546060820152600b8201546080820152600c9091015460a09091015284846110218161334b565b9550815181106110335761103361331f565b6020026020010181905250505b8061104a8161334b565b915050610e0d565b61105a61225c565b600855565b60008060005b600654811015611129576000600682815481106110845761108461331f565b600091825260208220600d909102019150600182015460ff1660038111156110ae576110ae612dc6565b146110b95750611117565b80600c01544210156110cb5750611117565b6004808201546001600160a01b031660009081526003602052604090206008549181015490916064916110fe91906133ab565b61110891906133ca565b61111290856133ec565b935050505b806111218161334b565b915050611065565b50919050565b6006818154811061113f57600080fd5b60009182526020909120600d90910201805460018201546002830154600384015460048501546005860154600687015460088801546009890154600a8a0154600b8b0154600c909b0154999b5060ff90981699969895976001600160a01b0395861697949693861695929491909216928c565b6060610b986002611342565b60005b600654811015611244576000600682815481106111e0576111e061331f565b600091825260208220600d909102019150600182015460ff16600381111561120a5761120a612dc6565b146112155750611232565b80600c01544210156112275750611232565b61123082612043565b505b8061123c8161334b565b9150506111c1565b50565b61124f61225c565b61125960006122b6565b565b6060600682815481106112705761127061331f565b90600052602060002090600d0201600701805480602002602001604051908101604052809291908181526020018280548015610b8057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112b75750505050509050919050565b6060600480548060200260200160405190810160405280929190818152602001828054801561133857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161131a575b5050505050905090565b60606000805b6006548110156113c45783600381111561136457611364612dc6565b600682815481106113775761137761331f565b600091825260209091206001600d90920201015460ff16600381111561139f5761139f612dc6565b036113b257816113ae8161334b565b9250505b806113bc8161334b565b915050611348565b5060008167ffffffffffffffff8111156113e0576113e0612c76565b60405190808252806020026020018201604052801561141957816020015b611406612b3a565b8152602001906001900390816113fe5790505b5090506000805b6006548110156116095785600381111561143c5761143c612dc6565b6006828154811061144f5761144f61331f565b600091825260209091206001600d90920201015460ff16600381111561147757611477612dc6565b036115f7576006818154811061148f5761148f61331f565b90600052602060002090600d0201604051806101a0016040529081600082015481526020016001820160009054906101000a900460ff1660038111156114d7576114d7612dc6565b60038111156114e8576114e8612dc6565b81526002820154602080830191909152600383015460408084019190915260048401546001600160a01b0390811660608501526005850154608085015260068501541660a084015260078401805482518185028101850190935280835260c090940193919290919083018282801561158957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161156b575b50505091835250506008820154602082015260098201546001600160a01b03166040820152600a8201546060820152600b8201546080820152600c9091015460a09091015283836115d98161334b565b9450815181106115eb576115eb61331f565b60200260200101819052505b806116018161334b565b915050611420565b5090949350505050565b61161b61225c565b61162e8b8b8b8b8b8b8b8b8b8b8b612306565b5050505050505050505050565b6060610b986001611342565b61164f61225c565b600555565b600086116116895760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610c49565b61271083116116bf5760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610c49565b600282116116f45760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401610c49565b6001600160a01b03851661172f5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610c49565b6001600160a01b038516600090815260036020819052604082205460ff169081111561175d5761175d612dc6565b0361178f5760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610c49565b6001600160a01b03851660009081526003602052604090206004015415806117d157506001600160a01b03851660009081526003602052604090206004015434145b6118025760405162461bcd60e51b8152602060048201526002602482015261229b60f11b6044820152606401610c49565b610e10811015801561181757506276a7008111155b6118485760405162461bcd60e51b8152602060048201526002602482015261453760f01b6044820152606401610c49565b6040805160008082526101c0820183526006546020830190815292820181905260608201899052608082018590526001600160a01b03881660a083015260c0820187905260e0820181905261010082018290526101208201819052336101408301526101608201869052610180820181905290916101a083016118cb85426133ec565b9052600680546001808201835560009290925282517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600d90920291820190815560208401517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909201805494955085949193909160ff19169083600381111561195757611957612dc6565b0217905550604082015160028201556060820151600382015560808201516004820180546001600160a01b039283166001600160a01b03199182161790915560a0840151600584015560c084015160068401805491909316911617905560e082015180516119cf916007840191602090910190612bbe565b5061010082015160088201556101208201516009820180546001600160a01b0319166001600160a01b03928316179055610140830151600a830155610160830151600b83015561018090920151600c90910155336000818152600760209081526040808320865181546001810183559185529290932090920155608084015160a085015191516331a9108f60e11b8152600481019290925292831690636352211e90602401602060405180830381865afa158015611a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab591906133ff565b6001600160a01b031614611b0b5760405162461bcd60e51b815260206004820152601a60248201527f4e4654206973206e6f74206f776e65642062792063616c6c65720000000000006044820152606401610c49565b60a0820151604051632142170760e11b815233600482015230602482015260448101919091526001600160a01b038216906342842e0e90606401600060405180830381600087803b158015611b5f57600080fd5b505af1158015611b73573d6000803e3d6000fd5b505050507ffd18c2ad778bff003b9a1a08da08b3ad583f480963cea8dfaa5f59c50f6a38d389898989896001600680549050611baf9190613398565b604080519687526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c0810186905260e00160405180910390a1611bf66111be565b505050505050505050565b600060068281548110611c1657611c1661331f565b600091825260208220600d909102019150600182015460ff166003811115611c4057611c40612dc6565b14611c775760405162461bcd60e51b81526020600482015260076024820152662141435449564560c81b6044820152606401610c49565b8281600a0154611c8791906133ab565b341015611cc85760405162461bcd60e51b815260206004820152600f60248201526e141c9a58d9481a5b98dbdc9c9958dd608a1b6044820152606401610c49565b6000805b84811015611db1576007830180546001810182556000918252602082200180546001600160a01b0319163317905560088401805491611d0a8361334b565b9091555050600a830154611d1e90836133ec565b60078401546003850154604080518981526020810189905234918101919091526060810192909252608082015260a081018390529092507f6ed895650a0d70b4c8112d5192b0a971582409a5cbc19ead321c8700e7d52da89060c00160405180910390a16003830154600784015410611d9f57611d9a84612420565b611db1565b80611da98161334b565b915050611ccc565b508082600b016000828254611dc691906133ec565b9091555060009050611dd88234613398565b1115611ed55760008033611dec8434613398565b604051600081818185875af1925050503d8060008114611e28576040519150601f19603f3d011682016040523d82523d6000602084013e611e2d565b606091505b509150915081611e775760405162461bcd60e51b815260206004820152601560248201527432b93937b9103932b33ab73234b733903ab9b2b91760591b6044820152606401610c49565b7fb7048c2ad36aadee977bb16b4543a18866044d27a2ca753e1c7dbcfa7d7a6962333485611ea58183613398565b604080516001600160a01b039095168552602085019390935291830152606082015260800160405180910390a150505b611edd6111be565b50505050565b611eeb61225c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b611f1561225c565b6001600160a01b038116611f7a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c49565b611244816122b6565b611f8b61225c565b6001600160a01b038b1660009081526003602052604090206001015415611fe55760405162461bcd60e51b815260206004820152600e60248201526d616c72656164792065786973747360901b6044820152606401610c49565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b038d1617905561162e8b8b8b8b8b8b8b8b8b8b8b612306565b6000600682815481106120585761205861331f565b600091825260208220600d909102019150600182015460ff16600381111561208257612082612dc6565b146120b95760405162461bcd60e51b81526020600482015260076024820152662141435449564560c81b6044820152606401610c49565b60005b600782015481101561219c576000808360070183815481106120e0576120e061331f565b6000918252602082200154600a8601546040516001600160a01b039092169290919081818185875af1925050503d8060008114612139576040519150601f19603f3d011682016040523d82523d6000602084013e61213e565b606091505b5091509150816121875760405162461bcd60e51b815260206004820152601460248201527332b93937b9103932b33ab73234b733903ab9b2b960611b6044820152606401610c49565b505080806121949061334b565b9150506120bc565b506004818101546005830154604051632142170760e11b8152309381019390935233602484015260448301526001600160a01b0316906342842e0e90606401600060405180830381600087803b1580156121f557600080fd5b505af1158015612209573d6000803e3d6000fd5b5050505060018101805460ff19166003179055612225826125c4565b6040518281527f9d434160922b3be2ebb540e22251e55f8a180264254d73b5e8179ad541997ace9060200160405180910390a15050565b6000546001600160a01b031633146112595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c49565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038b16600090815260036020819052604090912060018082018d90558154889360ff199091169190849081111561234657612346612dc6565b02179055506001600160a01b038b8116600090815260036020819052604090912090810180546001600160a01b03199081168d851617909155600282018b9055600482018a9055600582018054909116928916929092179091556006016123ad858261346b565b506001600160a01b038b1660009081526003602052604090206007016123d3848261346b565b506001600160a01b038b1660009081526003602052604090206008016123f9838261346b565b506001600160a01b038b16600090815260036020526040902060090181905561162e6111be565b6000600682815481106124355761243561331f565b90600052602060002090600d02019050600080612450610b05565b600785015491935091506000612467600183613398565b905060008033445a4289896001600081546124819061334b565b9182905550604080516001600160a01b0390981660208901528701959095526060860193909352608085019190915260a084015260c083015260e0820152610100016040516020818303038152906040528051906020012090508060001c915082820691508660070182815481106124fb576124fb61331f565b6000918252602090912001546006880180546001600160a01b039283166001600160a01b031990911681179091556001808a01805460ff191690911790556004808a015460058b0154604051632142170760e11b81523093810193909352602483019390935260448201929092529116906342842e0e90606401600060405180830381600087803b15801561258f57600080fd5b505af11580156125a3573d6000803e3d6000fd5b505050506125b188836127d7565b6125ba886125c4565b5050505050505050565b6000600682815481106125d9576125d961331f565b600091825260208083206004600d90930201828101546001600160a01b031684526003909152604090922090810154919250908015611edd57600060646008548361262491906133ab565b61262e91906133ca565b905061263a8183613398565b600584015460405191935060009182916001600160a01b03169085908381818185875af1925050503d806000811461268e576040519150601f19603f3d011682016040523d82523d6000602084013e612693565b606091505b5091509150816126e55760405162461bcd60e51b815260206004820152601860248201527f6572726f7220706179696e67206c697374696e672066656500000000000000006044820152606401610c49565b6040516000908190339086908381818185875af1925050503d8060008114612729576040519150601f19603f3d011682016040523d82523d6000602084013e61272e565b606091505b5091509150816127765760405162461bcd60e51b815260206004820152601360248201527232b93937b9103830bcb4b7339039b2b73232b960691b6044820152606401610c49565b600487015460085460408051338152602081019390935282018890526060820187905260808201527f071f2d4b1d1550e49d38fcf938a148069b8404c342e35f67f4ee5f0161b3800d9060a0015b60405180910390a1505050505050505050565b6000600683815481106127ec576127ec61331f565b60009182526020808320600b600d909302019182015460048301546001600160a01b031684526003909152604083206001015491935091908190819015612a395760048501546001600160a01b031660009081526003602052604090206001015460649061285a90866133ab565b61286491906133ca565b91506128708285613398565b60048601546001600160a01b03166000908152600360205260409020600201549093501561299b5760048501546001600160a01b03166000908152600360205260409020600201546064906128c590846133ab565b6128cf91906133ca565b90506128db8183613398565b60048601546001600160a01b03908116600090815260036020819052604080832090910154905193955090928392919091169084908381818185875af1925050503d8060008114612948576040519150601f19603f3d011682016040523d82523d6000602084013e61294d565b606091505b5091509150816129985760405162461bcd60e51b81526020600482015260166024820152756572726f7220706179696e6720726f79616c7469657360501b6044820152606401610c49565b50505b60025460405160009182916001600160a01b039091169085908381818185875af1925050503d80600081146129ec576040519150601f19603f3d011682016040523d82523d6000602084013e6129f1565b606091505b509150915081612a365760405162461bcd60e51b815260206004820152601060248201526f6572726f7220706179696e672066656560801b6044820152606401610c49565b50505b600985015460405160009182916001600160a01b039091169086908381818185875af1925050503d8060008114612a8c576040519150601f19603f3d011682016040523d82523d6000602084013e612a91565b606091505b509150915081612ad95760405162461bcd60e51b815260206004820152601360248201527232b93937b9103830bcb4b7339039b2b63632b960691b6044820152606401610c49565b6006870154604080518b815260208101889052908101869052606081018590526001600160a01b03909116608082015260a081018990527f2a11e2fb9c873ea5c7c3464b2fbd959556b3adc3bc600858302f23b4ac5baa199060c0016127c4565b604080516101a08101909152600080825260208201908152602001600081526020016000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001606081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215612c13579160200282015b82811115612c1357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612bde565b50612c1f929150612c23565b5090565b5b80821115612c1f5760008155600101612c24565b600060208284031215612c4a57600080fd5b5035919050565b6001600160a01b038116811461124457600080fd5b8035612c7181612c51565b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612ca757612ca7612c76565b604051601f8501601f19908116603f01168101908282118183101715612ccf57612ccf612c76565b81604052809350858152868686011115612ce857600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215612d1857600080fd5b8435612d2381612c51565b93506020850135612d3381612c51565b925060408501359150606085013567ffffffffffffffff811115612d5657600080fd5b8501601f81018713612d6757600080fd5b612d7687823560208401612c8c565b91505092959194509250565b803560048110612c7157600080fd5b60008060408385031215612da457600080fd5b8235612daf81612c51565b9150612dbd60208401612d82565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110612dfa57634e487b7160e01b600052602160045260246000fd5b9052565b600081518084526020808501945080840160005b83811015612e375781516001600160a01b031687529582019590820190600101612e12565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015612f5257603f1989840301855281516101a08151855288820151612e938a870182612ddc565b508782015185890152606080830151908601526080808301516001600160a01b03811682880152505060a0828101519086015260c0808301516001600160a01b03811682880152505060e0808301518282880152612ef383880182612dfe565b9250505061010080830151818701525061012080830151612f1e828801826001600160a01b03169052565b5050610140828101519086015261016080830151908601526101809182015191909401529386019390860190600101612e69565b509098975050505050505050565b600060208284031215612f7257600080fd5b8135612f7d81612c51565b9392505050565b6000815180845260005b81811015612faa57602081850181015186830182015201612f8e565b506000602082860101526020601f19601f83011685010191505092915050565b6000610140612fd9838e612ddc565b602083018c9052604083018b90526001600160a01b038a81166060850152608084018a9052881660a084015260c0830181905261301881840188612f84565b905082810360e084015261302c8187612f84565b90508281036101008401526130418186612f84565b915050826101208301529b9a5050505050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561309257835183529284019291840191600101613076565b50909695505050505050565b600080604083850312156130b157600080fd5b82359150612dbd60208401612d82565b8c815261018081016130d6602083018e612ddc565b604082019b909b5260608101999099526001600160a01b0397881660808a015260a089019690965293861660c088015260e08701929092529093166101008501526101208401929092526101408301919091526101609091015292915050565b6020808252825182820181905260009190848201906040850190845b818110156130925783516001600160a01b031683529284019291840191600101613152565b60006020828403121561318957600080fd5b612f7d82612d82565b600082601f8301126131a357600080fd5b612f7d83833560208501612c8c565b60008060008060008060008060008060006101608c8e0312156131d457600080fd5b6131dd8c612c66565b9a5060208c013599506131f260408d01612c66565b985060608c0135975060808c0135965061320e60a08d01612c66565b955061321c60c08d01612d82565b945067ffffffffffffffff8060e08e0135111561323857600080fd5b6132488e60e08f01358f01613192565b9450806101008e0135111561325c57600080fd5b61326d8e6101008f01358f01613192565b9350806101208e0135111561328157600080fd5b506132938d6101208e01358e01613192565b91506101408c013590509295989b509295989b9093969950565b60008060008060008060c087890312156132c657600080fd5b8635955060208701356132d881612c51565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6000806040838503121561331057600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161335d5761335d613335565b5060010190565b600181811c9082168061337857607f821691505b60208210810361112957634e487b7160e01b600052602260045260246000fd5b8181038181111561090357610903613335565b60008160001904831182151516156133c5576133c5613335565b500290565b6000826133e757634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561090357610903613335565b60006020828403121561341157600080fd5b8151612f7d81612c51565b601f82111561346657600081815260208120601f850160051c810160208610156134435750805b601f850160051c820191505b818110156134625782815560010161344f565b5050505b505050565b815167ffffffffffffffff81111561348557613485612c76565b613499816134938454613364565b8461341c565b602080601f8311600181146134ce57600084156134b65750858301515b600019600386901b1c1916600185901b178555613462565b600085815260208120601f198616915b828110156134fd578886015182559484019460019091019084016134de565b508582101561351b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea26469706673582212206786a5162e76c168bd01bda0704e4ed122ecd051fe3b346b31e8a02f4fea57d764736f6c63430008100033
Deployed ByteCode Sourcemap
28881:14718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29882:30;;;;;;;;;;-1:-1:-1;29882:30:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;472:32:1;;;454:51;;442:2;427:18;29882:30:0;;;;;;;;29919:32;;;;;;;;;;;;;;;;;;;662:25:1;;;650:2;635:18;29919:32:0;516:177:1;38120:164:0;;;;;;;;;;-1:-1:-1;38120:164:0;;;;;:::i;:::-;-1:-1:-1;;;38120:164:0;;;;;;;;;;-1:-1:-1;;;;;;2702:33:1;;;2684:52;;2672:2;2657:18;38120:164:0;2540:202:1;33950:665:0;;;;;;;;;;-1:-1:-1;33950:665:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29834:41::-;;;;;;;;;;-1:-1:-1;29834:41:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;32460:325::-;;;;;;;;;;;;;:::i;:::-;;;;8348:25:1;;;8404:2;8389:18;;8382:34;;;;8321:18;32460:325:0;8174:248:1;43475:121:0;;;;;;;;;;-1:-1:-1;43475:121:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33026:124::-;;;;;;;;;;;;;:::i;40575:396::-;;;;;;:::i;:::-;;:::i;:::-;;34623:779;;;;;;;;;;-1:-1:-1;34623:779:0;;;;;:::i;:::-;;:::i;41684:87::-;;;;;;;;;;-1:-1:-1;41684:87:0;;;;;:::i;:::-;;:::i;42940:529::-;;;;;;;;;;;;;:::i;29958:23::-;;;;;;;;;;-1:-1:-1;29958:23:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;33294:130::-;;;;;;;;;;;;;:::i;42503:383::-;;;;;;;;;;;;;:::i;27922:103::-;;;;;;;;;;;;;:::i;32900:118::-;;;;;;;;;;-1:-1:-1;32900:118:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32793:99::-;;;;;;;;;;;;;:::i;33432:510::-;;;;;;;;;;-1:-1:-1;33432:510:0;;;;;:::i;:::-;;:::i;41647:28::-;;;;;;;;;;;;;;;;31101:427;;;;;;;;;;-1:-1:-1;31101:427:0;;;;;:::i;:::-;;:::i;27274:87::-;;;;;;;;;;-1:-1:-1;27320:7:0;27347:6;-1:-1:-1;;;;;27347:6:0;27274:87;;33158:128;;;;;;;;;;;;;:::i;40478:89::-;;;;;;;;;;-1:-1:-1;40478:89:0;;;;;:::i;:::-;;:::i;35410:1529::-;;;;;;:::i;:::-;;:::i;36947:1165::-;;;;;;:::i;:::-;;:::i;32348:104::-;;;;;;;;;;-1:-1:-1;32348:104:0;;;;;:::i;:::-;;:::i;28180:201::-;;;;;;;;;;-1:-1:-1;28180:201:0;;;;;:::i;:::-;;:::i;30571:522::-;;;;;;;;;;-1:-1:-1;30571:522:0;;;;;:::i;:::-;;:::i;29882:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29882:30:0;;-1:-1:-1;29882:30:0;:::o;33950:665::-;34028:15;34055:10;;34076:212;34097:7;:14;34093:18;;34076:212;;;34155:3;-1:-1:-1;;;;;34137:21:0;:7;34145:1;34137:10;;;;;;;;:::i;:::-;;;;;;;;;:14;:10;;;;;:14;;-1:-1:-1;;;;;34137:14:0;:21;34178:8;34133:53;34226:1;34205:22;;;;;;;;:::i;:::-;:7;34213:1;34205:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;;;;:22;;;;;;;;:::i;:::-;;34246:8;34201:53;34269:7;;;;:::i;:::-;;;;34076:212;34113:3;;;;:::i;:::-;;;;34076:212;;;;34298:17;34331:5;34318:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;34298:39:0;-1:-1:-1;34348:6:0;;34365:224;34386:7;:14;34382:18;;34365:224;;;34444:3;-1:-1:-1;;;;;34426:21:0;:7;34434:1;34426:10;;;;;;;;:::i;:::-;;;;;;;;;:14;:10;;;;;:14;;-1:-1:-1;;;;;34426:14:0;:21;34467:8;34422:53;34515:1;34494:22;;;;;;;;:::i;:::-;:7;34502:1;34494:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;;;;:22;;;;;;;;:::i;:::-;;34535:8;34490:53;34567:7;34575:1;34567:10;;;;;;;;:::i;:::-;;;;;;;;;;;34558:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34558:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34558:19:0;;;;;;;;;;;;;;;;-1:-1:-1;;;34558:19:0;;;-1:-1:-1;;34558:19:0;;;;;;;;;;;;-1:-1:-1;;;;;34558:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:1;34560:3;;;;:::i;:::-;;;34558:6;;;;;;;;:::i;:::-;;;;;;:19;;;;34365:224;34402:3;;;;:::i;:::-;;;;34365:224;;;-1:-1:-1;34606:1:0;;-1:-1:-1;;;33950:665:0;;;;;:::o;29834:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29834:41:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32460:325::-;32501:4;;;;32628:16;32643:1;32628:12;:16;:::i;:::-;32600:45;32685:31;;;-1:-1:-1;32460:325:0;-1:-1:-1;;;32460:325:0:o;43475:121::-;-1:-1:-1;;;;;43569:19:0;;;;;;:13;:19;;;;;;;;;43562:26;;;;;;;;;;;;;;;;;43537:13;;43562:26;;;43569:19;43562:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43475:121;;;:::o;33026:124::-;33075:15;33109:33;33128:13;33109:18;:33::i;:::-;33102:40;;33026:124;:::o;40575:396::-;40639:9;;:13;40635:185;;40707:14;;:42;;40670:13;;;;-1:-1:-1;;;;;40707:14:0;;;;40735:9;;40670:13;40707:42;40670:13;40707:42;40735:9;40707:14;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40669:80;;;;40772:8;40764:44;;;;-1:-1:-1;;;40764:44:0;;15000:2:1;40764:44:0;;;14982:21:1;15039:2;15019:18;;;15012:30;15078:25;15058:18;;;15051:53;15121:18;;40764:44:0;;;;;;;;;40654:166;;40635:185;40832:21;40856:7;40864:9;40856:18;;;;;;;;:::i;:::-;;;;;;;;;40893:13;40856:18;;;;;40893:13;;;;40856:18;;-1:-1:-1;;;;;;40893:13:0;40910:10;40893:27;40885:49;;;;-1:-1:-1;;;40885:49:0;;15352:2:1;40885:49:0;;;15334:21:1;15391:1;15371:18;;;15364:29;-1:-1:-1;;;15409:18:1;;;15402:39;15458:18;;40885:49:0;15150:332:1;40885:49:0;40945:18;40953:9;40945:7;:18::i;:::-;40622:349;40575:396;:::o;34623:779::-;34699:15;34726:10;;34747:270;34768:7;:14;34764:18;;34747:270;;;34804:11;34818:7;34826:1;34818:10;;;;;;;;:::i;:::-;;;;;;;;;:14;:10;;;;;:14;;;;;-1:-1:-1;;;;;34818:14:0;34851:15;;;:10;:15;;;;;;;:24;;;34818:14;;-1:-1:-1;34851:36:0;;34847:68;;34907:8;;;34847:68;34955:1;34934:22;;;;;;;;:::i;:::-;:7;34942:1;34934:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;;;;:22;;;;;;;;:::i;:::-;;34930:53;;34975:8;;;34930:53;34998:7;;;;:::i;:::-;;;;34789:228;34747:270;34784:3;;;;:::i;:::-;;;;34747:270;;;;35027:17;35060:5;35047:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;35027:39:0;-1:-1:-1;35077:6:0;;35094:282;35115:7;:14;35111:18;;35094:282;;;35151:11;35165:7;35173:1;35165:10;;;;;;;;:::i;:::-;;;;;;;;;:14;:10;;;;;:14;;;;;-1:-1:-1;;;;;35165:14:0;35198:15;;;:10;:15;;;;;;;:24;;;35165:14;;-1:-1:-1;35198:36:0;;35194:68;;35254:8;;;35194:68;35302:1;35281:22;;;;;;;;:::i;:::-;:7;35289:1;35281:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;;;;:22;;;;;;;;:::i;:::-;;35277:53;;35322:8;;;35277:53;35354:7;35362:1;35354:10;;;;;;;;:::i;:::-;;;;;;;;;;;35345:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35345:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35345:19:0;;;;;;;;;;;;;;;;-1:-1:-1;;;35345:19:0;;;-1:-1:-1;;35345:19:0;;;;;;;;;;;;-1:-1:-1;;;;;35345:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:1;35347:3;;;;:::i;:::-;;;35345:6;;;;;;;;:::i;:::-;;;;;;:19;;;;35136:240;35094:282;35131:3;;;;:::i;:::-;;;;35094:282;;41684:87;27160:13;:11;:13::i;:::-;41745:11:::1;:18:::0;41684:87::o;42940:529::-;42996:4;43013:10;43039:14;43034:405;43071:7;:14;43059:26;;43034:405;;;43115:21;43139:7;43147:9;43139:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;43176:13:0;;;;;;:30;;;;;;;;:::i;:::-;;43172:61;;43225:8;;;43172:61;43270:6;:14;;;43252:15;:32;43248:63;;;43303:8;;;43248:63;43355:10;;;;;-1:-1:-1;;;;;43355:10:0;43326:15;43344:22;;;:10;:22;;;;;43409:11;;43391:15;;;;43344:22;;43424:3;;43391:29;;43409:11;43391:29;:::i;:::-;43390:37;;;;:::i;:::-;43381:46;;;;:::i;:::-;;;43100:339;;43034:405;43087:11;;;;:::i;:::-;;;;43034:405;;;-1:-1:-1;43456:5:0;42940:529;-1:-1:-1;42940:529:0:o;29958:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29958:23:0;;;;;;;;;-1:-1:-1;;;;;29958:23:0;;;;;;;;;;;;;;;;;;:::o;33294:130::-;33346:15;33380:36;33399:16;33380:18;:36::i;42503:383::-;42562:14;42557:322;42594:7;:14;42582:26;;42557:322;;;42638:21;42662:7;42670:9;42662:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;42699:13:0;;;;;;:30;;;;;;;;:::i;:::-;;42695:61;;42748:8;;;42695:61;42793:6;:14;;;42775:15;:32;42771:63;;;42826:8;;;42771:63;42849:18;42857:9;42849:7;:18::i;:::-;42623:256;42557:322;42610:11;;;;:::i;:::-;;;;42557:322;;;;42503:383::o;27922:103::-;27160:13;:11;:13::i;:::-;27987:30:::1;28014:1;27987:18;:30::i;:::-;27922:103::o:0;32900:118::-;32958:16;32993:7;33001:2;32993:11;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;32986:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32986:24:0;;;;;;;;;;;;;;;;;;;;;;32900:118;;;:::o;32793:99::-;32836:16;32871:13;32864:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32864:20:0;;;;;;;;;;;;;;;;;;;;;;;32793:99;:::o;33432:510::-;33491:15;33518:10;;33539:144;33560:7;:14;33556:18;;33539:144;;;33621:1;33600:22;;;;;;;;:::i;:::-;:7;33608:1;33600:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;;;;:22;;;;;;;;:::i;:::-;;33641:8;33596:53;33664:7;;;;:::i;:::-;;;;33539:144;33576:3;;;;:::i;:::-;;;;33539:144;;;;33693:17;33726:5;33713:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;33693:39:0;-1:-1:-1;33743:6:0;;33760:156;33781:7;:14;33777:18;;33760:156;;;33842:1;33821:22;;;;;;;;:::i;:::-;:7;33829:1;33821:10;;;;;;;;:::i;:::-;;;;;;;;;:17;:10;;;;;:17;;;;:22;;;;;;;;:::i;:::-;;33862:8;33817:53;33894:7;33902:1;33894:10;;;;;;;;:::i;:::-;;;;;;;;;;;33885:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33885:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33885:19:0;;;;;;;;;;;;;;;;-1:-1:-1;;;33885:19:0;;;-1:-1:-1;;33885:19:0;;;;;;;;;;;;-1:-1:-1;;;;;33885:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:1;33887:3;;;;:::i;:::-;;;33885:6;;;;;;;;:::i;:::-;;;;;;:19;;;;33760:156;33797:3;;;;:::i;:::-;;;;33760:156;;;-1:-1:-1;33933:1:0;;33432:510;-1:-1:-1;;;;33432:510:0:o;31101:427::-;27160:13;:11;:13::i;:::-;31375:145:::1;31380:3;31385;31390:19;31411:9;31435:11;31448:21;31471:6;31492:4;31498:7;31507:2;31511:8;31375:4;:145::i;:::-;31101:427:::0;;;;;;;;;;;:::o;33158:128::-;33209:15;33243:35;33262:15;33243:18;:35::i;40478:89::-;27160:13;:11;:13::i;:::-;40541:9:::1;:18:::0;40478:89::o;35410:1529::-;35572:1;35556:13;:17;35548:32;;;;-1:-1:-1;;;35548:32:0;;16214:2:1;35548:32:0;;;16196:21:1;16253:1;16233:18;;;16226:29;-1:-1:-1;;;16271:18:1;;;16264:32;16313:18;;35548:32:0;16012:325:1;35548:32:0;35608:5;35599:6;:14;35591:29;;;;-1:-1:-1;;;35591:29:0;;16544:2:1;35591:29:0;;;16526:21:1;16583:1;16563:18;;;16556:29;-1:-1:-1;;;16601:18:1;;;16594:32;16643:18;;35591:29:0;16342:325:1;35591:29:0;35648:1;35639:6;:10;35631:25;;;;-1:-1:-1;;;35631:25:0;;16874:2:1;35631:25:0;;;16856:21:1;16913:1;16893:18;;;16886:29;-1:-1:-1;;;16931:18:1;;;16924:32;16973:18;;35631:25:0;16672:325:1;35631:25:0;-1:-1:-1;;;;;35675:18:0;;35667:33;;;;-1:-1:-1;;;35667:33:0;;17204:2:1;35667:33:0;;;17186:21:1;17243:1;17223:18;;;17216:29;-1:-1:-1;;;17261:18:1;;;17254:32;17303:18;;35667:33:0;17002:325:1;35667:33:0;-1:-1:-1;;;;;35719:16:0;;35746:13;35719:16;;;:10;:16;;;;;;;:23;;;;:40;;;;;;;:::i;:::-;;35711:55;;;;-1:-1:-1;;;35711:55:0;;17534:2:1;35711:55:0;;;17516:21:1;17573:1;17553:18;;;17546:29;-1:-1:-1;;;17591:18:1;;;17584:32;17633:18;;35711:55:0;17332:325:1;35711:55:0;-1:-1:-1;;;;;35785:16:0;;;;;;:10;:16;;;;;:28;;;:33;;:78;;-1:-1:-1;;;;;;35822:16:0;;;;;;:10;:16;;;;;:28;;;35854:9;35822:41;35785:78;35777:93;;;;-1:-1:-1;;;35777:93:0;;17864:2:1;35777:93:0;;;17846:21:1;17903:1;17883:18;;;17876:29;-1:-1:-1;;;17921:18:1;;;17914:32;17963:18;;35777:93:0;17662:325:1;35777:93:0;35901:7;35889:8;:19;;:42;;;;;35924:7;35912:8;:19;;35889:42;35881:57;;;;-1:-1:-1;;;35881:57:0;;18194:2:1;35881:57:0;;;18176:21:1;18233:1;18213:18;;;18206:29;-1:-1:-1;;;18251:18:1;;;18244:32;18293:18;;35881:57:0;17992:325:1;35881:57:0;35977:16;;;35951:23;35977:16;;;36027:389;;;;;36050:7;:14;35977:16;;;36027:389;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36027:389:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36311:10;36027:389;;;;;;;;;;;;;;;;35977:16;;36027:389;;;36388:26;36406:8;36388:15;:26;:::i;:::-;36027:389;;36429:7;:20;;;;;;;;-1:-1:-1;36429:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36429:20:0;;;;;;-1:-1:-1;;36429:20:0;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;36429:20:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36429:20:0;;;-1:-1:-1;;;;;;36429:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36429:20:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36429:20:0;-1:-1:-1;;;;;36429:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36474:10;-1:-1:-1;36460:25:0;;;:13;:25;;;;;;;;36492:9;;36460:43;;-1:-1:-1;36460:43:0;;;;;;;;;;;;;;;36540:10;;;;36600:13;;;;36586:28;;-1:-1:-1;;;36586:28:0;;;;;662:25:1;;;;36540:10:0;36586:13;;;;;635:18:1;;36586:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36586:42:0;;36564:118;;;;-1:-1:-1;;;36564:118:0;;18780:2:1;36564:118:0;;;18762:21:1;18819:2;18799:18;;;18792:30;18858:28;18838:18;;;18831:56;18904:18;;36564:118:0;18578:350:1;36564:118:0;36743:13;;;;36693:64;;-1:-1:-1;;;36693:64:0;;36716:10;36693:64;;;19173:34:1;36736:4:0;19223:18:1;;;19216:43;19275:18;;;19268:34;;;;-1:-1:-1;;;;;36693:22:0;;;;;19108:18:1;;36693:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36773:89;36787:13;36802:4;36808:7;36817:6;36825;36850:1;36833:7;:14;;;;:18;;;;:::i;:::-;36773:89;;;19628:25:1;;;-1:-1:-1;;;;;19689:32:1;;;19684:2;19669:18;;19662:60;19738:18;;;19731:34;;;;19796:2;19781:18;;19774:34;19839:3;19824:19;;19817:35;19709:3;19868:19;;19861:35;19927:3;19912:19;;19905:35;;;19615:3;19600:19;36773:89:0;;;;;;;36875:26;:24;:26::i;:::-;35537:1402;;;35410:1529;;;;;;:::o;36947:1165::-;37015:21;37039:7;37047:9;37039:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;37076:13:0;;;;;;:30;;;;;;;;:::i;:::-;;37068:50;;;;-1:-1:-1;;;37068:50:0;;20153:2:1;37068:50:0;;;20135:21:1;20192:1;20172:18;;;20165:29;-1:-1:-1;;;20210:18:1;;;20203:37;20257:18;;37068:50:0;19951:330:1;37068:50:0;37165:6;37150;:12;;;:21;;;;:::i;:::-;37137:9;:34;;37129:62;;;;-1:-1:-1;;;37129:62:0;;20488:2:1;37129:62:0;;;20470:21:1;20527:2;20507:18;;;20500:30;-1:-1:-1;;;20546:18:1;;;20539:45;20601:18;;37129:62:0;20286:339:1;37129:62:0;37204:9;37233:6;37228:471;37249:6;37245:1;:10;37228:471;;;37278:12;;;:29;;;;;;;-1:-1:-1;37278:29:0;;;;;;;;;-1:-1:-1;;;;;;37278:29:0;37296:10;37278:29;;;37322:19;;;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;37367:12:0;;;;37359:20;;;;:::i;:::-;37433:12;;;:19;37454:12;;;;37399:71;;;20917:25:1;;;20973:2;20958:18;;20951:34;;;37422:9:0;21001:18:1;;;20994:34;;;;21059:2;21044:18;;21037:34;;;;21102:3;21087:19;;21080:35;21146:3;21131:19;;21124:35;;;37359:20:0;;-1:-1:-1;37399:71:0;;20904:3:1;20889:19;37399:71:0;;;;;;;37596:12;;;;37573;;;:19;:35;37569:119;;37629:19;37638:9;37629:8;:19::i;:::-;37667:5;;37569:119;37257:4;;;;:::i;:::-;;;;37228:471;;;;37728:4;37711:6;:13;;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;37768:1:0;;-1:-1:-1;37749:16:0;37761:4;37749:9;:16;:::i;:::-;:20;37745:291;;;37815:12;;37850:10;37874:16;37886:4;37874:9;:16;:::i;:::-;37850:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37814:81;;;;37918:7;37910:41;;;;-1:-1:-1;;;37910:41:0;;21372:2:1;37910:41:0;;;21354:21:1;21411:2;21391:18;;;21384:30;-1:-1:-1;;;21430:18:1;;;21423:51;21491:18;;37910:41:0;21170:345:1;37910:41:0;37971:53;37978:10;37990:9;38001:4;38007:16;38001:4;37990:9;38007:16;:::i;:::-;37971:53;;;-1:-1:-1;;;;;21769:32:1;;;21751:51;;21833:2;21818:18;;21811:34;;;;21861:18;;;21854:34;21919:2;21904:18;;21897:34;21738:3;21723:19;37971:53:0;;;;;;;37771:265;;37745:291;38048:26;:24;:26::i;:::-;37004:1108;;36947:1165;;:::o;32348:104::-;27160:13;:11;:13::i;:::-;32419:14:::1;:25:::0;;-1:-1:-1;;;;;;32419:25:0::1;-1:-1:-1::0;;;;;32419:25:0;;;::::1;::::0;;;::::1;::::0;;32348:104::o;28180:201::-;27160:13;:11;:13::i;:::-;-1:-1:-1;;;;;28269:22:0;::::1;28261:73;;;::::0;-1:-1:-1;;;28261:73:0;;22144:2:1;28261:73:0::1;::::0;::::1;22126:21:1::0;22183:2;22163:18;;;22156:30;22222:34;22202:18;;;22195:62;-1:-1:-1;;;22273:18:1;;;22266:36;22319:19;;28261:73:0::1;21942:402:1::0;28261:73:0::1;28345:28;28364:8;28345:18;:28::i;30571:522::-:0;27160:13;:11;:13::i;:::-;-1:-1:-1;;;;;30852:15:0;::::1;;::::0;;;:10:::1;:15;::::0;;;;:19:::1;;::::0;:24;30844:51:::1;;;::::0;-1:-1:-1;;;30844:51:0;;22551:2:1;30844:51:0::1;::::0;::::1;22533:21:1::0;22590:2;22570:18;;;22563:30;-1:-1:-1;;;22609:18:1;;;22602:44;22663:18;;30844:51:0::1;22349:338:1::0;30844:51:0::1;30906:13;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;30906:23:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;30906:23:0::1;-1:-1:-1::0;;;;;30906:23:0;::::1;;::::0;;30940:145:::1;30906:23:::0;30950:3;30955:19;30976:9;31000:11;31013:21;31036:6;31057:4;31063:7;31072:2;31076:8;30940:4:::1;:145::i;40983:656::-:0;41036:21;41060:7;41068:9;41060:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;41097:13:0;;;;;;:30;;;;;;;;:::i;:::-;;41089:50;;;;-1:-1:-1;;;41089:50:0;;20153:2:1;41089:50:0;;;20135:21:1;20192:1;20172:18;;;20165:29;-1:-1:-1;;;20210:18:1;;;20203:37;20257:18;;41089:50:0;19951:330:1;41089:50:0;41155:6;41150:274;41171:12;;;:19;41167:23;;41150:274;;;41276:12;41290:17;41311:6;:12;;41324:1;41311:15;;;;;;;;:::i;:::-;;;;;;;;;;41340:12;;;;41311:46;;-1:-1:-1;;;;;41311:15:0;;;;41340:12;;41311:46;;:15;:46;41340:12;41311:15;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41275:82;;;;41380:7;41372:40;;;;-1:-1:-1;;;41372:40:0;;22894:2:1;41372:40:0;;;22876:21:1;22933:2;22913:18;;;22906:30;-1:-1:-1;;;22952:18:1;;;22945:50;23012:18;;41372:40:0;22692:344:1;41372:40:0;41198:226;;41192:4;;;;;:::i;:::-;;;;41150:274;;;-1:-1:-1;41454:10:0;;;;;41510:13;;;;41446:78;;-1:-1:-1;;;41446:78:0;;41491:4;41446:78;;;19173:34:1;;;;41498:10:0;19223:18:1;;;19216:43;19275:18;;;19268:34;-1:-1:-1;;;;;41454:10:0;;41446:36;;19108:18:1;;41446:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;41535:13:0;;;:30;;-1:-1:-1;;41535:30:0;41551:14;41535:30;;;41576:22;41588:9;41576:11;:22::i;:::-;41614:17;;662:25:1;;;41614:17:0;;650:2:1;635:18;41614:17:0;;;;;;;41025:614;40983:656;:::o;27439:132::-;27320:7;27347:6;-1:-1:-1;;;;;27347:6:0;25905:10;27503:23;27495:68;;;;-1:-1:-1;;;27495:68:0;;23243:2:1;27495:68:0;;;23225:21:1;;;23262:18;;;23255:30;23321:34;23301:18;;;23294:62;23373:18;;27495:68:0;23041:356:1;28541:191:0;28615:16;28634:6;;-1:-1:-1;;;;;28651:17:0;;;-1:-1:-1;;;;;;28651:17:0;;;;;;28684:40;;28634:6;;;;;;;28684:40;;28615:16;28684:40;28604:128;28541:191;:::o;31536:804::-;-1:-1:-1;;;;;31796:15:0;;;;;;:10;:15;;;;;;;;:19;;;;:25;;;31832:31;;31857:6;;-1:-1:-1;;31832:31:0;;;;31796:19;31857:6;;31832:31;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;31874:15:0;;;;;;;:10;:15;;;;;;;;:35;;;:57;;-1:-1:-1;;;;;;31874:57:0;;;;;;;;;;31942:25;;;:37;;;31990:27;;;:41;;;32042:37;;;:61;;;;;;;;;;;;;;;32114:20;;:27;32137:4;32114:20;:27;:::i;:::-;-1:-1:-1;;;;;;32152:15:0;;;;;;:10;:15;;;;;:23;;:33;32178:7;32152:23;:33;:::i;:::-;-1:-1:-1;;;;;;32196:15:0;;;;;;:10;:15;;;;;:18;;:23;32217:2;32196:18;:23;:::i;:::-;-1:-1:-1;;;;;;32230:15:0;;;;;;:10;:15;;;;;:24;;:35;;;32278:26;:24;:26::i;38292:975::-;38382:21;38406:7;38414:9;38406:18;;;;;;;;:::i;:::-;;;;;;;;;;;38382:42;;38436:25;38463:26;38493:10;:8;:10::i;:::-;38527:12;;;:19;38435:68;;-1:-1:-1;38435:68:0;-1:-1:-1;38514:10:0;38572:9;38580:1;38527:19;38572:9;:::i;:::-;38557:24;;38592:21;38624:19;38667:10;38679:16;38697:9;38721:15;38738:20;38760:18;38782:9;;38780:11;;;;;:::i;:::-;;;;;-1:-1:-1;38656:136:0;;;-1:-1:-1;;;;;25939:32:1;;;38656:136:0;;;25921:51:1;25988:18;;25981:34;;;;26031:18;;;26024:34;;;;26074:18;;;26067:34;;;;26117:19;;;26110:35;26161:19;;;26154:35;26205:19;;;26198:35;25893:19;;38656:136:0;;;;;;;;;;;;38646:147;;;;;;38624:169;;38828:11;38820:20;;38804:36;;38897:4;38882:13;38878:24;38861:41;;38929:6;:12;;38942:13;38929:27;;;;;;;;:::i;:::-;;;;;;;;;;;38913:13;;;:43;;-1:-1:-1;;;;;38929:27:0;;;-1:-1:-1;;;;;;38913:43:0;;;;;;;;-1:-1:-1;38967:13:0;;;:31;;-1:-1:-1;;38967:31:0;;;;;;39108:10;;;;;-1:-1:-1;39167:13:0;;;39100:81;;-1:-1:-1;;;39100:81:0;;39145:4;39100:81;;;19173:34:1;;;;19223:18;;;19216:43;;;;19275:18;;;19268:34;;;;39108:10:0;;;39100:36;;19108:18:1;;39100:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39192:34;39201:9;39212:13;39192:8;:34::i;:::-;39237:22;39249:9;39237:11;:22::i;:::-;38335:932;;;;;;;38292:975;:::o;41779:716::-;41836:21;41860:7;41868:9;41860:18;;;;;;;;:::i;:::-;;;;;;;;;41918:10;41860:18;;;;;41918:10;;;;-1:-1:-1;;;;;41918:10:0;41907:22;;:10;:22;;;;;;;41951:15;;;;41860:18;;-1:-1:-1;41907:22:0;41981:7;;41977:511;;42005:15;42045:3;42030:11;;42024:3;:17;;;;:::i;:::-;42023:25;;;;:::i;:::-;42005:43;-1:-1:-1;42063:17:0;42005:43;42063:17;;:::i;:::-;42133:25;;;;:47;;42063:17;;-1:-1:-1;42096:13:0;;;;-1:-1:-1;;;;;42133:25:0;;42063:17;;42096:13;42133:47;42096:13;42133:47;42063:17;42133:25;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42095:85;;;;42203:8;42195:45;;;;-1:-1:-1;;;42195:45:0;;26446:2:1;42195:45:0;;;26428:21:1;26485:2;26465:18;;;26458:30;26524:26;26504:18;;;26497:54;26568:18;;42195:45:0;26244:348:1;42195:45:0;42293:39;;42256:13;;;;42293:10;;42317;;42256:13;42293:39;42256:13;42293:39;42317:10;42293;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42255:77;;;;42355:8;42347:40;;;;-1:-1:-1;;;42347:40:0;;26799:2:1;42347:40:0;;;26781:21:1;26838:2;26818:18;;;26811:30;-1:-1:-1;;;26857:18:1;;;26850:49;26916:18;;42347:40:0;26597:343:1;42347:40:0;42430:15;;;;42464:11;;42407:69;;;42418:10;27204:51:1;;27286:2;27271:18;;27264:34;;;;27314:18;;27307:34;;;27372:2;27357:18;;27350:34;;;27415:3;27400:19;;27393:35;42407:69:0;;27191:3:1;27176:19;42407:69:0;;;;;;;;41990:498;;;;;41825:670;;;41779:716;:::o;39275:1128::-;39349:21;39373:7;39381:9;39373:18;;;;;;;;:::i;:::-;;;;;;;;;39415:13;39373:18;;;;;39415:13;;;;39532:10;;;;-1:-1:-1;;;;;39532:10:0;39521:22;;:10;:22;;;;;;39532:10;39521:26;;39373:18;;-1:-1:-1;39415:13:0;39373:18;;;;;39521:30;39517:656;;39594:10;;;;-1:-1:-1;;;;;39594:10:0;39583:22;;;;:10;:22;;;;;39594:10;39583:26;;39613:3;;39575:34;;:5;:34;:::i;:::-;39574:42;;;;:::i;:::-;39568:48;-1:-1:-1;39640:11:0;39568:48;39640:5;:11;:::i;:::-;39681:10;;;;-1:-1:-1;;;;;39681:10:0;39705:1;39670:22;;;:10;:22;;;;;:32;;;39631:20;;-1:-1:-1;39670:36:0;39666:356;;39757:10;;;;-1:-1:-1;;;;;39757:10:0;39746:22;;;;:10;:22;;;;;:32;;;39782:3;;39740:38;;:3;:38;:::i;:::-;39739:46;;;;:::i;:::-;39727:58;-1:-1:-1;39804:16:0;39727:58;39804:16;;:::i;:::-;39886:10;;;;-1:-1:-1;;;;;39886:10:0;;;39840:12;39875:22;;;:10;:22;;;;;;;;:42;;;;:70;;39804:16;;-1:-1:-1;39840:12:0;;;;39875:42;;;;;39931:9;;39840:12;39875:70;39840:12;39875:70;39931:9;39875:42;:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39839:106;;;;39972:7;39964:42;;;;-1:-1:-1;;;39964:42:0;;27641:2:1;39964:42:0;;;27623:21:1;27680:2;27660:18;;;27653:30;-1:-1:-1;;;27699:18:1;;;27692:52;27761:18;;39964:42:0;27439:346:1;39964:42:0;39708:314;;39666:356;40074:14;;:36;;40039:12;;;;-1:-1:-1;;;;;40074:14:0;;;;40102:3;;40039:12;40074:36;40039:12;40074:36;40102:3;40074:14;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40038:72;;;;40133:7;40125:36;;;;-1:-1:-1;;;40125:36:0;;27992:2:1;40125:36:0;;;27974:21:1;28031:2;28011:18;;;28004:30;-1:-1:-1;;;28050:18:1;;;28043:46;28106:18;;40125:36:0;27790:340:1;40125:36:0;39553:620;;39517:656;40219:13;;;;:38;;40184:12;;;;-1:-1:-1;;;;;40219:13:0;;;;40246:6;;40184:12;40219:38;40184:12;40219:38;40246:6;40219:13;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40183:74;;;;40276:7;40268:39;;;;-1:-1:-1;;;40268:39:0;;28337:2:1;40268:39:0;;;28319:21:1;28376:2;28356:18;;;28349:30;-1:-1:-1;;;28395:18:1;;;28388:49;28454:18;;40268:39:0;28135:343:1;40268:39:0;40366:13;;;;40323:72;;;28770:25:1;;;28826:2;28811:18;;28804:34;;;28854:18;;;28847:34;;;28912:2;28897:18;;28890:34;;;-1:-1:-1;;;;;40366:13:0;;;28955:3:1;28940:19;;28933:61;28981:3;29010:19;;29003:35;;;40323:72:0;;28757:3:1;28742:19;40323:72:0;28483:561:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;698:131::-;-1:-1:-1;;;;;773:31:1;;763:42;;753:70;;819:1;816;809:12;834:134;902:20;;931:31;902:20;931:31;:::i;:::-;834:134;;;:::o;973:127::-;1034:10;1029:3;1025:20;1022:1;1015:31;1065:4;1062:1;1055:15;1089:4;1086:1;1079:15;1105:631;1169:5;1199:18;1240:2;1232:6;1229:14;1226:40;;;1246:18;;:::i;:::-;1321:2;1315:9;1289:2;1375:15;;-1:-1:-1;;1371:24:1;;;1397:2;1367:33;1363:42;1351:55;;;1421:18;;;1441:22;;;1418:46;1415:72;;;1467:18;;:::i;:::-;1507:10;1503:2;1496:22;1536:6;1527:15;;1566:6;1558;1551:22;1606:3;1597:6;1592:3;1588:16;1585:25;1582:45;;;1623:1;1620;1613:12;1582:45;1673:6;1668:3;1661:4;1653:6;1649:17;1636:44;1728:1;1721:4;1712:6;1704;1700:19;1696:30;1689:41;;;;1105:631;;;;;:::o;1741:794::-;1836:6;1844;1852;1860;1913:3;1901:9;1892:7;1888:23;1884:33;1881:53;;;1930:1;1927;1920:12;1881:53;1969:9;1956:23;1988:31;2013:5;1988:31;:::i;:::-;2038:5;-1:-1:-1;2095:2:1;2080:18;;2067:32;2108:33;2067:32;2108:33;:::i;:::-;2160:7;-1:-1:-1;2214:2:1;2199:18;;2186:32;;-1:-1:-1;2269:2:1;2254:18;;2241:32;2296:18;2285:30;;2282:50;;;2328:1;2325;2318:12;2282:50;2351:22;;2404:4;2396:13;;2392:27;-1:-1:-1;2382:55:1;;2433:1;2430;2423:12;2382:55;2456:73;2521:7;2516:2;2503:16;2498:2;2494;2490:11;2456:73;:::i;:::-;2446:83;;;1741:794;;;;;;;:::o;2747:147::-;2819:20;;2868:1;2858:12;;2848:40;;2884:1;2881;2874:12;2899:335;2977:6;2985;3038:2;3026:9;3017:7;3013:23;3009:32;3006:52;;;3054:1;3051;3044:12;3006:52;3093:9;3080:23;3112:31;3137:5;3112:31;:::i;:::-;3162:5;-1:-1:-1;3186:42:1;3224:2;3209:18;;3186:42;:::i;:::-;3176:52;;2899:335;;;;;:::o;3239:127::-;3300:10;3295:3;3291:20;3288:1;3281:31;3331:4;3328:1;3321:15;3355:4;3352:1;3345:15;3371:234;3449:1;3442:5;3439:12;3429:143;;3494:10;3489:3;3485:20;3482:1;3475:31;3529:4;3526:1;3519:15;3557:4;3554:1;3547:15;3429:143;3581:18;;3371:234::o;3610:461::-;3663:3;3701:5;3695:12;3728:6;3723:3;3716:19;3754:4;3783:2;3778:3;3774:12;3767:19;;3820:2;3813:5;3809:14;3841:1;3851:195;3865:6;3862:1;3859:13;3851:195;;;3930:13;;-1:-1:-1;;;;;3926:39:1;3914:52;;3986:12;;;;4021:15;;;;3962:1;3880:9;3851:195;;;-1:-1:-1;4062:3:1;;3610:461;-1:-1:-1;;;;;3610:461:1:o;4076:2257::-;4266:4;4295:2;4335;4324:9;4320:18;4365:2;4354:9;4347:21;4388:6;4423;4417:13;4454:6;4446;4439:22;4480:2;4470:12;;4513:2;4502:9;4498:18;4491:25;;4575:2;4565:6;4562:1;4558:14;4547:9;4543:30;4539:39;4613:2;4605:6;4601:15;4634:1;4644:1660;4658:6;4655:1;4652:13;4644:1660;;;4751:2;4747:7;4735:9;4727:6;4723:22;4719:36;4714:3;4707:49;4785:6;4779:13;4815:6;4855:2;4849:9;4841:6;4834:25;4906:2;4902;4898:11;4892:18;4923:53;4972:2;4964:6;4960:15;4946:12;4923:53;:::i;:::-;-1:-1:-1;5019:11:1;;;5013:18;4996:15;;;4989:43;5055:4;5102:11;;;5096:18;5079:15;;;5072:43;5138:4;5183:11;;;5177:18;-1:-1:-1;;;;;265:31:1;;5243:15;;;253:44;-1:-1:-1;;5282:4:1;5329:11;;;5323:18;5306:15;;;5299:43;5365:4;5410:11;;;5404:18;-1:-1:-1;;;;;265:31:1;;5470:15;;;253:44;5435:51;;5509:4;5562:2;5558;5554:11;5548:18;5603:2;5598;5590:6;5586:15;5579:27;5633:61;5690:2;5682:6;5678:15;5662:14;5633:61;:::i;:::-;5619:75;;;;5718:6;5776:3;5772:2;5768:12;5762:19;5756:3;5748:6;5744:16;5737:45;;5806:6;5861:3;5857:2;5853:12;5847:19;5879:52;5926:3;5918:6;5914:16;5898:14;-1:-1:-1;;;;;265:31:1;253:44;;199:104;5879:52;-1:-1:-1;;5955:6:1;6005:12;;;5999:19;5981:16;;;5974:45;6043:6;6093:12;;;6087:19;6069:16;;;6062:45;6131:6;6181:12;;;6175:19;6157:16;;;;6150:45;6282:12;;;;6247:15;;;;4680:1;4673:9;4644:1660;;;-1:-1:-1;6321:6:1;;4076:2257;-1:-1:-1;;;;;;;;4076:2257:1:o;6338:247::-;6397:6;6450:2;6438:9;6429:7;6425:23;6421:32;6418:52;;;6466:1;6463;6456:12;6418:52;6505:9;6492:23;6524:31;6549:5;6524:31;:::i;:::-;6574:5;6338:247;-1:-1:-1;;;6338:247:1:o;6590:423::-;6632:3;6670:5;6664:12;6697:6;6692:3;6685:19;6722:1;6732:162;6746:6;6743:1;6740:13;6732:162;;;6808:4;6864:13;;;6860:22;;6854:29;6836:11;;;6832:20;;6825:59;6761:12;6732:162;;;6736:3;6939:1;6932:4;6923:6;6918:3;6914:16;6910:27;6903:38;7002:4;6995:2;6991:7;6986:2;6978:6;6974:15;6970:29;6965:3;6961:39;6957:50;6950:57;;;6590:423;;;;:::o;7018:1151::-;7430:4;7459:3;7471:41;7502:9;7494:6;7471:41;:::i;:::-;7543:2;7528:18;;7521:34;;;7586:2;7571:18;;7564:34;;;-1:-1:-1;;;;;7672:15:1;;;7667:2;7652:18;;7645:43;7719:3;7704:19;;7697:35;;;7769:15;;7625:3;7748:19;;7741:44;7816:3;7801:19;;7794:31;;;7848:45;7874:18;;;7866:6;7848:45;:::i;:::-;7834:59;;7942:9;7934:6;7930:22;7924:3;7913:9;7909:19;7902:51;7976:33;8002:6;7994;7976:33;:::i;:::-;7962:47;;8058:9;8050:6;8046:22;8040:3;8029:9;8025:19;8018:51;8086:33;8112:6;8104;8086:33;:::i;:::-;8078:41;;;8156:6;8150:3;8139:9;8135:19;8128:35;7018:1151;;;;;;;;;;;;;:::o;8427:632::-;8598:2;8650:21;;;8720:13;;8623:18;;;8742:22;;;8569:4;;8598:2;8821:15;;;;8795:2;8780:18;;;8569:4;8864:169;8878:6;8875:1;8872:13;8864:169;;;8939:13;;8927:26;;9008:15;;;;8973:12;;;;8900:1;8893:9;8864:169;;;-1:-1:-1;9050:3:1;;8427:632;-1:-1:-1;;;;;;8427:632:1:o;9064:268::-;9142:6;9150;9203:2;9191:9;9182:7;9178:23;9174:32;9171:52;;;9219:1;9216;9209:12;9171:52;9255:9;9242:23;9232:33;;9284:42;9322:2;9311:9;9307:18;9284:42;:::i;9337:1060::-;9802:25;;;9789:3;9774:19;;9836:50;9882:2;9867:18;;9859:6;9836:50;:::i;:::-;9917:2;9902:18;;9895:34;;;;9960:2;9945:18;;9938:34;;;;-1:-1:-1;;;;;10047:15:1;;;10041:3;10026:19;;10019:44;9999:3;10079:19;;10072:35;;;;10144:15;;;10138:3;10123:19;;10116:44;10191:3;10176:19;;10169:35;;;;10241:15;;;10235:3;10220:19;;10213:44;10288:3;10273:19;;10266:35;;;;10332:3;10317:19;;10310:36;;;;10377:3;10362:19;;;10355:36;9337:1060;;-1:-1:-1;;9337:1060:1:o;10402:658::-;10573:2;10625:21;;;10695:13;;10598:18;;;10717:22;;;10544:4;;10573:2;10796:15;;;;10770:2;10755:18;;;10544:4;10839:195;10853:6;10850:1;10847:13;10839:195;;;10918:13;;-1:-1:-1;;;;;10914:39:1;10902:52;;11009:15;;;;10974:12;;;;10950:1;10868:9;10839:195;;11065:200;11134:6;11187:2;11175:9;11166:7;11162:23;11158:32;11155:52;;;11203:1;11200;11193:12;11155:52;11226:33;11249:9;11226:33;:::i;11270:221::-;11313:5;11366:3;11359:4;11351:6;11347:17;11343:27;11333:55;;11384:1;11381;11374:12;11333:55;11406:79;11481:3;11472:6;11459:20;11452:4;11444:6;11440:17;11406:79;:::i;11496:1317::-;11685:6;11693;11701;11709;11717;11725;11733;11741;11749;11757;11765:7;11819:3;11807:9;11798:7;11794:23;11790:33;11787:53;;;11836:1;11833;11826:12;11787:53;11859:29;11878:9;11859:29;:::i;:::-;11849:39;;11935:2;11924:9;11920:18;11907:32;11897:42;;11958:38;11992:2;11981:9;11977:18;11958:38;:::i;:::-;11948:48;;12043:2;12032:9;12028:18;12015:32;12005:42;;12094:3;12083:9;12079:19;12066:33;12056:43;;12118:39;12152:3;12141:9;12137:19;12118:39;:::i;:::-;12108:49;;12176:43;12214:3;12203:9;12199:19;12176:43;:::i;:::-;12166:53;;12238:18;12306:2;12299:3;12288:9;12284:19;12271:33;12268:41;12265:61;;;12322:1;12319;12312:12;12265:61;12345:77;12414:7;12406:3;12395:9;12391:19;12378:33;12367:9;12363:49;12345:77;:::i;:::-;12335:87;;12472:2;12465:3;12454:9;12450:19;12437:33;12434:41;12431:61;;;12488:1;12485;12478:12;12431:61;12511:77;12580:7;12572:3;12561:9;12557:19;12544:33;12533:9;12529:49;12511:77;:::i;:::-;12501:87;;12638:2;12631:3;12620:9;12616:19;12603:33;12600:41;12597:61;;;12654:1;12651;12644:12;12597:61;;12677:77;12746:7;12738:3;12727:9;12723:19;12710:33;12699:9;12695:49;12677:77;:::i;:::-;12667:87;;12802:3;12791:9;12787:19;12774:33;12763:44;;11496:1317;;;;;;;;;;;;;;:::o;12818:590::-;12922:6;12930;12938;12946;12954;12962;13015:3;13003:9;12994:7;12990:23;12986:33;12983:53;;;13032:1;13029;13022:12;12983:53;13068:9;13055:23;13045:33;;13128:2;13117:9;13113:18;13100:32;13141:31;13166:5;13141:31;:::i;:::-;12818:590;;13191:5;;-1:-1:-1;;;;13243:2:1;13228:18;;13215:32;;13294:2;13279:18;;13266:32;;13345:3;13330:19;;13317:33;;-1:-1:-1;13397:3:1;13382:19;;;13369:33;;-1:-1:-1;12818:590:1:o;13413:248::-;13481:6;13489;13542:2;13530:9;13521:7;13517:23;13513:32;13510:52;;;13558:1;13555;13548:12;13510:52;-1:-1:-1;;13581:23:1;;;13651:2;13636:18;;;13623:32;;-1:-1:-1;13413:248:1:o;13666:127::-;13727:10;13722:3;13718:20;13715:1;13708:31;13758:4;13755:1;13748:15;13782:4;13779:1;13772:15;13798:127;13859:10;13854:3;13850:20;13847:1;13840:31;13890:4;13887:1;13880:15;13914:4;13911:1;13904:15;13930:135;13969:3;13990:17;;;13987:43;;14010:18;;:::i;:::-;-1:-1:-1;14057:1:1;14046:13;;13930:135::o;14070:380::-;14149:1;14145:12;;;;14192;;;14213:61;;14267:4;14259:6;14255:17;14245:27;;14213:61;14320:2;14312:6;14309:14;14289:18;14286:38;14283:161;;14366:10;14361:3;14357:20;14354:1;14347:31;14401:4;14398:1;14391:15;14429:4;14426:1;14419:15;14455:128;14522:9;;;14543:11;;;14540:37;;;14557:18;;:::i;15487:168::-;15527:7;15593:1;15589;15585:6;15581:14;15578:1;15575:21;15570:1;15563:9;15556:17;15552:45;15549:71;;;15600:18;;:::i;:::-;-1:-1:-1;15640:9:1;;15487:168::o;15660:217::-;15700:1;15726;15716:132;;15770:10;15765:3;15761:20;15758:1;15751:31;15805:4;15802:1;15795:15;15833:4;15830:1;15823:15;15716:132;-1:-1:-1;15862:9:1;;15660:217::o;15882:125::-;15947:9;;;15968:10;;;15965:36;;;15981:18;;:::i;18322:251::-;18392:6;18445:2;18433:9;18424:7;18420:23;18416:32;18413:52;;;18461:1;18458;18451:12;18413:52;18493:9;18487:16;18512:31;18537:5;18512:31;:::i;23528:545::-;23630:2;23625:3;23622:11;23619:448;;;23666:1;23691:5;23687:2;23680:17;23736:4;23732:2;23722:19;23806:2;23794:10;23790:19;23787:1;23783:27;23777:4;23773:38;23842:4;23830:10;23827:20;23824:47;;;-1:-1:-1;23865:4:1;23824:47;23920:2;23915:3;23911:12;23908:1;23904:20;23898:4;23894:31;23884:41;;23975:82;23993:2;23986:5;23983:13;23975:82;;;24038:17;;;24019:1;24008:13;23975:82;;;23979:3;;;23619:448;23528:545;;;:::o;24249:1352::-;24375:3;24369:10;24402:18;24394:6;24391:30;24388:56;;;24424:18;;:::i;:::-;24453:97;24543:6;24503:38;24535:4;24529:11;24503:38;:::i;:::-;24497:4;24453:97;:::i;:::-;24605:4;;24669:2;24658:14;;24686:1;24681:663;;;;25388:1;25405:6;25402:89;;;-1:-1:-1;25457:19:1;;;25451:26;25402:89;-1:-1:-1;;24206:1:1;24202:11;;;24198:24;24194:29;24184:40;24230:1;24226:11;;;24181:57;25504:81;;24651:944;;24681:663;23475:1;23468:14;;;23512:4;23499:18;;-1:-1:-1;;24717:20:1;;;24835:236;24849:7;24846:1;24843:14;24835:236;;;24938:19;;;24932:26;24917:42;;25030:27;;;;24998:1;24986:14;;;;24865:19;;24835:236;;;24839:3;25099:6;25090:7;25087:19;25084:201;;;25160:19;;;25154:26;-1:-1:-1;;25243:1:1;25239:14;;;25255:3;25235:24;25231:37;25227:42;25212:58;25197:74;;25084:201;-1:-1:-1;;;;;25331:1:1;25315:14;;;25311:22;25298:36;;-1:-1:-1;24249:1352:1:o
Swarm Source
ipfs://6786a5162e76c168bd01bda0704e4ed122ecd051fe3b346b31e8a02f4fea57d7
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.