Source Code
Latest 25 from a total of 494 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Remove_liquidity | 24325390 | 33 days ago | IN | 0 ETH | 0.00001529 | ||||
| Remove_liquidity | 23900328 | 93 days ago | IN | 0 ETH | 0.00003055 | ||||
| Remove_liquidity... | 20239994 | 604 days ago | IN | 0 ETH | 0.00144626 | ||||
| Remove_liquidity... | 20023923 | 634 days ago | IN | 0 ETH | 0.00154158 | ||||
| Remove_liquidity... | 19752901 | 672 days ago | IN | 0 ETH | 0.00129253 | ||||
| Remove_liquidity... | 19096104 | 764 days ago | IN | 0 ETH | 0.00204737 | ||||
| Remove_liquidity... | 18926350 | 788 days ago | IN | 0 ETH | 0.00380317 | ||||
| Remove_liquidity... | 18918796 | 789 days ago | IN | 0 ETH | 0.00371237 | ||||
| Add_liquidity | 18918774 | 789 days ago | IN | 0 ETH | 0.00422477 | ||||
| Remove_liquidity... | 18904951 | 791 days ago | IN | 0 ETH | 0.002359 | ||||
| Remove_liquidity... | 18904951 | 791 days ago | IN | 0 ETH | 0.00230815 | ||||
| Remove_liquidity... | 18854761 | 798 days ago | IN | 0 ETH | 0.00380514 | ||||
| Transfer | 18827172 | 802 days ago | IN | 0 ETH | 0.00129097 | ||||
| Remove_liquidity... | 18732660 | 815 days ago | IN | 0 ETH | 0.00705134 | ||||
| Remove_liquidity | 18580250 | 837 days ago | IN | 0 ETH | 0.00877048 | ||||
| Remove_liquidity... | 18508382 | 847 days ago | IN | 0 ETH | 0.00509471 | ||||
| Add_liquidity | 18507735 | 847 days ago | IN | 0.73 ETH | 0.00476353 | ||||
| Remove_liquidity... | 18502943 | 847 days ago | IN | 0 ETH | 0.00227729 | ||||
| Add_liquidity | 18296127 | 876 days ago | IN | 0.491 ETH | 0.00134051 | ||||
| Exchange | 18269342 | 880 days ago | IN | 0.001 ETH | 0.00228462 | ||||
| Remove_liquidity... | 18246278 | 883 days ago | IN | 0 ETH | 0.00118914 | ||||
| Remove_liquidity... | 18240849 | 884 days ago | IN | 0 ETH | 0.00142438 | ||||
| Remove_liquidity... | 18190967 | 891 days ago | IN | 0 ETH | 0.00145458 | ||||
| Remove_liquidity... | 18170296 | 894 days ago | IN | 0 ETH | 0.00219861 | ||||
| Remove_liquidity... | 18168244 | 894 days ago | IN | 0 ETH | 0.00179069 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24561118 | 18 hrs ago | 0.02011204 ETH | ||||
| Transfer | 24500671 | 9 days ago | 0.00484921 ETH | ||||
| Transfer | 24456910 | 15 days ago | 0.01905273 ETH | ||||
| Transfer | 24451448 | 16 days ago | 0.00089167 ETH | ||||
| Transfer | 24449146 | 16 days ago | 0.05532124 ETH | ||||
| Transfer | 24449002 | 16 days ago | 0.01337105 ETH | ||||
| Add_liquidity | 24448706 | 16 days ago | 0.05589676 ETH | ||||
| Add_liquidity | 24448689 | 16 days ago | 0.05589676 ETH | ||||
| Add_liquidity | 24447368 | 16 days ago | 0.05589676 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.48486408 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.01173588 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.08777368 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.542096 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.01 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.01 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.01 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.5143688 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.0118287 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.08669518 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.542096 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.01 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.01 ETH | ||||
| Exchange | 24447368 | 16 days ago | 0.01 ETH | ||||
| Add_liquidity | 24447368 | 16 days ago | 0.05589676 ETH | ||||
| Transfer | 24447368 | 16 days ago | 0.4799694 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xF646627A...180EaeFe3 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12
"""
@title LSDx ETH/stETH/frxETH/rETH StableSwap
"""
from vyper.interfaces import ERC20
interface rETH:
def getExchangeRate() -> uint256: view
interface CurveToken:
def mint(_to: address, _value: uint256) -> bool: nonpayable
def burnFrom(_to: address, _value: uint256) -> bool: nonpayable
# Events
event TokenExchange:
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
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
# These constants must be set prior to compiling
N_COINS: constant(int128) = 4
# fixed constants
FEE_DENOMINATOR: constant(uint256) = 10 ** 10
PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to
MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10 ** 6
MAX_A_CHANGE: constant(uint256) = 10
A_PRECISION: constant(uint256) = 100
ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400
coins: public(address[N_COINS])
admin_balances: public(uint256[N_COINS])
fee: public(uint256) # fee * 1e10
admin_fee: public(uint256) # admin_fee * 1e10
owner: public(address)
lp_token: public(address)
initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(uint256)
future_A_time: public(uint256)
admin_actions_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_owner: public(address)
is_killed: bool
kill_deadline: uint256
KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400
@external
def __init__(
_owner: address,
_coins: address[N_COINS],
_pool_token: address,
_A: uint256,
_fee: uint256,
_admin_fee: uint256
):
"""
@notice Contract constructor
@param _owner Contract owner address
@param _coins Addresses of ERC20 contracts of coins. Should be in exact order: ETH/stETH/frxETH/rETH
@param _pool_token Address of the token representing LP share
@param _A Amplification coefficient multiplied by n * (n - 1)
@param _fee Fee to charge for exchanges
@param _admin_fee Admin fee
"""
for i in range(N_COINS):
if i == 0:
assert _coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
else:
assert _coins[i] != ZERO_ADDRESS
self.coins = _coins
self.initial_A = _A * A_PRECISION
self.future_A = _A * A_PRECISION
self.fee = _fee
self.admin_fee = _admin_fee
self.owner = _owner
self.kill_deadline = block.timestamp + KILL_DEADLINE_DT
self.lp_token = _pool_token
@view
@internal
def _A() -> uint256:
t1: uint256 = self.future_A_time
A1: uint256 = self.future_A
if block.timestamp < t1:
# handle ramping up and down of A
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
@view
@external
def A() -> uint256:
return self._A() / A_PRECISION
@view
@external
def A_precise() -> uint256:
return self._A()
@view
@internal
def _stored_rates() -> uint256[N_COINS]:
return [
convert(PRECISION, uint256),
convert(PRECISION, uint256),
convert(PRECISION, uint256),
rETH(self.coins[3]).getExchangeRate()
]
@view
@internal
def _balances(_value: uint256 = 0) -> uint256[N_COINS]:
result: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
if i == 0:
result[i] = self.balance - self.admin_balances[i] - _value
else:
result[i] = ERC20(self.coins[i]).balanceOf(self) - self.admin_balances[i]
return result
@view
@external
def balances(i: uint256) -> uint256:
"""
@notice Get the current balance of a coin within the
pool, less the accrued admin fees
@param i Index value for the coin to query balance of
@return Token balance
"""
return self._balances()[i]
@view
@internal
def _xp(rates: uint256[N_COINS], _value: uint256 = 0) -> uint256[N_COINS]:
result: uint256[N_COINS] = rates
balances: uint256[N_COINS] = self._balances(_value)
for i in range(N_COINS):
result[i] = result[i] * balances[i] / PRECISION
return result
@pure
@internal
def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256:
"""
D invariant calculation in non-overflowing integer operations
iteratively
A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i))
Converging solution:
D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1)
"""
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:
result: uint256[N_COINS] = rates
for i in range(N_COINS):
result[i] = result[i] * _balances[i] / PRECISION
return self.get_D(result, 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
"""
D: uint256 = self.get_D(self._xp(self._stored_rates()), self._A())
# 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
token_supply: uint256 = ERC20(self.lp_token).totalSupply()
return D * PRECISION / token_supply
@view
@external
def calc_token_amount(amounts: uint256[N_COINS], is_deposit: bool) -> 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
@return Expected amount of LP tokens received
"""
amp: uint256 = self._A()
balances: uint256[N_COINS] = self._balances()
rates: uint256[N_COINS] = self._stored_rates()
D0: uint256 = self.get_D_mem(rates, balances, amp)
for i in range(N_COINS):
if is_deposit:
balances[i] += amounts[i]
else:
balances[i] -= amounts[i]
D1: uint256 = self.get_D_mem(rates, balances, amp)
token_amount: uint256 = ERC20(self.lp_token).totalSupply()
diff: uint256 = 0
if is_deposit:
diff = D1 - D0
else:
diff = D0 - D1
return diff * token_amount / D0
@payable
@external
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256) -> 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
@return Amount of LP tokens received by depositing
"""
assert not self.is_killed # dev: is killed
# Initial invariant
amp: uint256 = self._A()
rates: uint256[N_COINS] = self._stored_rates()
lp_token: address = self.lp_token
token_supply: uint256 = ERC20(lp_token).totalSupply()
D0: uint256 = 0
old_balances: uint256[N_COINS] = self._balances(msg.value)
if token_supply != 0:
D0 = self.get_D_mem(rates, old_balances, amp)
new_balances: uint256[N_COINS] = old_balances
for i in range(N_COINS):
if token_supply == 0:
assert amounts[i] > 0 # dev: initial deposit requires all coins
new_balances[i] += amounts[i]
# 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
D2: uint256 = 0
if token_supply > 0:
# Only account for fees if we are not the first to deposit
fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
admin_fee: uint256 = self.admin_fee
for i in range(N_COINS):
ideal_balance: uint256 = D1 * old_balances[i] / D0
difference: uint256 = 0
if ideal_balance > new_balances[i]:
difference = ideal_balance - new_balances[i]
else:
difference = new_balances[i] - ideal_balance
fees[i] = fee * difference / FEE_DENOMINATOR
if admin_fee != 0:
self.admin_balances[i] += fees[i] * admin_fee / FEE_DENOMINATOR
new_balances[i] -= fees[i]
D2 = self.get_D_mem(rates, new_balances, amp)
mint_amount = token_supply * (D2 - D0) / D0
else:
mint_amount = D1 # Take the dust if there was any
assert mint_amount >= min_mint_amount, "Slippage screwed you"
# Take coins from the sender
for i in range(N_COINS):
if self.coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
assert msg.value == amounts[i]
elif amounts[i] > 0:
assert ERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i])
# Mint pool tokens
CurveToken(lp_token).mint(msg.sender, mint_amount)
log AddLiquidity(msg.sender, amounts, fees, D1, token_supply + mint_amount)
return mint_amount
@view
@internal
def get_y(i: int128, j: int128, x: uint256, xp: uint256[N_COINS]) -> uint256:
"""
Calculate x[j] if one makes x[i] = x
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 != 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)
Ann: uint256 = amp * N_COINS
c: uint256 = D
S_: uint256 = 0
_x: uint256 = 0
y_prev: uint256 = 0
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) -> uint256:
# dx and dy in c-units
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
x: uint256 = xp[i] + dx * rates[i] / PRECISION
y: uint256 = self.get_y(i, j, x, xp)
dy: uint256 = xp[j] - y
fee: uint256 = self.fee * dy / FEE_DENOMINATOR
return (dy - fee) * PRECISION / rates[j]
@view
@external
def get_dx(i: int128, j: int128, dy: uint256) -> uint256:
# dx and dy in c-units
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * rates[j] / PRECISION
x: uint256 = self.get_y(j, i, y, xp)
dx: uint256 = (x - xp[i]) * PRECISION / rates[i]
return dx
@payable
@external
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256) -> 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
@return Actual amount of `j` received
"""
assert not self.is_killed # dev: is killed
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates, msg.value)
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
dy = (dy - dy_fee) * PRECISION / rates[j]
assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
admin_fee: uint256 = self.admin_fee
if admin_fee != 0:
dy_admin_fee: uint256 = dy_fee * admin_fee / FEE_DENOMINATOR
if dy_admin_fee != 0:
self.admin_balances[j] += dy_admin_fee
in_coin: address = self.coins[i]
if in_coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
assert msg.value == dx
else:
assert msg.value == 0
assert ERC20(in_coin).transferFrom(msg.sender, self, dx)
out_coin: address = self.coins[j]
if out_coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
raw_call(msg.sender, b"", value=dy)
else:
assert ERC20(out_coin).transfer(msg.sender, dy)
log TokenExchange(msg.sender, i, dx, j, dy)
return dy
@external
@nonreentrant('lock')
def remove_liquidity(
_amount: uint256,
_min_amounts: uint256[N_COINS],
) -> uint256[N_COINS]:
"""
@notice Withdraw coins from the pool
@dev Withdrawal amounts are based on current deposit ratios
@param _amount Quantity of LP tokens to burn in the withdrawal
@param _min_amounts Minimum amounts of underlying coins to receive
@return List of amounts of coins that were withdrawn
"""
amounts: uint256[N_COINS] = self._balances()
lp_token: address = self.lp_token
total_supply: uint256 = ERC20(lp_token).totalSupply()
CurveToken(lp_token).burnFrom(msg.sender, _amount) # dev: insufficient funds
for i in range(N_COINS):
value: uint256 = amounts[i] * _amount / total_supply
assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected"
amounts[i] = value
if i == 0:
raw_call(msg.sender, b"", value=value)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, value)
log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply - _amount)
return amounts
@external
@nonreentrant('lock')
def remove_liquidity_imbalance(
_amounts: uint256[N_COINS],
_max_burn_amount: uint256
) -> 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
@return Actual amount of the LP token burned in the withdrawal
"""
assert not self.is_killed # dev: is killed
amp: uint256 = self._A()
rates: uint256[N_COINS] = self._stored_rates()
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])
fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
admin_fee: uint256 = self.admin_fee
for i in range(N_COINS):
ideal_balance: uint256 = D1 * old_balances[i] / D0
new_balance: uint256 = new_balances[i]
difference: uint256 = 0
if ideal_balance > new_balance:
difference = ideal_balance - new_balance
else:
difference = new_balance - ideal_balance
fees[i] = fee * difference / FEE_DENOMINATOR
if admin_fee != 0:
self.admin_balances[i] += fees[i] * admin_fee / FEE_DENOMINATOR
new_balances[i] -= fees[i]
D2: uint256 = self.get_D_mem(rates, new_balances, amp)
lp_token: address = self.lp_token
token_supply: uint256 = ERC20(lp_token).totalSupply()
token_amount: uint256 = (D0 - D2) * token_supply / D0
assert token_amount != 0 # dev: zero tokens burned
assert token_amount <= _max_burn_amount, "Slippage screwed you"
CurveToken(lp_token).burnFrom(msg.sender, token_amount) # dev: insufficient funds
for i in range(N_COINS):
amount: uint256 = _amounts[i]
if amount != 0:
coin: address = self.coins[i]
if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
raw_call(msg.sender, b"", value=amount)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, _amounts[i])
log RemoveLiquidityImbalance(msg.sender, _amounts, fees, D1, token_supply - token_amount)
return token_amount
@pure
@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 + x_1 * (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
Ann: uint256 = A_ * N_COINS
c: uint256 = D
S_: uint256 = 0
_x: uint256 = 0
y_prev: uint256 = 0
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(_token_amount: uint256, i: int128) -> (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._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
D0: uint256 = self.get_D(xp, amp)
total_supply: uint256 = ERC20(self.lp_token).totalSupply()
D1: uint256 = D0 - _token_amount * D0 / total_supply
new_y: uint256 = self.get_y_D(amp, i, xp, D1)
fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
xp_reduced: uint256[N_COINS] = xp
for j in range(N_COINS):
dx_expected: uint256 = 0
if j == i:
dx_expected = xp[j] * D1 / D0 - new_y
else:
dx_expected = xp[j] - xp[j] * D1 / D0
xp_reduced[j] -= fee * dx_expected / FEE_DENOMINATOR
dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1)
rate: uint256 = rates[i]
dy = (dy - 1) * PRECISION / rate # Withdraw less to account for rounding errors
dy_0: uint256 = (xp[i] - new_y) * PRECISION / rate # w/o fees
return dy, dy_0 - dy
@view
@external
def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256:
"""
@notice Calculate the amount received when withdrawing a single coin
@dev Result is the same for underlying or wrapped asset withdrawals
@param _token_amount Amount of LP tokens to burn in the withdrawal
@param i Index value of the coin to withdraw
@return Amount of coin received
"""
return self._calc_withdraw_one_coin(_token_amount, i)[0]
@external
@nonreentrant('lock')
def remove_liquidity_one_coin(
_token_amount: uint256,
i: int128,
_min_amount: uint256
) -> uint256:
"""
@notice Withdraw a single coin from the pool
@param _token_amount Amount of LP tokens to burn in the withdrawal
@param i Index value of the coin to withdraw
@param _min_amount Minimum amount of coin to receive
@return Amount of coin received
"""
assert not self.is_killed # dev: is killed
dy: uint256 = 0
dy_fee: uint256 = 0
dy, dy_fee = self._calc_withdraw_one_coin(_token_amount, i)
assert dy >= _min_amount, "Not enough coins removed"
self.admin_balances[i] += dy_fee * self.admin_fee / FEE_DENOMINATOR
CurveToken(self.lp_token).burnFrom(msg.sender, _token_amount) # dev: insufficient funds
coin: address = self.coins[i]
if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
raw_call(msg.sender, b"", value=dy)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, dy)
log RemoveLiquidityOne(msg.sender, _token_amount, dy)
return dy
### Admin functions ###
@external
def ramp_A(_future_A: uint256, _future_time: uint256):
assert msg.sender == self.owner # 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.owner # 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)
@external
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256):
assert msg.sender == self.owner # dev: only owner
assert self.admin_actions_deadline == 0 # dev: active action
assert new_fee <= MAX_FEE # dev: fee exceeds maximum
assert new_admin_fee <= MAX_ADMIN_FEE # dev: admin fee exceeds maximum
_deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
self.admin_actions_deadline = _deadline
self.future_fee = new_fee
self.future_admin_fee = new_admin_fee
log CommitNewFee(_deadline, new_fee, new_admin_fee)
@external
@nonreentrant('lock')
def apply_new_fee():
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time
assert self.admin_actions_deadline != 0 # dev: no active action
self.admin_actions_deadline = 0
_fee: uint256 = self.future_fee
_admin_fee: uint256 = self.future_admin_fee
self.fee = _fee
self.admin_fee = _admin_fee
log NewFee(_fee, _admin_fee)
@external
def revert_new_parameters():
assert msg.sender == self.owner # dev: only owner
self.admin_actions_deadline = 0
@external
def commit_transfer_ownership(_owner: address):
assert msg.sender == self.owner # dev: only owner
assert self.transfer_ownership_deadline == 0 # dev: active transfer
_deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
self.transfer_ownership_deadline = _deadline
self.future_owner = _owner
log CommitNewAdmin(_deadline, _owner)
@external
@nonreentrant('lock')
def apply_transfer_ownership():
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.transfer_ownership_deadline # dev: insufficient time
assert self.transfer_ownership_deadline != 0 # dev: no active transfer
self.transfer_ownership_deadline = 0
_owner: address = self.future_owner
self.owner = _owner
log NewAdmin(_owner)
@external
def revert_transfer_ownership():
assert msg.sender == self.owner # dev: only owner
self.transfer_ownership_deadline = 0
@external
@nonreentrant('lock')
def withdraw_admin_fees():
assert msg.sender == self.owner # dev: only owner
for i in range(N_COINS):
amount: uint256 = self.admin_balances[i]
if amount != 0:
if self.coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
raw_call(msg.sender, b"", value=amount)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, amount)
self.admin_balances = empty(uint256[N_COINS])
@external
@nonreentrant('lock')
def donate_admin_fees():
"""
Just in case admin balances somehow become higher than total (rounding error?)
this can be used to fix the state, too
"""
assert msg.sender == self.owner # dev: only owner
self.admin_balances = empty(uint256[N_COINS])
@external
def kill_me():
assert msg.sender == self.owner # dev: only owner
assert self.kill_deadline > block.timestamp # dev: deadline has passed
self.is_killed = True
@external
def unkill_me():
assert msg.sender == self.owner # dev: only owner
self.is_killed = FalseContract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"int128","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"int128","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"name":"old_A","type":"uint256","indexed":false},{"name":"new_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"A","type":"uint256","indexed":false},{"name":"t","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_owner","type":"address"},{"name":"_coins","type":"address[4]"},{"name":"_pool_token","type":"address"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_admin_fee","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10374},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10336},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":30020},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":1437134},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[4]"},{"name":"is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":5469886},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[4]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":8458917},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3232712},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3232746},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3401554},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"}],"outputs":[{"name":"","type":"uint256[4]"}],"gas":277993},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":8593080},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}],"gas":1222},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4779843},{"stateMutability":"nonpayable","type":"function","name":"ramp_A","inputs":[{"name":"_future_A","type":"uint256"},{"name":"_future_time","type":"uint256"}],"outputs":[],"gas":159399},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[],"gas":154860},{"stateMutability":"nonpayable","type":"function","name":"commit_new_fee","inputs":[{"name":"new_fee","type":"uint256"},{"name":"new_admin_fee","type":"uint256"}],"outputs":[],"gas":112818},{"stateMutability":"nonpayable","type":"function","name":"apply_new_fee","inputs":[],"outputs":[],"gas":160702},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":22952},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":76990},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":122870},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23042},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[],"gas":312962},{"stateMutability":"nonpayable","type":"function","name":"donate_admin_fees","inputs":[],"outputs":[],"gas":140458},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40325},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23162},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3247},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3277},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3198},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3228},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3258},{"stateMutability":"view","type":"function","name":"lp_token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3288},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3318},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3348},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"future_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3558}]Contract Creation Code
0x6101206155e16101403960206155e160c03960c05160a01c1561002157600080fd5b602060206155e10160c03960c05160a01c1561003c57600080fd5b602060406155e10160c03960c05160a01c1561005757600080fd5b602060606155e10160c03960c05160a01c1561007257600080fd5b602060806155e10160c03960c05160a01c1561008d57600080fd5b602060a06155e10160c03960c05160a01c156100a857600080fd5b61026060006004818352015b6102605115156100fb5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61016061026051600481106100e757600080fd5b6020020151146100f657600080fd5b610120565b6000610160610260516004811061011157600080fd5b60200201511861012057600080fd5b81516001018083528114156100b4575b5050600060c052602060c0206101605181556101805160018201556101a05160028201556101c051600382015550610200516064808202821582848304141761017857600080fd5b80905090509050600655610200516064808202821582848304141761019c57600080fd5b8090509050905060075561022051600255610240516003556101405160045542624f1a008181830110156101cf57600080fd5b808201905090506010556101e0516005556155c956600436101561000d57613967565b600035601c5260005163029b2f34811415610a5b576011541561002f57600080fd5b6001601155600f541561004157600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613b05565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506005546101e052602061028060046318160ddd6102205261023c6101e0515afa6100ed57600080fd5b601f3d116100fa57600080fd5b60005061028051610200526000610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051346102c0526102c05160065801613bea565b610320526103405261036052610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032080516102405280602001516102605280604001516102805280606001516102a0525060006102005118156102a0576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610160516102c052610180516102e0526101a051610300526101c051610320526102405161034052610260516103605261028051610380526102a0516103a052610140516103c0526103c0516103a05161038051610360516103405161032051610300516102e0516102c05160065801614265565b610420526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261042051610220525b610240516102c052610260516102e05261028051610300526102a0516103205261034060006004818352015b6102005115156102fa576000600461034051600481106102eb57600080fd5b6020020135116102fa57600080fd5b6102c0610340516004811061030e57600080fd5b6020020180516004610340516004811061032757600080fd5b602002013581818301101561033b57600080fd5b808201905090508152505b81516001018083528114156102cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610160516103605261018051610380526101a0516103a0526101c0516103c0526102c0516103e0526102e05161040052610300516104205261032051610440526101405161046052610460516104405161042051610400516103e0516103c0516103a051610380516103605160065801614265565b6104c0526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c0516103405261022051610340511161047357600080fd5b60c03661036037600061020051111561080e576002546004808202821582848304141761049f57600080fd5b80905090509050600c80820490509050610420526003546104405261046060006004818352015b6103405161024061046051600481106104de57600080fd5b602002015180820282158284830414176104f757600080fd5b8090509050905061022051808061050d57600080fd5b8204905090506104805260006104a0526102c0610460516004811061053157600080fd5b602002015161048051111561057a57610480516102c0610460516004811061055857600080fd5b60200201518082101561056a57600080fd5b808203905090506104a0526105b0565b6102c0610460516004811061058e57600080fd5b602002015161048051808210156105a457600080fd5b808203905090506104a0525b610420516104a05180820282158284830414176105cc57600080fd5b809050905090506402540be4008082049050905061036061046051600481106105f457600080fd5b6020020152600061044051181561068257610460516004811061061657600080fd5b600160c052602060c020018054610360610460516004811061063757600080fd5b602002015161044051808202821582848304141761065457600080fd5b809050905090506402540be4008082049050905081818301101561067757600080fd5b808201905090508155505b6102c0610460516004811061069657600080fd5b60200201805161036061046051600481106106b057600080fd5b6020020151808210156106c257600080fd5b808203905090508152505b81516001018083528114156104c6575b5050610140610460525b61046051516020610460510161046052610460610460511015610709576106e7565b6101605161048052610180516104a0526101a0516104c0526101c0516104e0526102c051610500526102e0516105205261030051610540526103205161056052610140516105805261058051610560516105405161052051610500516104e0516104c0516104a0516104805160065801614265565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156107ad5761078a565b6105e05161040052610200516104005161022051808210156107ce57600080fd5b8082039050905080820282158284830414176107e957600080fd5b809050905090506102205180806107ff57600080fd5b8204905090506103e052610817565b610340516103e0525b6084356103e0511015151561086b576308c379a0610420526020610440526014610460527f536c697070616765207363726577656420796f750000000000000000000000006104805261046050606461043cfd5b61042060006004818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610420516004811061089d57600080fd5b600060c052602060c020015414156108d757600461042051600481106108c257600080fd5b602002013534146108d257600080fd5b610977565b6000600461042051600481106108ec57600080fd5b6020020135111561097757602061050060646323b872dd61044052336104605230610480526004610420516004811061092457600080fd5b60200201356104a05261045c6000610420516004811061094357600080fd5b600060c052602060c02001545af161095a57600080fd5b601f3d1161096757600080fd5b6000506105005161097757600080fd5b8151600101808352811415610877575b505060206104c060446340c10f196104205233610440526103e0516104605261043c60006101e0515af16109ba57600080fd5b601f3d116109c757600080fd5b6000506104c0506080600461042037610360516104a052610380516104c0526103a0516104e0526103c051610500526103405161052052610200516103e051818183011015610a1557600080fd5b8082019050905061054052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610420a26103e051600052600060115560206000f35b633df021248114156110cd5760115415610a7457600080fd5b600160115560043580806000811215610a8957195b607f1c15610a9657600080fd5b90505060243580806000811215610aa957195b607f1c15610ab657600080fd5b905050600f5415610ac657600080fd5b6101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a052346102c0526102c0516102a05161028051610260516102405160065801613d99565b6103205261034052610360526103805261022052610200526101e0526101c0526101a05261018052610160526101405261032080516101c05280602001516101e052806040015161020052806060015161022052506101c060043560048110610bee57600080fd5b602002015160443561014060043560048110610c0957600080fd5b60200201518082028215828483041417610c2257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015610c4857600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516040600461028037610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a051610260526101c060243560048110610d1757600080fd5b60200201516102605180821015610d2d57600080fd5b80820390509050600180821015610d4357600080fd5b8082039050905061028052610280516002548082028215828483041417610d6957600080fd5b809050905090506402540be400808204905090506102a052610280516102a05180821015610d9657600080fd5b80820390509050670de0b6b3a76400008082028215828483041417610dba57600080fd5b8090509050905061014060243560048110610dd457600080fd5b60200201518080610de457600080fd5b820490509050610280526064356102805110151515610e67576308c379a06102c05260206102e052602e610300527f45786368616e676520726573756c74656420696e20666577657220636f696e73610320527f207468616e206578706563746564000000000000000000000000000000000000610340526103005060846102dcfd5b6003546102c05260006102c0511815610ef5576102a0516102c0518082028215828483041417610e9657600080fd5b809050905090506402540be400808204905090506102e05260006102e0511815610ef55760243560048110610eca57600080fd5b600160c052602060c0200180546102e051818183011015610eea57600080fd5b808201905090508155505b60043560048110610f0557600080fd5b600060c052602060c02001546102e05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e0511415610f47576044353414610f4257600080fd5b610fa4565b3415610f5257600080fd5b60206103c060646323b872dd61030052336103205230610340526044356103605261031c60006102e0515af1610f8757600080fd5b601f3d11610f9457600080fd5b6000506103c051610fa457600080fd5b60243560048110610fb457600080fd5b600060c052602060c02001546103005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610300511415611028576000610320526103208051602001806103608284600060045af161100657600080fd5b5050600060006103605161038061028051335af161102357600080fd5b611076565b60206103c0604463a9059cbb610320523361034052610280516103605261033c6000610300515af161105957600080fd5b601f3d1161106657600080fd5b6000506103c05161107657600080fd5b6004356103205260443561034052602435610360526102805161038052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610320a261028051600052600060115560206000f35b34156110d857600080fd5b63f446c1d0811415611107576006580161396d565b610140526101405160648082049050905060005260206000f35b6376a2f0f081141561112d576006580161396d565b610140526101405160005260206000f35b634903b0d18114156111735760065801613bd3565b6101405261016052610180526101a0526101406004356004811061116557600080fd5b602002015160005260206000f35b63bb7b8b808114156114e0576101405160065801613b05565b61016052610180526101a0526101c0526101405261016080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101e051610260526102005161028052610220516102a052610240516102c0526102c0516102a051610280516102605160065801613d6f565b610320526103405261036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032080516103a05280602001516103c05280604001516103e052806060015161040052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e051610400516006580161396d565b61042052610400526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261042051610440526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516104005161042051610440516103a051610460526103c051610480526103e0516104a052610400516104c052610440516104e0526104e0516104c0516104a051610480516104605160065801613f63565b610540526104405261042052610400526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610540516101405260206101e060046318160ddd6101805261019c6005545afa61148257600080fd5b601f3d1161148f57600080fd5b6000506101e0516101605261014051670de0b6b3a764000080820282158284830414176114bb57600080fd5b809050905090506101605180806114d157600080fd5b82049050905060005260206000f35b63cf701ff781141561193d5760843560011c156114fc57600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613bd3565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506101405161016051610180516101a0516101c0516101e05161020051610220516102405160065801613b05565b61026052610280526102a0526102c0526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101e05161028052610200516102a052610220516102c052610240516102e052610160516103005261018051610320526101a051610340526101c05161036052610140516103805261038051610360516103405161032051610300516102e0516102c0516102a0516102805160065801614265565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e0516102605261028060006004818352015b6084351561173a5761016061028051600481106116fe57600080fd5b6020020180516004610280516004811061171757600080fd5b602002013581818301101561172b57600080fd5b80820190509050815250611784565b610160610280516004811061174e57600080fd5b6020020180516004610280516004811061176757600080fd5b60200201358082101561177957600080fd5b808203905090508152505b81516001018083528114156116e2575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101e0516102a052610200516102c052610220516102e0526102405161030052610160516103205261018051610340526101a051610360526101c05161038052610140516103a0526103a05161038051610360516103405161032051610300516102e0516102c0516102a05160065801614265565b6104005261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104005161028052602061032060046318160ddd6102c0526102dc6005545afa61189057600080fd5b601f3d1161189d57600080fd5b600050610320516102a05260006102c052608435156118db576102805161026051808210156118cb57600080fd5b808203905090506102c0526118fc565b6102605161028051808210156118f057600080fd5b808203905090506102c0525b6102c0516102a051808202821582848304141761191857600080fd5b8090509050905061026051808061192e57600080fd5b82049050905060005260206000f35b635e0d443f811415611c97576004358080600081121561195957195b607f1c1561196657600080fd5b9050506024358080600081121561197957195b607f1c1561198657600080fd5b9050506101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801613d6f565b6103005261032052610340526103605261022052610200526101e0526101c0526101a05261018052610160526101405261030080516101c05280602001516101e052806040015161020052806060015161022052506101c060043560048110611aa857600080fd5b602002015160443561014060043560048110611ac357600080fd5b60200201518082028215828483041417611adc57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b0257600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516040600461028037610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a051610260526101c060243560048110611bd157600080fd5b60200201516102605180821015611be757600080fd5b8082039050905061028052600254610280518082028215828483041417611c0d57600080fd5b809050905090506402540be400808204905090506102a052610280516102a05180821015611c3a57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611c5e57600080fd5b8090509050905061014060243560048110611c7857600080fd5b60200201518080611c8857600080fd5b82049050905060005260206000f35b6367df02ca811415611ff95760043580806000811215611cb357195b607f1c15611cc057600080fd5b90505060243580806000811215611cd357195b607f1c15611ce057600080fd5b9050506101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801613d6f565b6103005261032052610340526103605261022052610200526101e0526101c0526101a05261018052610160526101405261030080516101c05280602001516101e052806040015161020052806060015161022052506101c060243560048110611e0257600080fd5b60200201516044356402540be4008082028215828483041417611e2457600080fd5b809050905090506402540be40060025480821015611e4157600080fd5b808203905090508080611e5357600080fd5b82049050905061014060243560048110611e6c57600080fd5b60200201518082028215828483041417611e8557600080fd5b80905090509050670de0b6b3a76400008082049050905080821015611ea957600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a05161026052610260516101c060043560048110611f8257600080fd5b602002015180821015611f9457600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611fb857600080fd5b8090509050905061014060043560048110611fd257600080fd5b60200201518080611fe257600080fd5b820490509050610280526102805160005260206000f35b637d49d875811415612344576011541561201257600080fd5b60016011556101405161016051610180516101a05160065801613bd3565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506005546101c052602061026060046318160ddd6102005261021c6101c0515afa61209e57600080fd5b601f3d116120ab57600080fd5b600050610260516101e05260206102a060446379cc67906102005233610220526004356102405261021c60006101c0515af16120e657600080fd5b601f3d116120f357600080fd5b6000506102a05061020060006004818352015b610140610200516004811061211a57600080fd5b6020020151600435808202821582848304141761213657600080fd5b809050905090506101e051808061214c57600080fd5b820490509050610220526024610200516004811061216957600080fd5b602002013561022051101515156121e4576308c379a0610240526020610260526030610280527f5769746864726177616c20726573756c74656420696e20666577657220636f696102a0527f6e73207468616e206578706563746564000000000000000000000000000000006102c05261028050608461025cfd5b6102205161014061020051600481106121fc57600080fd5b6020020152610200511515612250576000610240526102408051602001806102808284600060045af161222e57600080fd5b505060006000610280516102a061022051335af161224b57600080fd5b6122b7565b60206102e0604463a9059cbb610240523361026052610220516102805261025c6000610200516004811061228357600080fd5b600060c052602060c02001545af161229a57600080fd5b601f3d116122a757600080fd5b6000506102e0516122b757600080fd5b8151600101808352811415612106575b50506101405161020052610160516102205261018051610240526101a05161026052608036610280376101e0516004358082101561230457600080fd5b8082039050905061030052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d610120610200a260006011556080610140f35b6318a7bd76811415612d48576011541561235d57600080fd5b6001601155600f541561236f57600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613b05565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506101405161016051610180516101a0516101c0516101e05161020051610220516102405160065801613bd3565b61026052610280526102a0526102c0526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101605161028052610180516102a0526101a0516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526102405161036052610140516103805261038051610360516103405161032051610300516102e0516102c0516102a0516102805160065801614265565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526101e05161028052610200516102a052610220516102c052610240516102e05261030060006004818352015b610280610300516004811061258957600080fd5b602002018051600461030051600481106125a257600080fd5b6020020135808210156125b457600080fd5b808203905090508152505b8151600101808352811415612575575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610160516103205261018051610340526101a051610360526101c05161038052610280516103a0526102a0516103c0526102c0516103e0526102e05161040052610140516104205261042051610400516103e0516103c0516103a0516103805161036051610340516103205160065801614265565b61048052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516103005260803661032037600254600480820282158284830414176126ea57600080fd5b80905090509050600c808204905090506103a0526003546103c0526103e060006004818352015b610300516101e06103e0516004811061272957600080fd5b6020020151808202821582848304141761274257600080fd5b8090509050905061026051808061275857600080fd5b820490509050610400526102806103e0516004811061277657600080fd5b602002015161042052600061044052610420516104005111156127b8576104005161042051808210156127a857600080fd5b80820390509050610440526127d9565b6104205161040051808210156127cd57600080fd5b80820390509050610440525b6103a0516104405180820282158284830414176127f557600080fd5b809050905090506402540be400808204905090506103206103e0516004811061281d57600080fd5b602002015260006103c05118156128ab576103e0516004811061283f57600080fd5b600160c052602060c0200180546103206103e0516004811061286057600080fd5b60200201516103c051808202821582848304141761287d57600080fd5b809050905090506402540be400808204905090508181830110156128a057600080fd5b808201905090508155505b6102806103e051600481106128bf57600080fd5b6020020180516103206103e051600481106128d957600080fd5b6020020151808210156128eb57600080fd5b808203905090508152505b8151600101808352811415612711575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e051610160516104005261018051610420526101a051610440526101c0516104605261028051610480526102a0516104a0526102c0516104c0526102e0516104e0526101405161050052610500516104e0516104c0516104a051610480516104605161044051610420516104005160065801614265565b610560526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610560516103e0526005546104005260206104a060046318160ddd6104405261045c610400515afa612a6257600080fd5b601f3d11612a6f57600080fd5b6000506104a05161042052610260516103e05180821015612a8f57600080fd5b80820390509050610420518082028215828483041417612aae57600080fd5b80905090509050610260518080612ac457600080fd5b8204905090506104405260006104405118612ade57600080fd5b6084356104405111151515612b32576308c379a06104605260206104805260146104a0527f536c697070616765207363726577656420796f750000000000000000000000006104c0526104a050606461047cfd5b602061050060446379cc6790610460523361048052610440516104a05261047c6000610400515af1612b6357600080fd5b601f3d11612b7057600080fd5b6000506105005061046060006004818352015b60046104605160048110612b9657600080fd5b6020020135610480526000610480511815612cab576104605160048110612bbc57600080fd5b600060c052602060c02001546104a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104a0511415612c305760006104c0526104c08051602001806105008284600060045af1612c0e57600080fd5b5050600060006105005161052061048051335af1612c2b57600080fd5b612cab565b6020610560604463a9059cbb6104c052336104e05260046104605160048110612c5857600080fd5b6020020135610500526104dc60006104605160048110612c7757600080fd5b600060c052602060c02001545af1612c8e57600080fd5b601f3d11612c9b57600080fd5b60005061056051612cab57600080fd5b8151600101808352811415612b83575b50506080600461046037610320516104e0526103405161050052610360516105205261038051610540526103005161056052610420516104405180821015612d0257600080fd5b8082039050905061058052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610460a261044051600052600060115560206000f35b63cc2b27d7811415612dc85760243580806000811215612d6457195b607f1c15612d7157600080fd5b9050506004356101405260243561016052610160516101405160065801614c27565b6101c0526101e0526101c080808080516102005250506020810190508080805161022052505050506102005160005260206000f35b631a4d01d28114156130b35760115415612de157600080fd5b600160115560243580806000811215612df657195b607f1c15612e0357600080fd5b905050600f5415612e1357600080fd5b604036610140376101405161016051600435610180526024356101a0526101a0516101805160065801614c27565b610200526102205261016052610140526102008080808051610240525050602081019050808080516102605250505050610240805161014052806020015161016052506044356101405110151515612ed8576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b60243560048110612ee857600080fd5b600160c052602060c020018054610160516003548082028215828483041417612f1057600080fd5b809050905090506402540be40080820490509050818183011015612f3357600080fd5b80820190509050815550602061022060446379cc679061018052336101a0526004356101c05261019c60006005545af1612f6c57600080fd5b601f3d11612f7957600080fd5b6000506102205060243560048110612f9057600080fd5b600060c052602060c02001546101805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6101805114156130045760006101a0526101a08051602001806101e08284600060045af1612fe257600080fd5b5050600060006101e05161020061014051335af1612fff57600080fd5b61306a565b6020610240604463a9059cbb6101a052336101c052610140516101e0526101bc60006024356004811061303657600080fd5b600060c052602060c02001545af161304d57600080fd5b601f3d1161305a57600080fd5b6000506102405161306a57600080fd5b6004356101a052610140516101c052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101a0a261014051600052600060115560206000f35b633c157e648114156132545760045433146130cd57600080fd5b600854620151808181830110156130e357600080fd5b808201905090504210156130f657600080fd5b426201518081818301101561310a57600080fd5b80820190509050602435101561311f57600080fd5b610140516006580161396d565b610160526101405261016051610140526004356064808202821582848304141761315557600080fd5b80905090509050610160526000600435111561317857620f42406004351061317b565b60005b61318457600080fd5b610140516101605110156131c7576101405161016051600a80820282158284830414176131b057600080fd5b8090509050905010156131c257600080fd5b6131f7565b61014051600a80820282158284830414176131e157600080fd5b809050905090506101605111156131f757600080fd5b6101405160065561016051600755426008556024356009556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a65888114156132d757600454331461326e57600080fd5b610140516006580161396d565b6101605261014052610160516101405261014051600655610140516007554260085542600955610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a14678114156133935760045433146132f157600080fd5b600a54156132fe57600080fd5b64012a05f200600435111561331257600080fd5b6402540be400602435111561332657600080fd5b426203f48081818301101561333a57600080fd5b808201905090506101405261014051600a55600435600c55602435600d556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9781141561343c57601154156133ac57600080fd5b600160115560045433146133bf57600080fd5b600a544210156133ce57600080fd5b6000600a54186133dd57600080fd5b6000600a55600c5461014052600d546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a16000601155005b63226840fb81141561345d57600454331461345657600080fd5b6000600a55005b636b441a408114156134ef5760043560a01c1561347957600080fd5b600454331461348757600080fd5b600b541561349457600080fd5b426203f4808181830110156134a857600080fd5b808201905090506101405261014051600b55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561357d576011541561350857600080fd5b6001601155600454331461351b57600080fd5b600b5442101561352a57600080fd5b6000600b541861353957600080fd5b6000600b55600e546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a26000601155005b6386fbf19381141561359e57600454331461359757600080fd5b6000600b55005b6330c5408581141561372457601154156135b757600080fd5b600160115560045433146135ca57600080fd5b61014060006004818352015b61014051600481106135e757600080fd5b600160c052602060c02001546101605260006101605118156136e75773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610140516004811061362957600080fd5b600060c052602060c02001541415613680576000610180526101808051602001806101c08284600060045af161365e57600080fd5b5050600060006101c0516101e061016051335af161367b57600080fd5b6136e7565b6020610220604463a9059cbb61018052336101a052610160516101c05261019c600061014051600481106136b357600080fd5b600060c052602060c02001545af16136ca57600080fd5b601f3d116136d757600080fd5b600050610220516136e757600080fd5b81516001018083528114156135d6575b5050600160c052602060c02060008155600060018201556000600282015560006003820155506000601155005b63524c390181141561377b576011541561373d57600080fd5b6001601155600454331461375057600080fd5b600160c052602060c02060008155600060018201556000600282015560006003820155506000601155005b63e36988538114156137aa57600454331461379557600080fd5b42601054116137a357600080fd5b6001600f55005b633046f9728114156137cb5760045433146137c457600080fd5b6000600f55005b63c66106578114156137fc57600435600481106137e757600080fd5b600060c052602060c020015460005260206000f35b63e2e7d26481141561382d576004356004811061381857600080fd5b600160c052602060c020015460005260206000f35b63ddca3f438114156138455760025460005260206000f35b63fee3f7f981141561385d5760035460005260206000f35b638da5cb5b8114156138755760045460005260206000f35b6382c6306681141561388d5760055460005260206000f35b635409491a8114156138a55760065460005260206000f35b63b4b577ad8114156138bd5760075460005260206000f35b632081066c8114156138d55760085460005260206000f35b63140522888114156138ed5760095460005260206000f35b63405e28f881141561390557600a5460005260206000f35b63e0a0b58681141561391d57600b5460005260206000f35b6358680d0b81141561393557600c5460005260206000f35b63e382446281141561394d57600d5460005260206000f35b631ec0cdc181141561396557600e5460005260206000f35b505b60006000fd5b61014052600954610160526007546101805261016051421015613af3576006546101a0526008546101c0526101a051610180511115613a4d576101a051610180516101a051808210156139bf57600080fd5b80820390509050426101c051808210156139d857600080fd5b8082039050905080820282158284830414176139f357600080fd5b80905090509050610160516101c05180821015613a0f57600080fd5b808203905090508080613a2157600080fd5b820490509050818183011015613a3657600080fd5b808201905090506000526000516101405156613aee565b6101a0516101a0516101805180821015613a6657600080fd5b80820390509050426101c05180821015613a7f57600080fd5b808203905090508082028215828483041417613a9a57600080fd5b80905090509050610160516101c05180821015613ab657600080fd5b808203905090508080613ac857600080fd5b82049050905080821015613adb57600080fd5b8082039050905060005260005161014051565b613b03565b6101805160005260005161014051565b005b61014052670de0b6b3a764000061016052670de0b6b3a764000061018052670de0b6b3a76400006101a0526020610220600463e6aa216c6101c0526101dc6003600060c052602060c02001545afa613b5c57600080fd5b601f3d11613b6957600080fd5b60005061022051610240526101605161028052610180516102a0526101a0516102c052610240516102e0526080610260525b600061026051111515613bad57613bc9565b6020610260510361028001516020610260510361026052613b9b565b6101405156613be2575b61016052600061014052613bfa565b600015613bfa575b6101605261014052600050613bfa565b6080366101803761020060006004818352015b610200511515613c7f57476102005160048110613c2957600080fd5b600160c052602060c020015480821015613c4257600080fd5b808203905090506101405180821015613c5a57600080fd5b808203905090506101806102005160048110613c7557600080fd5b6020020152613d1e565b60206102a060246370a0823161022052306102405261023c6102005160048110613ca857600080fd5b600060c052602060c02001545afa613cbf57600080fd5b601f3d11613ccc57600080fd5b6000506102a0516102005160048110613ce457600080fd5b600160c052602060c020015480821015613cfd57600080fd5b808203905090506101806102005160048110613d1857600080fd5b60200201525b8151600101808352811415613c0d575b50506080610200525b600061020051111515613d4957613d65565b6020610200510361018001516020610200510361020052613d37565b6101605156613d91575b6101e05260006101c0526101405261016052610180526101a052600050613db9565b600015613db9575b6101e0526101405261016052610180526101a0526101c052600050613db9565b6101405161020052610160516102205261018051610240526101a051610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516101c051610300526103005160065801613bea565b61036052610380526103a0526103c0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516102805280602001516102a05280604001516102c05280606001516102e0525061030060006004818352015b6102006103005160048110613eb357600080fd5b60200201516102806103005160048110613ecc57600080fd5b60200201518082028215828483041417613ee557600080fd5b80905090509050670de0b6b3a7640000808204905090506102006103005160048110613f1057600080fd5b60200201525b8151600101808352811415613e9f575b50506080610300525b600061030051111515613f4157613f5d565b6020610300510361020001516020610300510361030052613f2f565b6101e051565b6101e0526101405261016052610180526101a0526101c0526040366102003761026060006004818352015b60206102605102610140015161024052610200805161024051818183011015613fb657600080fd5b808201905090508152505b8151600101808352811415613f8e575b5050610200511515613feb5760006000526000516101e051565b61020051610240526101c0516004808202821582848304141761400d57600080fd5b8090509050905061026052610280600060ff818352015b610240516102a0526102e060006004818352015b60206102e0510261014001516102c0526102a05161024051808202821582848304141761406457600080fd5b809050905090506102c0516004808202821582848304141761408557600080fd5b80905090509050808061409757600080fd5b8204905090506102a0525b8151600101808352811415614038575b50506102405161022052610260516102005180820282158284830414176140d857600080fd5b809050905090506064808204905090506102a0516004808202821582848304141761410257600080fd5b8090509050905081818301101561411857600080fd5b8082019050905061024051808202821582848304141761413757600080fd5b809050905090506102605160648082101561415157600080fd5b8082039050905061024051808202821582848304141761417057600080fd5b8090509050905060648082049050905060056102a051808202821582848304141761419a57600080fd5b809050905090508181830110156141b057600080fd5b8082019050905080806141c257600080fd5b82049050905061024052610220516102405111156142165760016102405161022051808210156141f157600080fd5b80820390509050111515614211576102405160005250506000516101e051565b61424d565b600161022051610240518082101561422d57600080fd5b8082039050905011151561424d576102405160005250506000516101e051565b8151600101808352811415614024575b505060006000fd5b610260526101405261016052610180526101a0526101c0526101e0526102005261022052610240526101405161028052610160516102a052610180516102c0526101a0516102e05261030060006004818352015b61028061030051600481106142cd57600080fd5b60200201516101c061030051600481106142e657600080fd5b602002015180820282158284830414176142ff57600080fd5b80905090509050670de0b6b3a764000080820490509050610280610300516004811061432a57600080fd5b60200201525b81516001018083528114156142b9575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161028051610300526102a051610320526102c051610340526102e051610360526102405161038052610380516103605161034051610320516103005160065801613f63565b6103e0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e05160005260005161026051565b610220526101405261016052610180526101a0526101c0526101e0526102005261016051610140511861443d57600080fd5b600061016051121561444e57600080fd5b6004610160511261445e57600080fd5b600061014051121561446f57600080fd5b6004610140511261447f57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516006580161396d565b610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026051610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a051610280526101c0516102a0526101e0516102c052610200516102e0526102405161030052610300516102e0516102c0516102a0516102805160065801613f63565b61036052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161026052610240516004808202821582848304141761459757600080fd5b8090509050905061028052610260516102a0526060366102c03761032060006004818352015b610140516103205114156145d857610180516102e05261460d565b61016051610320511815614608576101a061032051600481106145fa57600080fd5b60200201516102e05261460d565b614689565b6102c080516102e05181818301101561462557600080fd5b808201905090508152506102a05161026051808202821582848304141761464b57600080fd5b809050905090506102e0516004808202821582848304141761466c57600080fd5b80905090509050808061467e57600080fd5b8204905090506102a0525b81516001018083528114156145bd575b50506102a0516102605180820282158284830414176146b757600080fd5b80905090509050606480820282158284830414176146d457600080fd5b8090509050905061028051600480820282158284830414176146f557600080fd5b80905090509050808061470757600080fd5b8204905090506102a0526102c051610260516064808202821582848304141761472f57600080fd5b8090509050905061028051808061474557600080fd5b82049050905081818301101561475a57600080fd5b80820190509050610320526102605161034052610360600060ff818352015b61034051610300526103405161034051808202821582848304141761479d57600080fd5b809050905090506102a0518181830110156147b757600080fd5b8082019050905060026103405180820282158284830414176147d857600080fd5b80905090509050610320518181830110156147f257600080fd5b80820190509050610260518082101561480a57600080fd5b80820390509050808061481c57600080fd5b820490509050610340526103005161034051111561487057600161034051610300518082101561484b57600080fd5b8082039050905011151561486b5761034051600052505060005161022051565b6148a7565b600161030051610340518082101561488757600080fd5b808203905090501115156148a75761034051600052505060005161022051565b8151600101808352811415614779575b505060006000fd5b610220526101405261016052610180526101a0526101c0526101e0526102005260006101605112156148f057600080fd5b6004610160511261490057600080fd5b610140516004808202821582848304141761491a57600080fd5b80905090509050610240526102005161026052606036610280376102e060006004818352015b610160516102e0511815614970576101806102e0516004811061496257600080fd5b60200201516102a052614975565b6149f1565b61028080516102a05181818301101561498d57600080fd5b80820190509050815250610260516102005180820282158284830414176149b357600080fd5b809050905090506102a051600480820282158284830414176149d457600080fd5b8090509050905080806149e657600080fd5b820490509050610260525b8151600101808352811415614940575b505061026051610200518082028215828483041417614a1f57600080fd5b8090509050905060648082028215828483041417614a3c57600080fd5b809050905090506102405160048082028215828483041417614a5d57600080fd5b809050905090508080614a6f57600080fd5b82049050905061026052610280516102005160648082028215828483041417614a9757600080fd5b80905090509050610240518080614aad57600080fd5b820490509050818183011015614ac257600080fd5b808201905090506102e0526102005161030052610320600060ff818352015b610300516102c05261030051610300518082028215828483041417614b0557600080fd5b8090509050905061026051818183011015614b1f57600080fd5b808201905090506002610300518082028215828483041417614b4057600080fd5b809050905090506102e051818183011015614b5a57600080fd5b808201905090506102005180821015614b7257600080fd5b808203905090508080614b8457600080fd5b820490509050610300526102c051610300511115614bd8576001610300516102c05180821015614bb357600080fd5b80820390509050111515614bd35761030051600052505060005161022051565b614c0f565b60016102c0516103005180821015614bef57600080fd5b80820390509050111515614c0f5761030051600052505060005161022051565b8151600101808352811415614ae1575b505060006000fd5b6101805261014052610160526101405161016051610180516101a0516006580161396d565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e051610200516102205160065801613b05565b6102405261026052610280526102a05261022052610200526101e0526101c0526101a05261018052610160526101405261024080516101c05280602001516101e052806040015161020052806060015161022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0516102c0526101e0516102e0526102005161030052610220516103205261032051610300516102e0516102c05160065801613d6f565b610380526103a0526103c0526103e0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038080516102405280602001516102605280604001516102805280606001516102a052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610240516102e052610260516103005261028051610320526102a051610340526101a05161036052610360516103405161032051610300516102e05160065801613f63565b6103c0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c0516102c052602061036060046318160ddd6103005261031c6005545afa614e8e57600080fd5b601f3d11614e9b57600080fd5b600050610360516102e0526102c051610140516102c0518082028215828483041417614ec657600080fd5b809050905090506102e0518080614edc57600080fd5b82049050905080821015614eef57600080fd5b80820390509050610300526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516101a0516103405261016051610360526102405161038052610260516103a052610280516103c0526102a0516103e0526103005161040052610400516103e0516103c0516103a051610380516103605161034051600658016148bf565b6104605261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610460516103205260025460048082028215828483041417614ffc57600080fd5b80905090509050600c808204905090506103405261024051610360526102605161038052610280516103a0526102a0516103c0526103e060006004818352015b600061040052610160516103e05114156150be576102406103e0516004811061506457600080fd5b602002015161030051808202821582848304141761508157600080fd5b809050905090506102c051808061509757600080fd5b82049050905061032051808210156150ae57600080fd5b808203905090506104005261513d565b6102406103e051600481106150d257600080fd5b60200201516102406103e051600481106150eb57600080fd5b602002015161030051808202821582848304141761510857600080fd5b809050905090506102c051808061511e57600080fd5b8204905090508082101561513157600080fd5b80820390509050610400525b6103606103e0516004811061515157600080fd5b6020020180516103405161040051808202821582848304141761517357600080fd5b809050905090506402540be400808204905090508082101561519457600080fd5b808203905090508152505b815160010180835281141561503c575b505061036061016051600481106151c557600080fd5b6020020151610140610400525b610400515160206104005101610400526104006104005110156151f4576151d2565b6101a051610420526101605161044052610360516104605261038051610480526103a0516104a0526103c0516104c052610300516104e0526104e0516104c0516104a05161048051610460516104405161042051600658016148bf565b610540526103e0610400525b61040051526020610400510361040052610140610400511015156152805761525d565b610540518082101561529157600080fd5b808203905090506103e0526101c061016051600481106152b057600080fd5b6020020151610400526103e0516001808210156152cc57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176152f057600080fd5b8090509050905061040051808061530657600080fd5b8204905090506103e052610240610160516004811061532457600080fd5b6020020151610320518082101561533a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761535e57600080fd5b8090509050905061040051808061537457600080fd5b820490509050610420526104806103e0518152610420516103e0518082101561539c57600080fd5b8082039050905081602001525060406104c0525b60006104c0511115156153c2576153de565b60206104c05103610480015160206104c051036104c0526153b0565b61018051565b6101e56155c9036101e56000396101e56155c9036000f3000000000000000000000000b2bfddb406003e2e26be14d02d64d4771de22ecf000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe840000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000ae78736cd615f374d3085123a210448e74fc639300000000000000000000000021ead867c8c5181854f6f8ce71f75b173d2bc16a00000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000012a05f200
Deployed Bytecode
0x600436101561000d57613967565b600035601c5260005163029b2f34811415610a5b576011541561002f57600080fd5b6001601155600f541561004157600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613b05565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506005546101e052602061028060046318160ddd6102205261023c6101e0515afa6100ed57600080fd5b601f3d116100fa57600080fd5b60005061028051610200526000610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051346102c0526102c05160065801613bea565b610320526103405261036052610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032080516102405280602001516102605280604001516102805280606001516102a0525060006102005118156102a0576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610160516102c052610180516102e0526101a051610300526101c051610320526102405161034052610260516103605261028051610380526102a0516103a052610140516103c0526103c0516103a05161038051610360516103405161032051610300516102e0516102c05160065801614265565b610420526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261042051610220525b610240516102c052610260516102e05261028051610300526102a0516103205261034060006004818352015b6102005115156102fa576000600461034051600481106102eb57600080fd5b6020020135116102fa57600080fd5b6102c0610340516004811061030e57600080fd5b6020020180516004610340516004811061032757600080fd5b602002013581818301101561033b57600080fd5b808201905090508152505b81516001018083528114156102cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610160516103605261018051610380526101a0516103a0526101c0516103c0526102c0516103e0526102e05161040052610300516104205261032051610440526101405161046052610460516104405161042051610400516103e0516103c0516103a051610380516103605160065801614265565b6104c0526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c0516103405261022051610340511161047357600080fd5b60c03661036037600061020051111561080e576002546004808202821582848304141761049f57600080fd5b80905090509050600c80820490509050610420526003546104405261046060006004818352015b6103405161024061046051600481106104de57600080fd5b602002015180820282158284830414176104f757600080fd5b8090509050905061022051808061050d57600080fd5b8204905090506104805260006104a0526102c0610460516004811061053157600080fd5b602002015161048051111561057a57610480516102c0610460516004811061055857600080fd5b60200201518082101561056a57600080fd5b808203905090506104a0526105b0565b6102c0610460516004811061058e57600080fd5b602002015161048051808210156105a457600080fd5b808203905090506104a0525b610420516104a05180820282158284830414176105cc57600080fd5b809050905090506402540be4008082049050905061036061046051600481106105f457600080fd5b6020020152600061044051181561068257610460516004811061061657600080fd5b600160c052602060c020018054610360610460516004811061063757600080fd5b602002015161044051808202821582848304141761065457600080fd5b809050905090506402540be4008082049050905081818301101561067757600080fd5b808201905090508155505b6102c0610460516004811061069657600080fd5b60200201805161036061046051600481106106b057600080fd5b6020020151808210156106c257600080fd5b808203905090508152505b81516001018083528114156104c6575b5050610140610460525b61046051516020610460510161046052610460610460511015610709576106e7565b6101605161048052610180516104a0526101a0516104c0526101c0516104e0526102c051610500526102e0516105205261030051610540526103205161056052610140516105805261058051610560516105405161052051610500516104e0516104c0516104a0516104805160065801614265565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156107ad5761078a565b6105e05161040052610200516104005161022051808210156107ce57600080fd5b8082039050905080820282158284830414176107e957600080fd5b809050905090506102205180806107ff57600080fd5b8204905090506103e052610817565b610340516103e0525b6084356103e0511015151561086b576308c379a0610420526020610440526014610460527f536c697070616765207363726577656420796f750000000000000000000000006104805261046050606461043cfd5b61042060006004818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610420516004811061089d57600080fd5b600060c052602060c020015414156108d757600461042051600481106108c257600080fd5b602002013534146108d257600080fd5b610977565b6000600461042051600481106108ec57600080fd5b6020020135111561097757602061050060646323b872dd61044052336104605230610480526004610420516004811061092457600080fd5b60200201356104a05261045c6000610420516004811061094357600080fd5b600060c052602060c02001545af161095a57600080fd5b601f3d1161096757600080fd5b6000506105005161097757600080fd5b8151600101808352811415610877575b505060206104c060446340c10f196104205233610440526103e0516104605261043c60006101e0515af16109ba57600080fd5b601f3d116109c757600080fd5b6000506104c0506080600461042037610360516104a052610380516104c0526103a0516104e0526103c051610500526103405161052052610200516103e051818183011015610a1557600080fd5b8082019050905061054052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610420a26103e051600052600060115560206000f35b633df021248114156110cd5760115415610a7457600080fd5b600160115560043580806000811215610a8957195b607f1c15610a9657600080fd5b90505060243580806000811215610aa957195b607f1c15610ab657600080fd5b905050600f5415610ac657600080fd5b6101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a052346102c0526102c0516102a05161028051610260516102405160065801613d99565b6103205261034052610360526103805261022052610200526101e0526101c0526101a05261018052610160526101405261032080516101c05280602001516101e052806040015161020052806060015161022052506101c060043560048110610bee57600080fd5b602002015160443561014060043560048110610c0957600080fd5b60200201518082028215828483041417610c2257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015610c4857600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516040600461028037610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a051610260526101c060243560048110610d1757600080fd5b60200201516102605180821015610d2d57600080fd5b80820390509050600180821015610d4357600080fd5b8082039050905061028052610280516002548082028215828483041417610d6957600080fd5b809050905090506402540be400808204905090506102a052610280516102a05180821015610d9657600080fd5b80820390509050670de0b6b3a76400008082028215828483041417610dba57600080fd5b8090509050905061014060243560048110610dd457600080fd5b60200201518080610de457600080fd5b820490509050610280526064356102805110151515610e67576308c379a06102c05260206102e052602e610300527f45786368616e676520726573756c74656420696e20666577657220636f696e73610320527f207468616e206578706563746564000000000000000000000000000000000000610340526103005060846102dcfd5b6003546102c05260006102c0511815610ef5576102a0516102c0518082028215828483041417610e9657600080fd5b809050905090506402540be400808204905090506102e05260006102e0511815610ef55760243560048110610eca57600080fd5b600160c052602060c0200180546102e051818183011015610eea57600080fd5b808201905090508155505b60043560048110610f0557600080fd5b600060c052602060c02001546102e05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e0511415610f47576044353414610f4257600080fd5b610fa4565b3415610f5257600080fd5b60206103c060646323b872dd61030052336103205230610340526044356103605261031c60006102e0515af1610f8757600080fd5b601f3d11610f9457600080fd5b6000506103c051610fa457600080fd5b60243560048110610fb457600080fd5b600060c052602060c02001546103005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610300511415611028576000610320526103208051602001806103608284600060045af161100657600080fd5b5050600060006103605161038061028051335af161102357600080fd5b611076565b60206103c0604463a9059cbb610320523361034052610280516103605261033c6000610300515af161105957600080fd5b601f3d1161106657600080fd5b6000506103c05161107657600080fd5b6004356103205260443561034052602435610360526102805161038052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610320a261028051600052600060115560206000f35b34156110d857600080fd5b63f446c1d0811415611107576006580161396d565b610140526101405160648082049050905060005260206000f35b6376a2f0f081141561112d576006580161396d565b610140526101405160005260206000f35b634903b0d18114156111735760065801613bd3565b6101405261016052610180526101a0526101406004356004811061116557600080fd5b602002015160005260206000f35b63bb7b8b808114156114e0576101405160065801613b05565b61016052610180526101a0526101c0526101405261016080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101e051610260526102005161028052610220516102a052610240516102c0526102c0516102a051610280516102605160065801613d6f565b610320526103405261036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032080516103a05280602001516103c05280604001516103e052806060015161040052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e051610400516006580161396d565b61042052610400526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261042051610440526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516104005161042051610440516103a051610460526103c051610480526103e0516104a052610400516104c052610440516104e0526104e0516104c0516104a051610480516104605160065801613f63565b610540526104405261042052610400526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610540516101405260206101e060046318160ddd6101805261019c6005545afa61148257600080fd5b601f3d1161148f57600080fd5b6000506101e0516101605261014051670de0b6b3a764000080820282158284830414176114bb57600080fd5b809050905090506101605180806114d157600080fd5b82049050905060005260206000f35b63cf701ff781141561193d5760843560011c156114fc57600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613bd3565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506101405161016051610180516101a0516101c0516101e05161020051610220516102405160065801613b05565b61026052610280526102a0526102c0526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101e05161028052610200516102a052610220516102c052610240516102e052610160516103005261018051610320526101a051610340526101c05161036052610140516103805261038051610360516103405161032051610300516102e0516102c0516102a0516102805160065801614265565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e0516102605261028060006004818352015b6084351561173a5761016061028051600481106116fe57600080fd5b6020020180516004610280516004811061171757600080fd5b602002013581818301101561172b57600080fd5b80820190509050815250611784565b610160610280516004811061174e57600080fd5b6020020180516004610280516004811061176757600080fd5b60200201358082101561177957600080fd5b808203905090508152505b81516001018083528114156116e2575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101e0516102a052610200516102c052610220516102e0526102405161030052610160516103205261018051610340526101a051610360526101c05161038052610140516103a0526103a05161038051610360516103405161032051610300516102e0516102c0516102a05160065801614265565b6104005261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104005161028052602061032060046318160ddd6102c0526102dc6005545afa61189057600080fd5b601f3d1161189d57600080fd5b600050610320516102a05260006102c052608435156118db576102805161026051808210156118cb57600080fd5b808203905090506102c0526118fc565b6102605161028051808210156118f057600080fd5b808203905090506102c0525b6102c0516102a051808202821582848304141761191857600080fd5b8090509050905061026051808061192e57600080fd5b82049050905060005260206000f35b635e0d443f811415611c97576004358080600081121561195957195b607f1c1561196657600080fd5b9050506024358080600081121561197957195b607f1c1561198657600080fd5b9050506101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801613d6f565b6103005261032052610340526103605261022052610200526101e0526101c0526101a05261018052610160526101405261030080516101c05280602001516101e052806040015161020052806060015161022052506101c060043560048110611aa857600080fd5b602002015160443561014060043560048110611ac357600080fd5b60200201518082028215828483041417611adc57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b0257600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516040600461028037610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a051610260526101c060243560048110611bd157600080fd5b60200201516102605180821015611be757600080fd5b8082039050905061028052600254610280518082028215828483041417611c0d57600080fd5b809050905090506402540be400808204905090506102a052610280516102a05180821015611c3a57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611c5e57600080fd5b8090509050905061014060243560048110611c7857600080fd5b60200201518080611c8857600080fd5b82049050905060005260206000f35b6367df02ca811415611ff95760043580806000811215611cb357195b607f1c15611cc057600080fd5b90505060243580806000811215611cd357195b607f1c15611ce057600080fd5b9050506101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801613d6f565b6103005261032052610340526103605261022052610200526101e0526101c0526101a05261018052610160526101405261030080516101c05280602001516101e052806040015161020052806060015161022052506101c060243560048110611e0257600080fd5b60200201516044356402540be4008082028215828483041417611e2457600080fd5b809050905090506402540be40060025480821015611e4157600080fd5b808203905090508080611e5357600080fd5b82049050905061014060243560048110611e6c57600080fd5b60200201518082028215828483041417611e8557600080fd5b80905090509050670de0b6b3a76400008082049050905080821015611ea957600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a05161026052610260516101c060043560048110611f8257600080fd5b602002015180821015611f9457600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611fb857600080fd5b8090509050905061014060043560048110611fd257600080fd5b60200201518080611fe257600080fd5b820490509050610280526102805160005260206000f35b637d49d875811415612344576011541561201257600080fd5b60016011556101405161016051610180516101a05160065801613bd3565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506005546101c052602061026060046318160ddd6102005261021c6101c0515afa61209e57600080fd5b601f3d116120ab57600080fd5b600050610260516101e05260206102a060446379cc67906102005233610220526004356102405261021c60006101c0515af16120e657600080fd5b601f3d116120f357600080fd5b6000506102a05061020060006004818352015b610140610200516004811061211a57600080fd5b6020020151600435808202821582848304141761213657600080fd5b809050905090506101e051808061214c57600080fd5b820490509050610220526024610200516004811061216957600080fd5b602002013561022051101515156121e4576308c379a0610240526020610260526030610280527f5769746864726177616c20726573756c74656420696e20666577657220636f696102a0527f6e73207468616e206578706563746564000000000000000000000000000000006102c05261028050608461025cfd5b6102205161014061020051600481106121fc57600080fd5b6020020152610200511515612250576000610240526102408051602001806102808284600060045af161222e57600080fd5b505060006000610280516102a061022051335af161224b57600080fd5b6122b7565b60206102e0604463a9059cbb610240523361026052610220516102805261025c6000610200516004811061228357600080fd5b600060c052602060c02001545af161229a57600080fd5b601f3d116122a757600080fd5b6000506102e0516122b757600080fd5b8151600101808352811415612106575b50506101405161020052610160516102205261018051610240526101a05161026052608036610280376101e0516004358082101561230457600080fd5b8082039050905061030052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d610120610200a260006011556080610140f35b6318a7bd76811415612d48576011541561235d57600080fd5b6001601155600f541561236f57600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613b05565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506101405161016051610180516101a0516101c0516101e05161020051610220516102405160065801613bd3565b61026052610280526102a0526102c0526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101605161028052610180516102a0526101a0516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526102405161036052610140516103805261038051610360516103405161032051610300516102e0516102c0516102a0516102805160065801614265565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526101e05161028052610200516102a052610220516102c052610240516102e05261030060006004818352015b610280610300516004811061258957600080fd5b602002018051600461030051600481106125a257600080fd5b6020020135808210156125b457600080fd5b808203905090508152505b8151600101808352811415612575575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610160516103205261018051610340526101a051610360526101c05161038052610280516103a0526102a0516103c0526102c0516103e0526102e05161040052610140516104205261042051610400516103e0516103c0516103a0516103805161036051610340516103205160065801614265565b61048052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516103005260803661032037600254600480820282158284830414176126ea57600080fd5b80905090509050600c808204905090506103a0526003546103c0526103e060006004818352015b610300516101e06103e0516004811061272957600080fd5b6020020151808202821582848304141761274257600080fd5b8090509050905061026051808061275857600080fd5b820490509050610400526102806103e0516004811061277657600080fd5b602002015161042052600061044052610420516104005111156127b8576104005161042051808210156127a857600080fd5b80820390509050610440526127d9565b6104205161040051808210156127cd57600080fd5b80820390509050610440525b6103a0516104405180820282158284830414176127f557600080fd5b809050905090506402540be400808204905090506103206103e0516004811061281d57600080fd5b602002015260006103c05118156128ab576103e0516004811061283f57600080fd5b600160c052602060c0200180546103206103e0516004811061286057600080fd5b60200201516103c051808202821582848304141761287d57600080fd5b809050905090506402540be400808204905090508181830110156128a057600080fd5b808201905090508155505b6102806103e051600481106128bf57600080fd5b6020020180516103206103e051600481106128d957600080fd5b6020020151808210156128eb57600080fd5b808203905090508152505b8151600101808352811415612711575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e051610160516104005261018051610420526101a051610440526101c0516104605261028051610480526102a0516104a0526102c0516104c0526102e0516104e0526101405161050052610500516104e0516104c0516104a051610480516104605161044051610420516104005160065801614265565b610560526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610560516103e0526005546104005260206104a060046318160ddd6104405261045c610400515afa612a6257600080fd5b601f3d11612a6f57600080fd5b6000506104a05161042052610260516103e05180821015612a8f57600080fd5b80820390509050610420518082028215828483041417612aae57600080fd5b80905090509050610260518080612ac457600080fd5b8204905090506104405260006104405118612ade57600080fd5b6084356104405111151515612b32576308c379a06104605260206104805260146104a0527f536c697070616765207363726577656420796f750000000000000000000000006104c0526104a050606461047cfd5b602061050060446379cc6790610460523361048052610440516104a05261047c6000610400515af1612b6357600080fd5b601f3d11612b7057600080fd5b6000506105005061046060006004818352015b60046104605160048110612b9657600080fd5b6020020135610480526000610480511815612cab576104605160048110612bbc57600080fd5b600060c052602060c02001546104a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104a0511415612c305760006104c0526104c08051602001806105008284600060045af1612c0e57600080fd5b5050600060006105005161052061048051335af1612c2b57600080fd5b612cab565b6020610560604463a9059cbb6104c052336104e05260046104605160048110612c5857600080fd5b6020020135610500526104dc60006104605160048110612c7757600080fd5b600060c052602060c02001545af1612c8e57600080fd5b601f3d11612c9b57600080fd5b60005061056051612cab57600080fd5b8151600101808352811415612b83575b50506080600461046037610320516104e0526103405161050052610360516105205261038051610540526103005161056052610420516104405180821015612d0257600080fd5b8082039050905061058052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610460a261044051600052600060115560206000f35b63cc2b27d7811415612dc85760243580806000811215612d6457195b607f1c15612d7157600080fd5b9050506004356101405260243561016052610160516101405160065801614c27565b6101c0526101e0526101c080808080516102005250506020810190508080805161022052505050506102005160005260206000f35b631a4d01d28114156130b35760115415612de157600080fd5b600160115560243580806000811215612df657195b607f1c15612e0357600080fd5b905050600f5415612e1357600080fd5b604036610140376101405161016051600435610180526024356101a0526101a0516101805160065801614c27565b610200526102205261016052610140526102008080808051610240525050602081019050808080516102605250505050610240805161014052806020015161016052506044356101405110151515612ed8576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b60243560048110612ee857600080fd5b600160c052602060c020018054610160516003548082028215828483041417612f1057600080fd5b809050905090506402540be40080820490509050818183011015612f3357600080fd5b80820190509050815550602061022060446379cc679061018052336101a0526004356101c05261019c60006005545af1612f6c57600080fd5b601f3d11612f7957600080fd5b6000506102205060243560048110612f9057600080fd5b600060c052602060c02001546101805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6101805114156130045760006101a0526101a08051602001806101e08284600060045af1612fe257600080fd5b5050600060006101e05161020061014051335af1612fff57600080fd5b61306a565b6020610240604463a9059cbb6101a052336101c052610140516101e0526101bc60006024356004811061303657600080fd5b600060c052602060c02001545af161304d57600080fd5b601f3d1161305a57600080fd5b6000506102405161306a57600080fd5b6004356101a052610140516101c052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101a0a261014051600052600060115560206000f35b633c157e648114156132545760045433146130cd57600080fd5b600854620151808181830110156130e357600080fd5b808201905090504210156130f657600080fd5b426201518081818301101561310a57600080fd5b80820190509050602435101561311f57600080fd5b610140516006580161396d565b610160526101405261016051610140526004356064808202821582848304141761315557600080fd5b80905090509050610160526000600435111561317857620f42406004351061317b565b60005b61318457600080fd5b610140516101605110156131c7576101405161016051600a80820282158284830414176131b057600080fd5b8090509050905010156131c257600080fd5b6131f7565b61014051600a80820282158284830414176131e157600080fd5b809050905090506101605111156131f757600080fd5b6101405160065561016051600755426008556024356009556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a65888114156132d757600454331461326e57600080fd5b610140516006580161396d565b6101605261014052610160516101405261014051600655610140516007554260085542600955610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a14678114156133935760045433146132f157600080fd5b600a54156132fe57600080fd5b64012a05f200600435111561331257600080fd5b6402540be400602435111561332657600080fd5b426203f48081818301101561333a57600080fd5b808201905090506101405261014051600a55600435600c55602435600d556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9781141561343c57601154156133ac57600080fd5b600160115560045433146133bf57600080fd5b600a544210156133ce57600080fd5b6000600a54186133dd57600080fd5b6000600a55600c5461014052600d546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a16000601155005b63226840fb81141561345d57600454331461345657600080fd5b6000600a55005b636b441a408114156134ef5760043560a01c1561347957600080fd5b600454331461348757600080fd5b600b541561349457600080fd5b426203f4808181830110156134a857600080fd5b808201905090506101405261014051600b55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561357d576011541561350857600080fd5b6001601155600454331461351b57600080fd5b600b5442101561352a57600080fd5b6000600b541861353957600080fd5b6000600b55600e546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a26000601155005b6386fbf19381141561359e57600454331461359757600080fd5b6000600b55005b6330c5408581141561372457601154156135b757600080fd5b600160115560045433146135ca57600080fd5b61014060006004818352015b61014051600481106135e757600080fd5b600160c052602060c02001546101605260006101605118156136e75773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610140516004811061362957600080fd5b600060c052602060c02001541415613680576000610180526101808051602001806101c08284600060045af161365e57600080fd5b5050600060006101c0516101e061016051335af161367b57600080fd5b6136e7565b6020610220604463a9059cbb61018052336101a052610160516101c05261019c600061014051600481106136b357600080fd5b600060c052602060c02001545af16136ca57600080fd5b601f3d116136d757600080fd5b600050610220516136e757600080fd5b81516001018083528114156135d6575b5050600160c052602060c02060008155600060018201556000600282015560006003820155506000601155005b63524c390181141561377b576011541561373d57600080fd5b6001601155600454331461375057600080fd5b600160c052602060c02060008155600060018201556000600282015560006003820155506000601155005b63e36988538114156137aa57600454331461379557600080fd5b42601054116137a357600080fd5b6001600f55005b633046f9728114156137cb5760045433146137c457600080fd5b6000600f55005b63c66106578114156137fc57600435600481106137e757600080fd5b600060c052602060c020015460005260206000f35b63e2e7d26481141561382d576004356004811061381857600080fd5b600160c052602060c020015460005260206000f35b63ddca3f438114156138455760025460005260206000f35b63fee3f7f981141561385d5760035460005260206000f35b638da5cb5b8114156138755760045460005260206000f35b6382c6306681141561388d5760055460005260206000f35b635409491a8114156138a55760065460005260206000f35b63b4b577ad8114156138bd5760075460005260206000f35b632081066c8114156138d55760085460005260206000f35b63140522888114156138ed5760095460005260206000f35b63405e28f881141561390557600a5460005260206000f35b63e0a0b58681141561391d57600b5460005260206000f35b6358680d0b81141561393557600c5460005260206000f35b63e382446281141561394d57600d5460005260206000f35b631ec0cdc181141561396557600e5460005260206000f35b505b60006000fd5b61014052600954610160526007546101805261016051421015613af3576006546101a0526008546101c0526101a051610180511115613a4d576101a051610180516101a051808210156139bf57600080fd5b80820390509050426101c051808210156139d857600080fd5b8082039050905080820282158284830414176139f357600080fd5b80905090509050610160516101c05180821015613a0f57600080fd5b808203905090508080613a2157600080fd5b820490509050818183011015613a3657600080fd5b808201905090506000526000516101405156613aee565b6101a0516101a0516101805180821015613a6657600080fd5b80820390509050426101c05180821015613a7f57600080fd5b808203905090508082028215828483041417613a9a57600080fd5b80905090509050610160516101c05180821015613ab657600080fd5b808203905090508080613ac857600080fd5b82049050905080821015613adb57600080fd5b8082039050905060005260005161014051565b613b03565b6101805160005260005161014051565b005b61014052670de0b6b3a764000061016052670de0b6b3a764000061018052670de0b6b3a76400006101a0526020610220600463e6aa216c6101c0526101dc6003600060c052602060c02001545afa613b5c57600080fd5b601f3d11613b6957600080fd5b60005061022051610240526101605161028052610180516102a0526101a0516102c052610240516102e0526080610260525b600061026051111515613bad57613bc9565b6020610260510361028001516020610260510361026052613b9b565b6101405156613be2575b61016052600061014052613bfa565b600015613bfa575b6101605261014052600050613bfa565b6080366101803761020060006004818352015b610200511515613c7f57476102005160048110613c2957600080fd5b600160c052602060c020015480821015613c4257600080fd5b808203905090506101405180821015613c5a57600080fd5b808203905090506101806102005160048110613c7557600080fd5b6020020152613d1e565b60206102a060246370a0823161022052306102405261023c6102005160048110613ca857600080fd5b600060c052602060c02001545afa613cbf57600080fd5b601f3d11613ccc57600080fd5b6000506102a0516102005160048110613ce457600080fd5b600160c052602060c020015480821015613cfd57600080fd5b808203905090506101806102005160048110613d1857600080fd5b60200201525b8151600101808352811415613c0d575b50506080610200525b600061020051111515613d4957613d65565b6020610200510361018001516020610200510361020052613d37565b6101605156613d91575b6101e05260006101c0526101405261016052610180526101a052600050613db9565b600015613db9575b6101e0526101405261016052610180526101a0526101c052600050613db9565b6101405161020052610160516102205261018051610240526101a051610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516101c051610300526103005160065801613bea565b61036052610380526103a0526103c0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516102805280602001516102a05280604001516102c05280606001516102e0525061030060006004818352015b6102006103005160048110613eb357600080fd5b60200201516102806103005160048110613ecc57600080fd5b60200201518082028215828483041417613ee557600080fd5b80905090509050670de0b6b3a7640000808204905090506102006103005160048110613f1057600080fd5b60200201525b8151600101808352811415613e9f575b50506080610300525b600061030051111515613f4157613f5d565b6020610300510361020001516020610300510361030052613f2f565b6101e051565b6101e0526101405261016052610180526101a0526101c0526040366102003761026060006004818352015b60206102605102610140015161024052610200805161024051818183011015613fb657600080fd5b808201905090508152505b8151600101808352811415613f8e575b5050610200511515613feb5760006000526000516101e051565b61020051610240526101c0516004808202821582848304141761400d57600080fd5b8090509050905061026052610280600060ff818352015b610240516102a0526102e060006004818352015b60206102e0510261014001516102c0526102a05161024051808202821582848304141761406457600080fd5b809050905090506102c0516004808202821582848304141761408557600080fd5b80905090509050808061409757600080fd5b8204905090506102a0525b8151600101808352811415614038575b50506102405161022052610260516102005180820282158284830414176140d857600080fd5b809050905090506064808204905090506102a0516004808202821582848304141761410257600080fd5b8090509050905081818301101561411857600080fd5b8082019050905061024051808202821582848304141761413757600080fd5b809050905090506102605160648082101561415157600080fd5b8082039050905061024051808202821582848304141761417057600080fd5b8090509050905060648082049050905060056102a051808202821582848304141761419a57600080fd5b809050905090508181830110156141b057600080fd5b8082019050905080806141c257600080fd5b82049050905061024052610220516102405111156142165760016102405161022051808210156141f157600080fd5b80820390509050111515614211576102405160005250506000516101e051565b61424d565b600161022051610240518082101561422d57600080fd5b8082039050905011151561424d576102405160005250506000516101e051565b8151600101808352811415614024575b505060006000fd5b610260526101405261016052610180526101a0526101c0526101e0526102005261022052610240526101405161028052610160516102a052610180516102c0526101a0516102e05261030060006004818352015b61028061030051600481106142cd57600080fd5b60200201516101c061030051600481106142e657600080fd5b602002015180820282158284830414176142ff57600080fd5b80905090509050670de0b6b3a764000080820490509050610280610300516004811061432a57600080fd5b60200201525b81516001018083528114156142b9575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161028051610300526102a051610320526102c051610340526102e051610360526102405161038052610380516103605161034051610320516103005160065801613f63565b6103e0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e05160005260005161026051565b610220526101405261016052610180526101a0526101c0526101e0526102005261016051610140511861443d57600080fd5b600061016051121561444e57600080fd5b6004610160511261445e57600080fd5b600061014051121561446f57600080fd5b6004610140511261447f57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516006580161396d565b610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026051610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a051610280526101c0516102a0526101e0516102c052610200516102e0526102405161030052610300516102e0516102c0516102a0516102805160065801613f63565b61036052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161026052610240516004808202821582848304141761459757600080fd5b8090509050905061028052610260516102a0526060366102c03761032060006004818352015b610140516103205114156145d857610180516102e05261460d565b61016051610320511815614608576101a061032051600481106145fa57600080fd5b60200201516102e05261460d565b614689565b6102c080516102e05181818301101561462557600080fd5b808201905090508152506102a05161026051808202821582848304141761464b57600080fd5b809050905090506102e0516004808202821582848304141761466c57600080fd5b80905090509050808061467e57600080fd5b8204905090506102a0525b81516001018083528114156145bd575b50506102a0516102605180820282158284830414176146b757600080fd5b80905090509050606480820282158284830414176146d457600080fd5b8090509050905061028051600480820282158284830414176146f557600080fd5b80905090509050808061470757600080fd5b8204905090506102a0526102c051610260516064808202821582848304141761472f57600080fd5b8090509050905061028051808061474557600080fd5b82049050905081818301101561475a57600080fd5b80820190509050610320526102605161034052610360600060ff818352015b61034051610300526103405161034051808202821582848304141761479d57600080fd5b809050905090506102a0518181830110156147b757600080fd5b8082019050905060026103405180820282158284830414176147d857600080fd5b80905090509050610320518181830110156147f257600080fd5b80820190509050610260518082101561480a57600080fd5b80820390509050808061481c57600080fd5b820490509050610340526103005161034051111561487057600161034051610300518082101561484b57600080fd5b8082039050905011151561486b5761034051600052505060005161022051565b6148a7565b600161030051610340518082101561488757600080fd5b808203905090501115156148a75761034051600052505060005161022051565b8151600101808352811415614779575b505060006000fd5b610220526101405261016052610180526101a0526101c0526101e0526102005260006101605112156148f057600080fd5b6004610160511261490057600080fd5b610140516004808202821582848304141761491a57600080fd5b80905090509050610240526102005161026052606036610280376102e060006004818352015b610160516102e0511815614970576101806102e0516004811061496257600080fd5b60200201516102a052614975565b6149f1565b61028080516102a05181818301101561498d57600080fd5b80820190509050815250610260516102005180820282158284830414176149b357600080fd5b809050905090506102a051600480820282158284830414176149d457600080fd5b8090509050905080806149e657600080fd5b820490509050610260525b8151600101808352811415614940575b505061026051610200518082028215828483041417614a1f57600080fd5b8090509050905060648082028215828483041417614a3c57600080fd5b809050905090506102405160048082028215828483041417614a5d57600080fd5b809050905090508080614a6f57600080fd5b82049050905061026052610280516102005160648082028215828483041417614a9757600080fd5b80905090509050610240518080614aad57600080fd5b820490509050818183011015614ac257600080fd5b808201905090506102e0526102005161030052610320600060ff818352015b610300516102c05261030051610300518082028215828483041417614b0557600080fd5b8090509050905061026051818183011015614b1f57600080fd5b808201905090506002610300518082028215828483041417614b4057600080fd5b809050905090506102e051818183011015614b5a57600080fd5b808201905090506102005180821015614b7257600080fd5b808203905090508080614b8457600080fd5b820490509050610300526102c051610300511115614bd8576001610300516102c05180821015614bb357600080fd5b80820390509050111515614bd35761030051600052505060005161022051565b614c0f565b60016102c0516103005180821015614bef57600080fd5b80820390509050111515614c0f5761030051600052505060005161022051565b8151600101808352811415614ae1575b505060006000fd5b6101805261014052610160526101405161016051610180516101a0516006580161396d565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e051610200516102205160065801613b05565b6102405261026052610280526102a05261022052610200526101e0526101c0526101a05261018052610160526101405261024080516101c05280602001516101e052806040015161020052806060015161022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0516102c0526101e0516102e0526102005161030052610220516103205261032051610300516102e0516102c05160065801613d6f565b610380526103a0526103c0526103e0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038080516102405280602001516102605280604001516102805280606001516102a052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610240516102e052610260516103005261028051610320526102a051610340526101a05161036052610360516103405161032051610300516102e05160065801613f63565b6103c0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c0516102c052602061036060046318160ddd6103005261031c6005545afa614e8e57600080fd5b601f3d11614e9b57600080fd5b600050610360516102e0526102c051610140516102c0518082028215828483041417614ec657600080fd5b809050905090506102e0518080614edc57600080fd5b82049050905080821015614eef57600080fd5b80820390509050610300526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516101a0516103405261016051610360526102405161038052610260516103a052610280516103c0526102a0516103e0526103005161040052610400516103e0516103c0516103a051610380516103605161034051600658016148bf565b6104605261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610460516103205260025460048082028215828483041417614ffc57600080fd5b80905090509050600c808204905090506103405261024051610360526102605161038052610280516103a0526102a0516103c0526103e060006004818352015b600061040052610160516103e05114156150be576102406103e0516004811061506457600080fd5b602002015161030051808202821582848304141761508157600080fd5b809050905090506102c051808061509757600080fd5b82049050905061032051808210156150ae57600080fd5b808203905090506104005261513d565b6102406103e051600481106150d257600080fd5b60200201516102406103e051600481106150eb57600080fd5b602002015161030051808202821582848304141761510857600080fd5b809050905090506102c051808061511e57600080fd5b8204905090508082101561513157600080fd5b80820390509050610400525b6103606103e0516004811061515157600080fd5b6020020180516103405161040051808202821582848304141761517357600080fd5b809050905090506402540be400808204905090508082101561519457600080fd5b808203905090508152505b815160010180835281141561503c575b505061036061016051600481106151c557600080fd5b6020020151610140610400525b610400515160206104005101610400526104006104005110156151f4576151d2565b6101a051610420526101605161044052610360516104605261038051610480526103a0516104a0526103c0516104c052610300516104e0526104e0516104c0516104a05161048051610460516104405161042051600658016148bf565b610540526103e0610400525b61040051526020610400510361040052610140610400511015156152805761525d565b610540518082101561529157600080fd5b808203905090506103e0526101c061016051600481106152b057600080fd5b6020020151610400526103e0516001808210156152cc57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176152f057600080fd5b8090509050905061040051808061530657600080fd5b8204905090506103e052610240610160516004811061532457600080fd5b6020020151610320518082101561533a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761535e57600080fd5b8090509050905061040051808061537457600080fd5b820490509050610420526104806103e0518152610420516103e0518082101561539c57600080fd5b8082039050905081602001525060406104c0525b60006104c0511115156153c2576153de565b60206104c05103610480015160206104c051036104c0526153b0565b6101805156
Loading...
Loading
Loading...
Loading
Net Worth in USD
$11,350.57
Net Worth in ETH
5.760122
Token Allocations
ETH
35.90%
STETH
23.65%
RETH
21.66%
Others
18.79%
Multichain Portfolio | 33 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.