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:
PoolToken_Compound_USDC
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-25 */ // File: @openzeppelin\upgrades\contracts\Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ 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 use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin\contracts-ethereum-package\contracts\GSN\Context.sol pragma solidity ^0.5.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. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin\contracts-ethereum-package\contracts\token\ERC20\IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin\contracts-ethereum-package\contracts\math\SafeMath.sol pragma solidity ^0.5.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 SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin\contracts-ethereum-package\contracts\token\ERC20\ERC20.sol pragma solidity ^0.5.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 {ERC20Mintable}. * * 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 ERC20 is Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } // File: @openzeppelin\contracts-ethereum-package\contracts\token\ERC20\ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is Initializable, IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ function initialize(string memory name, string memory symbol, uint8 decimals) public initializer { _name = name; _symbol = symbol; _decimals = decimals; } /** * @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. * * 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; } uint256[50] private ______gap; } // File: @openzeppelin\contracts-ethereum-package\contracts\access\Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin\contracts-ethereum-package\contracts\access\roles\MinterRole.sol pragma solidity ^0.5.0; contract MinterRole is Initializable, Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; function initialize(address sender) public initializer { if (!isMinter(sender)) { _addMinter(sender); } } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } uint256[50] private ______gap; } // File: @openzeppelin\contracts-ethereum-package\contracts\token\ERC20\ERC20Mintable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole}, * which have permission to mint (create) new tokens as they see fit. * * At construction, the deployer of the contract is the only minter. */ contract ERC20Mintable is Initializable, ERC20, MinterRole { function initialize(address sender) public initializer { MinterRole.initialize(sender); } /** * @dev See {ERC20-_mint}. * * Requirements: * * - the caller must have the {MinterRole}. */ function mint(address account, uint256 amount) public onlyMinter returns (bool) { _mint(account, amount); return true; } uint256[50] private ______gap; } // File: @openzeppelin\contracts-ethereum-package\contracts\token\ERC20\ERC20Burnable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ contract ERC20Burnable is Initializable, Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev See {ERC20-_burnFrom}. */ function burnFrom(address account, uint256 amount) public { _burnFrom(account, amount); } uint256[50] private ______gap; } // File: contracts\interfaces\token\IPoolTokenBalanceChangeRecipient.sol pragma solidity ^0.5.12; interface IPoolTokenBalanceChangeRecipient { function poolTokenBalanceChanged(address user) external; } // File: @openzeppelin\contracts-ethereum-package\contracts\ownership\Ownable.sol pragma solidity ^0.5.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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initialize(address sender) public initializer { _owner = sender; emit OwnershipTransferred(address(0), _owner); } /** * @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(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private ______gap; } // File: contracts\common\Base.sol pragma solidity ^0.5.12; /** * Base contract for all modules */ contract Base is Initializable, Context, Ownable { address constant ZERO_ADDRESS = address(0); function initialize() public initializer { Ownable.initialize(_msgSender()); } } // File: contracts\core\ModuleNames.sol pragma solidity ^0.5.12; /** * @dev List of module names */ contract ModuleNames { // Pool Modules string internal constant MODULE_ACCESS = "access"; string internal constant MODULE_SAVINGS = "savings"; string internal constant MODULE_INVESTING = "investing"; string internal constant MODULE_STAKING_AKRO = "staking"; string internal constant MODULE_STAKING_ADEL = "stakingAdel"; string internal constant MODULE_DCA = "dca"; string internal constant MODULE_REWARD = "reward"; string internal constant MODULE_REWARD_DISTR = "rewardDistributions"; string internal constant MODULE_VAULT = "vault"; // Pool tokens string internal constant TOKEN_AKRO = "akro"; string internal constant TOKEN_ADEL = "adel"; // External Modules (used to store addresses of external contracts) string internal constant CONTRACT_RAY = "ray"; } // File: contracts\common\Module.sol pragma solidity ^0.5.12; /** * Base contract for all modules */ contract Module is Base, ModuleNames { event PoolAddressChanged(address newPool); address public pool; function initialize(address _pool) public initializer { Base.initialize(); setPool(_pool); } function setPool(address _pool) public onlyOwner { require(_pool != ZERO_ADDRESS, "Module: pool address can't be zero"); pool = _pool; emit PoolAddressChanged(_pool); } function getModuleAddress(string memory module) public view returns(address){ require(pool != ZERO_ADDRESS, "Module: no pool"); (bool success, bytes memory result) = pool.staticcall(abi.encodeWithSignature("get(string)", module)); //Forward error from Pool contract if (!success) assembly { revert(add(result, 32), result) } address moduleAddress = abi.decode(result, (address)); // string memory error = string(abi.encodePacked("Module: requested module not found - ", module)); // require(moduleAddress != ZERO_ADDRESS, error); require(moduleAddress != ZERO_ADDRESS, "Module: requested module not found"); return moduleAddress; } } // File: contracts\modules\token\DistributionToken.sol pragma solidity ^0.5.12; //solhint-disable func-order contract DistributionToken is ERC20, ERC20Mintable { using SafeMath for uint256; uint256 public constant DISTRIBUTION_AGGREGATION_PERIOD = 24*60*60; event DistributionCreated(uint256 amount, uint256 totalSupply); event DistributionsClaimed(address account, uint256 amount, uint256 fromDistribution, uint256 toDistribution); event DistributionAccumulatorIncreased(uint256 amount); struct Distribution { uint256 amount; // Amount of tokens being distributed during the event uint256 totalSupply; // Total supply before distribution } Distribution[] public distributions; // Array of all distributions mapping(address => uint256) public nextDistributions; // Map account to first distribution not yet processed uint256 public nextDistributionTimestamp; //Timestamp when next distribuition should be fired regardles of accumulated tokens uint256 public distributionAccumulator; //Tokens accumulated for next distribution function distribute(uint256 amount) external onlyMinter { distributionAccumulator = distributionAccumulator.add(amount); emit DistributionAccumulatorIncreased(amount); _createDistributionIfReady(); } function createDistribution() external onlyMinter { require(distributionAccumulator > 0, "DistributionToken: nothing to distribute"); _createDistribution(); } function claimDistributions(address account) external returns(uint256) { _createDistributionIfReady(); uint256 amount = _updateUserBalance(account, distributions.length); if (amount > 0) userBalanceChanged(account); return amount; } /** * @notice Claims distributions and allows to specify how many distributions to process. * This allows limit gas usage. * One can do this for others */ function claimDistributions(address account, uint256 toDistribution) external returns(uint256) { require(toDistribution <= distributions.length, "DistributionToken: lastDistribution too hight"); require(nextDistributions[account] < toDistribution, "DistributionToken: no distributions to claim"); uint256 amount = _updateUserBalance(account, toDistribution); if (amount > 0) userBalanceChanged(account); return amount; } function claimDistributions(address[] calldata accounts) external { _createDistributionIfReady(); for (uint256 i=0; i < accounts.length; i++){ uint256 amount = _updateUserBalance(accounts[i], distributions.length); if (amount > 0) userBalanceChanged(accounts[i]); } } function claimDistributions(address[] calldata accounts, uint256 toDistribution) external { require(toDistribution <= distributions.length, "DistributionToken: lastDistribution too hight"); for (uint256 i=0; i < accounts.length; i++){ uint256 amount = _updateUserBalance(accounts[i], toDistribution); if (amount > 0) userBalanceChanged(accounts[i]); } } /** * @notice Full balance of account includes: * - balance of tokens account holds himself (0 for addresses of locking contracts) * - balance of tokens locked in contracts * - tokens not yet claimed from distributions */ function fullBalanceOf(address account) public view returns(uint256){ if (account == address(this)) return 0; //Token itself only holds tokens for others uint256 distributionBalance = distributionBalanceOf(account); uint256 unclaimed = calculateClaimAmount(account); return distributionBalance.add(unclaimed); } /** * @notice How many tokens are not yet claimed from distributions * @param account Account to check * @return Amount of tokens available to claim */ function calculateUnclaimedDistributions(address account) public view returns(uint256) { return calculateClaimAmount(account); } /** * @notice Calculates amount of tokens distributed to inital amount between startDistribution and nextDistribution * @param fromDistribution index of first Distribution to start calculations * @param toDistribution index of distribuition next to the last processed * @param initialBalance amount of tokens before startDistribution * @return amount of tokens distributed */ function calculateDistributedAmount(uint256 fromDistribution, uint256 toDistribution, uint256 initialBalance) public view returns(uint256) { require(fromDistribution < toDistribution, "DistributionToken: startDistribution is too high"); require(toDistribution <= distributions.length, "DistributionToken: nextDistribution is too high"); return _calculateDistributedAmount(fromDistribution, toDistribution, initialBalance); } function nextDistribution() public view returns(uint256){ return distributions.length; } /** * @notice Balance of account, which is counted for distributions * It only represents already distributed balance. * @dev This function should be overloaded to include balance of tokens stored in proposals */ function distributionBalanceOf(address account) public view returns(uint256) { return balanceOf(account); } /** * @notice Total supply which is counted for distributions * It only represents already distributed tokens * @dev This function should be overloaded to exclude tokens locked in loans */ function distributionTotalSupply() public view returns(uint256){ return totalSupply(); } // Override functions that change user balance function _transfer(address sender, address recipient, uint256 amount) internal { _createDistributionIfReady(); _updateUserBalance(sender); _updateUserBalance(recipient); super._transfer(sender, recipient, amount); userBalanceChanged(sender); userBalanceChanged(recipient); } function _mint(address account, uint256 amount) internal { _createDistributionIfReady(); _updateUserBalance(account); super._mint(account, amount); userBalanceChanged(account); } function _burn(address account, uint256 amount) internal { _createDistributionIfReady(); _updateUserBalance(account); super._burn(account, amount); userBalanceChanged(account); } function _updateUserBalance(address account) internal returns(uint256) { return _updateUserBalance(account, distributions.length); } function _updateUserBalance(address account, uint256 toDistribution) internal returns(uint256) { uint256 fromDistribution = nextDistributions[account]; if (fromDistribution >= toDistribution) return 0; uint256 distributionAmount = calculateClaimAmount(account, toDistribution); if (distributionAmount == 0) return 0; nextDistributions[account] = toDistribution; super._transfer(address(this), account, distributionAmount); emit DistributionsClaimed(account, distributionAmount, fromDistribution, toDistribution); return distributionAmount; } function _createDistributionIfReady() internal { if (!isReadyForDistribution()) return; _createDistribution(); } function _createDistribution() internal { uint256 currentTotalSupply = distributionTotalSupply(); distributions.push(Distribution({ amount:distributionAccumulator, totalSupply: currentTotalSupply })); super._mint(address(this), distributionAccumulator); //Use super because we overloaded _mint in this contract and need old behaviour emit DistributionCreated(distributionAccumulator, currentTotalSupply); // Clear data for next distribution distributionAccumulator = 0; nextDistributionTimestamp = now.sub(now % DISTRIBUTION_AGGREGATION_PERIOD).add(DISTRIBUTION_AGGREGATION_PERIOD); } /** * @dev This is a placeholder, which may be overrided to notify other contracts of PTK balance change */ function userBalanceChanged(address /*account*/) internal { } /** * @notice Calculates amount of account's tokens to be claimed from distributions */ function calculateClaimAmount(address account) internal view returns(uint256) { if (nextDistributions[account] >= distributions.length) return 0; return calculateClaimAmount(account, distributions.length); } function calculateClaimAmount(address account, uint256 toDistribution) internal view returns(uint256) { assert(toDistribution <= distributions.length); return _calculateDistributedAmount(nextDistributions[account], toDistribution, distributionBalanceOf(account)); } function _calculateDistributedAmount(uint256 fromDistribution, uint256 toDistribution, uint256 initialBalance) internal view returns(uint256) { uint256 next = fromDistribution; uint256 balance = initialBalance; if (initialBalance == 0) return 0; while (next < toDistribution) { uint256 da = balance.mul(distributions[next].amount).div(distributions[next].totalSupply); balance = balance.add(da); next++; } return balance.sub(initialBalance); } /** * @dev Calculates if conditions for creating new distribution are met */ function isReadyForDistribution() internal view returns(bool) { return (distributionAccumulator > 0) && (now >= nextDistributionTimestamp); } } // File: contracts\modules\token\PoolToken.sol pragma solidity ^0.5.12; contract PoolToken is Module, ERC20, ERC20Detailed, ERC20Mintable, ERC20Burnable, DistributionToken { bool allowTransfers; function initialize(address _pool, string memory poolName, string memory poolSymbol) public initializer { Module.initialize(_pool); ERC20Detailed.initialize(poolName, poolSymbol, 18); ERC20Mintable.initialize(_msgSender()); } function setAllowTransfers(bool _allowTransfers) public onlyOwner { allowTransfers = _allowTransfers; } /** * @dev Overrides ERC20Burnable burnFrom to allow unlimited transfers by SavingsModule */ function burnFrom(address from, uint256 value) public { if (isMinter(_msgSender())) { //Skip decrease allowance _burn(from, value); }else{ super.burnFrom(from, value); } } function _transfer(address sender, address recipient, uint256 amount) internal { if( !allowTransfers && (sender != address(this)) //transfers from *this* used for distributions ){ revert("PoolToken: transfers between users disabled"); } super._transfer(sender, recipient, amount); } function userBalanceChanged(address account) internal { IPoolTokenBalanceChangeRecipient rewardDistrModule = IPoolTokenBalanceChangeRecipient(getModuleAddress(MODULE_REWARD_DISTR)); rewardDistrModule.poolTokenBalanceChanged(account); } function distributionBalanceOf(address account) public view returns(uint256) { return (account == address(this))?0:super.distributionBalanceOf(account); } function distributionTotalSupply() public view returns(uint256) { return super.distributionTotalSupply().sub(balanceOf(address(this))); } } // File: contracts\deploy\PoolToken_Compound_USDC.sol pragma solidity ^0.5.12; contract PoolToken_Compound_USDC is PoolToken { function initialize(address _pool) public initializer { PoolToken.initialize( _pool, "Delphi Compound USDC", "dCUSDC" ); } }
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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributionAccumulatorIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"DistributionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fromDistribution","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toDistribution","type":"uint256"}],"name":"DistributionsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPool","type":"address"}],"name":"PoolAddressChanged","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"},{"constant":true,"inputs":[],"name":"DISTRIBUTION_AGGREGATION_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"fromDistribution","type":"uint256"},{"internalType":"uint256","name":"toDistribution","type":"uint256"},{"internalType":"uint256","name":"initialBalance","type":"uint256"}],"name":"calculateDistributedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"calculateUnclaimedDistributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimDistributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"toDistribution","type":"uint256"}],"name":"claimDistributions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"claimDistributions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"toDistribution","type":"uint256"}],"name":"claimDistributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"createDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distribute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"distributionAccumulator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"distributionBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"distributionTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"distributions","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"fullBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"module","type":"string"}],"name":"getModuleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"string","name":"poolName","type":"string"},{"internalType":"string","name":"poolSymbol","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextDistributionTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextDistributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_allowTransfers","type":"bool"}],"name":"setAllowTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052613366806100136000396000f3fe608060405234801561001057600080fd5b506004361061030a5760003560e01c80637f4442e91161019c578063aa271e1a116100ee578063d63b500411610097578063e6b1474411610071578063e6b1474414610c0f578063f238cd2214610c17578063f2fde38b14610c1f5761030a565b8063d63b500414610bba578063dd62ed3e14610bc2578063df50afa414610bf05761030a565b8063c4d66de8116100c8578063c4d66de814610b60578063ce3e4dd214610b86578063d08153fd14610b8e5761030a565b8063aa271e1a14610a5a578063c12460f414610a80578063c2a6d89114610af05761030a565b806391c05b0b11610150578063986502751161012a57806398650275146109fa578063a457c2d714610a02578063a9059cbb14610a2e5761030a565b806391c05b0b146109af57806395d89b41146109cc578063983b2d56146109d45761030a565b80638da5cb5b116101815780638da5cb5b146108625780638f32d59b1461086a57806390657147146108725761030a565b80637f4442e9146108315780638129fc1c1461085a5761030a565b806340c10f191161026057806370898f781161020957806371dc760f116101e357806371dc760f14610739578063780fa8cf146107df57806379cc6790146108055761030a565b806370898f78146106e557806370a082311461070b578063715018a6146107315761030a565b80634487d3df1161023a5780634487d3df1461066357806358b5dd721461069957806360b63648146106bf5761030a565b806340c10f19146105f457806342966c68146106205780634437152a1461063d5761030a565b80631d4ba2d2116102c2578063313ce5671161029c578063313ce567146105a257806338b0789d146105c057806339509351146105c85761030a565b80631d4ba2d21461053e57806323b872dd1461056457806329b05c6f1461059a5761030a565b80631624f6c6116102f35780631624f6c6146103cc57806316f0115b1461050057806318160ddd146105245761030a565b806306fdde031461030f578063095ea7b31461038c575b600080fd5b610317610c45565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610351578181015183820152602001610339565b50505050905090810190601f16801561037e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103b8600480360360408110156103a257600080fd5b506001600160a01b038135169060200135610cfa565b604080519115158252519081900360200190f35b6104fe600480360360608110156103e257600080fd5b8101906020810181356401000000008111156103fd57600080fd5b82018360208201111561040f57600080fd5b8035906020019184600183028401116401000000008311171561043157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561048457600080fd5b82018360208201111561049657600080fd5b803590602001918460018302840111640100000000831117156104b857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610d189050565b005b610508610df4565b604080516001600160a01b039092168252519081900360200190f35b61052c610e03565b60408051918252519081900360200190f35b61052c6004803603602081101561055457600080fd5b50356001600160a01b0316610e09565b6103b86004803603606081101561057a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e1c565b61052c610eaa565b6105aa610ed1565b6040805160ff9092168252519081900360200190f35b61052c610eda565b6103b8600480360360408110156105de57600080fd5b506001600160a01b038135169060200135610ee1565b6103b86004803603604081101561060a57600080fd5b506001600160a01b038135169060200135610f35565b6104fe6004803603602081101561063657600080fd5b5035610f8c565b6104fe6004803603602081101561065357600080fd5b50356001600160a01b0316610fa0565b6106806004803603602081101561067957600080fd5b50356110aa565b6040805192835260208301919091528051918290030190f35b61052c600480360360208110156106af57600080fd5b50356001600160a01b03166110d6565b61052c600480360360208110156106d557600080fd5b50356001600160a01b0316611123565b61052c600480360360208110156106fb57600080fd5b50356001600160a01b0316611150565b61052c6004803603602081101561072157600080fd5b50356001600160a01b0316611163565b6104fe61117e565b6105086004803603602081101561074f57600080fd5b81019060208101813564010000000081111561076a57600080fd5b82018360208201111561077c57600080fd5b8035906020019184600183028401116401000000008311171561079e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611239945050505050565b61052c600480360360208110156107f557600080fd5b50356001600160a01b03166114b4565b6104fe6004803603604081101561081b57600080fd5b506001600160a01b0381351690602001356114dc565b61052c6004803603606081101561084757600080fd5b5080359060208101359060400135611509565b6104fe611596565b610508611647565b6103b8611656565b6104fe6004803603606081101561088857600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156108b357600080fd5b8201836020820111156108c557600080fd5b803590602001918460018302840111640100000000831117156108e757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561093a57600080fd5b82018360208201111561094c57600080fd5b8035906020019184600183028401116401000000008311171561096e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061167c945050505050565b6104fe600480360360208110156109c557600080fd5b5035611745565b6103176117de565b6104fe600480360360208110156109ea57600080fd5b50356001600160a01b031661185d565b6104fe6118ac565b6103b860048036036040811015610a1857600080fd5b506001600160a01b0381351690602001356118be565b6103b860048036036040811015610a4457600080fd5b506001600160a01b03813516906020013561192c565b6103b860048036036020811015610a7057600080fd5b50356001600160a01b0316611940565b6104fe60048036036040811015610a9657600080fd5b810190602081018135640100000000811115610ab157600080fd5b820183602082011115610ac357600080fd5b80359060200191846020830284011164010000000083111715610ae557600080fd5b919350915035611953565b6104fe60048036036020811015610b0657600080fd5b810190602081018135640100000000811115610b2157600080fd5b820183602082011115610b3357600080fd5b80359060200191846020830284011164010000000083111715610b5557600080fd5b5090925090506119fc565b6104fe60048036036020811015610b7657600080fd5b50356001600160a01b0316611a61565b61052c611b78565b61052c60048036036040811015610ba457600080fd5b506001600160a01b038135169060200135611b7f565b61052c611c38565b61052c60048036036040811015610bd857600080fd5b506001600160a01b0381358116916020013516611c3f565b6104fe60048036036020811015610c0657600080fd5b50351515611c6a565b6104fe611cd7565b61052c611d67565b6104fe60048036036020811015610c3557600080fd5b50356001600160a01b0316611d6e565b609c8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cef5780601f10610cc457610100808354040283529160200191610cef565b820191906000526020600020905b815481529060010190602001808311610cd257829003601f168201915b505050505090505b90565b6000610d0e610d07611dd0565b8484611dd4565b5060015b92915050565b600054610100900460ff1680610d315750610d31611ec0565b80610d3f575060005460ff16155b610d7a5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015610da5576000805460ff1961ff0019909116610100171660011790555b8351610db890609c906020870190612efa565b508251610dcc90609d906020860190612efa565b50609e805460ff191660ff84161790558015610dee576000805461ff00191690555b50505050565b6066546001600160a01b031681565b60695490565b6000610e1482611ec6565b90505b919050565b6000610e29848484611f02565b610e9f84610e35611dd0565b610e9a85604051806060016040528060288152602001613134602891396001600160a01b038a16600090815260686020526040812090610e73611dd0565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611f6616565b611dd4565b5060015b9392505050565b6000610ecc610eb830611163565b610ec0611ffd565b9063ffffffff61200716565b905090565b609e5460ff1690565b6101685490565b6000610d0e610eee611dd0565b84610e9a8560686000610eff611dd0565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61204916565b6000610f47610f42611dd0565b611940565b610f825760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b610d0e83836120a3565b610f9d610f97611dd0565b826120c8565b50565b610fa8611656565b610ff9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661103e5760405162461bcd60e51b81526004018080602001828103825260228152602001806130756022913960400191505060405180910390fd5b606680546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f5b36800c27524690807962bd42525a44e68b3f860e8f9e0204f27e777d2f46059181900360200190a150565b61016881815481106110b857fe5b60009182526020909120600290910201805460019091015490915082565b60006001600160a01b0382163014156110f157506000610e17565b60006110fc836114b4565b9050600061110984611ec6565b905061111b828263ffffffff61204916565b949350505050565b600061112d6120e4565b600061113f83610168805490506120f5565b90508015610e1457610e14836121bd565b6101696020526000908152604090205481565b6001600160a01b031660009081526067602052604090205490565b611186611656565b6111d7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6066546000906001600160a01b0316611299576040805162461bcd60e51b815260206004820152600f60248201527f4d6f64756c653a206e6f20706f6f6c0000000000000000000000000000000000604482015290519081900360640190fd5b6066546040516020602482018181528551604484015285516000946060946001600160a01b03909116938893928392606401918501908083838b5b838110156112ec5781810151838201526020016112d4565b50505050905090810190601f1680156113195780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f693ec85e00000000000000000000000000000000000000000000000000000000178152905182519295509350839250908083835b602083106113de57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016113a1565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811461143e576040519150601f19603f3d011682016040523d82523d6000602084013e611443565b606091505b509150915081611454578060208201fd5b600081806020019051602081101561146b57600080fd5b505190506001600160a01b03811661111b5760405162461bcd60e51b815260040180806020018281038252602281526020018061326f6022913960400191505060405180910390fd5b60006001600160a01b03821630146114d4576114cf82612273565b610e14565b506000919050565b6114e7610f42611dd0565b156114fb576114f682826120c8565b611505565b611505828261227e565b5050565b60008284106115495760405162461bcd60e51b81526004018080602001828103825260308152602001806132b56030913960400191505060405180910390fd5b6101685483111561158b5760405162461bcd60e51b815260040180806020018281038252602f815260200180613046602f913960400191505060405180910390fd5b61111b848484612288565b600054610100900460ff16806115af57506115af611ec0565b806115bd575060005460ff16155b6115f85760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015611623576000805460ff1961ff0019909116610100171660011790555b61163361162e611dd0565b61233f565b8015610f9d576000805461ff001916905550565b6033546001600160a01b031690565b6033546000906001600160a01b031661166d611dd0565b6001600160a01b031614905090565b600054610100900460ff16806116955750611695611ec0565b806116a3575060005460ff16155b6116de5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015611709576000805460ff1961ff0019909116610100171660011790555b61171284612448565b61171e83836012610d18565b61172e611729611dd0565b6124e6565b8015610dee576000805461ff001916905550505050565b611750610f42611dd0565b61178b5760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b61016b5461179f908263ffffffff61204916565b61016b556040805182815290517f28947a1b8cd1d9d78a7b045465f8a2fa6daa21bc522412d192a532aee396e9279181900360200190a1610f9d6120e4565b609d8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cef5780601f10610cc457610100808354040283529160200191610cef565b611868610f42611dd0565b6118a35760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b610f9d8161257c565b6118bc6118b7611dd0565b6125c4565b565b6000610d0e6118cb611dd0565b84610e9a8560405180606001604052806025815260200161330d60259139606860006118f5611dd0565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611f6616565b6000610d0e611939611dd0565b8484611f02565b6000610e1460d18363ffffffff61260c16565b610168548111156119955760405162461bcd60e51b815260040180806020018281038252602d815260200180613242602d913960400191505060405180910390fd5b60005b82811015610dee5760006119c78585848181106119b157fe5b905060200201356001600160a01b0316846120f5565b905080156119f3576119f38585848181106119de57fe5b905060200201356001600160a01b03166121bd565b50600101611998565b611a046120e4565b60005b81811015611a5c576000611a3c848484818110611a2057fe5b905060200201356001600160a01b0316610168805490506120f5565b90508015611a5357611a538484848181106119de57fe5b50600101611a07565b505050565b600054610100900460ff1680611a7a5750611a7a611ec0565b80611a88575060005460ff16155b611ac35760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015611aee576000805460ff1961ff0019909116610100171660011790555b611b63826040518060400160405280601481526020017f44656c70686920436f6d706f756e6420555344430000000000000000000000008152506040518060400160405280600681526020017f644355534443000000000000000000000000000000000000000000000000000081525061167c565b8015611505576000805461ff00191690555050565b61016a5481565b61016854600090821115611bc45760405162461bcd60e51b815260040180806020018281038252602d815260200180613242602d913960400191505060405180910390fd5b6001600160a01b038316600090815261016960205260409020548211611c1b5760405162461bcd60e51b815260040180806020018281038252602c8152602001806131d0602c913960400191505060405180910390fd5b6000611c2784846120f5565b90508015610ea357610ea3846121bd565b61016b5481565b6001600160a01b03918216600090815260686020908152604080832093909416825291909152205490565b611c72611656565b611cc3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61016c805460ff1916911515919091179055565b611ce2610f42611dd0565b611d1d5760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b600061016b5411611d5f5760405162461bcd60e51b81526004018080602001828103825260288152602001806132e56028913960400191505060405180910390fd5b6118bc612673565b6201518081565b611d76611656565b611dc7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610f9d81612774565b3390565b6001600160a01b038316611e195760405162461bcd60e51b81526004018080602001828103825260248152602001806132916024913960400191505060405180910390fd5b6001600160a01b038216611e5e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ffe6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260686020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b303b1590565b610168546001600160a01b03821660009081526101696020526040812054909111611ef357506000610e17565b61016854610e1490839061282d565b61016c5460ff16158015611f1f57506001600160a01b0383163014155b15611f5b5760405162461bcd60e51b815260040180806020018281038252602b8152602001806130e8602b913960400191505060405180910390fd5b611a5c83838361286a565b60008184841115611ff55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fba578181015183820152602001611fa2565b50505050905090810190601f168015611fe75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000610ecc610e03565b6000610ea383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f66565b600082820183811015610ea3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6120ab6120e4565b6120b4826128a3565b506120bf82826128b5565b611505826121bd565b6120d06120e4565b6120d9826128a3565b506120bf82826129a7565b6120ec612aa3565b611d5f576118bc565b6001600160a01b03821660009081526101696020526040812054828110612120576000915050610d12565b600061212c858561282d565b90508061213e57600092505050610d12565b6001600160a01b038516600090815261016960205260409020849055612165308683612abd565b604080516001600160a01b0387168152602081018390528082018490526060810186905290517fe61468ba7ef06e2d4e4f2ae88303bb4d1fdbe6001ad2fe0782cbd4f7dffca8579181900360800190a1949350505050565b60006121fd6040518060400160405280601381526020017f726577617264446973747269627574696f6e7300000000000000000000000000815250611239565b9050806001600160a01b031663c9b0d081836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561225757600080fd5b505af115801561226b573d6000803e3d6000fd5b505050505050565b6000610e1482611163565b6115058282612c1b565b600083828061229c57600092505050610ea3565b8482101561232557600061230461016884815481106122b757fe5b9060005260206000209060020201600101546122f861016886815481106122da57fe5b6000918252602090912060029091020154859063ffffffff612c6f16565b9063ffffffff612cc816565b9050612316828263ffffffff61204916565b600190930192915061229c9050565b612335818563ffffffff61200716565b9695505050505050565b600054610100900460ff16806123585750612358611ec0565b80612366575060005460ff16155b6123a15760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff161580156123cc576000805460ff1961ff0019909116610100171660011790555b603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015611505576000805461ff00191690555050565b600054610100900460ff16806124615750612461611ec0565b8061246f575060005460ff16155b6124aa5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff161580156124d5576000805460ff1961ff0019909116610100171660011790555b6124dd611596565b611b6382610fa0565b600054610100900460ff16806124ff57506124ff611ec0565b8061250d575060005460ff16155b6125485760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015612573576000805460ff1961ff0019909116610100171660011790555b611b6382612d0a565b61258d60d18263ffffffff612dad16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6125d560d18263ffffffff612e2e16565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b0382166126535760405162461bcd60e51b815260040180806020018281038252602281526020018061315c6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b600061267d610eaa565b6040805180820190915261016b8054825260208201838152610168805460018101825560009190915292517f8077777ae4769de06cbfd1c0b8b1f653b51ec156d91a9aca16a4102f19e03d9e600290940293840155517f8077777ae4769de06cbfd1c0b8b1f653b51ec156d91a9aca16a4102f19e03d9f909201919091555490915061270a9030906128b5565b61016b54604080519182526020820183905280517f6aecc0a97ed8436da25295877eadc9bdfcb38d8d2cd93ce7b51765d2eaac9ff29281900390910190a1600061016b5561276d6201518061276142828106612007565b9063ffffffff61204916565b61016a5550565b6001600160a01b0381166127b95760405162461bcd60e51b8152600401808060200182810382526026815260200180612fd86026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6101685460009082111561283d57fe5b6001600160a01b03831660009081526101696020526040902054610ea39083612865866114b4565b612288565b6128726120e4565b61287b836128a3565b50612885826128a3565b50612891838383612abd565b61289a836121bd565b611a5c826121bd565b6000610e1482610168805490506120f5565b6001600160a01b038216612910576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b606954612923908263ffffffff61204916565b6069556001600160a01b03821660009081526067602052604090205461294f908263ffffffff61204916565b6001600160a01b03831660008181526067602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166129ec5760405162461bcd60e51b81526004018080602001828103825260218152602001806131fc6021913960400191505060405180910390fd5b612a2f81604051806060016040528060228152602001612fb6602291396001600160a01b038516600090815260676020526040902054919063ffffffff611f6616565b6001600160a01b038316600090815260676020526040902055606954612a5b908263ffffffff61200716565b6069556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60008061016b54118015610ecc57505061016a5442101590565b6001600160a01b038316612b025760405162461bcd60e51b815260040180806020018281038252602581526020018061321d6025913960400191505060405180910390fd5b6001600160a01b038216612b475760405162461bcd60e51b8152600401808060200182810382526023815260200180612f936023913960400191505060405180910390fd5b612b8a81604051806060016040528060268152602001613020602691396001600160a01b038616600090815260676020526040902054919063ffffffff611f6616565b6001600160a01b038085166000908152606760205260408082209390935590841681522054612bbf908263ffffffff61204916565b6001600160a01b0380841660008181526067602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b612c2582826120c8565b61150582612c31611dd0565b610e9a846040518060600160405280602481526020016131ac602491396001600160a01b038816600090815260686020526040812090610e73611dd0565b600082612c7e57506000610d12565b82820282848281612c8b57fe5b0414610ea35760405162461bcd60e51b81526004018080602001828103825260218152602001806131136021913960400191505060405180910390fd5b6000610ea383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e95565b600054610100900460ff1680612d235750612d23611ec0565b80612d31575060005460ff16155b612d6c5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015612d97576000805460ff1961ff0019909116610100171660011790555b612da082611940565b611b6357611b638261257c565b612db7828261260c565b15612e09576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b612e38828261260c565b612e735760405162461bcd60e51b81526004018080602001828103825260218152602001806130c76021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60008183612ee45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611fba578181015183820152602001611fa2565b506000838581612ef057fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612f3b57805160ff1916838001178555612f68565b82800160010185558215612f68579182015b82811115612f68578251825591602001919060010190612f4d565b50612f74929150612f78565b5090565b610cf791905b80821115612f745760008155600101612f7e56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365446973747269627574696f6e546f6b656e3a206e657874446973747269627574696f6e20697320746f6f20686967684d6f64756c653a20706f6f6c20616464726573732063616e2774206265207a65726f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65506f6f6c546f6b656e3a207472616e7366657273206265747765656e2075736572732064697361626c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365446973747269627574696f6e546f6b656e3a206e6f20646973747269627574696f6e7320746f20636c61696d45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373446973747269627574696f6e546f6b656e3a206c617374446973747269627574696f6e20746f6f2068696768744d6f64756c653a20726571756573746564206d6f64756c65206e6f7420666f756e6445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373446973747269627574696f6e546f6b656e3a207374617274446973747269627574696f6e20697320746f6f2068696768446973747269627574696f6e546f6b656e3a206e6f7468696e6720746f206469737472696275746545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c41f97f40e9ee70d890a6c8e2ad5b9b2533cf8017ff3f7768b4434ac43e7c68a64736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030a5760003560e01c80637f4442e91161019c578063aa271e1a116100ee578063d63b500411610097578063e6b1474411610071578063e6b1474414610c0f578063f238cd2214610c17578063f2fde38b14610c1f5761030a565b8063d63b500414610bba578063dd62ed3e14610bc2578063df50afa414610bf05761030a565b8063c4d66de8116100c8578063c4d66de814610b60578063ce3e4dd214610b86578063d08153fd14610b8e5761030a565b8063aa271e1a14610a5a578063c12460f414610a80578063c2a6d89114610af05761030a565b806391c05b0b11610150578063986502751161012a57806398650275146109fa578063a457c2d714610a02578063a9059cbb14610a2e5761030a565b806391c05b0b146109af57806395d89b41146109cc578063983b2d56146109d45761030a565b80638da5cb5b116101815780638da5cb5b146108625780638f32d59b1461086a57806390657147146108725761030a565b80637f4442e9146108315780638129fc1c1461085a5761030a565b806340c10f191161026057806370898f781161020957806371dc760f116101e357806371dc760f14610739578063780fa8cf146107df57806379cc6790146108055761030a565b806370898f78146106e557806370a082311461070b578063715018a6146107315761030a565b80634487d3df1161023a5780634487d3df1461066357806358b5dd721461069957806360b63648146106bf5761030a565b806340c10f19146105f457806342966c68146106205780634437152a1461063d5761030a565b80631d4ba2d2116102c2578063313ce5671161029c578063313ce567146105a257806338b0789d146105c057806339509351146105c85761030a565b80631d4ba2d21461053e57806323b872dd1461056457806329b05c6f1461059a5761030a565b80631624f6c6116102f35780631624f6c6146103cc57806316f0115b1461050057806318160ddd146105245761030a565b806306fdde031461030f578063095ea7b31461038c575b600080fd5b610317610c45565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610351578181015183820152602001610339565b50505050905090810190601f16801561037e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103b8600480360360408110156103a257600080fd5b506001600160a01b038135169060200135610cfa565b604080519115158252519081900360200190f35b6104fe600480360360608110156103e257600080fd5b8101906020810181356401000000008111156103fd57600080fd5b82018360208201111561040f57600080fd5b8035906020019184600183028401116401000000008311171561043157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561048457600080fd5b82018360208201111561049657600080fd5b803590602001918460018302840111640100000000831117156104b857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610d189050565b005b610508610df4565b604080516001600160a01b039092168252519081900360200190f35b61052c610e03565b60408051918252519081900360200190f35b61052c6004803603602081101561055457600080fd5b50356001600160a01b0316610e09565b6103b86004803603606081101561057a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e1c565b61052c610eaa565b6105aa610ed1565b6040805160ff9092168252519081900360200190f35b61052c610eda565b6103b8600480360360408110156105de57600080fd5b506001600160a01b038135169060200135610ee1565b6103b86004803603604081101561060a57600080fd5b506001600160a01b038135169060200135610f35565b6104fe6004803603602081101561063657600080fd5b5035610f8c565b6104fe6004803603602081101561065357600080fd5b50356001600160a01b0316610fa0565b6106806004803603602081101561067957600080fd5b50356110aa565b6040805192835260208301919091528051918290030190f35b61052c600480360360208110156106af57600080fd5b50356001600160a01b03166110d6565b61052c600480360360208110156106d557600080fd5b50356001600160a01b0316611123565b61052c600480360360208110156106fb57600080fd5b50356001600160a01b0316611150565b61052c6004803603602081101561072157600080fd5b50356001600160a01b0316611163565b6104fe61117e565b6105086004803603602081101561074f57600080fd5b81019060208101813564010000000081111561076a57600080fd5b82018360208201111561077c57600080fd5b8035906020019184600183028401116401000000008311171561079e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611239945050505050565b61052c600480360360208110156107f557600080fd5b50356001600160a01b03166114b4565b6104fe6004803603604081101561081b57600080fd5b506001600160a01b0381351690602001356114dc565b61052c6004803603606081101561084757600080fd5b5080359060208101359060400135611509565b6104fe611596565b610508611647565b6103b8611656565b6104fe6004803603606081101561088857600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156108b357600080fd5b8201836020820111156108c557600080fd5b803590602001918460018302840111640100000000831117156108e757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561093a57600080fd5b82018360208201111561094c57600080fd5b8035906020019184600183028401116401000000008311171561096e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061167c945050505050565b6104fe600480360360208110156109c557600080fd5b5035611745565b6103176117de565b6104fe600480360360208110156109ea57600080fd5b50356001600160a01b031661185d565b6104fe6118ac565b6103b860048036036040811015610a1857600080fd5b506001600160a01b0381351690602001356118be565b6103b860048036036040811015610a4457600080fd5b506001600160a01b03813516906020013561192c565b6103b860048036036020811015610a7057600080fd5b50356001600160a01b0316611940565b6104fe60048036036040811015610a9657600080fd5b810190602081018135640100000000811115610ab157600080fd5b820183602082011115610ac357600080fd5b80359060200191846020830284011164010000000083111715610ae557600080fd5b919350915035611953565b6104fe60048036036020811015610b0657600080fd5b810190602081018135640100000000811115610b2157600080fd5b820183602082011115610b3357600080fd5b80359060200191846020830284011164010000000083111715610b5557600080fd5b5090925090506119fc565b6104fe60048036036020811015610b7657600080fd5b50356001600160a01b0316611a61565b61052c611b78565b61052c60048036036040811015610ba457600080fd5b506001600160a01b038135169060200135611b7f565b61052c611c38565b61052c60048036036040811015610bd857600080fd5b506001600160a01b0381358116916020013516611c3f565b6104fe60048036036020811015610c0657600080fd5b50351515611c6a565b6104fe611cd7565b61052c611d67565b6104fe60048036036020811015610c3557600080fd5b50356001600160a01b0316611d6e565b609c8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cef5780601f10610cc457610100808354040283529160200191610cef565b820191906000526020600020905b815481529060010190602001808311610cd257829003601f168201915b505050505090505b90565b6000610d0e610d07611dd0565b8484611dd4565b5060015b92915050565b600054610100900460ff1680610d315750610d31611ec0565b80610d3f575060005460ff16155b610d7a5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015610da5576000805460ff1961ff0019909116610100171660011790555b8351610db890609c906020870190612efa565b508251610dcc90609d906020860190612efa565b50609e805460ff191660ff84161790558015610dee576000805461ff00191690555b50505050565b6066546001600160a01b031681565b60695490565b6000610e1482611ec6565b90505b919050565b6000610e29848484611f02565b610e9f84610e35611dd0565b610e9a85604051806060016040528060288152602001613134602891396001600160a01b038a16600090815260686020526040812090610e73611dd0565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611f6616565b611dd4565b5060015b9392505050565b6000610ecc610eb830611163565b610ec0611ffd565b9063ffffffff61200716565b905090565b609e5460ff1690565b6101685490565b6000610d0e610eee611dd0565b84610e9a8560686000610eff611dd0565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61204916565b6000610f47610f42611dd0565b611940565b610f825760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b610d0e83836120a3565b610f9d610f97611dd0565b826120c8565b50565b610fa8611656565b610ff9576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661103e5760405162461bcd60e51b81526004018080602001828103825260228152602001806130756022913960400191505060405180910390fd5b606680546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f5b36800c27524690807962bd42525a44e68b3f860e8f9e0204f27e777d2f46059181900360200190a150565b61016881815481106110b857fe5b60009182526020909120600290910201805460019091015490915082565b60006001600160a01b0382163014156110f157506000610e17565b60006110fc836114b4565b9050600061110984611ec6565b905061111b828263ffffffff61204916565b949350505050565b600061112d6120e4565b600061113f83610168805490506120f5565b90508015610e1457610e14836121bd565b6101696020526000908152604090205481565b6001600160a01b031660009081526067602052604090205490565b611186611656565b6111d7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6066546000906001600160a01b0316611299576040805162461bcd60e51b815260206004820152600f60248201527f4d6f64756c653a206e6f20706f6f6c0000000000000000000000000000000000604482015290519081900360640190fd5b6066546040516020602482018181528551604484015285516000946060946001600160a01b03909116938893928392606401918501908083838b5b838110156112ec5781810151838201526020016112d4565b50505050905090810190601f1680156113195780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f693ec85e00000000000000000000000000000000000000000000000000000000178152905182519295509350839250908083835b602083106113de57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016113a1565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811461143e576040519150601f19603f3d011682016040523d82523d6000602084013e611443565b606091505b509150915081611454578060208201fd5b600081806020019051602081101561146b57600080fd5b505190506001600160a01b03811661111b5760405162461bcd60e51b815260040180806020018281038252602281526020018061326f6022913960400191505060405180910390fd5b60006001600160a01b03821630146114d4576114cf82612273565b610e14565b506000919050565b6114e7610f42611dd0565b156114fb576114f682826120c8565b611505565b611505828261227e565b5050565b60008284106115495760405162461bcd60e51b81526004018080602001828103825260308152602001806132b56030913960400191505060405180910390fd5b6101685483111561158b5760405162461bcd60e51b815260040180806020018281038252602f815260200180613046602f913960400191505060405180910390fd5b61111b848484612288565b600054610100900460ff16806115af57506115af611ec0565b806115bd575060005460ff16155b6115f85760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015611623576000805460ff1961ff0019909116610100171660011790555b61163361162e611dd0565b61233f565b8015610f9d576000805461ff001916905550565b6033546001600160a01b031690565b6033546000906001600160a01b031661166d611dd0565b6001600160a01b031614905090565b600054610100900460ff16806116955750611695611ec0565b806116a3575060005460ff16155b6116de5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015611709576000805460ff1961ff0019909116610100171660011790555b61171284612448565b61171e83836012610d18565b61172e611729611dd0565b6124e6565b8015610dee576000805461ff001916905550505050565b611750610f42611dd0565b61178b5760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b61016b5461179f908263ffffffff61204916565b61016b556040805182815290517f28947a1b8cd1d9d78a7b045465f8a2fa6daa21bc522412d192a532aee396e9279181900360200190a1610f9d6120e4565b609d8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cef5780601f10610cc457610100808354040283529160200191610cef565b611868610f42611dd0565b6118a35760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b610f9d8161257c565b6118bc6118b7611dd0565b6125c4565b565b6000610d0e6118cb611dd0565b84610e9a8560405180606001604052806025815260200161330d60259139606860006118f5611dd0565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611f6616565b6000610d0e611939611dd0565b8484611f02565b6000610e1460d18363ffffffff61260c16565b610168548111156119955760405162461bcd60e51b815260040180806020018281038252602d815260200180613242602d913960400191505060405180910390fd5b60005b82811015610dee5760006119c78585848181106119b157fe5b905060200201356001600160a01b0316846120f5565b905080156119f3576119f38585848181106119de57fe5b905060200201356001600160a01b03166121bd565b50600101611998565b611a046120e4565b60005b81811015611a5c576000611a3c848484818110611a2057fe5b905060200201356001600160a01b0316610168805490506120f5565b90508015611a5357611a538484848181106119de57fe5b50600101611a07565b505050565b600054610100900460ff1680611a7a5750611a7a611ec0565b80611a88575060005460ff16155b611ac35760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015611aee576000805460ff1961ff0019909116610100171660011790555b611b63826040518060400160405280601481526020017f44656c70686920436f6d706f756e6420555344430000000000000000000000008152506040518060400160405280600681526020017f644355534443000000000000000000000000000000000000000000000000000081525061167c565b8015611505576000805461ff00191690555050565b61016a5481565b61016854600090821115611bc45760405162461bcd60e51b815260040180806020018281038252602d815260200180613242602d913960400191505060405180910390fd5b6001600160a01b038316600090815261016960205260409020548211611c1b5760405162461bcd60e51b815260040180806020018281038252602c8152602001806131d0602c913960400191505060405180910390fd5b6000611c2784846120f5565b90508015610ea357610ea3846121bd565b61016b5481565b6001600160a01b03918216600090815260686020908152604080832093909416825291909152205490565b611c72611656565b611cc3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61016c805460ff1916911515919091179055565b611ce2610f42611dd0565b611d1d5760405162461bcd60e51b81526004018080602001828103825260308152602001806130976030913960400191505060405180910390fd5b600061016b5411611d5f5760405162461bcd60e51b81526004018080602001828103825260288152602001806132e56028913960400191505060405180910390fd5b6118bc612673565b6201518081565b611d76611656565b611dc7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610f9d81612774565b3390565b6001600160a01b038316611e195760405162461bcd60e51b81526004018080602001828103825260248152602001806132916024913960400191505060405180910390fd5b6001600160a01b038216611e5e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ffe6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260686020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b303b1590565b610168546001600160a01b03821660009081526101696020526040812054909111611ef357506000610e17565b61016854610e1490839061282d565b61016c5460ff16158015611f1f57506001600160a01b0383163014155b15611f5b5760405162461bcd60e51b815260040180806020018281038252602b8152602001806130e8602b913960400191505060405180910390fd5b611a5c83838361286a565b60008184841115611ff55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fba578181015183820152602001611fa2565b50505050905090810190601f168015611fe75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000610ecc610e03565b6000610ea383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f66565b600082820183811015610ea3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6120ab6120e4565b6120b4826128a3565b506120bf82826128b5565b611505826121bd565b6120d06120e4565b6120d9826128a3565b506120bf82826129a7565b6120ec612aa3565b611d5f576118bc565b6001600160a01b03821660009081526101696020526040812054828110612120576000915050610d12565b600061212c858561282d565b90508061213e57600092505050610d12565b6001600160a01b038516600090815261016960205260409020849055612165308683612abd565b604080516001600160a01b0387168152602081018390528082018490526060810186905290517fe61468ba7ef06e2d4e4f2ae88303bb4d1fdbe6001ad2fe0782cbd4f7dffca8579181900360800190a1949350505050565b60006121fd6040518060400160405280601381526020017f726577617264446973747269627574696f6e7300000000000000000000000000815250611239565b9050806001600160a01b031663c9b0d081836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561225757600080fd5b505af115801561226b573d6000803e3d6000fd5b505050505050565b6000610e1482611163565b6115058282612c1b565b600083828061229c57600092505050610ea3565b8482101561232557600061230461016884815481106122b757fe5b9060005260206000209060020201600101546122f861016886815481106122da57fe5b6000918252602090912060029091020154859063ffffffff612c6f16565b9063ffffffff612cc816565b9050612316828263ffffffff61204916565b600190930192915061229c9050565b612335818563ffffffff61200716565b9695505050505050565b600054610100900460ff16806123585750612358611ec0565b80612366575060005460ff16155b6123a15760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff161580156123cc576000805460ff1961ff0019909116610100171660011790555b603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015611505576000805461ff00191690555050565b600054610100900460ff16806124615750612461611ec0565b8061246f575060005460ff16155b6124aa5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff161580156124d5576000805460ff1961ff0019909116610100171660011790555b6124dd611596565b611b6382610fa0565b600054610100900460ff16806124ff57506124ff611ec0565b8061250d575060005460ff16155b6125485760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015612573576000805460ff1961ff0019909116610100171660011790555b611b6382612d0a565b61258d60d18263ffffffff612dad16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6125d560d18263ffffffff612e2e16565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b0382166126535760405162461bcd60e51b815260040180806020018281038252602281526020018061315c6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b600061267d610eaa565b6040805180820190915261016b8054825260208201838152610168805460018101825560009190915292517f8077777ae4769de06cbfd1c0b8b1f653b51ec156d91a9aca16a4102f19e03d9e600290940293840155517f8077777ae4769de06cbfd1c0b8b1f653b51ec156d91a9aca16a4102f19e03d9f909201919091555490915061270a9030906128b5565b61016b54604080519182526020820183905280517f6aecc0a97ed8436da25295877eadc9bdfcb38d8d2cd93ce7b51765d2eaac9ff29281900390910190a1600061016b5561276d6201518061276142828106612007565b9063ffffffff61204916565b61016a5550565b6001600160a01b0381166127b95760405162461bcd60e51b8152600401808060200182810382526026815260200180612fd86026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6101685460009082111561283d57fe5b6001600160a01b03831660009081526101696020526040902054610ea39083612865866114b4565b612288565b6128726120e4565b61287b836128a3565b50612885826128a3565b50612891838383612abd565b61289a836121bd565b611a5c826121bd565b6000610e1482610168805490506120f5565b6001600160a01b038216612910576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b606954612923908263ffffffff61204916565b6069556001600160a01b03821660009081526067602052604090205461294f908263ffffffff61204916565b6001600160a01b03831660008181526067602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166129ec5760405162461bcd60e51b81526004018080602001828103825260218152602001806131fc6021913960400191505060405180910390fd5b612a2f81604051806060016040528060228152602001612fb6602291396001600160a01b038516600090815260676020526040902054919063ffffffff611f6616565b6001600160a01b038316600090815260676020526040902055606954612a5b908263ffffffff61200716565b6069556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60008061016b54118015610ecc57505061016a5442101590565b6001600160a01b038316612b025760405162461bcd60e51b815260040180806020018281038252602581526020018061321d6025913960400191505060405180910390fd5b6001600160a01b038216612b475760405162461bcd60e51b8152600401808060200182810382526023815260200180612f936023913960400191505060405180910390fd5b612b8a81604051806060016040528060268152602001613020602691396001600160a01b038616600090815260676020526040902054919063ffffffff611f6616565b6001600160a01b038085166000908152606760205260408082209390935590841681522054612bbf908263ffffffff61204916565b6001600160a01b0380841660008181526067602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b612c2582826120c8565b61150582612c31611dd0565b610e9a846040518060600160405280602481526020016131ac602491396001600160a01b038816600090815260686020526040812090610e73611dd0565b600082612c7e57506000610d12565b82820282848281612c8b57fe5b0414610ea35760405162461bcd60e51b81526004018080602001828103825260218152602001806131136021913960400191505060405180910390fd5b6000610ea383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e95565b600054610100900460ff1680612d235750612d23611ec0565b80612d31575060005460ff16155b612d6c5760405162461bcd60e51b815260040180806020018281038252602e81526020018061317e602e913960400191505060405180910390fd5b600054610100900460ff16158015612d97576000805460ff1961ff0019909116610100171660011790555b612da082611940565b611b6357611b638261257c565b612db7828261260c565b15612e09576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b612e38828261260c565b612e735760405162461bcd60e51b81526004018080602001828103825260218152602001806130c76021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60008183612ee45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611fba578181015183820152602001611fa2565b506000838581612ef057fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612f3b57805160ff1916838001178555612f68565b82800160010185558215612f68579182015b82811115612f68578251825591602001919060010190612f4d565b50612f74929150612f78565b5090565b610cf791905b80821115612f745760008155600101612f7e56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365446973747269627574696f6e546f6b656e3a206e657874446973747269627574696f6e20697320746f6f20686967684d6f64756c653a20706f6f6c20616464726573732063616e2774206265207a65726f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65506f6f6c546f6b656e3a207472616e7366657273206265747765656e2075736572732064697361626c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365446973747269627574696f6e546f6b656e3a206e6f20646973747269627574696f6e7320746f20636c61696d45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373446973747269627574696f6e546f6b656e3a206c617374446973747269627574696f6e20746f6f2068696768744d6f64756c653a20726571756573746564206d6f64756c65206e6f7420666f756e6445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373446973747269627574696f6e546f6b656e3a207374617274446973747269627574696f6e20697320746f6f2068696768446973747269627574696f6e546f6b656e3a206e6f7468696e6720746f206469737472696275746545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c41f97f40e9ee70d890a6c8e2ad5b9b2533cf8017ff3f7768b4434ac43e7c68a64736f6c63430005110032
Deployed Bytecode Sourcemap
43608:245:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43608:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20979:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20979:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14422:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14422:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;20723:186;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20723:186:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;20723:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;20723:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;20723:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;20723:186:0;;;;;;;;-1:-1:-1;20723:186:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;20723:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;20723:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;20723:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;20723:186:0;;-1:-1:-1;;;20723:186:0;;;;;-1:-1:-1;20723:186:0;;-1:-1:-1;20723:186:0:i;:::-;;30392:19;;;:::i;:::-;;;;-1:-1:-1;;;;;30392:19:0;;;;;;;;;;;;;;13443:91;;;:::i;:::-;;;;;;;;;;;;;;;;35622:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35622:142:0;-1:-1:-1;;;;;35622:142:0;;:::i;15046:304::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15046:304:0;;;;;;;;;;;;;;;;;:::i;43360:152::-;;;:::i;21831:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36653:102;;;:::i;15759:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15759:210:0;;;;;;;;:::i;24987:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24987:143:0;;;;;;;;:::i;25686:83::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25686:83:0;;:::i;30543:208::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30543:208:0;-1:-1:-1;;;;;30543:208:0;;:::i;32248:35::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32248:35:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35080:353;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35080:353:0;-1:-1:-1;;;;;35080:353:0;;:::i;33124:273::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33124:273:0;-1:-1:-1;;;;;33124:273:0;;:::i;32338:52::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32338:52:0;-1:-1:-1;;;;;32338:52:0;;:::i;13597:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13597:110:0;-1:-1:-1;;;;;13597:110:0;;:::i;27993:140::-;;;:::i;30759:751::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30759:751:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30759:751:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30759:751:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;30759:751:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30759:751:0;;-1:-1:-1;30759:751:0;;-1:-1:-1;;;;;30759:751:0:i;43184:168::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43184:168:0;-1:-1:-1;;;;;43184:168:0;;:::i;42309:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42309:242:0;;;;;;;;:::i;36189:456::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36189:456:0;;;;;;;;;;;;:::i;29001:92::-;;;:::i;27180:79::-;;;:::i;27546:94::-;;;:::i;41809:257::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;41809:257:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;41809:257:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41809:257:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41809:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41809:257:0;;;;;;;;-1:-1:-1;41809:257:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;41809:257:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41809:257:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41809:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41809:257:0;;-1:-1:-1;41809:257:0;;-1:-1:-1;;;;;41809:257:0:i;32688:239::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32688:239:0;;:::i;21181:87::-;;;:::i;23819:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23819:92:0;-1:-1:-1;;;;;23819:92:0;;:::i;23919:79::-;;;:::i;16472:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16472:261:0;;;;;;;;:::i;13920:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13920:158:0;;;;;;;;:::i;23702:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23702:109:0;-1:-1:-1;;;;;23702:109:0;;:::i;34404:411::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34404:411:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;34404:411:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34404:411:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34404:411:0;;-1:-1:-1;34404:411:0;-1:-1:-1;34404:411:0;;:::i;34071:325::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34071:325:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;34071:325:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34071:325:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;34071:325:0;;-1:-1:-1;34071:325:0;-1:-1:-1;34071:325:0;:::i;43661:185::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43661:185:0;-1:-1:-1;;;;;43661:185:0;;:::i;32455:40::-;;;:::i;33593:470::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33593:470:0;;;;;;;;:::i;32591:38::-;;;:::i;14141:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14141:134:0;;;;;;;;;;:::i;42074:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42074:117:0;;;;:::i;32935:181::-;;;:::i;31732:66::-;;;:::i;28288:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28288:109:0;-1:-1:-1;;;;;28288:109:0;;:::i;20979:83::-;21049:5;21042:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21016:13;;21042:12;;21049:5;;21042:12;;21049:5;21042:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20979:83;;:::o;14422:152::-;14488:4;14505:39;14514:12;:10;:12::i;:::-;14528:7;14537:6;14505:8;:39::i;:::-;-1:-1:-1;14562:4:0;14422:152;;;;;:::o;20723:186::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;20831:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;20854:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;20881:9:0;:20;;-1:-1:-1;;20881:20:0;;;;;;;1368:57;;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;1368:57;20723:186;;;;:::o;30392:19::-;;;-1:-1:-1;;;;;30392:19:0;;:::o;13443:91::-;13514:12;;13443:91;:::o;35622:142::-;35700:7;35727:29;35748:7;35727:20;:29::i;:::-;35720:36;;35622:142;;;;:::o;15046:304::-;15135:4;15152:36;15162:6;15170:9;15181:6;15152:9;:36::i;:::-;15199:121;15208:6;15216:12;:10;:12::i;:::-;15230:89;15268:6;15230:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15230:19:0;;;;;;:11;:19;;;;;;15250:12;:10;:12::i;:::-;-1:-1:-1;;;;;15230:33:0;;;;;;;;;;;;-1:-1:-1;15230:33:0;;;:89;;:37;:89;:::i;:::-;15199:8;:121::i;:::-;-1:-1:-1;15338:4:0;15046:304;;;;;;:::o;43360:152::-;43415:7;43442:61;43478:24;43496:4;43478:9;:24::i;:::-;43442:31;:29;:31::i;:::-;:35;:61;:35;:61;:::i;:::-;43435:68;;43360:152;:::o;21831:83::-;21897:9;;;;21831:83;:::o;36653:102::-;36727:13;:20;36653:102;:::o;15759:210::-;15839:4;15856:83;15865:12;:10;:12::i;:::-;15879:7;15888:50;15927:10;15888:11;:25;15900:12;:10;:12::i;:::-;-1:-1:-1;;;;;15888:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15888:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;24987:143::-;25061:4;23599:22;23608:12;:10;:12::i;:::-;23599:8;:22::i;:::-;23591:83;;;;-1:-1:-1;;;23591:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25078:22;25084:7;25093:6;25078:5;:22::i;25686:83::-;25734:27;25740:12;:10;:12::i;:::-;25754:6;25734:5;:27::i;:::-;25686:83;:::o;30543:208::-;27392:9;:7;:9::i;:::-;27384:54;;;;;-1:-1:-1;;;27384:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30611:21:0;;30603:68;;;;-1:-1:-1;;;30603:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30682:4;:12;;-1:-1:-1;;;;;30682:12:0;;;;;;;;;;;30710:25;;;;;;;;;;;;;;;;30543:208;:::o;32248:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32248:35:0;:::o;35080:353::-;35140:7;-1:-1:-1;;;;;35163:24:0;;35182:4;35163:24;35159:38;;;-1:-1:-1;35196:1:0;35189:8;;35159:38;35253:27;35283:30;35305:7;35283:21;:30::i;:::-;35253:60;;35324:17;35344:29;35365:7;35344:20;:29::i;:::-;35324:49;-1:-1:-1;35391:34:0;:19;35324:49;35391:34;:23;:34;:::i;:::-;35384:41;35080:353;-1:-1:-1;;;;35080:353:0:o;33124:273::-;33186:7;33206:28;:26;:28::i;:::-;33245:14;33262:49;33281:7;33290:13;:20;;;;33262:18;:49::i;:::-;33245:66;-1:-1:-1;33326:10:0;;33322:43;;33338:27;33357:7;33338:18;:27::i;32338:52::-;;;;;;;;;;;;;:::o;13597:110::-;-1:-1:-1;;;;;13681:18:0;13654:7;13681:18;;;:9;:18;;;;;;;13597:110::o;27993:140::-;27392:9;:7;:9::i;:::-;27384:54;;;;;-1:-1:-1;;;27384:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28076:6;;28055:40;;28092:1;;-1:-1:-1;;;;;28076:6:0;;28055:40;;28092:1;;28055:40;28106:6;:19;;;;;;27993:140::o;30759:751::-;30854:4;;30827:7;;-1:-1:-1;;;;;30854:4:0;30846:48;;;;;-1:-1:-1;;;30846:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30943:4;;30959:46;;;;;;;;;;;;;;;;;30906:12;;30920:19;;-1:-1:-1;;;;;30943:4:0;;;;30998:6;;30959:46;;;;;;;;;;;;30906:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30959:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30959:46:0;;;22:32:-1;26:21;;;22:32;6:49;;30959:46:0;;;49:4:-1;25:18;;61:17;;30959:46:0;182:15:-1;30959:46:0;179:29:-1;160:49;;30943:63:0;;;;30959:46;;-1:-1:-1;30943:63:0;-1:-1:-1;30943:63:0;;-1:-1:-1;25:18;30943:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;30943:63:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;30905:101:0;;;;31076:7;31071:80;;31133:6;31128:2;31120:6;31116:15;31109:31;31094:57;31163:21;31198:6;31187:29;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31187:29:0;;-1:-1:-1;;;;;;31403:29:0;;31395:76;;;;-1:-1:-1;;;31395:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43184:168;43252:7;-1:-1:-1;;;;;43280:24:0;;43299:4;43280:24;43279:65;;43308:36;43336:7;43308:27;:36::i;:::-;43279:65;;;-1:-1:-1;43306:1:0;;43184:168;-1:-1:-1;43184:168:0:o;42309:242::-;42378:22;42387:12;:10;:12::i;42378:22::-;42374:170;;;42456:18;42462:4;42468:5;42456;:18::i;:::-;42374:170;;;42505:27;42520:4;42526:5;42505:14;:27::i;:::-;42309:242;;:::o;36189:456::-;36319:7;36366:14;36347:16;:33;36339:94;;;;-1:-1:-1;;;36339:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36470:13;:20;36452:38;;;36444:98;;;;-1:-1:-1;;;36444:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36560:77;36588:16;36606:14;36622;36560:27;:77::i;29001:92::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;29053:32;29072:12;:10;:12::i;:::-;29053:18;:32::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;29001:92;:::o;27180:79::-;27245:6;;-1:-1:-1;;;;;27245:6:0;27180:79;:::o;27546:94::-;27626:6;;27586:4;;-1:-1:-1;;;;;27626:6:0;27610:12;:10;:12::i;:::-;-1:-1:-1;;;;;27610:22:0;;27603:29;;27546:94;:::o;41809:257::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;41924:24;41942:5;41924:17;:24::i;:::-;41959:50;41984:8;41994:10;42006:2;41959:24;:50::i;:::-;42020:38;42045:12;:10;:12::i;:::-;42020:24;:38::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;41809:257;;;;:::o;32688:239::-;23599:22;23608:12;:10;:12::i;23599:22::-;23591:83;;;;-1:-1:-1;;;23591:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32781:23;;:35;;32809:6;32781:35;:27;:35;:::i;:::-;32755:23;:61;32840:40;;;;;;;;;;;;;;;;;32891:28;:26;:28::i;21181:87::-;21253:7;21246:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21220:13;;21246:14;;21253:7;;21246:14;;21253:7;21246:14;;;;;;;;;;;;;;;;;;;;;;;;23819:92;23599:22;23608:12;:10;:12::i;23599:22::-;23591:83;;;;-1:-1:-1;;;23591:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23884:19;23895:7;23884:10;:19::i;23919:79::-;23963:27;23977:12;:10;:12::i;:::-;23963:13;:27::i;:::-;23919:79::o;16472:261::-;16557:4;16574:129;16583:12;:10;:12::i;:::-;16597:7;16606:96;16645:15;16606:96;;;;;;;;;;;;;;;;;:11;:25;16618:12;:10;:12::i;:::-;-1:-1:-1;;;;;16606:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;16606:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;13920:158::-;13989:4;14006:42;14016:12;:10;:12::i;:::-;14030:9;14041:6;14006:9;:42::i;23702:109::-;23758:4;23782:21;:8;23795:7;23782:21;:12;:21;:::i;34404:411::-;34531:13;:20;34513:38;;;34505:96;;;;-1:-1:-1;;;34505:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34617:9;34612:196;34630:19;;;34612:196;;;34670:14;34687:47;34706:8;;34715:1;34706:11;;;;;;;;;;;;;-1:-1:-1;;;;;34706:11:0;34719:14;34687:18;:47::i;:::-;34670:64;-1:-1:-1;34753:10:0;;34749:47;;34765:31;34784:8;;34793:1;34784:11;;;;;;;;;;;;;-1:-1:-1;;;;;34784:11:0;34765:18;:31::i;:::-;-1:-1:-1;34651:3:0;;34612:196;;34071:325;34148:28;:26;:28::i;:::-;34192:9;34187:202;34205:19;;;34187:202;;;34245:14;34262:53;34281:8;;34290:1;34281:11;;;;;;;;;;;;;-1:-1:-1;;;;;34281:11:0;34294:13;:20;;;;34262:18;:53::i;:::-;34245:70;-1:-1:-1;34334:10:0;;34330:47;;34346:31;34365:8;;34374:1;34365:11;;;;;;34346:31;-1:-1:-1;34226:3:0;;34187:202;;;;34071:325;;:::o;43661:185::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;43726:112;43761:5;43726:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:112::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;43661:185;;:::o;32455:40::-;;;;:::o;33593:470::-;33725:13;:20;33679:7;;33707:38;;;33699:96;;;;-1:-1:-1;;;33699:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33814:26:0;;;;;;:17;:26;;;;;;:43;-1:-1:-1;33806:100:0;;;;-1:-1:-1;;;33806:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33917:14;33934:43;33953:7;33962:14;33934:18;:43::i;:::-;33917:60;-1:-1:-1;33992:10:0;;33988:43;;34004:27;34023:7;34004:18;:27::i;32591:38::-;;;;:::o;14141:134::-;-1:-1:-1;;;;;14240:18:0;;;14213:7;14240:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14141:134::o;42074:117::-;27392:9;:7;:9::i;:::-;27384:54;;;;;-1:-1:-1;;;27384:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42151:14;:32;;-1:-1:-1;;42151:32:0;;;;;;;;;;42074:117::o;32935:181::-;23599:22;23608:12;:10;:12::i;23599:22::-;23591:83;;;;-1:-1:-1;;;23591:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33030:1;33004:23;;:27;32996:80;;;;-1:-1:-1;;;32996:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33087:21;:19;:21::i;31732:66::-;31790:8;31732:66;:::o;28288:109::-;27392:9;:7;:9::i;:::-;27384:54;;;;;-1:-1:-1;;;27384:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28361:28;28380:8;28361:18;:28::i;3046:98::-;3126:10;3046:98;:::o;19403:338::-;-1:-1:-1;;;;;19497:19:0;;19489:68;;;;-1:-1:-1;;;19489:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19576:21:0;;19568:68;;;;-1:-1:-1;;;19568:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19649:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19701:32;;;;;;;;;;;;;;;;;19403:338;;;:::o;1519:508::-;1936:4;1982:17;2014:7;1519:508;:::o;40241:230::-;40364:13;:20;-1:-1:-1;;;;;40334:26:0;;40310:7;40334:26;;;:17;:26;;;;;;40310:7;;-1:-1:-1;40330:64:0;;-1:-1:-1;40393:1:0;40386:8;;40330:64;40442:13;:20;40412:51;;40433:7;;40412:20;:51::i;42559:350::-;42654:14;;;;42653:15;:58;;;;-1:-1:-1;;;;;;42687:23:0;;42705:4;42687:23;;42653:58;42649:200;;;42784:53;;-1:-1:-1;;;42784:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42649:200;42859:42;42875:6;42883:9;42894:6;42859:15;:42::i;8160:192::-;8246:7;8282:12;8274:6;;;;8266:29;;;;-1:-1:-1;;;8266:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8266:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8318:5:0;;;8160:192::o;37352:102::-;37407:7;37433:13;:11;:13::i;7687:136::-;7745:7;7772:43;7776:1;7779;7772:43;;;;;;;;;;;;;;;;;:3;:43::i;7231:181::-;7289:7;7321:5;;;7345:6;;;;7337:46;;;;;-1:-1:-1;;;7337:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37855:219;37923:28;:26;:28::i;:::-;37962:27;37981:7;37962:18;:27::i;:::-;;38000:28;38012:7;38021:6;38000:11;:28::i;:::-;38039:27;38058:7;38039:18;:27::i;38086:219::-;38154:28;:26;:28::i;:::-;38193:27;38212:7;38193:18;:27::i;:::-;;38231:28;38243:7;38252:6;38231:11;:28::i;39093:135::-;39156:24;:22;:24::i;:::-;39151:38;;39182:7;;38467:618;-1:-1:-1;;;;;38600:26:0;;38553:7;38600:26;;;:17;:26;;;;;;38641:34;;;38637:48;;38684:1;38677:8;;;;;38637:48;38696:26;38725:45;38746:7;38755:14;38725:20;:45::i;:::-;38696:74;-1:-1:-1;38785:23:0;38781:37;;38817:1;38810:8;;;;;;38781:37;-1:-1:-1;;;;;38829:26:0;;;;;;:17;:26;;;;;:43;;;38883:59;38907:4;38847:7;38923:18;38883:15;:59::i;:::-;38958:83;;;-1:-1:-1;;;;;38958:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39059:18;38467:618;-1:-1:-1;;;;38467:618:0:o;42918:258::-;42983:50;43069:37;43086:19;;;;;;;;;;;;;;;;;43069:16;:37::i;:::-;42983:124;;43118:17;-1:-1:-1;;;;;43118:41:0;;43160:7;43118:50;;;;;;;;;;;;;-1:-1:-1;;;;;43118:50:0;-1:-1:-1;;;;;43118:50:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43118:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43118:50:0;;;;42918:258;;:::o;37005:121::-;37073:7;37100:18;37110:7;37100:9;:18::i;25831:103::-;25900:26;25910:7;25919:6;25900:9;:26::i;40775:541::-;40908:7;40943:16;40988:14;41017:19;41013:33;;41045:1;41038:8;;;;;;41013:33;41071:14;41064:4;:21;41057:207;;;41102:10;41115:76;41159:13;41173:4;41159:19;;;;;;;;;;;;;;;;;;:31;;;41115:39;41127:13;41141:4;41127:19;;;;;;;;;;;;;;;;;;;;;:26;41115:7;;:39;:11;:39;:::i;:::-;:43;:76;:43;:76;:::i;:::-;41102:89;-1:-1:-1;41216:15:0;:7;41102:89;41216:15;:11;:15;:::i;:::-;41246:6;;;;;41206:25;-1:-1:-1;41057:207:0;;-1:-1:-1;41057:207:0;;41281:27;:7;41293:14;41281:27;:11;:27;:::i;:::-;41274:34;40775:541;-1:-1:-1;;;;;;40775:541:0:o;26954:145::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;27020:6;:15;;;;-1:-1:-1;;;;;27020:15:0;;;;;;;;;;;27051:40;;27084:6;;;-1:-1:-1;;27051:40:0;;-1:-1:-1;;27051:40:0;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;26954:145;;:::o;30420:115::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;30485:17;:15;:17::i;:::-;30513:14;30521:5;30513:7;:14::i;24739:103::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;24805:29;24827:6;24805:21;:29::i;24006:122::-;24063:21;:8;24076:7;24063:21;:12;:21;:::i;:::-;24100:20;;-1:-1:-1;;;;;24100:20:0;;;;;;;;24006:122;:::o;24136:130::-;24196:24;:8;24212:7;24196:24;:15;:24;:::i;:::-;24236:22;;-1:-1:-1;;;;;24236:22:0;;;;;;;;24136:130;:::o;22849:203::-;22921:4;-1:-1:-1;;;;;22946:21:0;;22938:68;;;;-1:-1:-1;;;22938:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23024:20:0;:11;:20;;;;;;;;;;;;;;;22849:203::o;39240:689::-;39291:26;39320:25;:23;:25::i;:::-;39375:116;;;;;;;;;39410:23;;;39375:116;;;;;;;;39356:13;27:10:-1;;39:1;23:18;;45:23;;-1:-1;39356:136:0;;;;;;;;;;;;;;;;;;;;;;;;39530:23;39375:116;;-1:-1:-1;39503:51:0;;39523:4;;39503:11;:51::i;:::-;39670:23;;39650:64;;;;;;;;;;;;;;;;;;;;;;;;39798:1;39772:23;:27;39838:83;31790:8;39838:46;39846:3;:37;;;39838:7;:46::i;:::-;:50;:83;:50;:83;:::i;:::-;39810:25;:111;-1:-1:-1;39240:689:0:o;28503:229::-;-1:-1:-1;;;;;28577:22:0;;28569:73;;;;-1:-1:-1;;;28569:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28679:6;;28658:38;;-1:-1:-1;;;;;28658:38:0;;;;28679:6;;28658:38;;28679:6;;28658:38;28707:6;:17;;;;-1:-1:-1;;;;;28707:17:0;;;;;;;;;;28503:229::o;40479:288::-;40617:13;:20;40572:7;;40599:38;;;40592:46;;;;-1:-1:-1;;;;;40684:26:0;;;;;;:17;:26;;;;;;40656:103;;40712:14;40728:30;40702:7;40728:21;:30::i;:::-;40656:27;:103::i;37514:333::-;37604:28;:26;:28::i;:::-;37643:26;37662:6;37643:18;:26::i;:::-;;37680:29;37699:9;37680:18;:29::i;:::-;;37720:42;37736:6;37744:9;37755:6;37720:15;:42::i;:::-;37773:26;37792:6;37773:18;:26::i;:::-;37810:29;37829:9;37810:18;:29::i;38313:146::-;38375:7;38402:49;38421:7;38430:13;:20;;;;38402:18;:49::i;17975:308::-;-1:-1:-1;;;;;18051:21:0;;18043:65;;;;;-1:-1:-1;;;18043:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18136:12;;:24;;18153:6;18136:24;:16;:24;:::i;:::-;18121:12;:39;-1:-1:-1;;;;;18192:18:0;;;;;;:9;:18;;;;;;:30;;18215:6;18192:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18171:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18238:37;;;;;;;18171:18;;;;18238:37;;;;;;;;;;17975:308;;:::o;18615:348::-;-1:-1:-1;;;;;18691:21:0;;18683:67;;;;-1:-1:-1;;;18683:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18784:68;18807:6;18784:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18784:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;18763:18:0;;;;;;:9;:18;;;;;:89;18878:12;;:24;;18895:6;18878:24;:16;:24;:::i;:::-;18863:12;:39;18918:37;;;;;;;;18944:1;;-1:-1:-1;;;;;18918:37:0;;;;;;;;;;;;18615:348;;:::o;41418:155::-;41474:4;41525:1;41499:23;;:27;41498:67;;;;-1:-1:-1;;41539:25:0;;41532:3;:32;;;41418:155::o;17223:471::-;-1:-1:-1;;;;;17321:20:0;;17313:70;;;;-1:-1:-1;;;17313:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17402:23:0;;17394:71;;;;-1:-1:-1;;;17394:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17498;17520:6;17498:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17498:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;17478:17:0;;;;;;;:9;:17;;;;;;:91;;;;17603:20;;;;;;;:32;;17628:6;17603:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;17580:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17651:35;;;;;;;17580:20;;17651:35;;;;;;;;;;;;;17223:471;;;:::o;19927:232::-;19999:22;20005:7;20014:6;19999:5;:22::i;:::-;20032:119;20041:7;20050:12;:10;:12::i;:::-;20064:86;20103:6;20064:86;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20064:20:0;;;;;;:11;:20;;;;;;20085:12;:10;:12::i;8603:471::-;8661:7;8906:6;8902:47;;-1:-1:-1;8936:1:0;8929:8;;8902:47;8973:5;;;8977:1;8973;:5;:1;8997:5;;;;;:10;8989:56;;;;-1:-1:-1;;;8989:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9542:132;9600:7;9627:39;9631:1;9634;9627:39;;;;;;;;;;;;;;;;;:3;:39::i;23409:141::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;23480:16;23489:6;23480:8;:16::i;:::-;23475:68;;23513:18;23524:6;23513:10;:18::i;22313:178::-;22391:18;22395:4;22401:7;22391:3;:18::i;:::-;22390:19;22382:63;;;;;-1:-1:-1;;;22382:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22456:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;22456:27:0;22479:4;22456:27;;;22313:178::o;22571:183::-;22651:18;22655:4;22661:7;22651:3;:18::i;:::-;22643:64;;;;-1:-1:-1;;;22643:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22718:20:0;22741:5;22718:20;;;;;;;;;;;:28;;-1:-1:-1;;22718:28:0;;;22571:183::o;10204:345::-;10290:7;10392:12;10385:5;10377:28;;;;-1:-1:-1;;;10377:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;10377:28:0;;10416:9;10432:1;10428;:5;;;;;;;10204:345;-1:-1:-1;;;;;10204:345:0:o;43608:245::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43608:245:0;;;-1:-1:-1;43608:245:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://c41f97f40e9ee70d890a6c8e2ad5b9b2533cf8017ff3f7768b4434ac43e7c68a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.