Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 4 from a total of 4 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.8
Contract Source Code (Vyper language format)
# @version 0.2.8 """ @title StableSwap @author Curve.Fi @license Copyright (c) Curve.Fi, 2021 - all rights reserved @notice 3pool metapool implementation contract """ interface ERC20: def transfer(_receiver: address, _amount: uint256): nonpayable def transferFrom(_sender: address, _receiver: address, _amount: uint256): nonpayable def approve(_spender: address, _amount: uint256): nonpayable def balanceOf(_owner: address) -> uint256: view interface Curve: def coins(i: uint256) -> address: view def get_virtual_price() -> uint256: view def calc_token_amount(amounts: uint256[BASE_N_COINS], deposit: bool) -> uint256: view def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: view def fee() -> uint256: view def get_dy(i: int128, j: int128, dx: uint256) -> uint256: view def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256): nonpayable def add_liquidity(amounts: uint256[BASE_N_COINS], min_mint_amount: uint256): nonpayable def remove_liquidity_one_coin(_token_amount: uint256, i: int128, min_amount: uint256): nonpayable interface Factory: def convert_fees() -> bool: nonpayable def fee_receiver(_base_pool: address) -> address: view event Transfer: sender: indexed(address) receiver: indexed(address) value: uint256 event Approval: owner: indexed(address) spender: indexed(address) value: uint256 event TokenExchange: buyer: indexed(address) sold_id: int128 tokens_sold: uint256 bought_id: int128 tokens_bought: uint256 event TokenExchangeUnderlying: buyer: indexed(address) sold_id: int128 tokens_sold: uint256 bought_id: int128 tokens_bought: uint256 event AddLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event RemoveLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] token_supply: uint256 event RemoveLiquidityOne: provider: indexed(address) token_amount: uint256 coin_amount: uint256 token_supply: uint256 event RemoveLiquidityImbalance: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event CommitNewAdmin: deadline: indexed(uint256) admin: indexed(address) event NewAdmin: admin: indexed(address) event CommitNewFee: deadline: indexed(uint256) fee: uint256 admin_fee: uint256 event NewFee: fee: uint256 admin_fee: uint256 event RampA: old_A: uint256 new_A: uint256 initial_time: uint256 future_time: uint256 event StopRampA: A: uint256 t: uint256 BASE_POOL: constant(address) = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7 BASE_COINS: constant(address[3]) = [ 0x6B175474E89094C44Da98b954EedeAC495271d0F, # DAI 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, # USDC 0xdAC17F958D2ee523a2206206994597C13D831ec7, # USDT ] N_COINS: constant(int128) = 2 MAX_COIN: constant(int128) = N_COINS - 1 BASE_N_COINS: constant(int128) = 3 PRECISION: constant(uint256) = 10 ** 18 FEE_DENOMINATOR: constant(uint256) = 10 ** 10 ADMIN_FEE: constant(uint256) = 5000000000 A_PRECISION: constant(uint256) = 100 MAX_A: constant(uint256) = 10 ** 6 MAX_A_CHANGE: constant(uint256) = 10 MIN_RAMP_TIME: constant(uint256) = 86400 admin: public(address) factory: address coins: public(address[N_COINS]) balances: public(uint256[N_COINS]) fee: public(uint256) # fee * 1e10 previous_balances: uint256[N_COINS] price_cumulative_last: uint256[N_COINS] block_timestamp_last: public(uint256) initial_A: public(uint256) future_A: public(uint256) initial_A_time: public(uint256) future_A_time: public(uint256) rate_multiplier: uint256 name: public(String[64]) symbol: public(String[32]) balanceOf: public(HashMap[address, uint256]) allowance: public(HashMap[address, HashMap[address, uint256]]) totalSupply: public(uint256) @external def __init__(): # we do this to prevent the implementation contract from being used as a pool self.fee = 31337 @external def initialize( _name: String[32], _symbol: String[10], _coin: address, _decimals: uint256, _A: uint256, _fee: uint256, _admin: address, ): """ @notice Contract initializer @param _name Name of the new pool @param _symbol Token symbol @param _coin Addresses of ERC20 conracts of coins @param _decimals Number of decimals in `_coin` @param _A Amplification coefficient multiplied by n * (n - 1) @param _fee Fee to charge for exchanges @param _admin Admin address """ # # things break if a token has >18 decimals assert _decimals < 19 # fee must be between 0.04% and 1% assert _fee >= 4000000 assert _fee <= 100000000 # check if fee was already set to prevent initializing contract twice assert self.fee == 0 A: uint256 = _A * A_PRECISION self.coins = [_coin, 0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490] self.rate_multiplier = 10 ** (36 - _decimals) self.initial_A = A self.future_A = A self.fee = _fee self.admin = _admin self.factory = msg.sender self.name = concat("Curve.fi Factory USD Metapool: ", _name) self.symbol = concat(_symbol, "3CRV-f") for coin in BASE_COINS: ERC20(coin).approve(BASE_POOL, MAX_UINT256) # fire a transfer event so block explorers identify the contract as an ERC20 log Transfer(ZERO_ADDRESS, self, 0) ### ERC20 Functionality ### @view @external def decimals() -> uint256: """ @notice Get the number of decimals for this token @dev Implemented as a view method to reduce gas costs @return uint256 decimal places """ return 18 @internal def _transfer(_from: address, _to: address, _value: uint256): # NOTE: vyper does not allow underflows # so the following subtraction would revert on insufficient balance self.balanceOf[_from] -= _value self.balanceOf[_to] += _value log Transfer(_from, _to, _value) @external def transfer(_to : address, _value : uint256) -> bool: """ @dev Transfer token for a specified address @param _to The address to transfer to. @param _value The amount to be transferred. """ self._transfer(msg.sender, _to, _value) return True @external def transferFrom(_from : address, _to : address, _value : uint256) -> bool: """ @dev Transfer tokens from one address to another. @param _from address The address which you want to send tokens from @param _to address The address which you want to transfer to @param _value uint256 the amount of tokens to be transferred """ self._transfer(_from, _to, _value) _allowance: uint256 = self.allowance[_from][msg.sender] if _allowance != MAX_UINT256: self.allowance[_from][msg.sender] = _allowance - _value return True @external def approve(_spender : address, _value : uint256) -> bool: """ @notice Approve the passed address to transfer the specified amount of tokens on behalf of msg.sender @dev Beware that changing an allowance via this method brings the risk that someone may use both the old and new allowance by unfortunate transaction ordering: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 @param _spender The address which will transfer the funds @param _value The amount of tokens that may be transferred @return bool success """ self.allowance[msg.sender][_spender] = _value log Approval(msg.sender, _spender, _value) return True ### StableSwap Functionality ### @view @external def get_previous_balances() -> uint256[N_COINS]: return self.previous_balances @view @external def get_balances() -> uint256[N_COINS]: return self.balances @view @external def get_twap_balances(_first_balances: uint256[N_COINS], _last_balances: uint256[N_COINS], _time_elapsed: uint256) -> uint256[N_COINS]: balances: uint256[N_COINS] = empty(uint256[N_COINS]) for x in range(N_COINS): balances[x] = (_last_balances[x] - _first_balances[x]) / _time_elapsed return balances @view @external def get_price_cumulative_last() -> uint256[N_COINS]: return self.price_cumulative_last @view @internal def _A() -> uint256: """ Handle ramping A up or down """ t1: uint256 = self.future_A_time A1: uint256 = self.future_A if block.timestamp < t1: A0: uint256 = self.initial_A t0: uint256 = self.initial_A_time # Expressions in uint256 cannot have negative numbers, thus "if" if A1 > A0: return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0) else: return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0) else: # when t1 == 0 or block.timestamp >= t1 return A1 @internal def _update(): """ Commits pre-change balances for the previous block Can be used to compare against current values for flash loan checks """ elapsed_time: uint256 = block.timestamp - self.block_timestamp_last if elapsed_time > 0: for i in range(N_COINS): _balance: uint256 = self.balances[i] self.price_cumulative_last[i] += _balance * elapsed_time self.previous_balances[i] = _balance self.block_timestamp_last = block.timestamp @view @external def admin_fee() -> uint256: return ADMIN_FEE @view @external def A() -> uint256: return self._A() / A_PRECISION @view @external def A_precise() -> uint256: return self._A() @pure @internal def _xp_mem(_rates: uint256[N_COINS], _balances: uint256[N_COINS]) -> uint256[N_COINS]: result: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): result[i] = _rates[i] * _balances[i] / PRECISION return result @pure @internal def get_D(_xp: uint256[N_COINS], _amp: uint256) -> uint256: S: uint256 = 0 Dprev: uint256 = 0 for x in _xp: S += x if S == 0: return 0 D: uint256 = S Ann: uint256 = _amp * N_COINS for i in range(255): D_P: uint256 = D for x in _xp: D_P = D_P * D / (x * N_COINS) # If division by 0, this will be borked: only withdrawal will work. And that is good Dprev = D D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P) # Equality with the precision of 1 if D > Dprev: if D - Dprev <= 1: return D else: if Dprev - D <= 1: return D # convergence typically occurs in 4 rounds or less, this should be unreachable! # if it does happen the pool is borked and LPs can withdraw via `remove_liquidity` raise @view @internal def get_D_mem(_rates: uint256[N_COINS], _balances: uint256[N_COINS], _amp: uint256) -> uint256: xp: uint256[N_COINS] = self._xp_mem(_rates, _balances) return self.get_D(xp, _amp) @view @external def get_virtual_price() -> uint256: """ @notice The current virtual price of the pool LP token @dev Useful for calculating profits @return LP token virtual price normalized to 1e18 """ amp: uint256 = self._A() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] xp: uint256[N_COINS] = self._xp_mem(rates, self.balances) D: uint256 = self.get_D(xp, amp) # D is in the units similar to DAI (e.g. converted to precision 1e18) # When balanced, D = n * x_u - total virtual value of the portfolio return D * PRECISION / self.totalSupply @view @external def calc_token_amount(_amounts: uint256[N_COINS], _is_deposit: bool, _previous: bool = False) -> uint256: """ @notice Calculate addition or reduction in token supply from a deposit or withdrawal @dev This calculation accounts for slippage, but not fees. Needed to prevent front-running, not for precise calculations! @param _amounts Amount of each coin being deposited @param _is_deposit set True for deposits, False for withdrawals @param _previous use previous_balances or self.balances @return Expected amount of LP tokens received """ amp: uint256 = self._A() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] balances: uint256[N_COINS] = self.balances if _previous: balances = self.previous_balances D0: uint256 = self.get_D_mem(rates, balances, amp) for i in range(N_COINS): amount: uint256 = _amounts[i] if _is_deposit: balances[i] += amount else: balances[i] -= amount D1: uint256 = self.get_D_mem(rates, balances, amp) diff: uint256 = 0 if _is_deposit: diff = D1 - D0 else: diff = D0 - D1 return diff * self.totalSupply / D0 @external @nonreentrant('lock') def add_liquidity( _amounts: uint256[N_COINS], _min_mint_amount: uint256, _receiver: address = msg.sender ) -> uint256: """ @notice Deposit coins into the pool @param _amounts List of amounts of coins to deposit @param _min_mint_amount Minimum amount of LP tokens to mint from the deposit @param _receiver Address that owns the minted LP tokens @return Amount of LP tokens received by depositing """ self._update() amp: uint256 = self._A() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] # Initial invariant old_balances: uint256[N_COINS] = self.balances D0: uint256 = self.get_D_mem(rates, old_balances, amp) new_balances: uint256[N_COINS] = old_balances total_supply: uint256 = self.totalSupply for i in range(N_COINS): amount: uint256 = _amounts[i] if total_supply == 0: assert amount > 0 # dev: initial deposit requires all coins new_balances[i] += amount # Invariant after change D1: uint256 = self.get_D_mem(rates, new_balances, amp) assert D1 > D0 # We need to recalculate the invariant accounting for fees # to calculate fair user's share fees: uint256[N_COINS] = empty(uint256[N_COINS]) mint_amount: uint256 = 0 if total_supply > 0: # Only account for fees if we are not the first to deposit base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) for i in range(N_COINS): ideal_balance: uint256 = D1 * old_balances[i] / D0 difference: uint256 = 0 new_balance: uint256 = new_balances[i] if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance fees[i] = base_fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (fees[i] * ADMIN_FEE / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(rates, new_balances, amp) mint_amount = total_supply * (D2 - D0) / D0 else: self.balances = new_balances mint_amount = D1 # Take the dust if there was any assert mint_amount >= _min_mint_amount # Take coins from the sender for i in range(N_COINS): amount: uint256 = _amounts[i] if amount > 0: ERC20(self.coins[i]).transferFrom(msg.sender, self, amount) # dev: failed transfer # Mint pool tokens total_supply += mint_amount self.balanceOf[_receiver] += mint_amount self.totalSupply = total_supply log Transfer(ZERO_ADDRESS, _receiver, mint_amount) log AddLiquidity(msg.sender, _amounts, fees, D1, total_supply) return mint_amount @view @internal def get_y(i: int128, j: int128, x: uint256, xp: uint256[N_COINS]) -> uint256: # x in the input is converted to the same price/precision assert i != j # dev: same coin assert j >= 0 # dev: j below zero assert j < N_COINS # dev: j above N_COINS # should be unreachable, but good for safety assert i >= 0 assert i < N_COINS amp: uint256 = self._A() D: uint256 = self.get_D(xp, amp) S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 c: uint256 = D Ann: uint256 = amp * N_COINS for _i in range(N_COINS): if _i == i: _x = x elif _i != j: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann # - D y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @external def get_dy(i: int128, j: int128, dx: uint256, _balances: uint256[N_COINS] = [0,0]) -> uint256: """ @notice Calculate the current output dy given input dx @dev Index values can be found via the `coins` public getter method @param i Index value for the coin to send @param j Index valie of the coin to recieve @param dx Amount of `i` being exchanged @param _balances which balance to use, current, previous, or twap @return Amount of `j` predicted """ rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] xp: uint256[N_COINS] = _balances if _balances[0] == 0: xp = self.balances xp = self._xp_mem(rates, xp) x: uint256 = xp[i] + (dx * rates[i] / PRECISION) y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 fee: uint256 = self.fee * dy / FEE_DENOMINATOR return (dy - fee) * PRECISION / rates[j] @view @external def get_dy_underlying(i: int128, j: int128, dx: uint256, _balances: uint256[N_COINS] = [0,0]) -> uint256: """ @notice Calculate the current output dy given input dx on underlying @dev Index values can be found via the `coins` public getter method @param i Index value for the coin to send @param j Index valie of the coin to recieve @param dx Amount of `i` being exchanged @param _balances which balance to use, current, previous, or twap @return Amount of `j` predicted """ rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] xp: uint256[N_COINS] = _balances if _balances[0] == 0: xp = self.balances xp = self._xp_mem(rates, xp) base_pool: address = BASE_POOL x: uint256 = 0 base_i: int128 = 0 base_j: int128 = 0 meta_i: int128 = 0 meta_j: int128 = 0 if i != 0: base_i = i - MAX_COIN meta_i = 1 if j != 0: base_j = j - MAX_COIN meta_j = 1 if i == 0: x = xp[i] + dx * (rates[0] / 10**18) else: if j == 0: # i is from BasePool # At first, get the amount of pool tokens base_inputs: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS]) base_inputs[base_i] = dx # Token amount transformed to underlying "dollars" x = Curve(base_pool).calc_token_amount(base_inputs, True) * rates[1] / PRECISION # Accounting for deposit/withdraw fees approximately x -= x * Curve(base_pool).fee() / (2 * FEE_DENOMINATOR) # Adding number of pool tokens x += xp[MAX_COIN] else: # If both are from the base pool return Curve(base_pool).get_dy(base_i, base_j, dx) # This pool is involved only when in-pool assets are used y: uint256 = self.get_y(meta_i, meta_j, x, xp) dy: uint256 = xp[meta_j] - y - 1 dy = (dy - self.fee * dy / FEE_DENOMINATOR) # If output is going via the metapool if j == 0: dy /= (rates[0] / 10**18) else: # j is from BasePool # The fee is already accounted for dy = Curve(base_pool).calc_withdraw_one_coin(dy * PRECISION / rates[1], base_j) return dy @external @nonreentrant('lock') def exchange( i: int128, j: int128, dx: uint256, min_dy: uint256, _receiver: address = msg.sender, ) -> uint256: """ @notice Perform an exchange between two coins @dev Index values can be found via the `coins` public getter method @param i Index value for the coin to send @param j Index valie of the coin to recieve @param dx Amount of `i` being exchanged @param min_dy Minimum amount of `j` to receive @param _receiver Address that receives `j` @return Actual amount of `j` received """ self._update() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] old_balances: uint256[N_COINS] = self.balances xp: uint256[N_COINS] = self._xp_mem(rates, old_balances) x: uint256 = xp[i] + dx * rates[i] / PRECISION y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 # -1 just in case there were some rounding errors dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR # Convert all to real units dy = (dy - dy_fee) * PRECISION / rates[j] assert dy >= min_dy dy_admin_fee: uint256 = dy_fee * ADMIN_FEE / FEE_DENOMINATOR dy_admin_fee = dy_admin_fee * PRECISION / rates[j] # Change balances exactly in same way as we change actual ERC20 coin amounts self.balances[i] = old_balances[i] + dx # When rounding errors happen, we undercharge admin fee in favor of LP self.balances[j] = old_balances[j] - dy - dy_admin_fee ERC20(self.coins[i]).transferFrom(msg.sender, self, dx) ERC20(self.coins[j]).transfer(_receiver, dy) log TokenExchange(msg.sender, i, dx, j, dy) return dy @external @nonreentrant('lock') def exchange_underlying( i: int128, j: int128, dx: uint256, min_dy: uint256, _receiver: address = msg.sender, ) -> uint256: """ @notice Perform an exchange between two underlying coins @dev Index values can be found via the `underlying_coins` public getter method @param i Index value for the underlying coin to send @param j Index valie of the underlying coin to recieve @param dx Amount of `i` being exchanged @param min_dy Minimum amount of `j` to receive @param _receiver Address that receives `j` @return Actual amount of `j` received """ self._update() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] old_balances: uint256[N_COINS] = self.balances xp: uint256[N_COINS] = self._xp_mem(rates, old_balances) base_pool: address = BASE_POOL base_coins: address[3] = BASE_COINS dy: uint256 = 0 base_i: int128 = 0 base_j: int128 = 0 meta_i: int128 = 0 meta_j: int128 = 0 x: uint256 = 0 input_coin: address = ZERO_ADDRESS output_coin: address = ZERO_ADDRESS if i == 0: input_coin = self.coins[0] else: base_i = i - MAX_COIN meta_i = 1 input_coin = base_coins[base_i] if j == 0: output_coin = self.coins[0] else: base_j = j - MAX_COIN meta_j = 1 output_coin = base_coins[base_j] # Handle potential Tether fees dx_w_fee: uint256 = dx if j == 3: dx_w_fee = ERC20(input_coin).balanceOf(self) ERC20(input_coin).transferFrom(msg.sender, self, dx) # Handle potential Tether fees if j == 3: dx_w_fee = ERC20(input_coin).balanceOf(self) - dx_w_fee if i == 0 or j == 0: if i == 0: x = xp[i] + dx_w_fee * rates[i] / PRECISION else: # i is from BasePool # At first, get the amount of pool tokens base_inputs: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS]) base_inputs[base_i] = dx_w_fee coin_i: address = self.coins[MAX_COIN] # Deposit and measure delta x = ERC20(coin_i).balanceOf(self) Curve(base_pool).add_liquidity(base_inputs, 0) # Need to convert pool token to "virtual" units using rates # dx is also different now dx_w_fee = ERC20(coin_i).balanceOf(self) - x x = dx_w_fee * rates[MAX_COIN] / PRECISION # Adding number of pool tokens x += xp[MAX_COIN] y: uint256 = self.get_y(meta_i, meta_j, x, xp) # Either a real coin or token dy = xp[meta_j] - y - 1 # -1 just in case there were some rounding errors dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR # Convert all to real units # Works for both pool coins and real coins dy = (dy - dy_fee) * PRECISION / rates[meta_j] dy_admin_fee: uint256 = dy_fee * ADMIN_FEE / FEE_DENOMINATOR dy_admin_fee = dy_admin_fee * PRECISION / rates[meta_j] # Change balances exactly in same way as we change actual ERC20 coin amounts self.balances[meta_i] = old_balances[meta_i] + dx_w_fee # When rounding errors happen, we undercharge admin fee in favor of LP self.balances[meta_j] = old_balances[meta_j] - dy - dy_admin_fee # Withdraw from the base pool if needed if j > 0: out_amount: uint256 = ERC20(output_coin).balanceOf(self) Curve(base_pool).remove_liquidity_one_coin(dy, base_j, 0) dy = ERC20(output_coin).balanceOf(self) - out_amount assert dy >= min_dy else: # If both are from the base pool dy = ERC20(output_coin).balanceOf(self) Curve(base_pool).exchange(base_i, base_j, dx_w_fee, min_dy) dy = ERC20(output_coin).balanceOf(self) - dy ERC20(output_coin).transfer(_receiver, dy) log TokenExchangeUnderlying(msg.sender, i, dx, j, dy) return dy @external @nonreentrant('lock') def remove_liquidity( _burn_amount: uint256, _min_amounts: uint256[N_COINS], _receiver: address = msg.sender ) -> uint256[N_COINS]: """ @notice Withdraw coins from the pool @dev Withdrawal amounts are based on current deposit ratios @param _burn_amount Quantity of LP tokens to burn in the withdrawal @param _min_amounts Minimum amounts of underlying coins to receive @param _receiver Address that receives the withdrawn coins @return List of amounts of coins that were withdrawn """ self._update() total_supply: uint256 = self.totalSupply amounts: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): old_balance: uint256 = self.balances[i] value: uint256 = old_balance * _burn_amount / total_supply assert value >= _min_amounts[i] self.balances[i] = old_balance - value amounts[i] = value ERC20(self.coins[i]).transfer(_receiver, value) total_supply -= _burn_amount self.balanceOf[msg.sender] -= _burn_amount self.totalSupply = total_supply log Transfer(msg.sender, ZERO_ADDRESS, _burn_amount) log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply) return amounts @external @nonreentrant('lock') def remove_liquidity_imbalance( _amounts: uint256[N_COINS], _max_burn_amount: uint256, _receiver: address = msg.sender ) -> uint256: """ @notice Withdraw coins from the pool in an imbalanced amount @param _amounts List of amounts of underlying coins to withdraw @param _max_burn_amount Maximum amount of LP token to burn in the withdrawal @param _receiver Address that receives the withdrawn coins @return Actual amount of the LP token burned in the withdrawal """ self._update() amp: uint256 = self._A() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] old_balances: uint256[N_COINS] = self.balances D0: uint256 = self.get_D_mem(rates, old_balances, amp) new_balances: uint256[N_COINS] = old_balances for i in range(N_COINS): new_balances[i] -= _amounts[i] D1: uint256 = self.get_D_mem(rates, new_balances, amp) fees: uint256[N_COINS] = empty(uint256[N_COINS]) base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) for i in range(N_COINS): ideal_balance: uint256 = D1 * old_balances[i] / D0 difference: uint256 = 0 new_balance: uint256 = new_balances[i] if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance fees[i] = base_fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (fees[i] * ADMIN_FEE / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(rates, new_balances, amp) total_supply: uint256 = self.totalSupply burn_amount: uint256 = ((D0 - D2) * total_supply / D0) + 1 assert burn_amount > 1 # dev: zero tokens burned assert burn_amount <= _max_burn_amount total_supply -= burn_amount self.totalSupply = total_supply self.balanceOf[msg.sender] -= burn_amount log Transfer(msg.sender, ZERO_ADDRESS, burn_amount) for i in range(N_COINS): amount: uint256 = _amounts[i] if amount != 0: ERC20(self.coins[i]).transfer(_receiver, amount) log RemoveLiquidityImbalance(msg.sender, _amounts, fees, D1, total_supply) return burn_amount @view @internal def get_y_D(A: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256: """ Calculate x[i] if one reduces D from being calculated for xp to D Done by solving quadratic equation iteratively. x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A) x_1**2 + b*x_1 = c x_1 = (x_1**2 + c) / (2*x_1 + b) """ # x in the input is converted to the same price/precision assert i >= 0 # dev: i below zero assert i < N_COINS # dev: i above N_COINS S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 c: uint256 = D Ann: uint256 = A * N_COINS for _i in range(N_COINS): if _i != i: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @internal def _calc_withdraw_one_coin(_burn_amount: uint256, i: int128, _balances: uint256[N_COINS]) -> (uint256, uint256): # First, need to calculate # * Get current D # * Solve Eqn against y_i for D - _token_amount amp: uint256 = self._A() rates: uint256[N_COINS] = [self.rate_multiplier, Curve(BASE_POOL).get_virtual_price()] xp: uint256[N_COINS] = self._xp_mem(rates, _balances) D0: uint256 = self.get_D(xp, amp) total_supply: uint256 = self.totalSupply D1: uint256 = D0 - _burn_amount * D0 / total_supply new_y: uint256 = self.get_y_D(amp, i, xp, D1) base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) xp_reduced: uint256[N_COINS] = empty(uint256[N_COINS]) for j in range(N_COINS): dx_expected: uint256 = 0 xp_j: uint256 = xp[j] if j == i: dx_expected = xp_j * D1 / D0 - new_y else: dx_expected = xp_j - xp_j * D1 / D0 xp_reduced[j] = xp_j - base_fee * dx_expected / FEE_DENOMINATOR dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1) dy_0: uint256 = (xp[i] - new_y) * PRECISION / rates[i] # w/o fees dy = (dy - 1) * PRECISION / rates[i] # Withdraw less to account for rounding errors return dy, dy_0 - dy @view @external def calc_withdraw_one_coin(_burn_amount: uint256, i: int128, _previous: bool = False) -> uint256: """ @notice Calculate the amount received when withdrawing a single coin @param _burn_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @param _previous indicate to use previous_balances or current balances @return Amount of coin received """ balances: uint256[N_COINS] = self.balances if _previous: balances = self.previous_balances return self._calc_withdraw_one_coin(_burn_amount, i, balances)[0] @external @nonreentrant('lock') def remove_liquidity_one_coin( _burn_amount: uint256, i: int128, _min_received: uint256, _receiver: address = msg.sender, ) -> uint256: """ @notice Withdraw a single coin from the pool @param _burn_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @param _min_received Minimum amount of coin to receive @param _receiver Address that receives the withdrawn coins @return Amount of coin received """ self._update() dy: uint256 = 0 dy_fee: uint256 = 0 dy, dy_fee = self._calc_withdraw_one_coin(_burn_amount, i, self.balances) assert dy >= _min_received self.balances[i] -= (dy + dy_fee * ADMIN_FEE / FEE_DENOMINATOR) total_supply: uint256 = self.totalSupply - _burn_amount self.totalSupply = total_supply self.balanceOf[msg.sender] -= _burn_amount log Transfer(msg.sender, ZERO_ADDRESS, _burn_amount) ERC20(self.coins[i]).transfer(_receiver, dy) log RemoveLiquidityOne(msg.sender, _burn_amount, dy, total_supply) return dy @external def ramp_A(_future_A: uint256, _future_time: uint256): assert msg.sender == self.admin # dev: only owner assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME assert _future_time >= block.timestamp + MIN_RAMP_TIME # dev: insufficient time _initial_A: uint256 = self._A() _future_A_p: uint256 = _future_A * A_PRECISION assert _future_A > 0 and _future_A < MAX_A if _future_A_p < _initial_A: assert _future_A_p * MAX_A_CHANGE >= _initial_A else: assert _future_A_p <= _initial_A * MAX_A_CHANGE self.initial_A = _initial_A self.future_A = _future_A_p self.initial_A_time = block.timestamp self.future_A_time = _future_time log RampA(_initial_A, _future_A_p, block.timestamp, _future_time) @external def stop_ramp_A(): assert msg.sender == self.admin # dev: only owner current_A: uint256 = self._A() self.initial_A = current_A self.future_A = current_A self.initial_A_time = block.timestamp self.future_A_time = block.timestamp # now (block.timestamp < t1) is always False, so we return saved A log StopRampA(current_A, block.timestamp) @view @external def admin_balances(i: uint256) -> uint256: return ERC20(self.coins[i]).balanceOf(self) - self.balances[i] @external def withdraw_admin_fees(): factory: address = self.factory # transfer coin 0 to Factory and call `convert_fees` to swap it for coin 1 coin: address = self.coins[0] amount: uint256 = ERC20(coin).balanceOf(self) - self.balances[0] if amount > 0: ERC20(coin).transfer(factory, amount) Factory(factory).convert_fees() # transfer coin 1 to the receiver coin = self.coins[1] amount = ERC20(coin).balanceOf(self) - self.balances[1] if amount > 0: receiver: address = Factory(factory).fee_receiver(BASE_POOL) ERC20(coin).transfer(receiver, amount)
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"Transfer","inputs":[{"type":"address","name":"sender","indexed":true},{"type":"address","name":"receiver","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false,"type":"event"},{"name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false},{"type":"uint256","name":"future_time","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"name":"initialize","outputs":[],"inputs":[{"type":"string","name":"_name"},{"type":"string","name":"_symbol"},{"type":"address","name":"_coin"},{"type":"uint256","name":"_decimals"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"address","name":"_admin"}],"stateMutability":"nonpayable","type":"function","gas":470049},{"name":"decimals","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":291},{"name":"transfer","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":75402},{"name":"transferFrom","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_from"},{"type":"address","name":"_to"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":112037},{"name":"approve","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_spender"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":37854},{"name":"get_previous_balances","outputs":[{"type":"uint256[2]","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2254},{"name":"get_balances","outputs":[{"type":"uint256[2]","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2284},{"name":"get_twap_balances","outputs":[{"type":"uint256[2]","name":""}],"inputs":[{"type":"uint256[2]","name":"_first_balances"},{"type":"uint256[2]","name":"_last_balances"},{"type":"uint256","name":"_time_elapsed"}],"stateMutability":"view","type":"function","gas":1522},{"name":"get_price_cumulative_last","outputs":[{"type":"uint256[2]","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2344},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":621},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5859},{"name":"A_precise","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5821},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1011891},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"bool","name":"_is_deposit"}],"stateMutability":"view","type":"function"},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"bool","name":"_is_deposit"},{"type":"bool","name":"_previous"}],"stateMutability":"view","type":"function"},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"},{"type":"address","name":"_receiver"}],"stateMutability":"nonpayable","type":"function"},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function"},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256[2]","name":"_balances"}],"stateMutability":"view","type":"function"},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function"},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256[2]","name":"_balances"}],"stateMutability":"view","type":"function"},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function"},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"},{"type":"address","name":"_receiver"}],"stateMutability":"nonpayable","type":"function"},{"name":"exchange_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function"},{"name":"exchange_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"},{"type":"address","name":"_receiver"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity","outputs":[{"type":"uint256[2]","name":""}],"inputs":[{"type":"uint256","name":"_burn_amount"},{"type":"uint256[2]","name":"_min_amounts"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity","outputs":[{"type":"uint256[2]","name":""}],"inputs":[{"type":"uint256","name":"_burn_amount"},{"type":"uint256[2]","name":"_min_amounts"},{"type":"address","name":"_receiver"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"},{"type":"address","name":"_receiver"}],"stateMutability":"nonpayable","type":"function"},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_burn_amount"},{"type":"int128","name":"i"}],"stateMutability":"view","type":"function"},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_burn_amount"},{"type":"int128","name":"i"},{"type":"bool","name":"_previous"}],"stateMutability":"view","type":"function"},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_burn_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_received"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_burn_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_received"},{"type":"address","name":"_receiver"}],"stateMutability":"nonpayable","type":"function"},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","name":"_future_time"}],"stateMutability":"nonpayable","type":"function","gas":152464},{"name":"stop_ramp_A","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":149225},{"name":"admin_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"i"}],"stateMutability":"view","type":"function","gas":3601},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":11347},{"name":"admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2141},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2280},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2310},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2231},{"name":"block_timestamp_last","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2261},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2291},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"initial_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"future_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"name","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":8813},{"name":"symbol","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7866},{"name":"balanceOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":2686},{"name":"allowance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"},{"type":"address","name":"arg1"}],"stateMutability":"view","type":"function","gas":2931},{"name":"totalSupply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2531}]
Contract Creation Code
617a69600455615f6156341561000a57600080fd5b600436101561001857615f51565b600035601c5263d178231c600051141561043c57604060043560040161014037602060043560040135111561004c57600080fd5b602a6024356004016101a037600a60243560040135111561006c57600080fd5b60443560a01c1561007c57600080fd5b60c43560a01c1561008c57600080fd5b60136064351061009b57600080fd5b623d090060a43510156100ad57600080fd5b6305f5e10060a43511156100c057600080fd5b600454156100cd57600080fd5b608435606480820282158284830414176100e657600080fd5b8090509050905061020052600260c052602060c0206044358155736c3f90f043a72fa612cbac8115ee7e52bde6e490600182015550604e60246064358082101561012f57600080fd5b808203905090501061014057600080fd5b60246064358082101561015257600080fd5b80820390509050600a0a600c55610200516008556102005160095560a43560045560c435600055336001556000601f610220527f43757276652e666920466163746f727920555344204d657461706f6f6c3a200061024052610220601f8060208461028001018260208501600060045af150508051820191505061014060208060208461028001018260208501600060045af15050805182019150508061028052610280905080600d60c052602060c020602082510161012060006003818352015b8261012051602002111561022757610249565b61012051602002850151610120518501555b8151600101808352811415610214575b50505050505060006101a0600a8060208461028001018260208501600060045af15050805182019150506006610220527f334352562d6600000000000000000000000000000000000000000000000000006102405261022060068060208461028001018260208501600060045af15050805182019150508061028052610280905080600e60c052602060c020602082510161012060006002818352015b826101205160200211156102f95761031b565b61012051602002850151610120518501555b81516001018083528114156102e6575b505050505050736b175474e89094c44da98b954eedeac495271d0f6102605273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486102805273dac17f958d2ee523a2206206994597c13d831ec76102a05261024060006003818352015b60206102405102610260015161022052610220513b61039657600080fd5b60006000604463095ea7b36102c05273bebc44782c7db0a1a60cb6fe97d0b483032ff1c76102e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610300526102dc6000610220515af16103f757600080fd5b5b8151600101808352811415610378575b50506000610220523060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610220a3005b63313ce567600051141561045757601260005260206000f350005b60001561050a575b6101a052610140526101605261018052600f6101405160e05260c052604060c0208054610180518082101561049357600080fd5b80820390509050815550600f6101605160e05260c052604060c0208054610180518181830110156104c357600080fd5b80820190509050815550610180516101c05261016051610140517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36101a051565b63a9059cbb60005114156105605760043560a01c1561052857600080fd5b336101405260043561016052602435610180526101805161016051610140516006580161045f565b600050600160005260206000f350005b6323b872dd600051141561064d5760043560a01c1561057e57600080fd5b60243560a01c1561058e57600080fd5b6004356101405260243561016052604435610180526101805161016051610140516006580161045f565b600050601060043560e05260c052604060c0203360e05260c052604060c02054610140527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014051181561064057610140516044358082101561061b57600080fd5b80820390509050601060043560e05260c052604060c0203360e05260c052604060c020555b600160005260206000f350005b63095ea7b360005114156106ca5760043560a01c1561066b57600080fd5b60243560103360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b63d96c7fce60005114156107035760058060c052602060c020546101605260018160c052602060c020015461018052506040610160f350005b6314f05979600051141561073c5760038060c052602060c020546101605260018160c052602060c020015461018052506040610160f350005b630f6ba8e360005114156107e9576040366101403761018060006002818352015b6044610180516002811061077057600080fd5b60200201356004610180516002811061078857600080fd5b60200201358082101561079a57600080fd5b8082039050905060843580806107af57600080fd5b82049050905061014061018051600281106107c957600080fd5b60200201525b815160010180835281141561075d575b50506040610140f3005b634469e30e60005114156108225760068060c052602060c020546101605260018160c052602060c020015461018052506040610160f350005b6000156109c5575b61014052600b546101605260095461018052610160514210156109b2576008546101a052600a546101c0526101a05161018051111561090b576101a051610180516101a0518082101561087c57600080fd5b80820390509050426101c0518082101561089557600080fd5b8082039050905080820282158284830414176108b057600080fd5b80905090509050610160516101c051808210156108cc57600080fd5b8082039050905080806108de57600080fd5b8204905090508181830110156108f357600080fd5b808201905090506000526000516101405156506109ad565b6101a0516101a051610180518082101561092457600080fd5b80820390509050426101c0518082101561093d57600080fd5b80820390509050808202821582848304141761095857600080fd5b80905090509050610160516101c0518082101561097457600080fd5b80820390509050808061098657600080fd5b8204905090508082101561099957600080fd5b808203905090506000526000516101405156505b6109c3565b610180516000526000516101405156505b005b600015610abf575b6101405242600754808210156109e257600080fd5b80820390509050610160526000610160511115610ab95761018060006002818352015b6101805160028110610a1657600080fd5b600360c052602060c02001546101a0526101805160028110610a3757600080fd5b600660c052602060c0200180546101a051610160518082028215828483041417610a6057600080fd5b80905090509050818183011015610a7657600080fd5b808201905090508155506101a0516101805160028110610a9557600080fd5b600560c052602060c02001555b8151600101808352811415610a05575b5050426007555b61014051565b63fee3f7f96000511415610ade5764012a05f20060005260206000f350005b63f446c1d06000511415610b11576006580161082a565b610140526101405160648082049050905060005260206000f350005b6376a2f0f06000511415610b3b576006580161082a565b610140526101405160005260206000f350005b600015610c2f575b6101c0526101405261016052610180526101a0526040366101e03761022060006002818352015b6101406102205160028110610b7e57600080fd5b60200201516101806102205160028110610b9757600080fd5b60200201518082028215828483041417610bb057600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06102205160028110610bdb57600080fd5b60200201525b8151600101808352811415610b6a575b50506040610220525b600061022051111515610c0c57610c28565b602061022051036101e001516020610220510361022052610bfa565b6101c05156005b600015610f37575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c0805161020051818183011015610c8257600080fd5b808201905090508152505b8151600101808352811415610c5a575b50506101c0511515610cb85760006000526000516101a05156505b6101c051610200526101805160028082028215828483041417610cda57600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a0510261014001516102805261026051610200518082028215828483041417610d3157600080fd5b809050905090506102805160028082028215828483041417610d5257600080fd5b809050905090508080610d6457600080fd5b820490509050610260525b8151600101808352811415610d05575b5050610200516101e052610220516101c0518082028215828483041417610da557600080fd5b809050905090506064808204905090506102605160028082028215828483041417610dcf57600080fd5b80905090509050818183011015610de557600080fd5b80820190509050610200518082028215828483041417610e0457600080fd5b8090509050905061022051606480821015610e1e57600080fd5b80820390509050610200518082028215828483041417610e3d57600080fd5b809050905090506064808204905090506003610260518082028215828483041417610e6757600080fd5b80905090509050818183011015610e7d57600080fd5b808201905090508080610e8f57600080fd5b820490509050610200526101e051610200511115610ee4576001610200516101e05180821015610ebe57600080fd5b80820390509050111515610edf576102005160005250506000516101a05156505b610f1d565b60016101e0516102005180821015610efb57600080fd5b80820390509050111515610f1c576102005160005250506000516101a05156505b5b5b8151600101808352811415610cf1575b505060006000fd005b60001561106e575b6101e0526101405261016052610180526101a0526101c0526101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801610b43565b610300526103205261022052610200526101e0526101c0526101a052610180526101605261014052610300805161020052806020015161022052506101405161016051610180516101a0516101c0516101e0516102005161022051610200516102405261022051610260526101c0516102805261028051610260516102405160065801610c37565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516000526000516101e0515650005b63bb7b8b80600051141561122957610140516006580161082a565b61016052610140526101605161014052600c54610160526020610200600463bb7b8b806101a0526101bc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6110d357600080fd5b601f3d116110e057600080fd5b60005061020051610180526101405161016051610180516101a0516101c051610160516101e052610180516102005260038060c052602060c020546102205260018160c052602060c020015461024052506102405161022051610200516101e05160065801610b43565b6102a0526102c0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c05161022052610140516102405261024051610220516102005160065801610c37565b6102a0526101e0526101c0526101a0526101805261016052610140526102a0516101e0526101e051670de0b6b3a7640000808202821582848304141761120357600080fd5b80905090509050601154808061121857600080fd5b82049050905060005260206000f350005b63ed8e84f3600051141561124257600061014052611278565b63e47e6b9e60005114156112705760643560011c1561126057600080fd5b6020606461014037600050611278565b6000156115b2575b60443560011c1561128857600080fd5b61014051610160516006580161082a565b6101805261016052610140526101805161016052600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6112e757600080fd5b601f3d116112f457600080fd5b600050610220516101a05260038060c052602060c020546101c05260018160c052602060c02001546101e05250610140511561134d5760058060c052602060c020546101c05260018160c052602060c02001546101e052505b6101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a051610240526101c051610260526101e05161028052610160516102a0526102a0516102805161026051610240516102205160065801610f3f565b61030052610200526101e0526101c0526101a052610180526101605261014052610300516102005261022060006002818352015b600461022051600281106113f557600080fd5b60200201356102405260443515611442576101c0610220516002811061141a57600080fd5b6020020180516102405181818301101561143357600080fd5b80820190509050815250611478565b6101c0610220516002811061145657600080fd5b602002018051610240518082101561146d57600080fd5b808203905090508152505b5b81516001018083528114156113e2575b50506101405161016051610180516101a0516101c0516101e051610200516102205161018051610240526101a051610260526101c051610280526101e0516102a052610160516102c0526102c0516102a05161028051610260516102405160065801610f3f565b6103205261022052610200526101e0526101c0526101a05261018052610160526101405261032051610220526000610240526044351561154f5761022051610200518082101561153f57600080fd5b8082039050905061024052611570565b61020051610220518082101561156457600080fd5b80820390509050610240525b61024051601154808202821582848304141761158b57600080fd5b809050905090506102005180806115a157600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156115ca573361014052611600565b630c3e4b5460005114156115f85760643560a01c156115e857600080fd5b6020606461014037600050611600565b600015611dd3575b62ffffff541561160f57600080fd5b600162ffffff5561014051600658016109cd565b6101405260005061014051610160516006580161082a565b6101805261016052610140526101805161016052600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa61168957600080fd5b601f3d1161169657600080fd5b600050610220516101a05260038060c052602060c020546101c05260018160c052602060c02001546101e052506101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a051610240526101c051610260526101e05161028052610160516102a0526102a0516102805161026051610240516102205160065801610f3f565b61030052610200526101e0526101c0526101a05261018052610160526101405261030051610200526101c051610220526101e051610240526011546102605261028060006002818352015b6004610280516002811061178257600080fd5b60200201356102a0526102605115156117a65760006102a051116117a557600080fd5b5b61022061028051600281106117ba57600080fd5b6020020180516102a0518181830110156117d357600080fd5b808201905090508152505b815160010180835281141561176f575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610180516102a0526101a0516102c052610220516102e0526102405161030052610160516103205261032051610300516102e0516102c0516102a05160065801610f3f565b6103805261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610280526102005161028051116118ab57600080fd5b6060366102a0376000610260511115611be057600454600280820282158284830414176118d757600080fd5b809050905090506004808204905090506103005261032060006002818352015b610280516101c0610320516002811061190f57600080fd5b6020020151808202821582848304141761192857600080fd5b8090509050905061020051808061193e57600080fd5b82049050905061034052600061036052610220610320516002811061196257600080fd5b6020020151610380526103805161034051111561199e5761034051610380518082101561198e57600080fd5b80820390509050610360526119bf565b6103805161034051808210156119b357600080fd5b80820390509050610360525b610300516103605180820282158284830414176119db57600080fd5b809050905090506402540be400808204905090506102a06103205160028110611a0357600080fd5b6020020152610380516102a06103205160028110611a2057600080fd5b602002015164012a05f2008082028215828483041417611a3f57600080fd5b809050905090506402540be4008082049050905080821015611a6057600080fd5b808203905090506103205160028110611a7857600080fd5b600360c052602060c02001556102206103205160028110611a9857600080fd5b6020020180516102a06103205160028110611ab257600080fd5b602002015180821015611ac457600080fd5b808203905090508152505b81516001018083528114156118f7575b5050610140610340525b61034051516020610340510161034052610340610340511015611b0b57611ae9565b61018051610360526101a05161038052610220516103a052610240516103c052610160516103e0526103e0516103c0516103a051610380516103605160065801610f3f565b61044052610320610340525b6103405152602061034051036103405261014061034051101515611b7f57611b5c565b610440516103205261026051610320516102005180821015611ba057600080fd5b808203905090508082028215828483041417611bbb57600080fd5b80905090509050610200518080611bd157600080fd5b8204905090506102e052611c03565b600360c052602060c02061022051815561024051600182015550610280516102e0525b6044356102e0511015611c1557600080fd5b61030060006002818352015b60046103005160028110611c3457600080fd5b6020020135610320526000610320511115611cbf576103005160028110611c5a57600080fd5b600260c052602060c02001543b611c7057600080fd5b6000600060646323b872dd6103405233610360523061038052610320516103a05261035c60006103005160028110611ca757600080fd5b600260c052602060c02001545af1611cbe57600080fd5b5b5b8151600101808352811415611c21575b505061026080516102e051818183011015611cea57600080fd5b80820190509050815250600f6101405160e05260c052604060c02080546102e051818183011015611d1a57600080fd5b80820190509050815550610260516011556102e051610300526101405160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610300a360043561030052602435610320526102a051610340526102c051610360526102805161038052610260516103a052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610300a26102e051600052600062ffffff5560206000f350600062ffffff55005b600015612255575b6101e0526101405261016052610180526101a0526101c052610160516101405118611e0557600080fd5b6000610160511215611e1657600080fd5b60026101605112611e2657600080fd5b6000610140511215611e3757600080fd5b60026101405112611e4757600080fd5b6101405161016051610180516101a0516101c0516101e051610200516006580161082a565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801610c37565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205260603661024037610220516102a0526102005160028082028215828483041417611f3657600080fd5b809050905090506102c0526102e060006002818352015b610140516102e0511415611f68576101805161026052611f9e565b610160516102e0511815611f98576101a06102e05160028110611f8a57600080fd5b602002015161026052611f9d565b61201a565b5b610240805161026051818183011015611fb657600080fd5b808201905090508152506102a051610220518082028215828483041417611fdc57600080fd5b809050905090506102605160028082028215828483041417611ffd57600080fd5b80905090509050808061200f57600080fd5b8204905090506102a0525b8151600101808352811415611f4d575b50506102a05161022051808202821582848304141761204857600080fd5b809050905090506064808202821582848304141761206557600080fd5b809050905090506102c0516002808202821582848304141761208657600080fd5b80905090509050808061209857600080fd5b8204905090506102a0526102405161022051606480820282158284830414176120c057600080fd5b809050905090506102c05180806120d657600080fd5b8204905090508181830110156120eb57600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b61030051610280526103005161030051808202821582848304141761212e57600080fd5b809050905090506102a05181818301101561214857600080fd5b80820190509050600261030051808202821582848304141761216957600080fd5b809050905090506102e05181818301101561218357600080fd5b80820190509050610220518082101561219b57600080fd5b8082039050905080806121ad57600080fd5b82049050905061030052610280516103005111156122025760016103005161028051808210156121dc57600080fd5b808203905090501115156121fd576103005160005250506000516101e05156505b61223b565b600161028051610300518082101561221957600080fd5b8082039050905011151561223a576103005160005250506000516101e05156505b5b5b815160010180835281141561210a575b505060006000fd005b635e0d443f60005114156122745760006101405260006101605261229a565b637e42fc0c600051141561229257604060646101403760005061229a565b6000156125e5575b600435808060008112156122aa57195b607f1c156122b757600080fd5b905050602435808060008112156122ca57195b607f1c156122d757600080fd5b905050600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa61231457600080fd5b601f3d1161232157600080fd5b600050610220516101a052610140516101c052610160516101e0526101405115156123695760038060c052602060c020546101c05260018160c052602060c02001546101e052505b6101405161016051610180516101a0516101c0516101e05161018051610200526101a051610220526101c051610240526101e051610260526102605161024051610220516102005160065801610b43565b6102c0526102e0526101e0526101c0526101a0526101805261016052610140526102c080516101c05280602001516101e052506101c06004356002811061240057600080fd5b60200201516044356101806004356002811061241b57600080fd5b6020020151808202821582848304141761243457600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561245a57600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101c0516102a0526101e0516102c0526102c0516102a05161028051610260516102405160065801611ddb565b6103205261022052610200526101e0526101c0526101a05261018052610160526101405261032051610220526101c06024356002811061250757600080fd5b6020020151610220518082101561251d57600080fd5b8082039050905060018082101561253357600080fd5b808203905090506102405260045461024051808202821582848304141761255957600080fd5b809050905090506402540be400808204905090506102605261024051610260518082101561258657600080fd5b80820390509050670de0b6b3a764000080820282158284830414176125aa57600080fd5b80905090509050610180602435600281106125c457600080fd5b602002015180806125d457600080fd5b82049050905060005260206000f350005b6307211ef760005114156126045760006101405260006101605261262a565b63e36fd501600051141561262257604060646101403760005061262a565b600015612c58575b6004358080600081121561263a57195b607f1c1561264757600080fd5b9050506024358080600081121561265a57195b607f1c1561266757600080fd5b905050600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6126a457600080fd5b601f3d116126b157600080fd5b600050610220516101a052610140516101c052610160516101e0526101405115156126f95760038060c052602060c020546101c05260018160c052602060c02001546101e052505b6101405161016051610180516101a0516101c0516101e05161018051610200526101a051610220526101c051610240526101e051610260526102605161024051610220516102005160065801610b43565b6102c0526102e0526101e0526101c0526101a0526101805261016052610140526102c080516101c05280602001516101e0525073bebc44782c7db0a1a60cb6fe97d0b483032ff1c76102005260a03661022037600060043518156127db576004356001808203808060008112156127bd57195b607f1c156127ca57600080fd5b905090509050610240526001610280525b60006024351815612819576024356001808203808060008112156127fb57195b607f1c1561280857600080fd5b9050905090506102605260016102a0525b600435151561288b576101c06004356002811061283557600080fd5b602002015160443561018051670de0b6b3a764000080820490509050808202821582848304141761286557600080fd5b8090509050905081818301101561287b57600080fd5b8082019050905061022052612a3b565b60243515156129e3576060366102c0376044356102c061024051600381106128b257600080fd5b602002015260206104006084633883e119610320526102c051610340526102e05161036052610300516103805260016103a05261033c610200515afa6128f757600080fd5b601f3d1161290457600080fd5b600050610400516101a051808202821582848304141761292357600080fd5b80905090509050670de0b6b3a764000080820490509050610220526102208051610220516020610380600463ddca3f436103205261033c610200515afa61296957600080fd5b601f3d1161297657600080fd5b60005061038051808202821582848304141761299157600080fd5b809050905090506404a817c80080820490509050808210156129b257600080fd5b8082039050905081525061022080516101e0518181830110156129d457600080fd5b80820190509050815250612a3a565b60206103806064635e0d443f6102c052610240516102e0526102605161030052604435610320526102dc610200515afa612a1c57600080fd5b601f3d11612a2957600080fd5b6000506103805160005260206000f3505b5b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610280516102e0526102a0516103005261022051610320526101c051610340526101e05161036052610360516103405161032051610300516102e05160065801611ddb565b6103c0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c0516102c0526101c06102a05160028110612b0857600080fd5b60200201516102c05180821015612b1e57600080fd5b80820390509050600180821015612b3457600080fd5b808203905090506102e0526102e0516004546102e0518082028215828483041417612b5e57600080fd5b809050905090506402540be4008082049050905080821015612b7f57600080fd5b808203905090506102e0526024351515612bc5576102e0805161018051670de0b6b3a7640000808204905090508080612bb757600080fd5b820490509050815250612c49565b60206103a0604463cc2b27d7610300526102e051670de0b6b3a76400008082028215828483041417612bf657600080fd5b809050905090506101a0518080612c0c57600080fd5b82049050905061032052610260516103405261031c610200515afa612c3057600080fd5b601f3d11612c3d57600080fd5b6000506103a0516102e0525b6102e05160005260206000f350005b633df021246000511415612c70573361014052612ca6565b63ddc1f59d6000511415612c9e5760843560a01c15612c8e57600080fd5b6020608461014037600050612ca6565b60001561329c575b62ffffff5415612cb557600080fd5b600162ffffff5560043580806000811215612ccc57195b607f1c15612cd957600080fd5b90505060243580806000811215612cec57195b607f1c15612cf957600080fd5b90505061014051600658016109cd565b61014052600050600c54610160526020610200600463bb7b8b806101a0526101bc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa612d4a57600080fd5b601f3d11612d5757600080fd5b600050610200516101805260038060c052602060c020546101a05260018160c052602060c02001546101c052506101405161016051610180516101a0516101c0516101e05161020051610160516102205261018051610240526101a051610260526101c051610280526102805161026051610240516102205160065801610b43565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e080516101e052806020015161020052506101e060043560028110612e2357600080fd5b602002015160443561016060043560028110612e3e57600080fd5b60200201518082028215828483041417612e5757600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015612e7d57600080fd5b80820190509050610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516004356102605260243561028052610220516102a0526101e0516102c052610200516102e0526102e0516102c0516102a051610280516102605160065801611ddb565b610340526102405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610240526101e060243560028110612f3257600080fd5b60200201516102405180821015612f4857600080fd5b80820390509050600180821015612f5e57600080fd5b8082039050905061026052610260516004548082028215828483041417612f8457600080fd5b809050905090506402540be4008082049050905061028052610260516102805180821015612fb157600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612fd557600080fd5b8090509050905061016060243560028110612fef57600080fd5b60200201518080612fff57600080fd5b8204905090506102605260643561026051101561301b57600080fd5b6102805164012a05f200808202821582848304141761303957600080fd5b809050905090506402540be400808204905090506102a0526102a051670de0b6b3a7640000808202821582848304141761307257600080fd5b809050905090506101606024356002811061308c57600080fd5b6020020151808061309c57600080fd5b8204905090506102a0526101a0600435600281106130b957600080fd5b60200201516044358181830110156130d057600080fd5b80820190509050600435600281106130e757600080fd5b600360c052602060c02001556101a06024356002811061310657600080fd5b6020020151610260518082101561311c57600080fd5b808203905090506102a0518082101561313457600080fd5b808203905090506024356002811061314b57600080fd5b600360c052602060c02001556004356002811061316757600080fd5b600260c052602060c02001543b61317d57600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc6000600435600281106131b257600080fd5b600260c052602060c02001545af16131c957600080fd5b602435600281106131d957600080fd5b600260c052602060c02001543b6131ef57600080fd5b60006000604463a9059cbb6102c052610140516102e05261026051610300526102dc60006024356002811061322357600080fd5b600260c052602060c02001545af161323a57600080fd5b6004356102c0526044356102e052602435610300526102605161032052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806102c0a261026051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed660005114156132b45733610140526132ea565b6344ee198660005114156132e25760843560a01c156132d257600080fd5b60206084610140376000506132ea565b600015613e06575b62ffffff54156132f957600080fd5b600162ffffff556004358080600081121561331057195b607f1c1561331d57600080fd5b9050506024358080600081121561333057195b607f1c1561333d57600080fd5b90505061014051600658016109cd565b61014052600050600c54610160526020610200600463bb7b8b806101a0526101bc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa61338e57600080fd5b601f3d1161339b57600080fd5b600050610200516101805260038060c052602060c020546101a05260018160c052602060c02001546101c052506101405161016051610180516101a0516101c0516101e05161020051610160516102205261018051610240526101a051610260526101c051610280526102805161026051610240516102205160065801610b43565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e080516101e0528060200151610200525073bebc44782c7db0a1a60cb6fe97d0b483032ff1c761022052736b175474e89094c44da98b954eedeac495271d0f6102405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486102605273dac17f958d2ee523a2206206994597c13d831ec761028052610100366102a03760043515156134dd57600260c052602060c020546103605261352d565b6004356001808203808060008112156134f257195b607f1c156134ff57600080fd5b9050905090506102c0526001610300526102406102c0516003811061352357600080fd5b6020020151610360525b602435151561354a57600260c052602060c020546103805261359a565b60243560018082038080600081121561355f57195b607f1c1561356c57600080fd5b9050905090506102e0526001610320526102406102e0516003811061359057600080fd5b6020020151610380525b6044356103a052600360243514156135ec57602061044060246370a082316103c052306103e0526103dc610360515afa6135d357600080fd5b601f3d116135e057600080fd5b600050610440516103a0525b610360513b6135fa57600080fd5b6000600060646323b872dd6103c052336103e0523061040052604435610420526103dc6000610360515af161362e57600080fd5b6003602435141561369157602061044060246370a082316103c052306103e0526103dc610360515afa61366057600080fd5b601f3d1161366d57600080fd5b600050610440516103a0518082101561368557600080fd5b808203905090506103a0525b60043515156136a15760016136a6565b602435155b5b15613c7c576004351515613733576101e0600435600281106136c857600080fd5b60200201516103a051610160600435600281106136e457600080fd5b602002015180820282158284830414176136fd57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561372357600080fd5b80820190509050610340526138a8565b6060366103c0376103a0516103c06102c0516003811061375257600080fd5b60200201526001600260c052602060c02001546104205260206104c060246370a0823161044052306104605261045c610420515afa61379057600080fd5b601f3d1161379d57600080fd5b6000506104c05161034052610220513b6137b657600080fd5b600060006084634515cef3610440526103c051610460526103e05161048052610400516104a05260006104c05261045c6000610220515af16137f757600080fd5b60206104c060246370a0823161044052306104605261045c610420515afa61381e57600080fd5b601f3d1161382b57600080fd5b6000506104c051610340518082101561384357600080fd5b808203905090506103a0526103a05161018051808202821582848304141761386a57600080fd5b80905090509050670de0b6b3a7640000808204905090506103405261034080516102005181818301101561389d57600080fd5b808201905090508152505b6101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156138d2576138b0565b6103005161040052610320516104205261034051610440526101e051610460526102005161048052610480516104605161044051610420516104005160065801611ddb565b6104e0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561394657613923565b6104e0516103c0526101e0610320516002811061396257600080fd5b60200201516103c0518082101561397857600080fd5b8082039050905060018082101561398e57600080fd5b808203905090506102a0526102a05160045480820282158284830414176139b457600080fd5b809050905090506402540be400808204905090506103e0526102a0516103e051808210156139e157600080fd5b80820390509050670de0b6b3a76400008082028215828483041417613a0557600080fd5b809050905090506101606103205160028110613a2057600080fd5b60200201518080613a3057600080fd5b8204905090506102a0526103e05164012a05f2008082028215828483041417613a5857600080fd5b809050905090506402540be400808204905090506104005261040051670de0b6b3a76400008082028215828483041417613a9157600080fd5b809050905090506101606103205160028110613aac57600080fd5b60200201518080613abc57600080fd5b820490509050610400526101a06103005160028110613ada57600080fd5b60200201516103a051818183011015613af257600080fd5b808201905090506103005160028110613b0a57600080fd5b600360c052602060c02001556101a06103205160028110613b2a57600080fd5b60200201516102a05180821015613b4057600080fd5b808203905090506104005180821015613b5857600080fd5b808203905090506103205160028110613b7057600080fd5b600360c052602060c020015560006024351315613c655760206104c060246370a0823161044052306104605261045c610380515afa613bae57600080fd5b601f3d11613bbb57600080fd5b6000506104c05161042052610220513b613bd457600080fd5b600060006064631a4d01d2610440526102a051610460526102e0516104805260006104a05261045c6000610220515af1613c0d57600080fd5b60206104c060246370a0823161044052306104605261045c610380515afa613c3457600080fd5b601f3d11613c4157600080fd5b6000506104c0516104205180821015613c5957600080fd5b808203905090506102a0525b6064356102a0511015613c7757600080fd5b613d63565b602061044060246370a082316103c052306103e0526103dc610380515afa613ca357600080fd5b601f3d11613cb057600080fd5b600050610440516102a052610220513b613cc957600080fd5b600060006084633df021246103c0526102c0516103e0526102e051610400526103a05161042052606435610440526103dc6000610220515af1613d0b57600080fd5b602061044060246370a082316103c052306103e0526103dc610380515afa613d3257600080fd5b601f3d11613d3f57600080fd5b600050610440516102a05180821015613d5757600080fd5b808203905090506102a0525b610380513b613d7157600080fd5b60006000604463a9059cbb6103c052610140516103e0526102a051610400526103dc6000610380515af1613da457600080fd5b6004356103c0526044356103e052602435610400526102a05161042052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b60806103c0a26102a051600052600062ffffff5560206000f350600062ffffff55005b635b36389c6000511415613e1e573361014052613e54565b633eb1719f6000511415613e4c5760643560a01c15613e3c57600080fd5b6020606461014037600050613e54565b6000156140d5575b62ffffff5415613e6357600080fd5b600162ffffff5561014051600658016109cd565b6101405260005060115461016052604036610180376101c060006002818352015b6101c05160028110613ea957600080fd5b600360c052602060c02001546101e0526101e0516004358082028215828483041417613ed457600080fd5b80905090509050610160518080613eea57600080fd5b8204905090506102005260246101c05160028110613f0757600080fd5b6020020135610200511015613f1b57600080fd5b6101e0516102005180821015613f3057600080fd5b808203905090506101c05160028110613f4857600080fd5b600360c052602060c0200155610200516101806101c05160028110613f6c57600080fd5b60200201526101c05160028110613f8257600080fd5b600260c052602060c02001543b613f9857600080fd5b60006000604463a9059cbb610220526101405161024052610200516102605261023c60006101c05160028110613fcd57600080fd5b600260c052602060c02001545af1613fe457600080fd5b5b8151600101808352811415613e98575b505061016080516004358082101561400c57600080fd5b80820390509050815250600f3360e05260c052604060c02080546004358082101561403657600080fd5b80820390509050815550610160516011556004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a3610180516101c0526101a0516101e052604036610200376101605161024052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101c0a2600062ffffff556040610180f3600062ffffff55005b63e310327360005114156140ed573361014052614123565b6352d2cfdd600051141561411b5760643560a01c1561410b57600080fd5b6020606461014037600050614123565b6000156148ba575b62ffffff541561413257600080fd5b600162ffffff5561014051600658016109cd565b6101405260005061014051610160516006580161082a565b6101805261016052610140526101805161016052600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6141ac57600080fd5b601f3d116141b957600080fd5b600050610220516101a05260038060c052602060c020546101c05260018160c052602060c02001546101e052506101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a051610240526101c051610260526101e05161028052610160516102a0526102a0516102805161026051610240516102205160065801610f3f565b61030052610200526101e0526101c0526101a05261018052610160526101405261030051610200526101c051610220526101e0516102405261026060006002818352015b610220610260516002811061429f57600080fd5b602002018051600461026051600281106142b857600080fd5b6020020135808210156142ca57600080fd5b808203905090508152505b815160010180835281141561428b575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161018051610280526101a0516102a052610220516102c052610240516102e0526101605161030052610300516102e0516102c0516102a0516102805160065801610f3f565b61036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102605260403661028037600454600280820282158284830414176143a857600080fd5b809050905090506004808204905090506102c0526102e060006002818352015b610260516101c06102e051600281106143e057600080fd5b602002015180820282158284830414176143f957600080fd5b8090509050905061020051808061440f57600080fd5b820490509050610300526000610320526102206102e0516002811061443357600080fd5b6020020151610340526103405161030051111561446f5761030051610340518082101561445f57600080fd5b8082039050905061032052614490565b61034051610300518082101561448457600080fd5b80820390509050610320525b6102c0516103205180820282158284830414176144ac57600080fd5b809050905090506402540be400808204905090506102806102e051600281106144d457600080fd5b6020020152610340516102806102e051600281106144f157600080fd5b602002015164012a05f200808202821582848304141761451057600080fd5b809050905090506402540be400808204905090508082101561453157600080fd5b808203905090506102e0516002811061454957600080fd5b600360c052602060c02001556102206102e0516002811061456957600080fd5b6020020180516102806102e0516002811061458357600080fd5b60200201518082101561459557600080fd5b808203905090508152505b81516001018083528114156143c8575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161018051610300526101a05161032052610220516103405261024051610360526101605161038052610380516103605161034051610320516103005160065801610f3f565b6103e0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e0516102e05260115461030052610200516102e0518082101561468f57600080fd5b808203905090506103005180820282158284830414176146ae57600080fd5b809050905090506102005180806146c457600080fd5b82049050905060018181830110156146db57600080fd5b8082019050905061032052600161032051116146f657600080fd5b60443561032051111561470857600080fd5b6103008051610320518082101561471e57600080fd5b8082039050905081525061030051601155600f3360e05260c052604060c0208054610320518082101561475057600080fd5b8082039050905081555061032051610340526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610340a361034060006002818352015b600461034051600281106147ab57600080fd5b60200201356103605260006103605118156148345761034051600281106147d157600080fd5b600260c052602060c02001543b6147e757600080fd5b60006000604463a9059cbb61038052610140516103a052610360516103c05261039c6000610340516002811061481c57600080fd5b600260c052602060c02001545af161483357600080fd5b5b5b8151600101808352811415614798575b5050600435610340526024356103605261028051610380526102a0516103a052610260516103c052610300516103e052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610340a261032051600052600062ffffff5560206000f350600062ffffff55005b600015614c27575b6101e0526101405261016052610180526101a0526101c05260006101605112156148eb57600080fd5b600261016051126148fb57600080fd5b606036610200376101c05161026052610140516002808202821582848304141761492457600080fd5b80905090509050610280526102a060006002818352015b610160516102a051181561496b576101806102a0516002811061495d57600080fd5b602002015161022052614970565b6149ec565b61020080516102205181818301101561498857600080fd5b80820190509050815250610260516101c05180820282158284830414176149ae57600080fd5b8090509050905061022051600280820282158284830414176149cf57600080fd5b8090509050905080806149e157600080fd5b820490509050610260525b815160010180835281141561493b575b5050610260516101c0518082028215828483041417614a1a57600080fd5b8090509050905060648082028215828483041417614a3757600080fd5b809050905090506102805160028082028215828483041417614a5857600080fd5b809050905090508080614a6a57600080fd5b82049050905061026052610200516101c05160648082028215828483041417614a9257600080fd5b80905090509050610280518080614aa857600080fd5b820490509050818183011015614abd57600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610240526102c0516102c0518082028215828483041417614b0057600080fd5b8090509050905061026051818183011015614b1a57600080fd5b8082019050905060026102c0518082028215828483041417614b3b57600080fd5b809050905090506102a051818183011015614b5557600080fd5b808201905090506101c05180821015614b6d57600080fd5b808203905090508080614b7f57600080fd5b8204905090506102c052610240516102c0511115614bd45760016102c0516102405180821015614bae57600080fd5b80820390509050111515614bcf576102c05160005250506000516101e05156505b614c0d565b6001610240516102c05180821015614beb57600080fd5b80820390509050111515614c0c576102c05160005250506000516101e05156505b5b5b8151600101808352811415614adc575b505060006000fd005b6000156152e2575b6101c0526101405261016052610180526101a0526101405161016051610180516101a0516101c0516101e0516006580161082a565b610200526101e0526101c0526101a052610180526101605261014052610200516101e052600c546102005260206102a0600463bb7b8b806102405261025c73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa614cc257600080fd5b601f3d11614ccf57600080fd5b6000506102a051610220526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102005161028052610220516102a052610180516102c0526101a0516102e0526102e0516102c0516102a0516102805160065801610b43565b6103405261036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340805161024052806020015161026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c0526101e0516102e0526102e0516102c0516102a05160065801610c37565b6103405261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610280526011546102a0526102805161014051610280518082028215828483041417614e3657600080fd5b809050905090506102a0518080614e4c57600080fd5b82049050905080821015614e5f57600080fd5b808203905090506102c052610140610300525b61030051516020610300510161030052610300610300511015614e9457614e72565b6101e051610320526101605161034052610240516103605261026051610380526102c0516103a0526103a05161038051610360516103405161032051600658016148c2565b610400526102e0610300525b6103005152602061030051036103005261014061030051101515614f0857614ee5565b610400516102e05260045460028082028215828483041417614f2957600080fd5b80905090509050600480820490509050610300526040366103203761036060006002818352015b6000610380526102406103605160028110614f6a57600080fd5b60200201516103a05261016051610360511415614fda576103a0516102c0518082028215828483041417614f9d57600080fd5b80905090509050610280518080614fb357600080fd5b8204905090506102e05180821015614fca57600080fd5b808203905090506103805261502f565b6103a0516103a0516102c0518082028215828483041417614ffa57600080fd5b8090509050905061028051808061501057600080fd5b8204905090508082101561502357600080fd5b80820390509050610380525b6103a0516103005161038051808202821582848304141761504f57600080fd5b809050905090506402540be400808204905090508082101561507057600080fd5b80820390509050610320610360516002811061508b57600080fd5b60200201525b8151600101808352811415614f50575b505061032061016051600281106150b757600080fd5b6020020151610140610380525b610380515160206103805101610380526103806103805110156150e6576150c4565b6101e0516103a052610160516103c052610320516103e05261034051610400526102c0516104205261042051610400516103e0516103c0516103a051600658016148c2565b61048052610360610380525b610380515260206103805103610380526101406103805110151561515a57615137565b610480518082101561516b57600080fd5b8082039050905061036052610240610160516002811061518a57600080fd5b60200201516102e051808210156151a057600080fd5b80820390509050670de0b6b3a764000080820282158284830414176151c457600080fd5b8090509050905061020061016051600281106151df57600080fd5b602002015180806151ef57600080fd5b820490509050610380526103605160018082101561520c57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761523057600080fd5b80905090509050610200610160516002811061524b57600080fd5b6020020151808061525b57600080fd5b820490509050610360526103a08080806103605181525050602081019050808061038051610360518082101561529057600080fd5b808203905090508152505060409050905060c05260c0516103e0525b60006103e0511115156152be576152da565b60206103e051036103a0015160206103e051036103e0526152ac565b6101c0515650005b63cc2b27d760005114156152fb57600061014052615331565b63c532a77460005114156153295760443560011c1561531957600080fd5b6020604461014037600050615331565b600015615425575b6024358080600081121561534157195b607f1c1561534e57600080fd5b90505060038060c052602060c020546101605260018160c052602060c02001546101805250610140511561539f5760058060c052602060c020546101605260018160c052602060c020015461018052505b6101405161016051610180516004356101a0526024356101c052610160516101e0526101805161020052610200516101e0516101c0516101a05160065801614c2f565b610260526102805261018052610160526101405261026080808080516102a0525050602081019050808080516102c052505050506102a05160005260206000f350005b631a4d01d2600051141561543d573361014052615473565b63081579a5600051141561546b5760643560a01c1561545b57600080fd5b6020606461014037600050615473565b60001561573f575b62ffffff541561548257600080fd5b600162ffffff556024358080600081121561549957195b607f1c156154a657600080fd5b90505061014051600658016109cd565b61014052600050604036610160376101405161016051610180516004356101a0526024356101c05260038060c052602060c020546101e05260018160c052602060c02001546102005250610200516101e0516101c0516101a05160065801614c2f565b610260526102805261018052610160526101405261026080808080516102a0525050602081019050808080516102c052505050506102a08051610160528060200151610180525060443561016051101561557257600080fd5b6024356002811061558257600080fd5b600360c052602060c020018054610160516101805164012a05f20080820282158284830414176155b157600080fd5b809050905090506402540be400808204905090508181830110156155d457600080fd5b80820190509050808210156155e857600080fd5b808203905090508155506011546004358082101561560557600080fd5b808203905090506101a0526101a051601155600f3360e05260c052604060c02080546004358082101561563757600080fd5b808203905090508155506004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36024356002811061568257600080fd5b600260c052602060c02001543b61569857600080fd5b60006000604463a9059cbb6101c052610140516101e05261016051610200526101dc6000602435600281106156cc57600080fd5b600260c052602060c02001545af16156e357600080fd5b6004356101c052610160516101e0526101a05161020052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606101c0a261016051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156158e357600054331461575b57600080fd5b600a546201518081818301101561577157600080fd5b8082019050905042101561578457600080fd5b426201518081818301101561579857600080fd5b8082019050905060243510156157ad57600080fd5b610140516006580161082a565b61016052610140526101605161014052600435606480820282158284830414176157e357600080fd5b80905090509050610160526000600435111561580657620f424060043510615809565b60005b61581257600080fd5b61014051610160511015615855576101405161016051600a808202821582848304141761583e57600080fd5b80905090509050101561585057600080fd5b615886565b61014051600a808202821582848304141761586f57600080fd5b8090509050905061016051111561588557600080fd5b5b610140516008556101605160095542600a55602435600b556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156159685760005433146158ff57600080fd5b610140516006580161082a565b61016052610140526101605161014052610140516008556101405160095542600a5542600b55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b63e2e7d2646000511415615a045760206101c060246370a0823161014052306101605261015c6004356002811061599e57600080fd5b600260c052602060c02001545afa6159b557600080fd5b601f3d116159c257600080fd5b6000506101c051600435600281106159d957600080fd5b600360c052602060c0200154808210156159f257600080fd5b8082039050905060005260206000f350005b6330c540856000511415615c225760015461014052600260c052602060c0205461016052602061022060246370a082316101a052306101c0526101bc610160515afa615a4f57600080fd5b601f3d11615a5c57600080fd5b60005061022051600360c052602060c0205480821015615a7b57600080fd5b80820390509050610180526000610180511115615b0c57610160513b615aa057600080fd5b60006000604463a9059cbb6101a052610140516101c052610180516101e0526101bc6000610160515af1615ad357600080fd5b6020610200600463dc1255776101a0526101bc6000610140515af1615af757600080fd5b601f3d11615b0457600080fd5b600050610200505b6001600260c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa615b4557600080fd5b601f3d11615b5257600080fd5b600050610220516001600360c052602060c020015480821015615b7457600080fd5b80820390509050610180526000610180511115615c2057602061024060246372b38d986101c05273bebc44782c7db0a1a60cb6fe97d0b483032ff1c76101e0526101dc610140515afa615bc657600080fd5b601f3d11615bd357600080fd5b600050610240516101a052610160513b615bec57600080fd5b60006000604463a9059cbb6101c0526101a0516101e05261018051610200526101dc6000610160515af1615c1f57600080fd5b5b005b63f851a4406000511415615c3e5760005460005260206000f350005b63c66106576000511415615c735760043560028110615c5c57600080fd5b600260c052602060c020015460005260206000f350005b634903b0d16000511415615ca85760043560028110615c9157600080fd5b600360c052602060c020015460005260206000f350005b63ddca3f436000511415615cc45760045460005260206000f350005b6363543f066000511415615ce05760075460005260206000f350005b635409491a6000511415615cfc5760085460005260206000f350005b63b4b577ad6000511415615d185760095460005260206000f350005b632081066c6000511415615d3457600a5460005260206000f350005b63140522886000511415615d5057600b5460005260206000f350005b6306fdde036000511415615df957600d8060c052602060c020610180602082540161012060006003818352015b82610120516020021115615d9057615db2565b61012051850154610120516020028501525b8151600101808352811415615d7d575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415615ea257600e8060c052602060c020610180602082540161012060006002818352015b82610120516020021115615e3957615e5b565b61012051850154610120516020028501525b8151600101808352811415615e26575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6370a082316000511415615edc5760043560a01c15615ec057600080fd5b600f60043560e05260c052604060c0205460005260206000f350005b63dd62ed3e6000511415615f345760043560a01c15615efa57600080fd5b60243560a01c15615f0a57600080fd5b601060043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b6318160ddd6000511415615f505760115460005260206000f350005b5b60006000fd5b61000a615f610361000a60003961000a615f61036000f3
Deployed Bytecode
0x341561000a57600080fd5b600436101561001857615f51565b600035601c5263d178231c600051141561043c57604060043560040161014037602060043560040135111561004c57600080fd5b602a6024356004016101a037600a60243560040135111561006c57600080fd5b60443560a01c1561007c57600080fd5b60c43560a01c1561008c57600080fd5b60136064351061009b57600080fd5b623d090060a43510156100ad57600080fd5b6305f5e10060a43511156100c057600080fd5b600454156100cd57600080fd5b608435606480820282158284830414176100e657600080fd5b8090509050905061020052600260c052602060c0206044358155736c3f90f043a72fa612cbac8115ee7e52bde6e490600182015550604e60246064358082101561012f57600080fd5b808203905090501061014057600080fd5b60246064358082101561015257600080fd5b80820390509050600a0a600c55610200516008556102005160095560a43560045560c435600055336001556000601f610220527f43757276652e666920466163746f727920555344204d657461706f6f6c3a200061024052610220601f8060208461028001018260208501600060045af150508051820191505061014060208060208461028001018260208501600060045af15050805182019150508061028052610280905080600d60c052602060c020602082510161012060006003818352015b8261012051602002111561022757610249565b61012051602002850151610120518501555b8151600101808352811415610214575b50505050505060006101a0600a8060208461028001018260208501600060045af15050805182019150506006610220527f334352562d6600000000000000000000000000000000000000000000000000006102405261022060068060208461028001018260208501600060045af15050805182019150508061028052610280905080600e60c052602060c020602082510161012060006002818352015b826101205160200211156102f95761031b565b61012051602002850151610120518501555b81516001018083528114156102e6575b505050505050736b175474e89094c44da98b954eedeac495271d0f6102605273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486102805273dac17f958d2ee523a2206206994597c13d831ec76102a05261024060006003818352015b60206102405102610260015161022052610220513b61039657600080fd5b60006000604463095ea7b36102c05273bebc44782c7db0a1a60cb6fe97d0b483032ff1c76102e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610300526102dc6000610220515af16103f757600080fd5b5b8151600101808352811415610378575b50506000610220523060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610220a3005b63313ce567600051141561045757601260005260206000f350005b60001561050a575b6101a052610140526101605261018052600f6101405160e05260c052604060c0208054610180518082101561049357600080fd5b80820390509050815550600f6101605160e05260c052604060c0208054610180518181830110156104c357600080fd5b80820190509050815550610180516101c05261016051610140517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36101a051565b63a9059cbb60005114156105605760043560a01c1561052857600080fd5b336101405260043561016052602435610180526101805161016051610140516006580161045f565b600050600160005260206000f350005b6323b872dd600051141561064d5760043560a01c1561057e57600080fd5b60243560a01c1561058e57600080fd5b6004356101405260243561016052604435610180526101805161016051610140516006580161045f565b600050601060043560e05260c052604060c0203360e05260c052604060c02054610140527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014051181561064057610140516044358082101561061b57600080fd5b80820390509050601060043560e05260c052604060c0203360e05260c052604060c020555b600160005260206000f350005b63095ea7b360005114156106ca5760043560a01c1561066b57600080fd5b60243560103360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b63d96c7fce60005114156107035760058060c052602060c020546101605260018160c052602060c020015461018052506040610160f350005b6314f05979600051141561073c5760038060c052602060c020546101605260018160c052602060c020015461018052506040610160f350005b630f6ba8e360005114156107e9576040366101403761018060006002818352015b6044610180516002811061077057600080fd5b60200201356004610180516002811061078857600080fd5b60200201358082101561079a57600080fd5b8082039050905060843580806107af57600080fd5b82049050905061014061018051600281106107c957600080fd5b60200201525b815160010180835281141561075d575b50506040610140f3005b634469e30e60005114156108225760068060c052602060c020546101605260018160c052602060c020015461018052506040610160f350005b6000156109c5575b61014052600b546101605260095461018052610160514210156109b2576008546101a052600a546101c0526101a05161018051111561090b576101a051610180516101a0518082101561087c57600080fd5b80820390509050426101c0518082101561089557600080fd5b8082039050905080820282158284830414176108b057600080fd5b80905090509050610160516101c051808210156108cc57600080fd5b8082039050905080806108de57600080fd5b8204905090508181830110156108f357600080fd5b808201905090506000526000516101405156506109ad565b6101a0516101a051610180518082101561092457600080fd5b80820390509050426101c0518082101561093d57600080fd5b80820390509050808202821582848304141761095857600080fd5b80905090509050610160516101c0518082101561097457600080fd5b80820390509050808061098657600080fd5b8204905090508082101561099957600080fd5b808203905090506000526000516101405156505b6109c3565b610180516000526000516101405156505b005b600015610abf575b6101405242600754808210156109e257600080fd5b80820390509050610160526000610160511115610ab95761018060006002818352015b6101805160028110610a1657600080fd5b600360c052602060c02001546101a0526101805160028110610a3757600080fd5b600660c052602060c0200180546101a051610160518082028215828483041417610a6057600080fd5b80905090509050818183011015610a7657600080fd5b808201905090508155506101a0516101805160028110610a9557600080fd5b600560c052602060c02001555b8151600101808352811415610a05575b5050426007555b61014051565b63fee3f7f96000511415610ade5764012a05f20060005260206000f350005b63f446c1d06000511415610b11576006580161082a565b610140526101405160648082049050905060005260206000f350005b6376a2f0f06000511415610b3b576006580161082a565b610140526101405160005260206000f350005b600015610c2f575b6101c0526101405261016052610180526101a0526040366101e03761022060006002818352015b6101406102205160028110610b7e57600080fd5b60200201516101806102205160028110610b9757600080fd5b60200201518082028215828483041417610bb057600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06102205160028110610bdb57600080fd5b60200201525b8151600101808352811415610b6a575b50506040610220525b600061022051111515610c0c57610c28565b602061022051036101e001516020610220510361022052610bfa565b6101c05156005b600015610f37575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c0805161020051818183011015610c8257600080fd5b808201905090508152505b8151600101808352811415610c5a575b50506101c0511515610cb85760006000526000516101a05156505b6101c051610200526101805160028082028215828483041417610cda57600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a0510261014001516102805261026051610200518082028215828483041417610d3157600080fd5b809050905090506102805160028082028215828483041417610d5257600080fd5b809050905090508080610d6457600080fd5b820490509050610260525b8151600101808352811415610d05575b5050610200516101e052610220516101c0518082028215828483041417610da557600080fd5b809050905090506064808204905090506102605160028082028215828483041417610dcf57600080fd5b80905090509050818183011015610de557600080fd5b80820190509050610200518082028215828483041417610e0457600080fd5b8090509050905061022051606480821015610e1e57600080fd5b80820390509050610200518082028215828483041417610e3d57600080fd5b809050905090506064808204905090506003610260518082028215828483041417610e6757600080fd5b80905090509050818183011015610e7d57600080fd5b808201905090508080610e8f57600080fd5b820490509050610200526101e051610200511115610ee4576001610200516101e05180821015610ebe57600080fd5b80820390509050111515610edf576102005160005250506000516101a05156505b610f1d565b60016101e0516102005180821015610efb57600080fd5b80820390509050111515610f1c576102005160005250506000516101a05156505b5b5b8151600101808352811415610cf1575b505060006000fd005b60001561106e575b6101e0526101405261016052610180526101a0526101c0526101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801610b43565b610300526103205261022052610200526101e0526101c0526101a052610180526101605261014052610300805161020052806020015161022052506101405161016051610180516101a0516101c0516101e0516102005161022051610200516102405261022051610260526101c0516102805261028051610260516102405160065801610c37565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516000526000516101e0515650005b63bb7b8b80600051141561122957610140516006580161082a565b61016052610140526101605161014052600c54610160526020610200600463bb7b8b806101a0526101bc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6110d357600080fd5b601f3d116110e057600080fd5b60005061020051610180526101405161016051610180516101a0516101c051610160516101e052610180516102005260038060c052602060c020546102205260018160c052602060c020015461024052506102405161022051610200516101e05160065801610b43565b6102a0526102c0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c05161022052610140516102405261024051610220516102005160065801610c37565b6102a0526101e0526101c0526101a0526101805261016052610140526102a0516101e0526101e051670de0b6b3a7640000808202821582848304141761120357600080fd5b80905090509050601154808061121857600080fd5b82049050905060005260206000f350005b63ed8e84f3600051141561124257600061014052611278565b63e47e6b9e60005114156112705760643560011c1561126057600080fd5b6020606461014037600050611278565b6000156115b2575b60443560011c1561128857600080fd5b61014051610160516006580161082a565b6101805261016052610140526101805161016052600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6112e757600080fd5b601f3d116112f457600080fd5b600050610220516101a05260038060c052602060c020546101c05260018160c052602060c02001546101e05250610140511561134d5760058060c052602060c020546101c05260018160c052602060c02001546101e052505b6101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a051610240526101c051610260526101e05161028052610160516102a0526102a0516102805161026051610240516102205160065801610f3f565b61030052610200526101e0526101c0526101a052610180526101605261014052610300516102005261022060006002818352015b600461022051600281106113f557600080fd5b60200201356102405260443515611442576101c0610220516002811061141a57600080fd5b6020020180516102405181818301101561143357600080fd5b80820190509050815250611478565b6101c0610220516002811061145657600080fd5b602002018051610240518082101561146d57600080fd5b808203905090508152505b5b81516001018083528114156113e2575b50506101405161016051610180516101a0516101c0516101e051610200516102205161018051610240526101a051610260526101c051610280526101e0516102a052610160516102c0526102c0516102a05161028051610260516102405160065801610f3f565b6103205261022052610200526101e0526101c0526101a05261018052610160526101405261032051610220526000610240526044351561154f5761022051610200518082101561153f57600080fd5b8082039050905061024052611570565b61020051610220518082101561156457600080fd5b80820390509050610240525b61024051601154808202821582848304141761158b57600080fd5b809050905090506102005180806115a157600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156115ca573361014052611600565b630c3e4b5460005114156115f85760643560a01c156115e857600080fd5b6020606461014037600050611600565b600015611dd3575b62ffffff541561160f57600080fd5b600162ffffff5561014051600658016109cd565b6101405260005061014051610160516006580161082a565b6101805261016052610140526101805161016052600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa61168957600080fd5b601f3d1161169657600080fd5b600050610220516101a05260038060c052602060c020546101c05260018160c052602060c02001546101e052506101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a051610240526101c051610260526101e05161028052610160516102a0526102a0516102805161026051610240516102205160065801610f3f565b61030052610200526101e0526101c0526101a05261018052610160526101405261030051610200526101c051610220526101e051610240526011546102605261028060006002818352015b6004610280516002811061178257600080fd5b60200201356102a0526102605115156117a65760006102a051116117a557600080fd5b5b61022061028051600281106117ba57600080fd5b6020020180516102a0518181830110156117d357600080fd5b808201905090508152505b815160010180835281141561176f575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610180516102a0526101a0516102c052610220516102e0526102405161030052610160516103205261032051610300516102e0516102c0516102a05160065801610f3f565b6103805261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610280526102005161028051116118ab57600080fd5b6060366102a0376000610260511115611be057600454600280820282158284830414176118d757600080fd5b809050905090506004808204905090506103005261032060006002818352015b610280516101c0610320516002811061190f57600080fd5b6020020151808202821582848304141761192857600080fd5b8090509050905061020051808061193e57600080fd5b82049050905061034052600061036052610220610320516002811061196257600080fd5b6020020151610380526103805161034051111561199e5761034051610380518082101561198e57600080fd5b80820390509050610360526119bf565b6103805161034051808210156119b357600080fd5b80820390509050610360525b610300516103605180820282158284830414176119db57600080fd5b809050905090506402540be400808204905090506102a06103205160028110611a0357600080fd5b6020020152610380516102a06103205160028110611a2057600080fd5b602002015164012a05f2008082028215828483041417611a3f57600080fd5b809050905090506402540be4008082049050905080821015611a6057600080fd5b808203905090506103205160028110611a7857600080fd5b600360c052602060c02001556102206103205160028110611a9857600080fd5b6020020180516102a06103205160028110611ab257600080fd5b602002015180821015611ac457600080fd5b808203905090508152505b81516001018083528114156118f7575b5050610140610340525b61034051516020610340510161034052610340610340511015611b0b57611ae9565b61018051610360526101a05161038052610220516103a052610240516103c052610160516103e0526103e0516103c0516103a051610380516103605160065801610f3f565b61044052610320610340525b6103405152602061034051036103405261014061034051101515611b7f57611b5c565b610440516103205261026051610320516102005180821015611ba057600080fd5b808203905090508082028215828483041417611bbb57600080fd5b80905090509050610200518080611bd157600080fd5b8204905090506102e052611c03565b600360c052602060c02061022051815561024051600182015550610280516102e0525b6044356102e0511015611c1557600080fd5b61030060006002818352015b60046103005160028110611c3457600080fd5b6020020135610320526000610320511115611cbf576103005160028110611c5a57600080fd5b600260c052602060c02001543b611c7057600080fd5b6000600060646323b872dd6103405233610360523061038052610320516103a05261035c60006103005160028110611ca757600080fd5b600260c052602060c02001545af1611cbe57600080fd5b5b5b8151600101808352811415611c21575b505061026080516102e051818183011015611cea57600080fd5b80820190509050815250600f6101405160e05260c052604060c02080546102e051818183011015611d1a57600080fd5b80820190509050815550610260516011556102e051610300526101405160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610300a360043561030052602435610320526102a051610340526102c051610360526102805161038052610260516103a052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610300a26102e051600052600062ffffff5560206000f350600062ffffff55005b600015612255575b6101e0526101405261016052610180526101a0526101c052610160516101405118611e0557600080fd5b6000610160511215611e1657600080fd5b60026101605112611e2657600080fd5b6000610140511215611e3757600080fd5b60026101405112611e4757600080fd5b6101405161016051610180516101a0516101c0516101e051610200516006580161082a565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801610c37565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205260603661024037610220516102a0526102005160028082028215828483041417611f3657600080fd5b809050905090506102c0526102e060006002818352015b610140516102e0511415611f68576101805161026052611f9e565b610160516102e0511815611f98576101a06102e05160028110611f8a57600080fd5b602002015161026052611f9d565b61201a565b5b610240805161026051818183011015611fb657600080fd5b808201905090508152506102a051610220518082028215828483041417611fdc57600080fd5b809050905090506102605160028082028215828483041417611ffd57600080fd5b80905090509050808061200f57600080fd5b8204905090506102a0525b8151600101808352811415611f4d575b50506102a05161022051808202821582848304141761204857600080fd5b809050905090506064808202821582848304141761206557600080fd5b809050905090506102c0516002808202821582848304141761208657600080fd5b80905090509050808061209857600080fd5b8204905090506102a0526102405161022051606480820282158284830414176120c057600080fd5b809050905090506102c05180806120d657600080fd5b8204905090508181830110156120eb57600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b61030051610280526103005161030051808202821582848304141761212e57600080fd5b809050905090506102a05181818301101561214857600080fd5b80820190509050600261030051808202821582848304141761216957600080fd5b809050905090506102e05181818301101561218357600080fd5b80820190509050610220518082101561219b57600080fd5b8082039050905080806121ad57600080fd5b82049050905061030052610280516103005111156122025760016103005161028051808210156121dc57600080fd5b808203905090501115156121fd576103005160005250506000516101e05156505b61223b565b600161028051610300518082101561221957600080fd5b8082039050905011151561223a576103005160005250506000516101e05156505b5b5b815160010180835281141561210a575b505060006000fd005b635e0d443f60005114156122745760006101405260006101605261229a565b637e42fc0c600051141561229257604060646101403760005061229a565b6000156125e5575b600435808060008112156122aa57195b607f1c156122b757600080fd5b905050602435808060008112156122ca57195b607f1c156122d757600080fd5b905050600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa61231457600080fd5b601f3d1161232157600080fd5b600050610220516101a052610140516101c052610160516101e0526101405115156123695760038060c052602060c020546101c05260018160c052602060c02001546101e052505b6101405161016051610180516101a0516101c0516101e05161018051610200526101a051610220526101c051610240526101e051610260526102605161024051610220516102005160065801610b43565b6102c0526102e0526101e0526101c0526101a0526101805261016052610140526102c080516101c05280602001516101e052506101c06004356002811061240057600080fd5b60200201516044356101806004356002811061241b57600080fd5b6020020151808202821582848304141761243457600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561245a57600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101c0516102a0526101e0516102c0526102c0516102a05161028051610260516102405160065801611ddb565b6103205261022052610200526101e0526101c0526101a05261018052610160526101405261032051610220526101c06024356002811061250757600080fd5b6020020151610220518082101561251d57600080fd5b8082039050905060018082101561253357600080fd5b808203905090506102405260045461024051808202821582848304141761255957600080fd5b809050905090506402540be400808204905090506102605261024051610260518082101561258657600080fd5b80820390509050670de0b6b3a764000080820282158284830414176125aa57600080fd5b80905090509050610180602435600281106125c457600080fd5b602002015180806125d457600080fd5b82049050905060005260206000f350005b6307211ef760005114156126045760006101405260006101605261262a565b63e36fd501600051141561262257604060646101403760005061262a565b600015612c58575b6004358080600081121561263a57195b607f1c1561264757600080fd5b9050506024358080600081121561265a57195b607f1c1561266757600080fd5b905050600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6126a457600080fd5b601f3d116126b157600080fd5b600050610220516101a052610140516101c052610160516101e0526101405115156126f95760038060c052602060c020546101c05260018160c052602060c02001546101e052505b6101405161016051610180516101a0516101c0516101e05161018051610200526101a051610220526101c051610240526101e051610260526102605161024051610220516102005160065801610b43565b6102c0526102e0526101e0526101c0526101a0526101805261016052610140526102c080516101c05280602001516101e0525073bebc44782c7db0a1a60cb6fe97d0b483032ff1c76102005260a03661022037600060043518156127db576004356001808203808060008112156127bd57195b607f1c156127ca57600080fd5b905090509050610240526001610280525b60006024351815612819576024356001808203808060008112156127fb57195b607f1c1561280857600080fd5b9050905090506102605260016102a0525b600435151561288b576101c06004356002811061283557600080fd5b602002015160443561018051670de0b6b3a764000080820490509050808202821582848304141761286557600080fd5b8090509050905081818301101561287b57600080fd5b8082019050905061022052612a3b565b60243515156129e3576060366102c0376044356102c061024051600381106128b257600080fd5b602002015260206104006084633883e119610320526102c051610340526102e05161036052610300516103805260016103a05261033c610200515afa6128f757600080fd5b601f3d1161290457600080fd5b600050610400516101a051808202821582848304141761292357600080fd5b80905090509050670de0b6b3a764000080820490509050610220526102208051610220516020610380600463ddca3f436103205261033c610200515afa61296957600080fd5b601f3d1161297657600080fd5b60005061038051808202821582848304141761299157600080fd5b809050905090506404a817c80080820490509050808210156129b257600080fd5b8082039050905081525061022080516101e0518181830110156129d457600080fd5b80820190509050815250612a3a565b60206103806064635e0d443f6102c052610240516102e0526102605161030052604435610320526102dc610200515afa612a1c57600080fd5b601f3d11612a2957600080fd5b6000506103805160005260206000f3505b5b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610280516102e0526102a0516103005261022051610320526101c051610340526101e05161036052610360516103405161032051610300516102e05160065801611ddb565b6103c0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c0516102c0526101c06102a05160028110612b0857600080fd5b60200201516102c05180821015612b1e57600080fd5b80820390509050600180821015612b3457600080fd5b808203905090506102e0526102e0516004546102e0518082028215828483041417612b5e57600080fd5b809050905090506402540be4008082049050905080821015612b7f57600080fd5b808203905090506102e0526024351515612bc5576102e0805161018051670de0b6b3a7640000808204905090508080612bb757600080fd5b820490509050815250612c49565b60206103a0604463cc2b27d7610300526102e051670de0b6b3a76400008082028215828483041417612bf657600080fd5b809050905090506101a0518080612c0c57600080fd5b82049050905061032052610260516103405261031c610200515afa612c3057600080fd5b601f3d11612c3d57600080fd5b6000506103a0516102e0525b6102e05160005260206000f350005b633df021246000511415612c70573361014052612ca6565b63ddc1f59d6000511415612c9e5760843560a01c15612c8e57600080fd5b6020608461014037600050612ca6565b60001561329c575b62ffffff5415612cb557600080fd5b600162ffffff5560043580806000811215612ccc57195b607f1c15612cd957600080fd5b90505060243580806000811215612cec57195b607f1c15612cf957600080fd5b90505061014051600658016109cd565b61014052600050600c54610160526020610200600463bb7b8b806101a0526101bc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa612d4a57600080fd5b601f3d11612d5757600080fd5b600050610200516101805260038060c052602060c020546101a05260018160c052602060c02001546101c052506101405161016051610180516101a0516101c0516101e05161020051610160516102205261018051610240526101a051610260526101c051610280526102805161026051610240516102205160065801610b43565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e080516101e052806020015161020052506101e060043560028110612e2357600080fd5b602002015160443561016060043560028110612e3e57600080fd5b60200201518082028215828483041417612e5757600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015612e7d57600080fd5b80820190509050610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516004356102605260243561028052610220516102a0526101e0516102c052610200516102e0526102e0516102c0516102a051610280516102605160065801611ddb565b610340526102405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610240526101e060243560028110612f3257600080fd5b60200201516102405180821015612f4857600080fd5b80820390509050600180821015612f5e57600080fd5b8082039050905061026052610260516004548082028215828483041417612f8457600080fd5b809050905090506402540be4008082049050905061028052610260516102805180821015612fb157600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612fd557600080fd5b8090509050905061016060243560028110612fef57600080fd5b60200201518080612fff57600080fd5b8204905090506102605260643561026051101561301b57600080fd5b6102805164012a05f200808202821582848304141761303957600080fd5b809050905090506402540be400808204905090506102a0526102a051670de0b6b3a7640000808202821582848304141761307257600080fd5b809050905090506101606024356002811061308c57600080fd5b6020020151808061309c57600080fd5b8204905090506102a0526101a0600435600281106130b957600080fd5b60200201516044358181830110156130d057600080fd5b80820190509050600435600281106130e757600080fd5b600360c052602060c02001556101a06024356002811061310657600080fd5b6020020151610260518082101561311c57600080fd5b808203905090506102a0518082101561313457600080fd5b808203905090506024356002811061314b57600080fd5b600360c052602060c02001556004356002811061316757600080fd5b600260c052602060c02001543b61317d57600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc6000600435600281106131b257600080fd5b600260c052602060c02001545af16131c957600080fd5b602435600281106131d957600080fd5b600260c052602060c02001543b6131ef57600080fd5b60006000604463a9059cbb6102c052610140516102e05261026051610300526102dc60006024356002811061322357600080fd5b600260c052602060c02001545af161323a57600080fd5b6004356102c0526044356102e052602435610300526102605161032052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806102c0a261026051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed660005114156132b45733610140526132ea565b6344ee198660005114156132e25760843560a01c156132d257600080fd5b60206084610140376000506132ea565b600015613e06575b62ffffff54156132f957600080fd5b600162ffffff556004358080600081121561331057195b607f1c1561331d57600080fd5b9050506024358080600081121561333057195b607f1c1561333d57600080fd5b90505061014051600658016109cd565b61014052600050600c54610160526020610200600463bb7b8b806101a0526101bc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa61338e57600080fd5b601f3d1161339b57600080fd5b600050610200516101805260038060c052602060c020546101a05260018160c052602060c02001546101c052506101405161016051610180516101a0516101c0516101e05161020051610160516102205261018051610240526101a051610260526101c051610280526102805161026051610240516102205160065801610b43565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e080516101e0528060200151610200525073bebc44782c7db0a1a60cb6fe97d0b483032ff1c761022052736b175474e89094c44da98b954eedeac495271d0f6102405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486102605273dac17f958d2ee523a2206206994597c13d831ec761028052610100366102a03760043515156134dd57600260c052602060c020546103605261352d565b6004356001808203808060008112156134f257195b607f1c156134ff57600080fd5b9050905090506102c0526001610300526102406102c0516003811061352357600080fd5b6020020151610360525b602435151561354a57600260c052602060c020546103805261359a565b60243560018082038080600081121561355f57195b607f1c1561356c57600080fd5b9050905090506102e0526001610320526102406102e0516003811061359057600080fd5b6020020151610380525b6044356103a052600360243514156135ec57602061044060246370a082316103c052306103e0526103dc610360515afa6135d357600080fd5b601f3d116135e057600080fd5b600050610440516103a0525b610360513b6135fa57600080fd5b6000600060646323b872dd6103c052336103e0523061040052604435610420526103dc6000610360515af161362e57600080fd5b6003602435141561369157602061044060246370a082316103c052306103e0526103dc610360515afa61366057600080fd5b601f3d1161366d57600080fd5b600050610440516103a0518082101561368557600080fd5b808203905090506103a0525b60043515156136a15760016136a6565b602435155b5b15613c7c576004351515613733576101e0600435600281106136c857600080fd5b60200201516103a051610160600435600281106136e457600080fd5b602002015180820282158284830414176136fd57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561372357600080fd5b80820190509050610340526138a8565b6060366103c0376103a0516103c06102c0516003811061375257600080fd5b60200201526001600260c052602060c02001546104205260206104c060246370a0823161044052306104605261045c610420515afa61379057600080fd5b601f3d1161379d57600080fd5b6000506104c05161034052610220513b6137b657600080fd5b600060006084634515cef3610440526103c051610460526103e05161048052610400516104a05260006104c05261045c6000610220515af16137f757600080fd5b60206104c060246370a0823161044052306104605261045c610420515afa61381e57600080fd5b601f3d1161382b57600080fd5b6000506104c051610340518082101561384357600080fd5b808203905090506103a0526103a05161018051808202821582848304141761386a57600080fd5b80905090509050670de0b6b3a7640000808204905090506103405261034080516102005181818301101561389d57600080fd5b808201905090508152505b6101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156138d2576138b0565b6103005161040052610320516104205261034051610440526101e051610460526102005161048052610480516104605161044051610420516104005160065801611ddb565b6104e0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561394657613923565b6104e0516103c0526101e0610320516002811061396257600080fd5b60200201516103c0518082101561397857600080fd5b8082039050905060018082101561398e57600080fd5b808203905090506102a0526102a05160045480820282158284830414176139b457600080fd5b809050905090506402540be400808204905090506103e0526102a0516103e051808210156139e157600080fd5b80820390509050670de0b6b3a76400008082028215828483041417613a0557600080fd5b809050905090506101606103205160028110613a2057600080fd5b60200201518080613a3057600080fd5b8204905090506102a0526103e05164012a05f2008082028215828483041417613a5857600080fd5b809050905090506402540be400808204905090506104005261040051670de0b6b3a76400008082028215828483041417613a9157600080fd5b809050905090506101606103205160028110613aac57600080fd5b60200201518080613abc57600080fd5b820490509050610400526101a06103005160028110613ada57600080fd5b60200201516103a051818183011015613af257600080fd5b808201905090506103005160028110613b0a57600080fd5b600360c052602060c02001556101a06103205160028110613b2a57600080fd5b60200201516102a05180821015613b4057600080fd5b808203905090506104005180821015613b5857600080fd5b808203905090506103205160028110613b7057600080fd5b600360c052602060c020015560006024351315613c655760206104c060246370a0823161044052306104605261045c610380515afa613bae57600080fd5b601f3d11613bbb57600080fd5b6000506104c05161042052610220513b613bd457600080fd5b600060006064631a4d01d2610440526102a051610460526102e0516104805260006104a05261045c6000610220515af1613c0d57600080fd5b60206104c060246370a0823161044052306104605261045c610380515afa613c3457600080fd5b601f3d11613c4157600080fd5b6000506104c0516104205180821015613c5957600080fd5b808203905090506102a0525b6064356102a0511015613c7757600080fd5b613d63565b602061044060246370a082316103c052306103e0526103dc610380515afa613ca357600080fd5b601f3d11613cb057600080fd5b600050610440516102a052610220513b613cc957600080fd5b600060006084633df021246103c0526102c0516103e0526102e051610400526103a05161042052606435610440526103dc6000610220515af1613d0b57600080fd5b602061044060246370a082316103c052306103e0526103dc610380515afa613d3257600080fd5b601f3d11613d3f57600080fd5b600050610440516102a05180821015613d5757600080fd5b808203905090506102a0525b610380513b613d7157600080fd5b60006000604463a9059cbb6103c052610140516103e0526102a051610400526103dc6000610380515af1613da457600080fd5b6004356103c0526044356103e052602435610400526102a05161042052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b60806103c0a26102a051600052600062ffffff5560206000f350600062ffffff55005b635b36389c6000511415613e1e573361014052613e54565b633eb1719f6000511415613e4c5760643560a01c15613e3c57600080fd5b6020606461014037600050613e54565b6000156140d5575b62ffffff5415613e6357600080fd5b600162ffffff5561014051600658016109cd565b6101405260005060115461016052604036610180376101c060006002818352015b6101c05160028110613ea957600080fd5b600360c052602060c02001546101e0526101e0516004358082028215828483041417613ed457600080fd5b80905090509050610160518080613eea57600080fd5b8204905090506102005260246101c05160028110613f0757600080fd5b6020020135610200511015613f1b57600080fd5b6101e0516102005180821015613f3057600080fd5b808203905090506101c05160028110613f4857600080fd5b600360c052602060c0200155610200516101806101c05160028110613f6c57600080fd5b60200201526101c05160028110613f8257600080fd5b600260c052602060c02001543b613f9857600080fd5b60006000604463a9059cbb610220526101405161024052610200516102605261023c60006101c05160028110613fcd57600080fd5b600260c052602060c02001545af1613fe457600080fd5b5b8151600101808352811415613e98575b505061016080516004358082101561400c57600080fd5b80820390509050815250600f3360e05260c052604060c02080546004358082101561403657600080fd5b80820390509050815550610160516011556004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a3610180516101c0526101a0516101e052604036610200376101605161024052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101c0a2600062ffffff556040610180f3600062ffffff55005b63e310327360005114156140ed573361014052614123565b6352d2cfdd600051141561411b5760643560a01c1561410b57600080fd5b6020606461014037600050614123565b6000156148ba575b62ffffff541561413257600080fd5b600162ffffff5561014051600658016109cd565b6101405260005061014051610160516006580161082a565b6101805261016052610140526101805161016052600c54610180526020610220600463bb7b8b806101c0526101dc73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa6141ac57600080fd5b601f3d116141b957600080fd5b600050610220516101a05260038060c052602060c020546101c05260018160c052602060c02001546101e052506101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a051610240526101c051610260526101e05161028052610160516102a0526102a0516102805161026051610240516102205160065801610f3f565b61030052610200526101e0526101c0526101a05261018052610160526101405261030051610200526101c051610220526101e0516102405261026060006002818352015b610220610260516002811061429f57600080fd5b602002018051600461026051600281106142b857600080fd5b6020020135808210156142ca57600080fd5b808203905090508152505b815160010180835281141561428b575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161018051610280526101a0516102a052610220516102c052610240516102e0526101605161030052610300516102e0516102c0516102a0516102805160065801610f3f565b61036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102605260403661028037600454600280820282158284830414176143a857600080fd5b809050905090506004808204905090506102c0526102e060006002818352015b610260516101c06102e051600281106143e057600080fd5b602002015180820282158284830414176143f957600080fd5b8090509050905061020051808061440f57600080fd5b820490509050610300526000610320526102206102e0516002811061443357600080fd5b6020020151610340526103405161030051111561446f5761030051610340518082101561445f57600080fd5b8082039050905061032052614490565b61034051610300518082101561448457600080fd5b80820390509050610320525b6102c0516103205180820282158284830414176144ac57600080fd5b809050905090506402540be400808204905090506102806102e051600281106144d457600080fd5b6020020152610340516102806102e051600281106144f157600080fd5b602002015164012a05f200808202821582848304141761451057600080fd5b809050905090506402540be400808204905090508082101561453157600080fd5b808203905090506102e0516002811061454957600080fd5b600360c052602060c02001556102206102e0516002811061456957600080fd5b6020020180516102806102e0516002811061458357600080fd5b60200201518082101561459557600080fd5b808203905090508152505b81516001018083528114156143c8575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161018051610300526101a05161032052610220516103405261024051610360526101605161038052610380516103605161034051610320516103005160065801610f3f565b6103e0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e0516102e05260115461030052610200516102e0518082101561468f57600080fd5b808203905090506103005180820282158284830414176146ae57600080fd5b809050905090506102005180806146c457600080fd5b82049050905060018181830110156146db57600080fd5b8082019050905061032052600161032051116146f657600080fd5b60443561032051111561470857600080fd5b6103008051610320518082101561471e57600080fd5b8082039050905081525061030051601155600f3360e05260c052604060c0208054610320518082101561475057600080fd5b8082039050905081555061032051610340526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610340a361034060006002818352015b600461034051600281106147ab57600080fd5b60200201356103605260006103605118156148345761034051600281106147d157600080fd5b600260c052602060c02001543b6147e757600080fd5b60006000604463a9059cbb61038052610140516103a052610360516103c05261039c6000610340516002811061481c57600080fd5b600260c052602060c02001545af161483357600080fd5b5b5b8151600101808352811415614798575b5050600435610340526024356103605261028051610380526102a0516103a052610260516103c052610300516103e052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610340a261032051600052600062ffffff5560206000f350600062ffffff55005b600015614c27575b6101e0526101405261016052610180526101a0526101c05260006101605112156148eb57600080fd5b600261016051126148fb57600080fd5b606036610200376101c05161026052610140516002808202821582848304141761492457600080fd5b80905090509050610280526102a060006002818352015b610160516102a051181561496b576101806102a0516002811061495d57600080fd5b602002015161022052614970565b6149ec565b61020080516102205181818301101561498857600080fd5b80820190509050815250610260516101c05180820282158284830414176149ae57600080fd5b8090509050905061022051600280820282158284830414176149cf57600080fd5b8090509050905080806149e157600080fd5b820490509050610260525b815160010180835281141561493b575b5050610260516101c0518082028215828483041417614a1a57600080fd5b8090509050905060648082028215828483041417614a3757600080fd5b809050905090506102805160028082028215828483041417614a5857600080fd5b809050905090508080614a6a57600080fd5b82049050905061026052610200516101c05160648082028215828483041417614a9257600080fd5b80905090509050610280518080614aa857600080fd5b820490509050818183011015614abd57600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610240526102c0516102c0518082028215828483041417614b0057600080fd5b8090509050905061026051818183011015614b1a57600080fd5b8082019050905060026102c0518082028215828483041417614b3b57600080fd5b809050905090506102a051818183011015614b5557600080fd5b808201905090506101c05180821015614b6d57600080fd5b808203905090508080614b7f57600080fd5b8204905090506102c052610240516102c0511115614bd45760016102c0516102405180821015614bae57600080fd5b80820390509050111515614bcf576102c05160005250506000516101e05156505b614c0d565b6001610240516102c05180821015614beb57600080fd5b80820390509050111515614c0c576102c05160005250506000516101e05156505b5b5b8151600101808352811415614adc575b505060006000fd005b6000156152e2575b6101c0526101405261016052610180526101a0526101405161016051610180516101a0516101c0516101e0516006580161082a565b610200526101e0526101c0526101a052610180526101605261014052610200516101e052600c546102005260206102a0600463bb7b8b806102405261025c73bebc44782c7db0a1a60cb6fe97d0b483032ff1c75afa614cc257600080fd5b601f3d11614ccf57600080fd5b6000506102a051610220526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102005161028052610220516102a052610180516102c0526101a0516102e0526102e0516102c0516102a0516102805160065801610b43565b6103405261036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340805161024052806020015161026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c0526101e0516102e0526102e0516102c0516102a05160065801610c37565b6103405261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610280526011546102a0526102805161014051610280518082028215828483041417614e3657600080fd5b809050905090506102a0518080614e4c57600080fd5b82049050905080821015614e5f57600080fd5b808203905090506102c052610140610300525b61030051516020610300510161030052610300610300511015614e9457614e72565b6101e051610320526101605161034052610240516103605261026051610380526102c0516103a0526103a05161038051610360516103405161032051600658016148c2565b610400526102e0610300525b6103005152602061030051036103005261014061030051101515614f0857614ee5565b610400516102e05260045460028082028215828483041417614f2957600080fd5b80905090509050600480820490509050610300526040366103203761036060006002818352015b6000610380526102406103605160028110614f6a57600080fd5b60200201516103a05261016051610360511415614fda576103a0516102c0518082028215828483041417614f9d57600080fd5b80905090509050610280518080614fb357600080fd5b8204905090506102e05180821015614fca57600080fd5b808203905090506103805261502f565b6103a0516103a0516102c0518082028215828483041417614ffa57600080fd5b8090509050905061028051808061501057600080fd5b8204905090508082101561502357600080fd5b80820390509050610380525b6103a0516103005161038051808202821582848304141761504f57600080fd5b809050905090506402540be400808204905090508082101561507057600080fd5b80820390509050610320610360516002811061508b57600080fd5b60200201525b8151600101808352811415614f50575b505061032061016051600281106150b757600080fd5b6020020151610140610380525b610380515160206103805101610380526103806103805110156150e6576150c4565b6101e0516103a052610160516103c052610320516103e05261034051610400526102c0516104205261042051610400516103e0516103c0516103a051600658016148c2565b61048052610360610380525b610380515260206103805103610380526101406103805110151561515a57615137565b610480518082101561516b57600080fd5b8082039050905061036052610240610160516002811061518a57600080fd5b60200201516102e051808210156151a057600080fd5b80820390509050670de0b6b3a764000080820282158284830414176151c457600080fd5b8090509050905061020061016051600281106151df57600080fd5b602002015180806151ef57600080fd5b820490509050610380526103605160018082101561520c57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761523057600080fd5b80905090509050610200610160516002811061524b57600080fd5b6020020151808061525b57600080fd5b820490509050610360526103a08080806103605181525050602081019050808061038051610360518082101561529057600080fd5b808203905090508152505060409050905060c05260c0516103e0525b60006103e0511115156152be576152da565b60206103e051036103a0015160206103e051036103e0526152ac565b6101c0515650005b63cc2b27d760005114156152fb57600061014052615331565b63c532a77460005114156153295760443560011c1561531957600080fd5b6020604461014037600050615331565b600015615425575b6024358080600081121561534157195b607f1c1561534e57600080fd5b90505060038060c052602060c020546101605260018160c052602060c02001546101805250610140511561539f5760058060c052602060c020546101605260018160c052602060c020015461018052505b6101405161016051610180516004356101a0526024356101c052610160516101e0526101805161020052610200516101e0516101c0516101a05160065801614c2f565b610260526102805261018052610160526101405261026080808080516102a0525050602081019050808080516102c052505050506102a05160005260206000f350005b631a4d01d2600051141561543d573361014052615473565b63081579a5600051141561546b5760643560a01c1561545b57600080fd5b6020606461014037600050615473565b60001561573f575b62ffffff541561548257600080fd5b600162ffffff556024358080600081121561549957195b607f1c156154a657600080fd5b90505061014051600658016109cd565b61014052600050604036610160376101405161016051610180516004356101a0526024356101c05260038060c052602060c020546101e05260018160c052602060c02001546102005250610200516101e0516101c0516101a05160065801614c2f565b610260526102805261018052610160526101405261026080808080516102a0525050602081019050808080516102c052505050506102a08051610160528060200151610180525060443561016051101561557257600080fd5b6024356002811061558257600080fd5b600360c052602060c020018054610160516101805164012a05f20080820282158284830414176155b157600080fd5b809050905090506402540be400808204905090508181830110156155d457600080fd5b80820190509050808210156155e857600080fd5b808203905090508155506011546004358082101561560557600080fd5b808203905090506101a0526101a051601155600f3360e05260c052604060c02080546004358082101561563757600080fd5b808203905090508155506004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36024356002811061568257600080fd5b600260c052602060c02001543b61569857600080fd5b60006000604463a9059cbb6101c052610140516101e05261016051610200526101dc6000602435600281106156cc57600080fd5b600260c052602060c02001545af16156e357600080fd5b6004356101c052610160516101e0526101a05161020052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606101c0a261016051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156158e357600054331461575b57600080fd5b600a546201518081818301101561577157600080fd5b8082019050905042101561578457600080fd5b426201518081818301101561579857600080fd5b8082019050905060243510156157ad57600080fd5b610140516006580161082a565b61016052610140526101605161014052600435606480820282158284830414176157e357600080fd5b80905090509050610160526000600435111561580657620f424060043510615809565b60005b61581257600080fd5b61014051610160511015615855576101405161016051600a808202821582848304141761583e57600080fd5b80905090509050101561585057600080fd5b615886565b61014051600a808202821582848304141761586f57600080fd5b8090509050905061016051111561588557600080fd5b5b610140516008556101605160095542600a55602435600b556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156159685760005433146158ff57600080fd5b610140516006580161082a565b61016052610140526101605161014052610140516008556101405160095542600a5542600b55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b63e2e7d2646000511415615a045760206101c060246370a0823161014052306101605261015c6004356002811061599e57600080fd5b600260c052602060c02001545afa6159b557600080fd5b601f3d116159c257600080fd5b6000506101c051600435600281106159d957600080fd5b600360c052602060c0200154808210156159f257600080fd5b8082039050905060005260206000f350005b6330c540856000511415615c225760015461014052600260c052602060c0205461016052602061022060246370a082316101a052306101c0526101bc610160515afa615a4f57600080fd5b601f3d11615a5c57600080fd5b60005061022051600360c052602060c0205480821015615a7b57600080fd5b80820390509050610180526000610180511115615b0c57610160513b615aa057600080fd5b60006000604463a9059cbb6101a052610140516101c052610180516101e0526101bc6000610160515af1615ad357600080fd5b6020610200600463dc1255776101a0526101bc6000610140515af1615af757600080fd5b601f3d11615b0457600080fd5b600050610200505b6001600260c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa615b4557600080fd5b601f3d11615b5257600080fd5b600050610220516001600360c052602060c020015480821015615b7457600080fd5b80820390509050610180526000610180511115615c2057602061024060246372b38d986101c05273bebc44782c7db0a1a60cb6fe97d0b483032ff1c76101e0526101dc610140515afa615bc657600080fd5b601f3d11615bd357600080fd5b600050610240516101a052610160513b615bec57600080fd5b60006000604463a9059cbb6101c0526101a0516101e05261018051610200526101dc6000610160515af1615c1f57600080fd5b5b005b63f851a4406000511415615c3e5760005460005260206000f350005b63c66106576000511415615c735760043560028110615c5c57600080fd5b600260c052602060c020015460005260206000f350005b634903b0d16000511415615ca85760043560028110615c9157600080fd5b600360c052602060c020015460005260206000f350005b63ddca3f436000511415615cc45760045460005260206000f350005b6363543f066000511415615ce05760075460005260206000f350005b635409491a6000511415615cfc5760085460005260206000f350005b63b4b577ad6000511415615d185760095460005260206000f350005b632081066c6000511415615d3457600a5460005260206000f350005b63140522886000511415615d5057600b5460005260206000f350005b6306fdde036000511415615df957600d8060c052602060c020610180602082540161012060006003818352015b82610120516020021115615d9057615db2565b61012051850154610120516020028501525b8151600101808352811415615d7d575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415615ea257600e8060c052602060c020610180602082540161012060006002818352015b82610120516020021115615e3957615e5b565b61012051850154610120516020028501525b8151600101808352811415615e26575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6370a082316000511415615edc5760043560a01c15615ec057600080fd5b600f60043560e05260c052604060c0205460005260206000f350005b63dd62ed3e6000511415615f345760043560a01c15615efa57600080fd5b60243560a01c15615f0a57600080fd5b601060043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b6318160ddd6000511415615f505760115460005260206000f350005b5b60006000fd
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.