Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Zoracles
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-26 */ // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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); } } } } // File: @openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol pragma solidity ^0.6.0; /** * @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 SafeMathUpgradeable { /** * @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; } } // File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); } // File: @openzeppelin/contracts-upgradeable/proxy/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already 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; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(self) } return cs == 0; } } // File: @openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } 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; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} 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}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * 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 from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } 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; } uint256[49] private __gap; } // File: localhost/contracts/Zoracles.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.12; // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol // Zoracles with Governance contract Zoracles is ERC20Upgradeable, OwnableUpgradeable { function initialize() public initializer { __ERC20_init("Zoracles", "ZORA"); _setupDecimals(9); __Ownable_init(); _mint(msg.sender, 10000 * 10**uint256(decimals())); _moveDelegates( address(0), _delegates[msg.sender], 1000 * 10**uint256(decimals()) ); } /// @notice Creates `_amount` token to `_to`. Must only be called by the timelock. function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } // /// @notice Creates `_amount` token to `_to`. Must only be called by the timelock. // function burn(address _to, uint256 _amount) public onlyOwner { // _burn(_to, _amount); // } /// @dev A record of each accounts delegate mapping(address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256( "Delegation(address delegatee,uint256 nonce,uint256 expiry)" ); /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "ZORA::delegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "ZORA::delegateBySig: invalid nonce" ); require(now <= expiry, "ZORA::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) { require( blockNumber < block.number, "ZORA::getPriorVotes: not yet determined" ); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying Zoras (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates( address srcRep, address dstRep, uint256 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32( block.number, "ZORA::_writeCheckpoint: block number exceeds 32 bits" ); if ( nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber ) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint( blockNumber, newVotes ); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":"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":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"sender","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"}]
Contract Creation Code
608060405234801561001057600080fd5b506137e7806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063782d6fe1116100de578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e14610893578063e7a324dc1461090b578063f1127ed814610929578063f2fde38b1461099e5761018e565b8063a9059cbb1461075e578063b4b5ea57146107c2578063c3cda5201461081a5761018e565b8063782d6fe11461057f5780637ecebe00146105e15780638129fc1c146106395780638da5cb5b1461064357806395d89b4114610677578063a457c2d7146106fa5761018e565b8063395093511161014b5780635c19a95c116101255780635c19a95c1461047b5780636fcfff45146104bf57806370a082311461051d578063715018a6146105755761018e565b8063395093511461035b57806340c10f19146103bf578063587cde1e1461040d5761018e565b806306fdde0314610193578063095ea7b31461021657806318160ddd1461027a57806320606b701461029857806323b872dd146102b6578063313ce5671461033a575b600080fd5b61019b6109e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101db5780820151818401526020810190506101c0565b50505050905090810190601f1680156102085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102626004803603604081101561022c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a84565b60405180821515815260200191505060405180910390f35b610282610aa2565b6040518082815260200191505060405180910390f35b6102a0610aac565b6040518082815260200191505060405180910390f35b610322600480360360608110156102cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ad0565b60405180821515815260200191505060405180910390f35b610342610ba9565b604051808260ff16815260200191505060405180910390f35b6103a76004803603604081101561037157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bc0565b60405180821515815260200191505060405180910390f35b61040b600480360360408110156103d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c73565b005b61044f6004803603602081101561042357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610db6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104bd6004803603602081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e1f565b005b610501600480360360208110156104d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e2c565b604051808263ffffffff16815260200191505060405180910390f35b61055f6004803603602081101561053357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e4f565b6040518082815260200191505060405180910390f35b61057d610e98565b005b6105cb6004803603604081101561059557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611023565b6040518082815260200191505060405180910390f35b610623600480360360208110156105f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e4565b6040518082815260200191505060405180910390f35b6106416113fc565b005b61064b611617565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61067f611641565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106bf5780820151818401526020810190506106a4565b50505050905090810190601f1680156106ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107466004803603604081101561071057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116e3565b60405180821515815260200191505060405180910390f35b6107aa6004803603604081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117b0565b60405180821515815260200191505060405180910390f35b610804600480360360208110156107d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ce565b6040518082815260200191505060405180910390f35b610891600480360360c081101561083057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506118a4565b005b6108f5600480360360408110156108a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c08565b6040518082815260200191505060405180910390f35b610913611c8f565b6040518082815260200191505060405180910390f35b61097b6004803603604081101561093f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff169060200190929190505050611cb3565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b6109e0600480360360208110156109b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf4565b005b606060368054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050905090565b6000610a98610a91611f04565b8484611f0c565b6001905092915050565b6000603554905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610add848484612103565b610b9e84610ae9611f04565b610b998560405180606001604052806028815260200161369b60289139603460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b4f611f04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b611f0c565b600190509392505050565b6000603860009054906101000a900460ff16905090565b6000610c69610bcd611f04565b84610c648560346000610bde611f04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248890919063ffffffff16565b611f0c565b6001905092915050565b610c7b611f04565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610d478282612510565b610db26000609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836126d9565b5050565b6000609760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610e293382612976565b50565b60996020528060005260406000206000915054906101000a900463ffffffff1681565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ea0611f04565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600043821061107d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806137406027913960400191505060405180910390fd5b6000609960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156110ea5760009150506113de565b82609860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116111d457609860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101549150506113de565b82609860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156112555760009150506113de565b6000806001830390505b8163ffffffff168163ffffffff161115611378576000600283830363ffffffff168161128757fe5b04820390506112946134d6565b609860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415611350578060200151955050505050506113de565b86816000015163ffffffff16101561136a57819350611371565b6001820392505b505061125f565b609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b609a6020528060005260406000206000915090505481565b600060019054906101000a900460ff168061141b575061141a612ae7565b5b80611431575060008054906101000a900460ff16155b611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156114d6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61154a6040518060400160405280600881526020017f5a6f7261636c65730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5a4f524100000000000000000000000000000000000000000000000000000000815250612afe565b6115546009612c10565b61155c612c2e565b61157733611568610ba9565b60ff16600a0a61271002612510565b6115f36000609760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166115e4610ba9565b60ff16600a0a6103e8026126d9565b80156116145760008060016101000a81548160ff0219169083151502179055505b50565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116d95780601f106116ae576101008083540402835291602001916116d9565b820191906000526020600020905b8154815290600101906020018083116116bc57829003601f168201915b5050505050905090565b60006117a66116f0611f04565b846117a18560405180606001604052806025815260200161378d602591396034600061171a611f04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b611f0c565b6001905092915050565b60006117c46117bd611f04565b8484612103565b6001905092915050565b600080609960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161183857600061189c565b609860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666118cf6109e2565b805190602001206118de612d3c565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611a62573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137676026913960400191505060405180910390fd5b609a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558914611b99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136256022913960400191505060405180910390fd5b87421115611bf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806136476026913960400191505060405180910390fd5b611bfc818b612976565b50505050505050505050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6098602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b611cfc611f04565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135b76026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061371c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612018576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135dd6022913960400191505060405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806136f76025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561220f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135946023913960400191505060405180910390fd5b61221a838383612d49565b612286816040518060600160405280602681526020016135ff60269139603360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061231b81603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248890919063ffffffff16565b603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612475576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561243a57808201518184015260208101905061241f565b50505050905090810190601f1680156124675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015612506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6125bf60008383612d49565b6125d48160355461248890919063ffffffff16565b60358190555061262c81603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248890919063ffffffff16565b603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127155750600081115b1561297157600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612845576000609960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116127b857600061281c565b609860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006128338483612d4e90919063ffffffff16565b905061284186848484612d98565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612970576000609960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116128e3576000612947565b609860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061295e848361248890919063ffffffff16565b905061296c85848484612d98565b5050505b5b505050565b6000609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006129e584610e4f565b905082609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612ae18284836126d9565b50505050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff1680612b1d5750612b1c612ae7565b5b80612b33575060008054906101000a900460ff16155b612b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612bd8576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612be061302c565b612bea838361312a565b8015612c0b5760008060016101000a81548160ff0219169083151502179055505b505050565b80603860006101000a81548160ff021916908360ff16021790555050565b600060019054906101000a900460ff1680612c4d5750612c4c612ae7565b5b80612c63575060008054906101000a900460ff16155b612cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612d08576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612d1061302c565b612d18613274565b8015612d395760008060016101000a81548160ff0219169083151502179055505b50565b6000804690508091505090565b505050565b6000612d9083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123c8565b905092915050565b6000612dbc436040518060600160405280603481526020016136c36034913961341b565b905060008463ffffffff16118015612e5157508063ffffffff16609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15612ec25781609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060010181905550612fcf565b60405180604001604052808263ffffffff16815260200183815250609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401609960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b600060019054906101000a900460ff168061304b575061304a612ae7565b5b80613061575060008054906101000a900460ff16155b6130b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015613106576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156131275760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806131495750613148612ae7565b5b8061315f575060008054906101000a900460ff16155b6131b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015613204576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b826036908051906020019061321a9291906134f6565b5081603790805190602001906132319291906134f6565b506012603860006101000a81548160ff021916908360ff160217905550801561326f5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806132935750613292612ae7565b5b806132a9575060008054906101000a900460ff16155b6132fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561334e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000613358611f04565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156134185760008060016101000a81548160ff0219169083151502179055505b50565b6000640100000000831082906134cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613491578082015181840152602081019050613476565b50505050905090810190601f1680156134be5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061353757805160ff1916838001178555613565565b82800160010185558215613565579182015b82811115613564578251825591602001919060010190613549565b5b5090506135729190613576565b5090565b5b8082111561358f576000816000905550600101613577565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655a4f52413a3a64656c656761746542795369673a20696e76616c6964206e6f6e63655a4f52413a3a64656c656761746542795369673a207369676e61747572652065787069726564496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655a4f52413a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735a4f52413a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e65645a4f52413a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b9b45f0f8af0542957a971f2e169580f0c2dd269054344042a9574cce860846364736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063782d6fe1116100de578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e14610893578063e7a324dc1461090b578063f1127ed814610929578063f2fde38b1461099e5761018e565b8063a9059cbb1461075e578063b4b5ea57146107c2578063c3cda5201461081a5761018e565b8063782d6fe11461057f5780637ecebe00146105e15780638129fc1c146106395780638da5cb5b1461064357806395d89b4114610677578063a457c2d7146106fa5761018e565b8063395093511161014b5780635c19a95c116101255780635c19a95c1461047b5780636fcfff45146104bf57806370a082311461051d578063715018a6146105755761018e565b8063395093511461035b57806340c10f19146103bf578063587cde1e1461040d5761018e565b806306fdde0314610193578063095ea7b31461021657806318160ddd1461027a57806320606b701461029857806323b872dd146102b6578063313ce5671461033a575b600080fd5b61019b6109e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101db5780820151818401526020810190506101c0565b50505050905090810190601f1680156102085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102626004803603604081101561022c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a84565b60405180821515815260200191505060405180910390f35b610282610aa2565b6040518082815260200191505060405180910390f35b6102a0610aac565b6040518082815260200191505060405180910390f35b610322600480360360608110156102cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ad0565b60405180821515815260200191505060405180910390f35b610342610ba9565b604051808260ff16815260200191505060405180910390f35b6103a76004803603604081101561037157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bc0565b60405180821515815260200191505060405180910390f35b61040b600480360360408110156103d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c73565b005b61044f6004803603602081101561042357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610db6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104bd6004803603602081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e1f565b005b610501600480360360208110156104d557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e2c565b604051808263ffffffff16815260200191505060405180910390f35b61055f6004803603602081101561053357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e4f565b6040518082815260200191505060405180910390f35b61057d610e98565b005b6105cb6004803603604081101561059557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611023565b6040518082815260200191505060405180910390f35b610623600480360360208110156105f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e4565b6040518082815260200191505060405180910390f35b6106416113fc565b005b61064b611617565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61067f611641565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106bf5780820151818401526020810190506106a4565b50505050905090810190601f1680156106ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107466004803603604081101561071057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116e3565b60405180821515815260200191505060405180910390f35b6107aa6004803603604081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117b0565b60405180821515815260200191505060405180910390f35b610804600480360360208110156107d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117ce565b6040518082815260200191505060405180910390f35b610891600480360360c081101561083057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506118a4565b005b6108f5600480360360408110156108a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c08565b6040518082815260200191505060405180910390f35b610913611c8f565b6040518082815260200191505060405180910390f35b61097b6004803603604081101561093f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff169060200190929190505050611cb3565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b6109e0600480360360208110156109b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf4565b005b606060368054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b5050505050905090565b6000610a98610a91611f04565b8484611f0c565b6001905092915050565b6000603554905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610add848484612103565b610b9e84610ae9611f04565b610b998560405180606001604052806028815260200161369b60289139603460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b4f611f04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b611f0c565b600190509392505050565b6000603860009054906101000a900460ff16905090565b6000610c69610bcd611f04565b84610c648560346000610bde611f04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248890919063ffffffff16565b611f0c565b6001905092915050565b610c7b611f04565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610d478282612510565b610db26000609760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836126d9565b5050565b6000609760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610e293382612976565b50565b60996020528060005260406000206000915054906101000a900463ffffffff1681565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ea0611f04565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600043821061107d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806137406027913960400191505060405180910390fd5b6000609960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156110ea5760009150506113de565b82609860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116111d457609860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101549150506113de565b82609860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156112555760009150506113de565b6000806001830390505b8163ffffffff168163ffffffff161115611378576000600283830363ffffffff168161128757fe5b04820390506112946134d6565b609860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415611350578060200151955050505050506113de565b86816000015163ffffffff16101561136a57819350611371565b6001820392505b505061125f565b609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b609a6020528060005260406000206000915090505481565b600060019054906101000a900460ff168061141b575061141a612ae7565b5b80611431575060008054906101000a900460ff16155b611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156114d6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b61154a6040518060400160405280600881526020017f5a6f7261636c65730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5a4f524100000000000000000000000000000000000000000000000000000000815250612afe565b6115546009612c10565b61155c612c2e565b61157733611568610ba9565b60ff16600a0a61271002612510565b6115f36000609760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166115e4610ba9565b60ff16600a0a6103e8026126d9565b80156116145760008060016101000a81548160ff0219169083151502179055505b50565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116d95780601f106116ae576101008083540402835291602001916116d9565b820191906000526020600020905b8154815290600101906020018083116116bc57829003601f168201915b5050505050905090565b60006117a66116f0611f04565b846117a18560405180606001604052806025815260200161378d602591396034600061171a611f04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b611f0c565b6001905092915050565b60006117c46117bd611f04565b8484612103565b6001905092915050565b600080609960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161183857600061189c565b609860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666118cf6109e2565b805190602001206118de612d3c565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611a62573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137676026913960400191505060405180910390fd5b609a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558914611b99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136256022913960400191505060405180910390fd5b87421115611bf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806136476026913960400191505060405180910390fd5b611bfc818b612976565b50505050505050505050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6098602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b611cfc611f04565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135b76026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061371c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612018576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135dd6022913960400191505060405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806136f76025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561220f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135946023913960400191505060405180910390fd5b61221a838383612d49565b612286816040518060600160405280602681526020016135ff60269139603360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123c89092919063ffffffff16565b603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061231b81603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248890919063ffffffff16565b603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612475576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561243a57808201518184015260208101905061241f565b50505050905090810190601f1680156124675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015612506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6125bf60008383612d49565b6125d48160355461248890919063ffffffff16565b60358190555061262c81603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461248890919063ffffffff16565b603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127155750600081115b1561297157600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612845576000609960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116127b857600061281c565b609860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b905060006128338483612d4e90919063ffffffff16565b905061284186848484612d98565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612970576000609960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116128e3576000612947565b609860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061295e848361248890919063ffffffff16565b905061296c85848484612d98565b5050505b5b505050565b6000609760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006129e584610e4f565b905082609760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612ae18284836126d9565b50505050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff1680612b1d5750612b1c612ae7565b5b80612b33575060008054906101000a900460ff16155b612b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612bd8576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612be061302c565b612bea838361312a565b8015612c0b5760008060016101000a81548160ff0219169083151502179055505b505050565b80603860006101000a81548160ff021916908360ff16021790555050565b600060019054906101000a900460ff1680612c4d5750612c4c612ae7565b5b80612c63575060008054906101000a900460ff16155b612cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612d08576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612d1061302c565b612d18613274565b8015612d395760008060016101000a81548160ff0219169083151502179055505b50565b6000804690508091505090565b505050565b6000612d9083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123c8565b905092915050565b6000612dbc436040518060600160405280603481526020016136c36034913961341b565b905060008463ffffffff16118015612e5157508063ffffffff16609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15612ec25781609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060010181905550612fcf565b60405180604001604052808263ffffffff16815260200183815250609860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401609960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b600060019054906101000a900460ff168061304b575061304a612ae7565b5b80613061575060008054906101000a900460ff16155b6130b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015613106576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156131275760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806131495750613148612ae7565b5b8061315f575060008054906101000a900460ff16155b6131b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015613204576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b826036908051906020019061321a9291906134f6565b5081603790805190602001906132319291906134f6565b506012603860006101000a81548160ff021916908360ff160217905550801561326f5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806132935750613292612ae7565b5b806132a9575060008054906101000a900460ff16155b6132fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061366d602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561334e576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000613358611f04565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156134185760008060016101000a81548160ff0219169083151502179055505b50565b6000640100000000831082906134cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613491578082015181840152602081019050613476565b50505050905090810190601f1680156134be5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff168152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061353757805160ff1916838001178555613565565b82800160010185558215613565579182015b82811115613564578251825591602001919060010190613549565b5b5090506135729190613576565b5090565b5b8082111561358f576000816000905550600101613577565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63655a4f52413a3a64656c656761746542795369673a20696e76616c6964206e6f6e63655a4f52413a3a64656c656761746542795369673a207369676e61747572652065787069726564496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655a4f52413a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735a4f52413a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e65645a4f52413a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b9b45f0f8af0542957a971f2e169580f0c2dd269054344042a9574cce860846364736f6c634300060c0033
Deployed Bytecode Sourcemap
32294:9355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20609:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22715:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21684:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33782:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23358:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21536:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24088:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32806:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34871:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35136:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33661:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21847:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31422:148;;;:::i;:::-;;37637:1293;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34228:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32359:351;;;:::i;:::-;;30780:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20811:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24809:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22179:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36970:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35674:1095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22417:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34014:133;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33524:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;31725:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20609:83;20646:13;20679:5;20672:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20609:83;:::o;22715:169::-;22798:4;22815:39;22824:12;:10;:12::i;:::-;22838:7;22847:6;22815:8;:39::i;:::-;22872:4;22865:11;;22715:169;;;;:::o;21684:100::-;21737:7;21764:12;;21757:19;;21684:100;:::o;33782:138::-;33824:96;33782:138;:::o;23358:321::-;23464:4;23481:36;23491:6;23499:9;23510:6;23481:9;:36::i;:::-;23528:121;23537:6;23545:12;:10;:12::i;:::-;23559:89;23597:6;23559:89;;;;;;;;;;;;;;;;;:11;:19;23571:6;23559:19;;;;;;;;;;;;;;;:33;23579:12;:10;:12::i;:::-;23559:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;23528:8;:121::i;:::-;23667:4;23660:11;;23358:321;;;;;:::o;21536:83::-;21577:5;21602:9;;;;;;;;;;;21595:16;;21536:83;:::o;24088:218::-;24176:4;24193:83;24202:12;:10;:12::i;:::-;24216:7;24225:50;24264:10;24225:11;:25;24237:12;:10;:12::i;:::-;24225:25;;;;;;;;;;;;;;;:34;24251:7;24225:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;24193:8;:83::i;:::-;24294:4;24287:11;;24088:218;;;;:::o;32806:162::-;31002:12;:10;:12::i;:::-;30992:22;;:6;;;;;;;;;;;:22;;;30984:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32878:19:::1;32884:3;32889:7;32878:5;:19::i;:::-;32908:52;32931:1;32935:10;:15;32946:3;32935:15;;;;;;;;;;;;;;;;;;;;;;;;;32952:7;32908:14;:52::i;:::-;32806:162:::0;;:::o;34871:117::-;34932:7;34959:10;:21;34970:9;34959:21;;;;;;;;;;;;;;;;;;;;;;;;;34952:28;;34871:117;;;:::o;35136:104::-;35200:32;35210:10;35222:9;35200;:32::i;:::-;35136:104;:::o;33661:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;21847:119::-;21913:7;21940:9;:18;21950:7;21940:18;;;;;;;;;;;;;;;;21933:25;;21847:119;;;:::o;31422:148::-;31002:12;:10;:12::i;:::-;30992:22;;:6;;;;;;;;;;;:22;;;30984:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31529:1:::1;31492:40;;31513:6;;;;;;;;;;;31492:40;;;;;;;;;;;;31560:1;31543:6;;:19;;;;;;;;;;;;;;;;;;31422:148::o:0;37637:1293::-;37748:7;37809:12;37795:11;:26;37773:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37901:19;37923:14;:23;37938:7;37923:23;;;;;;;;;;;;;;;;;;;;;;;;;37901:45;;37977:1;37961:12;:17;;;37957:58;;;38002:1;37995:8;;;;;37957:58;38127:11;38075;:20;38087:7;38075:20;;;;;;;;;;;;;;;:38;38111:1;38096:12;:16;38075:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;38071:147;;38162:11;:20;38174:7;38162:20;;;;;;;;;;;;;;;:38;38198:1;38183:12;:16;38162:38;;;;;;;;;;;;;;;:44;;;38155:51;;;;;38071:147;38315:11;38279;:20;38291:7;38279:20;;;;;;;;;;;;;;;:23;38300:1;38279:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;38275:88;;;38350:1;38343:8;;;;;38275:88;38375:12;38402;38432:1;38417:12;:16;38402:31;;38444:428;38459:5;38451:13;;:5;:13;;;38444:428;;;38481:13;38523:1;38514:5;38506;:13;38505:19;;;;;;;;38497:5;:27;38481:43;;38566:20;;:::i;:::-;38589:11;:20;38601:7;38589:20;;;;;;;;;;;;;;;:28;38610:6;38589:28;;;;;;;;;;;;;;;38566:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38652:11;38636:2;:12;;;:27;;;38632:229;;;38691:2;:8;;;38684:15;;;;;;;;;38632:229;38740:11;38725:2;:12;;;:26;;;38721:140;;;38780:6;38772:14;;38721:140;;;38844:1;38835:6;:10;38827:18;;38721:140;38444:428;;;;;38889:11;:20;38901:7;38889:20;;;;;;;;;;;;;;;:27;38910:5;38889:27;;;;;;;;;;;;;;;:33;;;38882:40;;;;;37637:1293;;;;;:::o;34228:41::-;;;;;;;;;;;;;;;;;:::o;32359:351::-;15821:13;;;;;;;;;;;:33;;;;15838:16;:14;:16::i;:::-;15821:33;:50;;;;15859:12;;;;;;;;;;15858:13;15821:50;15813:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15935:19;15958:13;;;;;;;;;;;15957:14;15935:36;;15986:14;15982:101;;;16033:4;16017:13;;:20;;;;;;;;;;;;;;;;;;16067:4;16052:12;;:19;;;;;;;;;;;;;;;;;;15982:101;32411:32:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:32::i;:::-;32454:17;32469:1;32454:14;:17::i;:::-;32482:16;:14;:16::i;:::-;32509:50;32515:10;32547;:8;:10::i;:::-;32539:19;;32535:2;:23;32527:5;:31;32509:5;:50::i;:::-;32570:132;32607:1;32624:10;:22;32635:10;32624:22;;;;;;;;;;;;;;;;;;;;;;;;;32680:10;:8;:10::i;:::-;32672:19;;32668:2;:23;32661:4;:30;32570:14;:132::i;:::-;16113:14:::0;16109:68;;;16160:5;16144:13;;:21;;;;;;;;;;;;;;;;;;16109:68;32359:351;:::o;30780:79::-;30818:7;30845:6;;;;;;;;;;;30838:13;;30780:79;:::o;20811:87::-;20850:13;20883:7;20876:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20811:87;:::o;24809:269::-;24902:4;24919:129;24928:12;:10;:12::i;:::-;24942:7;24951:96;24990:15;24951:96;;;;;;;;;;;;;;;;;:11;:25;24963:12;:10;:12::i;:::-;24951:25;;;;;;;;;;;;;;;:34;24977:7;24951:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;24919:8;:129::i;:::-;25066:4;25059:11;;24809:269;;;;:::o;22179:175::-;22265:4;22282:42;22292:12;:10;:12::i;:::-;22306:9;22317:6;22282:9;:42::i;:::-;22342:4;22335:11;;22179:175;;;;:::o;36970:236::-;37035:7;37055:19;37077:14;:23;37092:7;37077:23;;;;;;;;;;;;;;;;;;;;;;;;;37055:45;;37146:1;37131:12;:16;;;:67;;37197:1;37131:67;;;37150:11;:20;37162:7;37150:20;;;;;;;;;;;;;;;:38;37186:1;37171:12;:16;37150:38;;;;;;;;;;;;;;;:44;;;37131:67;37111:87;;;36970:236;;;:::o;35674:1095::-;35859:23;33824:96;35988:6;:4;:6::i;:::-;35972:24;;;;;;36015:12;:10;:12::i;:::-;36054:4;35909:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35885:200;;;;;;35859:226;;36098:18;34060:87;36175:9;36186:5;36193:6;36143:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36119:92;;;;;;36098:113;;36224:14;36294:15;36311:10;36265:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36241:92;;;;;;36224:109;;36346:17;36366:26;36376:6;36384:1;36387;36390;36366:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36346:46;;36446:1;36425:23;;:9;:23;;;;36403:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36556:6;:17;36563:9;36556:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;36547:5;:28;36525:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36663:6;36656:3;:13;;36648:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36730:31;36740:9;36751;36730;:31::i;:::-;36723:38;;;;35674:1095;;;;;;:::o;22417:151::-;22506:7;22533:11;:18;22545:5;22533:18;;;;;;;;;;;;;;;:27;22552:7;22533:27;;;;;;;;;;;;;;;;22526:34;;22417:151;;;;:::o;34014:133::-;34060:87;34014:133;:::o;33524:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31725:244::-;31002:12;:10;:12::i;:::-;30992:22;;:6;;;;;;;;;;;:22;;;30984:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31834:1:::1;31814:22;;:8;:22;;;;31806:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31924:8;31895:38;;31916:6;;;;;;;;;;;31895:38;;;;;;;;;;;;31953:8;31944:6;;:17;;;;;;;;;;;;;;;;;;31725:244:::0;:::o;17734:106::-;17787:15;17822:10;17815:17;;17734:106;:::o;27954:346::-;28073:1;28056:19;;:5;:19;;;;28048:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28154:1;28135:21;;:7;:21;;;;28127:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28238:6;28208:11;:18;28220:5;28208:18;;;;;;;;;;;;;;;:27;28227:7;28208:27;;;;;;;;;;;;;;;:36;;;;28276:7;28260:32;;28269:5;28260:32;;;28285:6;28260:32;;;;;;;;;;;;;;;;;;27954:346;;;:::o;25568:539::-;25692:1;25674:20;;:6;:20;;;;25666:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25776:1;25755:23;;:9;:23;;;;25747:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25831:47;25852:6;25860:9;25871:6;25831:20;:47::i;:::-;25911:71;25933:6;25911:71;;;;;;;;;;;;;;;;;:9;:17;25921:6;25911:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;25891:9;:17;25901:6;25891:17;;;;;;;;;;;;;;;:91;;;;26016:32;26041:6;26016:9;:20;26026:9;26016:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;25993:9;:20;26003:9;25993:20;;;;;;;;;;;;;;;:55;;;;26081:9;26064:35;;26073:6;26064:35;;;26092:6;26064:35;;;;;;;;;;;;;;;;;;25568:539;;;:::o;7935:192::-;8021:7;8054:1;8049;:6;;8057:12;8041:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8081:9;8097:1;8093;:5;8081:17;;8118:1;8111:8;;;7935:192;;;;;:::o;7032:181::-;7090:7;7110:9;7126:1;7122;:5;7110:17;;7151:1;7146;:6;;7138:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7204:1;7197:8;;;7032:181;;;;:::o;26388:378::-;26491:1;26472:21;;:7;:21;;;;26464:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26542:49;26571:1;26575:7;26584:6;26542:20;:49::i;:::-;26619:24;26636:6;26619:12;;:16;;:24;;;;:::i;:::-;26604:12;:39;;;;26675:30;26698:6;26675:9;:18;26685:7;26675:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;26654:9;:18;26664:7;26654:18;;;;;;;;;;;;;;;:51;;;;26742:7;26721:37;;26738:1;26721:37;;;26751:6;26721:37;;;;;;;;;;;;;;;;;;26388:378;;:::o;39370:1065::-;39510:6;39500:16;;:6;:16;;;;:30;;;;;39529:1;39520:6;:10;39500:30;39496:932;;;39569:1;39551:20;;:6;:20;;;39547:427;;39640:16;39659:14;:22;39674:6;39659:22;;;;;;;;;;;;;;;;;;;;;;;;;39640:41;;39700:17;39732:1;39720:9;:13;;;:102;;39821:1;39720:102;;;39757:11;:19;39769:6;39757:19;;;;;;;;;;;;;;;:34;39789:1;39777:9;:13;39757:34;;;;;;;;;;;;;;;:40;;;39720:102;39700:122;;39841:17;39861:21;39875:6;39861:9;:13;;:21;;;;:::i;:::-;39841:41;;39901:57;39918:6;39926:9;39937;39948;39901:16;:57::i;:::-;39547:427;;;;40012:1;39994:20;;:6;:20;;;39990:427;;40083:16;40102:14;:22;40117:6;40102:22;;;;;;;;;;;;;;;;;;;;;;;;;40083:41;;40143:17;40175:1;40163:9;:13;;;:102;;40264:1;40163:102;;;40200:11;:19;40212:6;40200:19;;;;;;;;;;;;;;;:34;40232:1;40220:9;:13;40200:34;;;;;;;;;;;;;;;:40;;;40163:102;40143:122;;40284:17;40304:21;40318:6;40304:9;:13;;:21;;;;:::i;:::-;40284:41;;40344:57;40361:6;40369:9;40380;40391;40344:16;:57::i;:::-;39990:427;;;;39496:932;39370:1065;;;:::o;38938:424::-;39015:23;39041:10;:21;39052:9;39041:21;;;;;;;;;;;;;;;;;;;;;;;;;39015:47;;39073:24;39100:20;39110:9;39100;:20::i;:::-;39073:47;;39200:9;39176:10;:21;39187:9;39176:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;39271:9;39227:54;;39254:15;39227:54;;39243:9;39227:54;;;;;;;;;;;;39294:60;39309:15;39326:9;39337:16;39294:14;:60::i;:::-;38938:424;;;;:::o;16277:604::-;16325:4;16696:12;16719:4;16696:28;;16735:10;16842:4;16830:17;16824:23;;16872:1;16866:2;:7;16859:14;;;;16277:604;:::o;20176:177::-;15821:13;;;;;;;;;;;:33;;;;15838:16;:14;:16::i;:::-;15821:33;:50;;;;15859:12;;;;;;;;;;15858:13;15821:50;15813:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15935:19;15958:13;;;;;;;;;;;15957:14;15935:36;;15986:14;15982:101;;;16033:4;16017:13;;:20;;;;;;;;;;;;;;;;;;16067:4;16052:12;;:19;;;;;;;;;;;;;;;;;;15982:101;20272:26:::1;:24;:26::i;:::-;20309:36;20332:4;20338:6;20309:22;:36::i;:::-;16113:14:::0;16109:68;;;16160:5;16144:13;;:21;;;;;;;;;;;;;;;;;;16109:68;20176:177;;;:::o;28632:90::-;28705:9;28693;;:21;;;;;;;;;;;;;;;;;;28632:90;:::o;30366:129::-;15821:13;;;;;;;;;;;:33;;;;15838:16;:14;:16::i;:::-;15821:33;:50;;;;15859:12;;;;;;;;;;15858:13;15821:50;15813:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15935:19;15958:13;;;;;;;;;;;15957:14;15935:36;;15986:14;15982:101;;;16033:4;16017:13;;:20;;;;;;;;;;;;;;;;;;16067:4;16052:12;;:19;;;;;;;;;;;;;;;;;;15982:101;30424:26:::1;:24;:26::i;:::-;30461;:24;:26::i;:::-;16113:14:::0;16109:68;;;16160:5;16144:13;;:21;;;;;;;;;;;;;;;;;;16109:68;30366:129;:::o;41468:178::-;41513:7;41533:15;41594:9;41583:20;;41631:7;41624:14;;;41468:178;:::o;29325:92::-;;;;:::o;7496:136::-;7554:7;7581:43;7585:1;7588;7581:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7574:50;;7496:136;;;;:::o;40443:813::-;40608:18;40629:113;40650:12;40629:113;;;;;;;;;;;;;;;;;:6;:113::i;:::-;40608:134;;40788:1;40773:12;:16;;;:98;;;;;40860:11;40806:65;;:11;:22;40818:9;40806:22;;;;;;;;;;;;;;;:40;40844:1;40829:12;:16;40806:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;40773:98;40755:425;;;40947:8;40898:11;:22;40910:9;40898:22;;;;;;;;;;;;;;;:40;40936:1;40921:12;:16;40898:40;;;;;;;;;;;;;;;:46;;:57;;;;40755:425;;;41027:82;;;;;;;;41056:11;41027:82;;;;;;41086:8;41027:82;;;40988:11;:22;41000:9;40988:22;;;;;;;;;;;;;;;:36;41011:12;40988:36;;;;;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41167:1;41152:12;:16;41124:14;:25;41139:9;41124:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;40755:425;41218:9;41197:51;;;41229:8;41239;41197:51;;;;;;;;;;;;;;;;;;;;;;;;40443:813;;;;;:::o;17663:65::-;15821:13;;;;;;;;;;;:33;;;;15838:16;:14;:16::i;:::-;15821:33;:50;;;;15859:12;;;;;;;;;;15858:13;15821:50;15813:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15935:19;15958:13;;;;;;;;;;;15957:14;15935:36;;15986:14;15982:101;;;16033:4;16017:13;;:20;;;;;;;;;;;;;;;;;;16067:4;16052:12;;:19;;;;;;;;;;;;;;;;;;15982:101;16113:14;16109:68;;;16160:5;16144:13;;:21;;;;;;;;;;;;;;;;;;16109:68;17663:65;:::o;20361:178::-;15821:13;;;;;;;;;;;:33;;;;15838:16;:14;:16::i;:::-;15821:33;:50;;;;15859:12;;;;;;;;;;15858:13;15821:50;15813:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15935:19;15958:13;;;;;;;;;;;15957:14;15935:36;;15986:14;15982:101;;;16033:4;16017:13;;:20;;;;;;;;;;;;;;;;;;16067:4;16052:12;;:19;;;;;;;;;;;;;;;;;;15982:101;20475:4:::1;20467:5;:12;;;;;;;;;;;;:::i;:::-;;20500:6;20490:7;:16;;;;;;;;;;;;:::i;:::-;;20529:2;20517:9;;:14;;;;;;;;;;;;;;;;;;16113::::0;16109:68;;;16160:5;16144:13;;:21;;;;;;;;;;;;;;;;;;16109:68;20361:178;;;:::o;30503:196::-;15821:13;;;;;;;;;;;:33;;;;15838:16;:14;:16::i;:::-;15821:33;:50;;;;15859:12;;;;;;;;;;15858:13;15821:50;15813:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15935:19;15958:13;;;;;;;;;;;15957:14;15935:36;;15986:14;15982:101;;;16033:4;16017:13;;:20;;;;;;;;;;;;;;;;;;16067:4;16052:12;;:19;;;;;;;;;;;;;;;;;;15982:101;30571:17:::1;30591:12;:10;:12::i;:::-;30571:32;;30623:9;30614:6;;:18;;;;;;;;;;;;;;;;;;30681:9;30648:43;;30677:1;30648:43;;;;;;;;;;;;16095:1;16113:14:::0;16109:68;;;16160:5;16144:13;;:21;;;;;;;;;;;;;;;;;;16109:68;30503:196;:::o;41264:::-;41369:6;41405:5;41401:1;:9;41412:12;41393:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41450:1;41436:16;;41264:196;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://b9b45f0f8af0542957a971f2e169580f0c2dd269054344042a9574cce8608463
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.