More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 19,152 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Zap In | 13038944 | 1194 days ago | IN | 0 ETH | 0.0223785 | ||||
Transfer Ownersh... | 12857933 | 1222 days ago | IN | 0 ETH | 0.00100674 | ||||
Zap In | 12656337 | 1253 days ago | IN | 0 ETH | 0.00600664 | ||||
Zap In | 12626346 | 1258 days ago | IN | 0.01 ETH | 0.00192987 | ||||
Zap In | 12535227 | 1272 days ago | IN | 0 ETH | 0.00555791 | ||||
Zap In | 12515503 | 1275 days ago | IN | 0 ETH | 0.00840828 | ||||
Zap In | 12407488 | 1292 days ago | IN | 0.5 ETH | 0.21449723 | ||||
Zap In | 12360049 | 1299 days ago | IN | 0 ETH | 0.0104545 | ||||
Zap In | 12356916 | 1300 days ago | IN | 0 ETH | 0.00871317 | ||||
Zap In | 12333239 | 1303 days ago | IN | 0 ETH | 0.01662196 | ||||
Zap In | 12204691 | 1323 days ago | IN | 0.01 ETH | 0.00039805 | ||||
Zap In | 12118666 | 1336 days ago | IN | 0 ETH | 0.04483919 | ||||
Zap In | 12110686 | 1338 days ago | IN | 0 ETH | 0.05229339 | ||||
Zap In | 12108435 | 1338 days ago | IN | 0 ETH | 0.12032119 | ||||
Zap In | 12101190 | 1339 days ago | IN | 0 ETH | 0.05660872 | ||||
Zap In | 12097268 | 1340 days ago | IN | 0 ETH | 0.05498643 | ||||
Zap In | 12096868 | 1340 days ago | IN | 0 ETH | 0.08123256 | ||||
Zap In | 12096270 | 1340 days ago | IN | 0 ETH | 0.0669864 | ||||
Zap In | 12095632 | 1340 days ago | IN | 0 ETH | 0.06927864 | ||||
Zap In | 12093551 | 1340 days ago | IN | 0 ETH | 0.05691685 | ||||
Zap In | 12093355 | 1340 days ago | IN | 0 ETH | 0.05497487 | ||||
Zap In | 12036720 | 1349 days ago | IN | 0 ETH | 0.04729596 | ||||
Zap In | 12032541 | 1350 days ago | IN | 1.45 ETH | 0.00231135 | ||||
Transfer | 12008940 | 1353 days ago | IN | 0.0001 ETH | 0.001512 | ||||
Zap In | 11998526 | 1355 days ago | IN | 0.3 ETH | 0.07162441 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12626346 | 1258 days ago | 0 ETH | ||||
12626346 | 1258 days ago | 0 ETH | ||||
12626346 | 1258 days ago | 0.01 ETH | ||||
12407488 | 1292 days ago | 0.00000366 ETH | ||||
12407488 | 1292 days ago | 0.00000366 ETH | ||||
12407488 | 1292 days ago | 0.5 ETH | ||||
12204691 | 1323 days ago | 0 ETH | ||||
12204691 | 1323 days ago | 0 ETH | ||||
12204691 | 1323 days ago | 0.01 ETH | ||||
12032541 | 1350 days ago | 0.04056915 ETH | ||||
12032541 | 1350 days ago | 0.04056915 ETH | ||||
12032541 | 1350 days ago | 1.45 ETH | ||||
11998526 | 1355 days ago | 0 ETH | ||||
11998526 | 1355 days ago | 0 ETH | ||||
11998526 | 1355 days ago | 0.3 ETH | ||||
11137302 | 1487 days ago | 2 wei | ||||
11137302 | 1487 days ago | 2 wei | ||||
11137302 | 1487 days ago | 0.00000001 ETH | ||||
11137281 | 1487 days ago | 1 wei | ||||
11137281 | 1487 days ago | 1 wei | ||||
11137281 | 1487 days ago | 0.0000001 ETH | ||||
11137247 | 1487 days ago | 1 wei | ||||
11137247 | 1487 days ago | 1 wei | ||||
11137247 | 1487 days ago | 0.00001 ETH | ||||
11122117 | 1489 days ago | 0 ETH |
Loading...
Loading
Contract Name:
UniswapV2_ZapIn_General_V2_3
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-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 Uniswap V2 pools using ETH or any ERC20 Token. // SPDX-License-Identifier: GPLv2 // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/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" ); } } } // File: contracts\UniswapV2\UniswapV2_ETH_ERC_Zap_In_V3.sol // File: UniswapV2Router.sol pragma solidity 0.5.12; interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); 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); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); 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); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); 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); } // 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: 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; } } // import "@uniswap/lib/contracts/libraries/Babylonian.sol"; library Babylonian { function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } interface IUniswapV1Factory { function getExchange(address token) external view returns (address exchange); } interface IUniswapV2Factory { function getPair(address tokenA, address tokenB) external view returns (address); } interface IUniswapExchange { // converting ERC20 to ERC20 and transfer function tokenToTokenTransferInput( uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr ) external returns (uint256 tokens_bought); function tokenToTokenSwapInput( uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr ) external returns (uint256 tokens_bought); function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought); function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought); function tokenToEthTransferInput( uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient ) external returns (uint256 eth_bought); function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought); function ethToTokenTransferInput( uint256 min_tokens, uint256 deadline, address recipient ) external payable returns (uint256 tokens_bought); function balanceOf(address _owner) external view returns (uint256); function transfer(address _to, uint256 _value) external returns (bool); function transferFrom( address from, address to, uint256 tokens ) external returns (bool success); } interface IUniswapV2Pair { function token0() external pure returns (address); function token1() external pure returns (address); function getReserves() external view returns ( uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast ); } contract UniswapV2_ZapIn_General_V2_3 is ReentrancyGuard, Ownable { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; bool public stopped = false; uint16 public goodwill; address private constant zgoodwillAddress = 0xE737b6AfEC2320f616297e59445b60a11e3eF75F; IUniswapV2Router02 private constant uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); IUniswapV1Factory private constant UniSwapV1FactoryAddress = IUniswapV1Factory( 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95 ); IUniswapV2Factory private constant UniSwapV2FactoryAddress = IUniswapV2Factory( 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f ); address private constant wethTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; constructor(uint16 _goodwill) public { goodwill = _goodwill; } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } /** @notice This function is used to invest in given Uniswap V2 pair through ETH/ERC20 Tokens @param _FromTokenContractAddress The ERC20 token used for investment (address(0x00) if ether) @param _ToUnipoolToken0 The Uniswap V2 pair token0 address @param _ToUnipoolToken1 The Uniswap V2 pair token1 address @param _amount The amount of fromToken to invest @param _minPoolTokens Reverts if less tokens received than this @return Amount of LP bought */ function ZapIn( address _toWhomToIssue, address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount, uint256 _minPoolTokens ) public payable nonReentrant stopInEmergency returns (uint256) { uint256 toInvest; if (_FromTokenContractAddress == address(0)) { require(msg.value > 0, "Error: ETH not sent"); toInvest = msg.value; } else { require(msg.value == 0, "Error: ETH sent"); require(_amount > 0, "Error: Invalid ERC amount"); IERC20(_FromTokenContractAddress).safeTransferFrom( msg.sender, address(this), _amount ); toInvest = _amount; } uint256 LPBought = _performZapIn( _toWhomToIssue, _FromTokenContractAddress, _ToUnipoolToken0, _ToUnipoolToken1, toInvest ); require(LPBought >= _minPoolTokens, "ERR: High Slippage"); //get pair address address _ToUniPoolAddress = UniSwapV2FactoryAddress.getPair( _ToUnipoolToken0, _ToUnipoolToken1 ); //transfer goodwill uint256 goodwillPortion = _transferGoodwill( _ToUniPoolAddress, LPBought ); IERC20(_ToUniPoolAddress).safeTransfer( _toWhomToIssue, SafeMath.sub(LPBought, goodwillPortion) ); return SafeMath.sub(LPBought, goodwillPortion); } function _performZapIn( address _toWhomToIssue, address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount ) internal returns (uint256) { uint256 token0Bought; uint256 token1Bought; if (canSwapFromV2(_ToUnipoolToken0, _ToUnipoolToken1)) { (token0Bought, token1Bought) = exchangeTokensV2( _FromTokenContractAddress, _ToUnipoolToken0, _ToUnipoolToken1, _amount ); } else if ( canSwapFromV1(_ToUnipoolToken0, _ToUnipoolToken1, _amount, _amount) ) { (token0Bought, token1Bought) = exchangeTokensV1( _FromTokenContractAddress, _ToUnipoolToken0, _ToUnipoolToken1, _amount ); } require(token0Bought > 0 && token1Bought > 0, "Could not exchange"); IERC20(_ToUnipoolToken0).safeApprove( address(uniswapV2Router), token0Bought ); IERC20(_ToUnipoolToken1).safeApprove( address(uniswapV2Router), token1Bought ); (uint256 amountA, uint256 amountB, uint256 LP) = uniswapV2Router .addLiquidity( _ToUnipoolToken0, _ToUnipoolToken1, token0Bought, token1Bought, 1, 1, address(this), now + 60 ); //Reset allowance to zero IERC20(_ToUnipoolToken0).safeApprove(address(uniswapV2Router), 0); IERC20(_ToUnipoolToken1).safeApprove(address(uniswapV2Router), 0); uint256 residue; if (SafeMath.sub(token0Bought, amountA) > 0) { if (canSwapFromV2(_ToUnipoolToken0, _FromTokenContractAddress)) { residue = swapFromV2( _ToUnipoolToken0, _FromTokenContractAddress, SafeMath.sub(token0Bought, amountA) ); } else { IERC20(_ToUnipoolToken0).safeTransfer( _toWhomToIssue, SafeMath.sub(token0Bought, amountA) ); } } if (SafeMath.sub(token1Bought, amountB) > 0) { if (canSwapFromV2(_ToUnipoolToken1, _FromTokenContractAddress)) { residue += swapFromV2( _ToUnipoolToken1, _FromTokenContractAddress, SafeMath.sub(token1Bought, amountB) ); } else { IERC20(_ToUnipoolToken1).safeTransfer( _toWhomToIssue, SafeMath.sub(token1Bought, amountB) ); } } if (residue > 0) { if (_FromTokenContractAddress != address(0)) { IERC20(_FromTokenContractAddress).safeTransfer( _toWhomToIssue, residue ); } else { (bool success, ) = _toWhomToIssue.call.value(residue)(""); require(success, "Residual ETH Transfer failed."); } } return LP; } function exchangeTokensV1( address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount ) internal returns (uint256 token0Bought, uint256 token1Bought) { IUniswapV2Pair pair = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_ToUnipoolToken0, _ToUnipoolToken1) ); (uint256 res0, uint256 res1, ) = pair.getReserves(); if (_FromTokenContractAddress == address(0)) { token0Bought = _eth2Token(_ToUnipoolToken0, _amount); uint256 amountToSwap = calculateSwapInAmount(res0, token0Bought); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = SafeMath.div(token0Bought, 2); token1Bought = _eth2Token(_ToUnipoolToken1, amountToSwap); token0Bought = SafeMath.sub(token0Bought, amountToSwap); } else { if (_ToUnipoolToken0 == _FromTokenContractAddress) { uint256 amountToSwap = calculateSwapInAmount(res0, _amount); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = SafeMath.div(_amount, 2); token1Bought = _token2Token( _FromTokenContractAddress, address(this), _ToUnipoolToken1, amountToSwap ); token0Bought = SafeMath.sub(_amount, amountToSwap); } else if (_ToUnipoolToken1 == _FromTokenContractAddress) { uint256 amountToSwap = calculateSwapInAmount(res1, _amount); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = SafeMath.div(_amount, 2); token0Bought = _token2Token( _FromTokenContractAddress, address(this), _ToUnipoolToken0, amountToSwap ); token1Bought = SafeMath.sub(_amount, amountToSwap); } else { token0Bought = _token2Token( _FromTokenContractAddress, address(this), _ToUnipoolToken0, _amount ); uint256 amountToSwap = calculateSwapInAmount( res0, token0Bought ); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = SafeMath.div(_amount, 2); token1Bought = _token2Token( _FromTokenContractAddress, address(this), _ToUnipoolToken1, amountToSwap ); token0Bought = SafeMath.sub(token0Bought, amountToSwap); } } } function exchangeTokensV2( address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount ) internal returns (uint256 token0Bought, uint256 token1Bought) { IUniswapV2Pair pair = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_ToUnipoolToken0, _ToUnipoolToken1) ); (uint256 res0, uint256 res1, ) = pair.getReserves(); if ( canSwapFromV2(_FromTokenContractAddress, _ToUnipoolToken0) && canSwapFromV2(_ToUnipoolToken0, _ToUnipoolToken1) ) { token0Bought = swapFromV2( _FromTokenContractAddress, _ToUnipoolToken0, _amount ); uint256 amountToSwap = calculateSwapInAmount(res0, token0Bought); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = SafeMath.div(token0Bought, 2); token1Bought = swapFromV2( _ToUnipoolToken0, _ToUnipoolToken1, amountToSwap ); token0Bought = SafeMath.sub(token0Bought, amountToSwap); } else if ( canSwapFromV2(_FromTokenContractAddress, _ToUnipoolToken1) && canSwapFromV2(_ToUnipoolToken0, _ToUnipoolToken1) ) { token1Bought = swapFromV2( _FromTokenContractAddress, _ToUnipoolToken1, _amount ); uint256 amountToSwap = calculateSwapInAmount(res1, token1Bought); //if no reserve or a new pair is created if (amountToSwap <= 0) amountToSwap = SafeMath.div(token1Bought, 2); token0Bought = swapFromV2( _ToUnipoolToken1, _ToUnipoolToken0, amountToSwap ); token1Bought = SafeMath.sub(token1Bought, amountToSwap); } } //checks if tokens can be exchanged with UniV1 function canSwapFromV1( address _fromToken, address _toToken, uint256 fromAmount, uint256 toAmount ) public view returns (bool) { require( _fromToken != address(0) || _toToken != address(0), "Invalid Exchange values" ); if (_fromToken == address(0)) { IUniswapExchange toExchange = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_toToken) ); uint256 tokenBalance = IERC20(_toToken).balanceOf( address(toExchange) ); uint256 ethBalance = address(toExchange).balance; if (tokenBalance > toAmount && ethBalance > fromAmount) return true; } else if (_toToken == address(0)) { IUniswapExchange fromExchange = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_fromToken) ); uint256 tokenBalance = IERC20(_fromToken).balanceOf( address(fromExchange) ); uint256 ethBalance = address(fromExchange).balance; if (tokenBalance > fromAmount && ethBalance > toAmount) return true; } else { IUniswapExchange toExchange = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_toToken) ); IUniswapExchange fromExchange = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_fromToken) ); uint256 balance1 = IERC20(_fromToken).balanceOf( address(fromExchange) ); uint256 balance2 = IERC20(_toToken).balanceOf(address(toExchange)); if (balance1 > fromAmount && balance2 > toAmount) return true; } return false; } //checks if tokens can be exchanged with UniV2 function canSwapFromV2(address _fromToken, address _toToken) public view returns (bool) { require( _fromToken != address(0) || _toToken != address(0), "Invalid Exchange values" ); if (_fromToken == _toToken) return true; if (_fromToken == address(0) || _fromToken == wethTokenAddress) { if (_toToken == wethTokenAddress || _toToken == address(0)) return true; IUniswapV2Pair pair = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_toToken, wethTokenAddress) ); if (_haveReserve(pair)) return true; } else if (_toToken == address(0) || _toToken == wethTokenAddress) { if (_fromToken == wethTokenAddress || _fromToken == address(0)) return true; IUniswapV2Pair pair = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_fromToken, wethTokenAddress) ); if (_haveReserve(pair)) return true; } else { IUniswapV2Pair pair1 = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_fromToken, wethTokenAddress) ); IUniswapV2Pair pair2 = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_toToken, wethTokenAddress) ); IUniswapV2Pair pair3 = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_fromToken, _toToken) ); if (_haveReserve(pair1) && _haveReserve(pair2)) return true; if (_haveReserve(pair3)) return true; } return false; } //checks if the UNI v2 contract have reserves to swap tokens function _haveReserve(IUniswapV2Pair pair) internal view returns (bool) { if (address(pair) != address(0)) { (uint256 res0, uint256 res1, ) = pair.getReserves(); if (res0 > 0 && res1 > 0) { return true; } } } function calculateSwapInAmount(uint256 reserveIn, uint256 userIn) public pure returns (uint256) { return Babylonian .sqrt( reserveIn.mul(userIn.mul(3988000) + reserveIn.mul(3988009)) ) .sub(reserveIn.mul(1997)) / 1994; } //swaps _fromToken for _toToken //for eth, address(0) otherwise ERC token address function swapFromV2( address _fromToken, address _toToken, uint256 amount ) internal returns (uint256) { require( _fromToken != address(0) || _toToken != address(0), "Invalid Exchange values" ); if (_fromToken == _toToken) return amount; require(canSwapFromV2(_fromToken, _toToken), "Cannot be exchanged"); require(amount > 0, "Invalid amount"); if (_fromToken == address(0)) { if (_toToken == wethTokenAddress) { IWETH(wethTokenAddress).deposit.value(amount)(); return amount; } address[] memory path = new address[](2); path[0] = wethTokenAddress; path[1] = _toToken; uint256[] memory amounts = uniswapV2Router .swapExactETHForTokens .value(amount)(0, path, address(this), now + 180); return amounts[1]; } else if (_toToken == address(0)) { if (_fromToken == wethTokenAddress) { IWETH(wethTokenAddress).withdraw(amount); return amount; } address[] memory path = new address[](2); IERC20(_fromToken).safeApprove(address(uniswapV2Router), amount); path[0] = _fromToken; path[1] = wethTokenAddress; uint256[] memory amounts = uniswapV2Router.swapExactTokensForETH( amount, 0, path, address(this), now + 180 ); IERC20(_fromToken).safeApprove(address(uniswapV2Router), 0); return amounts[1]; } else { IERC20(_fromToken).safeApprove(address(uniswapV2Router), amount); uint256 returnedAmount = _swapTokenToTokenV2( _fromToken, _toToken, amount ); IERC20(_fromToken).safeApprove(address(uniswapV2Router), 0); require(returnedAmount > 0, "Error in swap"); return returnedAmount; } } //swaps 2 ERC tokens (UniV2) function _swapTokenToTokenV2( address _fromToken, address _toToken, uint256 amount ) internal returns (uint256) { IUniswapV2Pair pair1 = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_fromToken, wethTokenAddress) ); IUniswapV2Pair pair2 = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_toToken, wethTokenAddress) ); IUniswapV2Pair pair3 = IUniswapV2Pair( UniSwapV2FactoryAddress.getPair(_fromToken, _toToken) ); uint256[] memory amounts; if (_haveReserve(pair3)) { address[] memory path = new address[](2); path[0] = _fromToken; path[1] = _toToken; amounts = uniswapV2Router.swapExactTokensForTokens( amount, 0, path, address(this), now + 180 ); return amounts[1]; } else if (_haveReserve(pair1) && _haveReserve(pair2)) { address[] memory path = new address[](3); path[0] = _fromToken; path[1] = wethTokenAddress; path[2] = _toToken; amounts = uniswapV2Router.swapExactTokensForTokens( amount, 0, path, address(this), now + 180 ); return amounts[2]; } return 0; } /** @notice This function is used to buy tokens from eth @param _tokenContractAddress Token address which we want to buy @param _amount The amount of eth we want to exchange @return The quantity of token bought */ function _eth2Token(address _tokenContractAddress, uint256 _amount) internal returns (uint256 tokenBought) { IUniswapExchange FromUniSwapExchangeContractAddress = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_tokenContractAddress) ); tokenBought = FromUniSwapExchangeContractAddress .ethToTokenSwapInput .value(_amount)(0, SafeMath.add(now, 300)); } /** @notice This function is used to swap token with ETH @param _FromTokenContractAddress The token address to swap from @param tokens2Trade The quantity of tokens to swap @return The amount of eth bought */ function _token2Eth( address _FromTokenContractAddress, uint256 tokens2Trade, address _toWhomToIssue ) internal returns (uint256 ethBought) { IUniswapExchange FromUniSwapExchangeContractAddress = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_FromTokenContractAddress) ); IERC20(_FromTokenContractAddress).safeApprove( address(FromUniSwapExchangeContractAddress), tokens2Trade ); ethBought = FromUniSwapExchangeContractAddress.tokenToEthTransferInput( tokens2Trade, 0, SafeMath.add(now, 300), _toWhomToIssue ); require(ethBought > 0, "Error in swapping Eth: 1"); IERC20(_FromTokenContractAddress).safeApprove( address(FromUniSwapExchangeContractAddress), 0 ); } /** @notice This function is used to swap tokens @param _FromTokenContractAddress The token address to swap from @param _ToWhomToIssue The address to transfer after swap @param _ToTokenContractAddress The token address to swap to @param tokens2Trade The quantity of tokens to swap @return The amount of tokens returned after swap */ function _token2Token( address _FromTokenContractAddress, address _ToWhomToIssue, address _ToTokenContractAddress, uint256 tokens2Trade ) internal returns (uint256 tokenBought) { IUniswapExchange FromUniSwapExchangeContractAddress = IUniswapExchange( UniSwapV1FactoryAddress.getExchange(_FromTokenContractAddress) ); IERC20(_FromTokenContractAddress).safeApprove( address(FromUniSwapExchangeContractAddress), tokens2Trade ); tokenBought = FromUniSwapExchangeContractAddress .tokenToTokenTransferInput( tokens2Trade, 0, 0, SafeMath.add(now, 300), _ToWhomToIssue, _ToTokenContractAddress ); require(tokenBought > 0, "Error in swapping ERC: 1"); IERC20(_FromTokenContractAddress).safeApprove( address(FromUniSwapExchangeContractAddress), 0 ); } /** @notice This function is used to calculate and transfer goodwill @param _tokenContractAddress Token in which goodwill is deducted @param tokens2Trade The total amount of tokens to be zapped in @return The quantity of goodwill deducted */ function _transferGoodwill( address _tokenContractAddress, uint256 tokens2Trade ) internal returns (uint256 goodwillPortion) { goodwillPortion = SafeMath.div( SafeMath.mul(tokens2Trade, goodwill), 10000 ); if (goodwillPortion == 0) { return 0; } IERC20(_tokenContractAddress).safeTransfer( zgoodwillAddress, goodwillPortion ); } function set_new_goodwill(uint16 _new_goodwill) public onlyOwner { require( _new_goodwill >= 0 && _new_goodwill < 10000, "GoodWill Value not allowed" ); goodwill = _new_goodwill; } function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner { uint256 qty = _TokenAddress.balanceOf(address(this)); _TokenAddress.safeTransfer(owner(), qty); } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } // - to withdraw any ETH balance sitting in the contract function withdraw() public onlyOwner { uint256 contractBalance = address(this).balance; address payable _to = owner().toPayable(); _to.transfer(contractBalance); } 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":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_ToUnipoolToken0","type":"address"},{"internalType":"address","name":"_ToUnipoolToken1","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"","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":true,"inputs":[{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"userIn","type":"uint256"}],"name":"calculateSwapInAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"}],"name":"canSwapFromV1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"}],"name":"canSwapFromV2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"uint16","name":"_new_goodwill","type":"uint16"}],"name":"set_new_goodwill","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"}]
Contract Creation Code
60806040526000805460ff60a81b191690553480156200001e57600080fd5b50604051620038d0380380620038d0833981810160405260208110156200004457600080fd5b50516000805460ff19166001178155620000666001600160e01b03620000f116565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805461ffff9092167601000000000000000000000000000000000000000000000261ffff60b01b19909216919091179055620000f5565b3390565b6137cb80620001056000396000f3fe6080604052600436106100e85760003560e01c806375f12b211161008a578063b10e1dbc11610059578063b10e1dbc146102ce578063b2bdfa7b146102fc578063f27cf32014610311578063f2fde38b1461034c576100e8565b806375f12b21146102435780638d7e41a8146102585780638da5cb5b146102885780638f32d59b146102b9576100e8565b80633f975d5f116100c65780633f975d5f14610172578063551196d5146101cf5780635de0398e14610202578063715018a61461022e576100e8565b80631385d24c146100ea5780631d572320146100ff5780633ccfd60b1461015d575b005b3480156100f657600080fd5b506100e861037f565b61014b600480360360c081101561011557600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a001356103e7565b60408051918252519081900360200190f35b34801561016957600080fd5b506100e86106ff565b34801561017e57600080fd5b506101bb6004803603608081101561019557600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356107a1565b604080519115158252519081900360200190f35b3480156101db57600080fd5b506100e8600480360360208110156101f257600080fd5b50356001600160a01b0316610cd5565b34801561020e57600080fd5b50610217610dba565b6040805161ffff9092168252519081900360200190f35b34801561023a57600080fd5b506100e8610dcb565b34801561024f57600080fd5b506101bb610e61565b34801561026457600080fd5b5061014b6004803603604081101561027b57600080fd5b5080359060200135610e71565b34801561029457600080fd5b5061029d610ee7565b604080516001600160a01b039092168252519081900360200190f35b3480156102c557600080fd5b506101bb610efb565b3480156102da57600080fd5b506100e8600480360360208110156102f157600080fd5b503561ffff16610f24565b34801561030857600080fd5b5061029d610fe7565b34801561031d57600080fd5b506101bb6004803603604081101561033457600080fd5b506001600160a01b0381358116916020013516610ffb565b34801561035857600080fd5b506100e86004803603602081101561036f57600080fd5b50356001600160a01b03166114b2565b610387610efb565b6103c6576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000805460ff1661043f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff161561049c576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60006001600160a01b0387166104fe57600034116104f7576040805162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e88115512081b9bdd081cd95b9d606a1b604482015290519081900360640190fd5b50346105b6565b3415610543576040805162461bcd60e51b815260206004820152600f60248201526e115c9c9bdc8e88115512081cd95b9d608a1b604482015290519081900360640190fd5b60008411610598576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642045524320616d6f756e7400000000000000604482015290519081900360640190fd5b6105b36001600160a01b03881633308763ffffffff61150516565b50825b60006105c58989898986611565565b905083811015610611576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b6040805163e6a4390560e01b81526001600160a01b038981166004830152881660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561067757600080fd5b505afa15801561068b573d6000803e3d6000fd5b505050506040513d60208110156106a157600080fd5b5051905060006106b18284611922565b90506106d88b6106c18584611985565b6001600160a01b038516919063ffffffff6119ce16565b6106e28382611985565b9450505050506000805460ff191660011790559695505050505050565b610707610efb565b610746576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b30316000610763610755610ee7565b6001600160a01b0316611a20565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f1935050505015801561079c573d6000803e3d6000fd5b505050565b60006001600160a01b0385161515806107c257506001600160a01b03841615155b61080d576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b6001600160a01b03851661095557604080516303795fb160e11b81526001600160a01b0386166004820152905160009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf6291602480820192602092909190829003018186803b15801561087957600080fd5b505afa15801561088d573d6000803e3d6000fd5b505050506040513d60208110156108a357600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918816916370a0823191602480820192602092909190829003018186803b1580156108f557600080fd5b505afa158015610909573d6000803e3d6000fd5b505050506040513d602081101561091f57600080fd5b505190506001600160a01b03821631848211801561093c57508581115b1561094d5760019350505050610ccd565b505050610cc9565b6001600160a01b038416610a9457604080516303795fb160e11b81526001600160a01b0387166004820152905160009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf6291602480820192602092909190829003018186803b1580156109c157600080fd5b505afa1580156109d5573d6000803e3d6000fd5b505050506040513d60208110156109eb57600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b158015610a3d57600080fd5b505afa158015610a51573d6000803e3d6000fd5b505050506040513d6020811015610a6757600080fd5b505190506001600160a01b03821631858211801561093c57508481111561094d5760019350505050610ccd565b604080516303795fb160e11b81526001600160a01b0386166004820152905160009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf6291602480820192602092909190829003018186803b158015610af257600080fd5b505afa158015610b06573d6000803e3d6000fd5b505050506040513d6020811015610b1c57600080fd5b5051604080516303795fb160e11b81526001600160a01b0389166004820152905191925060009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf62916024808301926020929190829003018186803b158015610b7e57600080fd5b505afa158015610b92573d6000803e3d6000fd5b505050506040513d6020811015610ba857600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b158015610bfa57600080fd5b505afa158015610c0e573d6000803e3d6000fd5b505050506040513d6020811015610c2457600080fd5b5051604080516370a0823160e01b81526001600160a01b0386811660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d6020811015610ca057600080fd5b505190508682118015610cb257508581115b15610cc4576001945050505050610ccd565b505050505b5060005b949350505050565b610cdd610efb565b610d1c576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d6020811015610d9057600080fd5b50519050610db6610d9f610ee7565b6001600160a01b038416908363ffffffff6119ce16565b5050565b600054600160b01b900461ffff1681565b610dd3610efb565b610e12576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b60006107ca610ed6610e8b856107cd63ffffffff611a2716565b610eca610ec5610ea488623cda2963ffffffff611a2716565b610eb788623cda2063ffffffff611a2716565b89910163ffffffff611a2716565b611a80565b9063ffffffff61198516565b81610edd57fe5b0490505b92915050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610f15611ad1565b6001600160a01b031614905090565b610f2c610efb565b610f6b576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b6127108161ffff1610610fc5576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b60006001600160a01b03831615158061101c57506001600160a01b03821615155b611067576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316141561108957506001610ee1565b6001600160a01b03831615806110b557506001600160a01b038316600080516020613690833981519152145b156111b1576001600160a01b03821660008051602061369083398151915214806110e657506001600160a01b038216155b156110f357506001610ee1565b6040805163e6a4390560e01b81526001600160a01b038416600482015260008051602061369083398151915260248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561116557600080fd5b505afa158015611179573d6000803e3d6000fd5b505050506040513d602081101561118f57600080fd5b5051905061119c81611ad5565b156111ab576001915050610ee1565b506114a9565b6001600160a01b03821615806111dd57506001600160a01b038216600080516020613690833981519152145b1561128d576001600160a01b038316600080516020613690833981519152148061120e57506001600160a01b038316155b1561121b57506001610ee1565b6040805163e6a4390560e01b81526001600160a01b038516600482015260008051602061369083398151915260248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561116557600080fd5b6040805163e6a4390560e01b81526001600160a01b038516600482015260008051602061369083398151915260248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b1580156112ff57600080fd5b505afa158015611313573d6000803e3d6000fd5b505050506040513d602081101561132957600080fd5b50516040805163e6a4390560e01b81526001600160a01b038616600482015260008051602061369083398151915260248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d60208110156113c957600080fd5b50516040805163e6a4390560e01b81526001600160a01b038881166004830152871660248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b15801561143357600080fd5b505afa158015611447573d6000803e3d6000fd5b505050506040513d602081101561145d57600080fd5b5051905061146a83611ad5565b801561147a575061147a82611ad5565b1561148b5760019350505050610ee1565b61149481611ad5565b156114a55760019350505050610ee1565b5050505b50600092915050565b6114ba610efb565b6114f9576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b61150281611b8b565b50565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261155f908590611c36565b50505050565b60008060006115748686610ffb565b1561158f5761158587878787611dee565b90925090506115b2565b61159b868686876107a1565b156115b2576115ac87878787611ff8565b90925090505b6000821180156115c25750600081115b611608576040805162461bcd60e51b8152602060048201526012602482015271436f756c64206e6f742065786368616e676560701b604482015290519081900360640190fd5b6116306001600160a01b0387166000805160206136d68339815191528463ffffffff61226f16565b6116586001600160a01b0386166000805160206136d68339815191528363ffffffff61226f16565b6040805162e8e33760e81b81526001600160a01b03888116600483015287166024820152604481018490526064810183905260016084820181905260a48201523060c4820152603c420160e48201529051600091829182916000805160206136d68339815191529163e8e33700916101048082019260609290919082900301818787803b1580156116e857600080fd5b505af11580156116fc573d6000803e3d6000fd5b505050506040513d606081101561171257600080fd5b508051602082015160409092015190945090925090506117516001600160a01b038a166000805160206136d6833981519152600063ffffffff61226f16565b61177a6001600160a01b0389166000805160206136d6833981519152600063ffffffff61226f16565b6000806117878786611985565b11156117dc576117978a8c610ffb565b156117b7576117b08a8c6117ab8988611985565b612382565b90506117dc565b6117dc8c6117c58887611985565b6001600160a01b038d16919063ffffffff6119ce16565b60006117e88685611985565b1115611837576117f8898c610ffb565b156118125761180c898c6117ab8887611985565b01611837565b6118378c6118208786611985565b6001600160a01b038c16919063ffffffff6119ce16565b8015611913576001600160a01b038b161561186b576118666001600160a01b038c168d8363ffffffff6119ce16565b611913565b6040516000906001600160a01b038e169083908381818185875af1925050503d80600081146118b6576040519150601f19603f3d011682016040523d82523d6000602084013e6118bb565b606091505b5050905080611911576040805162461bcd60e51b815260206004820152601d60248201527f526573696475616c20455448205472616e73666572206661696c65642e000000604482015290519081900360640190fd5b505b509a9950505050505050505050565b6000805461194890611940908490600160b01b900461ffff16611a27565b612710612b36565b90508061195757506000610ee1565b610ee16001600160a01b03841673e737b6afec2320f616297e59445b60a11e3ef75f8363ffffffff6119ce16565b60006119c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b78565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261079c908490611c36565b805b919050565b600082611a3657506000610ee1565b82820282848281611a4357fe5b04146119c75760405162461bcd60e51b81526004018080602001828103825260218152602001806136f66021913960400191505060405180910390fd5b60006003821115611ac3575080600160028204015b81811015611abd57809150600281828581611aac57fe5b040181611ab557fe5b049050611a95565b50611a22565b8115611a2257506001919050565b3390565b60006001600160a01b03821615611a2257600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d6060811015611b4c57600080fd5b5080516020909101516001600160701b0391821693501690508115801590611b745750600081115b15611b8457600192505050611a22565b5050919050565b6001600160a01b038116611bd05760405162461bcd60e51b81526004018080602001828103825260268152602001806136b06026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b611c48826001600160a01b0316612c0f565b611c99576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611cd75780518252601f199092019160209182019101611cb8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611d39576040519150601f19603f3d011682016040523d82523d6000602084013e611d3e565b606091505b509150915081611d95576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561155f57808060200190516020811015611db157600080fd5b505161155f5760405162461bcd60e51b815260040180806020018281038252602a815260200180613737602a913960400191505060405180910390fd5b6040805163e6a4390560e01b81526001600160a01b03858116600483015284166024820152905160009182918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b158015611e5857600080fd5b505afa158015611e6c573d6000803e3d6000fd5b505050506040513d6020811015611e8257600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015611ecd57600080fd5b505afa158015611ee1573d6000803e3d6000fd5b505050506040513d6060811015611ef757600080fd5b5080516020909101516001600160701b039182169350169050611f1a8989610ffb565b8015611f2b5750611f2b8888610ffb565b15611f8057611f3b898988612382565b94506000611f498387610e71565b905060008111611f6157611f5e866002612b36565b90505b611f6c898983612382565b9450611f788682611985565b955050611fec565b611f8a8988610ffb565b8015611f9b5750611f9b8888610ffb565b15611fec57611fab898888612382565b93506000611fb98286610e71565b905060008111611fd157611fce856002612b36565b90505b611fdc888a83612382565b9550611fe88582611985565b9450505b50505094509492505050565b6040805163e6a4390560e01b81526001600160a01b03858116600483015284166024820152905160009182918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561206257600080fd5b505afa158015612076573d6000803e3d6000fd5b505050506040513d602081101561208c57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b1580156120d757600080fd5b505afa1580156120eb573d6000803e3d6000fd5b505050506040513d606081101561210157600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038916612162576121328887612c48565b945060006121408387610e71565b90506000811161215857612155866002612b36565b90505b611f6c8882612c48565b886001600160a01b0316886001600160a01b031614156121b85760006121888388610e71565b9050600081116121a05761219d876002612b36565b90505b6121ac8a308a84612d64565b9450611f788782611985565b886001600160a01b0316876001600160a01b031614156122165760006121de8288610e71565b9050600081116121f6576121f3876002612b36565b90505b6122028a308b84612d64565b955061220e8782611985565b945050611fec565b61222289308a89612d64565b945060006122308387610e71565b90506000811161224857612245876002612b36565b90505b6122548a308a84612d64565b94506122608682611985565b95505050505094509492505050565b8015806122f5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156122c757600080fd5b505afa1580156122db573d6000803e3d6000fd5b505050506040513d60208110156122f157600080fd5b5051155b6123305760405162461bcd60e51b81526004018080602001828103825260368152602001806137616036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261079c908490611c36565b60006001600160a01b0384161515806123a357506001600160a01b03831615155b6123ee576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b0316141561240f5750806119c7565b6124198484610ffb565b612460576040805162461bcd60e51b815260206004820152601360248201527210d85b9b9bdd08189948195e18da185b99d959606a1b604482015290519081900360640190fd5b600082116124a6576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6001600160a01b038416612771576001600160a01b038316600080516020613690833981519152141561253d576000805160206136908339815191526001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561251c57600080fd5b505af1158015612530573d6000803e3d6000fd5b50505050508190506119c7565b60408051600280825260608083018452926020830190803883390190505090506000805160206136908339815191528160008151811061257957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106125a757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060606000805160206136d68339815191526001600160a01b0316637ff36ab585600085304260b4016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561266257818101518382015260200161264a565b50505050905001955050505050506000604051808303818588803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405260208110156126c757600080fd5b8101908080516040519392919084600160201b8211156126e657600080fd5b9083019060208201858111156126fb57600080fd5b82518660208202830111600160201b8211171561271757600080fd5b82525081516020918201928201910280838360005b8381101561274457818101518382015260200161272c565b5050505090500160405250505090508060018151811061276057fe5b6020026020010151925050506119c7565b6001600160a01b038316612a91576001600160a01b0384166000805160206136908339815191521415612812576000805160206136908339815191526001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156127f257600080fd5b505af1158015612806573d6000803e3d6000fd5b505050508190506119c7565b604080516002808252606080830184529260208301908038833901905050905061285a6001600160a01b0386166000805160206136d68339815191528563ffffffff61226f16565b848160008151811061286857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613690833981519152816001815181106128a457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060606000805160206136d68339815191526001600160a01b03166318cbafe585600085304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561296557818101518382015260200161294d565b505050509050019650505050505050600060405180830381600087803b15801561298e57600080fd5b505af11580156129a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129cb57600080fd5b8101908080516040519392919084600160201b8211156129ea57600080fd5b9083019060208201858111156129ff57600080fd5b82518660208202830111600160201b82111715612a1b57600080fd5b82525081516020918201928201910280838360005b83811015612a48578181015183820152602001612a30565b505050509050016040525050509050612a846000805160206136d68339815191526000886001600160a01b031661226f9092919063ffffffff16565b8060018151811061276057fe5b612ab96001600160a01b0385166000805160206136d68339815191528463ffffffff61226f16565b6000612ac6858585612f39565b9050612af16001600160a01b0386166000805160206136d6833981519152600063ffffffff61226f16565b60008111610ccd576040805162461bcd60e51b815260206004820152600d60248201526c04572726f7220696e207377617609c1b604482015290519081900360640190fd5b60006119c783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135d0565b60008184841115612c075760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bcc578181015183820152602001612bb4565b50505050905090810190601f168015612bf95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610ccd575050151592915050565b604080516303795fb160e11b81526001600160a01b03841660048201529051600091829173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf62916024808301926020929190829003018186803b158015612ca757600080fd5b505afa158015612cbb573d6000803e3d6000fd5b505050506040513d6020811015612cd157600080fd5b505190506001600160a01b03811663f39b5b9b846000612cf34261012c613635565b6040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b158015612d2f57600080fd5b505af1158015612d43573d6000803e3d6000fd5b50505050506040513d6020811015612d5a57600080fd5b5051949350505050565b604080516303795fb160e11b81526001600160a01b03861660048201529051600091829173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf62916024808301926020929190829003018186803b158015612dc357600080fd5b505afa158015612dd7573d6000803e3d6000fd5b505050506040513d6020811015612ded57600080fd5b50519050612e0b6001600160a01b038716828563ffffffff61226f16565b806001600160a01b031663f552d91b84600080612e2a4261012c613635565b604080516001600160e01b031960e088901b16815260048101959095526024850193909352604484019190915260648301526001600160a01b03808a166084840152881660a48301525160c48083019260209291908290030181600087803b158015612e9557600080fd5b505af1158015612ea9573d6000803e3d6000fd5b505050506040513d6020811015612ebf57600080fd5b5051915081612f15576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204552433a20310000000000000000604482015290519081900360640190fd5b612f306001600160a01b03871682600063ffffffff61226f16565b50949350505050565b6040805163e6a4390560e01b81526001600160a01b0385166004820152600080516020613690833981519152602482015290516000918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b158015612fac57600080fd5b505afa158015612fc0573d6000803e3d6000fd5b505050506040513d6020811015612fd657600080fd5b50516040805163e6a4390560e01b81526001600160a01b038716600482015260008051602061369083398151915260248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b15801561304c57600080fd5b505afa158015613060573d6000803e3d6000fd5b505050506040513d602081101561307657600080fd5b50516040805163e6a4390560e01b81526001600160a01b038981166004830152881660248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b1580156130e057600080fd5b505afa1580156130f4573d6000803e3d6000fd5b505050506040513d602081101561310a57600080fd5b50519050606061311982611ad5565b1561334c576040805160028082526060808301845292602083019080388339019050509050888160008151811061314c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878160018151811061317a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206136d68339815191526001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613239578181015183820152602001613221565b505050509050019650505050505050600060405180830381600087803b15801561326257600080fd5b505af1158015613276573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561329f57600080fd5b8101908080516040519392919084600160201b8211156132be57600080fd5b9083019060208201858111156132d357600080fd5b82518660208202830111600160201b821117156132ef57600080fd5b82525081516020918201928201910280838360005b8381101561331c578181015183820152602001613304565b5050505090500160405250505091508160018151811061333857fe5b6020026020010151955050505050506119c7565b61335584611ad5565b8015613365575061336583611ad5565b156135c25760408051600380825260808201909252606091602082018380388339019050509050888160008151811061339a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613690833981519152816001815181106133d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878160028151811061340457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206136d68339815191526001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156134c35781810151838201526020016134ab565b505050509050019650505050505050600060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561352957600080fd5b8101908080516040519392919084600160201b82111561354857600080fd5b90830190602082018581111561355d57600080fd5b82518660208202830111600160201b8211171561357957600080fd5b82525081516020918201928201910280838360005b838110156135a657818101518382015260200161358e565b5050505090500160405250505091508160028151811061333857fe5b506000979650505050505050565b6000818361361f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bcc578181015183820152602001612bb4565b50600083858161362b57fe5b0495945050505050565b6000828201838110156119c7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc24f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820ba929d2aad3ba9b7979203d0725aaefde47e0f4a7d5bc5af68df9fecdb1bd55064736f6c634300050c00320000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100e85760003560e01c806375f12b211161008a578063b10e1dbc11610059578063b10e1dbc146102ce578063b2bdfa7b146102fc578063f27cf32014610311578063f2fde38b1461034c576100e8565b806375f12b21146102435780638d7e41a8146102585780638da5cb5b146102885780638f32d59b146102b9576100e8565b80633f975d5f116100c65780633f975d5f14610172578063551196d5146101cf5780635de0398e14610202578063715018a61461022e576100e8565b80631385d24c146100ea5780631d572320146100ff5780633ccfd60b1461015d575b005b3480156100f657600080fd5b506100e861037f565b61014b600480360360c081101561011557600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a001356103e7565b60408051918252519081900360200190f35b34801561016957600080fd5b506100e86106ff565b34801561017e57600080fd5b506101bb6004803603608081101561019557600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356107a1565b604080519115158252519081900360200190f35b3480156101db57600080fd5b506100e8600480360360208110156101f257600080fd5b50356001600160a01b0316610cd5565b34801561020e57600080fd5b50610217610dba565b6040805161ffff9092168252519081900360200190f35b34801561023a57600080fd5b506100e8610dcb565b34801561024f57600080fd5b506101bb610e61565b34801561026457600080fd5b5061014b6004803603604081101561027b57600080fd5b5080359060200135610e71565b34801561029457600080fd5b5061029d610ee7565b604080516001600160a01b039092168252519081900360200190f35b3480156102c557600080fd5b506101bb610efb565b3480156102da57600080fd5b506100e8600480360360208110156102f157600080fd5b503561ffff16610f24565b34801561030857600080fd5b5061029d610fe7565b34801561031d57600080fd5b506101bb6004803603604081101561033457600080fd5b506001600160a01b0381358116916020013516610ffb565b34801561035857600080fd5b506100e86004803603602081101561036f57600080fd5b50356001600160a01b03166114b2565b610387610efb565b6103c6576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000805460ff1661043f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff161561049c576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60006001600160a01b0387166104fe57600034116104f7576040805162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e88115512081b9bdd081cd95b9d606a1b604482015290519081900360640190fd5b50346105b6565b3415610543576040805162461bcd60e51b815260206004820152600f60248201526e115c9c9bdc8e88115512081cd95b9d608a1b604482015290519081900360640190fd5b60008411610598576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642045524320616d6f756e7400000000000000604482015290519081900360640190fd5b6105b36001600160a01b03881633308763ffffffff61150516565b50825b60006105c58989898986611565565b905083811015610611576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b6040805163e6a4390560e01b81526001600160a01b038981166004830152881660248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561067757600080fd5b505afa15801561068b573d6000803e3d6000fd5b505050506040513d60208110156106a157600080fd5b5051905060006106b18284611922565b90506106d88b6106c18584611985565b6001600160a01b038516919063ffffffff6119ce16565b6106e28382611985565b9450505050506000805460ff191660011790559695505050505050565b610707610efb565b610746576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b30316000610763610755610ee7565b6001600160a01b0316611a20565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f1935050505015801561079c573d6000803e3d6000fd5b505050565b60006001600160a01b0385161515806107c257506001600160a01b03841615155b61080d576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b6001600160a01b03851661095557604080516303795fb160e11b81526001600160a01b0386166004820152905160009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf6291602480820192602092909190829003018186803b15801561087957600080fd5b505afa15801561088d573d6000803e3d6000fd5b505050506040513d60208110156108a357600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918816916370a0823191602480820192602092909190829003018186803b1580156108f557600080fd5b505afa158015610909573d6000803e3d6000fd5b505050506040513d602081101561091f57600080fd5b505190506001600160a01b03821631848211801561093c57508581115b1561094d5760019350505050610ccd565b505050610cc9565b6001600160a01b038416610a9457604080516303795fb160e11b81526001600160a01b0387166004820152905160009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf6291602480820192602092909190829003018186803b1580156109c157600080fd5b505afa1580156109d5573d6000803e3d6000fd5b505050506040513d60208110156109eb57600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b158015610a3d57600080fd5b505afa158015610a51573d6000803e3d6000fd5b505050506040513d6020811015610a6757600080fd5b505190506001600160a01b03821631858211801561093c57508481111561094d5760019350505050610ccd565b604080516303795fb160e11b81526001600160a01b0386166004820152905160009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf6291602480820192602092909190829003018186803b158015610af257600080fd5b505afa158015610b06573d6000803e3d6000fd5b505050506040513d6020811015610b1c57600080fd5b5051604080516303795fb160e11b81526001600160a01b0389166004820152905191925060009173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf62916024808301926020929190829003018186803b158015610b7e57600080fd5b505afa158015610b92573d6000803e3d6000fd5b505050506040513d6020811015610ba857600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b158015610bfa57600080fd5b505afa158015610c0e573d6000803e3d6000fd5b505050506040513d6020811015610c2457600080fd5b5051604080516370a0823160e01b81526001600160a01b0386811660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d6020811015610ca057600080fd5b505190508682118015610cb257508581115b15610cc4576001945050505050610ccd565b505050505b5060005b949350505050565b610cdd610efb565b610d1c576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d6020811015610d9057600080fd5b50519050610db6610d9f610ee7565b6001600160a01b038416908363ffffffff6119ce16565b5050565b600054600160b01b900461ffff1681565b610dd3610efb565b610e12576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b600054600160a81b900460ff1681565b60006107ca610ed6610e8b856107cd63ffffffff611a2716565b610eca610ec5610ea488623cda2963ffffffff611a2716565b610eb788623cda2063ffffffff611a2716565b89910163ffffffff611a2716565b611a80565b9063ffffffff61198516565b81610edd57fe5b0490505b92915050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610f15611ad1565b6001600160a01b031614905090565b610f2c610efb565b610f6b576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b6127108161ffff1610610fc5576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b60006001600160a01b03831615158061101c57506001600160a01b03821615155b611067576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316141561108957506001610ee1565b6001600160a01b03831615806110b557506001600160a01b038316600080516020613690833981519152145b156111b1576001600160a01b03821660008051602061369083398151915214806110e657506001600160a01b038216155b156110f357506001610ee1565b6040805163e6a4390560e01b81526001600160a01b038416600482015260008051602061369083398151915260248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561116557600080fd5b505afa158015611179573d6000803e3d6000fd5b505050506040513d602081101561118f57600080fd5b5051905061119c81611ad5565b156111ab576001915050610ee1565b506114a9565b6001600160a01b03821615806111dd57506001600160a01b038216600080516020613690833981519152145b1561128d576001600160a01b038316600080516020613690833981519152148061120e57506001600160a01b038316155b1561121b57506001610ee1565b6040805163e6a4390560e01b81526001600160a01b038516600482015260008051602061369083398151915260248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561116557600080fd5b6040805163e6a4390560e01b81526001600160a01b038516600482015260008051602061369083398151915260248201529051600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b1580156112ff57600080fd5b505afa158015611313573d6000803e3d6000fd5b505050506040513d602081101561132957600080fd5b50516040805163e6a4390560e01b81526001600160a01b038616600482015260008051602061369083398151915260248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d60208110156113c957600080fd5b50516040805163e6a4390560e01b81526001600160a01b038881166004830152871660248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b15801561143357600080fd5b505afa158015611447573d6000803e3d6000fd5b505050506040513d602081101561145d57600080fd5b5051905061146a83611ad5565b801561147a575061147a82611ad5565b1561148b5760019350505050610ee1565b61149481611ad5565b156114a55760019350505050610ee1565b5050505b50600092915050565b6114ba610efb565b6114f9576040805162461bcd60e51b81526020600482018190526024820152600080516020613717833981519152604482015290519081900360640190fd5b61150281611b8b565b50565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261155f908590611c36565b50505050565b60008060006115748686610ffb565b1561158f5761158587878787611dee565b90925090506115b2565b61159b868686876107a1565b156115b2576115ac87878787611ff8565b90925090505b6000821180156115c25750600081115b611608576040805162461bcd60e51b8152602060048201526012602482015271436f756c64206e6f742065786368616e676560701b604482015290519081900360640190fd5b6116306001600160a01b0387166000805160206136d68339815191528463ffffffff61226f16565b6116586001600160a01b0386166000805160206136d68339815191528363ffffffff61226f16565b6040805162e8e33760e81b81526001600160a01b03888116600483015287166024820152604481018490526064810183905260016084820181905260a48201523060c4820152603c420160e48201529051600091829182916000805160206136d68339815191529163e8e33700916101048082019260609290919082900301818787803b1580156116e857600080fd5b505af11580156116fc573d6000803e3d6000fd5b505050506040513d606081101561171257600080fd5b508051602082015160409092015190945090925090506117516001600160a01b038a166000805160206136d6833981519152600063ffffffff61226f16565b61177a6001600160a01b0389166000805160206136d6833981519152600063ffffffff61226f16565b6000806117878786611985565b11156117dc576117978a8c610ffb565b156117b7576117b08a8c6117ab8988611985565b612382565b90506117dc565b6117dc8c6117c58887611985565b6001600160a01b038d16919063ffffffff6119ce16565b60006117e88685611985565b1115611837576117f8898c610ffb565b156118125761180c898c6117ab8887611985565b01611837565b6118378c6118208786611985565b6001600160a01b038c16919063ffffffff6119ce16565b8015611913576001600160a01b038b161561186b576118666001600160a01b038c168d8363ffffffff6119ce16565b611913565b6040516000906001600160a01b038e169083908381818185875af1925050503d80600081146118b6576040519150601f19603f3d011682016040523d82523d6000602084013e6118bb565b606091505b5050905080611911576040805162461bcd60e51b815260206004820152601d60248201527f526573696475616c20455448205472616e73666572206661696c65642e000000604482015290519081900360640190fd5b505b509a9950505050505050505050565b6000805461194890611940908490600160b01b900461ffff16611a27565b612710612b36565b90508061195757506000610ee1565b610ee16001600160a01b03841673e737b6afec2320f616297e59445b60a11e3ef75f8363ffffffff6119ce16565b60006119c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b78565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261079c908490611c36565b805b919050565b600082611a3657506000610ee1565b82820282848281611a4357fe5b04146119c75760405162461bcd60e51b81526004018080602001828103825260218152602001806136f66021913960400191505060405180910390fd5b60006003821115611ac3575080600160028204015b81811015611abd57809150600281828581611aac57fe5b040181611ab557fe5b049050611a95565b50611a22565b8115611a2257506001919050565b3390565b60006001600160a01b03821615611a2257600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611b2257600080fd5b505afa158015611b36573d6000803e3d6000fd5b505050506040513d6060811015611b4c57600080fd5b5080516020909101516001600160701b0391821693501690508115801590611b745750600081115b15611b8457600192505050611a22565b5050919050565b6001600160a01b038116611bd05760405162461bcd60e51b81526004018080602001828103825260268152602001806136b06026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b611c48826001600160a01b0316612c0f565b611c99576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611cd75780518252601f199092019160209182019101611cb8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611d39576040519150601f19603f3d011682016040523d82523d6000602084013e611d3e565b606091505b509150915081611d95576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561155f57808060200190516020811015611db157600080fd5b505161155f5760405162461bcd60e51b815260040180806020018281038252602a815260200180613737602a913960400191505060405180910390fd5b6040805163e6a4390560e01b81526001600160a01b03858116600483015284166024820152905160009182918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b158015611e5857600080fd5b505afa158015611e6c573d6000803e3d6000fd5b505050506040513d6020811015611e8257600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015611ecd57600080fd5b505afa158015611ee1573d6000803e3d6000fd5b505050506040513d6060811015611ef757600080fd5b5080516020909101516001600160701b039182169350169050611f1a8989610ffb565b8015611f2b5750611f2b8888610ffb565b15611f8057611f3b898988612382565b94506000611f498387610e71565b905060008111611f6157611f5e866002612b36565b90505b611f6c898983612382565b9450611f788682611985565b955050611fec565b611f8a8988610ffb565b8015611f9b5750611f9b8888610ffb565b15611fec57611fab898888612382565b93506000611fb98286610e71565b905060008111611fd157611fce856002612b36565b90505b611fdc888a83612382565b9550611fe88582611985565b9450505b50505094509492505050565b6040805163e6a4390560e01b81526001600160a01b03858116600483015284166024820152905160009182918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a4390591604480820192602092909190829003018186803b15801561206257600080fd5b505afa158015612076573d6000803e3d6000fd5b505050506040513d602081101561208c57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b1580156120d757600080fd5b505afa1580156120eb573d6000803e3d6000fd5b505050506040513d606081101561210157600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038916612162576121328887612c48565b945060006121408387610e71565b90506000811161215857612155866002612b36565b90505b611f6c8882612c48565b886001600160a01b0316886001600160a01b031614156121b85760006121888388610e71565b9050600081116121a05761219d876002612b36565b90505b6121ac8a308a84612d64565b9450611f788782611985565b886001600160a01b0316876001600160a01b031614156122165760006121de8288610e71565b9050600081116121f6576121f3876002612b36565b90505b6122028a308b84612d64565b955061220e8782611985565b945050611fec565b61222289308a89612d64565b945060006122308387610e71565b90506000811161224857612245876002612b36565b90505b6122548a308a84612d64565b94506122608682611985565b95505050505094509492505050565b8015806122f5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156122c757600080fd5b505afa1580156122db573d6000803e3d6000fd5b505050506040513d60208110156122f157600080fd5b5051155b6123305760405162461bcd60e51b81526004018080602001828103825260368152602001806137616036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261079c908490611c36565b60006001600160a01b0384161515806123a357506001600160a01b03831615155b6123ee576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b0316141561240f5750806119c7565b6124198484610ffb565b612460576040805162461bcd60e51b815260206004820152601360248201527210d85b9b9bdd08189948195e18da185b99d959606a1b604482015290519081900360640190fd5b600082116124a6576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6001600160a01b038416612771576001600160a01b038316600080516020613690833981519152141561253d576000805160206136908339815191526001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561251c57600080fd5b505af1158015612530573d6000803e3d6000fd5b50505050508190506119c7565b60408051600280825260608083018452926020830190803883390190505090506000805160206136908339815191528160008151811061257957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106125a757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060606000805160206136d68339815191526001600160a01b0316637ff36ab585600085304260b4016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561266257818101518382015260200161264a565b50505050905001955050505050506000604051808303818588803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405260208110156126c757600080fd5b8101908080516040519392919084600160201b8211156126e657600080fd5b9083019060208201858111156126fb57600080fd5b82518660208202830111600160201b8211171561271757600080fd5b82525081516020918201928201910280838360005b8381101561274457818101518382015260200161272c565b5050505090500160405250505090508060018151811061276057fe5b6020026020010151925050506119c7565b6001600160a01b038316612a91576001600160a01b0384166000805160206136908339815191521415612812576000805160206136908339815191526001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156127f257600080fd5b505af1158015612806573d6000803e3d6000fd5b505050508190506119c7565b604080516002808252606080830184529260208301908038833901905050905061285a6001600160a01b0386166000805160206136d68339815191528563ffffffff61226f16565b848160008151811061286857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613690833981519152816001815181106128a457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060606000805160206136d68339815191526001600160a01b03166318cbafe585600085304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561296557818101518382015260200161294d565b505050509050019650505050505050600060405180830381600087803b15801561298e57600080fd5b505af11580156129a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156129cb57600080fd5b8101908080516040519392919084600160201b8211156129ea57600080fd5b9083019060208201858111156129ff57600080fd5b82518660208202830111600160201b82111715612a1b57600080fd5b82525081516020918201928201910280838360005b83811015612a48578181015183820152602001612a30565b505050509050016040525050509050612a846000805160206136d68339815191526000886001600160a01b031661226f9092919063ffffffff16565b8060018151811061276057fe5b612ab96001600160a01b0385166000805160206136d68339815191528463ffffffff61226f16565b6000612ac6858585612f39565b9050612af16001600160a01b0386166000805160206136d6833981519152600063ffffffff61226f16565b60008111610ccd576040805162461bcd60e51b815260206004820152600d60248201526c04572726f7220696e207377617609c1b604482015290519081900360640190fd5b60006119c783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135d0565b60008184841115612c075760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bcc578181015183820152602001612bb4565b50505050905090810190601f168015612bf95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610ccd575050151592915050565b604080516303795fb160e11b81526001600160a01b03841660048201529051600091829173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf62916024808301926020929190829003018186803b158015612ca757600080fd5b505afa158015612cbb573d6000803e3d6000fd5b505050506040513d6020811015612cd157600080fd5b505190506001600160a01b03811663f39b5b9b846000612cf34261012c613635565b6040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b158015612d2f57600080fd5b505af1158015612d43573d6000803e3d6000fd5b50505050506040513d6020811015612d5a57600080fd5b5051949350505050565b604080516303795fb160e11b81526001600160a01b03861660048201529051600091829173c0a47dfe034b400b47bdad5fecda2621de6c4d95916306f2bf62916024808301926020929190829003018186803b158015612dc357600080fd5b505afa158015612dd7573d6000803e3d6000fd5b505050506040513d6020811015612ded57600080fd5b50519050612e0b6001600160a01b038716828563ffffffff61226f16565b806001600160a01b031663f552d91b84600080612e2a4261012c613635565b604080516001600160e01b031960e088901b16815260048101959095526024850193909352604484019190915260648301526001600160a01b03808a166084840152881660a48301525160c48083019260209291908290030181600087803b158015612e9557600080fd5b505af1158015612ea9573d6000803e3d6000fd5b505050506040513d6020811015612ebf57600080fd5b5051915081612f15576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204552433a20310000000000000000604482015290519081900360640190fd5b612f306001600160a01b03871682600063ffffffff61226f16565b50949350505050565b6040805163e6a4390560e01b81526001600160a01b0385166004820152600080516020613690833981519152602482015290516000918291735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b158015612fac57600080fd5b505afa158015612fc0573d6000803e3d6000fd5b505050506040513d6020811015612fd657600080fd5b50516040805163e6a4390560e01b81526001600160a01b038716600482015260008051602061369083398151915260248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b15801561304c57600080fd5b505afa158015613060573d6000803e3d6000fd5b505050506040513d602081101561307657600080fd5b50516040805163e6a4390560e01b81526001600160a01b038981166004830152881660248201529051919250600091735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163e6a43905916044808301926020929190829003018186803b1580156130e057600080fd5b505afa1580156130f4573d6000803e3d6000fd5b505050506040513d602081101561310a57600080fd5b50519050606061311982611ad5565b1561334c576040805160028082526060808301845292602083019080388339019050509050888160008151811061314c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878160018151811061317a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206136d68339815191526001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613239578181015183820152602001613221565b505050509050019650505050505050600060405180830381600087803b15801561326257600080fd5b505af1158015613276573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561329f57600080fd5b8101908080516040519392919084600160201b8211156132be57600080fd5b9083019060208201858111156132d357600080fd5b82518660208202830111600160201b821117156132ef57600080fd5b82525081516020918201928201910280838360005b8381101561331c578181015183820152602001613304565b5050505090500160405250505091508160018151811061333857fe5b6020026020010151955050505050506119c7565b61335584611ad5565b8015613365575061336583611ad5565b156135c25760408051600380825260808201909252606091602082018380388339019050509050888160008151811061339a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613690833981519152816001815181106133d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878160028151811061340457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000805160206136d68339815191526001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156134c35781810151838201526020016134ab565b505050509050019650505050505050600060405180830381600087803b1580156134ec57600080fd5b505af1158015613500573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561352957600080fd5b8101908080516040519392919084600160201b82111561354857600080fd5b90830190602082018581111561355d57600080fd5b82518660208202830111600160201b8211171561357957600080fd5b82525081516020918201928201910280838360005b838110156135a657818101518382015260200161358e565b5050505090500160405250505091508160028151811061333857fe5b506000979650505050505050565b6000818361361f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bcc578181015183820152602001612bb4565b50600083858161362b57fe5b0495945050505050565b6000828201838110156119c7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc24f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820ba929d2aad3ba9b7979203d0725aaefde47e0f4a7d5bc5af68df9fecdb1bd55064736f6c634300050c0032
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
32711:24669:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56988:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56988:86:0;;;:::i;34375:1632::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;34375:1632:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;57144:195;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57144:195:0;;;:::i;44399:1824::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44399:1824:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;44399:1824:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56757:191;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56757:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56757:191:0;-1:-1:-1;;;;;56757:191:0;;:::i;32918:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32918:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28974:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28974:140:0;;;:::i;32884:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32884:27:0;;;:::i;48329:343::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48329:343:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48329:343:0;;;;;;;:::i;28163:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28163:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;28163:79:0;;;;;;;;;;;;;;28529:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28529:94:0;;;:::i;56511:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56511:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56511:238:0;;;;:::i;27658:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27658:29:0;;;:::i;46283:1677::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46283:1677:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46283:1677:0;;;;;;;;;;:::i;29269:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29269:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29269:117:0;-1:-1:-1;;;;;29269:117:0;;:::i;56988:86::-;28375:9;:7;:9::i;:::-;28367:54;;;;;-1:-1:-1;;;28367:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28367:54:0;;;;;;;;;;;;;;;57059:7;;;-1:-1:-1;;;;57048:18:0;;-1:-1:-1;;;57059:7:0;;;;;;57058:8;57048:18;;;;;;56988:86::o;34375:1632::-;34656:7;25687:11;;;;25679:55;;;;;-1:-1:-1;;;25679:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25826:5;25812:19;;-1:-1:-1;;25812:19:0;;;;;-1:-1:-1;;;33766:7:0;;25812:19;33766:7;33762:102;;;33790:28;;;-1:-1:-1;;;33790:28:0;;;;;;;;;;;;-1:-1:-1;;;33790:28:0;;;;;;;;;;;;;;33762:102;34676:16;-1:-1:-1;;;;;34707:39:0;;34703:491;;34783:1;34771:9;:13;34763:45;;;;;-1:-1:-1;;;34763:45:0;;;;;;;;;;;;-1:-1:-1;;;34763:45:0;;;;;;;;;;;;;;;-1:-1:-1;34834:9:0;34703:491;;;34884:9;:14;34876:42;;;;;-1:-1:-1;;;34876:42:0;;;;;;;;;;;;-1:-1:-1;;;34876:42:0;;;;;;;;;;;;;;;34951:1;34941:7;:11;34933:49;;;;;-1:-1:-1;;;34933:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34997:152;-1:-1:-1;;;;;34997:50:0;;35066:10;35103:4;35127:7;34997:152;:50;:152;:::i;:::-;-1:-1:-1;35175:7:0;34703:491;35206:16;35225:178;35253:14;35282:25;35322:16;35353;35384:8;35225:13;:178::i;:::-;35206:197;;35436:14;35424:8;:26;;35416:57;;;;;-1:-1:-1;;;35416:57:0;;;;;;;;;;;;-1:-1:-1;;;35416:57:0;;;;;;;;;;;;;;;35542:104;;;-1:-1:-1;;;35542:104:0;;-1:-1:-1;;;;;35542:104:0;;;;;;;;;;;;;;;35514:25;;33446:42;;35542:31;;:104;;;;;;;;;;;;;;;33446:42;35542:104;;;5:2:-1;;;;30:1;27;20:12;5:2;35542:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35542:104:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35542:104:0;;-1:-1:-1;35688:23:0;35714:83;35542:104;35778:8;35714:17;:83::i;:::-;35688:109;;35810:132;35863:14;35892:39;35905:8;35915:15;35892:12;:39::i;:::-;-1:-1:-1;;;;;35810:38:0;;;:132;;:38;:132;:::i;:::-;35960:39;35973:8;35983:15;35960:12;:39::i;:::-;35953:46;;;;;;25992:11;:18;;-1:-1:-1;;25992:18:0;26006:4;25992:18;;;34375:1632;;-1:-1:-1;;;;;;34375:1632:0:o;57144:195::-;28375:9;:7;:9::i;:::-;28367:54;;;;;-1:-1:-1;;;28367:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28367:54:0;;;;;;;;;;;;;;;57226:4;57218:21;57192:23;57272:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;57272:17:0;;:19::i;:::-;57302:29;;57250:41;;-1:-1:-1;;;;;;57302:12:0;;;:29;;;;;57315:15;;57302:29;;;;57315:15;57302:12;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57302:29:0;28432:1;;57144:195::o;44399:1824::-;44562:4;-1:-1:-1;;;;;44601:24:0;;;;;:50;;-1:-1:-1;;;;;;44629:22:0;;;;44601:50;44579:123;;;;;-1:-1:-1;;;44579:123:0;;;;;;;;;;;;-1:-1:-1;;;44579:123:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44719:24:0;;44715:1478;;44825:45;;;-1:-1:-1;;;44825:45:0;;-1:-1:-1;;;;;44825:45:0;;;;;;;;44760:27;;33290:42;;44825:35;;:45;;;;;;;;;;;;;;;33290:42;44825:45;;;5:2:-1;;;;30:1;27;20:12;5:2;44825:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44825:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44825:45:0;44923:79;;;-1:-1:-1;;;44923:79:0;;-1:-1:-1;;;;;44923:79:0;;;;;;;;;44825:45;;-1:-1:-1;44900:20:0;;44923:26;;;;;;:79;;;;;44825:45;;44923:79;;;;;;;;:26;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;44923:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44923:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44923:79:0;;-1:-1:-1;;;;;;45038:27:0;;;45084:23;;;:50;;;;;45124:10;45111;:23;45084:50;45080:67;;;45143:4;45136:11;;;;;;;45080:67;44715:1478;;;;;;-1:-1:-1;;;;;45169:22:0;;45165:1028;;45275:47;;;-1:-1:-1;;;45275:47:0;;-1:-1:-1;;;;;45275:47:0;;;;;;;;45208:29;;33290:42;;45275:35;;:47;;;;;;;;;;;;;;;33290:42;45275:47;;;5:2:-1;;;;30:1;27;20:12;5:2;45275:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45275:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45275:47:0;45375:83;;;-1:-1:-1;;;45375:83:0;;-1:-1:-1;;;;;45375:83:0;;;;;;;;;45275:47;;-1:-1:-1;45352:20:0;;45375:28;;;;;;:83;;;;;45275:47;;45375:83;;;;;;;;:28;:83;;;5:2:-1;;;;30:1;27;20:12;5:2;45375:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45375:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45375:83:0;;-1:-1:-1;;;;;;45494:29:0;;;45542:25;;;:50;;;;;45584:8;45571:10;:21;45538:67;;;45601:4;45594:11;;;;;;;45165:1028;45703:45;;;-1:-1:-1;;;45703:45:0;;-1:-1:-1;;;;;45703:45:0;;;;;;;;45638:27;;33290:42;;45703:35;;:45;;;;;;;;;;;;;;;33290:42;45703:45;;;5:2:-1;;;;30:1;27;20:12;5:2;45703:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45703:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45703:45:0;45845:47;;;-1:-1:-1;;;45845:47:0;;-1:-1:-1;;;;;45845:47:0;;;;;;;;45703:45;;-1:-1:-1;45778:29:0;;33290:42;;45845:35;;:47;;;;;45703:45;;45845:47;;;;;;;33290:42;45845:47;;;5:2:-1;;;;30:1;27;20:12;5:2;45845:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45845:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45845:47:0;45941:83;;;-1:-1:-1;;;45941:83:0;;-1:-1:-1;;;;;45941:83:0;;;;;;;;;45845:47;;-1:-1:-1;45922:16:0;;45941:28;;;;;;:83;;;;;45845:47;;45941:83;;;;;;;;:28;:83;;;5:2:-1;;;;30:1;27;20:12;5:2;45941:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45941:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45941:83:0;46058:47;;;-1:-1:-1;;;46058:47:0;;-1:-1:-1;;;;;46058:47:0;;;;;;;;;45941:83;;-1:-1:-1;46039:16:0;;46058:26;;;;;;:47;;;;;45941:83;;46058:47;;;;;;;;:26;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;46058:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46058:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46058:47:0;;-1:-1:-1;46124:21:0;;;:44;;;;;46160:8;46149;:19;46124:44;46120:61;;;46177:4;46170:11;;;;;;;;46120:61;45165:1028;;;;;-1:-1:-1;46210:5:0;44399:1824;;;;;;;:::o;56757:191::-;28375:9;:7;:9::i;:::-;28367:54;;;;;-1:-1:-1;;;28367:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28367:54:0;;;;;;;;;;;;;;;56851:38;;;-1:-1:-1;;;56851:38:0;;56883:4;56851:38;;;;;;56837:11;;-1:-1:-1;;;;;56851:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;56851:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56851:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56851:38:0;;-1:-1:-1;56900:40:0;56927:7;:5;:7::i;:::-;-1:-1:-1;;;;;56900:26:0;;;56936:3;56900:40;:26;:40;:::i;:::-;28432:1;56757:191;:::o;32918:22::-;;;-1:-1:-1;;;32918:22:0;;;;;:::o;28974:140::-;28375:9;:7;:9::i;:::-;28367:54;;;;;-1:-1:-1;;;28367:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28367:54:0;;;;;;;;;;;;;;;29073:1;29057:6;;29036:40;;29057:6;;;;-1:-1:-1;;;;;29057:6:0;;29036:40;;29073:1;;29036:40;29104:1;29087:19;;-1:-1:-1;;;;;;29087:19:0;;;28974:140::o;32884:27::-;;;-1:-1:-1;;;32884:27:0;;;;;:::o;48329:343::-;48443:7;48660:4;48488:169;48637:19;:9;48651:4;48637:19;:13;:19;:::i;:::-;48488:126;48540:59;48576:22;:9;48590:7;48576:22;:13;:22;:::i;:::-;48554:19;:6;48565:7;48554:19;:10;:19;:::i;:::-;48540:9;;48554:44;48540:59;:13;:59;:::i;:::-;48488:33;:126::i;:::-;:148;:169;:148;:169;:::i;:::-;:176;;;;;;48468:196;;48329:343;;;;;:::o;28163:79::-;28201:7;28228:6;;;;-1:-1:-1;;;;;28228:6:0;;28163:79::o;28529:94::-;28569:4;28609:6;;;;;-1:-1:-1;;;;;28609:6:0;28593:12;:10;:12::i;:::-;-1:-1:-1;;;;;28593:22:0;;28586:29;;28529:94;:::o;56511:238::-;28375:9;:7;:9::i;:::-;28367:54;;;;;-1:-1:-1;;;28367:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28367:54:0;;;;;;;;;;;;;;;56647:5;56631:13;:21;;;56587:119;;;;;-1:-1:-1;;;56587:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56717:8;:24;;;;;;-1:-1:-1;;;56717:24:0;-1:-1:-1;;;;56717:24:0;;;;;;;;;56511:238::o;27658:29::-;;;;;;-1:-1:-1;;;;;27658:29:0;;:::o;46283:1677::-;46392:4;-1:-1:-1;;;;;46436:24:0;;;;;:50;;-1:-1:-1;;;;;;46464:22:0;;;;46436:50;46414:123;;;;;-1:-1:-1;;;46414:123:0;;;;;;;;;;;;-1:-1:-1;;;46414:123:0;;;;;;;;;;;;;;;46568:8;-1:-1:-1;;;;;46554:22:0;:10;-1:-1:-1;;;;;46554:22:0;;46550:39;;;-1:-1:-1;46585:4:0;46578:11;;46550:39;-1:-1:-1;;;;;46606:24:0;;;;:58;;-1:-1:-1;;;;;;46634:30:0;;-1:-1:-1;;;;;;;;;;;46634:30:0;46606:58;46602:1328;;;-1:-1:-1;;;;;46685:28:0;;-1:-1:-1;;;;;;;;;;;46685:28:0;;:54;;-1:-1:-1;;;;;;46717:22:0;;;46685:54;46681:88;;;-1:-1:-1;46765:4:0;46758:11;;46681:88;46839:59;;;-1:-1:-1;;;46839:59:0;;-1:-1:-1;;;;;46839:59:0;;;;;;-1:-1:-1;;;;;;;;;;;46839:59:0;;;;;;46784:19;;33446:42;;46839:31;;:59;;;;;;;;;;;;;;;33446:42;46839:59;;;5:2:-1;;;;30:1;27;20:12;5:2;46839:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46839:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46839:59:0;;-1:-1:-1;46932:18:0;46839:59;46932:12;:18::i;:::-;46928:35;;;46959:4;46952:11;;;;;46928:35;46602:1328;;;;-1:-1:-1;;;;;46985:22:0;;;;:54;;-1:-1:-1;;;;;;47011:28:0;;-1:-1:-1;;;;;;;;;;;47011:28:0;46985:54;46981:949;;;-1:-1:-1;;;;;47060:30:0;;-1:-1:-1;;;;;;;;;;;47060:30:0;;:58;;-1:-1:-1;;;;;;47094:24:0;;;47060:58;47056:92;;;-1:-1:-1;47144:4:0;47137:11;;47056:92;47218:61;;;-1:-1:-1;;;47218:61:0;;-1:-1:-1;;;;;47218:61:0;;;;;;-1:-1:-1;;;;;;;;;;;47218:61:0;;;;;;47163:19;;33446:42;;47218:31;;:61;;;;;;;;;;;;;;;33446:42;47218:61;;;5:2:-1;;;;30:1;27;20:12;46981:949:0;47433:61;;;-1:-1:-1;;;47433:61:0;;-1:-1:-1;;;;;47433:61:0;;;;;;-1:-1:-1;;;;;;;;;;;47433:61:0;;;;;;47377:20;;33446:42;;47433:31;;:61;;;;;;;;;;;;;;;33446:42;47433:61;;;5:2:-1;;;;30:1;27;20:12;5:2;47433:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47433:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47433:61:0;47580:59;;;-1:-1:-1;;;47580:59:0;;-1:-1:-1;;;;;47580:59:0;;;;;;-1:-1:-1;;;;;;;;;;;47580:59:0;;;;;;47433:61;;-1:-1:-1;47524:20:0;;33446:42;;47580:31;;:59;;;;;47433:61;;47580:59;;;;;;;33446:42;47580:59;;;5:2:-1;;;;30:1;27;20:12;5:2;47580:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47580:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47580:59:0;47725:53;;;-1:-1:-1;;;47725:53:0;;-1:-1:-1;;;;;47725:53:0;;;;;;;;;;;;;;;47580:59;;-1:-1:-1;47669:20:0;;33446:42;;47725:31;;:53;;;;;47580:59;;47725:53;;;;;;;33446:42;47725:53;;;5:2:-1;;;;30:1;27;20:12;5:2;47725:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47725:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47725:53:0;;-1:-1:-1;47812:19:0;47825:5;47812:12;:19::i;:::-;:42;;;;;47835:19;47848:5;47835:12;:19::i;:::-;47808:59;;;47863:4;47856:11;;;;;;;47808:59;47886:19;47899:5;47886:12;:19::i;:::-;47882:36;;;47914:4;47907:11;;;;;;;47882:36;46981:949;;;;-1:-1:-1;47947:5:0;46283:1677;;;;:::o;29269:117::-;28375:9;:7;:9::i;:::-;28367:54;;;;;-1:-1:-1;;;28367:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28367:54:0;;;;;;;;;;;;;;;29350:28;29369:8;29350:18;:28::i;:::-;29269:117;:::o;14623:284::-;14820:68;;;-1:-1:-1;;;;;14820:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14820:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;14767:132:0;;14800:5;;14767:18;:132::i;:::-;14623:284;;;;:::o;36015:3361::-;36236:7;36256:20;36287;36324:49;36338:16;36356;36324:13;:49::i;:::-;36320:616;;;36421:171;36456:25;36500:16;36535;36570:7;36421:16;:171::i;:::-;36390:202;;-1:-1:-1;36390:202:0;-1:-1:-1;36320:616:0;;;36628:67;36642:16;36660;36678:7;36687;36628:13;:67::i;:::-;36610:326;;;36753:171;36788:25;36832:16;36867;36902:7;36753:16;:171::i;:::-;36722:202;;-1:-1:-1;36722:202:0;-1:-1:-1;36610:326:0;36971:1;36956:12;:16;:36;;;;;36991:1;36976:12;:16;36956:36;36948:67;;;;;-1:-1:-1;;;36948:67:0;;;;;;;;;;;;-1:-1:-1;;;36948:67:0;;;;;;;;;;;;;;;37028:113;-1:-1:-1;;;;;37028:36:0;;-1:-1:-1;;;;;;;;;;;37118:12:0;37028:113;:36;:113;:::i;:::-;37154;-1:-1:-1;;;;;37154:36:0;;-1:-1:-1;;;;;;;;;;;37244:12:0;37154:113;:36;:113;:::i;:::-;37329:252;;;-1:-1:-1;;;37329:252:0;;-1:-1:-1;;;;;37329:252:0;;;;;;;;;;;;;;;;;;;;;;;;;37502:1;37329:252;;;;;;;;;;37542:4;37329:252;;;;37568:2;37562:3;:8;37329:252;;;;;;37281:15;;;;;;-1:-1:-1;;;;;;;;;;;33134:42:0;37329;;:252;;;;;;;;;;;;;;;37281:15;33134:42;37329:252;;;5:2:-1;;;;30:1;27;20:12;5:2;37329:252:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37329:252:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37329:252:0;;;;;;;;;;;;;-1:-1:-1;37329:252:0;;-1:-1:-1;37329:252:0;-1:-1:-1;37629:65:0;-1:-1:-1;;;;;37629:36:0;;-1:-1:-1;;;;;;;;;;;37692:1:0;37629:65;:36;:65;:::i;:::-;37705;-1:-1:-1;;;;;37705:36:0;;-1:-1:-1;;;;;;;;;;;37768:1:0;37705:65;:36;:65;:::i;:::-;37783:15;37851:1;37813:35;37826:12;37840:7;37813:12;:35::i;:::-;:39;37809:546;;;37873:58;37887:16;37905:25;37873:13;:58::i;:::-;37869:475;;;37962:174;37995:16;38034:25;38082:35;38095:12;38109:7;38082:12;:35::i;:::-;37962:10;:174::i;:::-;37952:184;;37869:475;;;38177:151;38237:14;38274:35;38287:12;38301:7;38274:12;:35::i;:::-;-1:-1:-1;;;;;38177:37:0;;;:151;;:37;:151;:::i;:::-;38409:1;38371:35;38384:12;38398:7;38371:12;:35::i;:::-;:39;38367:547;;;38431:58;38445:16;38463:25;38431:13;:58::i;:::-;38427:476;;;38521:174;38554:16;38593:25;38641:35;38654:12;38668:7;38641:12;:35::i;38521:174::-;38510:185;38427:476;;;38736:151;38796:14;38833:35;38846:12;38860:7;38833:12;:35::i;:::-;-1:-1:-1;;;;;38736:37:0;;;:151;;:37;:151;:::i;:::-;38930:11;;38926:421;;-1:-1:-1;;;;;38962:39:0;;;38958:378;;39022:132;-1:-1:-1;;;;;39022:46:0;;39091:14;39128:7;39022:132;:46;:132;:::i;:::-;38958:378;;;39214:38;;39196:12;;-1:-1:-1;;;;;39214:19:0;;;39240:7;;39196:12;39214:38;39196:12;39214:38;39240:7;39214:19;:38;;;;;;;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;;39195:57:0;;;39279:7;39271:49;;;;;-1:-1:-1;;;39271:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38958:378;;-1:-1:-1;39366:2:0;36015:3361;-1:-1:-1;;;;;;;;;;36015:3361:0:o;56024:479::-;56147:23;56255:8;;56201:94;;56228:36;;56241:12;;-1:-1:-1;;;56255:8:0;;;;56228:12;:36::i;:::-;56279:5;56201:12;:94::i;:::-;56183:112;-1:-1:-1;56312:20:0;56308:61;;-1:-1:-1;56356:1:0;56349:8;;56308:61;56381:114;-1:-1:-1;;;;;56381:42:0;;33000;56469:15;56381:114;:42;:114;:::i;6252:136::-;6310:7;6337:43;6341:1;6344;6337:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6330:50;6252:136;-1:-1:-1;;;6252:136:0:o;14368:247::-;14538:58;;;-1:-1:-1;;;;;14538:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14538:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;14485:122:0;;14518:5;;14485:18;:122::i;12133:159::-;12275:7;12133:159;;;;:::o;7202:471::-;7260:7;7505:6;7501:47;;-1:-1:-1;7535:1:0;7528:8;;7501:47;7572:5;;;7576:1;7572;:5;:1;7596:5;;;;;:10;7588:56;;;;-1:-1:-1;;;7588:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29861:335;29909:9;29939:1;29935;:5;29931:235;;;-1:-1:-1;29961:1:0;29997;29993;29989:5;;:9;30013:92;30024:1;30020;:5;30013:92;;;30050:1;30046:5;;30088:1;30083;30079;30075;:5;;;;;;:9;30074:15;;;;;;30070:19;;30013:92;;;29931:235;;;;30126:6;;30122:44;;-1:-1:-1;30153:1:0;29861:335;;;:::o;26855:98::-;26935:10;26855:98;:::o;48034:287::-;48100:4;-1:-1:-1;;;;;48121:27:0;;;48117:197;;48166:12;48180;48198:4;-1:-1:-1;;;;;48198:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48198:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48198:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48198:18:0;;;;;;;-1:-1:-1;;;;;48165:51:0;;;;-1:-1:-1;48165:51:0;;-1:-1:-1;48235:8:0;;;;;:20;;;48254:1;48247:4;:8;48235:20;48231:72;;;48283:4;48276:11;;;;;;48231:72;48117:197;;48034:287;;;:::o;29492:274::-;-1:-1:-1;;;;;29588:22:0;;29566:110;;;;-1:-1:-1;;;29566:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29713:6;;;29692:38;;-1:-1:-1;;;;;29692:38:0;;;;29713:6;;;;;;29692:38;;;29741:6;:17;;-1:-1:-1;;;;;29741:17:0;;;;;-1:-1:-1;;;;;;29741:17:0;;;;;;;;;29492:274::o;16978:1176::-;17582:27;17590:5;-1:-1:-1;;;;;17582:25:0;;:27::i;:::-;17574:71;;;;;-1:-1:-1;;;17574:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17719:12;17733:23;17768:5;-1:-1:-1;;;;;17760:19:0;17780:4;17760: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;;;17760: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;;17718:67:0;;;;17804:7;17796:52;;;;;-1:-1:-1;;;17796:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17865:17;;:21;17861:286;;18038:10;18027:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18027:30:0;18001:134;;;;-1:-1:-1;;;18001:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42344:1995;42641:67;;;-1:-1:-1;;;42641:67:0;;-1:-1:-1;;;;;42641:67:0;;;;;;;;;;;;;;;42535:20;;;;;;33446:42;;42641:31;;:67;;;;;;;;;;;;;;;33446:42;42641:67;;;5:2:-1;;;;30:1;27;20:12;5:2;42641:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42641:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42641:67:0;42763:18;;;-1:-1:-1;;;42763:18:0;;;;42641:67;;-1:-1:-1;42731:12:0;;;;-1:-1:-1;;;;;42763:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;42763:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42763:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42763:18:0;;;;;;;-1:-1:-1;;;;;42730:51:0;;;;-1:-1:-1;42730:51:0;;-1:-1:-1;42810:58:0;42824:25;42851:16;42810:13;:58::i;:::-;:124;;;;;42885:49;42899:16;42917;42885:13;:49::i;:::-;42792:1540;;;42976:130;43005:25;43049:16;43084:7;42976:10;:130::i;:::-;42961:145;;43121:20;43144:41;43166:4;43172:12;43144:21;:41::i;:::-;43121:64;;43274:1;43258:12;:17;43254:67;;43292:29;43305:12;43319:1;43292:12;:29::i;:::-;43277:44;;43254:67;43351:126;43380:16;43415;43450:12;43351:10;:126::i;:::-;43336:141;;43507:40;43520:12;43534;43507;:40::i;:::-;43492:55;;42792:1540;;;;43583:58;43597:25;43624:16;43583:13;:58::i;:::-;:124;;;;;43658:49;43672:16;43690;43658:13;:49::i;:::-;43565:767;;;43749:130;43778:25;43822:16;43857:7;43749:10;:130::i;:::-;43734:145;;43894:20;43917:41;43939:4;43945:12;43917:21;:41::i;:::-;43894:64;;44047:1;44031:12;:17;44027:67;;44065:29;44078:12;44092:1;44065:12;:29::i;:::-;44050:44;;44027:67;44124:126;44153:16;44188;44223:12;44124:10;:126::i;:::-;44109:141;;44280:40;44293:12;44307;44280;:40::i;:::-;44265:55;;43565:767;;42344:1995;;;;;;;;;;:::o;39384:2952::-;39681:67;;;-1:-1:-1;;;39681:67:0;;-1:-1:-1;;;;;39681:67:0;;;;;;;;;;;;;;;39575:20;;;;;;33446:42;;39681:31;;:67;;;;;;;;;;;;;;;33446:42;39681:67;;;5:2:-1;;;;30:1;27;20:12;5:2;39681:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39681:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39681:67:0;39803:18;;;-1:-1:-1;;;39803:18:0;;;;39681:67;;-1:-1:-1;39771:12:0;;;;-1:-1:-1;;;;;39803:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;39803:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39803:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39803:18:0;;;;;;;-1:-1:-1;;;;;39770:51:0;;;;-1:-1:-1;39770:51:0;;-1:-1:-1;;;;;;39836:39:0;;39832:2497;;39907:37;39918:16;39936:7;39907:10;:37::i;:::-;39892:52;;39959:20;39982:41;40004:4;40010:12;39982:21;:41::i;:::-;39959:64;;40112:1;40096:12;:17;40092:67;;40130:29;40143:12;40157:1;40130:12;:29::i;:::-;40115:44;;40092:67;40189:42;40200:16;40218:12;40189:10;:42::i;39832:2497::-;40358:25;-1:-1:-1;;;;;40338:45:0;:16;-1:-1:-1;;;;;40338:45:0;;40334:1984;;;40404:20;40427:36;40449:4;40455:7;40427:21;:36::i;:::-;40404:59;;40560:1;40544:12;:17;40540:62;;40578:24;40591:7;40600:1;40578:12;:24::i;:::-;40563:39;;40540:62;40636:189;40671:25;40727:4;40755:16;40794:12;40636;:189::i;:::-;40621:204;;40861:35;40874:7;40883:12;40861;:35::i;40334:1984::-;40942:25;-1:-1:-1;;;;;40922:45:0;:16;-1:-1:-1;;;;;40922:45:0;;40918:1400;;;40988:20;41011:36;41033:4;41039:7;41011:21;:36::i;:::-;40988:59;;41144:1;41128:12;:17;41124:62;;41162:24;41175:7;41184:1;41162:12;:24::i;:::-;41147:39;;41124:62;41220:189;41255:25;41311:4;41339:16;41378:12;41220;:189::i;:::-;41205:204;;41445:35;41458:7;41467:12;41445;:35::i;:::-;41430:50;;40918:1400;;;;41536:184;41571:25;41627:4;41655:16;41694:7;41536:12;:184::i;:::-;41521:199;;41739:20;41762:102;41806:4;41833:12;41762:21;:102::i;:::-;41739:125;;41961:1;41945:12;:17;41941:62;;41979:24;41992:7;42001:1;41979:12;:24::i;:::-;41964:39;;41941:62;42039:189;42074:25;42130:4;42158:16;42197:12;42039;:189::i;:::-;42024:204;;42262:40;42275:12;42289;42262;:40::i;:::-;42247:55;;40918:1400;39384:2952;;;;;;;;;;:::o;14915:706::-;15333:10;;;15332:62;;-1:-1:-1;15349:39:0;;;-1:-1:-1;;;15349:39:0;;15373:4;15349:39;;;;-1:-1:-1;;;;;15349:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;15349:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15349:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15349:39:0;:44;15332:62;15310:166;;;;-1:-1:-1;;;15310:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15540:62;;;-1:-1:-1;;;;;15540:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15540:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;15487:126:0;;15520:5;;15487:18;:126::i;48772:2164::-;48898:7;-1:-1:-1;;;;;48940:24:0;;;;;:50;;-1:-1:-1;;;;;;48968:22:0;;;;48940:50;48918:123;;;;;-1:-1:-1;;;48918:123:0;;;;;;;;;;;;-1:-1:-1;;;48918:123:0;;;;;;;;;;;;;;;49070:8;-1:-1:-1;;;;;49056:22:0;:10;-1:-1:-1;;;;;49056:22:0;;49052:41;;;-1:-1:-1;49087:6:0;49080:13;;49052:41;49114:35;49128:10;49140:8;49114:13;:35::i;:::-;49106:67;;;;;-1:-1:-1;;;49106:67:0;;;;;;;;;;;;-1:-1:-1;;;49106:67:0;;;;;;;;;;;;;;;49201:1;49192:6;:10;49184:37;;;;;-1:-1:-1;;;49184:37:0;;;;;;;;;;;;-1:-1:-1;;;49184:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49238:24:0;;49234:1695;;-1:-1:-1;;;;;49283:28:0;;-1:-1:-1;;;;;;;;;;;49283:28:0;49279:148;;;-1:-1:-1;;;;;;;;;;;;;;;;49332:31:0;;49370:6;49332:47;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49332:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49332:47:0;;;;;49405:6;49398:13;;;;49279:148;49465:16;;;49479:1;49465:16;;;49441:21;49465:16;;;;;49441:21;49465:16;;;;;105:10:-1;49465:16:0;88:34:-1;136:17;;-1:-1;49465:16:0;49441:40;;-1:-1:-1;;;;;;;;;;;49496:4:0;49501:1;49496:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;49496:26:0;;;-1:-1:-1;;;;;49496:26:0;;;;;49547:8;49537:4;49542:1;49537:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;49537:18:0;;;-1:-1:-1;;;;;49537:18:0;;;;;49572:24;-1:-1:-1;;;;;;;;;;;;;;;;49599:55:0;;49679:6;49687:1;49690:4;49704;49711:3;49717;49711:9;49599:122;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49599:122:0;-1:-1:-1;;;;;49599:122: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;49599:122:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49599:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49599:122:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;49599:122: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;49599:122: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;49599:122:0;;421:4:-1;412:14;;;;49599:122:0;;;;;412:14:-1;49599:122: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;49599:122:0;;;;;;;;;;;49572:149;;49743:7;49751:1;49743:10;;;;;;;;;;;;;;49736:17;;;;;;49234:1695;-1:-1:-1;;;;;49775:22:0;;49771:1158;;-1:-1:-1;;;;;49818:30:0;;-1:-1:-1;;;;;;;;;;;49818:30:0;49814:143;;;-1:-1:-1;;;;;;;;;;;;;;;;49869:32:0;;49902:6;49869:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49869:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49869:40:0;;;;49935:6;49928:13;;;;49814:143;49995:16;;;50009:1;49995:16;;;49971:21;49995:16;;;;;49971:21;49995:16;;;;;105:10:-1;49995:16:0;88:34:-1;136:17;;-1:-1;;49971:40:0;-1:-1:-1;50026:64:0;-1:-1:-1;;;;;50026:30:0;;-1:-1:-1;;;;;;;;;;;50083:6:0;50026:64;:30;:64;:::i;:::-;50115:10;50105:4;50110:1;50105:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;50105:20:0;;;-1:-1:-1;;;;;50105:20:0;;;;;-1:-1:-1;;;;;;;;;;;50140:4:0;50145:1;50140:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;50140:26:0;;;-1:-1:-1;;;;;50140:26:0;;;;;50183:24;-1:-1:-1;;;;;;;;;;;;;;;;50210:37:0;;50266:6;50291:1;50311:4;50342;50366:3;50372;50366:9;50210:180;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50210:180:0;-1:-1:-1;;;;;50210:180: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;50210:180:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50210:180:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50210:180:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;50210:180: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;50210:180: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;50210:180:0;;421:4:-1;412:14;;;;50210:180:0;;;;;412:14:-1;50210:180: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;50210:180:0;;;;;;;;;;;50183:207;;50405:59;-1:-1:-1;;;;;;;;;;;50462:1:0;50412:10;-1:-1:-1;;;;;50405:30:0;;;:59;;;;;:::i;:::-;50486:7;50494:1;50486:10;;;;;;;49771:1158;50529:64;-1:-1:-1;;;;;50529:30:0;;-1:-1:-1;;;;;;;;;;;50586:6:0;50529:64;:30;:64;:::i;:::-;50608:22;50633:115;50671:10;50700:8;50727:6;50633:19;:115::i;:::-;50608:140;-1:-1:-1;50763:59:0;-1:-1:-1;;;;;50763:30:0;;-1:-1:-1;;;;;;;;;;;50820:1:0;50763:59;:30;:59;:::i;:::-;50862:1;50845:14;:18;50837:44;;;;;-1:-1:-1;;;50837:44:0;;;;;;;;;;;;-1:-1:-1;;;50837:44:0;;;;;;;;;;;;;;8141:132;8199:7;8226:39;8230:1;8233;8226:39;;;;;;;;;;;;;;;;;:3;:39::i;6725:226::-;6845:7;6881:12;6873:6;;;;6865:29;;;;-1:-1:-1;;;6865:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6865:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6917:5:0;;;6725:226::o;11257:659::-;11317:4;11816:20;;11646:66;11865:23;;;;;;:42;;-1:-1:-1;;11892:15:0;;;11857:51;-1:-1:-1;;11257:659:0:o;52720:454::-;52946:58;;;-1:-1:-1;;;52946:58:0;;-1:-1:-1;;;;;52946:58:0;;;;;;;;52824:19;;;;33290:42;;52946:35;;:58;;;;;;;;;;;;;;33290:42;52946:58;;;5:2:-1;;;;30:1;27;20:12;5:2;52946:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52946:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52946:58:0;;-1:-1:-1;;;;;;53042:68:0;;;53131:7;53140:1;53143:22;53156:3;53161;53143:12;:22::i;:::-;53042:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53042:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53042:124:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53042:124:0;;52720:454;-1:-1:-1;;;;52720:454:0:o;54713:1030::-;55027:62;;;-1:-1:-1;;;55027:62:0;;-1:-1:-1;;;;;55027:62:0;;;;;;;;54910:19;;;;33290:42;;55027:35;;:62;;;;;;;;;;;;;;33290:42;55027:62;;;5:2:-1;;;;30:1;27;20:12;5:2;55027:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55027:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55027:62:0;;-1:-1:-1;55113:141:0;-1:-1:-1;;;;;55113:45:0;;55027:62;55231:12;55113:141;:45;:141;:::i;:::-;55281:34;-1:-1:-1;;;;;55281:74:0;;55370:12;55397:1;55413;55429:22;55442:3;55447;55429:12;:22::i;:::-;55281:248;;;-1:-1:-1;;;;;;55281:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55281:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55281:248:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;55281:248:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55281:248:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55281:248:0;;-1:-1:-1;55548:15:0;55540:52;;;;;-1:-1:-1;;;55540:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55605:130;-1:-1:-1;;;;;55605:45:0;;55673:34;55723:1;55605:130;:45;:130;:::i;:::-;54713:1030;;;;;;;:::o;50978:1489::-;51185:61;;;-1:-1:-1;;;51185:61:0;;-1:-1:-1;;;;;51185:61:0;;;;;;-1:-1:-1;;;;;;;;;;;51185:61:0;;;;;;51113:7;;;;33446:42;;51185:31;;:61;;;;;;;;;;;;;;33446:42;51185:61;;;5:2:-1;;;;30:1;27;20:12;5:2;51185:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51185:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51185:61:0;51320:59;;;-1:-1:-1;;;51320:59:0;;-1:-1:-1;;;;;51320:59:0;;;;;;-1:-1:-1;;;;;;;;;;;51320:59:0;;;;;;51185:61;;-1:-1:-1;51268:20:0;;33446:42;;51320:31;;:59;;;;;51185:61;;51320:59;;;;;;;33446:42;51320:59;;;5:2:-1;;;;30:1;27;20:12;5:2;51320:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51320:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51320:59:0;51453:53;;;-1:-1:-1;;;51453:53:0;;-1:-1:-1;;;;;51453:53:0;;;;;;;;;;;;;;;51320:59;;-1:-1:-1;51401:20:0;;33446:42;;51453:31;;:53;;;;;51320:59;;51453:53;;;;;;;33446:42;51453:53;;;5:2:-1;;;;30:1;27;20:12;5:2;51453:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51453:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51453:53:0;;-1:-1:-1;51530:24:0;51571:19;51453:53;51571:12;:19::i;:::-;51567:874;;;51631:16;;;51645:1;51631:16;;;51607:21;51631:16;;;;;51607:21;51631:16;;;;;105:10:-1;51631:16:0;88:34:-1;136:17;;-1:-1;51631:16:0;51607:40;;51672:10;51662:4;51667:1;51662:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;51662:20:0;;;-1:-1:-1;;;;;51662:20:0;;;;;51707:8;51697:4;51702:1;51697:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;51697:18:0;;;-1:-1:-1;;;;;51697:18:0;;;;;-1:-1:-1;;;;;;;;;;;;;;;;51742:40:0;;51801:6;51826:1;51846:4;51877;51901:3;51907;51901:9;51742:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51742:183:0;-1:-1:-1;;;;;51742:183: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;51742:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51742:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51742:183:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;51742:183: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;51742:183: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;51742:183:0;;421:4:-1;412:14;;;;51742:183:0;;;;;412:14:-1;51742:183: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;51742:183:0;;;;;;;;;;;51732:193;;51947:7;51955:1;51947:10;;;;;;;;;;;;;;51940:17;;;;;;;;;51567:874;51979:19;51992:5;51979:12;:19::i;:::-;:42;;;;;52002:19;52015:5;52002:12;:19::i;:::-;51975:466;;;52062:16;;;52076:1;52062:16;;;;;;;;;52038:21;;52062:16;;;52038:21;;105:10:-1;52062:16:0;88:34:-1;136:17;;-1:-1;52062:16:0;52038:40;;52103:10;52093:4;52098:1;52093:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;52093:20:0;;;-1:-1:-1;;;;;52093:20:0;;;;;-1:-1:-1;;;;;;;;;;;52128:4:0;52133:1;52128:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;52128:26:0;;;-1:-1:-1;;;;;52128:26:0;;;;;52179:8;52169:4;52174:1;52169:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;52169:18:0;;;-1:-1:-1;;;;;52169:18:0;;;;;-1:-1:-1;;;;;;;;;;;;;;;;52214:40:0;;52273:6;52298:1;52318:4;52349;52373:3;52379;52373:9;52214:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52214:183:0;-1:-1:-1;;;;;52214:183: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;52214:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52214:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52214:183:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;52214:183: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;52214:183: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;52214:183:0;;421:4:-1;412:14;;;;52214:183:0;;;;;412:14:-1;52214:183: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;52214:183:0;;;;;;;;;;;52204:193;;52419:7;52427:1;52419:10;;;;;;;51975:466;-1:-1:-1;52458:1:0;;50978:1489;-1:-1:-1;;;;;;;50978:1489:0:o;8803:379::-;8923:7;9025:12;9018:5;9010:28;;;;-1:-1:-1;;;9010:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9010:28:0;;9049:9;9065:1;9061;:5;;;;;;;8803:379;-1:-1:-1;;;;;8803:379:0:o;5796:181::-;5854:7;5886:5;;;5910:6;;;;5902:46;;;;;-1:-1:-1;;;5902:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://ba929d2aad3ba9b7979203d0725aaefde47e0f4a7d5bc5af68df9fecdb1bd550
Loading...
Loading
Loading...
Loading
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.