Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 508 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12858055 | 1253 days ago | IN | 0 ETH | 0.00115056 | ||||
Toggle Contract ... | 11161399 | 1515 days ago | IN | 0 ETH | 0.00056072 | ||||
Zap In | 11071593 | 1528 days ago | IN | 0 ETH | 0.00573576 | ||||
Zap In | 11070088 | 1529 days ago | IN | 0 ETH | 0.00084581 | ||||
Zap In | 11070088 | 1529 days ago | IN | 0 ETH | 0.0198036 | ||||
Zap In | 11068868 | 1529 days ago | IN | 0 ETH | 0.01715298 | ||||
Zap In | 11068146 | 1529 days ago | IN | 0 ETH | 0.01258515 | ||||
Zap In | 11067842 | 1529 days ago | IN | 0 ETH | 0.01928672 | ||||
Zap In | 11067338 | 1529 days ago | IN | 0.5 ETH | 0.06327926 | ||||
Zap In | 11067015 | 1529 days ago | IN | 0 ETH | 0.00669531 | ||||
Zap In | 11064326 | 1529 days ago | IN | 1 ETH | 0.01349524 | ||||
Zap In | 11064225 | 1529 days ago | IN | 0.76 ETH | 0.01072823 | ||||
Zap In | 11063816 | 1530 days ago | IN | 1.25 ETH | 0.01030956 | ||||
Zap In | 11063318 | 1530 days ago | IN | 0.06 ETH | 0.01050861 | ||||
Zap In | 11062374 | 1530 days ago | IN | 13.96 ETH | 0.01106467 | ||||
Zap In | 11062284 | 1530 days ago | IN | 0 ETH | 0.00624423 | ||||
Zap In | 11062190 | 1530 days ago | IN | 0 ETH | 0.00624495 | ||||
Zap In | 11061987 | 1530 days ago | IN | 7 ETH | 0.07355646 | ||||
Zap In | 11061387 | 1530 days ago | IN | 0 ETH | 0.01549765 | ||||
Zap In | 11061303 | 1530 days ago | IN | 0.06 ETH | 0.02356376 | ||||
Zap In | 11061070 | 1530 days ago | IN | 0 ETH | 0.01918505 | ||||
Zap In | 11060690 | 1530 days ago | IN | 2.25 ETH | 0.02503751 | ||||
Zap In | 11060440 | 1530 days ago | IN | 1 ETH | 0.07185766 | ||||
Zap In | 11060089 | 1530 days ago | IN | 5 ETH | 0.02916515 | ||||
Zap In | 11059082 | 1530 days ago | IN | 2.7216 ETH | 0.04057313 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11068439 | 1529 days ago | 25 ETH | ||||
11068439 | 1529 days ago | 25 ETH | ||||
11067338 | 1529 days ago | 0.25 ETH | ||||
11067338 | 1529 days ago | 0.25 ETH | ||||
11064328 | 1529 days ago | 21.22755 ETH | ||||
11064328 | 1529 days ago | 21.22755 ETH | ||||
11064328 | 1529 days ago | 42.4551 ETH | ||||
11064326 | 1529 days ago | 0.5 ETH | ||||
11064326 | 1529 days ago | 0.5 ETH | ||||
11064225 | 1529 days ago | 0.76 ETH | ||||
11063816 | 1530 days ago | 1.25 ETH | ||||
11063318 | 1530 days ago | 0.03 ETH | ||||
11063318 | 1530 days ago | 0.03 ETH | ||||
11062374 | 1530 days ago | 13.96 ETH | ||||
11061987 | 1530 days ago | 3.5 ETH | ||||
11061987 | 1530 days ago | 3.5 ETH | ||||
11061720 | 1530 days ago | 32.1 ETH | ||||
11061720 | 1530 days ago | 32.1 ETH | ||||
11061720 | 1530 days ago | 64.2 ETH | ||||
11061303 | 1530 days ago | 0.06 ETH | ||||
11061243 | 1530 days ago | 0.25 ETH | ||||
11061243 | 1530 days ago | 0.25 ETH | ||||
11061243 | 1530 days ago | 0.5 ETH | ||||
11060690 | 1530 days ago | 2.25 ETH | ||||
11060440 | 1530 days ago | 0.5 ETH |
Loading...
Loading
Contract Name:
Curve_ZapIn_General_V1_8
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-19 */ // ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗ // ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║ // ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║ // ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║ // ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║ // ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝ // Copyright (C) 2020 zapper, nodar, suhail, seb, sumit, apoorv // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // ///@author Zapper ///@notice This contract adds liquidity to Curve stablecoin and BTC liquidity pools in one transaction with ETH or ERC tokens. // File: Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: OpenZepplinOwnable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address payable public _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address payable 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(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address payable newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address payable newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: OpenZepplinSafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: OpenZepplinIERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: OpenZepplinReentrancyGuard.sol pragma solidity ^0.5.0; /** * @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. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor() internal { // Storing an initial 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 percetange 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. _notEntered = true; } /** * @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(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @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 Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for 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" ); } } } interface IUniswapV2Factory { function getPair(address tokenA, address tokenB) external view returns (address); } interface IUniswapRouter02 { //get estimated amountOut function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); //token 2 token function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); //eth 2 token function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); //token 2 eth function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } interface ICurveExchange { function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; } interface IPool3CurveExchange { function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; } interface IrenBtcCurveExchange { function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; } interface IhBtcCurveExchange { function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; } interface IsBtcCurveExchange { function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; } interface yERC20 { function deposit(uint256 _amount) external; } interface IBalancer { function swapExactAmountIn( address tokenIn, uint256 tokenAmountIn, address tokenOut, uint256 minAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter); } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } contract Curve_ZapIn_General_V1_8 is ReentrancyGuard, Ownable { using SafeMath for uint256; bool public stopped = false; uint16 public goodwill; address public zgoodwillAddress = 0xE737b6AfEC2320f616297e59445b60a11e3eF75F; using SafeERC20 for IERC20; IUniswapV2Factory private constant UniSwapV2FactoryAddress = IUniswapV2Factory( 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f ); IUniswapRouter02 private constant uniswapRouter = IUniswapRouter02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); address private constant DaiTokenAddress = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address private constant UsdcTokenAddress = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address private constant UsdtTokenAddress = 0xdAC17F958D2ee523a2206206994597C13D831ec7; address private constant sUSDCurveExchangeAddress = 0xA5407eAE9Ba41422680e2e00537571bcC53efBfD; address private constant sUSDCurvePoolTokenAddress = 0xC25a3A3b969415c80451098fa907EC722572917F; address private constant yCurveExchangeAddress = 0xbBC81d23Ea2c3ec7e56D39296F0cbB648873a5d3; address private constant yCurvePoolTokenAddress = 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8; address private constant bUSDCurveExchangeAddress = 0xb6c057591E073249F2D9D88Ba59a46CFC9B59EdB; address private constant bUSDCurvePoolTokenAddress = 0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B; address private constant paxCurveExchangeAddress = 0xA50cCc70b6a011CffDdf45057E39679379187287; address private constant paxCurvePoolTokenAddress = 0xD905e2eaeBe188fc92179b6350807D8bd91Db0D8; address private constant pool3CurveExchangeAddress = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7; address private constant pool3CurvePoolTokenAddress = 0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490; address private constant renBtcCurveExchangeAddress = 0x93054188d876f558f4a66B2EF1d97d16eDf0895B; address private constant renBtcCurvePoolTokenAddress = 0x49849C98ae39Fff122806C06791Fa73784FB3675; address private constant sBtcCurveExchangeAddress = 0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714; address private constant sBtcCurvePoolTokenAddress = 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3; address private constant hBtcCurveExchangeAddress = 0x4CA9b3063Ec5866A4B82E437059D2C43d1be596F; address private constant hBtcCurvePoolTokenAddress = 0xb19059ebb43466C323583928285a49f558E572Fd; IBalancer private BalWBTCPool = IBalancer( 0x1efF8aF5D577060BA4ac8A29A13525bb0Ee2A3D5 ); address private constant wethTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address private constant wbtcTokenAddress = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; address private constant renBtcTokenAddress = 0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D; address private constant sBtcTokenAddress = 0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6; address private constant hBtcTokenAddress = 0x0316EB71485b0Ab14103307bf65a021042c6d380; uint256 private constant deadline = 0xf000000000000000000000000000000000000000000000000000000000000000; mapping(address => address) internal exchange2Token; constructor(uint16 _goodwill) public { goodwill = _goodwill; exchange2Token[sUSDCurveExchangeAddress] = sUSDCurvePoolTokenAddress; exchange2Token[yCurveExchangeAddress] = yCurvePoolTokenAddress; exchange2Token[bUSDCurveExchangeAddress] = bUSDCurvePoolTokenAddress; exchange2Token[paxCurveExchangeAddress] = paxCurvePoolTokenAddress; exchange2Token[pool3CurveExchangeAddress] = pool3CurvePoolTokenAddress; exchange2Token[renBtcCurveExchangeAddress] = renBtcCurvePoolTokenAddress; exchange2Token[sBtcCurveExchangeAddress] = sBtcCurvePoolTokenAddress; exchange2Token[hBtcCurveExchangeAddress] = hBtcCurvePoolTokenAddress; approveToken(); } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } function approveToken() public { // dai approvals IERC20(DaiTokenAddress).safeApprove( sUSDCurveExchangeAddress, uint256(-1) ); IERC20(DaiTokenAddress).safeApprove(yCurveExchangeAddress, uint256(-1)); IERC20(DaiTokenAddress).safeApprove( bUSDCurveExchangeAddress, uint256(-1) ); IERC20(DaiTokenAddress).safeApprove( paxCurveExchangeAddress, uint256(-1) ); IERC20(DaiTokenAddress).safeApprove( pool3CurveExchangeAddress, uint256(-1) ); // usdc approvals IERC20(UsdcTokenAddress).safeApprove( sUSDCurveExchangeAddress, uint256(-1) ); IERC20(UsdcTokenAddress).safeApprove( yCurveExchangeAddress, uint256(-1) ); IERC20(UsdcTokenAddress).safeApprove( bUSDCurveExchangeAddress, uint256(-1) ); IERC20(UsdcTokenAddress).safeApprove( paxCurveExchangeAddress, uint256(-1) ); IERC20(UsdcTokenAddress).safeApprove( pool3CurveExchangeAddress, uint256(-1) ); // usdt approvals IERC20(UsdtTokenAddress).safeApprove( sUSDCurveExchangeAddress, uint256(-1) ); IERC20(UsdtTokenAddress).safeApprove( yCurveExchangeAddress, uint256(-1) ); IERC20(UsdtTokenAddress).safeApprove( bUSDCurveExchangeAddress, uint256(-1) ); IERC20(UsdtTokenAddress).safeApprove( paxCurveExchangeAddress, uint256(-1) ); IERC20(UsdtTokenAddress).safeApprove( pool3CurveExchangeAddress, uint256(-1) ); } function ZapIn( address _toWhomToIssue, address _IncomingTokenAddress, address _curvePoolExchangeAddress, uint256 _IncomingTokenQty, uint256 _minPoolTokens ) public payable stopInEmergency returns (uint256 crvTokensBought) { require( _curvePoolExchangeAddress == sUSDCurveExchangeAddress || _curvePoolExchangeAddress == yCurveExchangeAddress || _curvePoolExchangeAddress == bUSDCurveExchangeAddress || _curvePoolExchangeAddress == paxCurveExchangeAddress || _curvePoolExchangeAddress == pool3CurveExchangeAddress || _curvePoolExchangeAddress == renBtcCurveExchangeAddress || _curvePoolExchangeAddress == sBtcCurveExchangeAddress || _curvePoolExchangeAddress == hBtcCurveExchangeAddress, "Invalid Curve Pool Address" ); if (_IncomingTokenAddress == address(0)) { crvTokensBought = ZapInWithETH( _toWhomToIssue, _curvePoolExchangeAddress, _minPoolTokens ); } else { crvTokensBought = ZapInWithERC20( _toWhomToIssue, _IncomingTokenAddress, _curvePoolExchangeAddress, _IncomingTokenQty, _minPoolTokens ); } } function ZapInWithETH( address _toWhomToIssue, address _curvePoolExchangeAddress, uint256 _minPoolTokens ) internal stopInEmergency returns (uint256 crvTokensBought) { require(msg.value > 0, "Err: No ETH sent"); if ( _curvePoolExchangeAddress != sBtcCurveExchangeAddress && _curvePoolExchangeAddress != renBtcCurveExchangeAddress && _curvePoolExchangeAddress != hBtcCurveExchangeAddress ) { uint256 daiBought = _eth2Token(DaiTokenAddress, (msg.value).div(2)); uint256 usdcBought = _eth2Token( UsdcTokenAddress, (msg.value).div(2) ); crvTokensBought = _enter2Curve( _toWhomToIssue, daiBought, usdcBought, 0, _curvePoolExchangeAddress, _minPoolTokens ); } else { uint256 wbtcBought = _eth2WBTC(msg.value, false); crvTokensBought = _enter2BtcCurve( _toWhomToIssue, wbtcTokenAddress, _curvePoolExchangeAddress, wbtcBought, _minPoolTokens ); } } function ZapInWithERC20( address _toWhomToIssue, address _IncomingTokenAddress, address _curvePoolExchangeAddress, uint256 _IncomingTokenQty, uint256 _minPoolTokens ) internal stopInEmergency returns (uint256 crvTokensBought) { require(_IncomingTokenQty > 0, "Err: No ERC20 sent"); IERC20(_IncomingTokenAddress).safeTransferFrom( msg.sender, address(this), _IncomingTokenQty ); if ( _curvePoolExchangeAddress == sBtcCurveExchangeAddress || _curvePoolExchangeAddress == renBtcCurveExchangeAddress || _curvePoolExchangeAddress == hBtcCurveExchangeAddress ) { if ( _IncomingTokenAddress == wbtcTokenAddress || _IncomingTokenAddress == renBtcTokenAddress || _IncomingTokenAddress == sBtcTokenAddress || _IncomingTokenAddress == hBtcTokenAddress ) { crvTokensBought = _enter2BtcCurve( _toWhomToIssue, _IncomingTokenAddress, _curvePoolExchangeAddress, _IncomingTokenQty, _minPoolTokens ); } else { // token to weth (via uniswapV2) uint256 wethBought = _token2Token( _IncomingTokenAddress, wethTokenAddress, _IncomingTokenQty ); // weth to wbtc (via balancer) uint256 wbtcBought = _eth2WBTC(wethBought, true); // enter curve with wbtc crvTokensBought = _enter2BtcCurve( _toWhomToIssue, wbtcTokenAddress, _curvePoolExchangeAddress, wbtcBought, _minPoolTokens ); } } else { uint256 daiBought; uint256 usdcBought; uint256 usdtBought; if (_IncomingTokenAddress == DaiTokenAddress) { daiBought = _IncomingTokenQty; } else if (_IncomingTokenAddress == UsdcTokenAddress) { usdcBought = _IncomingTokenQty; } else if (_IncomingTokenAddress == UsdtTokenAddress) { usdtBought = _IncomingTokenQty; } else { daiBought = _token2Token( _IncomingTokenAddress, DaiTokenAddress, (_IncomingTokenQty).div(2) ); usdcBought = _token2Token( _IncomingTokenAddress, UsdcTokenAddress, (_IncomingTokenQty).div(2) ); } crvTokensBought = _enter2Curve( _toWhomToIssue, daiBought, usdcBought, usdtBought, _curvePoolExchangeAddress, _minPoolTokens ); } } function _enter2BtcCurve( address _toWhomToIssue, address _incomingBtcTokenAddress, address _curvePoolExchangeAddress, uint256 _incomingBtcTokenAmt, uint256 _minPoolTokens ) internal returns (uint256 crvTokensBought) { require( _incomingBtcTokenAddress == sBtcTokenAddress || _incomingBtcTokenAddress == wbtcTokenAddress || _incomingBtcTokenAddress == renBtcTokenAddress || _incomingBtcTokenAddress == hBtcTokenAddress, "ERR: Incorrect BTC Token Address" ); IERC20(_incomingBtcTokenAddress).safeApprove( _curvePoolExchangeAddress, _incomingBtcTokenAmt ); address btcCurvePoolTokenAddress = exchange2Token[_curvePoolExchangeAddress]; uint256 iniTokenBal = IERC20(btcCurvePoolTokenAddress).balanceOf( address(this) ); // 0 = renBTC/hBTC, 1 = wBTC, 2 = sBTC if (_incomingBtcTokenAddress == wbtcTokenAddress) { if (_curvePoolExchangeAddress == renBtcCurveExchangeAddress) { IrenBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [0, _incomingBtcTokenAmt], _minPoolTokens ); } else if (_curvePoolExchangeAddress == hBtcCurveExchangeAddress) { IhBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [0, _incomingBtcTokenAmt], _minPoolTokens ); } else { IsBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [0, _incomingBtcTokenAmt, 0], _minPoolTokens ); } } else if (_incomingBtcTokenAddress == renBtcTokenAddress) { if (_curvePoolExchangeAddress == renBtcCurveExchangeAddress) { IrenBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [_incomingBtcTokenAmt, 0], _minPoolTokens ); } else { IsBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [_incomingBtcTokenAmt, 0, 0], _minPoolTokens ); } } else if (_incomingBtcTokenAddress == hBtcTokenAddress) { IhBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [_incomingBtcTokenAmt, 0], _minPoolTokens ); } else { IsBtcCurveExchange(_curvePoolExchangeAddress).add_liquidity( [0, 0, _incomingBtcTokenAmt], 0 ); } crvTokensBought = ( IERC20(btcCurvePoolTokenAddress).balanceOf(address(this)) ) .sub(iniTokenBal); require( crvTokensBought > _minPoolTokens, "Error less than min pool tokens" ); IERC20(btcCurvePoolTokenAddress).safeTransfer( _toWhomToIssue, crvTokensBought ); } function _enter2Curve( address _toWhomToIssue, uint256 daiBought, uint256 usdcBought, uint256 usdtBought, address _curvePoolExchangeAddress, uint256 _minPoolTokens ) internal returns (uint256 crvTokensBought) { // 0 = DAI, 1 = USDC, 2 = USDT, 3 = TUSD/sUSD address poolTokenAddress = exchange2Token[_curvePoolExchangeAddress]; uint256 iniTokenBal = IERC20(poolTokenAddress).balanceOf(address(this)); if (_curvePoolExchangeAddress == pool3CurveExchangeAddress) { IPool3CurveExchange(_curvePoolExchangeAddress).add_liquidity( [daiBought, usdcBought, usdtBought], _minPoolTokens ); } else { ICurveExchange(_curvePoolExchangeAddress).add_liquidity( [daiBought, usdcBought, usdtBought, 0], _minPoolTokens ); } crvTokensBought = (IERC20(poolTokenAddress).balanceOf(address(this))) .sub(iniTokenBal); require( crvTokensBought > _minPoolTokens, "Error less than min pool tokens" ); uint256 goodwillPortion = SafeMath.div( SafeMath.mul(crvTokensBought, goodwill), 10000 ); IERC20(poolTokenAddress).safeTransfer( zgoodwillAddress, goodwillPortion ); IERC20(poolTokenAddress).safeTransfer( _toWhomToIssue, SafeMath.sub(crvTokensBought, goodwillPortion) ); } function _eth2WBTC(uint256 ethReceived, bool fromWeth) internal returns (uint256 tokensBought) { if (!fromWeth) IWETH(wethTokenAddress).deposit.value(ethReceived)(); IERC20(wethTokenAddress).safeApprove(address(BalWBTCPool), ethReceived); (tokensBought, ) = BalWBTCPool.swapExactAmountIn( wethTokenAddress, ethReceived, wbtcTokenAddress, 0, uint256(-1) ); } function _eth2Token(address _tokenContractAddress, uint256 ethReceived) internal returns (uint256 tokensBought) { require( _tokenContractAddress != wethTokenAddress, "ERR: Invalid Swap to ETH" ); address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _tokenContractAddress; tokensBought = uniswapRouter.swapExactETHForTokens.value(ethReceived)( 1, path, address(this), deadline )[path.length - 1]; } function _token2Token( address _FromTokenContractAddress, address _ToTokenContractAddress, uint256 tokens2Trade ) internal returns (uint256 tokenBought) { if (_FromTokenContractAddress == _ToTokenContractAddress) { return tokens2Trade; } IERC20(_FromTokenContractAddress).safeApprove( address(uniswapRouter), tokens2Trade ); if (_FromTokenContractAddress != wethTokenAddress) { if (_ToTokenContractAddress != wethTokenAddress) { address[] memory path = new address[](3); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; path[2] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } else { address[] memory path = new address[](2); path[0] = _FromTokenContractAddress; path[1] = wethTokenAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } } else { address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _ToTokenContractAddress; tokenBought = uniswapRouter.swapExactTokensForTokens( tokens2Trade, 1, path, address(this), deadline )[path.length - 1]; } } function setNewBalWBTCPool(address _newBalWBTCPool) public onlyOwner { require( _newBalWBTCPool != address(0) && _newBalWBTCPool != address(BalWBTCPool), "Invalid Pool" ); BalWBTCPool = IBalancer(_newBalWBTCPool); } function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner { uint256 qty = _TokenAddress.balanceOf(address(this)); IERC20(_TokenAddress).safeTransfer(_owner, qty); } function set_new_goodwill(uint16 _new_goodwill) public onlyOwner { require( _new_goodwill >= 0 && _new_goodwill < 10000, "GoodWill Value not allowed" ); goodwill = _new_goodwill; } function set_new_zgoodwillAddress(address _new_zgoodwillAddress) public onlyOwner { zgoodwillAddress = _new_zgoodwillAddress; } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } // - to withdraw any ETH balance sitting in the contract function withdraw() public onlyOwner { _owner.transfer(address(this).balance); } function() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint16","name":"_goodwill","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"_toWhomToIssue","type":"address"},{"internalType":"address","name":"_IncomingTokenAddress","type":"address"},{"internalType":"address","name":"_curvePoolExchangeAddress","type":"address"},{"internalType":"uint256","name":"_IncomingTokenQty","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"crvTokensBought","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newBalWBTCPool","type":"address"}],"name":"setNewBalWBTCPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_new_goodwill","type":"uint16"}],"name":"set_new_goodwill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_zgoodwillAddress","type":"address"}],"name":"set_new_zgoodwillAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"zgoodwillAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000805460ff60a81b19169055600180546001600160a01b031990811673e737b6afec2320f616297e59445b60a11e3ef75f1790915560028054909116731eff8af5d577060ba4ac8a29a13525bb0ee2a3d51790553480156200006657600080fd5b5060405162003a6f38038062003a6f833981810160405260208110156200008c57600080fd5b50516000805460ff19166001178155620000ae6001600160e01b036200034716565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805461ffff8316600160b01b0261ffff60b01b1990911617815560036020527f413e93e93adcd366de858449d1d736f9932796f510c70aca5f04ce7638c63e1a80546001600160a01b031990811673c25a3a3b969415c80451098fa907ec722572917f179091557fe383329dac8fc0739fd275ada4335c51b16c805d31097a1c2d46ecf4d64727be8054821673df5e0e81dff6faf3a7e52ba697820c5e32d806a81790557f7028020495fd0447d46caa182b14ce543fdf83cd9e6a49827a6ad7f45fd602cf80548216733b3ac5386837dc563660fb6a0937dfaa5924333b1790557f10c914fdad9b470b488d148ced5983be0348f39150f4e2ee9cd61071580716618054821673d905e2eaebe188fc92179b6350807d8bd91db0d81790557f882d7ed9f2a3bb94081200846cb72e20b34d0a96f26eafd7e2ec91639183323c80548216736c3f90f043a72fa612cbac8115ee7e52bde6e4901790557f6b952f6a36563f2ba577572e1f977783269346465b32a3eaaf6833e2a8ea9ae9805482167349849c98ae39fff122806c06791fa73784fb36751790557f3d8122bacbd44602332daa2535661007f9ba01b86e4f0a84b8d5578ac34eb7ab8054821673075b1bb99792c9e1041ba13afef80c91a1e70fb3179055734ca9b3063ec5866a4b82e437059d2c43d1be596f9091527fa293237c9f22d9b6f7716dfbf21cdeac68a11d8bd0eca0b6748fdb4922b0750a805490911673b19059ebb43466c323583928285a49f558e572fd179055620003406001600160e01b036200034b16565b5062000a25565b3390565b62000389600080516020620039af83398151915273a5407eae9ba41422680e2e00537571bcc53efbfd600019620006ef602090811b62000e7c17901c565b620003c7600080516020620039af83398151915273bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3600019620006ef602090811b62000e7c17901c565b62000405600080516020620039af83398151915273b6c057591e073249f2d9d88ba59a46cfc9b59edb600019620006ef602090811b62000e7c17901c565b62000443600080516020620039af83398151915273a50ccc70b6a011cffddf45057e39679379187287600019620006ef602090811b62000e7c17901c565b62000481600080516020620039af83398151915273bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600019620006ef602090811b62000e7c17901c565b620004bf600080516020620039cf83398151915273a5407eae9ba41422680e2e00537571bcc53efbfd600019620006ef602090811b62000e7c17901c565b620004fd600080516020620039cf83398151915273bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3600019620006ef602090811b62000e7c17901c565b6200053b600080516020620039cf83398151915273b6c057591e073249f2d9d88ba59a46cfc9b59edb600019620006ef602090811b62000e7c17901c565b62000579600080516020620039cf83398151915273a50ccc70b6a011cffddf45057e39679379187287600019620006ef602090811b62000e7c17901c565b620005b7600080516020620039cf83398151915273bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600019620006ef602090811b62000e7c17901c565b620005f5600080516020620039ef83398151915273a5407eae9ba41422680e2e00537571bcc53efbfd600019620006ef602090811b62000e7c17901c565b62000633600080516020620039ef83398151915273bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3600019620006ef602090811b62000e7c17901c565b62000671600080516020620039ef83398151915273b6c057591e073249f2d9d88ba59a46cfc9b59edb600019620006ef602090811b62000e7c17901c565b620006af600080516020620039ef83398151915273a50ccc70b6a011cffddf45057e39679379187287600019620006ef602090811b62000e7c17901c565b620006ed600080516020620039ef83398151915273bebc44782c7db0a1a60cb6fe97d0b483032ff1c7600019620006ef602090811b62000e7c17901c565b565b80158062000779575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200074957600080fd5b505afa1580156200075e573d6000803e3d6000fd5b505050506040513d60208110156200077557600080fd5b5051155b620007b65760405162461bcd60e51b815260040180806020018281038252603681526020018062003a396036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200080e9185916200081316565b505050565b62000832826001600160a01b0316620009e860201b62002cab1760201c565b62000884576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310620008c45780518252601f199092019160209182019101620008a3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462000928576040519150601f19603f3d011682016040523d82523d6000602084013e6200092d565b606091505b50915091508162000985576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115620009e257808060200190516020811015620009a357600080fd5b5051620009e25760405162461bcd60e51b815260040180806020018281038252602a81526020018062003a0f602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159062000a1d57508115155b949350505050565b612f7a8062000a356000396000f3fe6080604052600436106100f35760003560e01c80638da5cb5b1161008a578063b2bdfa7b11610059578063b2bdfa7b1461028d578063b5090bdc146102a2578063e231031e146102f6578063f2fde38b14610329576100f3565b80638da5cb5b146102205780638f32d59b1461023557806399b71d5c1461024a578063b10e1dbc1461025f576100f3565b80635de0398e116100c65780635de0398e14610183578063715018a6146101af57806375f12b21146101c45780637810bf19146101ed576100f3565b80631385d24c146100f55780632810c14e1461010a5780633ccfd60b1461013b578063551196d514610150575b005b34801561010157600080fd5b506100f361035c565b34801561011657600080fd5b5061011f6103c4565b604080516001600160a01b039092168252519081900360200190f35b34801561014757600080fd5b506100f36103d3565b34801561015c57600080fd5b506100f36004803603602081101561017357600080fd5b50356001600160a01b031661045e565b34801561018f57600080fd5b50610198610547565b6040805161ffff9092168252519081900360200190f35b3480156101bb57600080fd5b506100f3610558565b3480156101d057600080fd5b506101d96105ee565b604080519115158252519081900360200190f35b3480156101f957600080fd5b506100f36004803603602081101561021057600080fd5b50356001600160a01b03166105fe565b34801561022c57600080fd5b5061011f610667565b34801561024157600080fd5b506101d961067b565b34801561025657600080fd5b506100f36106a4565b34801561026b57600080fd5b506100f36004803603602081101561028257600080fd5b503561ffff16610a1b565b34801561029957600080fd5b5061011f610ade565b6102e4600480360360a08110156102b857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135610af2565b60408051918252519081900360200190f35b34801561030257600080fd5b506100f36004803603602081101561031957600080fd5b50356001600160a01b0316610d02565b34801561033557600080fd5b506100f36004803603602081101561034c57600080fd5b50356001600160a01b0316610dd1565b61036461067b565b6103a3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6001546001600160a01b031681565b6103db61067b565b61041a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b600080546040516001600160a01b0361010090920491909116914780156108fc02929091818181858888f1935050505015801561045b573d6000803e3d6000fd5b50565b61046661067b565b6104a5576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156104ef57600080fd5b505afa158015610503573d6000803e3d6000fd5b505050506040513d602081101561051957600080fd5b5051600054909150610543906001600160a01b03848116916101009004168363ffffffff610e2116565b5050565b600054600160b01b900461ffff1681565b61056061067b565b61059f576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b61060661067b565b610645576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610695610e78565b6001600160a01b031614905090565b6106df736b175474e89094c44da98b954eedeac495271d0f73a5407eae9ba41422680e2e00537571bcc53efbfd60001963ffffffff610e7c16565b61071a736b175474e89094c44da98b954eedeac495271d0f73bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360001963ffffffff610e7c16565b610755736b175474e89094c44da98b954eedeac495271d0f73b6c057591e073249f2d9d88ba59a46cfc9b59edb60001963ffffffff610e7c16565b610790736b175474e89094c44da98b954eedeac495271d0f73a50ccc70b6a011cffddf45057e3967937918728760001963ffffffff610e7c16565b6107cb736b175474e89094c44da98b954eedeac495271d0f73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff610e7c16565b61080673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873a5407eae9ba41422680e2e00537571bcc53efbfd60001963ffffffff610e7c16565b61084173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360001963ffffffff610e7c16565b61087c73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873b6c057591e073249f2d9d88ba59a46cfc9b59edb60001963ffffffff610e7c16565b6108b773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873a50ccc70b6a011cffddf45057e3967937918728760001963ffffffff610e7c16565b6108f273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff610e7c16565b61092d73dac17f958d2ee523a2206206994597c13d831ec773a5407eae9ba41422680e2e00537571bcc53efbfd60001963ffffffff610e7c16565b61096873dac17f958d2ee523a2206206994597c13d831ec773bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360001963ffffffff610e7c16565b6109a373dac17f958d2ee523a2206206994597c13d831ec773b6c057591e073249f2d9d88ba59a46cfc9b59edb60001963ffffffff610e7c16565b6109de73dac17f958d2ee523a2206206994597c13d831ec773a50ccc70b6a011cffddf45057e3967937918728760001963ffffffff610e7c16565b610a1973dac17f958d2ee523a2206206994597c13d831ec773bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff610e7c16565b565b610a2361067b565b610a62576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b6127108161ffff1610610abc576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b60008054600160a81b900460ff1615610b47576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03841673a5407eae9ba41422680e2e00537571bcc53efbfd1480610b8e57506001600160a01b03841673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3145b80610bb557506001600160a01b03841673b6c057591e073249f2d9d88ba59a46cfc9b59edb145b80610bdc57506001600160a01b03841673a50ccc70b6a011cffddf45057e39679379187287145b80610c0357506001600160a01b03841673bebc44782c7db0a1a60cb6fe97d0b483032ff1c7145b80610c2a57506001600160a01b0384167393054188d876f558f4a66b2ef1d97d16edf0895b145b80610c5157506001600160a01b038416737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b80610c7857506001600160a01b038416734ca9b3063ec5866a4b82e437059d2c43d1be596f145b610cc9576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420437572766520506f6f6c2041646472657373000000000000604482015290519081900360640190fd5b6001600160a01b038516610ce957610ce2868584610f8f565b9050610cf9565b610cf68686868686611156565b90505b95945050505050565b610d0a61067b565b610d49576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b6001600160a01b03811615801590610d6f57506002546001600160a01b03828116911614155b610daf576040805162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a5908141bdbdb60a21b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610dd961067b565b610e18576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b61045b81611491565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e7390849061153c565b505050565b3390565b801580610f02575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015610ed457600080fd5b505afa158015610ee8573d6000803e3d6000fd5b505050506040513d6020811015610efe57600080fd5b5051155b610f3d5760405162461bcd60e51b8152600401808060200182810382526036815260200180612f106036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610e7390849061153c565b60008054600160a81b900460ff1615610fe4576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6000341161102c576040805162461bcd60e51b815260206004820152601060248201526f115c9c8e88139bc8115512081cd95b9d60821b604482015290519081900360640190fd5b6001600160a01b038316737fc77b5c7614e1533320ea6ddc2eb61fa00a97141480159061107657506001600160a01b0383167393054188d876f558f4a66b2ef1d97d16edf0895b14155b801561109f57506001600160a01b038316734ca9b3063ec5866a4b82e437059d2c43d1be596f14155b1561111b5760006110d4736b175474e89094c44da98b954eedeac495271d0f6110cf34600263ffffffff6116fa16565b611745565b9050600061110173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486110cf34600263ffffffff6116fa16565b9050611112868383600089896119db565b9250505061114f565b6000611128346000611d34565b905061114b85732260fac5e5542a773aa44fbcfedf7c193bc2c599868487611e99565b9150505b9392505050565b60008054600160a81b900460ff16156111ab576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b600083116111f5576040805162461bcd60e51b8152602060048201526012602482015271115c9c8e88139bc8115490cc8c081cd95b9d60721b604482015290519081900360640190fd5b6112106001600160a01b03861633308663ffffffff61250d16565b6001600160a01b038416737fc77b5c7614e1533320ea6ddc2eb61fa00a9714148061125757506001600160a01b0384167393054188d876f558f4a66b2ef1d97d16edf0895b145b8061127e57506001600160a01b038416734ca9b3063ec5866a4b82e437059d2c43d1be596f145b1561138e576001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c59914806112ca57506001600160a01b03851673eb4c2781e4eba804ce9a9803c67d0893436bb27d145b806112f157506001600160a01b03851673fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6145b8061131857506001600160a01b038516730316eb71485b0ab14103307bf65a021042c6d380145b156113315761132a8686868686611e99565b9050611389565b60006113528673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc286612567565b90506000611361826001611d34565b905061138488732260fac5e5542a773aa44fbcfedf7c193bc2c599888488611e99565b925050505b610cf9565b600080806001600160a01b038816736b175474e89094c44da98b954eedeac495271d0f14156113bf57859250611476565b6001600160a01b03881673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814156113ec57859150611476565b6001600160a01b03881673dac17f958d2ee523a2206206994597c13d831ec71415611418575084611476565b61144788736b175474e89094c44da98b954eedeac495271d0f61144289600263ffffffff6116fa16565b612567565b92506114738873a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4861144289600263ffffffff6116fa16565b91505b611484898484848b8a6119db565b9998505050505050505050565b6001600160a01b0381166114d65760405162461bcd60e51b8152600401808060200182810382526026815260200180612e7f6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b61154e826001600160a01b0316612cab565b61159f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106115dd5780518252601f1990920191602091820191016115be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461163f576040519150601f19603f3d011682016040523d82523d6000602084013e611644565b606091505b50915091508161169b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156116f4578080602001905160208110156116b757600080fd5b50516116f45760405162461bcd60e51b815260040180806020018281038252602a815260200180612ee6602a913960400191505060405180910390fd5b50505050565b600061173c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ce7565b90505b92915050565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156117b9576040805162461bcd60e51b815260206004820152601860248201527f4552523a20496e76616c6964205377617020746f204554480000000000000000604482015290519081900360640190fd5b604080516002808252606080830184529260208301908038833901905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106117fb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061182957fe5b6001600160a01b03909216602092830291909101820152604051637ff36ab560e01b81526001600482018181523060448401819052600f60fc1b60648501819052608060248601908152875160848701528751737a250d5630b4cf539739df2c5dacb4c659f2488d97637ff36ab5978c97968b9695949093909260a490920191878101910280838360005b838110156118cc5781810151838201526020016118b4565b50505050905001955050505050506000604051808303818588803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561193157600080fd5b8101908080516040519392919084600160201b82111561195057600080fd5b90830190602082018581111561196557600080fd5b82518660208202830111600160201b8211171561198157600080fd5b82525081516020918201928201910280838360005b838110156119ae578181015183820152602001611996565b505050509050016040525050506001825103815181106119ca57fe5b602002602001015191505092915050565b6001600160a01b0380831660009081526003602090815260408083205481516370a0823160e01b8152306004820152915193941692849284926370a082319260248083019392829003018186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b505190506001600160a01b03851673bebc44782c7db0a1a60cb6fe97d0b483032ff1c71415611b3257846001600160a01b0316634515cef360405180606001604052808b81526020018a815260200189815250866040518363ffffffff1660e01b81526004018083600360200280838360005b83811015611aea578181015183820152602001611ad2565b5050505090500182815260200192505050600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b50505050611bdf565b846001600160a01b031663029b2f3460405180608001604052808b81526020018a81526020018981526020016000815250866040518363ffffffff1660e01b81526004018083600460200280838360005b83811015611b9b578181015183820152602001611b83565b5050505090500182815260200192505050600060405180830381600087803b158015611bc657600080fd5b505af1158015611bda573d6000803e3d6000fd5b505050505b604080516370a0823160e01b81523060048201529051611c639183916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611c2b57600080fd5b505afa158015611c3f573d6000803e3d6000fd5b505050506040513d6020811015611c5557600080fd5b50519063ffffffff612d8916565b9250838311611cb9576040805162461bcd60e51b815260206004820152601f60248201527f4572726f72206c657373207468616e206d696e20706f6f6c20746f6b656e7300604482015290519081900360640190fd5b60008054611cdf90611cd7908690600160b01b900461ffff16612dcb565b6127106116fa565b600154909150611d02906001600160a01b0385811691168363ffffffff610e2116565b611d278a611d108684612d89565b6001600160a01b038616919063ffffffff610e2116565b5050509695505050505050565b600081611da45773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d8a57600080fd5b505af1158015611d9e573d6000803e3d6000fd5b50505050505b600254611dd69073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906001600160a01b03168563ffffffff610e7c16565b60025460408051638201aa3f60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600482015260248101869052732260fac5e5542a773aa44fbcfedf7c193bc2c5996044820152600060648201819052600019608483015282516001600160a01b0390941693638201aa3f9360a4808501949193918390030190829087803b158015611e6657600080fd5b505af1158015611e7a573d6000803e3d6000fd5b505050506040513d6040811015611e9057600080fd5b50519392505050565b60006001600160a01b03851673fe18be6b3bd88a2d2a7f928d00292e7a9963cfc61480611ee257506001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c599145b80611f0957506001600160a01b03851673eb4c2781e4eba804ce9a9803c67d0893436bb27d145b80611f3057506001600160a01b038516730316eb71485b0ab14103307bf65a021042c6d380145b611f81576040805162461bcd60e51b815260206004820181905260248201527f4552523a20496e636f72726563742042544320546f6b656e2041646472657373604482015290519081900360640190fd5b611f9b6001600160a01b038616858563ffffffff610e7c16565b6001600160a01b0380851660009081526003602090815260408083205481516370a0823160e01b8152306004820152915194169384926370a082319260248082019391829003018186803b158015611ff257600080fd5b505afa158015612006573d6000803e3d6000fd5b505050506040513d602081101561201c57600080fd5b505190506001600160a01b038716732260fac5e5542a773aa44fbcfedf7c193bc2c5991415612231576001600160a01b0386167393054188d876f558f4a66b2ef1d97d16edf0895b141561210f57856001600160a01b0316630b4c7e4d60405180604001604052806000815260200188815250866040518363ffffffff1660e01b81526004018083600260200280838360005b838110156120c75781810151838201526020016120af565b5050505090500182815260200192505050600060405180830381600087803b1580156120f257600080fd5b505af1158015612106573d6000803e3d6000fd5b5050505061222c565b6001600160a01b038616734ca9b3063ec5866a4b82e437059d2c43d1be596f1415612184576040805180820182526000815260208082018890528251630b4c7e4d60e01b8152825160049091019081526001600160a01b038a1693630b4c7e4d939289929182918591908190849084906120af565b856001600160a01b0316634515cef36040518060600160405280600081526020018881526020016000815250866040518363ffffffff1660e01b81526004018083600360200280838360005b838110156121e85781810151838201526020016121d0565b5050505090500182815260200192505050600060405180830381600087803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050505b612446565b6001600160a01b03871673eb4c2781e4eba804ce9a9803c67d0893436bb27d1415612326576001600160a01b0386167393054188d876f558f4a66b2ef1d97d16edf0895b14156122cd5760408051808201825286815260006020808301919091528251630b4c7e4d60e01b8152825160049091019081526001600160a01b038a1693630b4c7e4d939289929182918591908190849084906120af565b604080516060808201835287825260006020808401829052838501919091529251634515cef360e01b8152825160049091019081526001600160a01b038a1693634515cef39392899291829185918190849084906121d0565b6001600160a01b038716730316eb71485b0ab14103307bf65a021042c6d380141561239d5760408051808201825286815260006020808301919091528251630b4c7e4d60e01b8152825160049091019081526001600160a01b038a1693630b4c7e4d939289929182918591908190849084906121d0565b856001600160a01b0316634515cef3604051806060016040528060008152602001600081526020018881525060006040518363ffffffff1660e01b81526004018083600360200280838360005b838110156124025781810151838201526020016123ea565b5050505090500182815260200192505050600060405180830381600087803b15801561242d57600080fd5b505af1158015612441573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516124929183916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611c2b57600080fd5b92508383116124e8576040805162461bcd60e51b815260206004820152601f60248201527f4572726f72206c657373207468616e206d696e20706f6f6c20746f6b656e7300604482015290519081900360640190fd5b6125026001600160a01b038316898563ffffffff610e2116565b505095945050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116f490859061153c565b6000826001600160a01b0316846001600160a01b0316141561258a57508061114f565b6125b86001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff610e7c16565b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214612a81576001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146128585760408051600380825260808201909252606091602082018380388339019050509050848160008151811061263057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061267257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816002815181106126a057fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b83811015612749578181015183820152602001612731565b505050509050019650505050505050600060405180830381600087803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156127af57600080fd5b8101908080516040519392919084600160201b8211156127ce57600080fd5b9083019060208201858111156127e357600080fd5b82518660208202830111600160201b821117156127ff57600080fd5b82525081516020918201928201910280838360005b8381101561282c578181015183820152602001612814565b5050505090500160405250505060018251038151811061284857fe5b6020026020010151915050612a7c565b6040805160028082526060808301845292602083019080388339019050509050848160008151811061288657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106128c857fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b83811015612971578181015183820152602001612959565b505050509050019650505050505050600060405180830381600087803b15801561299a57600080fd5b505af11580156129ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129d757600080fd5b8101908080516040519392919084600160201b8211156129f657600080fd5b908301906020820185811115612a0b57600080fd5b82518660208202830111600160201b82111715612a2757600080fd5b82525081516020918201928201910280838360005b83811015612a54578181015183820152602001612a3c565b50505050905001604052505050600182510381518110612a7057fe5b60200260200101519150505b61114f565b604080516002808252606080830184529260208301908038833901905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110612ac357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612af157fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b83811015612b9a578181015183820152602001612b82565b505050509050019650505050505050600060405180830381600087803b158015612bc357600080fd5b505af1158015612bd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612c0057600080fd5b8101908080516040519392919084600160201b821115612c1f57600080fd5b908301906020820185811115612c3457600080fd5b82518660208202830111600160201b82111715612c5057600080fd5b82525081516020918201928201910280838360005b83811015612c7d578181015183820152602001612c65565b50505050905001604052505050600182510381518110612c9957fe5b60200260200101519150509392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612cdf57508115155b949350505050565b60008183612d735760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d38578181015183820152602001612d20565b50505050905090810190601f168015612d655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612d7f57fe5b0495945050505050565b600061173c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e24565b600082612dda5750600061173f565b82820282848281612de757fe5b041461173c5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea56021913960400191505060405180910390fd5b60008184841115612e765760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612d38578181015183820152602001612d20565b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582063c0c398896ed1a929adf1eb442c4c8fa84c5f6ef74e6cea59b1b95585d93d7864736f6c634300051100320000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec75361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100f35760003560e01c80638da5cb5b1161008a578063b2bdfa7b11610059578063b2bdfa7b1461028d578063b5090bdc146102a2578063e231031e146102f6578063f2fde38b14610329576100f3565b80638da5cb5b146102205780638f32d59b1461023557806399b71d5c1461024a578063b10e1dbc1461025f576100f3565b80635de0398e116100c65780635de0398e14610183578063715018a6146101af57806375f12b21146101c45780637810bf19146101ed576100f3565b80631385d24c146100f55780632810c14e1461010a5780633ccfd60b1461013b578063551196d514610150575b005b34801561010157600080fd5b506100f361035c565b34801561011657600080fd5b5061011f6103c4565b604080516001600160a01b039092168252519081900360200190f35b34801561014757600080fd5b506100f36103d3565b34801561015c57600080fd5b506100f36004803603602081101561017357600080fd5b50356001600160a01b031661045e565b34801561018f57600080fd5b50610198610547565b6040805161ffff9092168252519081900360200190f35b3480156101bb57600080fd5b506100f3610558565b3480156101d057600080fd5b506101d96105ee565b604080519115158252519081900360200190f35b3480156101f957600080fd5b506100f36004803603602081101561021057600080fd5b50356001600160a01b03166105fe565b34801561022c57600080fd5b5061011f610667565b34801561024157600080fd5b506101d961067b565b34801561025657600080fd5b506100f36106a4565b34801561026b57600080fd5b506100f36004803603602081101561028257600080fd5b503561ffff16610a1b565b34801561029957600080fd5b5061011f610ade565b6102e4600480360360a08110156102b857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135610af2565b60408051918252519081900360200190f35b34801561030257600080fd5b506100f36004803603602081101561031957600080fd5b50356001600160a01b0316610d02565b34801561033557600080fd5b506100f36004803603602081101561034c57600080fd5b50356001600160a01b0316610dd1565b61036461067b565b6103a3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6001546001600160a01b031681565b6103db61067b565b61041a576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b600080546040516001600160a01b0361010090920491909116914780156108fc02929091818181858888f1935050505015801561045b573d6000803e3d6000fd5b50565b61046661067b565b6104a5576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156104ef57600080fd5b505afa158015610503573d6000803e3d6000fd5b505050506040513d602081101561051957600080fd5b5051600054909150610543906001600160a01b03848116916101009004168363ffffffff610e2116565b5050565b600054600160b01b900461ffff1681565b61056061067b565b61059f576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b61060661067b565b610645576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610695610e78565b6001600160a01b031614905090565b6106df736b175474e89094c44da98b954eedeac495271d0f73a5407eae9ba41422680e2e00537571bcc53efbfd60001963ffffffff610e7c16565b61071a736b175474e89094c44da98b954eedeac495271d0f73bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360001963ffffffff610e7c16565b610755736b175474e89094c44da98b954eedeac495271d0f73b6c057591e073249f2d9d88ba59a46cfc9b59edb60001963ffffffff610e7c16565b610790736b175474e89094c44da98b954eedeac495271d0f73a50ccc70b6a011cffddf45057e3967937918728760001963ffffffff610e7c16565b6107cb736b175474e89094c44da98b954eedeac495271d0f73bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff610e7c16565b61080673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873a5407eae9ba41422680e2e00537571bcc53efbfd60001963ffffffff610e7c16565b61084173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360001963ffffffff610e7c16565b61087c73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873b6c057591e073249f2d9d88ba59a46cfc9b59edb60001963ffffffff610e7c16565b6108b773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873a50ccc70b6a011cffddf45057e3967937918728760001963ffffffff610e7c16565b6108f273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff610e7c16565b61092d73dac17f958d2ee523a2206206994597c13d831ec773a5407eae9ba41422680e2e00537571bcc53efbfd60001963ffffffff610e7c16565b61096873dac17f958d2ee523a2206206994597c13d831ec773bbc81d23ea2c3ec7e56d39296f0cbb648873a5d360001963ffffffff610e7c16565b6109a373dac17f958d2ee523a2206206994597c13d831ec773b6c057591e073249f2d9d88ba59a46cfc9b59edb60001963ffffffff610e7c16565b6109de73dac17f958d2ee523a2206206994597c13d831ec773a50ccc70b6a011cffddf45057e3967937918728760001963ffffffff610e7c16565b610a1973dac17f958d2ee523a2206206994597c13d831ec773bebc44782c7db0a1a60cb6fe97d0b483032ff1c760001963ffffffff610e7c16565b565b610a2361067b565b610a62576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b6127108161ffff1610610abc576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b60008054600160a81b900460ff1615610b47576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6001600160a01b03841673a5407eae9ba41422680e2e00537571bcc53efbfd1480610b8e57506001600160a01b03841673bbc81d23ea2c3ec7e56d39296f0cbb648873a5d3145b80610bb557506001600160a01b03841673b6c057591e073249f2d9d88ba59a46cfc9b59edb145b80610bdc57506001600160a01b03841673a50ccc70b6a011cffddf45057e39679379187287145b80610c0357506001600160a01b03841673bebc44782c7db0a1a60cb6fe97d0b483032ff1c7145b80610c2a57506001600160a01b0384167393054188d876f558f4a66b2ef1d97d16edf0895b145b80610c5157506001600160a01b038416737fc77b5c7614e1533320ea6ddc2eb61fa00a9714145b80610c7857506001600160a01b038416734ca9b3063ec5866a4b82e437059d2c43d1be596f145b610cc9576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420437572766520506f6f6c2041646472657373000000000000604482015290519081900360640190fd5b6001600160a01b038516610ce957610ce2868584610f8f565b9050610cf9565b610cf68686868686611156565b90505b95945050505050565b610d0a61067b565b610d49576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b6001600160a01b03811615801590610d6f57506002546001600160a01b03828116911614155b610daf576040805162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a5908141bdbdb60a21b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610dd961067b565b610e18576040805162461bcd60e51b81526020600482018190526024820152600080516020612ec6833981519152604482015290519081900360640190fd5b61045b81611491565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e7390849061153c565b505050565b3390565b801580610f02575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015610ed457600080fd5b505afa158015610ee8573d6000803e3d6000fd5b505050506040513d6020811015610efe57600080fd5b5051155b610f3d5760405162461bcd60e51b8152600401808060200182810382526036815260200180612f106036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610e7390849061153c565b60008054600160a81b900460ff1615610fe4576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6000341161102c576040805162461bcd60e51b815260206004820152601060248201526f115c9c8e88139bc8115512081cd95b9d60821b604482015290519081900360640190fd5b6001600160a01b038316737fc77b5c7614e1533320ea6ddc2eb61fa00a97141480159061107657506001600160a01b0383167393054188d876f558f4a66b2ef1d97d16edf0895b14155b801561109f57506001600160a01b038316734ca9b3063ec5866a4b82e437059d2c43d1be596f14155b1561111b5760006110d4736b175474e89094c44da98b954eedeac495271d0f6110cf34600263ffffffff6116fa16565b611745565b9050600061110173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486110cf34600263ffffffff6116fa16565b9050611112868383600089896119db565b9250505061114f565b6000611128346000611d34565b905061114b85732260fac5e5542a773aa44fbcfedf7c193bc2c599868487611e99565b9150505b9392505050565b60008054600160a81b900460ff16156111ab576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b600083116111f5576040805162461bcd60e51b8152602060048201526012602482015271115c9c8e88139bc8115490cc8c081cd95b9d60721b604482015290519081900360640190fd5b6112106001600160a01b03861633308663ffffffff61250d16565b6001600160a01b038416737fc77b5c7614e1533320ea6ddc2eb61fa00a9714148061125757506001600160a01b0384167393054188d876f558f4a66b2ef1d97d16edf0895b145b8061127e57506001600160a01b038416734ca9b3063ec5866a4b82e437059d2c43d1be596f145b1561138e576001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c59914806112ca57506001600160a01b03851673eb4c2781e4eba804ce9a9803c67d0893436bb27d145b806112f157506001600160a01b03851673fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6145b8061131857506001600160a01b038516730316eb71485b0ab14103307bf65a021042c6d380145b156113315761132a8686868686611e99565b9050611389565b60006113528673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc286612567565b90506000611361826001611d34565b905061138488732260fac5e5542a773aa44fbcfedf7c193bc2c599888488611e99565b925050505b610cf9565b600080806001600160a01b038816736b175474e89094c44da98b954eedeac495271d0f14156113bf57859250611476565b6001600160a01b03881673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814156113ec57859150611476565b6001600160a01b03881673dac17f958d2ee523a2206206994597c13d831ec71415611418575084611476565b61144788736b175474e89094c44da98b954eedeac495271d0f61144289600263ffffffff6116fa16565b612567565b92506114738873a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4861144289600263ffffffff6116fa16565b91505b611484898484848b8a6119db565b9998505050505050505050565b6001600160a01b0381166114d65760405162461bcd60e51b8152600401808060200182810382526026815260200180612e7f6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b61154e826001600160a01b0316612cab565b61159f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106115dd5780518252601f1990920191602091820191016115be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461163f576040519150601f19603f3d011682016040523d82523d6000602084013e611644565b606091505b50915091508161169b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156116f4578080602001905160208110156116b757600080fd5b50516116f45760405162461bcd60e51b815260040180806020018281038252602a815260200180612ee6602a913960400191505060405180910390fd5b50505050565b600061173c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ce7565b90505b92915050565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156117b9576040805162461bcd60e51b815260206004820152601860248201527f4552523a20496e76616c6964205377617020746f204554480000000000000000604482015290519081900360640190fd5b604080516002808252606080830184529260208301908038833901905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106117fb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061182957fe5b6001600160a01b03909216602092830291909101820152604051637ff36ab560e01b81526001600482018181523060448401819052600f60fc1b60648501819052608060248601908152875160848701528751737a250d5630b4cf539739df2c5dacb4c659f2488d97637ff36ab5978c97968b9695949093909260a490920191878101910280838360005b838110156118cc5781810151838201526020016118b4565b50505050905001955050505050506000604051808303818588803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561193157600080fd5b8101908080516040519392919084600160201b82111561195057600080fd5b90830190602082018581111561196557600080fd5b82518660208202830111600160201b8211171561198157600080fd5b82525081516020918201928201910280838360005b838110156119ae578181015183820152602001611996565b505050509050016040525050506001825103815181106119ca57fe5b602002602001015191505092915050565b6001600160a01b0380831660009081526003602090815260408083205481516370a0823160e01b8152306004820152915193941692849284926370a082319260248083019392829003018186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b505190506001600160a01b03851673bebc44782c7db0a1a60cb6fe97d0b483032ff1c71415611b3257846001600160a01b0316634515cef360405180606001604052808b81526020018a815260200189815250866040518363ffffffff1660e01b81526004018083600360200280838360005b83811015611aea578181015183820152602001611ad2565b5050505090500182815260200192505050600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b50505050611bdf565b846001600160a01b031663029b2f3460405180608001604052808b81526020018a81526020018981526020016000815250866040518363ffffffff1660e01b81526004018083600460200280838360005b83811015611b9b578181015183820152602001611b83565b5050505090500182815260200192505050600060405180830381600087803b158015611bc657600080fd5b505af1158015611bda573d6000803e3d6000fd5b505050505b604080516370a0823160e01b81523060048201529051611c639183916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611c2b57600080fd5b505afa158015611c3f573d6000803e3d6000fd5b505050506040513d6020811015611c5557600080fd5b50519063ffffffff612d8916565b9250838311611cb9576040805162461bcd60e51b815260206004820152601f60248201527f4572726f72206c657373207468616e206d696e20706f6f6c20746f6b656e7300604482015290519081900360640190fd5b60008054611cdf90611cd7908690600160b01b900461ffff16612dcb565b6127106116fa565b600154909150611d02906001600160a01b0385811691168363ffffffff610e2116565b611d278a611d108684612d89565b6001600160a01b038616919063ffffffff610e2116565b5050509695505050505050565b600081611da45773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d8a57600080fd5b505af1158015611d9e573d6000803e3d6000fd5b50505050505b600254611dd69073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906001600160a01b03168563ffffffff610e7c16565b60025460408051638201aa3f60e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600482015260248101869052732260fac5e5542a773aa44fbcfedf7c193bc2c5996044820152600060648201819052600019608483015282516001600160a01b0390941693638201aa3f9360a4808501949193918390030190829087803b158015611e6657600080fd5b505af1158015611e7a573d6000803e3d6000fd5b505050506040513d6040811015611e9057600080fd5b50519392505050565b60006001600160a01b03851673fe18be6b3bd88a2d2a7f928d00292e7a9963cfc61480611ee257506001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c599145b80611f0957506001600160a01b03851673eb4c2781e4eba804ce9a9803c67d0893436bb27d145b80611f3057506001600160a01b038516730316eb71485b0ab14103307bf65a021042c6d380145b611f81576040805162461bcd60e51b815260206004820181905260248201527f4552523a20496e636f72726563742042544320546f6b656e2041646472657373604482015290519081900360640190fd5b611f9b6001600160a01b038616858563ffffffff610e7c16565b6001600160a01b0380851660009081526003602090815260408083205481516370a0823160e01b8152306004820152915194169384926370a082319260248082019391829003018186803b158015611ff257600080fd5b505afa158015612006573d6000803e3d6000fd5b505050506040513d602081101561201c57600080fd5b505190506001600160a01b038716732260fac5e5542a773aa44fbcfedf7c193bc2c5991415612231576001600160a01b0386167393054188d876f558f4a66b2ef1d97d16edf0895b141561210f57856001600160a01b0316630b4c7e4d60405180604001604052806000815260200188815250866040518363ffffffff1660e01b81526004018083600260200280838360005b838110156120c75781810151838201526020016120af565b5050505090500182815260200192505050600060405180830381600087803b1580156120f257600080fd5b505af1158015612106573d6000803e3d6000fd5b5050505061222c565b6001600160a01b038616734ca9b3063ec5866a4b82e437059d2c43d1be596f1415612184576040805180820182526000815260208082018890528251630b4c7e4d60e01b8152825160049091019081526001600160a01b038a1693630b4c7e4d939289929182918591908190849084906120af565b856001600160a01b0316634515cef36040518060600160405280600081526020018881526020016000815250866040518363ffffffff1660e01b81526004018083600360200280838360005b838110156121e85781810151838201526020016121d0565b5050505090500182815260200192505050600060405180830381600087803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050505b612446565b6001600160a01b03871673eb4c2781e4eba804ce9a9803c67d0893436bb27d1415612326576001600160a01b0386167393054188d876f558f4a66b2ef1d97d16edf0895b14156122cd5760408051808201825286815260006020808301919091528251630b4c7e4d60e01b8152825160049091019081526001600160a01b038a1693630b4c7e4d939289929182918591908190849084906120af565b604080516060808201835287825260006020808401829052838501919091529251634515cef360e01b8152825160049091019081526001600160a01b038a1693634515cef39392899291829185918190849084906121d0565b6001600160a01b038716730316eb71485b0ab14103307bf65a021042c6d380141561239d5760408051808201825286815260006020808301919091528251630b4c7e4d60e01b8152825160049091019081526001600160a01b038a1693630b4c7e4d939289929182918591908190849084906121d0565b856001600160a01b0316634515cef3604051806060016040528060008152602001600081526020018881525060006040518363ffffffff1660e01b81526004018083600360200280838360005b838110156124025781810151838201526020016123ea565b5050505090500182815260200192505050600060405180830381600087803b15801561242d57600080fd5b505af1158015612441573d6000803e3d6000fd5b505050505b604080516370a0823160e01b815230600482015290516124929183916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611c2b57600080fd5b92508383116124e8576040805162461bcd60e51b815260206004820152601f60248201527f4572726f72206c657373207468616e206d696e20706f6f6c20746f6b656e7300604482015290519081900360640190fd5b6125026001600160a01b038316898563ffffffff610e2116565b505095945050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116f490859061153c565b6000826001600160a01b0316846001600160a01b0316141561258a57508061114f565b6125b86001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d8463ffffffff610e7c16565b6001600160a01b03841673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214612a81576001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146128585760408051600380825260808201909252606091602082018380388339019050509050848160008151811061263057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061267257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816002815181106126a057fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b83811015612749578181015183820152602001612731565b505050509050019650505050505050600060405180830381600087803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156127af57600080fd5b8101908080516040519392919084600160201b8211156127ce57600080fd5b9083019060208201858111156127e357600080fd5b82518660208202830111600160201b821117156127ff57600080fd5b82525081516020918201928201910280838360005b8381101561282c578181015183820152602001612814565b5050505090500160405250505060018251038151811061284857fe5b6020026020010151915050612a7c565b6040805160028082526060808301845292602083019080388339019050509050848160008151811061288657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106128c857fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b83811015612971578181015183820152602001612959565b505050509050019650505050505050600060405180830381600087803b15801561299a57600080fd5b505af11580156129ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129d757600080fd5b8101908080516040519392919084600160201b8211156129f657600080fd5b908301906020820185811115612a0b57600080fd5b82518660208202830111600160201b82111715612a2757600080fd5b82525081516020918201928201910280838360005b83811015612a54578181015183820152602001612a3c565b50505050905001604052505050600182510381518110612a7057fe5b60200260200101519150505b61114f565b604080516002808252606080830184529260208301908038833901905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110612ac357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110612af157fe5b6001600160a01b039092166020928302919091018201526040516338ed173960e01b8152600481018581526001602483018190523060648401819052600f60fc1b6084850181905260a060448601908152875160a48701528751737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978c978b9695949093909260c490920191878101910280838360005b83811015612b9a578181015183820152602001612b82565b505050509050019650505050505050600060405180830381600087803b158015612bc357600080fd5b505af1158015612bd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612c0057600080fd5b8101908080516040519392919084600160201b821115612c1f57600080fd5b908301906020820185811115612c3457600080fd5b82518660208202830111600160201b82111715612c5057600080fd5b82525081516020918201928201910280838360005b83811015612c7d578181015183820152602001612c65565b50505050905001604052505050600182510381518110612c9957fe5b60200260200101519150509392505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612cdf57508115155b949350505050565b60008183612d735760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d38578181015183820152602001612d20565b50505050905090810190601f168015612d655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612d7f57fe5b0495945050505050565b600061173c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e24565b600082612dda5750600061173f565b82820282848281612de757fe5b041461173c5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea56021913960400191505060405180910390fd5b60008184841115612e765760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612d38578181015183820152602001612d20565b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582063c0c398896ed1a929adf1eb442c4c8fa84c5f6ef74e6cea59b1b95585d93d7864736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _goodwill (uint16): 0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
27141:21298:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48148:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48148:86:0;;;:::i;27306:85::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27306:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;27306:85:0;;;;;;;;;;;;;;48304:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48304:94:0;;;:::i;47492:198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47492:198:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47492:198:0;-1:-1:-1;;;;;47492:198:0;;:::i;27277:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27277:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4841:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4841:140:0;;;:::i;27243:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27243:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;47944:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47944:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47944:164:0;-1:-1:-1;;;;;47944:164:0;;:::i;4030:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4030:79:0;;;:::i;4396:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4396:94:0;;;:::i;31547:1917::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31547:1917:0;;;:::i;47698:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47698:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47698:238:0;;;;:::i;3525:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3525:29:0;;;:::i;33472:1439::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;33472:1439:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47194:290;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47194:290:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47194:290:0;-1:-1:-1;;;;;47194:290:0;;:::i;5136:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5136:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5136:117:0;-1:-1:-1;;;;;5136:117:0;;:::i;48148:86::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;48219:7;;;-1:-1:-1;;;;48208:18:0;;-1:-1:-1;;;48219:7:0;;;;;;48218:8;48208:18;;;;;;48148:86::o;27306:85::-;;;-1:-1:-1;;;;;27306:85:0;;:::o;48304:94::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;48352:6;;;:38;;-1:-1:-1;;;;;48352:6:0;;;;;;;;;48368:21;48352:38;;;;;48368:21;;48352:38;:6;:38;48368:21;48352:6;:38;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48352:38:0;48304:94::o;47492:198::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;47586:38;;;-1:-1:-1;;;47586:38:0;;47618:4;47586:38;;;;;;47572:11;;-1:-1:-1;;;;;47586:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;47586:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47586:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47586:38:0;47670:6;;47586:38;;-1:-1:-1;47635:47:0;;-1:-1:-1;;;;;47635:34:0;;;;47670:6;;;;47586:38;47635:47;:34;:47;:::i;:::-;4299:1;47492:198;:::o;27277:22::-;;;-1:-1:-1;;;27277:22:0;;;;;:::o;4841:140::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;4940:1;4924:6;;4903:40;;4924:6;;;;-1:-1:-1;;;;;4924:6:0;;4903:40;;4940:1;;4903:40;4971:1;4954:19;;-1:-1:-1;;;;;;4954:19:0;;;4841:140::o;27243:27::-;;;-1:-1:-1;;;27243:27:0;;;;;:::o;47944:164::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;48060:16;:40;;-1:-1:-1;;;;;;48060:40:0;-1:-1:-1;;;;;48060:40:0;;;;;;;;;;47944:164::o;4030:79::-;4068:7;4095:6;;;;-1:-1:-1;;;;;4095:6:0;;4030:79::o;4396:94::-;4436:4;4476:6;;;;;-1:-1:-1;;;;;4476:6:0;4460:12;:10;:12::i;:::-;-1:-1:-1;;;;;4460:22:0;;4453:29;;4396:94;:::o;31547:1917::-;31615:111;27774:42;28090;-1:-1:-1;;31615:111:0;:35;:111;:::i;:::-;31737:71;27774:42;28310;-1:-1:-1;;31737:71:0;:35;:71;:::i;:::-;31819:111;27774:42;28530;-1:-1:-1;;31819:111:0;:35;:111;:::i;:::-;31941:110;27774:42;28752;-1:-1:-1;;31941:110:0;:35;:110;:::i;:::-;32062:112;27774:42;28975;-1:-1:-1;;32062:112:0;:35;:112;:::i;:::-;32214;27876:42;28090;-1:-1:-1;;32214:112:0;:36;:112;:::i;:::-;32337:109;27876:42;28310;-1:-1:-1;;32337:109:0;:36;:109;:::i;:::-;32457:112;27876:42;28530;-1:-1:-1;;32457:112:0;:36;:112;:::i;:::-;32580:111;27876:42;28752;-1:-1:-1;;32580:111:0;:36;:111;:::i;:::-;32702:113;27876:42;28975;-1:-1:-1;;32702:113:0;:36;:113;:::i;:::-;32855:112;27978:42;28090;-1:-1:-1;;32855:112:0;:36;:112;:::i;:::-;32978:109;27978:42;28310;-1:-1:-1;;32978:109:0;:36;:109;:::i;:::-;33098:112;27978:42;28530;-1:-1:-1;;33098:112:0;:36;:112;:::i;:::-;33221:111;27978:42;28752;-1:-1:-1;;33221:111:0;:36;:111;:::i;:::-;33343:113;27978:42;28975;-1:-1:-1;;33343:113:0;:36;:113;:::i;:::-;31547:1917::o;47698:238::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;47834:5;47818:13;:21;;;47774:119;;;;;-1:-1:-1;;;47774:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47904:8;:24;;;;;;-1:-1:-1;;;47904:24:0;-1:-1:-1;;;;47904:24:0;;;;;;;;;47698:238::o;3525:29::-;;;;;;-1:-1:-1;;;;;3525:29:0;;:::o;33472:1439::-;33720:23;31434:7;;-1:-1:-1;;;31434:7:0;;;;31430:102;;;31458:28;;;-1:-1:-1;;;31458:28:0;;;;;;;;;;;;-1:-1:-1;;;31458:28:0;;;;;;;;;;;;;;31430:102;-1:-1:-1;;;;;33778:53:0;;28090:42;33778:53;;:124;;-1:-1:-1;;;;;;33852:50:0;;28310:42;33852:50;33778:124;:198;;;-1:-1:-1;;;;;;33923:53:0;;28530:42;33923:53;33778:198;:271;;;-1:-1:-1;;;;;;33997:52:0;;28752:42;33997:52;33778:271;:346;;;-1:-1:-1;;;;;;34070:54:0;;28975:42;34070:54;33778:346;:422;;;-1:-1:-1;;;;;;34145:55:0;;29201:42;34145:55;33778:422;:496;;;-1:-1:-1;;;;;;34221:53:0;;29426:42;34221:53;33778:496;:570;;;-1:-1:-1;;;;;;34295:53:0;;29649:42;34295:53;33778:570;33756:646;;;;;-1:-1:-1;;;33756:646:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34419:35:0;;34415:489;;34489:137;34520:14;34553:25;34597:14;34489:12;:137::i;:::-;34471:155;;34415:489;;;34677:215;34710:14;34743:21;34783:25;34827:17;34863:14;34677;:215::i;:::-;34659:233;;34415:489;33472:1439;;;;;;;:::o;47194:290::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47296:29:0;;;;;;:89;;-1:-1:-1;47373:11:0;;-1:-1:-1;;;;;47346:39:0;;;47373:11;;47346:39;;47296:89;47274:151;;;;;-1:-1:-1;;;47274:151:0;;;;;;;;;;;;-1:-1:-1;;;47274:151:0;;;;;;;;;;;;;;;47436:11;:40;;-1:-1:-1;;;;;;47436:40:0;-1:-1:-1;;;;;47436:40:0;;;;;;;;;;47194:290::o;5136:117::-;4242:9;:7;:9::i;:::-;4234:54;;;;;-1:-1:-1;;;4234:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4234:54:0;;;;;;;;;;;;;;;5217:28;5236:8;5217:18;:28::i;20203:247::-;20373:58;;;-1:-1:-1;;;;;20373:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20373:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20320:122:0;;20353:5;;20320:18;:122::i;:::-;20203:247;;;:::o;2722:98::-;2802:10;2722:98;:::o;20750:706::-;21168:10;;;21167:62;;-1:-1:-1;21184:39:0;;;-1:-1:-1;;;21184:39:0;;21208:4;21184:39;;;;-1:-1:-1;;;;;21184:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;21184:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21184:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21184:39:0;:44;21167:62;21145:166;;;;-1:-1:-1;;;21145:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21375:62;;;-1:-1:-1;;;;;21375:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21375:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21322:126:0;;21355:5;;21322:18;:126::i;34919:1288::-;35092:23;31434:7;;-1:-1:-1;;;31434:7:0;;;;31430:102;;;31458:28;;;-1:-1:-1;;;31458:28:0;;;;;;;;;;;;-1:-1:-1;;;31458:28:0;;;;;;;;;;;;;;31430:102;35148:1;35136:9;:13;35128:42;;;;;-1:-1:-1;;;35128:42:0;;;;;;;;;;;;-1:-1:-1;;;35128:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35201:53:0;;29426:42;35201:53;;;;:125;;-1:-1:-1;;;;;;35271:55:0;;29201:42;35271:55;;35201:125;:195;;;;-1:-1:-1;;;;;;35343:53:0;;29649:42;35343:53;;35201:195;35183:1017;;;35423:17;35443:47;27774:42;35471:18;35472:9;35487:1;35471:18;:15;:18;:::i;:::-;35443:10;:47::i;:::-;35423:67;-1:-1:-1;35505:18:0;35526:97;27876:42;35590:18;35591:9;35606:1;35590:18;:15;:18;:::i;35526:97::-;35505:118;;35656:214;35687:14;35720:9;35748:10;35777:1;35797:25;35841:14;35656:12;:214::i;:::-;35638:232;;35183:1017;;;;;35903:18;35924:27;35934:9;35945:5;35924:9;:27::i;:::-;35903:48;;35984:204;36018:14;30078:42;36086:25;36130:10;36159:14;35984:15;:204::i;:::-;35966:222;;35183:1017;;34919:1288;;;;;:::o;36215:3163::-;36466:23;31434:7;;-1:-1:-1;;;31434:7:0;;;;31430:102;;;31458:28;;;-1:-1:-1;;;31458:28:0;;;;;;;;;;;;-1:-1:-1;;;31458:28:0;;;;;;;;;;;;;;31430:102;36530:1;36510:17;:21;36502:52;;;;;-1:-1:-1;;;36502:52:0;;;;;;;;;;;;-1:-1:-1;;;36502:52:0;;;;;;;;;;;;;;;36567:142;-1:-1:-1;;;;;36567:46:0;;36628:10;36661:4;36681:17;36567:142;:46;:142;:::i;:::-;-1:-1:-1;;;;;36740:53:0;;29426:42;36740:53;;:125;;-1:-1:-1;;;;;;36810:55:0;;29201:42;36810:55;36740:125;:195;;;-1:-1:-1;;;;;;36882:53:0;;29649:42;36882:53;36740:195;36722:2649;;;-1:-1:-1;;;;;36984:41:0;;30078:42;36984:41;;:105;;-1:-1:-1;;;;;;37046:43:0;;30182:42;37046:43;36984:105;:167;;;-1:-1:-1;;;;;;37110:41:0;;30284:42;37110:41;36984:167;:229;;;-1:-1:-1;;;;;;37172:41:0;;30386:42;37172:41;36984:229;36962:1252;;;37266:240;37304:14;37341:21;37385:25;37433:17;37473:14;37266:15;:240::i;:::-;37248:258;;36962:1252;;;37597:18;37618:154;37653:21;29974:42;37736:17;37618:12;:154::i;:::-;37597:175;;37841:18;37862:27;37872:10;37884:4;37862:9;:27::i;:::-;37841:48;;37970:228;38008:14;30078:42;38084:25;38132:10;38165:14;37970:15;:228::i;:::-;37952:246;;36962:1252;;;36722:2649;;;38246:17;;;-1:-1:-1;;;;;38350:40:0;;27774:42;38350:40;38346:756;;;38423:17;38411:29;;38346:756;;;-1:-1:-1;;;;;38466:41:0;;27876:42;38466:41;38462:640;;;38541:17;38528:30;;38462:640;;;-1:-1:-1;;;;;38584:41:0;;27978:42;38584:41;38580:522;;;-1:-1:-1;38659:17:0;38580:522;;;38729:162;38764:21;27774:42;38846:26;38847:17;38870:1;38846:26;:23;:26;:::i;:::-;38729:12;:162::i;:::-;38717:174;-1:-1:-1;38923:163:0;38958:21;27876:42;39041:26;39042:17;39065:1;39041:26;:23;:26;:::i;38923:163::-;38910:176;;38580:522;39136:223;39167:14;39200:9;39228:10;39257;39286:25;39330:14;39136:12;:223::i;:::-;39118:241;36215:3163;-1:-1:-1;;;;;;;;;36215:3163:0:o;5359:274::-;-1:-1:-1;;;;;5455:22:0;;5433:110;;;;-1:-1:-1;;;5433:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5580:6;;;5559:38;;-1:-1:-1;;;;;5559:38:0;;;;5580:6;;;;;;5559:38;;;5608:6;:17;;-1:-1:-1;;;;;5608:17:0;;;;;-1:-1:-1;;;;;;5608:17:0;;;;;;;;;5359:274::o;22813:1176::-;23417:27;23425:5;-1:-1:-1;;;;;23417:25:0;;:27::i;:::-;23409:71;;;;;-1:-1:-1;;;23409:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23554:12;23568:23;23603:5;-1:-1:-1;;;;;23595:19:0;23615:4;23595:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23595:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23553:67:0;;;;23639:7;23631:52;;;;;-1:-1:-1;;;23631:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23700:17;;:21;23696:286;;23873:10;23862:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23862:30:0;23836:134;;;;-1:-1:-1;;;23836:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22813:1176;;;;:::o;8878:132::-;8936:7;8963:39;8967:1;8970;8963:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8956:46;;8878:132;;;;;:::o;44683:595::-;44791:20;-1:-1:-1;;;;;44851:41:0;;29974:42;44851:41;;44829:115;;;;;-1:-1:-1;;;44829:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44981:16;;;44995:1;44981:16;;;44957:21;44981:16;;;;;44957:21;44981:16;;;;;105:10:-1;44981:16:0;88:34:-1;136:17;;-1:-1;44981:16:0;44957:40;;29974:42;45008:4;45013:1;45008:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;45008:26:0;;;-1:-1:-1;;;;;45008:26:0;;;;;45055:21;45045:4;45050:1;45045:7;;;;;;;;-1:-1:-1;;;;;45045:31:0;;;:7;;;;;;;;;;:31;45102:151;;-1:-1:-1;;;45102:151:0;;45171:1;45102:151;;;;;;45214:4;45102:151;;;;;;-1:-1:-1;;;45102:151:0;;;;;;;;;;;;;;;;;;;;;27664:42;;45102:35;;45144:11;;45171:1;45187:4;;45214;30482:66;45102:151;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45102:151:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45102:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45102:151:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45102:151:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45102:151:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;45102:151:0;;421:4:-1;412:14;;;;45102:151:0;;;;;412:14:-1;45102:151:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45102:151:0;;;;;;;;;;;45268:1;45254:4;:11;:15;45102:168;;;;;;;;;;;;;;45087:183;;44683:595;;;;;:::o;42585:1592::-;-1:-1:-1;;;;;42946:41:0;;;42828:23;42946:41;;;:14;:41;;;;;;;;;43020:49;;-1:-1:-1;;;43020:49:0;;43063:4;43020:49;;;;;;42828:23;;42946:41;;42828:23;;42946:41;;43020:34;;:49;;;;;42946:41;43020:49;;;;;42946:41;43020:49;;;5:2:-1;;;;30:1;27;20:12;5:2;43020:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43020:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43020:49:0;;-1:-1:-1;;;;;;43086:54:0;;28975:42;43086:54;43082:442;;;43177:25;-1:-1:-1;;;;;43157:60:0;;:162;;;;;;;;43237:9;43157:162;;;;43248:10;43157:162;;;;43260:10;43157:162;;;43290:14;43157:162;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43157:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43157:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43157:162:0;;;;43082:442;;;43367:25;-1:-1:-1;;;;;43352:55:0;;:160;;;;;;;;43427:9;43352:160;;;;43438:10;43352:160;;;;43450:10;43352:160;;;;43462:1;43352:160;;;43483:14;43352:160;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43352:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43352:160:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43352:160:0;;;;43082:442;43555:49;;;-1:-1:-1;;;43555:49:0;;43598:4;43555:49;;;;;;43554:82;;43624:11;;-1:-1:-1;;;;;43555:34:0;;;;;:49;;;;;;;;;;;;;;:34;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;43555:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43555:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43555:49:0;;43554:82;:69;:82;:::i;:::-;43536:100;;43687:14;43669:15;:32;43647:113;;;;;-1:-1:-1;;;43647:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43773:23;43856:8;;43799:97;;43826:39;;43839:15;;-1:-1:-1;;;43856:8:0;;;;43826:12;:39::i;:::-;43880:5;43799:12;:97::i;:::-;43961:16;;43773:123;;-1:-1:-1;43909:109:0;;-1:-1:-1;;;;;43909:37:0;;;;43961:16;43773:123;43909:109;:37;:109;:::i;:::-;44031:138;44083:14;44112:46;44125:15;44142;44112:12;:46::i;:::-;-1:-1:-1;;;;;44031:37:0;;;:138;;:37;:138;:::i;:::-;42585:1592;;;;;;;;;;;:::o;44185:490::-;44276:20;44319:8;44314:67;;29974:42;-1:-1:-1;;;;;44329:31:0;;44367:11;44329:52;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44329:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44329:52:0;;;;;44314:67;44439:11;;44394:71;;29974:42;;-1:-1:-1;;;;;44439:11:0;44453;44394:71;:36;:71;:::i;:::-;44497:11;;:170;;;-1:-1:-1;;;44497:170:0;;29974:42;44497:170;;;;;;;;;;30078:42;44497:170;;;;:11;:170;;;;;;-1:-1:-1;;44497:170:0;;;;;;-1:-1:-1;;;;;44497:11:0;;;;:29;;:170;;;;;;;;;;;;;;;:11;:170;;;5:2:-1;;;;30:1;27;20:12;5:2;44497:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44497:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44497:170:0;;44185:490;-1:-1:-1;;;44185:490:0:o;39386:3191::-;39628:23;-1:-1:-1;;;;;39686:44:0;;30284:42;39686:44;;:109;;-1:-1:-1;;;;;;39751:44:0;;30078:42;39751:44;39686:109;:176;;;-1:-1:-1;;;;;;39816:46:0;;30182:42;39816:46;39686:176;:241;;;-1:-1:-1;;;;;;39883:44:0;;30386:42;39883:44;39686:241;39664:323;;;;;-1:-1:-1;;;39664:323:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:130;-1:-1:-1;;;;;40000:44:0;;40059:25;40099:20;40000:130;:44;:130;:::i;:::-;-1:-1:-1;;;;;40194:41:0;;;40149:32;40194:41;;;:14;:41;;;;;;;;;40268:81;;-1:-1:-1;;;40268:81:0;;40333:4;40268:81;;;;;;40194:41;;;;;40268:42;;:81;;;;;;;;;;;40194:41;40268:81;;;5:2:-1;;;;30:1;27;20:12;5:2;40268:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40268:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40268:81:0;;-1:-1:-1;;;;;;40412:44:0;;30078:42;40412:44;40408:1767;;;-1:-1:-1;;;;;40477:55:0;;29201:42;40477:55;40473:731;;;40574:25;-1:-1:-1;;;;;40553:61:0;;:165;;;;;;;;40638:1;40553:165;;;;40641:20;40553:165;;;40685:14;40553:165;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40553:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40553:165:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40553:165:0;;;;40473:731;;;-1:-1:-1;;;;;40744:53:0;;29649:42;40744:53;40740:464;;;40818:163;;;;;;;;-1:-1:-1;40818:163:0;;;;;;;;;;;-1:-1:-1;;;40818:163:0;;84:18:-1;;40818:163:0;;;;64:39:-1;;;-1:-1;;;;;40818:59:0;;;;;:163;40948:14;;40818:163;;;;;;;;;;;;8:100:-1;;40740:464:0;41041:25;-1:-1:-1;;;;;41022:59:0;;:166;;;;;;;;41105:1;41022:166;;;;41108:20;41022:166;;;;41130:1;41022:166;;;41155:14;41022:166;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41022:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41022:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41022:166:0;;;;40740:464;40408:1767;;;-1:-1:-1;;;;;41225:46:0;;30182:42;41225:46;41221:954;;;-1:-1:-1;;;;;41292:55:0;;29201:42;41292:55;41288:468;;;41368:165;;;;;;;;;;;-1:-1:-1;41368:165:0;;;;;;;;;;-1:-1:-1;;;41368:165:0;;84:18:-1;;41368:165:0;;;;64:39:-1;;;-1:-1;;;;;41368:61:0;;;;;:165;41500:14;;41368:165;;;;;;;;;;;;8:100:-1;;41288:468:0;41574:166;;;;;;;;;;;;-1:-1:-1;41574:166:0;;;;;;;;;;;;;;;;-1:-1:-1;;;41574:166:0;;84:18:-1;;41574:166:0;;;;64:39:-1;;;-1:-1;;;;;41574:59:0;;;;;:166;41707:14;;41574:166;;;;;;;;;;;8:100:-1;;41221:954:0;-1:-1:-1;;;;;41777:44:0;;30386:42;41777:44;41773:402;;;41838:151;;;;;;;;;;;-1:-1:-1;41838:151:0;;;;;;;;;;-1:-1:-1;;;41838:151:0;;84:18:-1;;41838:151:0;;;;64:39:-1;;;-1:-1;;;;;41838:59:0;;;;;:151;41960:14;;41838:151;;;;;;;;;;;;8:100:-1;;41773:402:0;42041:25;-1:-1:-1;;;;;42022:59:0;;:141;;;;;;;;42101:1;42022:141;;;;42104:1;42022:141;;;;42107:20;42022:141;;;42147:1;42022:141;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42022:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42022:141:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42022:141:0;;;;41773:402;42218:57;;;-1:-1:-1;;;42218:57:0;;42269:4;42218:57;;;;;;42203:114;;42305:11;;-1:-1:-1;;;;;42218:42:0;;;;;:57;;;;;;;;;;;;;;:42;:57;;;5:2:-1;;;;30:1;27;20:12;42203:114:0;42185:132;;42368:14;42350:15;:32;42328:113;;;;;-1:-1:-1;;;42328:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42454:115;-1:-1:-1;;;;;42454:45:0;;42514:14;42543:15;42454:115;:45;:115;:::i;:::-;39386:3191;;;;;;;;;:::o;20458:284::-;20655:68;;;-1:-1:-1;;;;;20655:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20655:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20602:132:0;;20635:5;;20602:18;:132::i;45286:1900::-;45450:19;45515:23;-1:-1:-1;;;;;45486:52:0;:25;-1:-1:-1;;;;;45486:52:0;;45482:104;;;-1:-1:-1;45562:12:0;45555:19;;45482:104;45598:120;-1:-1:-1;;;;;45598:45:0;;27664:42;45695:12;45598:120;:45;:120;:::i;:::-;-1:-1:-1;;;;;45735:45:0;;29974:42;45735:45;45731:1448;;-1:-1:-1;;;;;45801:43:0;;29974:42;45801:43;45797:977;;45889:16;;;45903:1;45889:16;;;;;;;;;45865:21;;45889:16;;;45865:21;;105:10:-1;45889:16:0;88:34:-1;136:17;;-1:-1;45889:16:0;45865:40;;45934:25;45924:4;45929:1;45924:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;45924:35:0;;;-1:-1:-1;;;;;45924:35:0;;;;;29974:42;45978:4;45983:1;45978:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;45978:26:0;;;-1:-1:-1;;;;;45978:26:0;;;;;46033:23;46023:4;46028:1;46023:7;;;;;;;;-1:-1:-1;;;;;46023:33:0;;;:7;;;;;;;;;;:33;46089:210;;-1:-1:-1;;;46089:210:0;;;;;;;;46185:1;46089:210;;;;;;46244:4;46089:210;;;;;;-1:-1:-1;;;46089:210:0;;;;;;;;;;;;;;;;;;;;;27664:42;;46089:38;;46150:12;;46209:4;;46244;30482:66;46089:210;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46089:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46089:210:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46089:210:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46089:210:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;46089:210:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46089:210:0;;421:4:-1;412:14;;;;46089:210:0;;;;;412:14:-1;46089:210:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46089:210:0;;;;;;;;;;;46314:1;46300:4;:11;:15;46089:227;;;;;;;;;;;;;;46075:241;;45797:977;;;;46381:16;;;46395:1;46381:16;;;46357:21;46381:16;;;;;46357:21;46381:16;;;;;105:10:-1;46381:16:0;88:34:-1;136:17;;-1:-1;46381:16:0;46357:40;;46426:25;46416:4;46421:1;46416:7;;;;;;;;;;;;;:35;-1:-1:-1;;;;;46416:35:0;;;-1:-1:-1;;;;;46416:35:0;;;;;29974:42;46470:4;46475:1;46470:7;;;;;;;;-1:-1:-1;;;;;46470:26:0;;;:7;;;;;;;;;;:26;46531:210;;-1:-1:-1;;;46531:210:0;;;;;;;;46627:1;46531:210;;;;;;46686:4;46531:210;;;;;;-1:-1:-1;;;46531:210:0;;;;;;;;;;;;;;;;;;;;;27664:42;;46531:38;;46592:12;;46651:4;;46686;30482:66;46531:210;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46531:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46531:210:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46531:210:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46531:210:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;46531:210:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46531:210:0;;421:4:-1;412:14;;;;46531:210:0;;;;;412:14:-1;46531:210:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46531:210:0;;;;;;;;;;;46756:1;46742:4;:11;:15;46531:227;;;;;;;;;;;;;;46517:241;;45797:977;;45731:1448;;;46830:16;;;46844:1;46830:16;;;46806:21;46830:16;;;;;46806:21;46830:16;;;;;105:10:-1;46830:16:0;88:34:-1;136:17;;-1:-1;46830:16:0;46806:40;;29974:42;46861:4;46866:1;46861:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;46861:26:0;;;-1:-1:-1;;;;;46861:26:0;;;;;46912:23;46902:4;46907:1;46902:7;;;;;;;;-1:-1:-1;;;;;46902:33:0;;;:7;;;;;;;;;;:33;46964:186;;-1:-1:-1;;;46964:186:0;;;;;;;;47052:1;46964:186;;;;;;47103:4;46964:186;;;;;;-1:-1:-1;;;46964:186:0;;;;;;;;;;;;;;;;;;;;;27664:42;;46964:38;;47021:12;;47072:4;;47103;30482:66;46964:186;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46964:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46964:186:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46964:186:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46964:186:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;46964:186:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46964:186:0;;421:4:-1;412:14;;;;46964:186:0;;;;;412:14:-1;46964:186:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46964:186:0;;;;;;;;;;;47165:1;47151:4;:11;:15;46964:203;;;;;;;;;;;;;;46950:217;;45731:1448;45286:1900;;;;;:::o;17092:659::-;17152:4;17651:20;;17481:66;17700:23;;;;;;:42;;-1:-1:-1;17727:15:0;;;17700:42;17692:51;17092:659;-1:-1:-1;;;;17092:659:0:o;9540:379::-;9660:7;9762:12;9755:5;9747:28;;;;-1:-1:-1;;;9747:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9747:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9786:9;9802:1;9798;:5;;;;;;;9540:379;-1:-1:-1;;;;;9540:379:0:o;6989:136::-;7047:7;7074:43;7078:1;7081;7074:43;;;;;;;;;;;;;;;;;:3;:43::i;7939:471::-;7997:7;8242:6;8238:47;;-1:-1:-1;8272:1:0;8265:8;;8238:47;8309:5;;;8313:1;8309;:5;:1;8333:5;;;;;:10;8325:56;;;;-1:-1:-1;;;8325:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7462:226;7582:7;7618:12;7610:6;;;;7602:29;;;;-1:-1:-1;;;7602:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7602:29:0;-1:-1:-1;;;7654:5:0;;;7462:226::o
Swarm Source
bzzr://63c0c398896ed1a929adf1eb442c4c8fa84c5f6ef74e6cea59b1b95585d93d78
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.