Overview
POL Balance
0 POL
POL Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
DollarV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-07-06 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @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; } /* * @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 ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // 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. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @dev 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 {ERC20MinterPauser}. * * 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 ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This 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 virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[44] private __gap; } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } interface IOracle { function update() external; function consult(address _token, uint256 _amountIn) external view returns (uint144 amountOut); function twap(address _token, uint256 _amountIn) external view returns (uint144 _amountOut); } contract DollarV2 is ERC20UpgradeSafe, OwnableUpgradeSafe, ReentrancyGuard { uint256 public cap; mapping(address => bool) public minter; address public dollarOracle; uint256 public underPegTaxRate; // when dollar is under peg uint256 public underPegTaxMax; uint256 public boardroomRate; address public boardroomFund; uint256 public jackpotRate; address public jackpotFund; uint256 public dollarPriceOne; uint256 private _totalBurned; uint256 private _totalJackpotAdded; uint256 private _totalBoardroomAdded; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedToFee; /* =================== Added variables (need to keep orders for proxy to work) =================== */ // ... /* ========== EVENTS ========== */ event MinterUpdate(address indexed account, bool isMinter); event JackpotAdded(address indexed account, address taxFund, uint256 amount); event BoardroomAdded(address indexed account, address taxFund, uint256 amount); event Burn(uint256 amount); event DeflationTransfer(address indexed from, address indexed to, uint256 value, uint256 sentAmount); /* ========== Modifiers =============== */ modifier onlyMinter() { require(minter[msg.sender], "!minter"); _; } /* ========== GOVERNANCE ========== */ function initialize(address _boardroomFund, address _jackpotFund) public initializer { __ERC20_init("SafeDollar.Fi Dollar 2.0", "SDO"); OwnableUpgradeSafe.__Ownable_init(); boardroomFund = _boardroomFund; jackpotFund = _jackpotFund; underPegTaxRate = 2000; // taxFee = (1 - price) / 5 underPegTaxMax = 1000; // 10% boardroomRate = 50; // 1% jackpotRate = 50; // 1% dollarPriceOne = 1 ether; // $1 _isExcludedFromFee[_msgSender()] = true; _isExcludedToFee[_msgSender()] = true; _isExcludedFromFee[_boardroomFund] = true; _isExcludedToFee[_boardroomFund] = true; _isExcludedFromFee[_jackpotFund] = true; _isExcludedToFee[_jackpotFund] = true; cap = 100000000 ether; _mint(_msgSender(), 500000 ether); // to compensate old SDO holders and SDO LPs } function setCap(uint256 _newCap) external onlyOwner { require(totalSupply() <= _newCap, "exceeds current supply"); cap = _newCap; } function setMinter(address _account, bool _isMinter) external onlyOwner { require(_account != address(0), "zero"); minter[_account] = _isMinter; emit MinterUpdate(_account, _isMinter); } function setDollarOracle(address _dollarOracle) external onlyOwner { dollarOracle = _dollarOracle; } function setDollarPricePeg(uint256 _dollarPriceOne) external onlyOwner { require(_dollarPriceOne >= 0.9 ether && _dollarPriceOne <= 1 ether, "out range"); // [$0.9, $1.0] dollarPriceOne = _dollarPriceOne; } function setUnderPegTax(uint256 _underPegTaxRate, uint256 _underPegTaxMax) external onlyOwner { require(_underPegTaxRate <= 5000, "too high"); // <= 50% require(_underPegTaxMax <= 2000, "too high"); // <= 20% underPegTaxRate = _underPegTaxRate; _underPegTaxMax = _underPegTaxMax; } function setBoardroomRate(uint256 _boardroomRate) external onlyOwner { require(_boardroomRate <= 1000, "too high"); // <= 10% boardroomRate = _boardroomRate; } function setBoardroomFund(address _boardroomFund) external onlyOwner { boardroomFund = _boardroomFund; } function setJackpotRate(uint256 _jackpotRate) external onlyOwner { require(_jackpotRate <= 1000, "too high"); // <= 10% jackpotRate = _jackpotRate; } function setJackpotFund(address _jackpotFund) external onlyOwner { jackpotFund = _jackpotFund; } function setExcludeFromFee(address _account, bool _status) external onlyOwner { _isExcludedFromFee[_account] = _status; } function setExcludeToFee(address _account, bool _status) external onlyOwner { _isExcludedToFee[_account] = _status; } function setExcludeBothDirectionsFee(address _account, bool _status) external onlyOwner { _isExcludedFromFee[_account] = _status; _isExcludedToFee[_account] = _status; } /* ========== VIEW FUNCTIONS ========== */ function totalBurned() external view returns (uint256) { return _totalBurned; } function totalJackpotAdded() external view returns (uint256) { return _totalJackpotAdded; } function totalBoardroomAdded() external view returns (uint256) { return _totalBoardroomAdded; } function getDollarPrice() public view returns (uint256) { if (dollarOracle == address(0)) return dollarPriceOne; return uint256(IOracle(dollarOracle).consult(address(this), 1e18)); } function getDollarUpdatedPrice() public view returns (uint256) { if (dollarOracle == address(0)) return dollarPriceOne; return uint256(IOracle(dollarOracle).twap(address(this), 1e18)); } function isExcludedFromFee(address _account) external view returns (bool) { return _isExcludedFromFee[_account]; } function isExcludedToFee(address _account) external view returns (bool) { return _isExcludedToFee[_account]; } /* ========== MUTATIVE FUNCTIONS ========== */ function mint(address _recipient, uint256 _amount) external onlyMinter returns (bool) { uint256 balanceBefore = balanceOf(_recipient); _mint(_recipient, _amount); return balanceOf(_recipient) > balanceBefore; } function burn(uint256 _amount) external { _burn(msg.sender, _amount); } function burnFrom(address _account, uint256 _amount) external { _approve(_account, _msgSender(), allowance(_account, _msgSender()).sub(_amount, "ERC20: burn amount exceeds allowance")); _burn(_account, _amount); } /* ========== OVERRIDE STANDARD FUNCTIONS ========== */ /** * @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 override { super._burn(_account, _amount); _totalBurned = _totalBurned.add(_amount); emit Burn(_amount); } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer( address _from, address _to, uint256 _amount ) internal override { super._beforeTokenTransfer(_from, _to, _amount); if (_from == address(0)) { // When minting tokens require(totalSupply().add(_amount) <= cap, "cap exceeded"); } if (_to == address(0)) { // When burning tokens cap = cap.sub(_amount, "burn amount exceeds cap"); } } function _transfer( address _sender, address _recipient, uint256 _amount ) internal override { require(_sender != address(0), "ERC20: transfer from the zero address"); require(_recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(_sender, _recipient, _amount); uint256 _sentAmount = _amount; if (!_isExcludedFromFee[_sender] && !_isExcludedToFee[_recipient]) { uint256 _dollarPrice = getDollarUpdatedPrice(); if (_dollarPrice < dollarPriceOne) { { uint256 _jackpotRate = jackpotRate; if (_jackpotRate > 0) { uint256 _jackpotAmount = _amount.mul(_jackpotRate).div(10000); address _jackpotFund = jackpotFund; _sentAmount = _sentAmount.sub(_jackpotAmount); _totalJackpotAdded = _totalJackpotAdded.add(_jackpotAmount); super._transfer(_sender, _jackpotFund, _jackpotAmount); emit JackpotAdded(_sender, _jackpotFund, _jackpotAmount); } } { uint256 _boardroomRate = boardroomRate; if (_boardroomRate > 0) { uint256 _boardroomAmount = _amount.mul(_boardroomRate).div(10000); address _boardroomFund = boardroomFund; _sentAmount = _sentAmount.sub(_boardroomAmount); _totalBoardroomAdded = _totalBoardroomAdded.add(_boardroomAmount); super._transfer(_sender, _boardroomFund, _boardroomAmount); emit BoardroomAdded(_sender, _boardroomFund, _boardroomAmount); } } { uint256 _burnAmount = 0; uint256 _underPegTaxRate = underPegTaxRate; if (_underPegTaxRate > 0) { uint256 _burnRate = dollarPriceOne.sub(_dollarPrice).mul(_underPegTaxRate).div(dollarPriceOne); uint256 _underPegTaxMax = underPegTaxMax; if (_burnRate > _underPegTaxMax) { _burnRate = _underPegTaxMax; } _burnAmount = _amount.mul(_burnRate).div(10000); _sentAmount = _sentAmount.sub(_burnAmount); _burn(_sender, _burnAmount); } } } } super._transfer(_sender, _recipient, _sentAmount); emit DeflationTransfer(_sender, _recipient, _amount, _sentAmount); } /* ========== EMERGENCY ========== */ function rescueStuckErc20(address _token) external onlyOwner { IERC20(_token).transfer(owner(), IERC20(_token).balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"taxFund","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BoardroomAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","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"},{"indexed":false,"internalType":"uint256","name":"sentAmount","type":"uint256"}],"name":"DeflationTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"taxFund","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JackpotAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isMinter","type":"bool"}],"name":"MinterUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardroomFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardroomRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dollarOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dollarPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDollarPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDollarUpdatedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boardroomFund","type":"address"},{"internalType":"address","name":"_jackpotFund","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExcludedToFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueStuckErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boardroomFund","type":"address"}],"name":"setBoardroomFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boardroomRate","type":"uint256"}],"name":"setBoardroomRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dollarOracle","type":"address"}],"name":"setDollarOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dollarPriceOne","type":"uint256"}],"name":"setDollarPricePeg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setExcludeBothDirectionsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setExcludeToFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_jackpotFund","type":"address"}],"name":"setJackpotFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_jackpotRate","type":"uint256"}],"name":"setJackpotRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isMinter","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_underPegTaxRate","type":"uint256"},{"internalType":"uint256","name":"_underPegTaxMax","type":"uint256"}],"name":"setUnderPegTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBoardroomAdded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalJackpotAdded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underPegTaxMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underPegTaxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600160c955613b87806100256000396000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c8063686166c0116101a7578063af9549e0116100ee578063dd62ed3e11610097578063f05b4c4011610071578063f05b4c40146109bd578063f17fdc40146109e0578063f2fde38b146109e857610320565b8063dd62ed3e1461095d578063e1f095aa14610998578063e2da16f1146109a057610320565b8063c9ca8eab116100c8578063c9ca8eab14610912578063cf456ae71461091a578063d89135cd1461095557610320565b8063af9549e0146108b2578063c600e041146108ed578063c81982e81461090a57610320565b80638da5cb5b1161015057806395d89b411161012a57806395d89b4114610838578063a457c2d714610840578063a9059cbb1461087957610320565b80638da5cb5b146107f55780639480c82c146107fd57806394bdf63e1461083057610320565b806379cc67901161018157806379cc67901461075657806381ca7eba1461078f578063844f30fb146107c257610320565b8063686166c0146106e857806370a082311461071b578063715018a61461074e57610320565b8063395093511161026b57806347786d371161021457806351305eef116101ee57806351305eef146106725780635342acb41461067a5780636409de78146106ad57610320565b806347786d3714610612578063485cc9551461062f5780634d3453c21461066a57610320565b806340c10f191161024557806340c10f19146105b457806342966c68146105ed578063451111b71461060a57610320565b806339509351146105405780633ca17b33146105795780633dd08c381461058157610320565b80631bc59e58116102cd57806327d8ef27116102a757806327d8ef27146104fd578063313ce5671461051a578063355274ea1461053857610320565b80631bc59e58146104aa57806322ea66b3146104b257806323b872dd146104ba57610320565b8063136d19a6116102fe578063136d19a61461042c57806318160ddd1461045d5780631a5e2e541461047757610320565b8063023176011461032557806306fdde0314610362578063095ea7b3146103df575b600080fd5b6103606004803603604081101561033b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a1b565b005b61036a610b15565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a457818101518382015260200161038c565b50505050905090810190601f1680156103d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610418600480360360408110156103f557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610bca565b604080519115158252519081900360200190f35b610434610be8565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610465610c04565b60408051918252519081900360200190f35b6103606004803603602081101561048d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c0a565b610465610ce2565b610465610ce8565b610418600480360360608110156104d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610cee565b6103606004803603602081101561051357600080fd5b5035610d8f565b610522610eb0565b6040805160ff9092168252519081900360200190f35b610465610eb9565b6104186004803603604081101561055657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ebf565b610465610f1a565b6104186004803603602081101561059757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610f20565b610418600480360360408110156105ca57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f35565b6103606004803603602081101561060357600080fd5b5035610fdd565b610434610fea565b6103606004803603602081101561062857600080fd5b5035611006565b6103606004803603604081101561064557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611112565b610465611455565b61046561145b565b6104186004803603602081101561069057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611461565b610360600480360360408110156106c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561148c565b610360600480360360208110156106fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611573565b6104656004803603602081101561073157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661164b565b610360611673565b6103606004803603604081101561076c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611773565b610360600480360360208110156107a557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117c2565b610418600480360360208110156107d857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119ad565b6104346119d8565b6103606004803603602081101561081357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119f4565b610465611acc565b61036a611ad2565b6104186004803603604081101561085657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b51565b6104186004803603604081101561088f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611bc6565b610360600480360360408110156108c857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611bda565b6103606004803603602081101561090357600080fd5b5035611cc1565b610465611dc8565b610465611eb5565b6103606004803603604081101561093057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611ebb565b61046561205b565b6104656004803603604081101561097357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612061565b610465612099565b610360600480360360208110156109b657600080fd5b5035612141565b610360600480360360408110156109d357600080fd5b5080359060200135612248565b6104346123c1565b610360600480360360208110156109fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166123dd565b610a23612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610aac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff909116600090815260d76020908152604080832080549415157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00958616811790915560d89092529091208054909216179055565b60688054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b505050505090505b90565b6000610bde610bd7612568565b848461256c565b5060015b92915050565b60d05473ffffffffffffffffffffffffffffffffffffffff1681565b60675490565b610c12612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610c9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60cf5481565b60cd5481565b6000610cfb8484846126b3565b610d8584610d07612568565b610d8085604051806060016040528060288152602001613a496028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260666020526040812090610d52612568565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190612a6b565b61256c565b5060019392505050565b610d97612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610e2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b670c7d713b49da00008110158015610e405750670de0b6b3a76400008111155b610eab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6f75742072616e67650000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60d355565b606a5460ff1690565b60ca5481565b6000610bde610ecc612568565b84610d808560666000610edd612568565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490612b1c565b60ce5481565b60cb6020526000908152604090205460ff1681565b33600090815260cb602052604081205460ff16610fb357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d696e74657200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610fbe8461164b565b9050610fca8484612b97565b80610fd48561164b565b11949350505050565b610fe73382612cca565b50565b60cc5473ffffffffffffffffffffffffffffffffffffffff1681565b61100e612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461109757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b806110a0610c04565b111561110d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f657863656564732063757272656e7420737570706c7900000000000000000000604482015290519081900360640190fd5b60ca55565b600054610100900460ff168061112b575061112b612d1b565b80611139575060005460ff16155b61118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff161580156111f457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6112686040518060400160405280601881526020017f53616665446f6c6c61722e466920446f6c6c617220322e3000000000000000008152506040518060400160405280600381526020017f53444f0000000000000000000000000000000000000000000000000000000000815250612d21565b611270612e15565b60d0805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560d28054928516929091169190911790556107d060cd556103e860ce55603260cf81905560d155670de0b6b3a764000060d355600160d760006112f5612568565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160d86000611354612568565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812080549515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00968716179055878216815260d780855283822080548716600190811790915560d880875285842080548916831790559389168352908552838220805487168217905591909352912080549092161790556a52b7d2dcc80cd2e400000060ca55611421611411612568565b6969e10de76676d0800000612b97565b801561145057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b60d55490565b60d15481565b73ffffffffffffffffffffffffffffffffffffffff16600090815260d7602052604090205460ff1690565b611494612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461151d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260d86020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b61157b612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461160457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60d280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526065602052604090205490565b61167b612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461170457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6117b48261177f612568565b610d8084604051806060016040528060248152602001613a9f602491396117ad886117a8612568565b612061565b9190612a6b565b6117be8282612cca565b5050565b6117ca612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461185357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118776119d8565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b1580156118e357600080fd5b505afa1580156118f7573d6000803e3d6000fd5b505050506040513d602081101561190d57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d602081101561145057600080fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260d8602052604090205460ff1690565b60975473ffffffffffffffffffffffffffffffffffffffff1690565b6119fc612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611a8557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60d080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60d35481565b60698054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b6000610bde611b5e612568565b84610d8085604051806060016040528060258152602001613b2d6025913960666000611b88612568565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190612a6b565b6000610bde611bd3612568565b84846126b3565b611be2612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611c6b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260d76020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611cc9612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611d5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e8811115611dc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60d155565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff16611df1575060d354610bc7565b60cc54604080517f6808a128000000000000000000000000000000000000000000000000000000008152306004820152670de0b6b3a76400006024820152905173ffffffffffffffffffffffffffffffffffffffff90921691636808a12891604480820192602092909190829003018186803b158015611e7057600080fd5b505afa158015611e84573d6000803e3d6000fd5b505050506040513d6020811015611e9a57600080fd5b505171ffffffffffffffffffffffffffffffffffff16905090565b60d65490565b611ec3612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611f4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216611fd057604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260cb602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517f279360e293bcf8120adefa5fb6f669c774022ed25c09e099edd1818d155c57b69281900390910190a25050565b60d45490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260666020908152604080832093909416825291909152205490565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff166120c2575060d354610bc7565b60cc54604080517f3ddac953000000000000000000000000000000000000000000000000000000008152306004820152670de0b6b3a76400006024820152905173ffffffffffffffffffffffffffffffffffffffff90921691633ddac95391604480820192602092909190829003018186803b158015611e7057600080fd5b612149612568565b60975473ffffffffffffffffffffffffffffffffffffffff9081169116146121d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e881111561224357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60cf55565b612250612568565b60975473ffffffffffffffffffffffffffffffffffffffff9081169116146122d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61138882111561234a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6107d08111156123bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5060cd55565b60d25473ffffffffffffffffffffffffffffffffffffffff1681565b6123e5612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461246e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139ba6026913960400191505060405180910390fd5b60975460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166125d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613b096024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612644576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806139e06022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661271f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613ae46025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661278b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139756023913960400191505060405180910390fd5b612796838383612f38565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260d76020526040902054819060ff161580156127f4575073ffffffffffffffffffffffffffffffffffffffff8316600090815260d8602052604090205460ff16155b156129ed576000612803611dc8565b905060d3548110156129eb5760d15480156128ca57600061283061271061282a8785613045565b906130b8565b60d25490915073ffffffffffffffffffffffffffffffffffffffff1661285685836130fa565b60d5549095506128669083612b1c565b60d55561287488828461313c565b6040805173ffffffffffffffffffffffffffffffffffffffff8381168252602082018590528251908b16927ff225eba4c7635c5a6bd37f352794c4fb25560ba3861891961ae28e14aa0a42e8928290030190a250505b5060cf5480156129805760006128e661271061282a8785613045565b60d05490915073ffffffffffffffffffffffffffffffffffffffff1661290c85836130fa565b60d65490955061291c9083612b1c565b60d65561292a88828461313c565b6040805173ffffffffffffffffffffffffffffffffffffffff8381168252602082018590528251908b16927f4d8d1a935954c2ede82f42f96e14163b8a15b0d0e393748f6fe21accc056b2ca928290030190a250505b5060cd5460009080156129e85760d3546000906129ab9061282a846129a583896130fa565b90613045565b60ce54909150808211156129bd578091505b6129cd61271061282a8985613045565b93506129d986856130fa565b95506129e58985612cca565b50505b50505b505b6129f884848361313c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fa4d2b6e9e760f9a3e8630da5d1c673668060412d09c5df7cdfebbabef3a1d1168484604051808381526020018281526020019250505060405180910390a350505050565b60008184841115612b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ad9578181015183820152602001612ac1565b50505050905090810190601f168015612b065780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612b9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8216612c1957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b612c2560008383612f38565b606754612c329082612b1c565b60675573ffffffffffffffffffffffffffffffffffffffff8216600090815260656020526040902054612c659082612b1c565b73ffffffffffffffffffffffffffffffffffffffff831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b612cd4828261330e565b60d454612ce19082612b1c565b60d4556040805182815290517fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb9181900360200190a15050565b303b1590565b600054610100900460ff1680612d3a5750612d3a612d1b565b80612d48575060005460ff16155b612d9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff16158015612e0357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b612e0b613458565b611421838361356a565b600054610100900460ff1680612e2e5750612e2e612d1b565b80612e3c575060005460ff16155b612e91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff16158015612ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b612eff613458565b612f076136d2565b8015610fe757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b612f43838383611450565b73ffffffffffffffffffffffffffffffffffffffff8316612fe05760ca54612f7382612f6d610c04565b90612b1c565b1115612fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6361702065786365656465640000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166114505760408051808201909152601781527f6275726e20616d6f756e74206578636565647320636170000000000000000000602082015260ca5461303d918390612a6b565b60ca55505050565b60008261305457506000610be2565b8282028284828161306157fe5b0414612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613a286021913960400191505060405180910390fd5b6000612b9083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613862565b6000612b9083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a6b565b73ffffffffffffffffffffffffffffffffffffffff83166131a8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613ae46025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613214576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139756023913960400191505060405180910390fd5b61321f838383612f38565b61326981604051806060016040528060268152602001613a026026913973ffffffffffffffffffffffffffffffffffffffff86166000908152606560205260409020549190612a6b565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526065602052604080822093909355908416815220546132a59082612b1c565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b73ffffffffffffffffffffffffffffffffffffffff821661337a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ac36021913960400191505060405180910390fd5b61338682600083612f38565b6133d0816040518060600160405280602281526020016139986022913973ffffffffffffffffffffffffffffffffffffffff85166000908152606560205260409020549190612a6b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526065602052604090205560675461340390826130fa565b60675560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600054610100900460ff16806134715750613471612d1b565b8061347f575060005460ff16155b6134d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff16158015612f0757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790558015610fe757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff16806135835750613583612d1b565b80613591575060005460ff16155b6135e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff1615801561364c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b825161365f9060689060208601906138e1565b5081516136739060699060208501906138e1565b50606a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166012179055801561145057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff16806136eb57506136eb612d1b565b806136f9575060005460ff16155b61374e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff161580156137b457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b60006137be612568565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610fe757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600081836138cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ad9578181015183820152602001612ac1565b5060008385816138d757fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061392257805160ff191683800117855561394f565b8280016001018555821561394f579182015b8281111561394f578251825591602001919060010190613934565b5061395b92915061395f565b5090565b5b8082111561395b576000815560010161396056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e932451cecb3aa34affa7bd78ca51458a250ae0a4eb4c33707389fdbda7bbfd364736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103205760003560e01c8063686166c0116101a7578063af9549e0116100ee578063dd62ed3e11610097578063f05b4c4011610071578063f05b4c40146109bd578063f17fdc40146109e0578063f2fde38b146109e857610320565b8063dd62ed3e1461095d578063e1f095aa14610998578063e2da16f1146109a057610320565b8063c9ca8eab116100c8578063c9ca8eab14610912578063cf456ae71461091a578063d89135cd1461095557610320565b8063af9549e0146108b2578063c600e041146108ed578063c81982e81461090a57610320565b80638da5cb5b1161015057806395d89b411161012a57806395d89b4114610838578063a457c2d714610840578063a9059cbb1461087957610320565b80638da5cb5b146107f55780639480c82c146107fd57806394bdf63e1461083057610320565b806379cc67901161018157806379cc67901461075657806381ca7eba1461078f578063844f30fb146107c257610320565b8063686166c0146106e857806370a082311461071b578063715018a61461074e57610320565b8063395093511161026b57806347786d371161021457806351305eef116101ee57806351305eef146106725780635342acb41461067a5780636409de78146106ad57610320565b806347786d3714610612578063485cc9551461062f5780634d3453c21461066a57610320565b806340c10f191161024557806340c10f19146105b457806342966c68146105ed578063451111b71461060a57610320565b806339509351146105405780633ca17b33146105795780633dd08c381461058157610320565b80631bc59e58116102cd57806327d8ef27116102a757806327d8ef27146104fd578063313ce5671461051a578063355274ea1461053857610320565b80631bc59e58146104aa57806322ea66b3146104b257806323b872dd146104ba57610320565b8063136d19a6116102fe578063136d19a61461042c57806318160ddd1461045d5780631a5e2e541461047757610320565b8063023176011461032557806306fdde0314610362578063095ea7b3146103df575b600080fd5b6103606004803603604081101561033b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a1b565b005b61036a610b15565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a457818101518382015260200161038c565b50505050905090810190601f1680156103d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610418600480360360408110156103f557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610bca565b604080519115158252519081900360200190f35b610434610be8565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610465610c04565b60408051918252519081900360200190f35b6103606004803603602081101561048d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c0a565b610465610ce2565b610465610ce8565b610418600480360360608110156104d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610cee565b6103606004803603602081101561051357600080fd5b5035610d8f565b610522610eb0565b6040805160ff9092168252519081900360200190f35b610465610eb9565b6104186004803603604081101561055657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ebf565b610465610f1a565b6104186004803603602081101561059757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610f20565b610418600480360360408110156105ca57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f35565b6103606004803603602081101561060357600080fd5b5035610fdd565b610434610fea565b6103606004803603602081101561062857600080fd5b5035611006565b6103606004803603604081101561064557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611112565b610465611455565b61046561145b565b6104186004803603602081101561069057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611461565b610360600480360360408110156106c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561148c565b610360600480360360208110156106fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611573565b6104656004803603602081101561073157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661164b565b610360611673565b6103606004803603604081101561076c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611773565b610360600480360360208110156107a557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117c2565b610418600480360360208110156107d857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119ad565b6104346119d8565b6103606004803603602081101561081357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119f4565b610465611acc565b61036a611ad2565b6104186004803603604081101561085657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b51565b6104186004803603604081101561088f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611bc6565b610360600480360360408110156108c857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611bda565b6103606004803603602081101561090357600080fd5b5035611cc1565b610465611dc8565b610465611eb5565b6103606004803603604081101561093057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611ebb565b61046561205b565b6104656004803603604081101561097357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612061565b610465612099565b610360600480360360208110156109b657600080fd5b5035612141565b610360600480360360408110156109d357600080fd5b5080359060200135612248565b6104346123c1565b610360600480360360208110156109fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166123dd565b610a23612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610aac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff909116600090815260d76020908152604080832080549415157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00958616811790915560d89092529091208054909216179055565b60688054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b505050505090505b90565b6000610bde610bd7612568565b848461256c565b5060015b92915050565b60d05473ffffffffffffffffffffffffffffffffffffffff1681565b60675490565b610c12612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610c9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60cf5481565b60cd5481565b6000610cfb8484846126b3565b610d8584610d07612568565b610d8085604051806060016040528060288152602001613a496028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260666020526040812090610d52612568565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190612a6b565b61256c565b5060019392505050565b610d97612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610e2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b670c7d713b49da00008110158015610e405750670de0b6b3a76400008111155b610eab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6f75742072616e67650000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60d355565b606a5460ff1690565b60ca5481565b6000610bde610ecc612568565b84610d808560666000610edd612568565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490612b1c565b60ce5481565b60cb6020526000908152604090205460ff1681565b33600090815260cb602052604081205460ff16610fb357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f216d696e74657200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610fbe8461164b565b9050610fca8484612b97565b80610fd48561164b565b11949350505050565b610fe73382612cca565b50565b60cc5473ffffffffffffffffffffffffffffffffffffffff1681565b61100e612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461109757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b806110a0610c04565b111561110d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f657863656564732063757272656e7420737570706c7900000000000000000000604482015290519081900360640190fd5b60ca55565b600054610100900460ff168061112b575061112b612d1b565b80611139575060005460ff16155b61118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff161580156111f457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6112686040518060400160405280601881526020017f53616665446f6c6c61722e466920446f6c6c617220322e3000000000000000008152506040518060400160405280600381526020017f53444f0000000000000000000000000000000000000000000000000000000000815250612d21565b611270612e15565b60d0805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560d28054928516929091169190911790556107d060cd556103e860ce55603260cf81905560d155670de0b6b3a764000060d355600160d760006112f5612568565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160d86000611354612568565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812080549515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00968716179055878216815260d780855283822080548716600190811790915560d880875285842080548916831790559389168352908552838220805487168217905591909352912080549092161790556a52b7d2dcc80cd2e400000060ca55611421611411612568565b6969e10de76676d0800000612b97565b801561145057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b60d55490565b60d15481565b73ffffffffffffffffffffffffffffffffffffffff16600090815260d7602052604090205460ff1690565b611494612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461151d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260d86020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b61157b612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461160457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60d280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526065602052604090205490565b61167b612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461170457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6117b48261177f612568565b610d8084604051806060016040528060248152602001613a9f602491396117ad886117a8612568565b612061565b9190612a6b565b6117be8282612cca565b5050565b6117ca612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461185357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118776119d8565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b1580156118e357600080fd5b505afa1580156118f7573d6000803e3d6000fd5b505050506040513d602081101561190d57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d602081101561145057600080fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260d8602052604090205460ff1690565b60975473ffffffffffffffffffffffffffffffffffffffff1690565b6119fc612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611a8557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60d080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60d35481565b60698054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b6000610bde611b5e612568565b84610d8085604051806060016040528060258152602001613b2d6025913960666000611b88612568565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190612a6b565b6000610bde611bd3612568565b84846126b3565b611be2612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611c6b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260d76020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611cc9612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611d5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e8811115611dc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60d155565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff16611df1575060d354610bc7565b60cc54604080517f6808a128000000000000000000000000000000000000000000000000000000008152306004820152670de0b6b3a76400006024820152905173ffffffffffffffffffffffffffffffffffffffff90921691636808a12891604480820192602092909190829003018186803b158015611e7057600080fd5b505afa158015611e84573d6000803e3d6000fd5b505050506040513d6020811015611e9a57600080fd5b505171ffffffffffffffffffffffffffffffffffff16905090565b60d65490565b611ec3612568565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614611f4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216611fd057604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260cb602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517f279360e293bcf8120adefa5fb6f669c774022ed25c09e099edd1818d155c57b69281900390910190a25050565b60d45490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260666020908152604080832093909416825291909152205490565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff166120c2575060d354610bc7565b60cc54604080517f3ddac953000000000000000000000000000000000000000000000000000000008152306004820152670de0b6b3a76400006024820152905173ffffffffffffffffffffffffffffffffffffffff90921691633ddac95391604480820192602092909190829003018186803b158015611e7057600080fd5b612149612568565b60975473ffffffffffffffffffffffffffffffffffffffff9081169116146121d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6103e881111561224357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60cf55565b612250612568565b60975473ffffffffffffffffffffffffffffffffffffffff9081169116146122d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61138882111561234a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6107d08111156123bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f746f6f2068696768000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5060cd55565b60d25473ffffffffffffffffffffffffffffffffffffffff1681565b6123e5612568565b60975473ffffffffffffffffffffffffffffffffffffffff90811691161461246e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139ba6026913960400191505060405180910390fd5b60975460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166125d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613b096024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612644576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806139e06022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661271f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613ae46025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661278b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139756023913960400191505060405180910390fd5b612796838383612f38565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260d76020526040902054819060ff161580156127f4575073ffffffffffffffffffffffffffffffffffffffff8316600090815260d8602052604090205460ff16155b156129ed576000612803611dc8565b905060d3548110156129eb5760d15480156128ca57600061283061271061282a8785613045565b906130b8565b60d25490915073ffffffffffffffffffffffffffffffffffffffff1661285685836130fa565b60d5549095506128669083612b1c565b60d55561287488828461313c565b6040805173ffffffffffffffffffffffffffffffffffffffff8381168252602082018590528251908b16927ff225eba4c7635c5a6bd37f352794c4fb25560ba3861891961ae28e14aa0a42e8928290030190a250505b5060cf5480156129805760006128e661271061282a8785613045565b60d05490915073ffffffffffffffffffffffffffffffffffffffff1661290c85836130fa565b60d65490955061291c9083612b1c565b60d65561292a88828461313c565b6040805173ffffffffffffffffffffffffffffffffffffffff8381168252602082018590528251908b16927f4d8d1a935954c2ede82f42f96e14163b8a15b0d0e393748f6fe21accc056b2ca928290030190a250505b5060cd5460009080156129e85760d3546000906129ab9061282a846129a583896130fa565b90613045565b60ce54909150808211156129bd578091505b6129cd61271061282a8985613045565b93506129d986856130fa565b95506129e58985612cca565b50505b50505b505b6129f884848361313c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fa4d2b6e9e760f9a3e8630da5d1c673668060412d09c5df7cdfebbabef3a1d1168484604051808381526020018281526020019250505060405180910390a350505050565b60008184841115612b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ad9578181015183820152602001612ac1565b50505050905090810190601f168015612b065780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612b9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8216612c1957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b612c2560008383612f38565b606754612c329082612b1c565b60675573ffffffffffffffffffffffffffffffffffffffff8216600090815260656020526040902054612c659082612b1c565b73ffffffffffffffffffffffffffffffffffffffff831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b612cd4828261330e565b60d454612ce19082612b1c565b60d4556040805182815290517fb90306ad06b2a6ff86ddc9327db583062895ef6540e62dc50add009db5b356eb9181900360200190a15050565b303b1590565b600054610100900460ff1680612d3a5750612d3a612d1b565b80612d48575060005460ff16155b612d9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff16158015612e0357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b612e0b613458565b611421838361356a565b600054610100900460ff1680612e2e5750612e2e612d1b565b80612e3c575060005460ff16155b612e91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff16158015612ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b612eff613458565b612f076136d2565b8015610fe757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b612f43838383611450565b73ffffffffffffffffffffffffffffffffffffffff8316612fe05760ca54612f7382612f6d610c04565b90612b1c565b1115612fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6361702065786365656465640000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166114505760408051808201909152601781527f6275726e20616d6f756e74206578636565647320636170000000000000000000602082015260ca5461303d918390612a6b565b60ca55505050565b60008261305457506000610be2565b8282028284828161306157fe5b0414612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613a286021913960400191505060405180910390fd5b6000612b9083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613862565b6000612b9083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a6b565b73ffffffffffffffffffffffffffffffffffffffff83166131a8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613ae46025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613214576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139756023913960400191505060405180910390fd5b61321f838383612f38565b61326981604051806060016040528060268152602001613a026026913973ffffffffffffffffffffffffffffffffffffffff86166000908152606560205260409020549190612a6b565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526065602052604080822093909355908416815220546132a59082612b1c565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b73ffffffffffffffffffffffffffffffffffffffff821661337a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ac36021913960400191505060405180910390fd5b61338682600083612f38565b6133d0816040518060600160405280602281526020016139986022913973ffffffffffffffffffffffffffffffffffffffff85166000908152606560205260409020549190612a6b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526065602052604090205560675461340390826130fa565b60675560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600054610100900460ff16806134715750613471612d1b565b8061347f575060005460ff16155b6134d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff16158015612f0757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790558015610fe757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff16806135835750613583612d1b565b80613591575060005460ff16155b6135e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff1615801561364c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b825161365f9060689060208601906138e1565b5081516136739060699060208501906138e1565b50606a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166012179055801561145057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055505050565b600054610100900460ff16806136eb57506136eb612d1b565b806136f9575060005460ff16155b61374e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613a71602e913960400191505060405180910390fd5b600054610100900460ff161580156137b457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b60006137be612568565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610fe757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600081836138cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ad9578181015183820152602001612ac1565b5060008385816138d757fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061392257805160ff191683800117855561394f565b8280016001018555821561394f579182015b8281111561394f578251825591602001919060010190613934565b5061395b92915061395f565b5090565b5b8082111561395b576000815560010161396056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e932451cecb3aa34affa7bd78ca51458a250ae0a4eb4c33707389fdbda7bbfd364736f6c634300060c0033
Deployed Bytecode Sourcemap
34860:10533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39181:192;;;;;;;;;;;;;;;;-1:-1:-1;39181:192:0;;;;;;;;;;;:::i;:::-;;16668:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18774:169;;;;;;;;;;;;;;;;-1:-1:-1;18774:169:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;35186:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17743:100;;;:::i;:::-;;;;;;;;;;;;;;;;37596:114;;;;;;;;;;;;;;;;-1:-1:-1;37596:114:0;;;;:::i;35151:28::-;;;:::i;35050:30::-;;;:::i;19417:355::-;;;;;;;;;;;;;;;;-1:-1:-1;19417:355:0;;;;;;;;;;;;;;;;;;:::i;37718:229::-;;;;;;;;;;;;;;;;-1:-1:-1;37718:229:0;;:::i;17595:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34942:18;;;:::i;20181:218::-;;;;;;;;;;;;;;;;-1:-1:-1;20181:218:0;;;;;;;;;:::i;35115:29::-;;;:::i;34967:38::-;;;;;;;;;;;;;;;;-1:-1:-1;34967:38:0;;;;:::i;40514:242::-;;;;;;;;;;;;;;;;-1:-1:-1;40514:242:0;;;;;;;;;:::i;40764:85::-;;;;;;;;;;;;;;;;-1:-1:-1;40764:85:0;;:::i;35014:27::-;;;:::i;37208:154::-;;;;;;;;;;;;;;;;-1:-1:-1;37208:154:0;;:::i;36291:909::-;;;;;;;;;;;;;;;;-1:-1:-1;36291:909:0;;;;;;;;;;;:::i;39532:105::-;;;:::i;35221:26::-;;;:::i;40192:128::-;;;;;;;;;;;;;;;;-1:-1:-1;40192:128:0;;;;:::i;39042:131::-;;;;;;;;;;;;;;;;-1:-1:-1;39042:131:0;;;;;;;;;;;:::i;38781:110::-;;;;;;;;;;;;;;;;-1:-1:-1;38781:110:0;;;;:::i;17906:119::-;;;;;;;;;;;;;;;;-1:-1:-1;17906:119:0;;;;:::i;34011:148::-;;;:::i;40857:236::-;;;;;;;;;;;;;;;;-1:-1:-1;40857:236:0;;;;;;;;;:::i;45237:153::-;;;;;;;;;;;;;;;;-1:-1:-1;45237:153:0;;;;:::i;40328:124::-;;;;;;;;;;;;;;;;-1:-1:-1;40328:124:0;;;;:::i;33369:79::-;;;:::i;38475:118::-;;;;;;;;;;;;;;;;-1:-1:-1;38475:118:0;;;;:::i;35287:29::-;;;:::i;16870:87::-;;;:::i;20902:269::-;;;;;;;;;;;;;;;;-1:-1:-1;20902:269:0;;;;;;;;;:::i;18238:175::-;;;;;;;;;;;;;;;;-1:-1:-1;18238:175:0;;;;;;;;;:::i;38899:135::-;;;;;;;;;;;;;;;;-1:-1:-1;38899:135:0;;;;;;;;;;;:::i;38601:172::-;;;;;;;;;;;;;;;;-1:-1:-1;38601:172:0;;:::i;39975:209::-;;;:::i;39645:109::-;;;:::i;37370:218::-;;;;;;;;;;;;;;;;-1:-1:-1;37370:218:0;;;;;;;;;;;:::i;39431:93::-;;;:::i;18476:151::-;;;;;;;;;;;;;;;;-1:-1:-1;18476:151:0;;;;;;;;;;;:::i;39762:205::-;;;:::i;38285:182::-;;;;;;;;;;;;;;;;-1:-1:-1;38285:182:0;;:::i;37955:322::-;;;;;;;;;;;;;;;;-1:-1:-1;37955:322:0;;;;;;;:::i;35254:26::-;;;:::i;34314:244::-;;;;;;;;;;;;;;;;-1:-1:-1;34314:244:0;;;;:::i;39181:192::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39280:28:::1;::::0;;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;:38;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;39329:16:::1;:26:::0;;;;;;:36;;;;::::1;;::::0;;39181:192::o;16668:83::-;16738:5;16731:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16705:13;;16731:12;;16738:5;;16731:12;;16738:5;16731:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16668:83;;:::o;18774:169::-;18857:4;18874:39;18883:12;:10;:12::i;:::-;18897:7;18906:6;18874:8;:39::i;:::-;-1:-1:-1;18931:4:0;18774:169;;;;;:::o;35186:28::-;;;;;;:::o;17743:100::-;17823:12;;17743:100;:::o;37596:114::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37674:12:::1;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;37596:114::o;35151:28::-;;;;:::o;35050:30::-;;;;:::o;19417:355::-;19557:4;19574:36;19584:6;19592:9;19603:6;19574:9;:36::i;:::-;19621:121;19630:6;19638:12;:10;:12::i;:::-;19652:89;19690:6;19652:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;19672:12;:10;:12::i;:::-;19652:33;;;;;;;;;;;;;-1:-1:-1;19652:33:0;;;:89;:37;:89::i;:::-;19621:8;:121::i;:::-;-1:-1:-1;19760:4:0;19417:355;;;;;:::o;37718:229::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37827:9:::1;37808:15;:28;;:58;;;;;37859:7;37840:15;:26;;37808:58;37800:80;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37907:14;:32:::0;37718:229::o;17595:83::-;17661:9;;;;17595:83;:::o;34942:18::-;;;;:::o;20181:218::-;20269:4;20286:83;20295:12;:10;:12::i;:::-;20309:7;20318:50;20357:10;20318:11;:25;20330:12;:10;:12::i;:::-;20318:25;;;;;;;;;;;;;;;;;;-1:-1:-1;20318:25:0;;;:34;;;;;;;;;;;:38;:50::i;35115:29::-;;;;:::o;34967:38::-;;;;;;;;;;;;;;;:::o;40514:242::-;36194:10;40594:4;36187:18;;;:6;:18;;;;;;;;36179:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40611:21:::1;40635;40645:10;40635:9;:21::i;:::-;40611:45;;40667:26;40673:10;40685:7;40667:5;:26::i;:::-;40735:13;40711:21;40721:10;40711:9;:21::i;:::-;:37;::::0;40514:242;-1:-1:-1;;;;40514:242:0:o;40764:85::-;40815:26;40821:10;40833:7;40815:5;:26::i;:::-;40764:85;:::o;35014:27::-;;;;;;:::o;37208:154::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37296:7:::1;37279:13;:11;:13::i;:::-;:24;;37271:59;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37341:3;:13:::0;37208:154::o;36291:909::-;1105:12;;;;;;;;:31;;;1121:15;:13;:15::i;:::-;1105:47;;;-1:-1:-1;1141:11:0;;;;1140:12;1105:47;1097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:19;1239:12;;;;;;1238:13;1262:99;;;;1297:12;:19;;1331:18;1297:19;;;;;;1331:18;1312:4;1331:18;;;1262:99;36387:47:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:47::i;:::-;36445:35;:33;:35::i;:::-;36493:13;:30:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;36534:11:::1;:26:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;36591:4:::1;36573:15;:22:::0;36651:4:::1;36634:14;:21:::0;36689:2:::1;36673:13;:18:::0;;;36708:11:::1;:16:::0;36758:7:::1;36741:14;:24:::0;36493:30;36782:18:::1;36493:13;36801:12;:10;:12::i;:::-;36782:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;36865:4;36832:16;:30;36849:12;:10;:12::i;:::-;36832:30;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;36832:30:0;;;:37;;;::::1;;::::0;;;::::1;;::::0;;36880:34;;::::1;::::0;;:18:::1;:34:::0;;;;;;:41;;;::::1;36832:37:::0;36880:41;;::::1;::::0;;;36932:16:::1;:32:::0;;;;;;:39;;;::::1;::::0;::::1;::::0;;36982:32;;::::1;::::0;;;;;;;;:39;;;::::1;::::0;::::1;::::0;;37032:30;;;;;;:37;;;;::::1;;::::0;;37088:15:::1;37082:3;:21:::0;37114:33:::1;37120:12;:10;:12::i;:::-;37134;37114:5;:33::i;:::-;1391:14:::0;1387:67;;;1437:5;1422:20;;;;;;1387:67;36291:909;;;:::o;39532:105::-;39611:18;;39532:105;:::o;35221:26::-;;;;:::o;40192:128::-;40284:28;;40260:4;40284:28;;;:18;:28;;;;;;;;;40192:128::o;39042:131::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39129:26:::1;::::0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:36;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;39042:131::o;38781:110::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38857:11:::1;:26:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;38781:110::o;17906:119::-;17999:18;;17972:7;17999:18;;;:9;:18;;;;;;;17906:119::o;34011:148::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34102:6:::1;::::0;34081:40:::1;::::0;34118:1:::1;::::0;34081:40:::1;34102:6;::::0;34081:40:::1;::::0;34118:1;;34081:40:::1;34132:6;:19:::0;;;::::1;::::0;;34011:148::o;40857:236::-;40930:120;40939:8;40949:12;:10;:12::i;:::-;40963:86;41001:7;40963:86;;;;;;;;;;;;;;;;;:33;40973:8;40983:12;:10;:12::i;:::-;40963:9;:33::i;:::-;:37;:86;:37;:86::i;40930:120::-;41061:24;41067:8;41077:7;41061:5;:24::i;:::-;40857:236;;:::o;45237:153::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45316:6:::1;45309:23;;;45333:7;:5;:7::i;:::-;45342:39;::::0;;;;;45375:4:::1;45342:39;::::0;::::1;::::0;;;:24:::1;::::0;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45342:39:0;45309:73:::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;45342:39:::1;::::0;45309:73;;;;;;;-1:-1:-1;45309:73:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;40328:124:::0;40418:26;;40394:4;40418:26;;;:16;:26;;;;;;;;;40328:124::o;33369:79::-;33434:6;;;;33369:79;:::o;38475:118::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38555:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;38475:118::o;35287:29::-;;;;:::o;16870:87::-;16942:7;16935:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16909:13;;16935:14;;16942:7;;16935:14;;16942:7;16935:14;;;;;;;;;;;;;;;;;;;;;;;;20902:269;20995:4;21012:129;21021:12;:10;:12::i;:::-;21035:7;21044:96;21083:15;21044:96;;;;;;;;;;;;;;;;;:11;:25;21056:12;:10;:12::i;:::-;21044:25;;;;;;;;;;;;;;;;;;-1:-1:-1;21044:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;18238:175::-;18324:4;18341:42;18351:12;:10;:12::i;:::-;18365:9;18376:6;18341:9;:42::i;38899:135::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38988:28:::1;::::0;;;::::1;;::::0;;;:18:::1;:28;::::0;;;;:38;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;38899:135::o;38601:172::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38701:4:::1;38685:12;:20;;38677:41;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38739:11;:26:::0;38601:172::o;39975:209::-;40053:12;;40029:7;;40053:26;:12;40049:53;;-1:-1:-1;40088:14:0;;40081:21;;40049:53;40136:12;;40128:47;;;;;;40163:4;40128:47;;;;40170:4;40128:47;;;;;;40136:12;;;;;40128:26;;:47;;;;;;;;;;;;;;;40136:12;40128:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40128:47:0;40120:56;;;-1:-1:-1;39975:209:0;:::o;39645:109::-;39726:20;;39645:109;:::o;37370:218::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37461:22:::1;::::0;::::1;37453:39;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37503:16;::::0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;;;;:28;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;37547:33;;;;;;;::::1;::::0;;;;;;;;::::1;37370:218:::0;;:::o;39431:93::-;39504:12;;39431:93;:::o;18476:151::-;18592:18;;;;18565:7;18592:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18476:151::o;39762:205::-;39833:12;;39809:7;;39833:26;:12;39829:53;;-1:-1:-1;39868:14:0;;39861:21;;39829:53;39916:12;;39908:50;;;;;;39946:4;39908:50;;;;39953:4;39908:50;;;;;;39916:12;;;;;39908:29;;:50;;;;;;;;;;;;;;;39916:12;39908:50;;;;;;;;;;38285:182;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38391:4:::1;38373:14;:22;;38365:43;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38429:13;:30:::0;38285:182::o;37955:322::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38088:4:::1;38068:16;:24;;38060:45;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38153:4;38134:15;:23;;38126:44;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;38191:15:0::1;:34:::0;37955:322::o;35254:26::-;;;;;;:::o;34314:244::-;33591:12;:10;:12::i;:::-;33581:6;;:22;:6;;;:22;;;33573:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34403:22:::1;::::0;::::1;34395:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34505:6;::::0;34484:38:::1;::::0;::::1;::::0;;::::1;::::0;34505:6:::1;::::0;34484:38:::1;::::0;34505:6:::1;::::0;34484:38:::1;34533:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;34314:244::o;3128:106::-;3216:10;3128:106;:::o;24083:380::-;24219:19;;;24211:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24298:21;;;24290:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24371:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24423:32;;;;;;;;;;;;;;;;;24083:380;;;:::o;42377:2807::-;42521:21;;;42513:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42603:24;;;42595:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42680:50;42701:7;42710:10;42722:7;42680:20;:50::i;:::-;42788:27;;;42743:19;42788:27;;;:18;:27;;;;;;42765:7;;42788:27;;42787:28;:61;;;;-1:-1:-1;42820:28:0;;;;;;;:16;:28;;;;;;;;42819:29;42787:61;42783:2256;;;42865:20;42888:23;:21;:23::i;:::-;42865:46;;42945:14;;42930:12;:29;42926:2102;;;43026:11;;43064:16;;43060:517;;43109:22;43134:36;43164:5;43134:25;:7;43146:12;43134:11;:25::i;:::-;:29;;:36::i;:::-;43220:11;;43109:61;;-1:-1:-1;43220:11:0;;43272:31;:11;43109:61;43272:15;:31::i;:::-;43351:18;;43258:45;;-1:-1:-1;43351:38:0;;43374:14;43351:22;:38::i;:::-;43330:18;:59;43416:54;43432:7;43441:12;43455:14;43416:15;:54::i;:::-;43502:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43060:517;;;-1:-1:-1;43662:13:0;;43702:18;;43698:545;;43749:24;43776:38;43808:5;43776:27;:7;43788:14;43776:11;:27::i;:38::-;43866:13;;43749:65;;-1:-1:-1;43866:13:0;;43920:33;:11;43749:65;43920:15;:33::i;:::-;44003:20;;43906:47;;-1:-1:-1;44003:42:0;;44028:16;44003:24;:42::i;:::-;43980:20;:65;44072:58;44088:7;44097:14;44113:16;44072:15;:58::i;:::-;44162:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43698:545;;;-1:-1:-1;44376:15:0;;44303:19;;44418:20;;44414:580;;44546:14;;44467:17;;44487:74;;:54;44524:16;44487:32;44546:14;44506:12;44487:18;:32::i;:::-;:36;;:54::i;:74::-;44614:14;;44467:94;;-1:-1:-1;44659:27:0;;;44655:119;;;44731:15;44719:27;;44655:119;44814:33;44841:5;44814:22;:7;44826:9;44814:11;:22::i;:33::-;44800:47;-1:-1:-1;44888:28:0;:11;44800:47;44888:15;:28::i;:::-;44874:42;;44943:27;44949:7;44958:11;44943:5;:27::i;:::-;44414:580;;;42926:2102;;;42783:2256;;45051:49;45067:7;45076:10;45088:11;45051:15;:49::i;:::-;45143:10;45116:60;;45134:7;45116:60;;;45155:7;45164:11;45116:60;;;;;;;;;;;;;;;;;;;;;;;;42377:2807;;;;:::o;7982:226::-;8102:7;8138:12;8130:6;;;;8122:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8174:5:0;;;7982:226::o;7095:181::-;7153:7;7185:5;;;7209:6;;;;7201:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7267:1;7095:181;-1:-1:-1;;;7095:181:0:o;22515:378::-;22599:21;;;22591:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22669:49;22698:1;22702:7;22711:6;22669:20;:49::i;:::-;22746:12;;:24;;22763:6;22746:16;:24::i;:::-;22731:12;:39;22802:18;;;;;;;:9;:18;;;;;;:30;;22825:6;22802:22;:30::i;:::-;22781:18;;;;;;;:9;:18;;;;;;;;:51;;;;22848:37;;;;;;;22781:18;;;;22848:37;;;;;;;;;;22515:378;;:::o;41491:197::-;41570:30;41582:8;41592:7;41570:11;:30::i;:::-;41626:12;;:25;;41643:7;41626:16;:25::i;:::-;41611:12;:40;41667:13;;;;;;;;;;;;;;;;;41491:197;;:::o;1554:568::-;1995:4;2062:17;2107:7;1554:568;:::o;16235:177::-;1105:12;;;;;;;;:31;;;1121:15;:13;:15::i;:::-;1105:47;;;-1:-1:-1;1141:11:0;;;;1140:12;1105:47;1097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:19;1239:12;;;;;;1238:13;1262:99;;;;1297:12;:19;;1331:18;1297:19;;;;;;1331:18;1312:4;1331:18;;;1262:99;16331:26:::1;:24;:26::i;:::-;16368:36;16391:4;16397:6;16368:22;:36::i;32955:129::-:0;1105:12;;;;;;;;:31;;;1121:15;:13;:15::i;:::-;1105:47;;;-1:-1:-1;1141:11:0;;;;1140:12;1105:47;1097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:19;1239:12;;;;;;1238:13;1262:99;;;;1297:12;:19;;1331:18;1297:19;;;;;;1331:18;1312:4;1331:18;;;1262:99;33013:26:::1;:24;:26::i;:::-;33050;:24;:26::i;:::-;1391:14:::0;1387:67;;;1437:5;1422:20;;;;;;32955:129;:::o;41875:494::-;42013:47;42040:5;42047:3;42052:7;42013:26;:47::i;:::-;42075:19;;;42071:146;;42185:3;;42155:26;42173:7;42155:13;:11;:13::i;:::-;:17;;:26::i;:::-;:33;;42147:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42231:17;;;42227:135;;42307:43;;;;;;;;;;;;;;;;;:3;;:43;;42315:7;;42307;:43::i;:::-;42301:3;:49;41875:494;;;:::o;8459:471::-;8517:7;8762:6;8758:47;;-1:-1:-1;8792:1:0;8785:8;;8758:47;8829:5;;;8833:1;8829;:5;:1;8853:5;;;;;:10;8845:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9398:132;9456:7;9483:39;9487:1;9490;9483:39;;;;;;;;;;;;;;;;;:3;:39::i;7551:136::-;7609:7;7636:43;7640:1;7643;7636:43;;;;;;;;;;;;;;;;;:3;:43::i;21661:573::-;21801:20;;;21793:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21882:23;;;21874:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21958:47;21979:6;21987:9;21998:6;21958:20;:47::i;:::-;22038:71;22060:6;22038:71;;;;;;;;;;;;;;;;;:17;;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;22018:17;;;;;;;;:9;:17;;;;;;:91;;;;22143:20;;;;;;;:32;;22168:6;22143:24;:32::i;:::-;22120:20;;;;;;;;:9;:20;;;;;;;;;:55;;;;22191:35;;;;;;;22120:20;;22191:35;;;;;;;;;;;;;21661:573;;;:::o;23225:418::-;23309:21;;;23301:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23381:49;23402:7;23419:1;23423:6;23381:20;:49::i;:::-;23464:68;23487:6;23464:68;;;;;;;;;;;;;;;;;:18;;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;23443:18;;;;;;;:9;:18;;;;;:89;23558:12;;:24;;23575:6;23558:16;:24::i;:::-;23543:12;:39;23598:37;;;;;;;;23624:1;;23598:37;;;;;;;;;;;;;23225:418;;:::o;3061:59::-;1105:12;;;;;;;;:31;;;1121:15;:13;:15::i;:::-;1105:47;;;-1:-1:-1;1141:11:0;;;;1140:12;1105:47;1097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:19;1239:12;;;;;;1238:13;1262:99;;;;1297:12;:19;;1331:18;1297:19;;;;;;1331:18;1312:4;1331:18;;;1391:14;1387:67;;;1437:5;1422:20;;;;;;3061:59;:::o;16420:178::-;1105:12;;;;;;;;:31;;;1121:15;:13;:15::i;:::-;1105:47;;;-1:-1:-1;1141:11:0;;;;1140:12;1105:47;1097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:19;1239:12;;;;;;1238:13;1262:99;;;;1297:12;:19;;1331:18;1297:19;;;;;;1331:18;1312:4;1331:18;;;1262:99;16526:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16549:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;16576:9:0::1;:14:::0;;;::::1;16588:2;16576:14;::::0;;1387:67;;;;1437:5;1422:20;;;;;;16420:178;;;:::o;33092:196::-;1105:12;;;;;;;;:31;;;1121:15;:13;:15::i;:::-;1105:47;;;-1:-1:-1;1141:11:0;;;;1140:12;1105:47;1097:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1216:19;1239:12;;;;;;1238:13;1262:99;;;;1297:12;:19;;1331:18;1297:19;;;;;;1331:18;1312:4;1331:18;;;1262:99;33160:17:::1;33180:12;:10;:12::i;:::-;33203:6;:18:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;33237:43:::1;::::0;33203:18;;-1:-1:-1;33203:18:0;-1:-1:-1;;33237:43:0::1;::::0;-1:-1:-1;;33237:43:0::1;1373:1;1391:14:::0;1387:67;;;1437:5;1422:20;;;;;;33092:196;:::o;10018:379::-;10138:7;10240:12;10233:5;10225:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10264:9;10280:1;10276;:5;;;;;;;10018:379;-1:-1:-1;;;;;10018:379:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://e932451cecb3aa34affa7bd78ca51458a250ae0a4eb4c33707389fdbda7bbfd3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.