Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 15283253 | 890 days ago | IN | 0 ETH | 0.00125661 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SavingAccount
Compiler Version
v0.5.14+commit.01f1aaa4
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-05 */ pragma solidity 0.5.14; /** * @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; } } /* * @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; } } /** * @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 private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract GlobalConfig is Ownable { using SafeMath for uint256; uint256 public communityFundRatio = 10; uint256 public minReserveRatio = 10; uint256 public maxReserveRatio = 20; uint256 public liquidationThreshold = 85; uint256 public liquidationDiscountRatio = 95; uint256 public compoundSupplyRateWeights = 4; uint256 public compoundBorrowRateWeights = 6; uint256 public rateCurveSlope = 15 * 10 ** 16; uint256 public rateCurveConstant = 3 * 10 ** 16; uint256 public deFinerRate = 10; address payable public deFinerCommunityFund = msg.sender; address public bank; // the Bank contract address public savingAccount; // the SavingAccount contract address public tokenInfoRegistry; // the TokenRegistry contract address public accounts; // the Accounts contract address public constants; // the constants contract event CommunityFundRatioUpdated(uint256 indexed communityFundRatio); event MinReserveRatioUpdated(uint256 indexed minReserveRatio); event MaxReserveRatioUpdated(uint256 indexed maxReserveRatio); event LiquidationThresholdUpdated(uint256 indexed liquidationThreshold); event LiquidationDiscountRatioUpdated(uint256 indexed liquidationDiscountRatio); event CompoundSupplyRateWeightsUpdated(uint256 indexed compoundSupplyRateWeights); event CompoundBorrowRateWeightsUpdated(uint256 indexed compoundBorrowRateWeights); event rateCurveSlopeUpdated(uint256 indexed rateCurveSlope); event rateCurveConstantUpdated(uint256 indexed rateCurveConstant); event ConstantUpdated(address indexed constants); event BankUpdated(address indexed bank); event SavingAccountUpdated(address indexed savingAccount); event TokenInfoRegistryUpdated(address indexed tokenInfoRegistry); event AccountsUpdated(address indexed accounts); event DeFinerCommunityFundUpdated(address indexed deFinerCommunityFund); event DeFinerRateUpdated(uint256 indexed deFinerRate); event ChainLinkUpdated(address indexed chainLink); function initialize( address _bank, address _savingAccount, address _tokenInfoRegistry, address _accounts, address _constants ) public onlyOwner { bank = _bank; savingAccount = _savingAccount; tokenInfoRegistry = _tokenInfoRegistry; accounts = _accounts; constants = _constants; } /** * Update the community fund (commision fee) ratio. * @param _communityFundRatio the new ratio */ function updateCommunityFundRatio(uint256 _communityFundRatio) external onlyOwner { if (_communityFundRatio == communityFundRatio) return; require(_communityFundRatio > 0 && _communityFundRatio < 100, "Invalid community fund ratio."); communityFundRatio = _communityFundRatio; emit CommunityFundRatioUpdated(_communityFundRatio); } /** * Update the minimum reservation reatio * @param _minReserveRatio the new value of the minimum reservation ratio */ function updateMinReserveRatio(uint256 _minReserveRatio) external onlyOwner { if (_minReserveRatio == minReserveRatio) return; require(_minReserveRatio > 0 && _minReserveRatio < maxReserveRatio, "Invalid min reserve ratio."); minReserveRatio = _minReserveRatio; emit MinReserveRatioUpdated(_minReserveRatio); } /** * Update the maximum reservation reatio * @param _maxReserveRatio the new value of the maximum reservation ratio */ function updateMaxReserveRatio(uint256 _maxReserveRatio) external onlyOwner { if (_maxReserveRatio == maxReserveRatio) return; require(_maxReserveRatio > minReserveRatio && _maxReserveRatio < 100, "Invalid max reserve ratio."); maxReserveRatio = _maxReserveRatio; emit MaxReserveRatioUpdated(_maxReserveRatio); } /** * Update the liquidation threshold, i.e. the LTV that will trigger the liquidation. * @param _liquidationThreshold the new threshhold value */ function updateLiquidationThreshold(uint256 _liquidationThreshold) external onlyOwner { if (_liquidationThreshold == liquidationThreshold) return; require(_liquidationThreshold > 0 && _liquidationThreshold < liquidationDiscountRatio, "Invalid liquidation threshold."); liquidationThreshold = _liquidationThreshold; emit LiquidationThresholdUpdated(_liquidationThreshold); } /** * Update the liquidation discount * @param _liquidationDiscountRatio the new liquidation discount */ function updateLiquidationDiscountRatio(uint256 _liquidationDiscountRatio) external onlyOwner { if (_liquidationDiscountRatio == liquidationDiscountRatio) return; require(_liquidationDiscountRatio > liquidationThreshold && _liquidationDiscountRatio < 100, "Invalid liquidation discount ratio."); liquidationDiscountRatio = _liquidationDiscountRatio; emit LiquidationDiscountRatioUpdated(_liquidationDiscountRatio); } /** * Medium value of the reservation ratio, which is the value that the pool try to maintain. */ function midReserveRatio() public view returns(uint256){ return minReserveRatio.add(maxReserveRatio).div(2); } function updateCompoundSupplyRateWeights(uint256 _compoundSupplyRateWeights) external onlyOwner{ compoundSupplyRateWeights = _compoundSupplyRateWeights; emit CompoundSupplyRateWeightsUpdated(_compoundSupplyRateWeights); } function updateCompoundBorrowRateWeights(uint256 _compoundBorrowRateWeights) external onlyOwner{ compoundBorrowRateWeights = _compoundBorrowRateWeights; emit CompoundBorrowRateWeightsUpdated(_compoundBorrowRateWeights); } function updaterateCurveSlope(uint256 _rateCurveSlope) external onlyOwner{ rateCurveSlope = _rateCurveSlope; emit rateCurveSlopeUpdated(_rateCurveSlope); } function updaterateCurveConstant(uint256 _rateCurveConstant) external onlyOwner{ rateCurveConstant = _rateCurveConstant; emit rateCurveConstantUpdated(_rateCurveConstant); } function updateBank(address _bank) external onlyOwner{ bank = _bank; emit BankUpdated(address(_bank)); } function updateSavingAccount(address _savingAccount) external onlyOwner{ savingAccount = _savingAccount; emit SavingAccountUpdated(address(_savingAccount)); } function updateTokenInfoRegistry(address _tokenInfoRegistry) external onlyOwner{ tokenInfoRegistry = _tokenInfoRegistry; emit TokenInfoRegistryUpdated(address(_tokenInfoRegistry)); } function updateAccounts(address _accounts) external onlyOwner{ accounts = _accounts; emit AccountsUpdated(address(_accounts)); } function updateConstant(address _constants) external onlyOwner{ constants = _constants; emit ConstantUpdated(address(_constants)); } function updatedeFinerCommunityFund(address payable _deFinerCommunityFund) external onlyOwner{ deFinerCommunityFund = _deFinerCommunityFund; emit DeFinerCommunityFundUpdated(_deFinerCommunityFund); } function updatedeFinerRate(uint256 _deFinerRate) external onlyOwner{ require(_deFinerRate <= 100,"_deFinerRate cannot exceed 100"); deFinerRate = _deFinerRate; emit DeFinerRateUpdated(_deFinerRate); } } contract Constant { enum ActionType { DepositAction, WithdrawAction, BorrowAction, RepayAction, LiquidateRepayAction } address public constant ETH_ADDR = 0x000000000000000000000000000000000000000E; uint256 public constant INT_UNIT = 10 ** uint256(18); uint256 public constant ACCURACY = 10 ** 18; // Ethereum mainnet blocks per year uint256 public constant BLOCKS_PER_YEAR = 2102400; } library Utils{ function _isETH(address globalConfig, address _token) public view returns (bool) { return IConstant(IGlobalConfig(globalConfig).constants()).ETH_ADDR() == _token; } function getDivisor(address globalConfig, address _token) public view returns (uint256) { if(_isETH(globalConfig, _token)) return IConstant(IGlobalConfig(globalConfig).constants()).INT_UNIT(); return 10 ** uint256(ITokenRegistry(IGlobalConfig(globalConfig).tokenInfoRegistry()).getTokenDecimals(_token)); } } /** * @dev Token Info Registry to manage Token information * The Owner of the contract allowed to update the information */ contract TokenRegistry is Ownable, Constant { using SafeMath for uint256; /** * @dev TokenInfo struct stores Token Information, this includes: * ERC20 Token address, Compound Token address, ChainLink Aggregator address etc. * @notice This struct will consume 5 storage locations */ struct TokenInfo { // Token index, can store upto 255 uint8 index; // ERC20 Token decimal uint8 decimals; // If token is enabled / disabled bool enabled; // Is ERC20 token charge transfer fee? bool isTransferFeeEnabled; // Is Token supported on Compound bool isSupportedOnCompound; // cToken address on Compound address cToken; // Chain Link Aggregator address for TOKEN/ETH pair address chainLinkOracle; // Borrow LTV, by default 60% uint256 borrowLTV; } event TokenAdded(address indexed token); event TokenUpdated(address indexed token); uint256 public constant MAX_TOKENS = 128; uint256 public constant SCALE = 100; // TokenAddress to TokenInfo mapping mapping (address => TokenInfo) public tokenInfo; // TokenAddress array address[] public tokens; GlobalConfig public globalConfig; /** */ modifier whenTokenExists(address _token) { require(isTokenExist(_token), "Token not exists"); _; } /** * initializes the symbols structure */ function initialize(GlobalConfig _globalConfig) public onlyOwner{ globalConfig = _globalConfig; } /** * @dev Add a new token to registry * @param _token ERC20 Token address * @param _decimals Token's decimals * @param _isTransferFeeEnabled Is token changes transfer fee * @param _isSupportedOnCompound Is token supported on Compound * @param _cToken cToken contract address * @param _chainLinkOracle Chain Link Aggregator address to get TOKEN/ETH rate */ function addToken( address _token, uint8 _decimals, bool _isTransferFeeEnabled, bool _isSupportedOnCompound, address _cToken, address _chainLinkOracle ) public onlyOwner { require(_token != address(0), "Token address is zero"); require(!isTokenExist(_token), "Token already exist"); require(_chainLinkOracle != address(0), "ChainLinkAggregator address is zero"); require(tokens.length < MAX_TOKENS, "Max token limit reached"); TokenInfo storage storageTokenInfo = tokenInfo[_token]; storageTokenInfo.index = uint8(tokens.length); storageTokenInfo.decimals = _decimals; storageTokenInfo.enabled = true; storageTokenInfo.isTransferFeeEnabled = _isTransferFeeEnabled; storageTokenInfo.isSupportedOnCompound = _isSupportedOnCompound; storageTokenInfo.cToken = _cToken; storageTokenInfo.chainLinkOracle = _chainLinkOracle; // Default values storageTokenInfo.borrowLTV = 60; //6e7; // 60% tokens.push(_token); emit TokenAdded(_token); } function updateBorrowLTV( address _token, uint256 _borrowLTV ) external onlyOwner whenTokenExists(_token) { if (tokenInfo[_token].borrowLTV == _borrowLTV) return; // require(_borrowLTV != 0, "Borrow LTV is zero"); require(_borrowLTV < SCALE, "Borrow LTV must be less than Scale"); // require(liquidationThreshold > _borrowLTV, "Liquidation threshold must be greater than Borrow LTV"); tokenInfo[_token].borrowLTV = _borrowLTV; emit TokenUpdated(_token); } /** */ function updateTokenTransferFeeFlag( address _token, bool _isTransfeFeeEnabled ) external onlyOwner whenTokenExists(_token) { if (tokenInfo[_token].isTransferFeeEnabled == _isTransfeFeeEnabled) return; tokenInfo[_token].isTransferFeeEnabled = _isTransfeFeeEnabled; emit TokenUpdated(_token); } /** */ function updateTokenSupportedOnCompoundFlag( address _token, bool _isSupportedOnCompound ) external onlyOwner whenTokenExists(_token) { if (tokenInfo[_token].isSupportedOnCompound == _isSupportedOnCompound) return; tokenInfo[_token].isSupportedOnCompound = _isSupportedOnCompound; emit TokenUpdated(_token); } /** */ function updateCToken( address _token, address _cToken ) external onlyOwner whenTokenExists(_token) { if (tokenInfo[_token].cToken == _cToken) return; tokenInfo[_token].cToken = _cToken; emit TokenUpdated(_token); } /** */ function updateChainLinkAggregator( address _token, address _chainLinkOracle ) external onlyOwner whenTokenExists(_token) { if (tokenInfo[_token].chainLinkOracle == _chainLinkOracle) return; tokenInfo[_token].chainLinkOracle = _chainLinkOracle; emit TokenUpdated(_token); } function enableToken(address _token) external onlyOwner whenTokenExists(_token) { require(!tokenInfo[_token].enabled, "Token already enabled"); tokenInfo[_token].enabled = true; emit TokenUpdated(_token); } function disableToken(address _token) external onlyOwner whenTokenExists(_token) { require(tokenInfo[_token].enabled, "Token already disabled"); tokenInfo[_token].enabled = false; emit TokenUpdated(_token); } // ===================== // GETTERS // ===================== /** * @dev Is token address is registered * @param _token token address * @return Returns `true` when token registered, otherwise `false` */ function isTokenExist(address _token) public view returns (bool isExist) { isExist = tokenInfo[_token].chainLinkOracle != address(0); } function getTokens() external view returns (address[] memory) { return tokens; } function getTokenIndex(address _token) external view returns (uint8) { return tokenInfo[_token].index; } function isTokenEnabled(address _token) external view returns (bool) { return tokenInfo[_token].enabled; } /** */ function getCTokens() external view returns (address[] memory cTokens) { uint256 len = tokens.length; cTokens = new address[](len); for(uint256 i = 0; i < len; i++) { cTokens[i] = tokenInfo[tokens[i]].cToken; } } function getTokenDecimals(address _token) public view returns (uint8) { return tokenInfo[_token].decimals; } function isTransferFeeEnabled(address _token) external view returns (bool) { return tokenInfo[_token].isTransferFeeEnabled; } function isSupportedOnCompound(address _token) external view returns (bool) { return tokenInfo[_token].isSupportedOnCompound; } /** */ function getCToken(address _token) external view returns (address) { return tokenInfo[_token].cToken; } function getChainLinkAggregator(address _token) external view returns (address) { return tokenInfo[_token].chainLinkOracle; } function getBorrowLTV(address _token) external view returns (uint256) { return tokenInfo[_token].borrowLTV; } function getCoinLength() public view returns (uint256 length) { return tokens.length; } function addressFromIndex(uint index) public view returns(address) { require(index < tokens.length, "coinIndex must be smaller than the coins length."); return tokens[index]; } function priceFromIndex(uint index) public view returns(uint256) { require(index < tokens.length, "coinIndex must be smaller than the coins length."); address tokenAddress = tokens[index]; // Temp fix if(Utils._isETH(address(globalConfig), tokenAddress)) { return 1e18; } return uint256(IAggregator(tokenInfo[tokenAddress].chainLinkOracle).latestAnswer()); } function priceFromAddress(address tokenAddress) public view returns(uint256) { if(Utils._isETH(address(globalConfig), tokenAddress)) { return 1e18; } return uint256(IAggregator(tokenInfo[tokenAddress].chainLinkOracle).latestAnswer()); } function _priceFromAddress(address _token) internal view returns (uint) { return _token != ETH_ADDR ? uint256(IAggregator(tokenInfo[_token].chainLinkOracle).latestAnswer()) : INT_UNIT; } function _tokenDivisor(address _token) internal view returns (uint) { return _token != ETH_ADDR ? 10**uint256(tokenInfo[_token].decimals) : INT_UNIT; } function getTokenInfoFromIndex(uint index) external view whenTokenExists(addressFromIndex(index)) returns ( address, uint256, uint256, uint256 ) { address token = tokens[index]; return ( token, _tokenDivisor(token), _priceFromAddress(token), tokenInfo[token].borrowLTV ); } function getTokenInfoFromAddress(address _token) external view whenTokenExists(_token) returns ( uint8, uint256, uint256, uint256 ) { return ( tokenInfo[_token].index, _tokenDivisor(_token), _priceFromAddress(_token), tokenInfo[_token].borrowLTV ); } // function _isETH(address _token) public view returns (bool) { // return globalConfig.constants().ETH_ADDR() == _token; // } // function getDivisor(address _token) public view returns (uint256) { // if(_isETH(_token)) return INT_UNIT; // return 10 ** uint256(getTokenDecimals(_token)); // } mapping(address => uint) public depositeMiningSpeeds; mapping(address => uint) public borrowMiningSpeeds; function updateMiningSpeed(address _token, uint _depositeMiningSpeed, uint _borrowMiningSpeed) public onlyOwner{ if(_depositeMiningSpeed != depositeMiningSpeeds[_token]) { depositeMiningSpeeds[_token] = _depositeMiningSpeed; } if(_borrowMiningSpeed != borrowMiningSpeeds[_token]) { borrowMiningSpeeds[_token] = _borrowMiningSpeed; } emit TokenUpdated(_token); } } interface IAggregator { function latestAnswer() external view returns (int256); } /** * @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); } /** * @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"); } } /** * @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"); } } } library SavingLib { using SafeERC20 for IERC20; /** * Receive the amount of token from msg.sender * @param _amount amount of token * @param _token token address */ function receive(GlobalConfig globalConfig, uint256 _amount, address _token) public { if (Utils._isETH(address(globalConfig), _token)) { require(msg.value == _amount, "The amount is not sent from address."); } else { //When only tokens received, msg.value must be 0 require(msg.value == 0, "msg.value must be 0 when receiving tokens"); IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); } } /** * Send the amount of token to an address * @param _amount amount of token * @param _token token address */ function send(GlobalConfig globalConfig, uint256 _amount, address _token) public { if (Utils._isETH(address(globalConfig), _token)) { msg.sender.transfer(_amount); } else { IERC20(_token).safeTransfer(msg.sender, _amount); } } } /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /** * @notice Code copied from OpenZeppelin, to make it an upgradable contract */ /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract InitializableReentrancyGuard { bool private _notEntered; function _initialize() 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; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract InitializablePausable { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); address private globalConfigPausable; bool private _paused; function _initialize(address _globalConfig) internal { globalConfigPausable = _globalConfig; _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(GlobalConfig(globalConfigPausable).owner()); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(GlobalConfig(globalConfigPausable).owner()); } modifier onlyPauser() { require(msg.sender == GlobalConfig(globalConfigPausable).owner(), "PauserRole: caller does not have the Pauser role"); _; } } interface ICToken { function supplyRatePerBlock() external view returns (uint); function borrowRatePerBlock() external view returns (uint); function mint(uint mintAmount) external returns (uint); function redeemUnderlying(uint redeemAmount) external returns (uint); function redeem(uint redeemAmount) external returns (uint); function exchangeRateStore() external view returns (uint); function exchangeRateCurrent() external returns (uint); function balanceOf(address owner) external view returns (uint256); function balanceOfUnderlying(address owner) external returns (uint); } interface ICETH{ function mint() external payable; } interface IController { function fastForward(uint blocks) external returns (uint); function getBlockNumber() external view returns (uint); } contract SavingAccount is Initializable, InitializableReentrancyGuard, Constant, InitializablePausable { using SafeERC20 for IERC20; using SafeMath for uint256; GlobalConfig public globalConfig; address public constant FIN_ADDR = 0x054f76beED60AB6dBEb23502178C52d6C5dEbE40; address public constant COMP_ADDR = 0xc00e94Cb662C3520282E6f5717214004A7f26888; event Transfer(address indexed token, address from, address to, uint256 amount); event Borrow(address indexed token, address from, uint256 amount); event Repay(address indexed token, address from, uint256 amount); event Deposit(address indexed token, address from, uint256 amount); event Withdraw(address indexed token, address from, uint256 amount); event WithdrawAll(address indexed token, address from, uint256 amount); event Liquidate(address liquidator, address borrower, address borrowedToken, uint256 repayAmount, address collateralToken, uint256 payAmount); event Claim(address from, uint256 amount); event WithdrawCOMP(address beneficiary, uint256 amount); modifier onlySupportedToken(address _token) { if(_token != ETH_ADDR) { require(ITokenRegistry(globalConfig.tokenInfoRegistry()).isTokenExist(_token), "Unsupported token"); } _; } modifier onlyEnabledToken(address _token) { require(ITokenRegistry(globalConfig.tokenInfoRegistry()).isTokenEnabled(_token), "The token is not enabled"); _; } modifier onlyAuthorized() { require(msg.sender == address(globalConfig.bank()), "Only authorized to call from DeFiner internal contracts."); _; } modifier onlyOwner() { require(msg.sender == GlobalConfig(globalConfig).owner(), "Only owner"); _; } /** * Initialize function to be called by the Deployer for the first time * @param _tokenAddresses list of token addresses * @param _cTokenAddresses list of corresponding cToken addresses * @param _globalConfig global configuration contract */ function initialize( address[] memory _tokenAddresses, address[] memory _cTokenAddresses, GlobalConfig _globalConfig ) public initializer { // Initialize InitializableReentrancyGuard super._initialize(); super._initialize(address(_globalConfig)); globalConfig = _globalConfig; require(_tokenAddresses.length == _cTokenAddresses.length, "Token and cToken length don't match."); uint tokenNum = _tokenAddresses.length; for(uint i = 0;i < tokenNum;i++) { if(_cTokenAddresses[i] != address(0x0) && _tokenAddresses[i] != ETH_ADDR) { approveAll(_tokenAddresses[i]); } } } /** * Approve transfer of all available tokens * @param _token token address */ function approveAll(address _token) public { address cToken = ITokenRegistry(globalConfig.tokenInfoRegistry()).getCToken(_token); require(cToken != address(0x0), "cToken address is zero"); IERC20(_token).safeApprove(cToken, 0); IERC20(_token).safeApprove(cToken, uint256(-1)); } /** * Get current block number * @return the current block number */ function getBlockNumber() internal view returns (uint) { return block.number; } /** * Transfer the token between users inside DeFiner * @param _to the address that the token be transfered to * @param _token token address * @param _amount amout of tokens transfer */ function transfer(address _to, address _token, uint _amount) external onlySupportedToken(_token) onlyEnabledToken(_token) whenNotPaused nonReentrant { IBank(globalConfig.bank()).newRateIndexCheckpoint(_token); uint256 amount = IAccounts(globalConfig.accounts()).withdraw(msg.sender, _token, _amount); IAccounts(globalConfig.accounts()).deposit(_to, _token, amount); emit Transfer(_token, msg.sender, _to, amount); } /** * Borrow the amount of token from the saving pool. * @param _token token address * @param _amount amout of tokens to borrow */ function borrow(address _token, uint256 _amount) external onlySupportedToken(_token) onlyEnabledToken(_token) whenNotPaused nonReentrant { require(_amount != 0, "Borrow zero amount of token is not allowed."); IBank(globalConfig.bank()).borrow(msg.sender, _token, _amount); // Transfer the token on Ethereum SavingLib.send(globalConfig, _amount, _token); emit Borrow(_token, msg.sender, _amount); } /** * Repay the amount of token back to the saving pool. * @param _token token address * @param _amount amout of tokens to borrow * @dev If the repay amount is larger than the borrowed balance, the extra will be returned. */ function repay(address _token, uint256 _amount) public payable onlySupportedToken(_token) nonReentrant { require(_amount != 0, "Amount is zero"); SavingLib.receive(globalConfig, _amount, _token); // Add a new checkpoint on the index curve. uint256 amount = IBank(globalConfig.bank()).repay(msg.sender, _token, _amount); // Send the remain money back if(amount < _amount) { SavingLib.send(globalConfig, _amount.sub(amount), _token); } emit Repay(_token, msg.sender, amount); } /** * Deposit the amount of token to the saving pool. * @param _token the address of the deposited token * @param _amount the mount of the deposited token */ function deposit(address _token, uint256 _amount) public payable onlySupportedToken(_token) onlyEnabledToken(_token) nonReentrant { require(_amount != 0, "Amount is zero"); SavingLib.receive(globalConfig, _amount, _token); IBank(globalConfig.bank()).deposit(msg.sender, _token, _amount); emit Deposit(_token, msg.sender, _amount); } /** * Withdraw a token from an address * @param _token token address * @param _amount amount to be withdrawn */ function withdraw(address _token, uint256 _amount) external onlySupportedToken(_token) whenNotPaused nonReentrant { require(_amount != 0, "Amount is zero"); uint256 amount = IBank(globalConfig.bank()).withdraw(msg.sender, _token, _amount); SavingLib.send(globalConfig, amount, _token); emit Withdraw(_token, msg.sender, amount); } /** * Withdraw all tokens from the saving pool. * @param _token the address of the withdrawn token */ function withdrawAll(address _token) external onlySupportedToken(_token) whenNotPaused nonReentrant { // Sanity check require(IAccounts(globalConfig.accounts()).getDepositPrincipal(msg.sender, _token) > 0, "Token depositPrincipal must be greater than 0"); // Add a new checkpoint on the index curve. IBank(globalConfig.bank()).newRateIndexCheckpoint(_token); // Get the total amount of token for the account uint amount = IAccounts(globalConfig.accounts()).getDepositBalanceCurrent(_token, msg.sender); uint256 actualAmount = IBank(globalConfig.bank()).withdraw(msg.sender, _token, amount); if(actualAmount != 0) { SavingLib.send(globalConfig, actualAmount, _token); } emit WithdrawAll(_token, msg.sender, actualAmount); } function liquidate(address _borrower, address _borrowedToken, address _collateralToken) public onlySupportedToken(_borrowedToken) onlySupportedToken(_collateralToken) whenNotPaused nonReentrant { IBank bank = IBank(address(globalConfig.bank())); bank.newRateIndexCheckpoint(_borrowedToken); bank.newRateIndexCheckpoint(_collateralToken); bank.updateDepositFINIndex(_borrowedToken); bank.updateDepositFINIndex(_collateralToken); bank.updateBorrowFINIndex(_borrowedToken); bank.updateBorrowFINIndex(_collateralToken); (uint256 repayAmount, uint256 payAmount) = IAccounts(globalConfig.accounts()).liquidate(msg.sender, _borrower, _borrowedToken, _collateralToken); bank.update(_borrowedToken, repayAmount, ActionType.LiquidateRepayAction); emit Liquidate(msg.sender, _borrower, _borrowedToken, repayAmount, _collateralToken, payAmount); } /** * Withdraw token from Compound * @param _token token address * @param _amount amount of token */ function fromCompound(address _token, uint _amount) external onlyAuthorized { require(ICToken(ITokenRegistry(globalConfig.tokenInfoRegistry()).getCToken(_token)).redeemUnderlying(_amount) == 0, "redeemUnderlying failed"); } function toCompound(address _token, uint _amount) external onlyAuthorized { address cToken = ITokenRegistry(globalConfig.tokenInfoRegistry()).getCToken(_token); if (Utils._isETH(address(globalConfig), _token)) { ICETH(cToken).mint.value(_amount)(); } else { // uint256 success = ICToken(cToken).mint(_amount); require(ICToken(cToken).mint(_amount) == 0, "mint failed"); } } function() external payable{} /** * An account claim all mined FIN token */ function claim() public nonReentrant returns (uint256) { uint256 finAmount = IAccounts(globalConfig.accounts()).claim(msg.sender); IERC20(FIN_ADDR).safeTransfer(msg.sender, finAmount); emit Claim(msg.sender, finAmount); return finAmount; } function claimForToken(address _token) public nonReentrant returns (uint256) { uint256 finAmount = IAccounts(globalConfig.accounts()).claimForToken(msg.sender, _token); if(finAmount > 0) IERC20(FIN_ADDR).safeTransfer(msg.sender, finAmount); emit Claim(msg.sender, finAmount); return finAmount; } /** * Withdraw COMP token to beneficiary */ function withdrawCOMP(address _beneficiary) external onlyOwner { uint256 compBalance = IERC20(COMP_ADDR).balanceOf(address(this)); IERC20(COMP_ADDR).safeTransfer(_beneficiary, compBalance); emit WithdrawCOMP(_beneficiary, compBalance); } function version() public pure returns(string memory) { return "v1.2.0"; } } interface IGlobalConfig { function constants() external view returns (address); function tokenInfoRegistry() external view returns (address); function chainLink() external view returns (address); } interface IConstant { function ETH_ADDR() external view returns (address); function INT_UNIT() external view returns (uint256); } interface ITokenRegistry { function getTokenDecimals(address) external view returns (uint8); function isTokenExist(address) external view returns (bool); function isTokenEnabled(address) external view returns (bool); function getCToken(address) external view returns (address); function addressFromIndex(uint index) external view returns(address); } interface IBank { function update(address _token, uint _amount, Constant.ActionType _action) external; function updateDepositFINIndex(address) external; function updateBorrowFINIndex(address) external; function newRateIndexCheckpoint(address) external; function deposit(address _to, address _token, uint256 _amount) external; function withdraw(address _from, address _token, uint256 _amount) external returns(uint); function borrow(address _from, address _token, uint256 _amount) external; function repay(address _to, address _token, uint256 _amount) external returns(uint); } interface IAccounts { function withdraw(address _accountAddr, address _token, uint256 _amount) external returns (uint256); function deposit(address _accountAddr, address _token, uint256 _amount) external; function getDepositPrincipal(address _accountAddr, address _token) external view returns(uint256); function getDepositBalanceCurrent(address _token, address _accountAddr) external view returns (uint256); function liquidate(address _liquidator, address _borrower, address _borrowedToken, address _collateralToken) external returns (uint256, uint256); function claim(address _account) external returns(uint256); function claimForToken(address, address) external returns(uint256); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"address","name":"borrowedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"payAmount","type":"uint256"}],"name":"Liquidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawCOMP","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"ACCURACY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BLOCKS_PER_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMP_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FIN_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INT_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"approveAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fromCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"globalConfig","outputs":[{"internalType":"contract GlobalConfig","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_tokenAddresses","type":"address[]"},{"internalType":"address[]","name":"_cTokenAddresses","type":"address[]"},{"internalType":"contract GlobalConfig","name":"_globalConfig","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"address","name":"_borrowedToken","type":"address"},{"internalType":"address","name":"_collateralToken","type":"address"}],"name":"liquidate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"toCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"withdrawCOMP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061469b806100206000396000f3fe6080604052600436106101665760003560e01c80637753f47b116100d1578063beabacc81161008a578063d8c2d84c11610064578063d8c2d84c14610654578063f3fef3a314610669578063fa09e630146106a2578063fbcd9b051461065457610166565b8063beabacc8146105b7578063ca5ce2ec146105fa578063d37db1d21461063f57610166565b80637753f47b146104f75780637c81f3521461050c5780638280e5a91461053f5780638456cb5914610578578063a7c1abe01461058d578063adc14448146105a257610166565b80634e71d92d116101235780634e71d92d1461028657806350235d5b1461029b578063526e93cb146102cc5780635274ac3f1461030557806354fd4d50146104445780635c975abb146104ce57610166565b80630621472c1461016857806322867d781461019b5780633f4ba83a146101c757806347e7ef24146101dc5780634a27718c146102085780634b8a35291461024d575b005b34801561017457600080fd5b506101666004803603602081101561018b57600080fd5b50356001600160a01b03166106d5565b610166600480360360408110156101b157600080fd5b506001600160a01b03813516906020013561084d565b3480156101d357600080fd5b50610166610cc3565b610166600480360360408110156101f257600080fd5b506001600160a01b038135169060200135610e96565b34801561021457600080fd5b5061023b6004803603602081101561022b57600080fd5b50356001600160a01b0316611368565b60408051918252519081900360200190f35b34801561025957600080fd5b506101666004803603604081101561027057600080fd5b506001600160a01b038135169060200135611525565b34801561029257600080fd5b5061023b611a42565b3480156102a757600080fd5b506102b0611bef565b604080516001600160a01b039092168252519081900360200190f35b3480156102d857600080fd5b50610166600480360360408110156102ef57600080fd5b506001600160a01b038135169060200135611c07565b34801561031157600080fd5b506101666004803603606081101561032857600080fd5b81019060208101813564010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184602083028401116401000000008311171561037757600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103c757600080fd5b8201836020820111156103d957600080fd5b803590602001918460208302840111640100000000831117156103fb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b03169150611e809050565b34801561045057600080fd5b50610459612025565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049357818101518382015260200161047b565b50505050905090810190601f1680156104c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104da57600080fd5b506104e3612045565b604080519115158252519081900360200190f35b34801561050357600080fd5b506102b0612055565b34801561051857600080fd5b506101666004803603602081101561052f57600080fd5b50356001600160a01b031661205a565b34801561054b57600080fd5b506101666004803603604081101561056257600080fd5b506001600160a01b03813516906020013561220d565b34801561058457600080fd5b5061016661255e565b34801561059957600080fd5b506102b06126ec565b3480156105ae57600080fd5b506102b06126fb565b3480156105c357600080fd5b50610166600480360360608110156105da57600080fd5b506001600160a01b03813581169160208101359091169060400135612713565b34801561060657600080fd5b506101666004803603606081101561061d57600080fd5b506001600160a01b038135811691602081013582169160409091013516612d4a565b34801561064b57600080fd5b5061023b61357d565b34801561066057600080fd5b5061023b613584565b34801561067557600080fd5b506101666004803603604081101561068c57600080fd5b506001600160a01b038135169060200135613590565b3480156106ae57600080fd5b50610166600480360360208110156106c557600080fd5b50356001600160a01b0316613992565b60345460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561071a57600080fd5b505afa15801561072e573d6000803e3d6000fd5b505050506040513d602081101561074457600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d60208110156107ba57600080fd5b505190506001600160a01b038116610812576040805162461bcd60e51b815260206004820152601660248201527563546f6b656e2061646472657373206973207a65726f60501b604482015290519081900360640190fd5b61082d6001600160a01b03831682600063ffffffff61405716565b6108496001600160a01b0383168260001963ffffffff61405716565b5050565b816001600160a01b038116600e1461099457603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ad57600080fd5b505afa1580156108c1573d6000803e3d6000fd5b505050506040513d60208110156108d757600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b15801561092357600080fd5b505afa158015610937573d6000803e3d6000fd5b505050506040513d602081101561094d57600080fd5b5051610994576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60335460ff166109d9576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff1916905581610a26576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b603454604080516384ac1f7560e01b81526001600160a01b0392831660048201526024810185905291851660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba5916384ac1f75916064808301926000929190829003018186803b158015610a9257600080fd5b505af4158015610aa6573d6000803e3d6000fd5b505050506000603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afa57600080fd5b505afa158015610b0e573d6000803e3d6000fd5b505050506040513d6020811015610b2457600080fd5b505160408051631da649cf60e01b81523360048201526001600160a01b0387811660248301526044820187905291519190921691631da649cf9160648083019260209291908290030181600087803b158015610b7f57600080fd5b505af1158015610b93573d6000803e3d6000fd5b505050506040513d6020811015610ba957600080fd5b5051905082811015610c6d5760345473e86a6f65d930fd0f0d182c7db3cb95b285f4dba590633b4571a1906001600160a01b0316610bed868563ffffffff61416a16565b876040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001838152602001826001600160a01b03166001600160a01b03168152602001935050505060006040518083038186803b158015610c5457600080fd5b505af4158015610c68573d6000803e3d6000fd5b505050505b604080513381526020810183905281516001600160a01b038716927f05f2eeda0e08e4b437f487c8d7d29b14537d15e3488170dc3de5dbdf8dac4684928290030190a250506033805460ff191660011790555050565b603360019054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1157600080fd5b505afa158015610d25573d6000803e3d6000fd5b505050506040513d6020811015610d3b57600080fd5b50516001600160a01b03163314610d835760405162461bcd60e51b81526004018080602001828103825260308152602001806145446030913960400191505060405180910390fd5b603354600160a81b900460ff16610dd8576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6033805460ff60a81b19169081905560408051638da5cb5b60e01b815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9261010090046001600160a01b031691638da5cb5b916004808301926020929190829003018186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d6020811015610e7757600080fd5b5051604080516001600160a01b039092168252519081900360200190a1565b816001600160a01b038116600e14610fdd57603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ef657600080fd5b505afa158015610f0a573d6000803e3d6000fd5b505050506040513d6020811015610f2057600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d6020811015610f9657600080fd5b5051610fdd576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60345460408051639895880f60e01b8152905185926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d602081101561104b57600080fd5b50516040805163748538d960e01b81526001600160a01b0384811660048301529151919092169163748538d9916024808301926020929190829003018186803b15801561109757600080fd5b505afa1580156110ab573d6000803e3d6000fd5b505050506040513d60208110156110c157600080fd5b505161110f576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1bdad95b881a5cc81b9bdd08195b98589b195960421b604482015290519081900360640190fd5b60335460ff16611154576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055826111a1576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b603454604080516384ac1f7560e01b81526001600160a01b0392831660048201526024810186905291861660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba5916384ac1f75916064808301926000929190829003018186803b15801561120d57600080fd5b505af4158015611221573d6000803e3d6000fd5b50505050603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561127357600080fd5b505afa158015611287573d6000803e3d6000fd5b505050506040513d602081101561129d57600080fd5b505160408051638340f54960e01b81523360048201526001600160a01b0387811660248301526044820187905291519190921691638340f54991606480830192600092919082900301818387803b1580156112f757600080fd5b505af115801561130b573d6000803e3d6000fd5b5050604080513381526020810187905281516001600160a01b03891694507f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6293509081900390910190a250506033805460ff191660011790555050565b60335460009060ff166113b0576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690556034546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b1580156113ff57600080fd5b505afa158015611413573d6000803e3d6000fd5b505050506040513d602081101561142957600080fd5b505160408051637db0690f60e01b81523360048201526001600160a01b03868116602483015291519190921691637db0690f9160448083019260209291908290030181600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b505050506040513d60208110156114a757600080fd5b5051905080156114d6576114d673054f76beed60ab6dbeb23502178c52d6c5debe40338363ffffffff6141b316565b604080513381526020810183905281517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4929181900390910190a190506033805460ff19166001179055919050565b816001600160a01b038116600e1461166c57603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158557600080fd5b505afa158015611599573d6000803e3d6000fd5b505050506040513d60208110156115af57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b1580156115fb57600080fd5b505afa15801561160f573d6000803e3d6000fd5b505050506040513d602081101561162557600080fd5b505161166c576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60345460408051639895880f60e01b8152905185926001600160a01b031691639895880f916004808301926020929190829003018186803b1580156116b057600080fd5b505afa1580156116c4573d6000803e3d6000fd5b505050506040513d60208110156116da57600080fd5b50516040805163748538d960e01b81526001600160a01b0384811660048301529151919092169163748538d9916024808301926020929190829003018186803b15801561172657600080fd5b505afa15801561173a573d6000803e3d6000fd5b505050506040513d602081101561175057600080fd5b505161179e576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1bdad95b881a5cc81b9bdd08195b98589b195960421b604482015290519081900360640190fd5b603354600160a81b900460ff16156117f0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff16611835576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690558261187b5760405162461bcd60e51b815260040180806020018281038252602b8152602001806144f9602b913960400191505060405180910390fd5b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c957600080fd5b505afa1580156118dd573d6000803e3d6000fd5b505050506040513d60208110156118f357600080fd5b5051604080516314890dcb60e21b81523360048201526001600160a01b0387811660248301526044820187905291519190921691635224372c91606480830192600092919082900301818387803b15801561194d57600080fd5b505af1158015611961573d6000803e3d6000fd5b505060345460408051633b4571a160e01b81526001600160a01b0392831660048201526024810188905291881660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba59350633b4571a192506064808301926000929190829003018186803b1580156119d157600080fd5b505af41580156119e5573d6000803e3d6000fd5b5050604080513381526020810187905281516001600160a01b03891694507f312a5e5e1079f5dda4e95dbbd0b908b291fd5b992ef22073643ab691572c5b5293509081900390910190a250506033805460ff191660011790555050565b60335460009060ff16611a8a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690556034546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015611ad957600080fd5b505afa158015611aed573d6000803e3d6000fd5b505050506040513d6020811015611b0357600080fd5b505160408051630f41a04d60e11b815233600482015290516001600160a01b0390921691631e83409a916024808201926020929091908290030181600087803b158015611b4f57600080fd5b505af1158015611b63573d6000803e3d6000fd5b505050506040513d6020811015611b7957600080fd5b50519050611ba273054f76beed60ab6dbeb23502178c52d6c5debe40338363ffffffff6141b316565b604080513381526020810183905281517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4929181900390910190a190506033805460ff1916600117905590565b73c00e94cb662c3520282e6f5717214004a7f2688881565b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b50516001600160a01b03163314611cc75760405162461bcd60e51b81526004018080602001828103825260388152602001806145cf6038913960400191505060405180910390fd5b603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d6020811015611d3f57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015611d8b57600080fd5b505afa158015611d9f573d6000803e3d6000fd5b505050506040513d6020811015611db557600080fd5b50516040805163852a12e360e01b81526004810184905290516001600160a01b039092169163852a12e3916024808201926020929091908290030181600087803b158015611e0257600080fd5b505af1158015611e16573d6000803e3d6000fd5b505050506040513d6020811015611e2c57600080fd5b505115610849576040805162461bcd60e51b815260206004820152601760248201527f72656465656d556e6465726c79696e67206661696c6564000000000000000000604482015290519081900360640190fd5b600054610100900460ff1680611e995750611e99614205565b80611ea7575060005460ff16155b611ee25760405162461bcd60e51b815260040180806020018281038252602e815260200180614574602e913960400191505060405180910390fd5b600054610100900460ff16158015611f0d576000805460ff1961ff0019909116610100171660011790555b611f1561420b565b611f1e8261421a565b603480546001600160a01b0319166001600160a01b0384161790558251845114611f795760405162461bcd60e51b81526004018080602001828103825260248152602001806144d56024913960400191505060405180910390fd5b835160005b8181101561200b5760006001600160a01b0316858281518110611f9d57fe5b60200260200101516001600160a01b031614158015611fe25750600e6001600160a01b0316868281518110611fce57fe5b60200260200101516001600160a01b031614155b1561200357612003868281518110611ff657fe5b60200260200101516106d5565b600101611f7e565b5050801561201f576000805461ff00191690555b50505050565b604080518082019091526006815265076312e322e360d41b602082015290565b603354600160a81b900460ff1690565b600e81565b603460009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b50516001600160a01b0316331461211d576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b604482015290519081900360640190fd5b604080516370a0823160e01b8152306004820152905160009173c00e94cb662c3520282e6f5717214004a7f26888916370a0823191602480820192602092909190829003018186803b15801561217257600080fd5b505afa158015612186573d6000803e3d6000fd5b505050506040513d602081101561219c57600080fd5b505190506121c573c00e94cb662c3520282e6f5717214004a7f26888838363ffffffff6141b316565b604080516001600160a01b03841681526020810183905281517fae1a6d19dedc66a65b6022c27f8eafc2feccb68981b01e150fac0550422786ba929181900390910190a15050565b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225b57600080fd5b505afa15801561226f573d6000803e3d6000fd5b505050506040513d602081101561228557600080fd5b50516001600160a01b031633146122cd5760405162461bcd60e51b81526004018080602001828103825260388152602001806145cf6038913960400191505060405180910390fd5b60345460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561231257600080fd5b505afa158015612326573d6000803e3d6000fd5b505050506040513d602081101561233c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561238857600080fd5b505afa15801561239c573d6000803e3d6000fd5b505050506040513d60208110156123b257600080fd5b5051603454604080516378b88bc760e11b81526001600160a01b039283166004820152918616602483015251919250730474f6ba33ce6b058df697b5363dd11856afcde29163f171178e91604480820192602092909190829003018186803b15801561241d57600080fd5b505af4158015612431573d6000803e3d6000fd5b505050506040513d602081101561244757600080fd5b5051156124a757806001600160a01b0316631249c58b836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561248957600080fd5b505af115801561249d573d6000803e3d6000fd5b5050505050612559565b806001600160a01b031663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156124ed57600080fd5b505af1158015612501573d6000803e3d6000fd5b505050506040513d602081101561251757600080fd5b505115612559576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b505050565b603360019054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ac57600080fd5b505afa1580156125c0573d6000803e3d6000fd5b505050506040513d60208110156125d657600080fd5b50516001600160a01b0316331461261e5760405162461bcd60e51b81526004018080602001828103825260308152602001806145446030913960400191505060405180910390fd5b603354600160a81b900460ff1615612670576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6033805460ff60a81b1916600160a81b179081905560408051638da5cb5b60e01b815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258926001600160a01b036101009091041691638da5cb5b916004808301926020929190829003018186803b158015610e4d57600080fd5b6034546001600160a01b031681565b73054f76beed60ab6dbeb23502178c52d6c5debe4081565b816001600160a01b038116600e1461285a57603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561277357600080fd5b505afa158015612787573d6000803e3d6000fd5b505050506040513d602081101561279d57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b1580156127e957600080fd5b505afa1580156127fd573d6000803e3d6000fd5b505050506040513d602081101561281357600080fd5b505161285a576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60345460408051639895880f60e01b8152905185926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561289e57600080fd5b505afa1580156128b2573d6000803e3d6000fd5b505050506040513d60208110156128c857600080fd5b50516040805163748538d960e01b81526001600160a01b0384811660048301529151919092169163748538d9916024808301926020929190829003018186803b15801561291457600080fd5b505afa158015612928573d6000803e3d6000fd5b505050506040513d602081101561293e57600080fd5b505161298c576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1bdad95b881a5cc81b9bdd08195b98589b195960421b604482015290519081900360640190fd5b603354600160a81b900460ff16156129de576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff16612a23576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055603454604080516376cdb03b60e01b815290516001600160a01b03909216916376cdb03b91600480820192602092909190829003018186803b158015612a7257600080fd5b505afa158015612a86573d6000803e3d6000fd5b505050506040513d6020811015612a9c57600080fd5b50516040805163378d2c3d60e21b81526001600160a01b0387811660048301529151919092169163de34b0f491602480830192600092919082900301818387803b158015612ae957600080fd5b505af1158015612afd573d6000803e3d6000fd5b505050506000603460009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5157600080fd5b505afa158015612b65573d6000803e3d6000fd5b505050506040513d6020811015612b7b57600080fd5b505160408051636ce5768960e11b81523360048201526001600160a01b038881166024830152604482018890529151919092169163d9caed129160648083019260209291908290030181600087803b158015612bd657600080fd5b505af1158015612bea573d6000803e3d6000fd5b505050506040513d6020811015612c0057600080fd5b50516034546040805163346681fb60e11b815290519293506001600160a01b03909116916368cd03f691600480820192602092909190829003018186803b158015612c4a57600080fd5b505afa158015612c5e573d6000803e3d6000fd5b505050506040513d6020811015612c7457600080fd5b505160408051638340f54960e01b81526001600160a01b03898116600483015288811660248301526044820185905291519190921691638340f54991606480830192600092919082900301818387803b158015612cd057600080fd5b505af1158015612ce4573d6000803e3d6000fd5b5050604080513381526001600160a01b038a81166020830152818301869052915191891693507fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f925081900360600190a250506033805460ff1916600117905550505050565b816001600160a01b038116600e14612e9157603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612daa57600080fd5b505afa158015612dbe573d6000803e3d6000fd5b505050506040513d6020811015612dd457600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015612e2057600080fd5b505afa158015612e34573d6000803e3d6000fd5b505050506040513d6020811015612e4a57600080fd5b5051612e91576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b816001600160a01b038116600e14612fd857603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d6020811015612f1b57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015612f6757600080fd5b505afa158015612f7b573d6000803e3d6000fd5b505050506040513d6020811015612f9157600080fd5b5051612fd8576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b603354600160a81b900460ff161561302a576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff1661306f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055603454604080516376cdb03b60e01b815290516000926001600160a01b0316916376cdb03b916004808301926020929190829003018186803b1580156130be57600080fd5b505afa1580156130d2573d6000803e3d6000fd5b505050506040513d60208110156130e857600080fd5b50516040805163378d2c3d60e21b81526001600160a01b03888116600483015291519293509083169163de34b0f49160248082019260009290919082900301818387803b15801561313857600080fd5b505af115801561314c573d6000803e3d6000fd5b50505050806001600160a01b031663de34b0f4856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156131a857600080fd5b505af11580156131bc573d6000803e3d6000fd5b50505050806001600160a01b031663e0b5a664866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561321857600080fd5b505af115801561322c573d6000803e3d6000fd5b50505050806001600160a01b031663e0b5a664856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561328857600080fd5b505af115801561329c573d6000803e3d6000fd5b50505050806001600160a01b031663d2796a93866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156132f857600080fd5b505af115801561330c573d6000803e3d6000fd5b50505050806001600160a01b031663d2796a93856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b50505050600080603460009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b505160408051631327f6d360e21b81523360048201526001600160a01b038b811660248301528a8116604483015289811660648301528251931692634c9fdb4c926084808401939192918290030181600087803b15801561345b57600080fd5b505af115801561346f573d6000803e3d6000fd5b505050506040513d604081101561348557600080fd5b508051602090910151604080516318b929e360e21b81526001600160a01b038b811660048084019190915260248301869052604483015291519395509193508516916362e4a78c9160648082019260009290919082900301818387803b1580156134ee57600080fd5b505af1158015613502573d6000803e3d6000fd5b5050604080513381526001600160a01b03808d166020830152808c1682840152606082018790528a16608082015260a0810185905290517f821677d238e1c78d2592018f061586da81bb560e8b975f1fbf109be2daa9db4393509081900360c0019150a150506033805460ff19166001179055505050505050565b6220148081565b670de0b6b3a764000081565b816001600160a01b038116600e146136d757603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135f057600080fd5b505afa158015613604573d6000803e3d6000fd5b505050506040513d602081101561361a57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b15801561366657600080fd5b505afa15801561367a573d6000803e3d6000fd5b505050506040513d602081101561369057600080fd5b50516136d7576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b603354600160a81b900460ff1615613729576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff1661376e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055816137bb576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b603454604080516376cdb03b60e01b815290516000926001600160a01b0316916376cdb03b916004808301926020929190829003018186803b15801561380057600080fd5b505afa158015613814573d6000803e3d6000fd5b505050506040513d602081101561382a57600080fd5b505160408051636ce5768960e11b81523360048201526001600160a01b038781166024830152604482018790529151919092169163d9caed129160648083019260209291908290030181600087803b15801561388557600080fd5b505af1158015613899573d6000803e3d6000fd5b505050506040513d60208110156138af57600080fd5b505160345460408051633b4571a160e01b81526001600160a01b0392831660048201526024810184905291871660448301525191925073e86a6f65d930fd0f0d182c7db3cb95b285f4dba591633b4571a191606480820192600092909190829003018186803b15801561392157600080fd5b505af4158015613935573d6000803e3d6000fd5b5050604080513381526020810185905281516001600160a01b03891694507f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb93509081900390910190a250506033805460ff191660011790555050565b806001600160a01b038116600e14613ad957603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139f257600080fd5b505afa158015613a06573d6000803e3d6000fd5b505050506040513d6020811015613a1c57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015613a6857600080fd5b505afa158015613a7c573d6000803e3d6000fd5b505050506040513d6020811015613a9257600080fd5b5051613ad9576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b603354600160a81b900460ff1615613b2b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff16613b70576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690556034546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015613bbf57600080fd5b505afa158015613bd3573d6000803e3d6000fd5b505050506040513d6020811015613be957600080fd5b50516040805163fa78d59f60e01b81523360048201526001600160a01b0386811660248301529151919092169163fa78d59f916044808301926020929190829003018186803b158015613c3b57600080fd5b505afa158015613c4f573d6000803e3d6000fd5b505050506040513d6020811015613c6557600080fd5b505111613ca35760405162461bcd60e51b815260040180806020018281038252602d8152602001806145a2602d913960400191505060405180910390fd5b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015613cf157600080fd5b505afa158015613d05573d6000803e3d6000fd5b505050506040513d6020811015613d1b57600080fd5b50516040805163378d2c3d60e21b81526001600160a01b0385811660048301529151919092169163de34b0f491602480830192600092919082900301818387803b158015613d6857600080fd5b505af1158015613d7c573d6000803e3d6000fd5b505050506000603460009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015613dd057600080fd5b505afa158015613de4573d6000803e3d6000fd5b505050506040513d6020811015613dfa57600080fd5b50516040805163b44d253d60e01b81526001600160a01b0386811660048301523360248301529151919092169163b44d253d916044808301926020929190829003018186803b158015613e4c57600080fd5b505afa158015613e60573d6000803e3d6000fd5b505050506040513d6020811015613e7657600080fd5b5051603454604080516376cdb03b60e01b815290519293506000926001600160a01b03909216916376cdb03b91600480820192602092909190829003018186803b158015613ec357600080fd5b505afa158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b505160408051636ce5768960e11b81523360048201526001600160a01b038781166024830152604482018690529151919092169163d9caed129160648083019260209291908290030181600087803b158015613f4857600080fd5b505af1158015613f5c573d6000803e3d6000fd5b505050506040513d6020811015613f7257600080fd5b5051905080156140015760345460408051633b4571a160e01b81526001600160a01b0392831660048201526024810184905291861660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba591633b4571a1916064808301926000929190829003018186803b158015613fe857600080fd5b505af4158015613ffc573d6000803e3d6000fd5b505050505b604080513381526020810183905281516001600160a01b038716927f858f8be6acc95d7ac4177f157cb7c92a1d922bd948b968ce21df5b7b26a10a95928290030190a250506033805460ff191660011790555050565b8015806140dd575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156140af57600080fd5b505afa1580156140c3573d6000803e3d6000fd5b505050506040513d60208110156140d957600080fd5b5051155b6141185760405162461bcd60e51b81526004018080602001828103825260368152602001806146316036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612559908490614249565b60006141ac83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614401565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612559908490614249565b303b1590565b6033805460ff19166001179055565b6033805460ff60a81b196001600160a01b0390931661010002610100600160a81b031990911617919091169055565b61425b826001600160a01b0316614498565b6142ac576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106142ea5780518252601f1990920191602091820191016142cb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461434c576040519150601f19603f3d011682016040523d82523d6000602084013e614351565b606091505b5091509150816143a8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561201f578080602001905160208110156143c457600080fd5b505161201f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614607602a913960400191505060405180910390fd5b600081848411156144905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561445557818101518382015260200161443d565b50505050905090810190601f1680156144825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906144cc57508115155b94935050505056fe546f6b656e20616e642063546f6b656e206c656e67746820646f6e2774206d617463682e426f72726f77207a65726f20616d6f756e74206f6620746f6b656e206973206e6f7420616c6c6f7765642e5265656e7472616e637947756172643a207265656e7472616e742063616c6c00506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c65436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564546f6b656e206465706f7369745072696e636970616c206d7573742062652067726561746572207468616e20304f6e6c7920617574686f72697a656420746f2063616c6c2066726f6d20446546696e657220696e7465726e616c20636f6e7472616374732e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820c1dc980eaa7ff932ba53f511491de4b7dc61a0d06af74c9bf1d975159acd438764736f6c634300050e0032
Deployed Bytecode
0x6080604052600436106101665760003560e01c80637753f47b116100d1578063beabacc81161008a578063d8c2d84c11610064578063d8c2d84c14610654578063f3fef3a314610669578063fa09e630146106a2578063fbcd9b051461065457610166565b8063beabacc8146105b7578063ca5ce2ec146105fa578063d37db1d21461063f57610166565b80637753f47b146104f75780637c81f3521461050c5780638280e5a91461053f5780638456cb5914610578578063a7c1abe01461058d578063adc14448146105a257610166565b80634e71d92d116101235780634e71d92d1461028657806350235d5b1461029b578063526e93cb146102cc5780635274ac3f1461030557806354fd4d50146104445780635c975abb146104ce57610166565b80630621472c1461016857806322867d781461019b5780633f4ba83a146101c757806347e7ef24146101dc5780634a27718c146102085780634b8a35291461024d575b005b34801561017457600080fd5b506101666004803603602081101561018b57600080fd5b50356001600160a01b03166106d5565b610166600480360360408110156101b157600080fd5b506001600160a01b03813516906020013561084d565b3480156101d357600080fd5b50610166610cc3565b610166600480360360408110156101f257600080fd5b506001600160a01b038135169060200135610e96565b34801561021457600080fd5b5061023b6004803603602081101561022b57600080fd5b50356001600160a01b0316611368565b60408051918252519081900360200190f35b34801561025957600080fd5b506101666004803603604081101561027057600080fd5b506001600160a01b038135169060200135611525565b34801561029257600080fd5b5061023b611a42565b3480156102a757600080fd5b506102b0611bef565b604080516001600160a01b039092168252519081900360200190f35b3480156102d857600080fd5b50610166600480360360408110156102ef57600080fd5b506001600160a01b038135169060200135611c07565b34801561031157600080fd5b506101666004803603606081101561032857600080fd5b81019060208101813564010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184602083028401116401000000008311171561037757600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103c757600080fd5b8201836020820111156103d957600080fd5b803590602001918460208302840111640100000000831117156103fb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b03169150611e809050565b34801561045057600080fd5b50610459612025565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049357818101518382015260200161047b565b50505050905090810190601f1680156104c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104da57600080fd5b506104e3612045565b604080519115158252519081900360200190f35b34801561050357600080fd5b506102b0612055565b34801561051857600080fd5b506101666004803603602081101561052f57600080fd5b50356001600160a01b031661205a565b34801561054b57600080fd5b506101666004803603604081101561056257600080fd5b506001600160a01b03813516906020013561220d565b34801561058457600080fd5b5061016661255e565b34801561059957600080fd5b506102b06126ec565b3480156105ae57600080fd5b506102b06126fb565b3480156105c357600080fd5b50610166600480360360608110156105da57600080fd5b506001600160a01b03813581169160208101359091169060400135612713565b34801561060657600080fd5b506101666004803603606081101561061d57600080fd5b506001600160a01b038135811691602081013582169160409091013516612d4a565b34801561064b57600080fd5b5061023b61357d565b34801561066057600080fd5b5061023b613584565b34801561067557600080fd5b506101666004803603604081101561068c57600080fd5b506001600160a01b038135169060200135613590565b3480156106ae57600080fd5b50610166600480360360208110156106c557600080fd5b50356001600160a01b0316613992565b60345460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561071a57600080fd5b505afa15801561072e573d6000803e3d6000fd5b505050506040513d602081101561074457600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d60208110156107ba57600080fd5b505190506001600160a01b038116610812576040805162461bcd60e51b815260206004820152601660248201527563546f6b656e2061646472657373206973207a65726f60501b604482015290519081900360640190fd5b61082d6001600160a01b03831682600063ffffffff61405716565b6108496001600160a01b0383168260001963ffffffff61405716565b5050565b816001600160a01b038116600e1461099457603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ad57600080fd5b505afa1580156108c1573d6000803e3d6000fd5b505050506040513d60208110156108d757600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b15801561092357600080fd5b505afa158015610937573d6000803e3d6000fd5b505050506040513d602081101561094d57600080fd5b5051610994576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60335460ff166109d9576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff1916905581610a26576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b603454604080516384ac1f7560e01b81526001600160a01b0392831660048201526024810185905291851660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba5916384ac1f75916064808301926000929190829003018186803b158015610a9257600080fd5b505af4158015610aa6573d6000803e3d6000fd5b505050506000603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610afa57600080fd5b505afa158015610b0e573d6000803e3d6000fd5b505050506040513d6020811015610b2457600080fd5b505160408051631da649cf60e01b81523360048201526001600160a01b0387811660248301526044820187905291519190921691631da649cf9160648083019260209291908290030181600087803b158015610b7f57600080fd5b505af1158015610b93573d6000803e3d6000fd5b505050506040513d6020811015610ba957600080fd5b5051905082811015610c6d5760345473e86a6f65d930fd0f0d182c7db3cb95b285f4dba590633b4571a1906001600160a01b0316610bed868563ffffffff61416a16565b876040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001838152602001826001600160a01b03166001600160a01b03168152602001935050505060006040518083038186803b158015610c5457600080fd5b505af4158015610c68573d6000803e3d6000fd5b505050505b604080513381526020810183905281516001600160a01b038716927f05f2eeda0e08e4b437f487c8d7d29b14537d15e3488170dc3de5dbdf8dac4684928290030190a250506033805460ff191660011790555050565b603360019054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1157600080fd5b505afa158015610d25573d6000803e3d6000fd5b505050506040513d6020811015610d3b57600080fd5b50516001600160a01b03163314610d835760405162461bcd60e51b81526004018080602001828103825260308152602001806145446030913960400191505060405180910390fd5b603354600160a81b900460ff16610dd8576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6033805460ff60a81b19169081905560408051638da5cb5b60e01b815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9261010090046001600160a01b031691638da5cb5b916004808301926020929190829003018186803b158015610e4d57600080fd5b505afa158015610e61573d6000803e3d6000fd5b505050506040513d6020811015610e7757600080fd5b5051604080516001600160a01b039092168252519081900360200190a1565b816001600160a01b038116600e14610fdd57603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ef657600080fd5b505afa158015610f0a573d6000803e3d6000fd5b505050506040513d6020811015610f2057600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d6020811015610f9657600080fd5b5051610fdd576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60345460408051639895880f60e01b8152905185926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d602081101561104b57600080fd5b50516040805163748538d960e01b81526001600160a01b0384811660048301529151919092169163748538d9916024808301926020929190829003018186803b15801561109757600080fd5b505afa1580156110ab573d6000803e3d6000fd5b505050506040513d60208110156110c157600080fd5b505161110f576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1bdad95b881a5cc81b9bdd08195b98589b195960421b604482015290519081900360640190fd5b60335460ff16611154576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055826111a1576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b603454604080516384ac1f7560e01b81526001600160a01b0392831660048201526024810186905291861660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba5916384ac1f75916064808301926000929190829003018186803b15801561120d57600080fd5b505af4158015611221573d6000803e3d6000fd5b50505050603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561127357600080fd5b505afa158015611287573d6000803e3d6000fd5b505050506040513d602081101561129d57600080fd5b505160408051638340f54960e01b81523360048201526001600160a01b0387811660248301526044820187905291519190921691638340f54991606480830192600092919082900301818387803b1580156112f757600080fd5b505af115801561130b573d6000803e3d6000fd5b5050604080513381526020810187905281516001600160a01b03891694507f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6293509081900390910190a250506033805460ff191660011790555050565b60335460009060ff166113b0576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690556034546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b1580156113ff57600080fd5b505afa158015611413573d6000803e3d6000fd5b505050506040513d602081101561142957600080fd5b505160408051637db0690f60e01b81523360048201526001600160a01b03868116602483015291519190921691637db0690f9160448083019260209291908290030181600087803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b505050506040513d60208110156114a757600080fd5b5051905080156114d6576114d673054f76beed60ab6dbeb23502178c52d6c5debe40338363ffffffff6141b316565b604080513381526020810183905281517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4929181900390910190a190506033805460ff19166001179055919050565b816001600160a01b038116600e1461166c57603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158557600080fd5b505afa158015611599573d6000803e3d6000fd5b505050506040513d60208110156115af57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b1580156115fb57600080fd5b505afa15801561160f573d6000803e3d6000fd5b505050506040513d602081101561162557600080fd5b505161166c576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60345460408051639895880f60e01b8152905185926001600160a01b031691639895880f916004808301926020929190829003018186803b1580156116b057600080fd5b505afa1580156116c4573d6000803e3d6000fd5b505050506040513d60208110156116da57600080fd5b50516040805163748538d960e01b81526001600160a01b0384811660048301529151919092169163748538d9916024808301926020929190829003018186803b15801561172657600080fd5b505afa15801561173a573d6000803e3d6000fd5b505050506040513d602081101561175057600080fd5b505161179e576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1bdad95b881a5cc81b9bdd08195b98589b195960421b604482015290519081900360640190fd5b603354600160a81b900460ff16156117f0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff16611835576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690558261187b5760405162461bcd60e51b815260040180806020018281038252602b8152602001806144f9602b913960400191505060405180910390fd5b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c957600080fd5b505afa1580156118dd573d6000803e3d6000fd5b505050506040513d60208110156118f357600080fd5b5051604080516314890dcb60e21b81523360048201526001600160a01b0387811660248301526044820187905291519190921691635224372c91606480830192600092919082900301818387803b15801561194d57600080fd5b505af1158015611961573d6000803e3d6000fd5b505060345460408051633b4571a160e01b81526001600160a01b0392831660048201526024810188905291881660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba59350633b4571a192506064808301926000929190829003018186803b1580156119d157600080fd5b505af41580156119e5573d6000803e3d6000fd5b5050604080513381526020810187905281516001600160a01b03891694507f312a5e5e1079f5dda4e95dbbd0b908b291fd5b992ef22073643ab691572c5b5293509081900390910190a250506033805460ff191660011790555050565b60335460009060ff16611a8a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690556034546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015611ad957600080fd5b505afa158015611aed573d6000803e3d6000fd5b505050506040513d6020811015611b0357600080fd5b505160408051630f41a04d60e11b815233600482015290516001600160a01b0390921691631e83409a916024808201926020929091908290030181600087803b158015611b4f57600080fd5b505af1158015611b63573d6000803e3d6000fd5b505050506040513d6020811015611b7957600080fd5b50519050611ba273054f76beed60ab6dbeb23502178c52d6c5debe40338363ffffffff6141b316565b604080513381526020810183905281517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4929181900390910190a190506033805460ff1916600117905590565b73c00e94cb662c3520282e6f5717214004a7f2688881565b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d6020811015611c7f57600080fd5b50516001600160a01b03163314611cc75760405162461bcd60e51b81526004018080602001828103825260388152602001806145cf6038913960400191505060405180910390fd5b603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d6020811015611d3f57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03858116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b158015611d8b57600080fd5b505afa158015611d9f573d6000803e3d6000fd5b505050506040513d6020811015611db557600080fd5b50516040805163852a12e360e01b81526004810184905290516001600160a01b039092169163852a12e3916024808201926020929091908290030181600087803b158015611e0257600080fd5b505af1158015611e16573d6000803e3d6000fd5b505050506040513d6020811015611e2c57600080fd5b505115610849576040805162461bcd60e51b815260206004820152601760248201527f72656465656d556e6465726c79696e67206661696c6564000000000000000000604482015290519081900360640190fd5b600054610100900460ff1680611e995750611e99614205565b80611ea7575060005460ff16155b611ee25760405162461bcd60e51b815260040180806020018281038252602e815260200180614574602e913960400191505060405180910390fd5b600054610100900460ff16158015611f0d576000805460ff1961ff0019909116610100171660011790555b611f1561420b565b611f1e8261421a565b603480546001600160a01b0319166001600160a01b0384161790558251845114611f795760405162461bcd60e51b81526004018080602001828103825260248152602001806144d56024913960400191505060405180910390fd5b835160005b8181101561200b5760006001600160a01b0316858281518110611f9d57fe5b60200260200101516001600160a01b031614158015611fe25750600e6001600160a01b0316868281518110611fce57fe5b60200260200101516001600160a01b031614155b1561200357612003868281518110611ff657fe5b60200260200101516106d5565b600101611f7e565b5050801561201f576000805461ff00191690555b50505050565b604080518082019091526006815265076312e322e360d41b602082015290565b603354600160a81b900460ff1690565b600e81565b603460009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b50516001600160a01b0316331461211d576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b604482015290519081900360640190fd5b604080516370a0823160e01b8152306004820152905160009173c00e94cb662c3520282e6f5717214004a7f26888916370a0823191602480820192602092909190829003018186803b15801561217257600080fd5b505afa158015612186573d6000803e3d6000fd5b505050506040513d602081101561219c57600080fd5b505190506121c573c00e94cb662c3520282e6f5717214004a7f26888838363ffffffff6141b316565b604080516001600160a01b03841681526020810183905281517fae1a6d19dedc66a65b6022c27f8eafc2feccb68981b01e150fac0550422786ba929181900390910190a15050565b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561225b57600080fd5b505afa15801561226f573d6000803e3d6000fd5b505050506040513d602081101561228557600080fd5b50516001600160a01b031633146122cd5760405162461bcd60e51b81526004018080602001828103825260388152602001806145cf6038913960400191505060405180910390fd5b60345460408051639895880f60e01b815290516000926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561231257600080fd5b505afa158015612326573d6000803e3d6000fd5b505050506040513d602081101561233c57600080fd5b505160408051637e5a4eb960e01b81526001600160a01b03868116600483015291519190921691637e5a4eb9916024808301926020929190829003018186803b15801561238857600080fd5b505afa15801561239c573d6000803e3d6000fd5b505050506040513d60208110156123b257600080fd5b5051603454604080516378b88bc760e11b81526001600160a01b039283166004820152918616602483015251919250730474f6ba33ce6b058df697b5363dd11856afcde29163f171178e91604480820192602092909190829003018186803b15801561241d57600080fd5b505af4158015612431573d6000803e3d6000fd5b505050506040513d602081101561244757600080fd5b5051156124a757806001600160a01b0316631249c58b836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561248957600080fd5b505af115801561249d573d6000803e3d6000fd5b5050505050612559565b806001600160a01b031663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156124ed57600080fd5b505af1158015612501573d6000803e3d6000fd5b505050506040513d602081101561251757600080fd5b505115612559576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b505050565b603360019054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ac57600080fd5b505afa1580156125c0573d6000803e3d6000fd5b505050506040513d60208110156125d657600080fd5b50516001600160a01b0316331461261e5760405162461bcd60e51b81526004018080602001828103825260308152602001806145446030913960400191505060405180910390fd5b603354600160a81b900460ff1615612670576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6033805460ff60a81b1916600160a81b179081905560408051638da5cb5b60e01b815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258926001600160a01b036101009091041691638da5cb5b916004808301926020929190829003018186803b158015610e4d57600080fd5b6034546001600160a01b031681565b73054f76beed60ab6dbeb23502178c52d6c5debe4081565b816001600160a01b038116600e1461285a57603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561277357600080fd5b505afa158015612787573d6000803e3d6000fd5b505050506040513d602081101561279d57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b1580156127e957600080fd5b505afa1580156127fd573d6000803e3d6000fd5b505050506040513d602081101561281357600080fd5b505161285a576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b60345460408051639895880f60e01b8152905185926001600160a01b031691639895880f916004808301926020929190829003018186803b15801561289e57600080fd5b505afa1580156128b2573d6000803e3d6000fd5b505050506040513d60208110156128c857600080fd5b50516040805163748538d960e01b81526001600160a01b0384811660048301529151919092169163748538d9916024808301926020929190829003018186803b15801561291457600080fd5b505afa158015612928573d6000803e3d6000fd5b505050506040513d602081101561293e57600080fd5b505161298c576040805162461bcd60e51b8152602060048201526018602482015277151a19481d1bdad95b881a5cc81b9bdd08195b98589b195960421b604482015290519081900360640190fd5b603354600160a81b900460ff16156129de576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff16612a23576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055603454604080516376cdb03b60e01b815290516001600160a01b03909216916376cdb03b91600480820192602092909190829003018186803b158015612a7257600080fd5b505afa158015612a86573d6000803e3d6000fd5b505050506040513d6020811015612a9c57600080fd5b50516040805163378d2c3d60e21b81526001600160a01b0387811660048301529151919092169163de34b0f491602480830192600092919082900301818387803b158015612ae957600080fd5b505af1158015612afd573d6000803e3d6000fd5b505050506000603460009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5157600080fd5b505afa158015612b65573d6000803e3d6000fd5b505050506040513d6020811015612b7b57600080fd5b505160408051636ce5768960e11b81523360048201526001600160a01b038881166024830152604482018890529151919092169163d9caed129160648083019260209291908290030181600087803b158015612bd657600080fd5b505af1158015612bea573d6000803e3d6000fd5b505050506040513d6020811015612c0057600080fd5b50516034546040805163346681fb60e11b815290519293506001600160a01b03909116916368cd03f691600480820192602092909190829003018186803b158015612c4a57600080fd5b505afa158015612c5e573d6000803e3d6000fd5b505050506040513d6020811015612c7457600080fd5b505160408051638340f54960e01b81526001600160a01b03898116600483015288811660248301526044820185905291519190921691638340f54991606480830192600092919082900301818387803b158015612cd057600080fd5b505af1158015612ce4573d6000803e3d6000fd5b5050604080513381526001600160a01b038a81166020830152818301869052915191891693507fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f925081900360600190a250506033805460ff1916600117905550505050565b816001600160a01b038116600e14612e9157603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612daa57600080fd5b505afa158015612dbe573d6000803e3d6000fd5b505050506040513d6020811015612dd457600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015612e2057600080fd5b505afa158015612e34573d6000803e3d6000fd5b505050506040513d6020811015612e4a57600080fd5b5051612e91576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b816001600160a01b038116600e14612fd857603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d6020811015612f1b57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015612f6757600080fd5b505afa158015612f7b573d6000803e3d6000fd5b505050506040513d6020811015612f9157600080fd5b5051612fd8576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b603354600160a81b900460ff161561302a576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff1661306f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055603454604080516376cdb03b60e01b815290516000926001600160a01b0316916376cdb03b916004808301926020929190829003018186803b1580156130be57600080fd5b505afa1580156130d2573d6000803e3d6000fd5b505050506040513d60208110156130e857600080fd5b50516040805163378d2c3d60e21b81526001600160a01b03888116600483015291519293509083169163de34b0f49160248082019260009290919082900301818387803b15801561313857600080fd5b505af115801561314c573d6000803e3d6000fd5b50505050806001600160a01b031663de34b0f4856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156131a857600080fd5b505af11580156131bc573d6000803e3d6000fd5b50505050806001600160a01b031663e0b5a664866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561321857600080fd5b505af115801561322c573d6000803e3d6000fd5b50505050806001600160a01b031663e0b5a664856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561328857600080fd5b505af115801561329c573d6000803e3d6000fd5b50505050806001600160a01b031663d2796a93866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156132f857600080fd5b505af115801561330c573d6000803e3d6000fd5b50505050806001600160a01b031663d2796a93856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b50505050600080603460009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b505160408051631327f6d360e21b81523360048201526001600160a01b038b811660248301528a8116604483015289811660648301528251931692634c9fdb4c926084808401939192918290030181600087803b15801561345b57600080fd5b505af115801561346f573d6000803e3d6000fd5b505050506040513d604081101561348557600080fd5b508051602090910151604080516318b929e360e21b81526001600160a01b038b811660048084019190915260248301869052604483015291519395509193508516916362e4a78c9160648082019260009290919082900301818387803b1580156134ee57600080fd5b505af1158015613502573d6000803e3d6000fd5b5050604080513381526001600160a01b03808d166020830152808c1682840152606082018790528a16608082015260a0810185905290517f821677d238e1c78d2592018f061586da81bb560e8b975f1fbf109be2daa9db4393509081900360c0019150a150506033805460ff19166001179055505050505050565b6220148081565b670de0b6b3a764000081565b816001600160a01b038116600e146136d757603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135f057600080fd5b505afa158015613604573d6000803e3d6000fd5b505050506040513d602081101561361a57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b15801561366657600080fd5b505afa15801561367a573d6000803e3d6000fd5b505050506040513d602081101561369057600080fd5b50516136d7576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b603354600160a81b900460ff1615613729576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff1661376e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff19169055816137bb576040805162461bcd60e51b815260206004820152600e60248201526d416d6f756e74206973207a65726f60901b604482015290519081900360640190fd5b603454604080516376cdb03b60e01b815290516000926001600160a01b0316916376cdb03b916004808301926020929190829003018186803b15801561380057600080fd5b505afa158015613814573d6000803e3d6000fd5b505050506040513d602081101561382a57600080fd5b505160408051636ce5768960e11b81523360048201526001600160a01b038781166024830152604482018790529151919092169163d9caed129160648083019260209291908290030181600087803b15801561388557600080fd5b505af1158015613899573d6000803e3d6000fd5b505050506040513d60208110156138af57600080fd5b505160345460408051633b4571a160e01b81526001600160a01b0392831660048201526024810184905291871660448301525191925073e86a6f65d930fd0f0d182c7db3cb95b285f4dba591633b4571a191606480820192600092909190829003018186803b15801561392157600080fd5b505af4158015613935573d6000803e3d6000fd5b5050604080513381526020810185905281516001600160a01b03891694507f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb93509081900390910190a250506033805460ff191660011790555050565b806001600160a01b038116600e14613ad957603460009054906101000a90046001600160a01b03166001600160a01b0316639895880f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139f257600080fd5b505afa158015613a06573d6000803e3d6000fd5b505050506040513d6020811015613a1c57600080fd5b505160408051633fc422e560e01b81526001600160a01b03848116600483015291519190921691633fc422e5916024808301926020929190829003018186803b158015613a6857600080fd5b505afa158015613a7c573d6000803e3d6000fd5b505050506040513d6020811015613a9257600080fd5b5051613ad9576040805162461bcd60e51b81526020600482015260116024820152702ab739bab83837b93a32b2103a37b5b2b760791b604482015290519081900360640190fd5b603354600160a81b900460ff1615613b2b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60335460ff16613b70576040805162461bcd60e51b815260206004820152601f6024820152600080516020614524833981519152604482015290519081900360640190fd5b6033805460ff191690556034546040805163346681fb60e11b815290516000926001600160a01b0316916368cd03f6916004808301926020929190829003018186803b158015613bbf57600080fd5b505afa158015613bd3573d6000803e3d6000fd5b505050506040513d6020811015613be957600080fd5b50516040805163fa78d59f60e01b81523360048201526001600160a01b0386811660248301529151919092169163fa78d59f916044808301926020929190829003018186803b158015613c3b57600080fd5b505afa158015613c4f573d6000803e3d6000fd5b505050506040513d6020811015613c6557600080fd5b505111613ca35760405162461bcd60e51b815260040180806020018281038252602d8152602001806145a2602d913960400191505060405180910390fd5b603460009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015613cf157600080fd5b505afa158015613d05573d6000803e3d6000fd5b505050506040513d6020811015613d1b57600080fd5b50516040805163378d2c3d60e21b81526001600160a01b0385811660048301529151919092169163de34b0f491602480830192600092919082900301818387803b158015613d6857600080fd5b505af1158015613d7c573d6000803e3d6000fd5b505050506000603460009054906101000a90046001600160a01b03166001600160a01b03166368cd03f66040518163ffffffff1660e01b815260040160206040518083038186803b158015613dd057600080fd5b505afa158015613de4573d6000803e3d6000fd5b505050506040513d6020811015613dfa57600080fd5b50516040805163b44d253d60e01b81526001600160a01b0386811660048301523360248301529151919092169163b44d253d916044808301926020929190829003018186803b158015613e4c57600080fd5b505afa158015613e60573d6000803e3d6000fd5b505050506040513d6020811015613e7657600080fd5b5051603454604080516376cdb03b60e01b815290519293506000926001600160a01b03909216916376cdb03b91600480820192602092909190829003018186803b158015613ec357600080fd5b505afa158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b505160408051636ce5768960e11b81523360048201526001600160a01b038781166024830152604482018690529151919092169163d9caed129160648083019260209291908290030181600087803b158015613f4857600080fd5b505af1158015613f5c573d6000803e3d6000fd5b505050506040513d6020811015613f7257600080fd5b5051905080156140015760345460408051633b4571a160e01b81526001600160a01b0392831660048201526024810184905291861660448301525173e86a6f65d930fd0f0d182c7db3cb95b285f4dba591633b4571a1916064808301926000929190829003018186803b158015613fe857600080fd5b505af4158015613ffc573d6000803e3d6000fd5b505050505b604080513381526020810183905281516001600160a01b038716927f858f8be6acc95d7ac4177f157cb7c92a1d922bd948b968ce21df5b7b26a10a95928290030190a250506033805460ff191660011790555050565b8015806140dd575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156140af57600080fd5b505afa1580156140c3573d6000803e3d6000fd5b505050506040513d60208110156140d957600080fd5b5051155b6141185760405162461bcd60e51b81526004018080602001828103825260368152602001806146316036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612559908490614249565b60006141ac83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614401565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612559908490614249565b303b1590565b6033805460ff19166001179055565b6033805460ff60a81b196001600160a01b0390931661010002610100600160a81b031990911617919091169055565b61425b826001600160a01b0316614498565b6142ac576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106142ea5780518252601f1990920191602091820191016142cb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461434c576040519150601f19603f3d011682016040523d82523d6000602084013e614351565b606091505b5091509150816143a8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561201f578080602001905160208110156143c457600080fd5b505161201f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614607602a913960400191505060405180910390fd5b600081848411156144905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561445557818101518382015260200161443d565b50505050905090810190601f1680156144825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906144cc57508115155b94935050505056fe546f6b656e20616e642063546f6b656e206c656e67746820646f6e2774206d617463682e426f72726f77207a65726f20616d6f756e74206f6620746f6b656e206973206e6f7420616c6c6f7765642e5265656e7472616e637947756172643a207265656e7472616e742063616c6c00506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c65436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564546f6b656e206465706f7369745072696e636970616c206d7573742062652067726561746572207468616e20304f6e6c7920617574686f72697a656420746f2063616c6c2066726f6d20446546696e657220696e7465726e616c20636f6e7472616374732e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820c1dc980eaa7ff932ba53f511491de4b7dc61a0d06af74c9bf1d975159acd438764736f6c634300050e0032
Deployed Bytecode Sourcemap
47425:10648:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50402:319;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50402:319:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50402:319:0;-1:-1:-1;;;;;50402:319:0;;:::i;52494:571::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52494:571:0;;;;;;;;:::i;46241:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46241:150:0;;;:::i;53260:375::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53260:375:0;;;;;;;;:::i;57298:336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57298:336:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57298:336:0;-1:-1:-1;;;;;57298:336:0;;:::i;:::-;;;;;;;;;;;;;;;;51771:455;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51771:455:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51771:455:0;;;;;;;;:::i;57010:280::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57010:280:0;;;:::i;47728:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47728:78:0;;;:::i;:::-;;;;-1:-1:-1;;;;;47728:78:0;;;;;;;;;;;;;;56204:237;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56204:237:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;56204:237:0;;;;;;;;:::i;49547:744::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49547:744:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49547:744:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;49547:744:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;49547:744:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;49547:744:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;49547:744:0;;;;;;;;-1:-1:-1;49547:744:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;49547:744:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;49547:744:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;49547:744:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;49547:744:0;;-1:-1:-1;;;49547:744:0;;-1:-1:-1;;;;;49547:744:0;;-1:-1:-1;49547:744:0;;-1:-1:-1;49547:744:0:i;57982:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57982:88:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;57982:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45418:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45418:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;17040:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17040:77:0;;;:::i;57703:271::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57703:271:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57703:271:0;-1:-1:-1;;;;;57703:271:0;;:::i;56449:453::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56449:453:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;56449:453:0;;;;;;;;:::i;45998:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45998:148:0;;;:::i;47603:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47603:32:0;;;:::i;47644:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47644:77:0;;;:::i;51143:460::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51143:460:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51143:460:0;;;;;;;;;;;;;;;;;:::i;55136:930::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55136:930:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55136:930:0;;;;;;;;;;;;;;;;;;;:::i;17274:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17274:49:0;;;:::i;17124:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17124:52:0;;;:::i;53784:373::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53784:373:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53784:373:0;;;;;;;;:::i;54290:838::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54290:838:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54290:838:0;-1:-1:-1;;;;;54290:838:0;;:::i;50402:319::-;50488:12;;:32;;;-1:-1:-1;;;50488:32:0;;;;50456:14;;-1:-1:-1;;;;;50488:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;50488:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50488:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50488:32:0;50473:66;;;-1:-1:-1;;;50473:66:0;;-1:-1:-1;;;;;50473:66:0;;;;;;;;;:58;;;;;;;:66;;;;;50488:32;;50473:66;;;;;;;:58;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;50473:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50473:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50473:66:0;;-1:-1:-1;;;;;;50558:22:0;;50550:57;;;;;-1:-1:-1;;;50550:57:0;;;;;;;;;;;;-1:-1:-1;;;50550:57:0;;;;;;;;;;;;;;;50618:37;-1:-1:-1;;;;;50618:26:0;;50645:6;50653:1;50618:37;:26;:37;:::i;:::-;50666:47;-1:-1:-1;;;;;50666:26:0;;50693:6;-1:-1:-1;;50666:47:0;:26;:47;:::i;:::-;50402:319;;:::o;52494:571::-;52576:6;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;52616:12;52608:39;;;;;-1:-1:-1;;;52608:39:0;;;;;;;;;;;;-1:-1:-1;;;52608:39:0;;;;;;;;;;;;;;;52676:12;;52658:48;;;-1:-1:-1;;;52658:48:0;;-1:-1:-1;;;;;52676:12:0;;;52658:48;;;;;;;;;;;;;;;;;;:9;;:17;;:48;;;;;52676:12;;52658:48;;;;;;;:9;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;52658:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52658:48:0;;;;52772:14;52795:12;;;;;;;;;-1:-1:-1;;;;;52795:12:0;-1:-1:-1;;;;;52795:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52795:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52795:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52795:19:0;52789:61;;;-1:-1:-1;;;52789:61:0;;52822:10;52789:61;;;;-1:-1:-1;;;;;52789:61:0;;;;;;;;;;;;;;;:32;;;;;;;:61;;;;;52795:19;;52789:61;;;;;;;-1:-1:-1;52789:32:0;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;52789:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52789:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52789:61:0;;-1:-1:-1;52905:16:0;;;52902:105;;;52953:12;;52938:9;;:14;;-1:-1:-1;;;;;52953:12:0;52967:19;:7;52979:6;52967:19;:11;:19;:::i;:::-;52988:6;52938:57;;;;;;;;;;;;;-1:-1:-1;;;;;52938:57:0;-1:-1:-1;;;;;52938:57:0;;;;;;;;;;;-1:-1:-1;;;;;52938:57:0;-1:-1:-1;;;;;52938:57:0;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52938:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52938:57:0;;;;52902:105;53024:33;;;53038:10;53024:33;;;;;;;;;;-1:-1:-1;;;;;53024:33:0;;;;;;;;;;;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;52494:571:0:o;46241:150::-;46467:20;;;;;;;;;-1:-1:-1;;;;;46467:20:0;-1:-1:-1;;;;;46454:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46454:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46454:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46454:42:0;-1:-1:-1;;;;;46440:56:0;:10;:56;46432:117;;;;-1:-1:-1;;;46432:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45854:7;;-1:-1:-1;;;45854:7:0;;;;45846:40;;;;;-1:-1:-1;;;45846:40:0;;;;;;;;;;;;-1:-1:-1;;;45846:40:0;;;;;;;;;;;;;;;46300:7;:15;;-1:-1:-1;;;;46300:15:0;;;;;46340:42;;;-1:-1:-1;;;46340:42:0;;;;46331:52;;46300:15;46353:20;;-1:-1:-1;;;;;46353:20:0;;46340:40;;:42;;;;;;;;;;;;;;46353:20;46340:42;;;5:2:-1;;;;30:1;27;20:12;5:2;46340:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46340:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46340:42:0;46331:52;;;-1:-1:-1;;;;;46331:52:0;;;;;;;;;;46340:42;46331:52;;;46241:150::o;53260:375::-;53344:6;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;48835:12;;:32;;;-1:-1:-1;;;48835:32:0;;;;53369:6;;-1:-1:-1;;;;;48835:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;48835:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48835:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48835:32:0;48820:71;;;-1:-1:-1;;;48820:71:0;;-1:-1:-1;;;;;48820:71:0;;;;;;;;;:63;;;;;;;:71;;;;;48835:32;;48820:71;;;;;;;:63;:71;;;5:2:-1;;;;30:1;27;20:12;5:2;48820:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48820:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48820:71:0;48812:108;;;;;-1:-1:-1;;;48812:108:0;;;;;;;;;;;;-1:-1:-1;;;48812:108:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;53409:12;53401:39;;;;;-1:-1:-1;;;53401:39:0;;;;;;;;;;;;-1:-1:-1;;;53401:39:0;;;;;;;;;;;;;;;53469:12;;53451:48;;;-1:-1:-1;;;53451:48:0;;-1:-1:-1;;;;;53469:12:0;;;53451:48;;;;;;;;;;;;;;;;;;:9;;:17;;:48;;;;;53469:12;;53451:48;;;;;;;:9;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;53451:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53451:48:0;;;;53516:12;;;;;;;;;-1:-1:-1;;;;;53516:12:0;-1:-1:-1;;;;;53516:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53516:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53516:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53516:19:0;53510:63;;;-1:-1:-1;;;53510:63:0;;53545:10;53510:63;;;;-1:-1:-1;;;;;53510:63:0;;;;;;;;;;;;;;;:34;;;;;;;:63;;;;;-1:-1:-1;;53510:63:0;;;;;;;-1:-1:-1;53510:34:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;53510:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;53591:36:0;;;53607:10;53591:36;;;;;;;;;;-1:-1:-1;;;;;53591:36:0;;;-1:-1:-1;53591:36:0;;-1:-1:-1;53591:36:0;;;;;;;;;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;53260:375:0:o;57298:336::-;44018:11;;57366:7;;44018:11;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;57416:12;;:23;;;-1:-1:-1;;;57416:23:0;;;;44157:5;;-1:-1:-1;;;;;57416:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;57416:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57416:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57416:23:0;57406:68;;;-1:-1:-1;;;57406:68:0;;57455:10;57406:68;;;;-1:-1:-1;;;;;57406:68:0;;;;;;;;;:48;;;;;;;:68;;;;;57416:23;;57406:68;;;;;;;-1:-1:-1;57406:48:0;:68;;;5:2:-1;;;;30:1;27;20:12;5:2;57406:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57406:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57406:68:0;;-1:-1:-1;57488:13:0;;57485:70;;57503:52;47679:42;57533:10;57545:9;57503:52;:29;:52;:::i;:::-;57571:28;;;57577:10;57571:28;;;;;;;;;;;;;;;;;;;;;57617:9;-1:-1:-1;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;57298:336;;-1:-1:-1;57298:336:0:o;51771:455::-;51848:6;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;48835:12;;:32;;;-1:-1:-1;;;48835:32:0;;;;51873:6;;-1:-1:-1;;;;;48835:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;48835:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48835:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48835:32:0;48820:71;;;-1:-1:-1;;;48820:71:0;;-1:-1:-1;;;;;48820:71:0;;;;;;;;;:63;;;;;;;:71;;;;;48835:32;;48820:71;;;;;;;:63;:71;;;5:2:-1;;;;30:1;27;20:12;5:2;48820:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48820:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48820:71:0;48812:108;;;;;-1:-1:-1;;;48812:108:0;;;;;;;;;;;;-1:-1:-1;;;48812:108:0;;;;;;;;;;;;;;;45655:7;;-1:-1:-1;;;45655:7:0;;;;45654:8;45646:37;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;51929:12;51921:68;;;;-1:-1:-1;;;51921:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52008:12;;;;;;;;;-1:-1:-1;;;;;52008:12:0;-1:-1:-1;;;;;52008:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52008:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52008:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52008:19:0;52002:62;;;-1:-1:-1;;;52002:62:0;;52036:10;52002:62;;;;-1:-1:-1;;;;;52002:62:0;;;;;;;;;;;;;;;:33;;;;;;;:62;;;;;-1:-1:-1;;52002:62:0;;;;;;;-1:-1:-1;52002:33:0;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;52002:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52135:12:0;;52120:45;;;-1:-1:-1;;;52120:45:0;;-1:-1:-1;;;;;52135:12:0;;;52120:45;;;;;;;;;;;;;;;;;;:9;;-1:-1:-1;52120:14:0;;-1:-1:-1;52120:45:0;;;;;52135:12;;52120:45;;;;;;;:9;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;52120:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52183:35:0;;;52198:10;52183:35;;;;;;;;;;-1:-1:-1;;;;;52183:35:0;;;-1:-1:-1;52183:35:0;;-1:-1:-1;52183:35:0;;;;;;;;;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;51771:455:0:o;57010:280::-;44018:11;;57056:7;;44018:11;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;57106:12;;:23;;;-1:-1:-1;;;57106:23:0;;;;44157:5;;-1:-1:-1;;;;;57106:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;57106:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57106:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57106:23:0;57096:52;;;-1:-1:-1;;;57096:52:0;;57137:10;57096:52;;;;;;-1:-1:-1;;;;;57096:40:0;;;;;;:52;;;;;57106:23;;57096:52;;;;;;;;-1:-1:-1;57096:40:0;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;57096:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57096:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57096:52:0;;-1:-1:-1;57159:52:0;47679:42;57189:10;57096:52;57159;:29;:52;:::i;:::-;57227:28;;;57233:10;57227:28;;;;;;;;;;;;;;;;;;;;;57273:9;-1:-1:-1;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;57010:280;:::o;47728:78::-;47764:42;47728:78;:::o;56204:237::-;49015:12;;;;;;;;;-1:-1:-1;;;;;49015:12:0;-1:-1:-1;;;;;49015:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49015:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49015:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49015:19:0;-1:-1:-1;;;;;48993:42:0;:10;:42;48985:124;;;;-1:-1:-1;;;48985:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56322:12;;;;;;;;;-1:-1:-1;;;;;56322:12:0;-1:-1:-1;;;;;56322:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56322:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56322:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56322:32:0;56307:66;;;-1:-1:-1;;;56307:66:0;;-1:-1:-1;;;;;56307:66:0;;;;;;;;;:58;;;;;;;:66;;;;;56322:32;;56307:66;;;;;;;:58;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;56307:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56307:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56307:66:0;56299:101;;;-1:-1:-1;;;56299:101:0;;;;;;;;;;-1:-1:-1;;;;;56299:92:0;;;;;;:101;;;;;56307:66;;56299:101;;;;;;;;-1:-1:-1;56299:92:0;:101;;;5:2:-1;;;;30:1;27;20:12;5:2;56299:101:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56299:101:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56299:101:0;:106;56291:142;;;;;-1:-1:-1;;;56291:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49547:744;40934:12;;;;;;;;:31;;;40950:15;:13;:15::i;:::-;40934:47;;;-1:-1:-1;40970:11:0;;;;40969:12;40934:47;40926:106;;;;-1:-1:-1;;;40926:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41041:19;41064:12;;;;;;41063:13;41083:83;;;;41112:12;:19;;-1:-1:-1;;;;41112:19:0;;;;;41140:18;41127:4;41140:18;;;41083:83;49803:19;:17;:19::i;:::-;49833:41;49859:13;49833:17;:41::i;:::-;49887:12;:28;;-1:-1:-1;;;;;;49887:28:0;-1:-1:-1;;;;;49887:28:0;;;;;49962:23;;49936:22;;:49;49928:98;;;;-1:-1:-1;;;49928:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50053:22;;50037:13;50086:198;50105:8;50101:1;:12;50086:198;;;50168:3;-1:-1:-1;;;;;50137:35:0;:16;50154:1;50137:19;;;;;;;;;;;;;;-1:-1:-1;;;;;50137:35:0;;;:69;;;;;17075:42;-1:-1:-1;;;;;50176:30:0;:15;50192:1;50176:18;;;;;;;;;;;;;;-1:-1:-1;;;;;50176:30:0;;;50137:69;50134:139;;;50227:30;50238:15;50254:1;50238:18;;;;;;;;;;;;;;50227:10;:30::i;:::-;50114:3;;50086:198;;;;41174:1;41188:14;41184:57;;;41228:5;41213:20;;-1:-1:-1;;41213:20:0;;;41184:57;49547:744;;;;:::o;57982:88::-;58047:15;;;;;;;;;;;;-1:-1:-1;;;58047:15:0;;;;57982:88;:::o;45418:78::-;45481:7;;-1:-1:-1;;;45481:7:0;;;;;45418:78::o;17040:77::-;17075:42;17040:77;:::o;57703:271::-;49204:12;;;;;;;;;-1:-1:-1;;;;;49204:12:0;-1:-1:-1;;;;;49191:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49191:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49191:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49191:34:0;-1:-1:-1;;;;;49177:48:0;:10;:48;49169:71;;;;;-1:-1:-1;;;49169:71:0;;;;;;;;;;;;-1:-1:-1;;;49169:71:0;;;;;;;;;;;;;;;57799:42;;;-1:-1:-1;;;57799:42:0;;57835:4;57799:42;;;;;;57777:19;;47764:42;;57799:27;;:42;;;;;;;;;;;;;;;47764;57799;;;5:2:-1;;;;30:1;27;20:12;5:2;57799:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57799:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57799:42:0;;-1:-1:-1;57852:57:0;47764:42;57883:12;57799:42;57852:57;:30;:57;:::i;:::-;57927:39;;;-1:-1:-1;;;;;57927:39:0;;;;;;;;;;;;;;;;;;;;;;;49251:1;57703:271;:::o;56449:453::-;49015:12;;;;;;;;;-1:-1:-1;;;;;49015:12:0;-1:-1:-1;;;;;49015:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49015:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49015:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49015:19:0;-1:-1:-1;;;;;48993:42:0;:10;:42;48985:124;;;;-1:-1:-1;;;48985:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56566:12;;:32;;;-1:-1:-1;;;56566:32:0;;;;56534:14;;-1:-1:-1;;;;;56566:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;56566:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56566:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56566:32:0;56551:66;;;-1:-1:-1;;;56551:66:0;;-1:-1:-1;;;;;56551:66:0;;;;;;;;;:58;;;;;;;:66;;;;;56566:32;;56551:66;;;;;;;:58;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;56551:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56551:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56551:66:0;56653:12;;56632:43;;;-1:-1:-1;;;56632:43:0;;-1:-1:-1;;;;;56653:12:0;;;56632:43;;;;;;;;;;;;56551:66;;-1:-1:-1;56632:5:0;;:12;;:43;;;;;56551:66;;56632:43;;;;;;;;:5;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;56632:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56632:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56632:43:0;56628:267;;;56698:6;-1:-1:-1;;;;;56692:18:0;;56717:7;56692:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56692:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56692:35:0;;;;;56628:267;;;56841:6;-1:-1:-1;;;;;56833:20:0;;56854:7;56833:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56833:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56833:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56833:29:0;:34;56825:58;;;;;-1:-1:-1;;;56825:58:0;;;;;;;;;;;;-1:-1:-1;;;56825:58:0;;;;;;;;;;;;;;;49120:1;56449:453;;:::o;45998:148::-;46467:20;;;;;;;;;-1:-1:-1;;;;;46467:20:0;-1:-1:-1;;;;;46454:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46454:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46454:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46454:42:0;-1:-1:-1;;;;;46440:56:0;:10;:56;46432:117;;;;-1:-1:-1;;;46432:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45655:7;;-1:-1:-1;;;45655:7:0;;;;45654:8;45646:37;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;;;;46058:7;:14;;-1:-1:-1;;;;46058:14:0;-1:-1:-1;;;46058:14:0;;;;;46095:42;;;-1:-1:-1;;;46095:42:0;;;;46088:50;;-1:-1:-1;;;;;46058:14:0;46108:20;;;;;46095:40;;:42;;;;;;;;;;;;;;46108:20;46095:42;;;5:2:-1;;;;30:1;27;20:12;47603:32:0;;;-1:-1:-1;;;;;47603:32:0;;:::o;47644:77::-;47679:42;47644:77;:::o;51143:460::-;51232:6;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;48835:12;;:32;;;-1:-1:-1;;;48835:32:0;;;;51257:6;;-1:-1:-1;;;;;48835:12:0;;:30;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;48835:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48835:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48835:32:0;48820:71;;;-1:-1:-1;;;48820:71:0;;-1:-1:-1;;;;;48820:71:0;;;;;;;;;:63;;;;;;;:71;;;;;48835:32;;48820:71;;;;;;;:63;:71;;;5:2:-1;;;;30:1;27;20:12;5:2;48820:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48820:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48820:71:0;48812:108;;;;;-1:-1:-1;;;48812:108:0;;;;;;;;;;;;-1:-1:-1;;;48812:108:0;;;;;;;;;;;;;;;45655:7;;-1:-1:-1;;;45655:7:0;;;;45654:8;45646:37;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;51311:12;;:19;;;-1:-1:-1;;;51311:19:0;;;;-1:-1:-1;;;;;51311:12:0;;;;:17;;:19;;;;;;;;;;;;;;;:12;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;51311:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51311:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51311:19:0;51305:57;;;-1:-1:-1;;;51305:57:0;;-1:-1:-1;;;;;51305:57:0;;;;;;;;;:49;;;;;;;:57;;;;;-1:-1:-1;;51305:57:0;;;;;;;-1:-1:-1;51305:49:0;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;51305:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51305:57:0;;;;51373:14;51400:12;;;;;;;;;-1:-1:-1;;;;;51400:12:0;-1:-1:-1;;;;;51400:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51400:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51400:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51400:23:0;51390:72;;;-1:-1:-1;;;51390:72:0;;51434:10;51390:72;;;;-1:-1:-1;;;;;51390:72:0;;;;;;;;;;;;;;;:43;;;;;;;:72;;;;;51400:23;;51390:72;;;;;;;-1:-1:-1;51390:43:0;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;51390:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51390:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51390:72:0;51483:12;;:23;;;-1:-1:-1;;;51483:23:0;;;;51390:72;;-1:-1:-1;;;;;;51483:12:0;;;;:21;;:23;;;;;51390:72;;51483:23;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;51483:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51483:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51483:23:0;51473:63;;;-1:-1:-1;;;51473:63:0;;-1:-1:-1;;;;;51473:63:0;;;;;;;;;;;;;;;;;;;;;;:42;;;;;;;:63;;;;;-1:-1:-1;;51473:63:0;;;;;;;-1:-1:-1;51473:42:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;51473:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;51554:41:0;;;51571:10;51554:41;;-1:-1:-1;;;;;51554:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;51554:41:0;;-1:-1:-1;51554:41:0;;;;;;;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;;;51143:460:0:o;55136:930::-;55250:14;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;55285:16;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;45655:7;;-1:-1:-1;;;45655:7:0;;;;45654:8;45646:37;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;55368:12;;:19;;;-1:-1:-1;;;55368:19:0;;;;44157:5;;-1:-1:-1;;;;;55368:12:0;;:17;;:19;;;;;;;;;;;;;;:12;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;55368:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55368:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55368:19:0;55400:43;;;-1:-1:-1;;;55400:43:0;;-1:-1:-1;;;;;55400:43:0;;;;;;;;;55368:19;;-1:-1:-1;55400:27:0;;;;;;:43;;;;;-1:-1:-1;;55400:43:0;;;;;;;;-1:-1:-1;55400:27:0;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;55400:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55400:43:0;;;;55454:4;-1:-1:-1;;;;;55454:27:0;;55482:16;55454:45;;;;;;;;;;;;;-1:-1:-1;;;;;55454:45:0;-1:-1:-1;;;;;55454:45:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55454:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55454:45:0;;;;55510:4;-1:-1:-1;;;;;55510:26:0;;55537:14;55510:42;;;;;;;;;;;;;-1:-1:-1;;;;;55510:42:0;-1:-1:-1;;;;;55510:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55510:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55510:42:0;;;;55563:4;-1:-1:-1;;;;;55563:26:0;;55590:16;55563:44;;;;;;;;;;;;;-1:-1:-1;;;;;55563:44:0;-1:-1:-1;;;;;55563:44:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55563:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55563:44:0;;;;55618:4;-1:-1:-1;;;;;55618:25:0;;55644:14;55618:41;;;;;;;;;;;;;-1:-1:-1;;;;;55618:41:0;-1:-1:-1;;;;;55618:41:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55618:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55618:41:0;;;;55670:4;-1:-1:-1;;;;;55670:25:0;;55696:16;55670:43;;;;;;;;;;;;;-1:-1:-1;;;;;55670:43:0;-1:-1:-1;;;;;55670:43:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55670:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55670:43:0;;;;55725:19;55746:17;55777:12;;;;;;;;;-1:-1:-1;;;;;55777:12:0;-1:-1:-1;;;;;55777:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55777:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55777:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55777:23:0;55767:101;;;-1:-1:-1;;;55767:101:0;;55812:10;55767:101;;;;-1:-1:-1;;;;;55767:101:0;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;:101;;;;;;;;;;;;;-1:-1:-1;55767:44:0;:101;;;5:2:-1;;;;30:1;27;20:12;5:2;55767:101:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55767:101:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55767:101:0;;;;;;;;55879:73;;-1:-1:-1;;;55879:73:0;;-1:-1:-1;;;;;55879:73:0;;;55920:31;55879:73;;;;;;;;;;;;;;;;;;;55767:101;;-1:-1:-1;55767:101:0;;-1:-1:-1;55879:11:0;;;;;:73;;;;;-1:-1:-1;;55879:73:0;;;;;;;;-1:-1:-1;55879:11:0;:73;;;5:2:-1;;;;30:1;27;20:12;5:2;55879:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;55968:90:0;;;55978:10;55968:90;;-1:-1:-1;;;;;55968:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55968:90:0;;;;;;;-1:-1:-1;55968:90:0;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;;;;;55136:930:0:o;17274:49::-;17316:7;17274:49;:::o;17124:52::-;17159:17;17124:52;:::o;53784:373::-;53863:6;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;45655:7;;-1:-1:-1;;;45655:7:0;;;;45654:8;45646:37;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;53917:12;53909:39;;;;;-1:-1:-1;;;53909:39:0;;;;;;;;;;;;-1:-1:-1;;;53909:39:0;;;;;;;;;;;;;;;53982:12;;:19;;;-1:-1:-1;;;53982:19:0;;;;53959:14;;-1:-1:-1;;;;;53982:12:0;;:17;;:19;;;;;;;;;;;;;;:12;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;53982:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53982:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53982:19:0;53976:64;;;-1:-1:-1;;;53976:64:0;;54012:10;53976:64;;;;-1:-1:-1;;;;;53976:64:0;;;;;;;;;;;;;;;:35;;;;;;;:64;;;;;53982:19;;53976:64;;;;;;;-1:-1:-1;53976:35:0;:64;;;5:2:-1;;;;30:1;27;20:12;5:2;53976:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53976:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53976:64:0;54066:12;;54051:44;;;-1:-1:-1;;;54051:44:0;;-1:-1:-1;;;;;54066:12:0;;;54051:44;;;;;;;;;;;;;;;;;;53976:64;;-1:-1:-1;54051:9:0;;:14;;:44;;;;;54066:12;;54051:44;;;;;;;;:9;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;54051:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;54113:36:0;;;54130:10;54113:36;;;;;;;;;;-1:-1:-1;;;;;54113:36:0;;;-1:-1:-1;54113:36:0;;-1:-1:-1;54113:36:0;;;;;;;;;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;53784:373:0:o;54290:838::-;54355:6;-1:-1:-1;;;;;48586:18:0;;17075:42;48586:18;48583:149;;48644:12;;;;;;;;;-1:-1:-1;;;;;48644:12:0;-1:-1:-1;;;;;48644:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48644:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48644:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48644:32:0;48629:69;;;-1:-1:-1;;;48629:69:0;;-1:-1:-1;;;;;48629:69:0;;;;;;;;;:61;;;;;;;:69;;;;;48644:32;;48629:69;;;;;;;:61;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;48629:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48629:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48629:69:0;48621:99;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;-1:-1:-1;;;48621:99:0;;;;;;;;;;;;;;;45655:7;;-1:-1:-1;;;45655:7:0;;;;45654:8;45646:37;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;-1:-1:-1;;;45646:37:0;;;;;;;;;;;;;;;44018:11;;;;44010:55;;;;;-1:-1:-1;;;44010:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44010:55:0;;;;;;;;;;;;;;;44143:11;:19;;-1:-1:-1;;44143:19:0;;;54446:12;;:23;;;-1:-1:-1;;;54446:23:0;;;;44157:5;;-1:-1:-1;;;;;54446:12:0;;:21;;:23;;;;;;;;;;;;;;:12;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;54446:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54446:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54446:23:0;54436:74;;;-1:-1:-1;;;54436:74:0;;54491:10;54436:74;;;;-1:-1:-1;;;;;54436:74:0;;;;;;;;;:54;;;;;;;:74;;;;;54446:23;;54436:74;;;;;;;:54;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;54436:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54436:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54436:74:0;:78;54428:136;;;;-1:-1:-1;;;54428:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54636:12;;;;;;;;;-1:-1:-1;;;;;54636:12:0;-1:-1:-1;;;;;54636:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54636:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54636:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54636:19:0;54630:57;;;-1:-1:-1;;;54630:57:0;;-1:-1:-1;;;;;54630:57:0;;;;;;;;;:49;;;;;;;:57;;;;;-1:-1:-1;;54630:57:0;;;;;;;-1:-1:-1;54630:49:0;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;54630:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54630:57:0;;;;54758:11;54782:12;;;;;;;;;-1:-1:-1;;;;;54782:12:0;-1:-1:-1;;;;;54782:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54782:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54782:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54782:23:0;54772:79;;;-1:-1:-1;;;54772:79:0;;-1:-1:-1;;;;;54772:79:0;;;;;;;54840:10;54772:79;;;;;;:59;;;;;;;:79;;;;;54782:23;;54772:79;;;;;;;:59;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;54772:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54772:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54772:79:0;54893:12;;:19;;;-1:-1:-1;;;54893:19:0;;;;54772:79;;-1:-1:-1;54864:20:0;;-1:-1:-1;;;;;54893:12:0;;;;:17;;:19;;;;;54772:79;;54893:19;;;;;;;;:12;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;54893:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54893:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54893:19:0;54887:63;;;-1:-1:-1;;;54887:63:0;;54923:10;54887:63;;;;-1:-1:-1;;;;;54887:63:0;;;;;;;;;;;;;;;:35;;;;;;;:63;;;;;54893:19;;54887:63;;;;;;;-1:-1:-1;54887:35:0;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;54887:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54887:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54887:63:0;;-1:-1:-1;54964:17:0;;54961:99;;55013:12;;54998:50;;;-1:-1:-1;;;54998:50:0;;-1:-1:-1;;;;;55013:12:0;;;54998:50;;;;;;;;;;;;;;;;;;:9;;:14;;:50;;;;;55013:12;;54998:50;;;;;;;:9;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;54998:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54998:50:0;;;;54961:99;55075:45;;;55095:10;55075:45;;;;;;;;;;-1:-1:-1;;;;;55075:45:0;;;;;;;;;;;-1:-1:-1;;44323:11:0;:18;;-1:-1:-1;;44323:18:0;44337:4;44323:18;;;-1:-1:-1;;54290:838:0:o;35999:621::-;36369:10;;;36368:62;;-1:-1:-1;36385:39:0;;;-1:-1:-1;;;36385:39:0;;36409:4;36385:39;;;;-1:-1:-1;;;;;36385:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;36385:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36385:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36385:39:0;:44;36368:62;36360:152;;;;-1:-1:-1;;;36360:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36549:62;;;-1:-1:-1;;;;;36549:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;36549:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;36523:89:0;;36542:5;;36523:18;:89::i;1317:136::-;1375:7;1402:43;1406:1;1409;1402:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1395:50;1317:136;-1:-1:-1;;;1317:136:0:o;35603:176::-;35712:58;;;-1:-1:-1;;;;;35712:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;35712:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;35686:85:0;;35705:5;;35686:18;:85::i;41335:508::-;41752:4;41798:17;41830:7;41335:508;:::o;43032:487::-;43493:11;:18;;-1:-1:-1;;43493:18:0;43507:4;43493:18;;;43032:487::o;45184:134::-;45248:20;:36;;-1:-1:-1;;;;;;;;;45248:36:0;;;;;-1:-1:-1;;;;;;45248:36:0;;;;45295:15;;;;;;45184:134::o;37642:1114::-;38246:27;38254:5;-1:-1:-1;;;;;38246:25:0;;:27::i;:::-;38238:71;;;;;-1:-1:-1;;;38238:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38383:12;38397:23;38432:5;-1:-1:-1;;;;;38424:19:0;38444:4;38424: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;;;38424: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;;38382:67:0;;;;38468:7;38460:52;;;;;-1:-1:-1;;;38460:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38529:17;;:21;38525:224;;38671:10;38660:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38660:30:0;38652:85;;;;-1:-1:-1;;;38652:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1790:192;1876:7;1912:12;1904:6;;;;1896:29;;;;-1:-1:-1;;;1896: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;1896:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1948:5:0;;;1790:192::o;32725:619::-;32785:4;33253:20;;33096:66;33293:23;;;;;;:42;;-1:-1:-1;33320:15:0;;;33293:42;33285:51;32725:619;-1:-1:-1;;;;32725:619:0:o
Swarm Source
bzzr://c1dc980eaa7ff932ba53f511491de4b7dc61a0d06af74c9bf1d975159acd4387
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.