Polygon Sponsored slots available. Book your slot here!
ERC-20
Overview
Max Total Supply
170,358.952165366924580605 SDS
Holders
548
Market
Price
$0.01 @ 0.005465 MATIC
Onchain Market Cap
$934.49
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.02561837252594044 SDSValue
$0.00 ( ~0 MATIC) [0.0000%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Share
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-13 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /* * @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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Interface of the ERC777Token standard as defined in the EIP. * * This contract uses the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let * token holders and recipients react to token movements by using setting implementers * for the associated interfaces in said registry. See {IERC1820Registry} and * {ERC1820Implementer}. */ interface IERC777 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view returns (string memory); /** * @dev Returns the smallest part of the token that is not divisible. This * means all token operations (creation, movement and destruction) must have * amounts that are a multiple of this number. * * For most token contracts, this value will equal 1. */ function granularity() external view returns (uint256); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by an account (`owner`). */ function balanceOf(address owner) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * If send or receive hooks are registered for the caller and `recipient`, * the corresponding functions will be called with `data` and empty * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. * * Emits a {Sent} event. * * Requirements * * - the caller must have at least `amount` tokens. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ function send( address recipient, uint256 amount, bytes calldata data ) external; /** * @dev Destroys `amount` tokens from the caller's account, reducing the * total supply. * * If a send hook is registered for the caller, the corresponding function * will be called with `data` and empty `operatorData`. See {IERC777Sender}. * * Emits a {Burned} event. * * Requirements * * - the caller must have at least `amount` tokens. */ function burn(uint256 amount, bytes calldata data) external; /** * @dev Returns true if an account is an operator of `tokenHolder`. * Operators can send and burn tokens on behalf of their owners. All * accounts are their own operator. * * See {operatorSend} and {operatorBurn}. */ function isOperatorFor(address operator, address tokenHolder) external view returns (bool); /** * @dev Make an account an operator of the caller. * * See {isOperatorFor}. * * Emits an {AuthorizedOperator} event. * * Requirements * * - `operator` cannot be calling address. */ function authorizeOperator(address operator) external; /** * @dev Revoke an account's operator status for the caller. * * See {isOperatorFor} and {defaultOperators}. * * Emits a {RevokedOperator} event. * * Requirements * * - `operator` cannot be calling address. */ function revokeOperator(address operator) external; /** * @dev Returns the list of default operators. These accounts are operators * for all token holders, even if {authorizeOperator} was never called on * them. * * This list is immutable, but individual holders may revoke these via * {revokeOperator}, in which case {isOperatorFor} will return false. */ function defaultOperators() external view returns (address[] memory); /** * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must * be an operator of `sender`. * * If send or receive hooks are registered for `sender` and `recipient`, * the corresponding functions will be called with `data` and * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. * * Emits a {Sent} event. * * Requirements * * - `sender` cannot be the zero address. * - `sender` must have at least `amount` tokens. * - the caller must be an operator for `sender`. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; /** * @dev Destroys `amount` tokens from `account`, reducing the total supply. * The caller must be an operator of `account`. * * If a send hook is registered for `account`, the corresponding function * will be called with `data` and `operatorData`. See {IERC777Sender}. * * Emits a {Burned} event. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. * - the caller must be an operator for `account`. */ function operatorBurn( address account, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; event Sent(address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData); event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); event AuthorizedOperator(address indexed operator, address indexed tokenHolder); event RevokedOperator(address indexed operator, address indexed tokenHolder); } /** * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. * * Accounts can be notified of {IERC777} tokens being sent to them by having a * contract implement this interface (contract holders can be their own * implementer) and registering it on the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. * * See {IERC1820Registry} and {ERC1820Implementer}. */ interface IERC777Recipient { /** * @dev Called by an {IERC777} token contract whenever tokens are being * moved or created into a registered account (`to`). The type of operation * is conveyed by `from` being the zero address or not. * * This call occurs _after_ the token contract's state is updated, so * {IERC777-balanceOf}, etc., can be used to query the post-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensReceived( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } /** * @dev Interface of the ERC777TokensSender standard as defined in the EIP. * * {IERC777} Token holders can be notified of operations performed on their * tokens by having a contract implement this interface (contract holders can be * their own implementer) and registering it on the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. * * See {IERC1820Registry} and {ERC1820Implementer}. */ interface IERC777Sender { /** * @dev Called by an {IERC777} token contract whenever a registered holder's * (`from`) tokens are about to be moved or destroyed. The type of operation * is conveyed by `to` being the zero address or not. * * This call occurs _before_ the token contract's state is updated, so * {IERC777-balanceOf}, etc., can be used to query the pre-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensToSend( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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 Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Interface of the global ERC1820 Registry, as defined in the * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register * implementers for interfaces in this registry, as well as query support. * * Implementers may be shared by multiple accounts, and can also implement more * than a single interface for each account. Contracts can implement interfaces * for themselves, but externally-owned accounts (EOA) must delegate this to a * contract. * * {IERC165} interfaces can also be queried via the registry. * * For an in-depth explanation and source code analysis, see the EIP text. */ interface IERC1820Registry { /** * @dev Sets `newManager` as the manager for `account`. A manager of an * account is able to set interface implementers for it. * * By default, each account is its own manager. Passing a value of `0x0` in * `newManager` will reset the manager to this initial state. * * Emits a {ManagerChanged} event. * * Requirements: * * - the caller must be the current manager for `account`. */ function setManager(address account, address newManager) external; /** * @dev Returns the manager for `account`. * * See {setManager}. */ function getManager(address account) external view returns (address); /** * @dev Sets the `implementer` contract as ``account``'s implementer for * `interfaceHash`. * * `account` being the zero address is an alias for the caller's address. * The zero address can also be used in `implementer` to remove an old one. * * See {interfaceHash} to learn how these are created. * * Emits an {InterfaceImplementerSet} event. * * Requirements: * * - the caller must be the current manager for `account`. * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not * end in 28 zeroes). * - `implementer` must implement {IERC1820Implementer} and return true when * queried for support, unless `implementer` is the caller. See * {IERC1820Implementer-canImplementInterfaceForAddress}. */ function setInterfaceImplementer( address account, bytes32 interfaceHash, address implementer ) external; /** * @dev Returns the implementer of `interfaceHash` for `account`. If no such * implementer is registered, returns the zero address. * * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28 * zeroes), `account` will be queried for support of it. * * `account` being the zero address is an alias for the caller's address. */ function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address); /** * @dev Returns the interface hash for an `interfaceName`, as defined in the * corresponding * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP]. */ function interfaceHash(string calldata interfaceName) external pure returns (bytes32); /** * @notice Updates the cache with whether the contract implements an ERC165 interface or not. * @param account Address of the contract for which to update the cache. * @param interfaceId ERC165 interface for which to update the cache. */ function updateERC165Cache(address account, bytes4 interfaceId) external; /** * @notice Checks whether a contract implements an ERC165 interface or not. * If the result is not cached a direct lookup on the contract address is performed. * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling * {updateERC165Cache} with the contract address. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); /** * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); event ManagerChanged(address indexed account, address indexed newManager); } /** * @dev Implementation of the {IERC777} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * Support for ERC20 is included in this contract, as specified by the EIP: both * the ERC777 and ERC20 interfaces can be safely used when interacting with it. * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token * movements. * * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there * are no special restrictions in the amount of tokens that created, moved, or * destroyed. This makes integration with ERC20 applications seamless. * * @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. */ contract ERC777OwnableUpgradeSafe is Context, IERC777, IERC20 { using SafeMath for uint256; using Address for address; bool private initialized; bool private initializing; address private _owner; IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); mapping(address => uint256) internal _balances; uint256 private _totalSupply; uint256 private _totalBurned; string private _name; string private _symbol; uint8 private _decimals; // We inline the result of the following hashes because Solidity doesn't resolve them at compile time. // See https://github.com/ethereum/solidity/issues/4024. // keccak256("ERC777TokensSender") bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = 0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895; // keccak256("ERC777TokensRecipient") bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = 0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b; // This isn't ever read from - it's only used to respond to the defaultOperators query. address[] private _defaultOperatorsArray; // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators). mapping(address => bool) private _defaultOperators; // For each account, a mapping of its operators and revoked default operators. mapping(address => mapping(address => bool)) private _operators; mapping(address => mapping(address => bool)) private _revokedDefaultOperators; // ERC20-allowances mapping(address => mapping(address => uint256)) private _allowances; bool private __ERC1820_REGISTRY_ENABLED = false; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} // Reserved storage space to allow for layout changes in the future. uint256[50] private __gap; function __ERC777_init( string memory name, string memory symbol, bool _erc1820RegistryEnabled ) internal initializer { __Context_init_unchained(); __ERC777_init_unchained(name, symbol); __Ownable_init_unchained(); __ERC1820_REGISTRY_ENABLED = _erc1820RegistryEnabled; // register interfaces if (__ERC1820_REGISTRY_ENABLED) { _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this)); _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this)); } } function __ERC777_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev See {IERC777-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC777-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {ERC20-decimals}. * * Always returns 18, as per the * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility). */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC777-granularity}. * * This implementation always returns `1`. */ function granularity() public view override returns (uint256) { return 1; } /** * @dev See {IERC777-totalSupply}. */ function totalSupply() public view override(IERC20, IERC777) returns (uint256) { return _totalSupply; } function totalBurned() public view returns (uint256) { return _totalBurned; } /** * @dev Returns the amount of tokens owned by an account (`tokenHolder`). */ function balanceOf(address tokenHolder) public view override(IERC20, IERC777) returns (uint256) { return _balances[tokenHolder]; } /** * @dev See {IERC777-send}. * * Also emits a {IERC20-Transfer} event for ERC20 compatibility. */ function send( address recipient, uint256 amount, bytes memory data ) public override { _send(_msgSender(), recipient, amount, data, "", true); } /** * @dev See {IERC20-transfer}. * * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient} * interface if it is a contract. * * Also emits a {Sent} event. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { require(recipient != address(0), "ERC777: transfer to the zero address"); address from = _msgSender(); _callTokensToSend(from, from, recipient, amount, "", ""); _move(from, from, recipient, amount, "", ""); _callTokensReceived(from, from, recipient, amount, "", "", false); return true; } /** * @dev See {IERC777-burn}. * * Also emits a {IERC20-Transfer} event for ERC20 compatibility. */ function burn(uint256 amount, bytes memory data) public override { _burn(_msgSender(), amount, data, ""); } /** * @dev See {IERC777-isOperatorFor}. */ function isOperatorFor(address operator, address tokenHolder) public view override returns (bool) { return operator == tokenHolder || (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) || _operators[tokenHolder][operator]; } /** * @dev See {IERC777-authorizeOperator}. */ function authorizeOperator(address operator) public override { require(_msgSender() != operator, "ERC777: authorizing self as operator"); if (_defaultOperators[operator]) { delete _revokedDefaultOperators[_msgSender()][operator]; } else { _operators[_msgSender()][operator] = true; } emit AuthorizedOperator(operator, _msgSender()); } /** * @dev See {IERC777-revokeOperator}. */ function revokeOperator(address operator) public override { require(operator != _msgSender(), "ERC777: revoking self as operator"); if (_defaultOperators[operator]) { _revokedDefaultOperators[_msgSender()][operator] = true; } else { delete _operators[_msgSender()][operator]; } emit RevokedOperator(operator, _msgSender()); } /** * @dev See {IERC777-defaultOperators}. */ function defaultOperators() public view override returns (address[] memory) { return _defaultOperatorsArray; } /** * @dev See {IERC777-operatorSend}. * * Emits {Sent} and {IERC20-Transfer} events. */ function operatorSend( address sender, address recipient, uint256 amount, bytes memory data, bytes memory operatorData ) public override { require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder"); _send(sender, recipient, amount, data, operatorData, true); } /** * @dev See {IERC777-operatorBurn}. * * Emits {Burned} and {IERC20-Transfer} events. */ function operatorBurn( address account, uint256 amount, bytes memory data, bytes memory operatorData ) public override { require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder"); _burn(account, amount, data, operatorData); } /** * @dev See {IERC20-allowance}. * * Note that operator and allowance concepts are orthogonal: operators may * not have allowance, and accounts with allowance may not be operators * themselves. */ function allowance(address holder, address spender) public view override returns (uint256) { return _allowances[holder][spender]; } /** * @dev See {IERC20-approve}. * * Note that accounts cannot have allowance issued by their operators. */ function approve(address spender, uint256 value) public override returns (bool) { address holder = _msgSender(); _approve(holder, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Note that operator and allowance concepts are orthogonal: operators cannot * call `transferFrom` (unless they have allowance), and accounts with * allowance cannot call `operatorSend` (unless they are operators). * * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events. */ function transferFrom( address holder, address recipient, uint256 amount ) public virtual override returns (bool) { require(recipient != address(0), "ERC777: transfer to the zero address"); require(holder != address(0), "ERC777: transfer from the zero address"); address spender = _msgSender(); _callTokensToSend(spender, holder, recipient, amount, "", ""); _move(spender, holder, recipient, amount, "", ""); _approve(holder, spender, _allowances[holder][spender].sub(amount, "ERC777: transfer amount exceeds allowance")); _callTokensReceived(spender, holder, recipient, amount, "", "", false); return true; } /** * @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * If a send hook is registered for `account`, the corresponding function * will be called with `operator`, `data` and `operatorData`. * * See {IERC777Sender} and {IERC777Recipient}. * * Emits {Minted} and {IERC20-Transfer} events. * * Requirements * * - `account` cannot be the zero address. * - if `account` is a contract, it must implement the {IERC777Recipient} * interface. */ function _mint( address account, uint256 amount, bytes memory userData, bytes memory operatorData ) internal virtual { require(account != address(0), "ERC777: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, amount); // Update state variables _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); _callTokensReceived(operator, address(0), account, amount, userData, operatorData, false); emit Minted(operator, account, amount, userData, operatorData); emit Transfer(address(0), account, amount); } /** * @dev Send tokens * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _send( address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal virtual { require(from != address(0), "ERC777: send from the zero address"); require(to != address(0), "ERC777: send to the zero address"); address operator = _msgSender(); _callTokensToSend(operator, from, to, amount, userData, operatorData); _move(operator, from, to, amount, userData, operatorData); _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck); } /** * @dev Burn tokens * @param from address token holder address * @param amount uint256 amount of tokens to burn * @param data bytes extra information provided by the token holder * @param operatorData bytes extra information provided by the operator (if any) */ function _burn( address from, uint256 amount, bytes memory data, bytes memory operatorData ) internal virtual { require(from != address(0), "ERC777: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), amount); _callTokensToSend(operator, from, address(0), amount, data, operatorData); // Update state variables _balances[from] = _balances[from].sub(amount, "ERC777: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); _totalBurned = _totalBurned.add(amount); emit Burned(operator, from, amount, data, operatorData); emit Transfer(from, address(0), amount); } function _move( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) internal virtual returns (uint256 _amountSent) { _beforeTokenTransfer(operator, from, to, amount); _balances[from] = _balances[from].sub(amount, "ERC777: transfer amount exceeds balance"); _balances[to] = _balances[to].add(amount); _amountSent = amount; emit Sent(operator, from, to, amount, userData, operatorData); emit Transfer(from, to, amount); } /** * @dev See {ERC20-_approve}. * * Note that accounts cannot have allowance issued by their operators. */ function _approve( address holder, address spender, uint256 value ) internal { require(holder != address(0), "ERC777: approve from the zero address"); require(spender != address(0), "ERC777: approve to the zero address"); _allowances[holder][spender] = value; emit Approval(holder, spender, value); } /** * @dev Call from.tokensToSend() if the interface is registered * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) */ function _callTokensToSend( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) internal { if (__ERC1820_REGISTRY_ENABLED) { address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH); if (implementer != address(0)) { IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData); } } } /** * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but * tokensReceived() was not registered for the recipient * @param operator address operator requesting the transfer * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _callTokensReceived( address operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal { if (__ERC1820_REGISTRY_ENABLED) { address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH); if (implementer != address(0)) { IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData); } else if (requireReceptionAck) { require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient"); } } } /** * @dev Hook that is called before any token transfer. This includes * calls to {send}, {transfer}, {operatorSend}, minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256 amount ) internal virtual {} } contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require(!checkSameOriginReentranted(), "ContractGuard: one block, one function"); require(!checkSameSenderReentranted(), "ContractGuard: one block, one function"); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } } interface IBasisAsset { function mint(address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function isOperator() external returns (bool); function operator() external view returns (address); } contract Share is ERC777OwnableUpgradeSafe, ContractGuard { using SafeMath for uint256; /* ========== STATE VARIABLES ========== */ uint256 public cap; mapping(address => bool) public minter; // TOTAL MAX SUPPLY = 1,000,000 SDS uint256 public constant COMMUNITY_FUND_POOL_ALLOCATION = 200000 ether; uint256 public constant DEV_FUND_POOL_ALLOCATION = 175000 ether; uint256 public constant IDO_ALLOCATION = 25000 ether; uint256 public constant VESTING_DURATION = 80 weeks; uint256 public constant startTime = 1623412800; // Friday, 11 June 2021 12:00:00 PM UTC uint256 public constant endTime = startTime + VESTING_DURATION; // Friday, 23 December 2022 12:00:00 PM UTC uint256 public constant communityFundRewardRate = COMMUNITY_FUND_POOL_ALLOCATION / VESTING_DURATION; uint256 public constant devFundRewardRate = DEV_FUND_POOL_ALLOCATION / VESTING_DURATION; address public communityFund; address public devFund; uint256 public communityFundLastClaimed = startTime; uint256 public devFundLastClaimed = startTime; uint256 public burnRate; uint256 public taxRate; // buy back SDO and add liquidity address public taxFund; // fund buy back SDO uint256 private _totalTaxAdded; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedToFee; /* =================== Added variables (need to keep orders for proxy to work) =================== */ /*... /* ========== EVENTS ========== */ event MinterUpdate(address indexed account, bool isMinter); event TaxAdded(address indexed account, address taxFund, uint256 amount); /* ========== Modifiers =============== */ modifier onlyMinter() { require(minter[msg.sender], "!minter"); _; } /* ========== GOVERNANCE ========== */ function initialize(uint256 _cap, address _taxFund) public initializer { __ERC777_init("SafeDollar Share", "SDS", true); require(_taxFund != address(0), "zero"); cap = _cap; taxFund = _taxFund; devFund = msg.sender; burnRate = 0; // 0% taxRate = 200; // 2% (1% to buyback SDO and burn, 1% to add liquidity) communityFundLastClaimed = startTime; devFundLastClaimed = startTime; _isExcludedFromFee[_msgSender()] = true; _isExcludedToFee[_msgSender()] = true; _isExcludedFromFee[_taxFund] = true; _isExcludedToFee[_taxFund] = true; _mint(_msgSender(), IDO_ALLOCATION.add(1 ether), "", ""); // mint extra 1 SDS for initial pools deployment } function setMinter(address _account, bool _isMinter) external onlyOwner { require(_account != address(0), "zero"); minter[_account] = _isMinter; emit MinterUpdate(_account, _isMinter); } function setCommunityFund(address _communityFund) external onlyOwner { communityFund = _communityFund; } function setDevFund(address _devFund) external { require(msg.sender == devFund, "!dev"); require(_devFund != address(0), "zero"); devFund = _devFund; } function setBurnRate(uint256 _burnRate) external onlyOwner { require(_burnRate <= 1000, "too high"); // <= 10% burnRate = _burnRate; } function setTaxRate(uint256 _taxRate) external onlyOwner { require(_taxRate <= 1000, "too high"); // <= 10% taxRate = _taxRate; } function setTaxFund(address _taxFund) external onlyOwner { require(_taxFund != address(0), "zero"); taxFund = _taxFund; } function setExcludeFromFee(address _account, bool _status) external onlyOwner { _isExcludedFromFee[_account] = _status; } function setExcludeToFee(address _account, bool _status) external onlyOwner { _isExcludedToFee[_account] = _status; } function setExcludeBothDirectionsFee(address _account, bool _status) external onlyOwner { _isExcludedFromFee[_account] = _status; _isExcludedToFee[_account] = _status; } /* ========== VIEW FUNCTIONS ========== */ function totalTaxAdded() external view returns (uint256) { return _totalTaxAdded; } /* ========== MUTATIVE FUNCTIONS ========== */ function mint(address _recipient, uint256 _amount) public onlyMinter returns (bool) { uint256 balanceBefore = balanceOf(_recipient); _mint(_recipient, _amount, "", ""); uint256 balanceAfter = balanceOf(_recipient); return balanceAfter > balanceBefore; } function burn(uint256 _amount) external onlyOneBlock { _burn(msg.sender, _amount, "", ""); } function burnFrom(address _account, uint256 _amount) external onlyOneBlock { _approve(_account, _msgSender(), allowance(_account, _msgSender()).sub(_amount, "ERC20: burn amount exceeds allowance")); _burn(_account, _amount, "", ""); } /* ========== OVERRIDE STANDARD FUNCTIONS ========== */ function transfer(address recipient, uint256 amount) public override returns (bool) { require(recipient != address(0), "SDO: transfer to the zero address"); address from = _msgSender(); _callTokensToSend(from, from, recipient, amount, "", ""); uint256 _amountSent = _move(from, from, recipient, amount, "", ""); _callTokensReceived(from, from, recipient, _amountSent, "", "", false); return true; } function transferFrom( address holder, address recipient, uint256 amount ) public override returns (bool) { require(recipient != address(0), "SDS: transfer to the zero address"); require(holder != address(0), "SDS: transfer from the zero address"); address spender = _msgSender(); _callTokensToSend(spender, holder, recipient, amount, "", ""); uint256 _amountSent = _move(spender, holder, recipient, amount, "", ""); _approve(holder, spender, allowance(holder, spender).sub(amount, "BDOv2: transfer amount exceeds allowance")); _callTokensReceived(spender, holder, recipient, _amountSent, "", "", false); return true; } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer( address _operator, address _from, address _to, uint256 _amount ) internal override { super._beforeTokenTransfer(_operator, _from, _to, _amount); if (_from == address(0)) { // When minting tokens require(totalSupply().add(_amount) <= cap, "cap exceeded"); } if (_to == address(0)) { // When burning tokens cap = cap.sub(_amount, "burn amount exceeds cap"); } } /** * @dev Send tokens * @param from address token holder address * @param to address recipient address * @param amount uint256 amount of tokens to transfer * @param userData bytes extra information provided by the token holder (if any) * @param operatorData bytes extra information provided by the operator (if any) * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient */ function _send( address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData, bool requireReceptionAck ) internal override { require(from != address(0), "SDS: send from the zero address"); require(to != address(0), "SDS: send to the zero address"); address _operator = _msgSender(); _callTokensToSend(_operator, from, to, amount, userData, operatorData); uint256 _amountSent = _move(_operator, from, to, amount, userData, operatorData); _callTokensReceived(_operator, from, to, _amountSent, userData, operatorData, requireReceptionAck); } function _move( address _operator, address from, address to, uint256 amount, bytes memory userData, bytes memory operatorData ) internal override returns (uint256 _amountSent) { uint256 _amount = amount; if (!_isExcludedFromFee[from] && !_isExcludedToFee[to]) { { uint256 _taxRate = taxRate; if (_taxRate > 0) { uint256 _taxAmount = amount.mul(_taxRate).div(10000); address _taxFund = taxFund; _balances[from] = _balances[from].sub(_taxAmount, "Safe Dollar: transfer amount exceeds balance"); _balances[_taxFund] = _balances[_taxFund].add(_taxAmount); _amount = _amount.sub(_taxAmount); _totalTaxAdded = _totalTaxAdded.add(_taxAmount); emit TaxAdded(from, _taxFund, _taxAmount); emit Transfer(from, _taxFund, _taxAmount); } } { uint256 _burnAmount = 0; uint256 _burnRate = burnRate; if (_burnRate > 0) { _burnAmount = amount.mul(_burnRate).div(10000); _burn(from, _burnAmount, "", ""); _amount = _amount.sub(_burnAmount); } } } _balances[from] = _balances[from].sub(_amount, "SDS: transfer amount exceeds balance"); _balances[to] = _balances[to].add(_amount); _amountSent = _amount; emit Sent(_operator, from, to, _amount, userData, operatorData); emit Transfer(from, to, _amount); } function unclaimedCommunityFund() public view returns (uint256 _pending) { uint256 _now = block.timestamp; if (_now > endTime) _now = endTime; if (communityFundLastClaimed >= _now) return 0; _pending = _now.sub(communityFundLastClaimed).mul(communityFundRewardRate); } function unclaimedDevFund() public view returns (uint256 _pending) { uint256 _now = block.timestamp; if (_now > endTime) _now = endTime; if (devFundLastClaimed >= _now) return 0; _pending = _now.sub(devFundLastClaimed).mul(devFundRewardRate); } /** * @dev Claim pending rewards to community and dev fund */ function claimRewards() external { uint256 _pending = unclaimedCommunityFund(); if (_pending > 0 && communityFund != address(0)) { _mint(communityFund, _pending, "", ""); communityFundLastClaimed = block.timestamp; } _pending = unclaimedDevFund(); if (_pending > 0 && devFund != address(0)) { _mint(devFund, _pending, "", ""); devFundLastClaimed = block.timestamp; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isMinter","type":"bool"}],"name":"MinterUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"taxFund","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COMMUNITY_FUND_POOL_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_FUND_POOL_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IDO_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communityFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityFundLastClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityFundRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundLastClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFundRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"address","name":"_taxFund","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnRate","type":"uint256"}],"name":"setBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_communityFund","type":"address"}],"name":"setCommunityFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devFund","type":"address"}],"name":"setDevFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setExcludeBothDirectionsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setExcludeToFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isMinter","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxFund","type":"address"}],"name":"setTaxFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxAdded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedCommunityFund","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimedDevFund","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600c805460ff191690556360c35040604481905560455534801561002757600080fd5b50615158806100376000396000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c80636409de78116101d3578063af9549e011610104578063da35a26f116100a2578063f2fde38b1161007c578063f2fde38b14610bfd578063fad8b32a14610c30578063fc673c4f14610c63578063fe9d930314610db257610377565b8063da35a26f14610b56578063dd62ed3e14610b8f578063ee7e767114610bca57610377565b8063c7320509116100de578063c732050914610ad0578063cf456ae714610ad8578063d89135cd14610b13578063d95b637114610b1b57610377565b8063af9549e014610a70578063bed9985014610aab578063c6d69a3014610ab357610377565b80638da5cb5b116101715780639bd9bbc61161014b5780639bd9bbc614610934578063a9059cbb146109fc578063abb4b1be14610a35578063ae4db91914610a3d57610377565b80638da5cb5b146108f1578063959b8c3f146108f957806395d89b411461092c57610377565b8063771a3a1d116101ad578063771a3a1d146108a057806378e97925146108a857806379cc6790146108b05780638b93e49e146108e957610377565b80636409de781461082a57806370a0823114610865578063715018a61461089857610377565b8063372500ab116102ad57806344cdc4541161024b578063547f121311610225578063547f1213146106b8578063556f0dc7146106c057806362ad1b83146106c857806362d1c04c1461082257610377565b806344cdc454146106a05780634cfc4d30146106a85780634f337dd5146106b057610377565b80633dd08c38116102875780633dd08c381461060f57806340c10f191461064257806342966c681461067b5780634390d2a81461069857610377565b8063372500ab146105cc57806337339a16146105d45780633bba8eed1461060757610377565b8063189d165e1161031a5780632e3367ce116102f45780632e3367ce14610596578063313ce5671461059e5780633197cbb6146105bc578063355274ea146105c457610377565b8063189d165e1461052e57806323b872dd1461054b5780632c07a6241461058e57610377565b806306e485381161035657806306e485381461040457806306fdde031461045c578063095ea7b3146104d957806318160ddd1461052657610377565b8062f380f41461037c57806302317601146103ad57806304017315146103ea575b600080fd5b610384610e5f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103e8600480360360408110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610e7b565b005b6103f2610f7b565b60408051918252519081900360200190f35b61040c610f81565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610448578181015183820152602001610430565b505050509050019250505060405180910390f35b610464610ff1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610512600480360360408110156104ef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561109c565b604080519115158252519081900360200190f35b6103f26110c0565b6103e86004803603602081101561054457600080fd5b50356110c6565b6105126004803603606081101561056157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356111d3565b6103f2611387565b6103f26113d7565b6105a66113ec565b6040805160ff9092168252519081900360200190f35b6103f26113f5565b6103f26113fd565b6103e8611403565b6103e8600480360360208110156105ea57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611500565b6103f26115de565b6105126004803603602081101561062557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115ec565b6105126004803603604081101561065857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611601565b6103e86004803603602081101561069157600080fd5b50356116cd565b61038461180f565b6103f261182b565b6103f2611840565b6103f2611848565b6103f2611856565b6103f261189a565b6103e8600480360360a08110156106de57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561072657600080fd5b82018360208201111561073857600080fd5b8035906020019184600183028401116401000000008311171561075a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156107ad57600080fd5b8201836020820111156107bf57600080fd5b803590602001918460018302840111640100000000831117156107e157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061189f945050505050565b6103f261191b565b6103e86004803603604081101561084057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611929565b6103f26004803603602081101561087b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611a16565b6103e8611a3e565b6103f2611b49565b6103f2611b4f565b6103e8600480360360408110156108c657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b57565b6103f2611cd4565b610384611cda565b6103e86004803603602081101561090f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611cfc565b610464611ef9565b6103e86004803603606081101561094a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561098757600080fd5b82018360208201111561099957600080fd5b803590602001918460018302840111640100000000831117156109bb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f78945050505050565b61051260048036036040811015610a1257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611fa2565b6103f26120b1565b6103e860048036036020811015610a5357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120b7565b6103e860048036036040811015610a8657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561220a565b6103f26122f7565b6103e860048036036020811015610ac957600080fd5b50356122fd565b61038461240a565b6103e860048036036040811015610aee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515612426565b6103f26125cc565b61051260048036036040811015610b3157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166125d2565b6103e860048036036040811015610b6c57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166126b5565b6103f260048036036040811015610ba557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612a68565b6103e860048036036020811015610be057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612aa0565b6103e860048036036020811015610c1357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c02565b6103e860048036036020811015610c4657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612d9e565b6103e860048036036080811015610c7957600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591810190606081016040820135640100000000811115610cb657600080fd5b820183602082011115610cc857600080fd5b80359060200191846001830284011164010000000083111715610cea57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610d3d57600080fd5b820183602082011115610d4f57600080fd5b80359060200191846001830284011164010000000083111715610d7157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612f9b945050505050565b6103e860048036036040811015610dc857600080fd5b81359190810190604081016020820135640100000000811115610dea57600080fd5b820183602082011115610dfc57600080fd5b80359060200191846001830284011164010000000083111715610e1e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613013945050505050565b60425473ffffffffffffffffffffffffffffffffffffffff1681565b610e83613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614610f1257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff9091166000908152604a6020908152604080832080549415157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009586168117909155604b9092529091208054909216179055565b60455481565b60606007805480602002602001604051908101604052809291908181526020018280548015610fe657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610fbb575b505050505090505b90565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610fe65780601f1061107057610100808354040283529160200191610fe6565b820191906000526020600020905b81548152906001019060200180831161107e57509395945050505050565b6000806110a7613039565b90506110b481858561303d565b60019150505b92915050565b60025490565b6110ce613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461115d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e88111156111ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604655565b600073ffffffffffffffffffffffffffffffffffffffff8316611241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614e3c6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166112ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f5f6023913960400191505060405180910390fd5b60006112b7613039565b90506112e5818686866040518060200160405280600081525060405180602001604052806000815250613184565b6000611313828787876040518060200160405280600081525060405180602001604052806000815250613424565b905061134d8683611348876040518060600160405280602881526020016150d8602891396113418c89612a68565b919061392e565b61303d565b61137b82878784604051806020016040528060008152506040518060200160405280600081525060006139df565b50600195945050505050565b6000426363a5984081111561139d57506363a598405b80604554106113b0576000915050610fee565b6045546113d190660cd98cb94f23b4906113cb908490613cfd565b90613d3f565b91505090565b6302e2480069250ec4ddca432f6000005b0481565b60065460ff1690565b6363a5984081565b60405481565b600061140d611856565b9050600081118015611436575060425473ffffffffffffffffffffffffffffffffffffffff1615155b156114815760425460408051602080820183526000808352835191820190935291825261147c9273ffffffffffffffffffffffffffffffffffffffff1691849190613db2565b426044555b611489611387565b90506000811180156114b2575060435473ffffffffffffffffffffffffffffffffffffffff1615155b156114fd576043546040805160208082018352600080835283519182019093529182526114f89273ffffffffffffffffffffffffffffffffffffffff1691849190613db2565b426045555b50565b611508613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461159757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b692a5a058fc295ed00000081565b60416020526000908152604090205460ff1681565b3360009081526041602052604081205460ff1661167f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d696e74657200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600061168a84611a16565b90506116b684846040518060200160405280600081525060405180602001604052806000815250613db2565b60006116c185611a16565b91909111949350505050565b6116d5614051565b1561172b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b611733614072565b15611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b6117b333826040518060200160405280600081525060405180602001604052806000815250614093565b50436000908152603f60209081526040808320328452909152808220805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092553384529190922080549091169091179055565b60435473ffffffffffffffffffffffffffffffffffffffff1681565b6302e24800692a5a058fc295ed0000006113e8565b6302e2480081565b69250ec4ddca432f60000081565b6000426363a5984081111561186c57506363a598405b806044541061187f576000915050610fee565b6044546113d190660eaf7c417f043b906113cb908490613cfd565b600190565b6118b06118aa613039565b866125d2565b611905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615063602c913960400191505060405180910390fd5b61191485858585856001614345565b5050505050565b69054b40b1f852bda0000081565b611931613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff9081169116146119c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152604b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b611a46613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614611ad557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516201000090910473ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff169055565b60475481565b6360c3504081565b611b5f614051565b15611bb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b611bbd614072565b15611c13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b611c4d82611c1f613039565b6113488460405180606001604052806024815260200161503f6024913961134188611c48613039565b612a68565b611c7782826040518060200160405280600081525060405180602001604052806000815250614093565b5050436000908152603f60209081526040808320328452909152808220805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092553384529190922080549091169091179055565b60495490565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b8073ffffffffffffffffffffffffffffffffffffffff16611d1b613039565b73ffffffffffffffffffffffffffffffffffffffff161415611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614eca6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615611e2357600a6000611dc2613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091851681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611e95565b600160096000611e31613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091861681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555b611e9d613039565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610fe65780601f1061107057610100808354040283529160200191610fe6565b611f9d611f83613039565b848484604051806020016040528060008152506001614345565b505050565b600073ffffffffffffffffffffffffffffffffffffffff8316612010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614f826021913960400191505060405180910390fd5b600061201a613039565b9050612048818286866040518060200160405280600081525060405180602001604052806000815250613184565b6000612076828387876040518060200160405280600081525060405180602001604052806000815250613424565b90506120a682838784604051806020016040528060008152506040518060200160405280600081525060006139df565b506001949350505050565b60445481565b60435473ffffffffffffffffffffffffffffffffffffffff16331461213f57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f2164657600000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166121c357604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612212613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff9081169116146122a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152604a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60465481565b612305613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461239457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e881111561240557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604755565b60485473ffffffffffffffffffffffffffffffffffffffff1681565b61242e613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff9081169116146124bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661254157604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526041602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517f279360e293bcf8120adefa5fb6f669c774022ed25c09e099edd1818d155c57b69281900390910190a25050565b60035490565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612671575073ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205460ff168015612671575073ffffffffffffffffffffffffffffffffffffffff8083166000908152600a602090815260408083209387168352929052205460ff16155b806126ae575073ffffffffffffffffffffffffffffffffffffffff80831660009081526009602090815260408083209387168352929052205460ff165b9392505050565b600054610100900460ff16806126ce57506126ce614484565b806126dc575060005460ff16155b612731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff1615801561279757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61280d6040518060400160405280601081526020017f53616665446f6c6c6172205368617265000000000000000000000000000000008152506040518060400160405280600381526020017f5344530000000000000000000000000000000000000000000000000000000000815250600161448a565b73ffffffffffffffffffffffffffffffffffffffff821661289157604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408390556048805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560438054909116331790556000604681905560c86047556360c350406044819055604555600190604a9061290b613039565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001604b600061296a613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812080549515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009687161790559086168152604a8352818120805485166001908117909155604b909352208054909216179055612a356129f4613039565b612a1069054b40b1f852bda00000670de0b6b3a7640000614751565b6040518060200160405280600081525060405180602001604052806000815250613db2565b8015611f9d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205490565b612aa8613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614612b3757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612bbb57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612c0a613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614612c9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614e826026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b612da6613039565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614f126021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615612ece576001600a6000612e66613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091861681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055612f37565b60096000612eda613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091851681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b612f3f613039565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b612fac612fa6613039565b856125d2565b613001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615063602c913960400191505060405180910390fd5b61300d84848484614093565b50505050565b61303561301e613039565b838360405180602001604052806000815250614093565b5050565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166130a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614e5d6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806151006023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600b6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600c5460ff161561341c57604080517faabbb8ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b15801561323957600080fd5b505afa15801561324d573d6000803e3d6000fd5b505050506040513d602081101561326357600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff81161561341a578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561334f578181015183820152602001613337565b50505050905090810190601f16801561337c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156133af578181015183820152602001613397565b50505050905090810190601f1680156133dc5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561340157600080fd5b505af1158015613415573d6000803e3d6000fd5b505050505b505b505050505050565b73ffffffffffffffffffffffffffffffffffffffff85166000908152604a6020526040812054849060ff16158015613482575073ffffffffffffffffffffffffffffffffffffffff86166000908152604b602052604090205460ff16155b156136a557604754801561364c5760006134a86127106134a28985613d3f565b906147c5565b6048546040805160608101909152602c80825292935073ffffffffffffffffffffffffffffffffffffffff90911691613512918491614f33602083013973ffffffffffffffffffffffffffffffffffffffff8d16600090815260016020526040902054919061392e565b73ffffffffffffffffffffffffffffffffffffffff808c16600090815260016020526040808220939093559083168152205461354e9083614751565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205561357e8483613cfd565b60495490945061358e9083614751565b6049556040805173ffffffffffffffffffffffffffffffffffffffff8381168252602082018590528251908d16927f3518075fae16f1bca7d9a1f28fede590b3ee4854c3c0bb4c5259b4ed62aa1674928290030190a28073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505b5060465460009080156136a2576136696127106134a28984613d3f565b915061369589836040518060200160405280600081525060405180602001604052806000815250614093565b61369f8383613cfd565b92505b50505b6136ef81604051806060016040528060248152602001614eee6024913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260016020526040902054919061392e565b73ffffffffffffffffffffffffffffffffffffffff808916600090815260016020526040808220939093559088168152205461372b9082614751565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508091508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987848888604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613821578181015183820152602001613809565b50505050905090810190601f16801561384e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613881578181015183820152602001613869565b50505050905090810190601f1680156138ae5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3509695505050505050565b600081848411156139d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561399c578181015183820152602001613984565b50505050905090810190601f1680156139c95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600c5460ff161561341a57604080517faabbb8ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b158015613a9457600080fd5b505afa158015613aa8573d6000803e3d6000fd5b505050506040513d6020811015613abe57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff811615613c78578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613ba9578181015183820152602001613b91565b50505050905090810190601f168015613bd65780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613c09578181015183820152602001613bf1565b50505050905090810190601f168015613c365780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50505050613cf3565b8115613cf357613c9d8673ffffffffffffffffffffffffffffffffffffffff16614807565b15613cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d815260200180614fc4604d913960600191505060405180910390fd5b5050505050505050565b60006126ae83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061392e565b600082613d4e575060006110ba565b82820282848281613d5b57fe5b04146126ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614fa36021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416613e3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6000613e3e613039565b9050613e4d816000878761480d565b600254613e5a9085614751565b60025573ffffffffffffffffffffffffffffffffffffffff8516600090815260016020526040902054613e8d9085614751565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812091909155613ec690829087878787846139df565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613f5f578181015183820152602001613f47565b50505050905090810190601f168015613f8c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613fbf578181015183820152602001613fa7565b50505050905090810190601f168015613fec5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a360408051858152905173ffffffffffffffffffffffffffffffffffffffff8716916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b436000908152603f6020908152604080832032845290915290205460ff1690565b436000908152603f6020908152604080832033845290915290205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff84166140ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614ea86022913960400191505060405180910390fd5b6000614109613039565b9050614118818660008761480d565b61412781866000878787613184565b614171846040518060600160405280602381526020016150b56023913973ffffffffffffffffffffffffffffffffffffffff8816600090815260016020526040902054919061392e565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600160205260409020556002546141a49085613cfd565b6002556003546141b49085614751565b6003819055508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561425357818101518382015260200161423b565b50505050905090810190601f1680156142805780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156142b357818101518382015260200161429b565b50505050905090810190601f1680156142e05780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a360408051858152905160009173ffffffffffffffffffffffffffffffffffffffff8816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b73ffffffffffffffffffffffffffffffffffffffff86166143c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5344533a2073656e642066726f6d20746865207a65726f206164647265737300604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff851661444957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5344533a2073656e6420746f20746865207a65726f2061646472657373000000604482015290519081900360640190fd5b6000614453613039565b9050614463818888888888613184565b6000614473828989898989613424565b9050613cf3828989848989896139df565b303b1590565b600054610100900460ff16806144a357506144a3614484565b806144b1575060005460ff16155b614506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff1615801561456c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61457461491a565b61457e8484614a2d565b614586614b95565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515179081905560ff161561471d57604080517f29965a1d00000000000000000000000000000000000000000000000000000000815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad24916329965a1d91606480830192600092919082900301818387803b15801561465457600080fd5b505af1158015614668573d6000803e3d6000fd5b5050604080517f29965a1d00000000000000000000000000000000000000000000000000000000815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad2493506329965a1d9250606480830192600092919082900301818387803b15801561470457600080fd5b505af1158015614718573d6000803e3d6000fd5b505050505b801561300d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550505050565b6000828201838110156126ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006126ae83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d29565b3b151590565b6148198484848461300d565b73ffffffffffffffffffffffffffffffffffffffff83166148b657604054614849826148436110c0565b90614751565b11156148b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6361702065786365656465640000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661300d57604080518082018252601781527f6275726e20616d6f756e742065786365656473206361700000000000000000006020820152905461491191839061392e565b60405550505050565b600054610100900460ff16806149335750614933614484565b80614941575060005460ff16155b614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff161580156149fc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b80156114fd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680614a465750614a46614484565b80614a54575060005460ff16155b614aa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff16158015614b0f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b8251614b22906004906020860190614da8565b508151614b36906005906020850190614da8565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660121790558015611f9d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff1680614bae5750614bae614484565b80614bbc575060005460ff16155b614c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff16158015614c7757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000614c81613039565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156114fd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60008183614d92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561399c578181015183820152602001613984565b506000838581614d9e57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614de957805160ff1916838001178555614e16565b82800160010185558215614e16579182015b82811115614e16578251825591602001919060010190614dfb565b50614e22929150614e26565b5090565b5b80821115614e225760008155600101614e2756fe5344533a207472616e7366657220746f20746865207a65726f20616464726573734552433737373a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433737373a206275726e2066726f6d20746865207a65726f20616464726573734552433737373a20617574686f72697a696e672073656c66206173206f70657261746f725344533a207472616e7366657220616d6f756e7420657863656564732062616c616e63654552433737373a207265766f6b696e672073656c66206173206f70657261746f725361666520446f6c6c61723a207472616e7366657220616d6f756e7420657863656564732062616c616e63655344533a207472616e736665722066726f6d20746865207a65726f206164647265737353444f3a207472616e7366657220746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433737373a20746f6b656e20726563697069656e7420636f6e747261637420686173206e6f20696d706c656d656e74657220666f7220455243373737546f6b656e73526563697069656e74436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f7220666f7220686f6c646572436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e4552433737373a206275726e20616d6f756e7420657863656564732062616c616e636542444f76323a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433737373a20617070726f766520746f20746865207a65726f2061646472657373a26469706673582212202600855cfb6b84d9b444e5c2fc972c99bf6e4ffc488e112544ab8ea1fd1e50ad64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103775760003560e01c80636409de78116101d3578063af9549e011610104578063da35a26f116100a2578063f2fde38b1161007c578063f2fde38b14610bfd578063fad8b32a14610c30578063fc673c4f14610c63578063fe9d930314610db257610377565b8063da35a26f14610b56578063dd62ed3e14610b8f578063ee7e767114610bca57610377565b8063c7320509116100de578063c732050914610ad0578063cf456ae714610ad8578063d89135cd14610b13578063d95b637114610b1b57610377565b8063af9549e014610a70578063bed9985014610aab578063c6d69a3014610ab357610377565b80638da5cb5b116101715780639bd9bbc61161014b5780639bd9bbc614610934578063a9059cbb146109fc578063abb4b1be14610a35578063ae4db91914610a3d57610377565b80638da5cb5b146108f1578063959b8c3f146108f957806395d89b411461092c57610377565b8063771a3a1d116101ad578063771a3a1d146108a057806378e97925146108a857806379cc6790146108b05780638b93e49e146108e957610377565b80636409de781461082a57806370a0823114610865578063715018a61461089857610377565b8063372500ab116102ad57806344cdc4541161024b578063547f121311610225578063547f1213146106b8578063556f0dc7146106c057806362ad1b83146106c857806362d1c04c1461082257610377565b806344cdc454146106a05780634cfc4d30146106a85780634f337dd5146106b057610377565b80633dd08c38116102875780633dd08c381461060f57806340c10f191461064257806342966c681461067b5780634390d2a81461069857610377565b8063372500ab146105cc57806337339a16146105d45780633bba8eed1461060757610377565b8063189d165e1161031a5780632e3367ce116102f45780632e3367ce14610596578063313ce5671461059e5780633197cbb6146105bc578063355274ea146105c457610377565b8063189d165e1461052e57806323b872dd1461054b5780632c07a6241461058e57610377565b806306e485381161035657806306e485381461040457806306fdde031461045c578063095ea7b3146104d957806318160ddd1461052657610377565b8062f380f41461037c57806302317601146103ad57806304017315146103ea575b600080fd5b610384610e5f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103e8600480360360408110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610e7b565b005b6103f2610f7b565b60408051918252519081900360200190f35b61040c610f81565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610448578181015183820152602001610430565b505050509050019250505060405180910390f35b610464610ff1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610512600480360360408110156104ef57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561109c565b604080519115158252519081900360200190f35b6103f26110c0565b6103e86004803603602081101561054457600080fd5b50356110c6565b6105126004803603606081101561056157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356111d3565b6103f2611387565b6103f26113d7565b6105a66113ec565b6040805160ff9092168252519081900360200190f35b6103f26113f5565b6103f26113fd565b6103e8611403565b6103e8600480360360208110156105ea57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611500565b6103f26115de565b6105126004803603602081101561062557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115ec565b6105126004803603604081101561065857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611601565b6103e86004803603602081101561069157600080fd5b50356116cd565b61038461180f565b6103f261182b565b6103f2611840565b6103f2611848565b6103f2611856565b6103f261189a565b6103e8600480360360a08110156106de57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561072657600080fd5b82018360208201111561073857600080fd5b8035906020019184600183028401116401000000008311171561075a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156107ad57600080fd5b8201836020820111156107bf57600080fd5b803590602001918460018302840111640100000000831117156107e157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061189f945050505050565b6103f261191b565b6103e86004803603604081101561084057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611929565b6103f26004803603602081101561087b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611a16565b6103e8611a3e565b6103f2611b49565b6103f2611b4f565b6103e8600480360360408110156108c657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b57565b6103f2611cd4565b610384611cda565b6103e86004803603602081101561090f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611cfc565b610464611ef9565b6103e86004803603606081101561094a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561098757600080fd5b82018360208201111561099957600080fd5b803590602001918460018302840111640100000000831117156109bb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f78945050505050565b61051260048036036040811015610a1257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611fa2565b6103f26120b1565b6103e860048036036020811015610a5357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166120b7565b6103e860048036036040811015610a8657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561220a565b6103f26122f7565b6103e860048036036020811015610ac957600080fd5b50356122fd565b61038461240a565b6103e860048036036040811015610aee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515612426565b6103f26125cc565b61051260048036036040811015610b3157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166125d2565b6103e860048036036040811015610b6c57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166126b5565b6103f260048036036040811015610ba557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612a68565b6103e860048036036020811015610be057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612aa0565b6103e860048036036020811015610c1357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c02565b6103e860048036036020811015610c4657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612d9e565b6103e860048036036080811015610c7957600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591810190606081016040820135640100000000811115610cb657600080fd5b820183602082011115610cc857600080fd5b80359060200191846001830284011164010000000083111715610cea57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610d3d57600080fd5b820183602082011115610d4f57600080fd5b80359060200191846001830284011164010000000083111715610d7157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612f9b945050505050565b6103e860048036036040811015610dc857600080fd5b81359190810190604081016020820135640100000000811115610dea57600080fd5b820183602082011115610dfc57600080fd5b80359060200191846001830284011164010000000083111715610e1e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613013945050505050565b60425473ffffffffffffffffffffffffffffffffffffffff1681565b610e83613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614610f1257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff9091166000908152604a6020908152604080832080549415157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009586168117909155604b9092529091208054909216179055565b60455481565b60606007805480602002602001604051908101604052809291908181526020018280548015610fe657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610fbb575b505050505090505b90565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610fe65780601f1061107057610100808354040283529160200191610fe6565b820191906000526020600020905b81548152906001019060200180831161107e57509395945050505050565b6000806110a7613039565b90506110b481858561303d565b60019150505b92915050565b60025490565b6110ce613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461115d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e88111156111ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604655565b600073ffffffffffffffffffffffffffffffffffffffff8316611241576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614e3c6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166112ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f5f6023913960400191505060405180910390fd5b60006112b7613039565b90506112e5818686866040518060200160405280600081525060405180602001604052806000815250613184565b6000611313828787876040518060200160405280600081525060405180602001604052806000815250613424565b905061134d8683611348876040518060600160405280602881526020016150d8602891396113418c89612a68565b919061392e565b61303d565b61137b82878784604051806020016040528060008152506040518060200160405280600081525060006139df565b50600195945050505050565b6000426363a5984081111561139d57506363a598405b80604554106113b0576000915050610fee565b6045546113d190660cd98cb94f23b4906113cb908490613cfd565b90613d3f565b91505090565b6302e2480069250ec4ddca432f6000005b0481565b60065460ff1690565b6363a5984081565b60405481565b600061140d611856565b9050600081118015611436575060425473ffffffffffffffffffffffffffffffffffffffff1615155b156114815760425460408051602080820183526000808352835191820190935291825261147c9273ffffffffffffffffffffffffffffffffffffffff1691849190613db2565b426044555b611489611387565b90506000811180156114b2575060435473ffffffffffffffffffffffffffffffffffffffff1615155b156114fd576043546040805160208082018352600080835283519182019093529182526114f89273ffffffffffffffffffffffffffffffffffffffff1691849190613db2565b426045555b50565b611508613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461159757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b692a5a058fc295ed00000081565b60416020526000908152604090205460ff1681565b3360009081526041602052604081205460ff1661167f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d696e74657200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600061168a84611a16565b90506116b684846040518060200160405280600081525060405180602001604052806000815250613db2565b60006116c185611a16565b91909111949350505050565b6116d5614051565b1561172b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b611733614072565b15611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b6117b333826040518060200160405280600081525060405180602001604052806000815250614093565b50436000908152603f60209081526040808320328452909152808220805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092553384529190922080549091169091179055565b60435473ffffffffffffffffffffffffffffffffffffffff1681565b6302e24800692a5a058fc295ed0000006113e8565b6302e2480081565b69250ec4ddca432f60000081565b6000426363a5984081111561186c57506363a598405b806044541061187f576000915050610fee565b6044546113d190660eaf7c417f043b906113cb908490613cfd565b600190565b6118b06118aa613039565b866125d2565b611905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615063602c913960400191505060405180910390fd5b61191485858585856001614345565b5050505050565b69054b40b1f852bda0000081565b611931613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff9081169116146119c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152604b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b611a46613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614611ad557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516201000090910473ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff169055565b60475481565b6360c3504081565b611b5f614051565b15611bb5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b611bbd614072565b15611c13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061508f6026913960400191505060405180910390fd5b611c4d82611c1f613039565b6113488460405180606001604052806024815260200161503f6024913961134188611c48613039565b612a68565b611c7782826040518060200160405280600081525060405180602001604052806000815250614093565b5050436000908152603f60209081526040808320328452909152808220805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092553384529190922080549091169091179055565b60495490565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b8073ffffffffffffffffffffffffffffffffffffffff16611d1b613039565b73ffffffffffffffffffffffffffffffffffffffff161415611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614eca6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615611e2357600a6000611dc2613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091851681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611e95565b600160096000611e31613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091861681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555b611e9d613039565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610fe65780601f1061107057610100808354040283529160200191610fe6565b611f9d611f83613039565b848484604051806020016040528060008152506001614345565b505050565b600073ffffffffffffffffffffffffffffffffffffffff8316612010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614f826021913960400191505060405180910390fd5b600061201a613039565b9050612048818286866040518060200160405280600081525060405180602001604052806000815250613184565b6000612076828387876040518060200160405280600081525060405180602001604052806000815250613424565b90506120a682838784604051806020016040528060008152506040518060200160405280600081525060006139df565b506001949350505050565b60445481565b60435473ffffffffffffffffffffffffffffffffffffffff16331461213f57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f2164657600000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166121c357604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612212613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff9081169116146122a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152604a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60465481565b612305613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff90811691161461239457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e881111561240557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604755565b60485473ffffffffffffffffffffffffffffffffffffffff1681565b61242e613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff9081169116146124bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661254157604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526041602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517f279360e293bcf8120adefa5fb6f669c774022ed25c09e099edd1818d155c57b69281900390910190a25050565b60035490565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612671575073ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205460ff168015612671575073ffffffffffffffffffffffffffffffffffffffff8083166000908152600a602090815260408083209387168352929052205460ff16155b806126ae575073ffffffffffffffffffffffffffffffffffffffff80831660009081526009602090815260408083209387168352929052205460ff165b9392505050565b600054610100900460ff16806126ce57506126ce614484565b806126dc575060005460ff16155b612731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff1615801561279757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61280d6040518060400160405280601081526020017f53616665446f6c6c6172205368617265000000000000000000000000000000008152506040518060400160405280600381526020017f5344530000000000000000000000000000000000000000000000000000000000815250600161448a565b73ffffffffffffffffffffffffffffffffffffffff821661289157604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408390556048805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560438054909116331790556000604681905560c86047556360c350406044819055604555600190604a9061290b613039565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001604b600061296a613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812080549515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009687161790559086168152604a8352818120805485166001908117909155604b909352208054909216179055612a356129f4613039565b612a1069054b40b1f852bda00000670de0b6b3a7640000614751565b6040518060200160405280600081525060405180602001604052806000815250613db2565b8015611f9d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205490565b612aa8613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614612b3757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612bbb57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612c0a613039565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff908116911614612c9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614e826026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b612da6613039565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614f126021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615612ece576001600a6000612e66613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091861681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055612f37565b60096000612eda613039565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091851681529252902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b612f3f613039565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b612fac612fa6613039565b856125d2565b613001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615063602c913960400191505060405180910390fd5b61300d84848484614093565b50505050565b61303561301e613039565b838360405180602001604052806000815250614093565b5050565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166130a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614e5d6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806151006023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000818152600b6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600c5460ff161561341c57604080517faabbb8ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b15801561323957600080fd5b505afa15801561324d573d6000803e3d6000fd5b505050506040513d602081101561326357600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff81161561341a578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561334f578181015183820152602001613337565b50505050905090810190601f16801561337c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156133af578181015183820152602001613397565b50505050905090810190601f1680156133dc5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561340157600080fd5b505af1158015613415573d6000803e3d6000fd5b505050505b505b505050505050565b73ffffffffffffffffffffffffffffffffffffffff85166000908152604a6020526040812054849060ff16158015613482575073ffffffffffffffffffffffffffffffffffffffff86166000908152604b602052604090205460ff16155b156136a557604754801561364c5760006134a86127106134a28985613d3f565b906147c5565b6048546040805160608101909152602c80825292935073ffffffffffffffffffffffffffffffffffffffff90911691613512918491614f33602083013973ffffffffffffffffffffffffffffffffffffffff8d16600090815260016020526040902054919061392e565b73ffffffffffffffffffffffffffffffffffffffff808c16600090815260016020526040808220939093559083168152205461354e9083614751565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205561357e8483613cfd565b60495490945061358e9083614751565b6049556040805173ffffffffffffffffffffffffffffffffffffffff8381168252602082018590528251908d16927f3518075fae16f1bca7d9a1f28fede590b3ee4854c3c0bb4c5259b4ed62aa1674928290030190a28073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505b5060465460009080156136a2576136696127106134a28984613d3f565b915061369589836040518060200160405280600081525060405180602001604052806000815250614093565b61369f8383613cfd565b92505b50505b6136ef81604051806060016040528060248152602001614eee6024913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260016020526040902054919061392e565b73ffffffffffffffffffffffffffffffffffffffff808916600090815260016020526040808220939093559088168152205461372b9082614751565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508091508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987848888604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613821578181015183820152602001613809565b50505050905090810190601f16801561384e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613881578181015183820152602001613869565b50505050905090810190601f1680156138ae5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3509695505050505050565b600081848411156139d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561399c578181015183820152602001613984565b50505050905090810190601f1680156139c95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600c5460ff161561341a57604080517faabbb8ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b158015613a9457600080fd5b505afa158015613aa8573d6000803e3d6000fd5b505050506040513d6020811015613abe57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff811615613c78578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613ba9578181015183820152602001613b91565b50505050905090810190601f168015613bd65780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613c09578181015183820152602001613bf1565b50505050905090810190601f168015613c365780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50505050613cf3565b8115613cf357613c9d8673ffffffffffffffffffffffffffffffffffffffff16614807565b15613cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d815260200180614fc4604d913960600191505060405180910390fd5b5050505050505050565b60006126ae83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061392e565b600082613d4e575060006110ba565b82820282848281613d5b57fe5b04146126ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614fa36021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416613e3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6000613e3e613039565b9050613e4d816000878761480d565b600254613e5a9085614751565b60025573ffffffffffffffffffffffffffffffffffffffff8516600090815260016020526040902054613e8d9085614751565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812091909155613ec690829087878787846139df565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613f5f578181015183820152602001613f47565b50505050905090810190601f168015613f8c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613fbf578181015183820152602001613fa7565b50505050905090810190601f168015613fec5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a360408051858152905173ffffffffffffffffffffffffffffffffffffffff8716916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b436000908152603f6020908152604080832032845290915290205460ff1690565b436000908152603f6020908152604080832033845290915290205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff84166140ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614ea86022913960400191505060405180910390fd5b6000614109613039565b9050614118818660008761480d565b61412781866000878787613184565b614171846040518060600160405280602381526020016150b56023913973ffffffffffffffffffffffffffffffffffffffff8816600090815260016020526040902054919061392e565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600160205260409020556002546141a49085613cfd565b6002556003546141b49085614751565b6003819055508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561425357818101518382015260200161423b565b50505050905090810190601f1680156142805780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156142b357818101518382015260200161429b565b50505050905090810190601f1680156142e05780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a360408051858152905160009173ffffffffffffffffffffffffffffffffffffffff8816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b73ffffffffffffffffffffffffffffffffffffffff86166143c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5344533a2073656e642066726f6d20746865207a65726f206164647265737300604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff851661444957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5344533a2073656e6420746f20746865207a65726f2061646472657373000000604482015290519081900360640190fd5b6000614453613039565b9050614463818888888888613184565b6000614473828989898989613424565b9050613cf3828989848989896139df565b303b1590565b600054610100900460ff16806144a357506144a3614484565b806144b1575060005460ff16155b614506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff1615801561456c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61457461491a565b61457e8484614a2d565b614586614b95565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515179081905560ff161561471d57604080517f29965a1d00000000000000000000000000000000000000000000000000000000815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad24916329965a1d91606480830192600092919082900301818387803b15801561465457600080fd5b505af1158015614668573d6000803e3d6000fd5b5050604080517f29965a1d00000000000000000000000000000000000000000000000000000000815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad2493506329965a1d9250606480830192600092919082900301818387803b15801561470457600080fd5b505af1158015614718573d6000803e3d6000fd5b505050505b801561300d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550505050565b6000828201838110156126ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006126ae83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614d29565b3b151590565b6148198484848461300d565b73ffffffffffffffffffffffffffffffffffffffff83166148b657604054614849826148436110c0565b90614751565b11156148b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6361702065786365656465640000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661300d57604080518082018252601781527f6275726e20616d6f756e742065786365656473206361700000000000000000006020820152905461491191839061392e565b60405550505050565b600054610100900460ff16806149335750614933614484565b80614941575060005460ff16155b614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff161580156149fc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b80156114fd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680614a465750614a46614484565b80614a54575060005460ff16155b614aa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff16158015614b0f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b8251614b22906004906020860190614da8565b508151614b36906005906020850190614da8565b50600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660121790558015611f9d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff1680614bae5750614bae614484565b80614bbc575060005460ff16155b614c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615011602e913960400191505060405180910390fd5b600054610100900460ff16158015614c7757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000614c81613039565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156114fd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60008183614d92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561399c578181015183820152602001613984565b506000838581614d9e57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614de957805160ff1916838001178555614e16565b82800160010185558215614e16579182015b82811115614e16578251825591602001919060010190614dfb565b50614e22929150614e26565b5090565b5b80821115614e225760008155600101614e2756fe5344533a207472616e7366657220746f20746865207a65726f20616464726573734552433737373a20617070726f76652066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433737373a206275726e2066726f6d20746865207a65726f20616464726573734552433737373a20617574686f72697a696e672073656c66206173206f70657261746f725344533a207472616e7366657220616d6f756e7420657863656564732062616c616e63654552433737373a207265766f6b696e672073656c66206173206f70657261746f725361666520446f6c6c61723a207472616e7366657220616d6f756e7420657863656564732062616c616e63655344533a207472616e736665722066726f6d20746865207a65726f206164647265737353444f3a207472616e7366657220746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433737373a20746f6b656e20726563697069656e7420636f6e747261637420686173206e6f20696d706c656d656e74657220666f7220455243373737546f6b656e73526563697069656e74436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e63654552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f7220666f7220686f6c646572436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e4552433737373a206275726e20616d6f756e7420657863656564732062616c616e636542444f76323a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433737373a20617070726f766520746f20746865207a65726f2061646472657373a26469706673582212202600855cfb6b84d9b444e5c2fc972c99bf6e4ffc488e112544ab8ea1fd1e50ad64736f6c634300060c0033
Deployed Bytecode Sourcemap
51525:11177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52464:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55519:192;;;;;;;;;;;;;;;;-1:-1:-1;55519:192:0;;;;;;;;;;;:::i;:::-;;52588:45;;;:::i;:::-;;;;;;;;;;;;;;;;39550:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35625:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41158:193;;;;;;;;;;;;;;;;-1:-1:-1;41158:193:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36426:117;;;:::i;54760:157::-;;;;;;;;;;;;;;;;-1:-1:-1;54760:157:0;;:::i;57149:738::-;;;;;;;;;;;;;;;;-1:-1:-1;57149:738:0;;;;;;;;;;;;;;;;;;:::i;61848:285::-;;;:::i;52368:87::-;;;:::i;36066:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52147:62;;;:::i;51674:18::-;;;:::i;62220:479::-;;;:::i;54443:118::-;;;;;;;;;;;;;;;;-1:-1:-1;54443:118:0;;;;:::i;51789:69::-;;;:::i;51701:38::-;;;;;;;;;;;;;;;;-1:-1:-1;51701:38:0;;;;:::i;55928:296::-;;;;;;;;;;;;;;;;-1:-1:-1;55928:296:0;;;;;;;;;:::i;56232:106::-;;;;;;;;;;;;;;;;-1:-1:-1;56232:106:0;;:::i;52499:22::-;;;:::i;52262:99::-;;;:::i;51996:51::-;;;:::i;51865:63::-;;;:::i;61531:309::-;;;:::i;36271:89::-;;;:::i;39800:367::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39800:367:0;;;;;;;;-1:-1:-1;39800:367:0;;-1:-1:-1;;39800:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39800:367:0;;-1:-1:-1;39800:367:0;;-1:-1:-1;;;;;39800:367:0:i;51935:52::-;;;:::i;55380:131::-;;;;;;;;;;;;;;;;-1:-1:-1;55380:131:0;;;;;;;;;;;:::i;36747:144::-;;;;;;;;;;;;;;;;-1:-1:-1;36747:144:0;;;;:::i;34921:148::-;;;:::i;52672:22::-;;;:::i;52054:46::-;;;:::i;56346:257::-;;;;;;;;;;;;;;;;-1:-1:-1;56346:257:0;;;;;;;;;:::i;55769:97::-;;;:::i;34279:79::-;;;:::i;38591:414::-;;;;;;;;;;;;;;;;-1:-1:-1;38591:414:0;;;;:::i;35778:96::-;;;:::i;37028:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37028:191:0;;-1:-1:-1;37028:191:0;;-1:-1:-1;;;;;37028:191:0:i;56674:467::-;;;;;;;;;;;;;;;;-1:-1:-1;56674:467:0;;;;;;;;;:::i;52530:51::-;;;:::i;54569:183::-;;;;;;;;;;;;;;;;-1:-1:-1;54569:183:0;;;;:::i;55237:135::-;;;;;;;;;;;;;;;;-1:-1:-1;55237:135:0;;;;;;;;;;;:::i;52642:23::-;;;:::i;54925:152::-;;;;;;;;;;;;;;;;-1:-1:-1;54925:152:0;;:::i;52735:22::-;;;:::i;54217:218::-;;;;;;;;;;;;;;;;-1:-1:-1;54217:218:0;;;;;;;;;;;:::i;36551:91::-;;;:::i;38237:282::-;;;;;;;;;;;;;;;;-1:-1:-1;38237:282:0;;;;;;;;;;;:::i;53441:768::-;;;;;;;;;;;;;;;;-1:-1:-1;53441:768:0;;;;;;;;;:::i;40868:145::-;;;;;;;;;;;;;;;;-1:-1:-1;40868:145:0;;;;;;;;;;;:::i;55085:144::-;;;;;;;;;;;;;;;;-1:-1:-1;55085:144:0;;;;:::i;35224:244::-;;;;;;;;;;;;;;;;-1:-1:-1;35224:244:0;;;;:::i;39074:405::-;;;;;;;;;;;;;;;;-1:-1:-1;39074:405:0;;;;:::i;40295:325::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40295:325:0;;;;;;;;-1:-1:-1;40295:325:0;;-1:-1:-1;;40295:325:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40295:325:0;;-1:-1:-1;40295:325:0;;-1:-1:-1;;;;;40295:325:0:i;38048:121::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38048:121:0;;-1:-1:-1;38048:121:0;;-1:-1:-1;;;;;38048:121:0:i;52464:28::-;;;;;;:::o;55519:192::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55618:28:::1;::::0;;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;:38;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;55667:16:::1;:26:::0;;;;;;:36;;;;::::1;;::::0;;55519:192::o;52588:45::-;;;;:::o;39550:124::-;39608:16;39644:22;39637:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39550:124;;:::o;35625:92::-;35704:5;35697:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35671:13;;35697:12;;35704:5;;35697:12;;35704:5;35697:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35697:12:0;;35625:92;-1:-1:-1;;;;;35625:92:0:o;41158:193::-;41232:4;41249:14;41266:12;:10;:12::i;:::-;41249:29;;41289:32;41298:6;41306:7;41315:5;41289:8;:32::i;:::-;41339:4;41332:11;;;41158:193;;;;;:::o;36426:117::-;36523:12;;36426:117;:::o;54760:157::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54851:4:::1;54838:9;:17;;54830:38;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;54889:8;:20:::0;54760:157::o;57149:738::-;57281:4;57306:23;;;57298:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57386:20;;;57378:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57459:15;57477:12;:10;:12::i;:::-;57459:30;;57502:61;57520:7;57529:6;57537:9;57548:6;57502:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;57576:19;57598:49;57604:7;57613:6;57621:9;57632:6;57598:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;57576:71;;57658:109;57667:6;57675:7;57684:82;57715:6;57684:82;;;;;;;;;;;;;;;;;:26;57694:6;57702:7;57684:9;:26::i;:::-;:30;:82;:30;:82::i;:::-;57658:8;:109::i;:::-;57780:75;57800:7;57809:6;57817:9;57828:11;57780:75;;;;;;;;;;;;;;;;;;;;;;;;57849:5;57780:19;:75::i;:::-;-1:-1:-1;57875:4:0;;57149:738;-1:-1:-1;;;;;57149:738:0:o;61848:285::-;61897:16;61941:15;52181:28;61971:14;;61967:34;;;-1:-1:-1;52181:28:0;61967:34;62038:4;62016:18;;:26;62012:40;;62051:1;62044:8;;;;;62012:40;62083:18;;62074:51;;52412:43;;62074:28;;:4;;:8;:28::i;:::-;:32;;:51::i;:::-;62063:62;;61848:285;;:::o;52368:87::-;52039:8;51916:12;52412:43;;52368:87;:::o;36066:83::-;36132:9;;;;36066:83;:::o;52147:62::-;52181:28;52147:62;:::o;51674:18::-;;;;:::o;62220:479::-;62264:16;62283:24;:22;:24::i;:::-;62264:43;;62333:1;62322:8;:12;:43;;;;-1:-1:-1;62338:13:0;;:27;:13;:27;;62322:43;62318:171;;;62388:13;;62382:38;;;;;;;;;62388:13;62382:38;;;;;;;;;;;;;;;;62388:13;;;62403:8;;62382:38;:5;:38::i;:::-;62462:15;62435:24;:42;62318:171;62510:18;:16;:18::i;:::-;62499:29;;62554:1;62543:8;:12;:37;;;;-1:-1:-1;62559:7:0;;:21;:7;:21;;62543:37;62539:153;;;62603:7;;62597:32;;;;;;;;;62603:7;62597:32;;;;;;;;;;;;;;;;62603:7;;;62612:8;;62597:32;:5;:32::i;:::-;62665:15;62644:18;:36;62539:153;62220:479;:::o;54443:118::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54523:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;54443:118::o;51789:69::-;51846:12;51789:69;:::o;51701:38::-;;;;;;;;;;;;;;;:::o;55928:296::-;53344:10;56006:4;53337:18;;;:6;:18;;;;;;;;53329:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56023:21:::1;56047;56057:10;56047:9;:21::i;:::-;56023:45;;56079:34;56085:10;56097:7;56079:34;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;56124:20;56147:21;56157:10;56147:9;:21::i;:::-;56188:28:::0;;;::::1;::::0;55928:296;-1:-1:-1;;;;55928:296:0:o;56232:106::-;50896:28;:26;:28::i;:::-;50895:29;50887:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50987:28;:26;:28::i;:::-;50986:29;50978:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56296:34:::1;56302:10;56314:7;56296:34;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;-1:-1:-1::0;51093:12:0;51085:21;;;;:7;:21;;;;;;;;51107:9;51085:32;;;;;;;;:39;;51120:4;51085:39;;;;;;;;;51157:10;51135:33;;;;;;:40;;;;;;;;;;56232:106::o;52499:22::-;;;;;;:::o;52262:99::-;52039:8;51846:12;52312:49;;51996:51;52039:8;51996:51;:::o;51865:63::-;51916:12;51865:63;:::o;61531:309::-;61586:16;61630:15;52181:28;61660:14;;61656:34;;;-1:-1:-1;52181:28:0;61656:34;61733:4;61705:24;;:32;61701:46;;61746:1;61739:8;;;;;61701:46;61778:24;;61769:63;;52312:49;;61769:34;;:4;;:8;:34::i;36271:89::-;36351:1;36271:89;:::o;39800:367::-;40006:35;40020:12;:10;:12::i;:::-;40034:6;40006:13;:35::i;:::-;39998:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40101:58;40107:6;40115:9;40126:6;40134:4;40140:12;40154:4;40101:5;:58::i;:::-;39800:367;;;;;:::o;51935:52::-;51976:11;51935:52;:::o;55380:131::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55467:26:::1;::::0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:36;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;55380:131::o;36747:144::-;36861:22;;36834:7;36861:22;;;:9;:22;;;;;;;36747:144::o;34921:148::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35028:1:::1;35012:6:::0;;34991:40:::1;::::0;35012:6;;;::::1;34991:40;35012:6;::::0;34991:40:::1;::::0;35028:1;;34991:40:::1;35059:1;35042:19:::0;;;::::1;::::0;;34921:148::o;52672:22::-;;;;:::o;52054:46::-;52090:10;52054:46;:::o;56346:257::-;50896:28;:26;:28::i;:::-;50895:29;50887:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50987:28;:26;:28::i;:::-;50986:29;50978:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56432:120:::1;56441:8;56451:12;:10;:12::i;:::-;56465:86;56503:7;56465:86;;;;;;;;;;;;;;;;;:33;56475:8;56485:12;:10;:12::i;:::-;56465:9;:33::i;56432:120::-;56563:32;56569:8;56579:7;56563:32;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:5:::1;:32::i;:::-;-1:-1:-1::0;;51093:12:0;51085:21;;;;:7;:21;;;;;;;;51107:9;51085:32;;;;;;;;:39;;51120:4;51085:39;;;;;;;;;51157:10;51135:33;;;;;;:40;;;;;;;;;;56346:257::o;55769:97::-;55844:14;;55769:97;:::o;34279:79::-;34317:7;34344:6;;;;;;;34279:79::o;38591:414::-;38687:8;38671:24;;:12;:10;:12::i;:::-;:24;;;;38663:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38753:27;;;;;;;:17;:27;;;;;;;;38749:189;;;38804:24;:38;38829:12;:10;:12::i;:::-;38804:38;;;;;;;;;;;;;;;;;;-1:-1:-1;38804:38:0;;;:48;;;;;;;;;38797:55;;;;;;38749:189;;;38922:4;38885:10;:24;38896:12;:10;:12::i;:::-;38885:24;;;;;;;;;;;;;;;;;;-1:-1:-1;38885:24:0;;;:34;;;;;;;;;:41;;;;;;;;;;;;;38749:189;38984:12;:10;:12::i;:::-;38955:42;;38974:8;38955:42;;;;;;;;;;;;38591:414;:::o;35778:96::-;35859:7;35852:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35826:13;;35852:14;;35859:7;;35852:14;;35859:7;35852:14;;;;;;;;;;;;;;;;;;;;;;;;37028:191;37157:54;37163:12;:10;:12::i;:::-;37177:9;37188:6;37196:4;37157:54;;;;;;;;;;;;37206:4;37157:5;:54::i;:::-;37028:191;;;:::o;56674:467::-;56752:4;56777:23;;;56769:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56851:12;56866;:10;:12::i;:::-;56851:27;;56891:56;56909:4;56915;56921:9;56932:6;56891:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;56960:19;56982:44;56988:4;56994;57000:9;57011:6;56982:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;56960:66;;57039:70;57059:4;57065;57071:9;57082:11;57039:70;;;;;;;;;;;;;;;;;;;;;;;;57103:5;57039:19;:70::i;:::-;-1:-1:-1;57129:4:0;;56674:467;-1:-1:-1;;;;56674:467:0:o;52530:51::-;;;;:::o;54569:183::-;54649:7;;;;54635:10;:21;54627:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54684:22;;;54676:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54726:7;:18;;;;;;;;;;;;;;;54569:183::o;55237:135::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55326:28:::1;::::0;;;::::1;;::::0;;;:18:::1;:28;::::0;;;;:38;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;55237:135::o;52642:23::-;;;;:::o;54925:152::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55013:4:::1;55001:8;:16;;54993:37;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;55051:7;:18:::0;54925:152::o;52735:22::-;;;;;;:::o;54217:218::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54308:22:::1;::::0;::::1;54300:39;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;54350:16;::::0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;;;;:28;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;54394:33;;;;;;;::::1;::::0;;;;;;;;::::1;54217:218:::0;;:::o;36551:91::-;36622:12;;36551:91;:::o;38237:282::-;38329:4;38378:11;38366:23;;:8;:23;;;:108;;;-1:-1:-1;38394:27:0;;;;;;;:17;:27;;;;;;;;:79;;;;-1:-1:-1;38426:37:0;;;;;;;;:24;:37;;;;;;;;:47;;;;;;;;;;;;38425:48;38394:79;38366:145;;;-1:-1:-1;38478:23:0;;;;;;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;38366:145;38346:165;38237:282;-1:-1:-1;;;38237:282:0:o;53441:768::-;31851:12;;;;;;;;:31;;;31867:15;:13;:15::i;:::-;31851:47;;;-1:-1:-1;31887:11:0;;;;31886:12;31851:47;31843:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31962:19;31985:12;;;;;;31984:13;32008:99;;;;32043:12;:19;;32077:18;32043:19;;;;;;32077:18;32058:4;32077:18;;;32008:99;53523:46:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;53564:4:::1;53523:13;:46::i;:::-;53588:22;::::0;::::1;53580:39;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53630:3;:10:::0;;;53651:7:::1;:18:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;53680:7:::1;:20:::0;;;;::::1;53690:10;53680:20;::::0;;53651:7:::1;53711:8;:12:::0;;;53750:3:::1;53740:7;:13:::0;52090:10:::1;53820:24;:36:::0;;;53867:18:::1;:30:::0;53651:18;;53908::::1;::::0;53927:12:::1;:10;:12::i;:::-;53908:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;53991:4;53958:16;:30;53975:12;:10;:12::i;:::-;53958:30;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;53958:30:0;;;:37;;;::::1;;::::0;;;::::1;;::::0;;54006:28;;::::1;::::0;;:18:::1;:28:::0;;;;;:35;;;::::1;53958:37:::0;54006:35;;::::1;::::0;;;54052:16:::1;:26:::0;;;;:33;;;;::::1;;::::0;;54096:56:::1;54102:12;:10;:12::i;:::-;54116:27;51976:11;54135:7;54116:18;:27::i;:::-;54096:56;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:5:::1;:56::i;:::-;32137:14:::0;32133:67;;;32183:5;32168:20;;;;;;53441:768;;;:::o;40868:145::-;40977:19;;;;40950:7;40977:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;40868:145::o;55085:144::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55161:22:::1;::::0;::::1;55153:39;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;55203:7;:18:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;55085:144::o;35224:244::-;34501:12;:10;:12::i;:::-;34491:6;;;;;:22;:6;;;:22;;;34483:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35313:22:::1;::::0;::::1;35305:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35415:6;::::0;;35394:38:::1;::::0;::::1;::::0;;::::1;::::0;35415:6;;;::::1;;::::0;35394:38:::1;::::0;::::1;35443:6;:17:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;35224:244::o;39074:405::-;39163:12;:10;:12::i;:::-;39151:24;;:8;:24;;;;39143:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39230:27;;;;;;;:17;:27;;;;;;;;39226:189;;;39325:4;39274:24;:38;39299:12;:10;:12::i;:::-;39274:38;;;;;;;;;;;;;;;;;;-1:-1:-1;39274:38:0;;;:48;;;;;;;;;:55;;;;;;;;;;;;;39226:189;;;39369:10;:24;39380:12;:10;:12::i;:::-;39369:24;;;;;;;;;;;;;;;;;;-1:-1:-1;39369:24:0;;;:34;;;;;;;;;39362:41;;;;;;39226:189;39458:12;:10;:12::i;:::-;39432:39;;39448:8;39432:39;;;;;;;;;;;;39074:405;:::o;40295:325::-;40474:36;40488:12;:10;:12::i;:::-;40502:7;40474:13;:36::i;:::-;40466:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40570:42;40576:7;40585:6;40593:4;40599:12;40570:5;:42::i;:::-;40295:325;;;;:::o;38048:121::-;38124:37;38130:12;:10;:12::i;:::-;38144:6;38152:4;38124:37;;;;;;;;;;;;:5;:37::i;:::-;38048:121;;:::o;605:106::-;693:10;605:106;:::o;46797:375::-;46925:20;;;46917:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47006:21;;;46998:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47080:19;;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:36;;;47132:32;;;;;;;;;;;;;;;;;46797:375;;;:::o;47656:555::-;47878:26;;;;47874:330;;;47943:78;;;;;;:41;:78;;;;;;30688:66;47943:78;;;;;;47921:19;;30152:42;;47943:41;;:78;;;;;;;;;;;;;;;30152:42;47943:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47943:78:0;;-1:-1:-1;48040:25:0;;;;48036:157;;48100:11;48086:39;;;48126:8;48136:4;48142:2;48146:6;48154:8;48164:12;48086:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48086:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48036:157;47874:330;;47656:555;;;;;;:::o;59796:1727::-;60084:24;;;60010:19;60084:24;;;:18;:24;;;;;;60060:6;;60084:24;;60083:25;:50;;;;-1:-1:-1;60113:20:0;;;;;;;:16;:20;;;;;;;;60112:21;60083:50;60079:1134;;;60188:7;;60218:12;;60214:616;;60255:18;60276:31;60301:5;60276:20;:6;60287:8;60276:10;:20::i;:::-;:24;;:31::i;:::-;60349:7;;60397:79;;;;;;;;;;;;;60255:52;;-1:-1:-1;60349:7:0;;;;;60397:79;;60255:52;;60397:79;;;;;:15;;;;;;;:9;:15;;;;;;;:79;:19;:79::i;:::-;60379:15;;;;;;;;:9;:15;;;;;;:97;;;;60521:19;;;;;;;:35;;60545:10;60521:23;:35::i;:::-;60499:19;;;;;;;:9;:19;;;;;:57;60589:23;:7;60601:10;60589:11;:23::i;:::-;60652:14;;60579:33;;-1:-1:-1;60652:30:0;;60671:10;60652:18;:30::i;:::-;60635:14;:47;60710:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60789:8;60774:36;;60783:4;60774:36;;;60799:10;60774:36;;;;;;;;;;;;;;;;;;60214:616;;;-1:-1:-1;60940:8:0;;60878:19;;60971:13;;60967:220;;61023:32;61049:5;61023:21;:6;61034:9;61023:10;:21::i;:32::-;61009:46;;61078:32;61084:4;61090:11;61078:32;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;61143:24;:7;61155:11;61143;:24::i;:::-;61133:34;;60967:220;60079:1134;;;61243:68;61263:7;61243:68;;;;;;;;;;;;;;;;;:15;;;;;;;:9;:15;;;;;;;:68;:19;:68::i;:::-;61225:15;;;;;;;;:9;:15;;;;;;:86;;;;61338:13;;;;;;;:26;;61356:7;61338:17;:26::i;:::-;61322:9;:13;61332:2;61322:13;;;;;;;;;;;;;;;:42;;;;61389:7;61375:21;;61436:2;61414:58;;61430:4;61414:58;;61419:9;61414:58;;;61440:7;61449:8;61459:12;61414:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61414:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61503:2;61488:27;;61497:4;61488:27;;;61507:7;61488:27;;;;;;;;;;;;;;;;;;59796:1727;;;;;;;;;:::o;13980:226::-;14100:7;14136:12;14128:6;;;;14120:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14172:5:0;;;13980:226::o;48913:770::-;49172:26;;;;49168:508;;;49237:79;;;;;;:41;:79;;;;;;30866:66;49237:79;;;;;;49215:19;;30152:42;;49237:41;;:79;;;;;;;;;;;;;;;30152:42;49237:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49237:79:0;;-1:-1:-1;49335:25:0;;;;49331:334;;49398:11;49381:44;;;49426:8;49436:4;49442:2;49446:6;49454:8;49464:12;49381:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49381:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49331:334;;;49503:19;49499:166;;;49552:15;:2;:13;;;:15::i;:::-;49551:16;49543:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49168:508;48913:770;;;;;;;:::o;13541:136::-;13599:7;13626:43;13630:1;13633;13626:43;;;;;;;;;;;;;;;;;:3;:43::i;14465:471::-;14523:7;14768:6;14764:47;;-1:-1:-1;14798:1:0;14791:8;;14764:47;14835:5;;;14839:1;14835;:5;:1;14859:5;;;;;:10;14851:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43053:738;43230:21;;;43222:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43301:16;43320:12;:10;:12::i;:::-;43301:31;;43345:59;43366:8;43384:1;43388:7;43397:6;43345:20;:59::i;:::-;43467:12;;:24;;43484:6;43467:16;:24::i;:::-;43452:12;:39;43523:18;;;;;;;:9;:18;;;;;;:30;;43546:6;43523:22;:30::i;:::-;43502:18;;;;;;;:9;:18;;;;;:51;;;;43566:89;;43586:8;;43512:7;43617:6;43625:8;43635:12;43502:18;43566:19;:89::i;:::-;43690:7;43673:57;;43680:8;43673:57;;;43699:6;43707:8;43717:12;43673:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43673:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43746:37;;;;;;;;;;;;43763:1;;43746:37;;;;;;;;;43053:738;;;;;:::o;50585:125::-;50678:12;50646:4;50670:21;;;:7;:21;;;;;;;;50692:9;50670:32;;;;;;;;;;50585:125;:::o;50718:126::-;50811:12;50779:4;50803:21;;;:7;:21;;;;;;;;50825:10;50803:33;;;;;;;;;;50718:126;:::o;45260:784::-;45430:18;;;45422:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45500:16;45519:12;:10;:12::i;:::-;45500:31;;45544:56;45565:8;45575:4;45589:1;45593:6;45544:20;:56::i;:::-;45613:73;45631:8;45641:4;45655:1;45659:6;45667:4;45673:12;45613:17;:73::i;:::-;45752:66;45772:6;45752:66;;;;;;;;;;;;;;;;;:15;;;;;;;:9;:15;;;;;;;:66;:19;:66::i;:::-;45734:15;;;;;;;:9;:15;;;;;:84;45844:12;;:24;;45861:6;45844:16;:24::i;:::-;45829:12;:39;45894:12;;:24;;45911:6;45894:16;:24::i;:::-;45879:12;:39;;;;45953:4;45936:50;;45943:8;45936:50;;;45959:6;45967:4;45973:12;45936:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45936:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46002:34;;;;;;;;46025:1;;46002:34;;;;;;;;;;;;;45260:784;;;;;:::o;59094:694::-;59325:18;;;59317:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59398:16;;;59390:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59461:17;59481:12;:10;:12::i;:::-;59461:32;;59506:70;59524:9;59535:4;59541:2;59545:6;59553:8;59563:12;59506:17;:70::i;:::-;59589:19;59611:58;59617:9;59628:4;59634:2;59638:6;59646:8;59656:12;59611:5;:58::i;:::-;59589:80;;59682:98;59702:9;59713:4;59719:2;59723:11;59736:8;59746:12;59760:19;59682;:98::i;32300:568::-;32741:4;32808:17;32853:7;32300:568;:::o;33151:656::-;31851:12;;;;;;;;:31;;;31867:15;:13;:15::i;:::-;31851:47;;;-1:-1:-1;31887:11:0;;;;31886:12;31851:47;31843:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31962:19;31985:12;;;;;;31984:13;32008:99;;;;32043:12;:19;;32077:18;32043:19;;;;;;32077:18;32058:4;32077:18;;;32008:99;33312:26:::1;:24;:26::i;:::-;33349:37;33373:4;33379:6;33349:23;:37::i;:::-;33397:26;:24;:26::i;:::-;33436;:52:::0;;;::::1;::::0;::::1;;;::::0;;;;::::1;33537:26;33533:267;;;33580:97;::::0;;;;;33630:4:::1;33580:97;::::0;::::1;::::0;;;33637:24:::1;33580:97:::0;;;;;;;;;;30152:42:::1;::::0;33580:41:::1;::::0;:97;;;;;-1:-1:-1;;33580:97:0;;;;;;;-1:-1:-1;30152:42:0;33580:97;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33692:96:0::1;::::0;;;;;33742:4:::1;33692:96;::::0;::::1;::::0;;;33749:23:::1;33692:96:::0;;;;;;;;;;30152:42:::1;::::0;-1:-1:-1;33692:41:0::1;::::0;-1:-1:-1;33692:96:0;;;;;-1:-1:-1;;33692:96:0;;;;;;;-1:-1:-1;30152:42:0;33692:96;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33533:267;32137:14:::0;32133:67;;;32183:5;32168:20;;;;;;33151:656;;;;:::o;13077:181::-;13135:7;13167:5;;;13191:6;;;;13183:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15412:132;15470:7;15497:39;15501:1;15504;15497:39;;;;;;;;;;;;;;;;;:3;:39::i;18320:444::-;18700:20;18748:8;;;18320:444::o;58074:533::-;58240:58;58267:9;58278:5;58285:3;58290:7;58240:26;:58::i;:::-;58313:19;;;58309:146;;58423:3;;58393:26;58411:7;58393:13;:11;:13::i;:::-;:17;;:26::i;:::-;:33;;58385:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58469:17;;;58465:135;;58545:43;;;;;;;;;;;;;;;;:3;;:43;;58553:7;;58545;:43::i;:::-;58539:3;:49;58074:533;;;;:::o;32976:59::-;31851:12;;;;;;;;:31;;;31867:15;:13;:15::i;:::-;31851:47;;;-1:-1:-1;31887:11:0;;;;31886:12;31851:47;31843:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31962:19;31985:12;;;;;;31984:13;32008:99;;;;32043:12;:19;;32077:18;32043:19;;;;;;32077:18;32058:4;32077:18;;;32008:99;32137:14;32133:67;;;32183:5;32168:20;;;;;;32976:59;:::o;33815:179::-;31851:12;;;;;;;;:31;;;31867:15;:13;:15::i;:::-;31851:47;;;-1:-1:-1;31887:11:0;;;;31886:12;31851:47;31843:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31962:19;31985:12;;;;;;31984:13;32008:99;;;;32043:12;:19;;32077:18;32043:19;;;;;;32077:18;32058:4;32077:18;;;32008:99;33922:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;33945:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;33972:9:0::1;:14:::0;;;::::1;33984:2;33972:14;::::0;;32133:67;;;;32183:5;32168:20;;;;;;33815:179;;;:::o;34002:196::-;31851:12;;;;;;;;:31;;;31867:15;:13;:15::i;:::-;31851:47;;;-1:-1:-1;31887:11:0;;;;31886:12;31851:47;31843:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31962:19;31985:12;;;;;;31984:13;32008:99;;;;32043:12;:19;;32077:18;32043:19;;;;;;32077:18;32058:4;32077:18;;;32008:99;34070:17:::1;34090:12;:10;:12::i;:::-;34113:6;:18:::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;34147:43:::1;::::0;34113:18;;-1:-1:-1;34113:18:0;34147:43:::1;::::0;34113:6;;34147:43:::1;32119:1;32137:14:::0;32133:67;;;32183:5;32168:20;;;;;;34002:196;:::o;16040:312::-;16160:7;16195:12;16188:5;16180:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16219:9;16235:1;16231;:5;;;;;;;16040:312;-1:-1:-1;;;;;16040:312:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://2600855cfb6b84d9b444e5c2fc972c99bf6e4ffc488e112544ab8ea1fd1e50ad
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.