POL Price: $0.218627 (+1.49%)
Gas: 30 GWei
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim_admin_fees441663822023-06-21 11:40:02633 days ago1687347602IN
Curve.fi: ATriCrypto Pool
0 POL0.00838876184.52260522
Claim_admin_fees439013362023-06-14 11:49:25640 days ago1686743365IN
Curve.fi: ATriCrypto Pool
0 POL0.01290579283.88091182
Claim_admin_fees436344832023-06-07 11:49:13647 days ago1686138553IN
Curve.fi: ATriCrypto Pool
0 POL0.00822817180.99008357
Claim_admin_fees433652622023-05-31 11:04:20654 days ago1685531060IN
Curve.fi: ATriCrypto Pool
0 POL0.01105214243.10737001
Claim_admin_fees419791532023-04-26 11:46:47689 days ago1682509607IN
Curve.fi: ATriCrypto Pool
0 POL0.01540859338.93344331
Claim_admin_fees417075322023-04-19 11:04:10696 days ago1681902250IN
Curve.fi: ATriCrypto Pool
0 POL0.01201838264.36101831
Claim_admin_fees414430402023-04-12 11:08:14703 days ago1681297694IN
Curve.fi: ATriCrypto Pool
0 POL0.01023139225.0536717
Claim_admin_fees411702292023-04-05 11:17:44710 days ago1680693464IN
Curve.fi: ATriCrypto Pool
0 POL0.00717777157.88510584
Claim_admin_fees411698762023-04-05 11:04:10710 days ago1680692650IN
Curve.fi: ATriCrypto Pool
0 POL0.00811761178.55817531
Claim_admin_fees408975052023-03-29 11:04:10717 days ago1680087850IN
Curve.fi: ATriCrypto Pool
0 POL0.00652131143.44545829
Claim_admin_fees406364902023-03-22 12:15:52724 days ago1679487352IN
Curve.fi: ATriCrypto Pool
0 POL0.00823787181.20359166
Claim_admin_fees406362062023-03-22 12:04:12724 days ago1679486652IN
Curve.fi: ATriCrypto Pool
0 POL0.00670402147.46425587
Claim_admin_fees403729362023-03-15 12:04:07731 days ago1678881847IN
Curve.fi: ATriCrypto Pool
0 POL0.00913439200.92369368
Claim_admin_fees401072222023-03-08 12:20:34738 days ago1678278034IN
Curve.fi: ATriCrypto Pool
0 POL0.00985184216.70503874
Claim_admin_fees398410872023-03-01 12:08:19745 days ago1677672499IN
Curve.fi: ATriCrypto Pool
0 POL0.00772411169.9026625
Claim_admin_fees395862932023-02-22 12:04:20752 days ago1677067460IN
Curve.fi: ATriCrypto Pool
0 POL0.00922389202.89240002
Claim_admin_fees393194372023-02-15 12:04:31759 days ago1676462671IN
Curve.fi: ATriCrypto Pool
0 POL0.012974285.38131463
Claim_admin_fees390560652023-02-08 12:04:13766 days ago1675857853IN
Curve.fi: ATriCrypto Pool
0 POL0.01695287372.90203767
Claim_admin_fees387824932023-02-01 12:04:05773 days ago1675253045IN
Curve.fi: ATriCrypto Pool
0 POL0.00455284100.1461643
Claim_admin_fees385081902023-01-25 12:08:54780 days ago1674648534IN
Curve.fi: ATriCrypto Pool
0 POL0.0035691178.5076839
Claim_admin_fees382300372023-01-18 12:04:30787 days ago1674043470IN
Curve.fi: ATriCrypto Pool
0 POL0.0033185872.99696738
Claim_admin_fees379422722023-01-11 12:04:09794 days ago1673438649IN
Curve.fi: ATriCrypto Pool
0 POL0.0042327393.10498309
Claim_admin_fees376598582023-01-04 11:07:41801 days ago1672830461IN
Curve.fi: ATriCrypto Pool
0 POL0.0043173894.9669224
Claim_admin_fees373782402022-12-28 12:04:18808 days ago1672229058IN
Curve.fi: ATriCrypto Pool
0 POL0.0030554367.20859773
Claim_admin_fees370974482022-12-21 12:16:35815 days ago1671624995IN
Curve.fi: ATriCrypto Pool
0 POL0.00516564113.62559395
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
default evmVersion, None license

Contract Source Code (Vyper language format)

# @version 0.2.12
# (c) Curve.Fi, 2021
# Pool for am3Crv(USD)/BTC/ETH or similar
from vyper.interfaces import ERC20

interface CurveToken:
    def totalSupply() -> uint256: view
    def mint(_to: address, _value: uint256) -> bool: nonpayable
    def mint_relative(_to: address, frac: uint256) -> uint256: nonpayable
    def burnFrom(_to: address, _value: uint256) -> bool: nonpayable


interface Math:
    def geometric_mean(unsorted_x: uint256[N_COINS]) -> uint256: view
    def reduction_coefficient(x: uint256[N_COINS], fee_gamma: uint256) -> uint256: view
    def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256: view
    def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256: view
    def halfpow(power: uint256, precision: uint256) -> uint256: view
    def sqrt_int(x: uint256) -> uint256: view


interface Views:
    def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256: view
    def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256: view


# Events
event TokenExchange:
    buyer: indexed(address)
    sold_id: uint256
    tokens_sold: uint256
    bought_id: uint256
    tokens_bought: uint256

event AddLiquidity:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    fee: uint256
    token_supply: uint256

event RemoveLiquidity:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    token_supply: uint256

event RemoveLiquidityOne:
    provider: indexed(address)
    token_amount: uint256
    coin_index: uint256
    coin_amount: uint256

event CommitNewAdmin:
    deadline: indexed(uint256)
    admin: indexed(address)

event NewAdmin:
    admin: indexed(address)

event CommitNewParameters:
    deadline: indexed(uint256)
    admin_fee: uint256
    mid_fee: uint256
    out_fee: uint256
    fee_gamma: uint256
    price_threshold: uint256
    adjustment_step: uint256
    ma_half_time: uint256

event NewParameters:
    admin_fee: uint256
    mid_fee: uint256
    out_fee: uint256
    fee_gamma: uint256
    price_threshold: uint256
    adjustment_step: uint256
    ma_half_time: uint256

event RampAgamma:
    initial_A: uint256
    future_A: uint256
    initial_time: uint256
    future_time: uint256

event StopRampA:
    current_A: uint256
    current_gamma: uint256
    time: uint256

event ClaimAdminFee:
    admin: indexed(address)
    tokens: uint256


N_COINS: constant(int128) = 3  # <- change
FEE_DENOMINATOR: constant(uint256) = 10 ** 10
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
A_MULTIPLIER: constant(uint256) = 100

# These addresses are replaced by the deployer
math: constant(address) = 0x1689aCD208d817B32eEAcCcE8121278c5766F530
token: constant(address) = 0x8096ac61db23291252574D49f036f0f9ed8ab390
views: constant(address) = 0x3c0EbfF09d6bB028EeD1Dd29669c2E3bf98C9D7f
coins: constant(address[N_COINS]) = [
    0xE7a24EF0C5e95Ffb0f6684b813A78F2a3AD7D171,  # am3crv
    0x5c2ed810328349100A66B82b78a1791B101C9D61,  # amWBTC
    0x28424507fefb6f7f8E9D3860F56504E4e5f5f390,  # amWETH
]

price_scale_packed: uint256   # Internal price scale
price_oracle_packed: uint256  # Price target given by MA

last_prices_packed: uint256
last_prices_timestamp: public(uint256)

initial_A_gamma: public(uint256)
future_A_gamma: public(uint256)
initial_A_gamma_time: public(uint256)
future_A_gamma_time: public(uint256)

price_threshold: public(uint256)
future_price_threshoold: public(uint256)

fee_gamma: public(uint256)
future_fee_gamma: public(uint256)

adjustment_step: public(uint256)
future_adjustment_step: public(uint256)

ma_half_time: public(uint256)
future_ma_half_time: public(uint256)

mid_fee: public(uint256)
out_fee: public(uint256)
admin_fee: public(uint256)
future_mid_fee: public(uint256)
future_out_fee: public(uint256)
future_admin_fee: public(uint256)

balances: public(uint256[N_COINS])
D: public(uint256)

owner: public(address)
future_owner: public(address)

xcp_profit: public(uint256)
xcp_profit_a: public(uint256)  # Full profit at last claim of admin fees
virtual_price: public(uint256)  # Cached (fast to read) virtual price also used internally

is_killed: public(bool)
kill_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
admin_actions_deadline: public(uint256)

reward_receiver: public(address)
admin_fee_receiver: public(address)

KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400
ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400

MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MIN_FEE: constant(uint256) = 5 * 10 ** 5  # 0.5 bps
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10000 * A_MULTIPLIER
MAX_A_CHANGE: constant(uint256) = 10
MIN_GAMMA: constant(uint256) = 10**10
MAX_GAMMA: constant(uint256) = 10**16
NOISE_FEE: constant(uint256) = 10**5  # 0.1 bps

PRICE_SIZE: constant(int128) = 256 / (N_COINS-1)
PRICE_MASK: constant(uint256) = 2**PRICE_SIZE - 1

# This must be changed for different N_COINS
# For example:
# N_COINS = 3 -> 1  (10**18 -> 10**18)
# N_COINS = 4 -> 10**8  (10**18 -> 10**10)
# PRICE_PRECISION_MUL: constant(uint256) = 1
PRECISIONS: constant(uint256[N_COINS]) = [
    1, # am3crv
    10**10, # WBTC
    1, # WETH
]


# Matic extras. Not needed on Ethereum!
MATIC_REWARDS: constant(address) = 0x357D51124f59836DeD84c8a1730D72B749d8BC23
WMATIC: constant(address) = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270


@external
def __init__(
    owner: address,
    A: uint256,
    gamma: uint256,
    mid_fee: uint256,
    out_fee: uint256,
    price_threshold: uint256,
    fee_gamma: uint256,
    adjustment_step: uint256,
    admin_fee: uint256,
    ma_half_time: uint256,
    initial_prices: uint256[N_COINS-1]
):
    self.owner = owner

    # Pack A and gamma:
    # shifted A + gamma
    A_gamma: uint256 = shift(A * A_MULTIPLIER, 128)
    A_gamma = bitwise_or(A_gamma, gamma)
    self.initial_A_gamma = A_gamma
    self.future_A_gamma = A_gamma

    self.mid_fee = mid_fee
    self.out_fee = out_fee
    self.price_threshold = price_threshold
    self.fee_gamma = fee_gamma
    self.adjustment_step = adjustment_step
    self.admin_fee = admin_fee

    # Packing prices
    packed_prices: uint256 = 0
    for k in range(N_COINS-1):
        packed_prices = shift(packed_prices, PRICE_SIZE)
        p: uint256 = initial_prices[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
        assert p < PRICE_MASK
        packed_prices = bitwise_or(p, packed_prices)

    self.price_scale_packed = packed_prices
    self.price_oracle_packed = packed_prices
    self.last_prices_packed = packed_prices
    self.last_prices_timestamp = block.timestamp
    self.ma_half_time = ma_half_time

    self.xcp_profit_a = 10**18

    self.kill_deadline = block.timestamp + KILL_DEADLINE_DT

    self.admin_fee_receiver = msg.sender


@internal
@view
def _packed_view(k: uint256, p: uint256) -> uint256:
    assert k < N_COINS-1
    return bitwise_and(
        shift(p, -PRICE_SIZE * convert(k, int128)),
        PRICE_MASK
    )  # * PRICE_PRECISION_MUL


@external
@view
def price_oracle(k: uint256) -> uint256:
    return self._packed_view(k, self.price_oracle_packed)


@external
@view
def price_scale(k: uint256) -> uint256:
    return self._packed_view(k, self.price_scale_packed)


@external
@view
def last_prices(k: uint256) -> uint256:
    return self._packed_view(k, self.last_prices_packed)


@external
@view
def token() -> address:
    return token


@external
@view
def coins(i: uint256) -> address:
    _coins: address[N_COINS] = coins
    return _coins[i]


@internal
@view
def xp() -> uint256[N_COINS]:
    result: uint256[N_COINS] = self.balances
    packed_prices: uint256 = self.price_scale_packed

    precisions: uint256[N_COINS] = PRECISIONS

    result[0] *= precisions[0]
    for i in range(1, N_COINS):
        p: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i]  # * PRICE_PRECISION_MUL
        result[i] = result[i] * p / PRECISION
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    return result


@view
@internal
def _A_gamma() -> (uint256, uint256):
    t1: uint256 = self.future_A_gamma_time

    A_gamma_1: uint256 = self.future_A_gamma
    gamma1: uint256 = bitwise_and(A_gamma_1, 2**128-1)
    A1: uint256 = shift(A_gamma_1, -128)

    if block.timestamp < t1:
        # handle ramping up and down of A
        A_gamma_0: uint256 = self.initial_A_gamma
        t0: uint256 = self.initial_A_gamma_time

        # Less readable but more compact way of writing and converting to uint256
        # gamma0: uint256 = bitwise_and(A_gamma_0, 2**128-1)
        # A0: uint256 = shift(A_gamma_0, -128)
        # A1 = A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
        # gamma1 = gamma0 + (gamma1 - gamma0) * (block.timestamp - t0) / (t1 - t0)

        t1 -= t0
        t0 = block.timestamp - t0

        A1 = (shift(A_gamma_0, -128) * (t1 - t0) + A1 * t0) / t1
        gamma1 = (bitwise_and(A_gamma_0, 2**128-1) * (t1 - t0) + gamma1 * t0) / t1

    return A1, gamma1


@view
@external
def A() -> uint256:
    return self._A_gamma()[0] / A_MULTIPLIER


@view
@external
def gamma() -> uint256:
    return self._A_gamma()[1]


@view
@external
def A_precise() -> uint256:
    return self._A_gamma()[0]


@internal
@view
def _fee(xp: uint256[N_COINS]) -> uint256:
    f: uint256 = Math(math).reduction_coefficient(xp, self.fee_gamma)
    return (self.mid_fee * f + self.out_fee * (10**18 - f)) / 10**18


@external
@view
def fee() -> uint256:
    return self._fee(self.xp())


@external
@view
def fee_calc(xp: uint256[N_COINS]) -> uint256:
    return self._fee(xp)


@internal
@view
def get_xcp(D: uint256) -> uint256:
    x: uint256[N_COINS] = empty(uint256[N_COINS])
    x[0] = D / N_COINS
    packed_prices: uint256 = self.price_scale_packed
    # No precisions here because we don't switch to "real" units

    for i in range(1, N_COINS):
        x[i] = D * 10**18 / (N_COINS * bitwise_and(packed_prices, PRICE_MASK))  # ... * PRICE_PRECISION_MUL)
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    return Math(math).geometric_mean(x)


@external
@view
def get_virtual_price() -> uint256:
    return 10**18 * self.get_xcp(self.D) / CurveToken(token).totalSupply()


@internal
def _claim_admin_fees():
    receiver: address = self.admin_fee_receiver

    xcp_profit: uint256 = self.xcp_profit
    vprice: uint256 = self.virtual_price
    fees: uint256 = (xcp_profit - self.xcp_profit_a) * self.admin_fee / (2 * 10**10)

    if fees > 0:
        # Would be nice to recalc D, but we have no bytespace left

        frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18
        claimed: uint256 = CurveToken(token).mint_relative(receiver, frac)
        total_supply: uint256 = CurveToken(token).totalSupply()

        # Gulp here
        _coins: address[N_COINS] = coins
        for i in range(N_COINS):
            self.balances[i] = ERC20(_coins[i]).balanceOf(self)

        # Recalculate D b/c we gulped
        A: uint256 = 0
        gamma: uint256 = 0
        A, gamma = self._A_gamma()
        xp: uint256[N_COINS] = self.xp()
        D: uint256 = Math(math).newton_D(A, gamma, xp)

        new_vprice: uint256 = 10**18 * self.get_xcp(D) / total_supply
        self.virtual_price = new_vprice

        xcp_profit = new_vprice + xcp_profit - vprice
        self.xcp_profit_a = xcp_profit
        self.xcp_profit = xcp_profit

        log ClaimAdminFee(receiver, claimed)

    # push wMatic rewards into the reward receiver
    receiver = self.reward_receiver
    if receiver != ZERO_ADDRESS:
        response: Bytes[32] = raw_call(
            MATIC_REWARDS,
            concat(
                method_id("claimRewards(address[],uint256,address)"),
                convert(32 * 3, bytes32),
                convert(MAX_UINT256, bytes32),
                convert(self, bytes32),
                convert(2, bytes32),
                convert(coins[1], bytes32),
                convert(coins[2], bytes32),
            ),
            max_outsize=32
        )
        # can do if amount > 0, but here we try to save space rather than anything else
        # assert might be needed for some tokens - removed one to save bytespace
        ERC20(WMATIC).transfer(receiver, convert(response, uint256))


@internal
def tweak_price(A: uint256, gamma: uint256,
                _xp: uint256[N_COINS], i: uint256, p_i: uint256,
                new_D: uint256 = 0):
    # Update MA if needed
    price_oracle: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    packed_prices: uint256 = self.price_oracle_packed
    for k in range(N_COINS-1):
        price_oracle[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    last_prices_timestamp: uint256 = self.last_prices_timestamp
    last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    packed_prices = self.last_prices_packed
    for k in range(N_COINS-1):
        last_prices[k] = bitwise_and(packed_prices, PRICE_MASK)   # * PRICE_PRECISION_MUL
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    if last_prices_timestamp < block.timestamp:
        # MA update required
        ma_half_time: uint256 = self.ma_half_time
        alpha: uint256 = Math(math).halfpow((block.timestamp - last_prices_timestamp) * 10**18 / ma_half_time, 10**10)
        packed_prices = 0
        for k in range(N_COINS-1):
            price_oracle[k] = (last_prices[k] * (10**18 - alpha) + price_oracle[k] * alpha) / 10**18
        for k in range(N_COINS-1):
            packed_prices = shift(packed_prices, PRICE_SIZE)
            p: uint256 = price_oracle[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
            assert p < PRICE_MASK
            packed_prices = bitwise_or(p, packed_prices)
        self.price_oracle_packed = packed_prices
        self.last_prices_timestamp = block.timestamp

    D_unadjusted: uint256 = new_D  # Withdrawal methods know new D already
    if new_D == 0:
        # We will need this a few times (35k gas)
        D_unadjusted = Math(math).newton_D(A, gamma, _xp)
    packed_prices = self.price_scale_packed
    price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    for k in range(N_COINS-1):
        price_scale[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    if p_i > 0:
        # Save the last price
        if i > 0:
            last_prices[i-1] = p_i
        else:
            # If 0th price changed - change all prices instead
            for k in range(N_COINS-1):
                last_prices[k] = last_prices[k] * 10**18 / p_i
    else:
        # calculate real prices
        # it would cost 70k gas for a 3-token pool. Sad. How do we do better?
        __xp: uint256[N_COINS] = _xp
        dx_price: uint256 = __xp[0] / 10**6
        __xp[0] += dx_price
        for k in range(N_COINS-1):
            last_prices[k] = price_scale[k] * dx_price / (_xp[k+1] - Math(math).newton_y(A, gamma, __xp, D_unadjusted, k+1))

    packed_prices = 0
    for k in range(N_COINS-1):
        packed_prices = shift(packed_prices, PRICE_SIZE)
        p: uint256 = last_prices[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
        assert p < PRICE_MASK
        packed_prices = bitwise_or(p, packed_prices)
    self.last_prices_packed = packed_prices

    norm: uint256 = 0
    total_supply: uint256 = CurveToken(token).totalSupply()
    old_xcp_profit: uint256 = self.xcp_profit
    old_virtual_price: uint256 = self.virtual_price
    for k in range(N_COINS-1):
        ratio: uint256 = price_oracle[k] * 10**18 / price_scale[k]
        if ratio > 10**18:
            ratio -= 10**18
        else:
            ratio = 10**18 - ratio
        norm += ratio**2

    # Update profit numbers without price adjustment first
    xp: uint256[N_COINS] = empty(uint256[N_COINS])
    xp[0] = D_unadjusted / N_COINS
    for k in range(N_COINS-1):
        xp[k+1] = D_unadjusted * 10**18 / (N_COINS * price_scale[k])
    xcp_profit: uint256 = 10**18
    virtual_price: uint256 = 10**18

    if old_virtual_price > 0:
        xcp: uint256 = Math(math).geometric_mean(xp)
        virtual_price = 10**18 * xcp / total_supply
        xcp_profit = old_xcp_profit * virtual_price / old_virtual_price

        if virtual_price < old_virtual_price:
            raise "Loss"

    self.xcp_profit = xcp_profit

    # self.price_threshold must be > self.adjustment_step
    # should we pause for a bit if profit wasn't enough to not spend this gas every time?
    if norm > self.price_threshold ** 2 and old_virtual_price > 0:
        norm = Math(math).sqrt_int(norm / 10**18)  # Need to convert to 1e18 units!
        adjustment_step: uint256 = self.adjustment_step

        p_new: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
        for k in range(N_COINS-1):
            p_new[k] = (price_scale[k] * (norm - adjustment_step) + adjustment_step * price_oracle[k]) / norm

        # Calculate balances*prices
        xp = _xp
        for k in range(N_COINS-1):
            xp[k+1] = _xp[k+1] * p_new[k] / price_scale[k]

        # Calculate "extended constant product" invariant xCP and virtual price
        D: uint256 = Math(math).newton_D(A, gamma, xp)
        xp[0] = D / N_COINS
        for k in range(N_COINS-1):
            xp[k+1] = D * 10**18 / (N_COINS * p_new[k])
        # We reuse old_virtual_price here but it's not old anymore
        old_virtual_price = 10**18 * Math(math).geometric_mean(xp) / total_supply

        # Proceed if we've got enough profit
        if (old_virtual_price > 10**18) and (2 * (old_virtual_price - 10**18) > xcp_profit - 10**18):
            packed_prices = 0
            for k in range(N_COINS-1):
                packed_prices = shift(packed_prices, PRICE_SIZE)
                p: uint256 = p_new[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
                assert p < PRICE_MASK
                packed_prices = bitwise_or(p, packed_prices)
            self.price_scale_packed = packed_prices
            self.D = D
            self.virtual_price = old_virtual_price

            # XXX Remove for non-Matic
            self._claim_admin_fees()
            return

        # else - make a delay?

    # If we are here, the price_scale adjustment did not happen
    # Still need to update the profit counter and D
    self.D = D_unadjusted
    self.virtual_price = virtual_price

    # XXX Remove for non-Matic
    self._claim_admin_fees()


@external
@nonreentrant('lock')
def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256):
    assert not self.is_killed  # dev: the pool is killed
    assert i != j and i < N_COINS and j < N_COINS  # dev: coin index out of range
    assert dx > 0  # dev: do not exchange 0 coins

    A: uint256 = 0
    gamma: uint256 = 0
    A, gamma = self._A_gamma()

    _coins: address[N_COINS] = coins

    # assert might be needed for some tokens - removed one to save bytespace
    ERC20(_coins[i]).transferFrom(msg.sender, self, dx)

    price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    if True:  # scope to clear packed_prices
        packed_prices: uint256 = self.price_scale_packed
        for k in range(N_COINS-1):
            price_scale[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
            packed_prices = shift(packed_prices, -PRICE_SIZE)

    xp: uint256[N_COINS] = self.balances
    y: uint256 = xp[j]
    xp[i] += dx
    self.balances[i] = xp[i]
    precisions: uint256[N_COINS] = PRECISIONS
    xp[0] *= precisions[0]
    for k in range(1, N_COINS):
        xp[k] = xp[k] * price_scale[k-1] * precisions[k] / PRECISION

    dy: uint256 = xp[j] - Math(math).newton_y(A, gamma, xp, self.D, j)
    # Not defining new "y" here to have less variables / make subsequent calls cheaper
    xp[j] -= dy
    dy -= 1

    if j > 0:
        dy = dy * PRECISION / price_scale[j-1]
    dy /= precisions[j]
    dy -= self._fee(xp) * dy / 10**10
    assert dy >= min_dy, "Slippage"
    y -= dy

    self.balances[j] = y
    # assert might be needed for some tokens - removed one to save bytespace
    ERC20(_coins[j]).transfer(msg.sender, dy)

    xp[j] = y * precisions[j]
    if j > 0:
        xp[j] = xp[j] * price_scale[j-1] / PRECISION

    # Calculate price
    p: uint256 = 0
    ix: uint256 = j
    if dx > 10**5 and dy > 10**5:
        if i != 0 and j != 0:
            p = bitwise_and(
                shift(self.last_prices_packed, -PRICE_SIZE * convert(i-1, int128)),
                PRICE_MASK
            ) * (dx * precisions[i]) / (dy * precisions[j])  # * PRICE_PRECISION_MUL
        elif i == 0:
            p = (dx * precisions[i]) * 10**18 / (dy * precisions[j])
        else:  # j == 0
            p = (dy * precisions[j]) * 10**18 / (dx * precisions[i])
            ix = i

    self.tweak_price(A, gamma, xp, ix, p)

    log TokenExchange(msg.sender, i, dx, j, dy)


@external
@view
def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256:
    return Views(views).get_dy(i, j, dx)


@view
@internal
def _calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256:
    # fee = sum(amounts_i - avg(amounts)) * fee' / sum(amounts)
    fee: uint256 = self._fee(xp) * N_COINS / (4 * (N_COINS-1))
    S: uint256 = 0
    for _x in amounts:
        S += _x
    avg: uint256 = S / N_COINS
    Sdiff: uint256 = 0
    for _x in amounts:
        if _x > avg:
            Sdiff += _x - avg
        else:
            Sdiff += avg - _x
    return fee * Sdiff / S + NOISE_FEE


@external
@view
def calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256:
    return self._calc_token_fee(amounts, xp)


@external
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
    assert not self.is_killed  # dev: the pool is killed

    A: uint256 = 0
    gamma: uint256 = 0
    A, gamma = self._A_gamma()

    _coins: address[N_COINS] = coins

    xp: uint256[N_COINS] = self.balances
    amountsp: uint256[N_COINS] = amounts
    xx: uint256[N_COINS] = empty(uint256[N_COINS])

    if True:  # Scope to avoid having extra variables in memory later
        n_coins_added: uint256 = 0
        for i in range(N_COINS):
            if amounts[i] > 0:
                # assert might be needed for some tokens - removed one to save bytespace
                ERC20(_coins[i]).transferFrom(msg.sender, self, amounts[i])
                n_coins_added += 1
        assert n_coins_added > 0  # dev: no coins to add

        for i in range(N_COINS):
            bal: uint256 = xp[i] + amounts[i]
            xp[i] = bal
            self.balances[i] = bal
        xx = xp

        precisions: uint256[N_COINS] = PRECISIONS
        packed_prices: uint256 = self.price_scale_packed
        xp[0] *= precisions[0]
        for i in range(1, N_COINS):
            price_scale: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i]  # * PRICE_PRECISION_MUL
            xp[i] = xp[i] * price_scale / PRECISION
            amountsp[i] = amountsp[i] * price_scale / PRECISION
            packed_prices = shift(packed_prices, -PRICE_SIZE)

    D: uint256 = Math(math).newton_D(A, gamma, xp)

    token_supply: uint256 = CurveToken(token).totalSupply()
    old_D: uint256 = self.D
    d_token: uint256 = 0
    if old_D > 0:
        d_token = token_supply * D / old_D - token_supply
    else:
        d_token = self.get_xcp(D)  # making initial virtual price equal to 1
    assert d_token > 0  # dev: nothing minted

    d_token_fee: uint256 = 0
    if old_D > 0:
        d_token_fee = self._calc_token_fee(amountsp, xp) * d_token / 10**10 + 1
        d_token -= d_token_fee
        token_supply += d_token
        CurveToken(token).mint(msg.sender, d_token)

        # Calculate price
        # p_i * (dx_i - dtoken / token_supply * xx_i) = sum{k!=i}(p_k * (dtoken / token_supply * xx_k - dx_k))
        # Only ix is nonzero
        p: uint256 = 0
        ix: uint256 = 0
        if d_token > 10**5:
            n_zeros: uint256 = 0
            for i in range(N_COINS):
                if amounts[i] == 0:
                    n_zeros += 1
                else:
                    ix = i
            if n_zeros == N_COINS-1:
                S: uint256 = 0
                last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
                packed_prices: uint256 = self.last_prices_packed
                precisions: uint256[N_COINS] = PRECISIONS
                for k in range(N_COINS-1):
                    last_prices[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
                    packed_prices = shift(packed_prices, -PRICE_SIZE)
                for i in range(N_COINS):
                    if i != ix:
                        if i == 0:
                            S += xx[0] * precisions[0]
                        else:
                            S += xx[i] * last_prices[i-1] * precisions[i] / PRECISION
                S = S * d_token / token_supply
                p = S * PRECISION / (amounts[ix] * precisions[ix] - d_token * xx[ix] * precisions[ix] / token_supply)

        self.tweak_price(A, gamma, xp, ix, p, D)

    else:
        self.D = D
        self.virtual_price = 10**18
        self.xcp_profit = 10**18
        assert CurveToken(token).mint(msg.sender, d_token)

    assert d_token >= min_mint_amount, "Slippage"

    log AddLiquidity(msg.sender, amounts, d_token_fee, token_supply)


@external
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
    """
    This withdrawal method is very safe, does no complex math
    """
    _coins: address[N_COINS] = coins
    total_supply: uint256 = CurveToken(token).totalSupply()
    assert CurveToken(token).burnFrom(msg.sender, _amount)
    balances: uint256[N_COINS] = self.balances
    amount: uint256 = _amount - 1  # Make rounding errors favoring other LPs a tiny bit

    for i in range(N_COINS):
        d_balance: uint256 = balances[i] * amount / total_supply
        assert d_balance >= min_amounts[i]
        self.balances[i] = balances[i] - d_balance
        balances[i] = d_balance  # now it's the amounts going out
        # assert might be needed for some tokens - removed one to save bytespace
        ERC20(_coins[i]).transfer(msg.sender, d_balance)

    D: uint256 = self.D
    self.D = D - D * amount / total_supply

    log RemoveLiquidity(msg.sender, balances, total_supply - _amount)


@view
@external
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256:
    return Views(views).calc_token_amount(amounts, deposit)


@internal
@view
def _calc_withdraw_one_coin(A: uint256, gamma: uint256, token_amount: uint256, i: uint256,
                            calc_price: bool) -> (uint256, uint256, uint256, uint256[N_COINS]):
    D: uint256 = self.D
    D0: uint256 = D
    token_supply: uint256 = CurveToken(token).totalSupply()
    assert token_amount <= token_supply  # dev: token amount more than supply
    assert i < N_COINS  # dev: coin out of range

    xx: uint256[N_COINS] = self.balances
    xp: uint256[N_COINS] = PRECISIONS

    price_scale_i: uint256 = PRECISION * xp[0]
    if True:  # To remove oacked_prices from memory
        packed_prices: uint256 = self.price_scale_packed
        xp[0] *= xx[0]
        for k in range(1, N_COINS):
            p: uint256 = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
            if i == k:
                price_scale_i = p * xp[i]
            xp[k] = xp[k] * xx[k] * p / PRECISION
            packed_prices = shift(packed_prices, -PRICE_SIZE)

    # Charge the fee on D, not on y, e.g. reducing invariant LESS than charging the user
    fee: uint256 = self._fee(xp)
    dD: uint256 = token_amount * D / token_supply
    D -= (dD - (fee * dD / (2 * 10**10) + 1))
    y: uint256 = Math(math).newton_y(A, gamma, xp, D, i)
    dy: uint256 = (xp[i] - y) * PRECISION / price_scale_i
    xp[i] = y

    # Price calc
    p: uint256 = 0
    if calc_price and dy > 10**5 and token_amount > 10**5:
        # p_i = dD / D0 * sum'(p_k * x_k) / (dy - dD / D0 * y0)
        S: uint256 = 0
        precisions: uint256[N_COINS] = PRECISIONS
        last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
        packed_prices: uint256 = self.last_prices_packed
        for k in range(N_COINS-1):
            last_prices[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
            packed_prices = shift(packed_prices, -PRICE_SIZE)
        for k in range(N_COINS):
            if k != i:
                if k == 0:
                    S += xx[0] * precisions[0]
                else:
                    S += xx[k] * last_prices[k-1] * precisions[k] / PRECISION
        S = S * dD / D0
        p = S * PRECISION / (dy * precisions[i] - dD * xx[i] * precisions[i] / D0)

    return dy, p, D, xp


@view
@external
def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256:
    A: uint256 = 0
    gamma: uint256 = 0
    A, gamma = self._A_gamma()
    return self._calc_withdraw_one_coin(A, gamma, token_amount, i, False)[0]


@external
@nonreentrant('lock')
def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256):
    assert not self.is_killed  # dev: the pool is killed

    A: uint256 = 0
    gamma: uint256 = 0
    A, gamma = self._A_gamma()

    dy: uint256 = 0
    D: uint256 = 0
    p: uint256 = 0
    xp: uint256[N_COINS] = empty(uint256[N_COINS])
    dy, p, D, xp = self._calc_withdraw_one_coin(A, gamma, token_amount, i, True)
    assert dy >= min_amount, "Slippage"

    self.balances[i] -= dy
    assert CurveToken(token).burnFrom(msg.sender, token_amount)
    if True:  # Remove _coins from the scope
        _coins: address[N_COINS] = coins
        # assert might be needed for some tokens - removed one to save bytespace
        ERC20(_coins[i]).transfer(msg.sender, dy)

    self.tweak_price(A, gamma, xp, i, p, D)

    log RemoveLiquidityOne(msg.sender, token_amount, i, dy)


@external
@nonreentrant('lock')
def claim_admin_fees():
    self._claim_admin_fees()


# Admin parameters
@external
def ramp_A_gamma(future_A: uint256, future_gamma: uint256, future_time: uint256):
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp > self.initial_A_gamma_time + (MIN_RAMP_TIME-1)
    assert future_time > block.timestamp + (MIN_RAMP_TIME-1)  # dev: insufficient time

    initial_A: uint256 = 0
    initial_gamma: uint256 = 0
    initial_A, initial_gamma = self._A_gamma()
    initial_A_gamma: uint256 = shift(initial_A, 128)
    initial_A_gamma = bitwise_or(initial_A_gamma, initial_gamma)

    future_A_p: uint256 = future_A * A_MULTIPLIER

    assert future_A > 0 and future_A < MAX_A
    assert future_gamma > MIN_GAMMA-1 and future_gamma < MAX_GAMMA+1
    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_gamma = initial_A_gamma
    self.initial_A_gamma_time = block.timestamp

    future_A_gamma: uint256 = shift(future_A_p, 128)
    future_A_gamma = bitwise_or(future_A_gamma, future_gamma)
    self.future_A_gamma_time = future_time
    self.future_A_gamma = future_A_gamma

    log RampAgamma(initial_A, future_A_p, block.timestamp, future_time)


@external
def stop_ramp_A_gamma():
    assert msg.sender == self.owner  # dev: only owner

    current_A: uint256 = 0
    current_gamma: uint256 = 0
    current_A, current_gamma = self._A_gamma()
    current_A_gamma: uint256 = shift(current_A, 128)
    current_A_gamma = bitwise_or(current_A_gamma, current_gamma)
    self.initial_A_gamma = current_A_gamma
    self.future_A_gamma = current_A_gamma
    self.initial_A_gamma_time = block.timestamp
    self.future_A_gamma_time = block.timestamp
    # now (block.timestamp < t1) is always False, so we return saved A

    log StopRampA(current_A, current_gamma, block.timestamp)


@external
def commit_new_parameters(
    _new_mid_fee: uint256,
    _new_out_fee: uint256,
    _new_admin_fee: uint256,
    _new_fee_gamma: uint256,
    _new_price_threshold: uint256,
    _new_adjustment_step: uint256,
    _new_ma_half_time: uint256,
    ):
    assert msg.sender == self.owner  # dev: only owner
    assert self.admin_actions_deadline == 0  # dev: active action

    new_mid_fee: uint256 = _new_mid_fee
    new_out_fee: uint256 = _new_out_fee
    new_admin_fee: uint256 = _new_admin_fee
    new_fee_gamma: uint256 = _new_fee_gamma
    new_price_threshold: uint256 = _new_price_threshold
    new_adjustment_step: uint256 = _new_adjustment_step
    new_ma_half_time: uint256 = _new_ma_half_time

    # Fees
    if new_out_fee != MAX_UINT256:
        assert new_out_fee < MAX_FEE+1  and new_out_fee > MIN_FEE-1  # dev: fee is out of range
    else:
        new_out_fee = self.out_fee
    if new_mid_fee == MAX_UINT256:
        new_mid_fee = self.mid_fee
    assert new_mid_fee <= new_out_fee  # dev: mid-fee is too high
    if new_admin_fee != MAX_UINT256:
        assert new_admin_fee < MAX_ADMIN_FEE+1  # dev: admin fee exceeds maximum
    else:
        new_admin_fee = self.admin_fee

    # AMM parameters
    if new_fee_gamma != MAX_UINT256:
        assert new_fee_gamma > 0 and new_fee_gamma < 2**100  # dev: fee_gamma out of range [1 .. 2**100]
    else:
        new_fee_gamma = self.fee_gamma
    if new_price_threshold != MAX_UINT256:
        assert new_price_threshold > new_mid_fee  # dev: price threshold should be higher than the fee
    else:
        new_price_threshold = self.price_threshold
    if new_adjustment_step == MAX_UINT256:
        new_adjustment_step = self.adjustment_step
    assert new_adjustment_step <= new_price_threshold  # dev: adjustment step should be smaller than price threshold

    # MA
    if new_ma_half_time != MAX_UINT256:
        assert new_ma_half_time > 0 and new_ma_half_time < 7*86400  # dev: MA time should be shorter than 1 week
    else:
        new_ma_half_time = self.ma_half_time

    _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
    self.admin_actions_deadline = _deadline

    self.future_admin_fee = new_admin_fee
    self.future_mid_fee = new_mid_fee
    self.future_out_fee = new_out_fee
    self.future_fee_gamma = new_fee_gamma
    self.future_price_threshoold = new_price_threshold
    self.future_adjustment_step = new_adjustment_step
    self.future_ma_half_time = new_ma_half_time

    log CommitNewParameters(_deadline, new_admin_fee, new_mid_fee, new_out_fee,
                            new_fee_gamma,
                            new_price_threshold, new_adjustment_step,
                            new_ma_half_time)


@external
@nonreentrant('lock')
def apply_new_parameters():
    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

    admin_fee: uint256 = self.future_admin_fee
    if self.admin_fee != admin_fee:
        self._claim_admin_fees()
        self.admin_fee = admin_fee

    mid_fee: uint256 = self.future_mid_fee
    self.mid_fee = mid_fee
    out_fee: uint256 = self.future_out_fee
    self.out_fee = out_fee
    fee_gamma: uint256 = self.future_fee_gamma
    self.fee_gamma = fee_gamma
    price_threshold: uint256 = self.future_price_threshoold
    self.price_threshold = price_threshold
    adjustment_step: uint256 = self.future_adjustment_step
    self.adjustment_step = adjustment_step
    ma_half_time: uint256 = self.future_ma_half_time
    self.ma_half_time = ma_half_time

    log NewParameters(admin_fee, mid_fee, out_fee,
                      fee_gamma,
                      price_threshold, adjustment_step,
                      ma_half_time)


@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
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
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 = False


@external
def set_reward_receiver(_reward_receiver: address):
    assert msg.sender == self.owner  # dev: only owner
    self.reward_receiver = _reward_receiver


@external
def set_admin_fee_receiver(_admin_fee_receiver: address):
    assert msg.sender == self.owner  # dev: only owner
    self.admin_fee_receiver = _admin_fee_receiver

Contract Security Audit

Contract ABI

API
[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"uint256","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"uint256","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[3]","indexed":false},{"name":"fee","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[3]","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_index","type":"uint256","indexed":false},{"name":"coin_amount","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":"CommitNewParameters","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"price_threshold","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"price_threshold","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampAgamma","inputs":[{"name":"initial_A","type":"uint256","indexed":false},{"name":"future_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":"current_A","type":"uint256","indexed":false},{"name":"current_gamma","type":"uint256","indexed":false},{"name":"time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ClaimAdminFee","inputs":[{"name":"admin","type":"address","indexed":true},{"name":"tokens","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"owner","type":"address"},{"name":"A","type":"uint256"},{"name":"gamma","type":"uint256"},{"name":"mid_fee","type":"uint256"},{"name":"out_fee","type":"uint256"},{"name":"price_threshold","type":"uint256"},{"name":"fee_gamma","type":"uint256"},{"name":"adjustment_step","type":"uint256"},{"name":"admin_fee","type":"uint256"},{"name":"ma_half_time","type":"uint256"},{"name":"initial_prices","type":"uint256[2]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3290},{"stateMutability":"view","type":"function","name":"price_scale","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3320},{"stateMutability":"view","type":"function","name":"last_prices","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3350},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":378},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":492},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":847},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":12394},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":839},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":21660},{"stateMutability":"view","type":"function","name":"fee_calc","inputs":[{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":11066},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11552},{"stateMutability":"nonpayable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[],"gas":1815071},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3062},{"stateMutability":"view","type":"function","name":"calc_token_fee","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":26612},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[],"gas":1885454},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[3]"}],"outputs":[],"gas":226141},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3369},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":13849},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"}],"outputs":[],"gas":1800368},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[],"gas":370118},{"stateMutability":"nonpayable","type":"function","name":"ramp_A_gamma","inputs":[{"name":"future_A","type":"uint256"},{"name":"future_gamma","type":"uint256"},{"name":"future_time","type":"uint256"}],"outputs":[],"gas":161781},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[],"gas":157691},{"stateMutability":"nonpayable","type":"function","name":"commit_new_parameters","inputs":[{"name":"_new_mid_fee","type":"uint256"},{"name":"_new_out_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"},{"name":"_new_fee_gamma","type":"uint256"},{"name":"_new_price_threshold","type":"uint256"},{"name":"_new_adjustment_step","type":"uint256"},{"name":"_new_ma_half_time","type":"uint256"}],"outputs":[],"gas":306209},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[],"gas":663748},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23162},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77200},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65877},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23252},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40475},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23312},{"stateMutability":"nonpayable","type":"function","name":"set_reward_receiver","inputs":[{"name":"_reward_receiver","type":"address"}],"outputs":[],"gas":38445},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38475},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3348},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"price_threshold","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"future_price_threshoold","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3828},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3858},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3888},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4027},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3948},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3978},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4008},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4038},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4068},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4098},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":4128},{"stateMutability":"view","type":"function","name":"kill_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4158},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4188},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4218},{"stateMutability":"view","type":"function","name":"reward_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4248},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4278}]

6f7fffffffffffffffffffffffffffffff60405261018061611761014039602061611760c03960c05160a01c1561003557600080fd5b61014051601855610160516064808202821582848304141761005657600080fd5b8090509050905060801b6102c052610180516102c051176102c0526102c0516004556102c0516005556101a0516010556101c0516011556101e05160085561020051600a5561022051600c556102405160125560006102e05261030060006002818352015b6102e05160801b6102e052610280600161030051808210156100dc57600080fd5b80820390509050600281106100f057600080fd5b6020020151610320526fffffffffffffffffffffffffffffffff610320511061011857600080fd5b6102e05161032051176102e0525b81516001018083528114156100bb575b50506102e0516000556102e0516001556102e0516002554260035561026051600e55670de0b6b3a7640000601b5542624f1a0081818301101561017857600080fd5b80820190509050601e55336022556160ff56600436101561000d576134fe565b600035601c526f7fffffffffffffffffffffffffffffff604052600051341561003557600080fd5b6368727653811415610071576004356101405260015461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63a3f7cdd58114156100ad576004356101405260005461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63591890178114156100e9576004356101405260025461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63fc0c546a81141561011357738096ac61db23291252574d49f036f0f9ed8ab39060005260206000f35b63c661065781141561018b5773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f390610180526101406004356003811061017d57600080fd5b602002015160005260206000f35b63f446c1d08114156101de5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160648082049050905060005260206000f35b63b137392981141561022b5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101806020015160005260206000f35b6376a2f0f08114156102755760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160005260206000f35b63ddca3f4381141561032057600658016135b5565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e051610240526102405161022051610200516006580161394f565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e562581141561036d576004803561014052806020013561016052806040013561018052506101805161016051610140516006580161394f565b6101e0526101e05160005260206000f35b63bb7b8b8081141561041a57670de0b6b3a7640000601754610140526101405160065801613a5c565b6101a0526101a05180820282158284830414176103b257600080fd5b80905090509050602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa6103ec57600080fd5b601f3d116103f957600080fd5b60005061022051808061040b57600080fd5b82049050905060005260206000f35b635b41b908811415611060576023541561043357600080fd5b6001602355601d541561044557600080fd5b602435600435181561046f57600360043510156104675760036024351061046a565b60005b610472565b60005b61047b57600080fd5b60006044351161048a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260206102a060646323b872dd6101e05233610200523061022052604435610240526101fc60006101806004356003811061056957600080fd5b60200201515af161057957600080fd5b601f3d1161058657600080fd5b6000506102a0506040366101e0376001156105fc576000546102205261024060006002818352015b6fffffffffffffffffffffffffffffffff61022051166101e061024051600281106105d857600080fd5b60200201526102205160801c610220525b81516001018083528114156105ae575b50505b60168060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506102206024356003811061064257600080fd5b6020020151610280526102206004356003811061065e57600080fd5b60200201805160443581818301101561067657600080fd5b808201905090508152506102206004356003811061069357600080fd5b6020020151600435600381106106a857600080fd5b601660c052602060c020015560016102a0526402540be4006102c05260016102e05261022080516102a05180820282158284830414176106e757600080fd5b8090509050905081525061030060016002818352015b610220610300516003811061071157600080fd5b60200201516101e06103005160018082101561072c57600080fd5b808203905090506002811061074057600080fd5b6020020151808202821582848304141761075957600080fd5b809050905090506102a0610300516003811061077457600080fd5b6020020151808202821582848304141761078d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022061030051600381106107b857600080fd5b60200201525b81516001018083528114156106fd575b5050610220602435600381106107e357600080fd5b6020020151602061046060e46336bc885561032052610140516103405261016051610360526102205161038052610240516103a052610260516103c0526017546103e0526024356104005261033c731689acd208d817b32eeaccce8121278c5766f5305afa61085157600080fd5b601f3d1161085e57600080fd5b600050610460518082101561087257600080fd5b80820390509050610300526102206024356003811061089057600080fd5b60200201805161030051808210156108a757600080fd5b8082039050905081525061030080516001808210156108c557600080fd5b80820390509050815250600060243511156109465761030051670de0b6b3a764000080820282158284830414176108fb57600080fd5b809050905090506101e060243560018082101561091757600080fd5b808203905090506002811061092b57600080fd5b6020020151808061093b57600080fd5b820490509050610300525b61030080516102a06024356003811061095e57600080fd5b6020020151808061096e57600080fd5b82049050905081525061030080516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516102205161032052610240516103405261026051610360526103605161034051610320516006580161394f565b6103c052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c051610300518082028215828483041417610a4157600080fd5b809050905090506402540be4008082049050905080821015610a6257600080fd5b808203905090508152506064356103005110151515610ac0576308c379a0610320526020610340526008610360527f536c6970706167650000000000000000000000000000000000000000000000006103805261036050606461033cfd5b61028080516103005180821015610ad657600080fd5b808203905090508152506102805160243560038110610af457600080fd5b601660c052602060c020015560206103c0604463a9059cbb610320523361034052610300516103605261033c600061018060243560038110610b3557600080fd5b60200201515af1610b4557600080fd5b601f3d11610b5257600080fd5b6000506103c050610280516102a060243560038110610b7057600080fd5b60200201518082028215828483041417610b8957600080fd5b8090509050905061022060243560038110610ba357600080fd5b602002015260006024351115610c3d5761022060243560038110610bc657600080fd5b60200201516101e0602435600180821015610be057600080fd5b8082039050905060028110610bf457600080fd5b60200201518082028215828483041417610c0d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022060243560038110610c3757600080fd5b60200201525b60006103205260243561034052620186a06044351115610c6557620186a06103005111610c68565b60005b15610f2c5760006004351815610c845760006024351415610c87565b60005b15610dca576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610cd057600080fd5b80820390509050604051811115610ce657600080fd5b80820280806000811215610cf657195b607f1c15610d0357600080fd5b9050905090506000811215610d1f57600254816000031c610d25565b600254811b5b9050166044356102a060043560038110610d3e57600080fd5b60200201518082028215828483041417610d5757600080fd5b809050905090508082028215828483041417610d7257600080fd5b80905090509050610300516102a060243560038110610d9057600080fd5b60200201518082028215828483041417610da957600080fd5b809050905090508080610dbb57600080fd5b82049050905061032052610f2c565b6004351515610e7e576044356102a060043560038110610de957600080fd5b60200201518082028215828483041417610e0257600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610e2657600080fd5b80905090509050610300516102a060243560038110610e4457600080fd5b60200201518082028215828483041417610e5d57600080fd5b809050905090508080610e6f57600080fd5b82049050905061032052610f2c565b610300516102a060243560038110610e9557600080fd5b60200201518082028215828483041417610eae57600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610ed257600080fd5b809050905090506044356102a060043560038110610eef57600080fd5b60200201518082028215828483041417610f0857600080fd5b809050905090508080610f1a57600080fd5b82049050905061032052600435610340525b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161014051610360526101605161038052610220516103a052610240516103c052610260516103e0526103405161040052610320516104205261042051610400516103e0516103c0516103a0516103805161036051600658016142ff565b6103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561036052604435610380526024356103a052610300516103c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610360a26000602355005b63556d6e9f8114156110c4576020610200606463556d6e9f61014052606060046101603761015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa6110a757600080fd5b601f3d116110b457600080fd5b6000506102005160005260206000f35b63cde699fa81141561113857600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a051610180516101605161014051600658016154c4565b610240526102405160005260206000f35b634515cef3811415611ea8576023541561115157600080fd5b6001602355601d541561116357600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506004803561024052806020013561026052806040013561028052506060366102a03760011561158c5760006103005261032060006003818352015b60006004610320516003811061128c57600080fd5b6020020135111561132b57602061040060646323b872dd6103405233610360523061038052600461032051600381106112c457600080fd5b60200201356103a05261035c600061018061032051600381106112e657600080fd5b60200201515af16112f657600080fd5b601f3d1161130357600080fd5b600050610400506103008051600181818301101561132057600080fd5b808201905090508152505b8151600101808352811415611277575b50506000610300511161134d57600080fd5b61032060006003818352015b6101e0610320516003811061136d57600080fd5b60200201516004610320516003811061138557600080fd5b602002013581818301101561139957600080fd5b8082019050905061034052610340516101e061032051600381106113bc57600080fd5b60200201526103405161032051600381106113d657600080fd5b601660c052602060c02001555b8151600101808352811415611359575b50506101e0516102a052610200516102c052610220516102e0526001610320526402540be40061034052600161036052600054610380526101e0805161032051808202821582848304141761144757600080fd5b809050905090508152506103a060016002818352015b6fffffffffffffffffffffffffffffffff61038051166103206103a0516003811061148757600080fd5b602002015180820282158284830414176114a057600080fd5b809050905090506103c0526101e06103a051600381106114bf57600080fd5b60200201516103c05180820282158284830414176114dc57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06103a0516003811061150757600080fd5b60200201526102406103a0516003811061152057600080fd5b60200201516103c051808202821582848304141761153d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406103a0516003811061156857600080fd5b60200201526103805160801c610380525b815160010180835281141561145d575b50505b602061042060a463c7fab70861032052610140516103405261016051610360526101e05161038052610200516103a052610220516103c05261033c731689acd208d817b32eeaccce8121278c5766f5305afa6115e757600080fd5b601f3d116115f457600080fd5b600050610420516103005260206103a060046318160ddd6103405261035c738096ac61db23291252574d49f036f0f9ed8ab3905afa61163257600080fd5b601f3d1161163f57600080fd5b6000506103a051610320526017546103405260006103605260006103405111156116bc576103205161030051808202821582848304141761167f57600080fd5b8090509050905061034051808061169557600080fd5b82049050905061032051808210156116ac57600080fd5b808203905090506103605261176e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161030051610380526103805160065801613a5c565b6103e052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610360525b6000610360511161177e57600080fd5b6000610380526000610340511115611d8f576101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156117ba57611798565b610240516103c052610260516103e05261028051610400526101e0516104205261020051610440526102205161046052610460516104405161042051610400516103e0516103c051600658016154c4565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561183a57611817565b6104c05161036051808202821582848304141761185657600080fd5b809050905090506402540be40080820490509050600181818301101561187b57600080fd5b80820190509050610380526103608051610380518082101561189c57600080fd5b808203905090508152506103208051610360518181830110156118be57600080fd5b80820190509050815250602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af161190a57600080fd5b601f3d1161191757600080fd5b600050610440506040366103a037620186a0610360511115611cc95760006103e05261040060006003818352015b6004610400516003811061195857600080fd5b60200201351515611988576103e08051600181818301101561197957600080fd5b80820190509050815250611991565b610400516103c0525b8151600101808352811415611945575b505060026103e0511415611cc95760603661040037600254610460526001610480526402540be4006104a05260016104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff61046051166104206104e05160028110611a0957600080fd5b60200201526104605160801c610460525b81516001018083528114156119df575b50506104e060006003818352015b6103c0516104e0511815611b5c576104e0511515611a965761040080516102a051610480518082028215828483041417611a7157600080fd5b80905090509050818183011015611a8757600080fd5b80820190509050815250611b5c565b61040080516102a06104e05160038110611aaf57600080fd5b60200201516104206104e051600180821015611aca57600080fd5b8082039050905060028110611ade57600080fd5b60200201518082028215828483041417611af757600080fd5b809050905090506104806104e05160038110611b1257600080fd5b60200201518082028215828483041417611b2b57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b5157600080fd5b808201905090508152505b8151600101808352811415611a38575b505061040051610360518082028215828483041417611b8a57600080fd5b80905090509050610320518080611ba057600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417611bcb57600080fd5b8090509050905060046103c05160038110611be557600080fd5b60200201356104806103c05160038110611bfe57600080fd5b60200201518082028215828483041417611c1757600080fd5b80905090509050610360516102a06103c05160038110611c3657600080fd5b60200201518082028215828483041417611c4f57600080fd5b809050905090506104806103c05160038110611c6a57600080fd5b60200201518082028215828483041417611c8357600080fd5b80905090509050610320518080611c9957600080fd5b82049050905080821015611cac57600080fd5b808203905090508080611cbe57600080fd5b8204905090506103a0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611cf357611cd1565b610140516104005261016051610420526101e05161044052610200516104605261022051610480526103c0516104a0526103a0516104c052610300516104e0526104e0516104c0516104a051610480516104605161044051610420516104005160065801614335565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611d8757611d64565b600050611e0d565b61030051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611df057600080fd5b601f3d11611dfd57600080fd5b60005061044051611e0d57600080fd5b6064356103605110151515611e61576308c379a06103a05260206103c05260086103e0527f536c697070616765000000000000000000000000000000000000000000000000610400526103e05060646103bcfd5b606060046103a03761038051610400526103205161042052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103a0a26000602355005b63ecb586a58114156122265760235415611ec157600080fd5b600160235573e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f39061018052602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa611f4457600080fd5b601f3d11611f5157600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611f9d57600080fd5b601f3d11611faa57600080fd5b60005061026051611fba57600080fd5b60168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c02001546102005250600435600180821015611fff57600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061202a57600080fd5b602002015161022051808202821582848304141761204757600080fd5b809050905090506101a051808061205d57600080fd5b820490509050610260526024610240516003811061207a57600080fd5b602002013561026051101561208e57600080fd5b6101c061024051600381106120a257600080fd5b602002015161026051808210156120b857600080fd5b8082039050905061024051600381106120d057600080fd5b601660c052602060c0200155610260516101c061024051600381106120f457600080fd5b60200201526020610320604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061212f57600080fd5b60200201515af161213f57600080fd5b601f3d1161214c57600080fd5b600050610320505b8151600101808352811415612016575b505060175461024052610240516102405161022051808202821582848304141761218d57600080fd5b809050905090506101a05180806121a357600080fd5b820490509050808210156121b657600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156121ec57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156122b45760643560011c1561224257600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa61229757600080fd5b601f3d116122a457600080fd5b6000506102205160005260206000f35b634fb08c5e8114156123ef5760403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525061014051610160516101405161018052610160516101a052604060046101c037600061020052610200516101e0516101c0516101a0516101805160065801615701565b61026052610280526102a0526102c0526102e05261030052610160526101405261026080808080516103205250506020810190508080805161034052505060208101905080808051610360525050602081019050808080808051610380525050602081019050808080516103a0525050602081019050808080516103c0525050505050506103205160005260206000f35b63f1dc3cc981141561282c576023541561240857600080fd5b6001602355601d541561241a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525060c036610180376101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101605161026052604060046102803760016102c0526102c0516102a05161028051610260516102405160065801615701565b610320526103405261036052610380526103a0526103c05261022052610200526101e0526101c0526101a05261018052610160526101405261032080808080516103e052505060208101905080808051610400525050602081019050808080516104205250506020810190508080808080516104405250506020810190508080805161046052505060208101905080808051610480525050505050506103e080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612600576308c379a0610240526020610260526008610280527f536c6970706167650000000000000000000000000000000000000000000000006102a05261028050606461025cfd5b6024356003811061261057600080fd5b601660c052602060c020018054610180518082101561262e57600080fd5b8082039050905081555060206102e060446379cc67906102405233610260526004356102805261025c6000738096ac61db23291252574d49f036f0f9ed8ab3905af161267957600080fd5b601f3d1161268657600080fd5b6000506102e05161269657600080fd5b6001156127425773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526020610340604463a9059cbb6102a052336102c052610180516102e0526102bc60006102406024356003811061271d57600080fd5b60200201515af161272d57600080fd5b601f3d1161273a57600080fd5b600050610340505b6101405161016051610180516101a0516101c0516101e0516102005161022051610140516102405261016051610260526101e05161028052610200516102a052610220516102c0526024356102e0526101c051610300526101a0516103205261032051610300516102e0516102c0516102a05161028051610260516102405160065801614335565b61022052610200526101e0526101c0526101a05261018052610160526101405260005060406004610240376101805161028052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06060610240a26000602355005b63c93f49e881141561285d576023541561284557600080fd5b600160235560065801613b9d565b6000506000602355005b635e248072811415612a9557601854331461287757600080fd5b6006546201517f81818301101561288d57600080fd5b80820190509050421161289f57600080fd5b426201517f8181830110156128b357600080fd5b80820190509050604435116128c757600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b61018052610160516101805117610180526004356064808202821582848304141761295357600080fd5b809050905090506101a0526000600435111561297657620f424060043510612979565b60005b61298257600080fd5b6402540be3ff60243511156129a257662386f26fc10001602435106129a5565b60005b6129ae57600080fd5b610140516101a05110156129f157610140516101a051600a80820282158284830414176129da57600080fd5b8090509050905010156129ec57600080fd5b612a21565b61014051600a8082028215828483041417612a0b57600080fd5b809050905090506101a0511115612a2157600080fd5b61018051600455426006556101a05160801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e0526101a051610200524261022052604435610240527f7dce008c7221b9d42f26174f7435e50f9cc8f502c57019724c090b546415a02960806101e0a1005b63244c7c2e811415612b76576018543314612aaf57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612eab576018543314612b9057600080fd5b60205415612b9d57600080fd5b60e06004610140377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610160511815612bff5764012a05f201610160511015612bee576207a11f6101605111612bf1565b60005b612bfa57600080fd5b612c07565b601154610160525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610140511415612c3a57601054610140525b61016051610140511115612c4d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610180511815612c91576402540be4016101805110612c8c57600080fd5b612c99565b601254610180525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511815612cf95760006101a0511115612ce8576c100000000000000000000000006101a05110612ceb565b60005b612cf457600080fd5b612d01565b600a546101a0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0511815612d4357610140516101c05111612d3e57600080fd5b612d4b565b6008546101c0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e0511415612d7e57600c546101e0525b6101c0516101e0511115612d9157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610200511815612de7576000610200511115612dd65762093a806102005110612dd9565b60005b612de257600080fd5b612def565b600e54610200525b426203f480818183011015612e0357600080fd5b8082019050905061022052610220516020556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd811415612fe45760235415612ec457600080fd5b60016023556018543314612ed757600080fd5b602054421015612ee657600080fd5b600060205418612ef557600080fd5b600060205560155461014052610140516012541815612f2a576101405160065801613b9d565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb811415613005576018543314612ffe57600080fd5b6000602055005b636b441a408114156130975760043560a01c1561302157600080fd5b601854331461302f57600080fd5b601f541561303c57600080fd5b426203f48081818301101561305057600080fd5b808201905090506101405261014051601f55600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561310e5760185433146130b157600080fd5b601f544210156130c057600080fd5b6000601f54186130cf57600080fd5b6000601f556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561312f57601854331461312857600080fd5b6000601f55005b63e369885381141561315e57601854331461314957600080fd5b42601e541161315757600080fd5b6001601d55005b633046f97281141561317f57601854331461317857600080fd5b6000601d55005b63c51b88618114156131b15760043560a01c1561319b57600080fd5b60185433146131a957600080fd5b600435602155005b637242e5248114156131e35760043560a01c156131cd57600080fd5b60185433146131db57600080fd5b600435602255005b636112c7478114156131fb5760035460005260206000f35b63204fe3d58114156132135760045460005260206000f35b63f30cfad581141561322b5760055460005260206000f35b63e89876ff8114156132435760065460005260206000f35b63f9ed959781141561325b5760075460005260206000f35b6303b736e08114156132735760085460005260206000f35b6373fb971181141561328b5760095460005260206000f35b6372d4f0e28114156132a357600a5460005260206000f35b63d7c3dcbe8114156132bb57600b5460005260206000f35b63083812e58114156132d357600c5460005260206000f35b634ea12c7d8114156132eb57600d5460005260206000f35b63662b627481141561330357600e5460005260206000f35b630c5e23d481141561331b57600f5460005260206000f35b6392526c0c8114156133335760105460005260206000f35b63ee8de67581141561334b5760115460005260206000f35b63fee3f7f98114156133635760125460005260206000f35b637cf9aedc81141561337b5760135460005260206000f35b637d1b060c8114156133935760145460005260206000f35b63e38244628114156133ab5760155460005260206000f35b634903b0d18114156133dc57600435600381106133c757600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156133f45760175460005260206000f35b638da5cb5b81141561340c5760185460005260206000f35b631ec0cdc18114156134245760195460005260206000f35b637ba1a74d81141561343c57601a5460005260206000f35b630b7b594b81141561345457601b5460005260206000f35b630c46b72a81141561346c57601c5460005260206000f35b639c868ac081141561348457601d5460005260206000f35b632a42689681141561349c57601e5460005260206000f35b63e0a0b5868114156134b457601f5460005260206000f35b63405e28f88114156134cc5760205460005260206000f35b63b618ba628114156134e45760215460005260206000f35b636e42e4d28114156134fc5760225460005260206000f35b505b60006000fd5b6101805261014052610160526002610140511061352057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806101405160405181111561356557600080fd5b8082028080600081121561357557195b607f1c1561358257600080fd5b905090509050600081121561359f5761016051816000031c6135a6565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05260016101e0526402540be4006102005260016102205261016080516101e051808202821582848304141761362657600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e0610240516003811061366657600080fd5b6020020151808202821582848304141761367f57600080fd5b8090509050905061026052610160610240516003811061369e57600080fd5b60200201516102605180820282158284830414176136bb57600080fd5b80905090509050670de0b6b3a76400008082049050905061016061024051600381106136e657600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561363c575b50506060610240525b6000610240511115156137225761373e565b6020610240510361016001516020610240510361024052613710565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613901576004546101e05260065461020052610160805161020051808210156137aa57600080fd5b808203905090508152504261020051808210156137c657600080fd5b80820390509050610200526101e05160801c6101605161020051808210156137ed57600080fd5b80820390509050808202821582848304141761380857600080fd5b809050905090506101c05161020051808202821582848304141761382b57600080fd5b8090509050905081818301101561384157600080fd5b8082019050905061016051808061385757600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e0511661016051610200518082101561388c57600080fd5b8082039050905080820282158284830414176138a757600080fd5b809050905090506101a0516102005180820282158284830414176138ca57600080fd5b809050905090508181830110156138e057600080fd5b808201905090506101605180806138f657600080fd5b8204905090506101a0525b6102206101c05181526101a0518160200152506040610260525b60006102605111151561392d57613949565b602061026051036102200151602061026051036102605261391b565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc731689acd208d817b32eeaccce8121278c5766f5305afa6139b157600080fd5b601f3d116139be57600080fd5b6000506102c0516101c0526010546101c05180820282158284830414176139e457600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613a0857600080fd5b808203905090508082028215828483041417613a2357600080fd5b80905090509050818183011015613a3957600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613ab057600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613ae357600080fd5b809050905090508080613af557600080fd5b8204905090506101806102005160038110613b0f57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613a8f575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c731689acd208d817b32eeaccce8121278c5766f5305afa613b7d57600080fd5b601f3d11613b8a57600080fd5b6000506102c05160005260005161016051565b6101405260225461016052601a5461018052601c546101a05261018051601b5480821015613bca57600080fd5b808203905090506012548082028215828483041417613be857600080fd5b809050905090506404a817c800808204905090506101c05260006101c05111156140cc576101a051670de0b6b3a76400008082028215828483041417613c2d57600080fd5b809050905090506101a0516101c05180821015613c4957600080fd5b808203905090508080613c5b57600080fd5b820490509050670de0b6b3a764000080821015613c7757600080fd5b808203905090506101e05260206102c06044636962f8456102205261016051610240526101e0516102605261023c6000738096ac61db23291252574d49f036f0f9ed8ab3905af1613cc757600080fd5b601f3d11613cd457600080fd5b6000506102c0516102005260206102a060046318160ddd6102405261025c738096ac61db23291252574d49f036f0f9ed8ab3905afa613d1257600080fd5b601f3d11613d1f57600080fd5b6000506102a0516102205273e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526102a060006003818352015b602061034060246370a082316102c052306102e0526102dc6102406102a05160038110613dad57600080fd5b60200201515afa613dbd57600080fd5b601f3d11613dca57600080fd5b600050610340516102a05160038110613de257600080fd5b601660c052602060c02001555b8151600101808352811415613d81575b50506040366102a0376101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015613e3257613e10565b60065801613744565b61030052610320526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515613e6e57613e4b565b610300808080805161034052505060208101905080808051610360525050505061034080516102a05280602001516102c05250610140610340525b61034051516020610340510161034052610340610340511015613ecb57613ea9565b600658016135b5565b61036052610380526103a052610320610340525b6103405152602061034051036103405261014061034051101515613f0b57613ee8565b61036080516102e05280602001516103005280604001516103205250602061046060a463c7fab708610360526102a051610380526102c0516103a0526102e0516103c052610300516103e052610320516104005261037c731689acd208d817b32eeaccce8121278c5766f5305afa613f8257600080fd5b601f3d11613f8f57600080fd5b6000506104605161034052670de0b6b3a7640000610140610380525b61038051516020610380510161038052610380610380511015613fcd57613fab565b610340516103a0526103a05160065801613a5c565b61040052610360610380525b610380515260206103805103610380526101406103805110151561401157613fee565b61040051808202821582848304141761402957600080fd5b8090509050905061022051808061403f57600080fd5b8204905090506103605261036051601c55610360516101805181818301101561406757600080fd5b808201905090506101a0518082101561407f57600080fd5b808203905090506101805261018051601b5561018051601a556102005161038052610160517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596020610380a25b6021546101605260006101605118156142f55760006004610240527f3111e7b300000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af150508051820191505060606020826102a00101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020826102a0010152602081019050306020826102a001015260208101905060026020826102a0010152602081019050735c2ed810328349100a66b82b78a1791b101c9d616020826102a00101526020810190507328424507fefb6f7f8e9d3860f56504e4e5f5f3906020826102a0010152602081019050806102a0526102a090508051602001806103c08284600060045af16141fc57600080fd5b505060206105006103c0516103e0600073357d51124f59836ded84c8a1730d72b749d8bc235af161422c57600080fd5b60203d8082111561423d578061423f565b815b905090506104e0526104e08051602001806101e08284600060045af161426457600080fd5b505060206102e0604463a9059cbb6102405261016051610260526101e080602001516000825180602090131561429957600080fd5b80919012156142a757600080fd5b806020036101000a82049050905090506102805261025c6000730d500b1d8e8ef31e21c99d1db9a6444d3adf12705af16142e057600080fd5b601f3d116142ed57600080fd5b6000506102e0505b610140515661432d575b610240526000610220526101405261016052610180526101a0526101c0526101e05261020052600050614361565b600015614361575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052600050614361565b604036610260376001546102a0526102c060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102606102c051600281106143a557600080fd5b60200201526102a05160801c6102a0525b815160010180835281141561437b575b50506003546102c0526040366102e0376002546102a05261032060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102e0610320516002811061441357600080fd5b60200201526102a05160801c6102a0525b81516001018083528114156143e9575b5050426102c051101561467957600e54610320526020610400604463571bae3f61036052426102c0518082101561446a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761448e57600080fd5b809050905090506103205180806144a457600080fd5b820490509050610380526402540be4006103a05261037c731689acd208d817b32eeaccce8121278c5766f5305afa6144db57600080fd5b601f3d116144e857600080fd5b600050610400516103405260006102a05261036060006002818352015b6102e0610360516002811061451957600080fd5b6020020151670de0b6b3a7640000610340518082101561453857600080fd5b80820390509050808202821582848304141761455357600080fd5b80905090509050610260610360516002811061456e57600080fd5b602002015161034051808202821582848304141761458b57600080fd5b809050905090508181830110156145a157600080fd5b80820190509050670de0b6b3a76400008082049050905061026061036051600281106145cc57600080fd5b60200201525b8151600101808352811415614505575b505061036060006002818352015b6102a05160801b6102a0526102606001610360518082101561461157600080fd5b808203905090506002811061462557600080fd5b6020020151610380526fffffffffffffffffffffffffffffffff610380511061464d57600080fd5b6102a05161038051176102a0525b81516001018083528114156145f0575b50506102a051600155426003555b61022051610320526102205115156146ff57602061044060a463c7fab7086103405261014051610360526101605161038052610180516103a0526101a0516103c0526101c0516103e05261035c731689acd208d817b32eeaccce8121278c5766f5305afa6146e657600080fd5b601f3d116146f357600080fd5b60005061044051610320525b6000546102a0526040366103403761038060006002818352015b6fffffffffffffffffffffffffffffffff6102a05116610340610380516002811061474357600080fd5b60200201526102a05160801c6102a0525b8151600101808352811415614719575b505060006102005111156148465760006101e05111156147b657610200516102e06101e05160018082101561479857600080fd5b80820390509050600281106147ac57600080fd5b6020020152614841565b61038060006002818352015b6102e061038051600281106147d657600080fd5b6020020151670de0b6b3a764000080820282158284830414176147f857600080fd5b8090509050905061020051808061480e57600080fd5b8204905090506102e0610380516002811061482857600080fd5b60200201525b81516001018083528114156147c2575b50505b6149f1565b61018051610380526101a0516103a0526101c0516103c05261038051620f4240808204905090506103e05261038080516103e05181818301101561488957600080fd5b8082019050905081525061040060006002818352015b61034061040051600281106148b357600080fd5b60200201516103e05180820282158284830414176148d057600080fd5b809050905090506101806104005160018181830110156148ef57600080fd5b808201905090506003811061490357600080fd5b6020020151602061056060e46336bc8855610420526101405161044052610160516104605261038051610480526103a0516104a0526103c0516104c052610320516104e05261040051600181818301101561495d57600080fd5b808201905090506105005261043c731689acd208d817b32eeaccce8121278c5766f5305afa61498b57600080fd5b601f3d1161499857600080fd5b60005061056051808210156149ac57600080fd5b8082039050905080806149be57600080fd5b8204905090506102e061040051600281106149d857600080fd5b60200201525b815160010180835281141561489f575b50505b60006102a05261038060006002818352015b6102a05160801b6102a0526102e060016103805180821015614a2457600080fd5b8082039050905060028110614a3857600080fd5b60200201516103a0526fffffffffffffffffffffffffffffffff6103a05110614a6057600080fd5b6102a0516103a051176102a0525b8151600101808352811415614a03575b50506102a051600255600061038052602061042060046318160ddd6103c0526103dc738096ac61db23291252574d49f036f0f9ed8ab3905afa614ac057600080fd5b601f3d11614acd57600080fd5b600050610420516103a052601a546103c052601c546103e05261040060006002818352015b6102606104005160028110614b0657600080fd5b6020020151670de0b6b3a76400008082028215828483041417614b2857600080fd5b809050905090506103406104005160028110614b4357600080fd5b60200201518080614b5357600080fd5b82049050905061042052670de0b6b3a7640000610420511115614b9a576104208051670de0b6b3a764000080821015614b8b57600080fd5b80820390509050815250614bc0565b670de0b6b3a76400006104205180821015614bb457600080fd5b80820390509050610420525b61038080517001000000000000000000000000000000006104205110614be557600080fd5b6002610420510a818183011015614bfb57600080fd5b808201905090508152505b8151600101808352811415614af2575b505060603661040037610320516003808204905090506104005261046060006002818352015b61032051670de0b6b3a76400008082028215828483041417614c5d57600080fd5b8090509050905060036103406104605160028110614c7a57600080fd5b60200201518082028215828483041417614c9357600080fd5b809050905090508080614ca557600080fd5b820490509050610400610460516001818183011015614cc357600080fd5b8082019050905060038110614cd757600080fd5b60200201525b8151600101808352811415614c3c575b5050670de0b6b3a764000061046052670de0b6b3a76400006104805260006103e0511115614e48576020610580606463bad1dc266104c052610400516104e052610420516105005261044051610520526104dc731689acd208d817b32eeaccce8121278c5766f5305afa614d6057600080fd5b601f3d11614d6d57600080fd5b600050610580516104a052670de0b6b3a76400006104a0518082028215828483041417614d9957600080fd5b809050905090506103a0518080614daf57600080fd5b820490509050610480526103c051610480518082028215828483041417614dd557600080fd5b809050905090506103e0518080614deb57600080fd5b820490509050610460526103e051610480511015614e48576308c379a06104c05260206104e0526004610500527f4c6f737300000000000000000000000000000000000000000000000000000000610520526105005060646104dcfd5b61046051601a5570010000000000000000000000000000000060085410614e6e57600080fd5b60026008540a610380511115614e8a5760006103e05111614e8d565b60005b1561544f5760206105206024634e60b1416104a05261038051670de0b6b3a7640000808204905090506104c0526104bc731689acd208d817b32eeaccce8121278c5766f5305afa614edd57600080fd5b601f3d11614eea57600080fd5b6000506105205161038052600c546104a0526040366104c03761050060006002818352015b6103406105005160028110614f2357600080fd5b6020020151610380516104a05180821015614f3d57600080fd5b808203905090508082028215828483041417614f5857600080fd5b809050905090506104a0516102606105005160028110614f7757600080fd5b60200201518082028215828483041417614f9057600080fd5b80905090509050818183011015614fa657600080fd5b80820190509050610380518080614fbc57600080fd5b8204905090506104c06105005160028110614fd657600080fd5b60200201525b8151600101808352811415614f0f575b505061018051610400526101a051610420526101c0516104405261050060006002818352015b61018061050051600181818301101561502a57600080fd5b808201905090506003811061503e57600080fd5b60200201516104c0610500516002811061505757600080fd5b6020020151808202821582848304141761507057600080fd5b80905090509050610340610500516002811061508b57600080fd5b6020020151808061509b57600080fd5b8204905090506104006105005160018181830110156150b957600080fd5b80820190509050600381106150cd57600080fd5b60200201525b8151600101808352811415615012575b5050602061062060a463c7fab70861052052610140516105405261016051610560526104005161058052610420516105a052610440516105c05261053c731689acd208d817b32eeaccce8121278c5766f5305afa61514057600080fd5b601f3d1161514d57600080fd5b6000506106205161050052610500516003808204905090506104005261052060006002818352015b61050051670de0b6b3a7640000808202821582848304141761519657600080fd5b8090509050905060036104c061052051600281106151b357600080fd5b602002015180820282158284830414176151cc57600080fd5b8090509050905080806151de57600080fd5b8204905090506104006105205160018181830110156151fc57600080fd5b808201905090506003811061521057600080fd5b60200201525b8151600101808352811415615175575b5050670de0b6b3a764000060206105e0606463bad1dc266105205261040051610540526104205161056052610440516105805261053c731689acd208d817b32eeaccce8121278c5766f5305afa61527c57600080fd5b601f3d1161528957600080fd5b6000506105e05180820282158284830414176152a457600080fd5b809050905090506103a05180806152ba57600080fd5b8204905090506103e052670de0b6b3a76400006103e051111561533c5761046051670de0b6b3a7640000808210156152f157600080fd5b8082039050905060026103e051670de0b6b3a76400008082101561531457600080fd5b80820390509050808202821582848304141761532f57600080fd5b809050905090501161533f565b60005b1561544f5760006102a05261052060006002818352015b6102a05160801b6102a0526104c06001610520518082101561537757600080fd5b808203905090506002811061538b57600080fd5b6020020151610540526fffffffffffffffffffffffffffffffff61054051106153b357600080fd5b6102a05161054051176102a0525b8151600101808352811415615356575b50506102a051600055610500516017556103e051601c55610140610520525b61052051516020610520510161052052610520610520511015615412576153f0565b60065801613b9d565b610500610520525b610520515260206105205103610520526101406105205110151561544657615423565b60005061024051565b6103205160175561048051601c556101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561548757615465565b60065801613b9d565b6104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156154bb57615498565b60005061024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e051610280526102805161026051610240516006580161394f565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516003808202821582848304141761556b57600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b602061028051026101400151610260526102408051610260518181830110156155b957600080fd5b808201905090508152505b8151600101808352811415615591575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156156565761028080516102a051610260518082101561563157600080fd5b8082039050905081818301101561564757600080fd5b80820190509050815250615691565b6102808051610260516102a0518082101561567057600080fd5b8082039050905081818301101561568657600080fd5b808201905090508152505b81516001018083528114156155f9575b5050610220516102805180820282158284830414176156bf57600080fd5b809050905090506102405180806156d557600080fd5b820490509050620186a08181830110156156ee57600080fd5b8082019050905060005260005161020051565b6101e0526101405261016052610180526101a0526101c05260175461020052610200516102205260206102c060046318160ddd6102605261027c738096ac61db23291252574d49f036f0f9ed8ab3905afa61575b57600080fd5b601f3d1161576857600080fd5b6000506102c051610240526102405161018051111561578657600080fd5b60036101a0511061579657600080fd5b60168060c052602060c020546102605260018160c052602060c02001546102805260028160c052602060c02001546102a0525060016102c0526402540be4006102e052600161030052670de0b6b3a76400006102c051808202821582848304141761580057600080fd5b809050905090506103205260011561596557600054610340526102c0805161026051808202821582848304141761583657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a05114156158b157610380516102c06101a0516003811061588c57600080fd5b602002015180820282158284830414176158a557600080fd5b80905090509050610320525b6102c061036051600381106158c557600080fd5b602002015161026061036051600381106158de57600080fd5b602002015180820282158284830414176158f757600080fd5b8090509050905061038051808202821582848304141761591657600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0610360516003811061594157600080fd5b60200201526103405160801c610340525b815160010180835281141561584c575b50505b610140610360525b6103605151602061036051016103605261036061036051101561598f5761596d565b6102c051610380526102e0516103a052610300516103c0526103c0516103a051610380516006580161394f565b61042052610340610360525b61036051526020610360510361036052610140610360511015156159eb576159c8565b610420516103405261018051610200518082028215828483041417615a0f57600080fd5b80905090509050610240518080615a2557600080fd5b8204905090506103605261020080516103605161034051610360518082028215828483041417615a5457600080fd5b809050905090506404a817c800808204905090506001818183011015615a7957600080fd5b8082019050905080821015615a8d57600080fd5b8082039050905080821015615aa157600080fd5b8082039050905081525060206104e060e46336bc88556103a052610140516103c052610160516103e0526102c051610400526102e05161042052610300516104405261020051610460526101a051610480526103bc731689acd208d817b32eeaccce8121278c5766f5305afa615b1657600080fd5b601f3d11615b2357600080fd5b6000506104e051610380526102c06101a05160038110615b4257600080fd5b60200201516103805180821015615b5857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b7c57600080fd5b80905090509050610320518080615b9257600080fd5b8204905090506103a052610380516102c06101a05160038110615bb457600080fd5b602002015260006103c0526101c05115615bec57620186a06103a0511115615be457620186a06101805111615be7565b60005b615bef565b60005b15615f005760006103e0526001610400526402540be40061042052600161044052604036610460376002546104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff6104a051166104606104c05160028110615c5457600080fd5b60200201526104a05160801c6104a0525b8151600101808352811415615c2a575b50506104c060006003818352015b6101a0516104c0511815615da7576104c0511515615ce1576103e0805161026051610400518082028215828483041417615cbc57600080fd5b80905090509050818183011015615cd257600080fd5b80820190509050815250615da7565b6103e080516102606104c05160038110615cfa57600080fd5b60200201516104606104c051600180821015615d1557600080fd5b8082039050905060028110615d2957600080fd5b60200201518082028215828483041417615d4257600080fd5b809050905090506104006104c05160038110615d5d57600080fd5b60200201518082028215828483041417615d7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9c57600080fd5b808201905090508152505b8151600101808352811415615c83575b50506103e051610360518082028215828483041417615dd557600080fd5b80905090509050610220518080615deb57600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417615e1657600080fd5b809050905090506103a0516104006101a05160038110615e3557600080fd5b60200201518082028215828483041417615e4e57600080fd5b80905090509050610360516102606101a05160038110615e6d57600080fd5b60200201518082028215828483041417615e8657600080fd5b809050905090506104006101a05160038110615ea157600080fd5b60200201518082028215828483041417615eba57600080fd5b80905090509050610220518080615ed057600080fd5b82049050905080821015615ee357600080fd5b808203905090508080615ef557600080fd5b8204905090506103c0525b6104a06103a05181526103c0518160200152610200518160400152806060016102c05181526102e0518160200152610300518160400152505060c0610560525b600061056051111515615f5257615f6e565b602061056051036104a001516020610560510361056052615f40565b6101e051565b61018b6160ff0361018b60003961018b6160ff036000f3000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f670000000000000000000000000000000000000000000000000000000000000e3d00000000000000000000000000000000000000000000000000003faa25225fff00000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000009f295cd5f0000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000008043864d56e85dd423f0000000000000000000000000000000000000000000000891df2f32fd9b934f1

Deployed Bytecode

0x600436101561000d576134fe565b600035601c526f7fffffffffffffffffffffffffffffff604052600051341561003557600080fd5b6368727653811415610071576004356101405260015461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63a3f7cdd58114156100ad576004356101405260005461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63591890178114156100e9576004356101405260025461016052610160516101405160065801613504565b6101c0526101c05160005260206000f35b63fc0c546a81141561011357738096ac61db23291252574d49f036f0f9ed8ab39060005260206000f35b63c661065781141561018b5773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f390610180526101406004356003811061017d57600080fd5b602002015160005260206000f35b63f446c1d08114156101de5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160648082049050905060005260206000f35b63b137392981141561022b5760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101806020015160005260206000f35b6376a2f0f08114156102755760065801613744565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160005260206000f35b63ddca3f4381141561032057600658016135b5565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e051610240526102405161022051610200516006580161394f565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e562581141561036d576004803561014052806020013561016052806040013561018052506101805161016051610140516006580161394f565b6101e0526101e05160005260206000f35b63bb7b8b8081141561041a57670de0b6b3a7640000601754610140526101405160065801613a5c565b6101a0526101a05180820282158284830414176103b257600080fd5b80905090509050602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa6103ec57600080fd5b601f3d116103f957600080fd5b60005061022051808061040b57600080fd5b82049050905060005260206000f35b635b41b908811415611060576023541561043357600080fd5b6001602355601d541561044557600080fd5b602435600435181561046f57600360043510156104675760036024351061046a565b60005b610472565b60005b61047b57600080fd5b60006044351161048a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260206102a060646323b872dd6101e05233610200523061022052604435610240526101fc60006101806004356003811061056957600080fd5b60200201515af161057957600080fd5b601f3d1161058657600080fd5b6000506102a0506040366101e0376001156105fc576000546102205261024060006002818352015b6fffffffffffffffffffffffffffffffff61022051166101e061024051600281106105d857600080fd5b60200201526102205160801c610220525b81516001018083528114156105ae575b50505b60168060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506102206024356003811061064257600080fd5b6020020151610280526102206004356003811061065e57600080fd5b60200201805160443581818301101561067657600080fd5b808201905090508152506102206004356003811061069357600080fd5b6020020151600435600381106106a857600080fd5b601660c052602060c020015560016102a0526402540be4006102c05260016102e05261022080516102a05180820282158284830414176106e757600080fd5b8090509050905081525061030060016002818352015b610220610300516003811061071157600080fd5b60200201516101e06103005160018082101561072c57600080fd5b808203905090506002811061074057600080fd5b6020020151808202821582848304141761075957600080fd5b809050905090506102a0610300516003811061077457600080fd5b6020020151808202821582848304141761078d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022061030051600381106107b857600080fd5b60200201525b81516001018083528114156106fd575b5050610220602435600381106107e357600080fd5b6020020151602061046060e46336bc885561032052610140516103405261016051610360526102205161038052610240516103a052610260516103c0526017546103e0526024356104005261033c731689acd208d817b32eeaccce8121278c5766f5305afa61085157600080fd5b601f3d1161085e57600080fd5b600050610460518082101561087257600080fd5b80820390509050610300526102206024356003811061089057600080fd5b60200201805161030051808210156108a757600080fd5b8082039050905081525061030080516001808210156108c557600080fd5b80820390509050815250600060243511156109465761030051670de0b6b3a764000080820282158284830414176108fb57600080fd5b809050905090506101e060243560018082101561091757600080fd5b808203905090506002811061092b57600080fd5b6020020151808061093b57600080fd5b820490509050610300525b61030080516102a06024356003811061095e57600080fd5b6020020151808061096e57600080fd5b82049050905081525061030080516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516102205161032052610240516103405261026051610360526103605161034051610320516006580161394f565b6103c052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c051610300518082028215828483041417610a4157600080fd5b809050905090506402540be4008082049050905080821015610a6257600080fd5b808203905090508152506064356103005110151515610ac0576308c379a0610320526020610340526008610360527f536c6970706167650000000000000000000000000000000000000000000000006103805261036050606461033cfd5b61028080516103005180821015610ad657600080fd5b808203905090508152506102805160243560038110610af457600080fd5b601660c052602060c020015560206103c0604463a9059cbb610320523361034052610300516103605261033c600061018060243560038110610b3557600080fd5b60200201515af1610b4557600080fd5b601f3d11610b5257600080fd5b6000506103c050610280516102a060243560038110610b7057600080fd5b60200201518082028215828483041417610b8957600080fd5b8090509050905061022060243560038110610ba357600080fd5b602002015260006024351115610c3d5761022060243560038110610bc657600080fd5b60200201516101e0602435600180821015610be057600080fd5b8082039050905060028110610bf457600080fd5b60200201518082028215828483041417610c0d57600080fd5b80905090509050670de0b6b3a76400008082049050905061022060243560038110610c3757600080fd5b60200201525b60006103205260243561034052620186a06044351115610c6557620186a06103005111610c68565b60005b15610f2c5760006004351815610c845760006024351415610c87565b60005b15610dca576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610cd057600080fd5b80820390509050604051811115610ce657600080fd5b80820280806000811215610cf657195b607f1c15610d0357600080fd5b9050905090506000811215610d1f57600254816000031c610d25565b600254811b5b9050166044356102a060043560038110610d3e57600080fd5b60200201518082028215828483041417610d5757600080fd5b809050905090508082028215828483041417610d7257600080fd5b80905090509050610300516102a060243560038110610d9057600080fd5b60200201518082028215828483041417610da957600080fd5b809050905090508080610dbb57600080fd5b82049050905061032052610f2c565b6004351515610e7e576044356102a060043560038110610de957600080fd5b60200201518082028215828483041417610e0257600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610e2657600080fd5b80905090509050610300516102a060243560038110610e4457600080fd5b60200201518082028215828483041417610e5d57600080fd5b809050905090508080610e6f57600080fd5b82049050905061032052610f2c565b610300516102a060243560038110610e9557600080fd5b60200201518082028215828483041417610eae57600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610ed257600080fd5b809050905090506044356102a060043560038110610eef57600080fd5b60200201518082028215828483041417610f0857600080fd5b809050905090508080610f1a57600080fd5b82049050905061032052600435610340525b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161014051610360526101605161038052610220516103a052610240516103c052610260516103e0526103405161040052610320516104205261042051610400516103e0516103c0516103a0516103805161036051600658016142ff565b6103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561036052604435610380526024356103a052610300516103c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610360a26000602355005b63556d6e9f8114156110c4576020610200606463556d6e9f61014052606060046101603761015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa6110a757600080fd5b601f3d116110b457600080fd5b6000506102005160005260206000f35b63cde699fa81141561113857600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a051610180516101605161014051600658016154c4565b610240526102405160005260206000f35b634515cef3811415611ea8576023541561115157600080fd5b6001602355601d541561116357600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161018052735c2ed810328349100a66b82b78a1791b101c9d616101a0527328424507fefb6f7f8e9d3860f56504e4e5f5f3906101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506004803561024052806020013561026052806040013561028052506060366102a03760011561158c5760006103005261032060006003818352015b60006004610320516003811061128c57600080fd5b6020020135111561132b57602061040060646323b872dd6103405233610360523061038052600461032051600381106112c457600080fd5b60200201356103a05261035c600061018061032051600381106112e657600080fd5b60200201515af16112f657600080fd5b601f3d1161130357600080fd5b600050610400506103008051600181818301101561132057600080fd5b808201905090508152505b8151600101808352811415611277575b50506000610300511161134d57600080fd5b61032060006003818352015b6101e0610320516003811061136d57600080fd5b60200201516004610320516003811061138557600080fd5b602002013581818301101561139957600080fd5b8082019050905061034052610340516101e061032051600381106113bc57600080fd5b60200201526103405161032051600381106113d657600080fd5b601660c052602060c02001555b8151600101808352811415611359575b50506101e0516102a052610200516102c052610220516102e0526001610320526402540be40061034052600161036052600054610380526101e0805161032051808202821582848304141761144757600080fd5b809050905090508152506103a060016002818352015b6fffffffffffffffffffffffffffffffff61038051166103206103a0516003811061148757600080fd5b602002015180820282158284830414176114a057600080fd5b809050905090506103c0526101e06103a051600381106114bf57600080fd5b60200201516103c05180820282158284830414176114dc57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06103a0516003811061150757600080fd5b60200201526102406103a0516003811061152057600080fd5b60200201516103c051808202821582848304141761153d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406103a0516003811061156857600080fd5b60200201526103805160801c610380525b815160010180835281141561145d575b50505b602061042060a463c7fab70861032052610140516103405261016051610360526101e05161038052610200516103a052610220516103c05261033c731689acd208d817b32eeaccce8121278c5766f5305afa6115e757600080fd5b601f3d116115f457600080fd5b600050610420516103005260206103a060046318160ddd6103405261035c738096ac61db23291252574d49f036f0f9ed8ab3905afa61163257600080fd5b601f3d1161163f57600080fd5b6000506103a051610320526017546103405260006103605260006103405111156116bc576103205161030051808202821582848304141761167f57600080fd5b8090509050905061034051808061169557600080fd5b82049050905061032051808210156116ac57600080fd5b808203905090506103605261176e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161030051610380526103805160065801613a5c565b6103e052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610360525b6000610360511161177e57600080fd5b6000610380526000610340511115611d8f576101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156117ba57611798565b610240516103c052610260516103e05261028051610400526101e0516104205261020051610440526102205161046052610460516104405161042051610400516103e0516103c051600658016154c4565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561183a57611817565b6104c05161036051808202821582848304141761185657600080fd5b809050905090506402540be40080820490509050600181818301101561187b57600080fd5b80820190509050610380526103608051610380518082101561189c57600080fd5b808203905090508152506103208051610360518181830110156118be57600080fd5b80820190509050815250602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af161190a57600080fd5b601f3d1161191757600080fd5b600050610440506040366103a037620186a0610360511115611cc95760006103e05261040060006003818352015b6004610400516003811061195857600080fd5b60200201351515611988576103e08051600181818301101561197957600080fd5b80820190509050815250611991565b610400516103c0525b8151600101808352811415611945575b505060026103e0511415611cc95760603661040037600254610460526001610480526402540be4006104a05260016104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff61046051166104206104e05160028110611a0957600080fd5b60200201526104605160801c610460525b81516001018083528114156119df575b50506104e060006003818352015b6103c0516104e0511815611b5c576104e0511515611a965761040080516102a051610480518082028215828483041417611a7157600080fd5b80905090509050818183011015611a8757600080fd5b80820190509050815250611b5c565b61040080516102a06104e05160038110611aaf57600080fd5b60200201516104206104e051600180821015611aca57600080fd5b8082039050905060028110611ade57600080fd5b60200201518082028215828483041417611af757600080fd5b809050905090506104806104e05160038110611b1257600080fd5b60200201518082028215828483041417611b2b57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b5157600080fd5b808201905090508152505b8151600101808352811415611a38575b505061040051610360518082028215828483041417611b8a57600080fd5b80905090509050610320518080611ba057600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417611bcb57600080fd5b8090509050905060046103c05160038110611be557600080fd5b60200201356104806103c05160038110611bfe57600080fd5b60200201518082028215828483041417611c1757600080fd5b80905090509050610360516102a06103c05160038110611c3657600080fd5b60200201518082028215828483041417611c4f57600080fd5b809050905090506104806103c05160038110611c6a57600080fd5b60200201518082028215828483041417611c8357600080fd5b80905090509050610320518080611c9957600080fd5b82049050905080821015611cac57600080fd5b808203905090508080611cbe57600080fd5b8204905090506103a0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611cf357611cd1565b610140516104005261016051610420526101e05161044052610200516104605261022051610480526103c0516104a0526103a0516104c052610300516104e0526104e0516104c0516104a051610480516104605161044051610420516104005160065801614335565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611d8757611d64565b600050611e0d565b61030051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061044060446340c10f196103a052336103c052610360516103e0526103bc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611df057600080fd5b601f3d11611dfd57600080fd5b60005061044051611e0d57600080fd5b6064356103605110151515611e61576308c379a06103a05260206103c05260086103e0527f536c697070616765000000000000000000000000000000000000000000000000610400526103e05060646103bcfd5b606060046103a03761038051610400526103205161042052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103a0a26000602355005b63ecb586a58114156122265760235415611ec157600080fd5b600160235573e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161014052735c2ed810328349100a66b82b78a1791b101c9d61610160527328424507fefb6f7f8e9d3860f56504e4e5f5f39061018052602061022060046318160ddd6101c0526101dc738096ac61db23291252574d49f036f0f9ed8ab3905afa611f4457600080fd5b601f3d11611f5157600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc6000738096ac61db23291252574d49f036f0f9ed8ab3905af1611f9d57600080fd5b601f3d11611faa57600080fd5b60005061026051611fba57600080fd5b60168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c02001546102005250600435600180821015611fff57600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061202a57600080fd5b602002015161022051808202821582848304141761204757600080fd5b809050905090506101a051808061205d57600080fd5b820490509050610260526024610240516003811061207a57600080fd5b602002013561026051101561208e57600080fd5b6101c061024051600381106120a257600080fd5b602002015161026051808210156120b857600080fd5b8082039050905061024051600381106120d057600080fd5b601660c052602060c0200155610260516101c061024051600381106120f457600080fd5b60200201526020610320604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061212f57600080fd5b60200201515af161213f57600080fd5b601f3d1161214c57600080fd5b600050610320505b8151600101808352811415612016575b505060175461024052610240516102405161022051808202821582848304141761218d57600080fd5b809050905090506101a05180806121a357600080fd5b820490509050808210156121b657600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156121ec57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156122b45760643560011c1561224257600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c733c0ebff09d6bb028eed1dd29669c2e3bf98c9d7f5afa61229757600080fd5b601f3d116122a457600080fd5b6000506102205160005260206000f35b634fb08c5e8114156123ef5760403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525061014051610160516101405161018052610160516101a052604060046101c037600061020052610200516101e0516101c0516101a0516101805160065801615701565b61026052610280526102a0526102c0526102e05261030052610160526101405261026080808080516103205250506020810190508080805161034052505060208101905080808051610360525050602081019050808080808051610380525050602081019050808080516103a0525050602081019050808080516103c0525050505050506103205160005260206000f35b63f1dc3cc981141561282c576023541561240857600080fd5b6001602355601d541561241a57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525060c036610180376101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101605161026052604060046102803760016102c0526102c0516102a05161028051610260516102405160065801615701565b610320526103405261036052610380526103a0526103c05261022052610200526101e0526101c0526101a05261018052610160526101405261032080808080516103e052505060208101905080808051610400525050602081019050808080516104205250506020810190508080808080516104405250506020810190508080805161046052505060208101905080808051610480525050505050506103e080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612600576308c379a0610240526020610260526008610280527f536c6970706167650000000000000000000000000000000000000000000000006102a05261028050606461025cfd5b6024356003811061261057600080fd5b601660c052602060c020018054610180518082101561262e57600080fd5b8082039050905081555060206102e060446379cc67906102405233610260526004356102805261025c6000738096ac61db23291252574d49f036f0f9ed8ab3905af161267957600080fd5b601f3d1161268657600080fd5b6000506102e05161269657600080fd5b6001156127425773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526020610340604463a9059cbb6102a052336102c052610180516102e0526102bc60006102406024356003811061271d57600080fd5b60200201515af161272d57600080fd5b601f3d1161273a57600080fd5b600050610340505b6101405161016051610180516101a0516101c0516101e0516102005161022051610140516102405261016051610260526101e05161028052610200516102a052610220516102c0526024356102e0526101c051610300526101a0516103205261032051610300516102e0516102c0516102a05161028051610260516102405160065801614335565b61022052610200526101e0526101c0526101a05261018052610160526101405260005060406004610240376101805161028052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06060610240a26000602355005b63c93f49e881141561285d576023541561284557600080fd5b600160235560065801613b9d565b6000506000602355005b635e248072811415612a9557601854331461287757600080fd5b6006546201517f81818301101561288d57600080fd5b80820190509050421161289f57600080fd5b426201517f8181830110156128b357600080fd5b80820190509050604435116128c757600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b61018052610160516101805117610180526004356064808202821582848304141761295357600080fd5b809050905090506101a0526000600435111561297657620f424060043510612979565b60005b61298257600080fd5b6402540be3ff60243511156129a257662386f26fc10001602435106129a5565b60005b6129ae57600080fd5b610140516101a05110156129f157610140516101a051600a80820282158284830414176129da57600080fd5b8090509050905010156129ec57600080fd5b612a21565b61014051600a8082028215828483041417612a0b57600080fd5b809050905090506101a0511115612a2157600080fd5b61018051600455426006556101a05160801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e0526101a051610200524261022052604435610240527f7dce008c7221b9d42f26174f7435e50f9cc8f502c57019724c090b546415a02960806101e0a1005b63244c7c2e811415612b76576018543314612aaf57600080fd5b60403661014037610140516101605160065801613744565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612eab576018543314612b9057600080fd5b60205415612b9d57600080fd5b60e06004610140377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610160511815612bff5764012a05f201610160511015612bee576207a11f6101605111612bf1565b60005b612bfa57600080fd5b612c07565b601154610160525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610140511415612c3a57601054610140525b61016051610140511115612c4d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610180511815612c91576402540be4016101805110612c8c57600080fd5b612c99565b601254610180525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511815612cf95760006101a0511115612ce8576c100000000000000000000000006101a05110612ceb565b60005b612cf457600080fd5b612d01565b600a546101a0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0511815612d4357610140516101c05111612d3e57600080fd5b612d4b565b6008546101c0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e0511415612d7e57600c546101e0525b6101c0516101e0511115612d9157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610200511815612de7576000610200511115612dd65762093a806102005110612dd9565b60005b612de257600080fd5b612def565b600e54610200525b426203f480818183011015612e0357600080fd5b8082019050905061022052610220516020556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd811415612fe45760235415612ec457600080fd5b60016023556018543314612ed757600080fd5b602054421015612ee657600080fd5b600060205418612ef557600080fd5b600060205560155461014052610140516012541815612f2a576101405160065801613b9d565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb811415613005576018543314612ffe57600080fd5b6000602055005b636b441a408114156130975760043560a01c1561302157600080fd5b601854331461302f57600080fd5b601f541561303c57600080fd5b426203f48081818301101561305057600080fd5b808201905090506101405261014051601f55600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561310e5760185433146130b157600080fd5b601f544210156130c057600080fd5b6000601f54186130cf57600080fd5b6000601f556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561312f57601854331461312857600080fd5b6000601f55005b63e369885381141561315e57601854331461314957600080fd5b42601e541161315757600080fd5b6001601d55005b633046f97281141561317f57601854331461317857600080fd5b6000601d55005b63c51b88618114156131b15760043560a01c1561319b57600080fd5b60185433146131a957600080fd5b600435602155005b637242e5248114156131e35760043560a01c156131cd57600080fd5b60185433146131db57600080fd5b600435602255005b636112c7478114156131fb5760035460005260206000f35b63204fe3d58114156132135760045460005260206000f35b63f30cfad581141561322b5760055460005260206000f35b63e89876ff8114156132435760065460005260206000f35b63f9ed959781141561325b5760075460005260206000f35b6303b736e08114156132735760085460005260206000f35b6373fb971181141561328b5760095460005260206000f35b6372d4f0e28114156132a357600a5460005260206000f35b63d7c3dcbe8114156132bb57600b5460005260206000f35b63083812e58114156132d357600c5460005260206000f35b634ea12c7d8114156132eb57600d5460005260206000f35b63662b627481141561330357600e5460005260206000f35b630c5e23d481141561331b57600f5460005260206000f35b6392526c0c8114156133335760105460005260206000f35b63ee8de67581141561334b5760115460005260206000f35b63fee3f7f98114156133635760125460005260206000f35b637cf9aedc81141561337b5760135460005260206000f35b637d1b060c8114156133935760145460005260206000f35b63e38244628114156133ab5760155460005260206000f35b634903b0d18114156133dc57600435600381106133c757600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156133f45760175460005260206000f35b638da5cb5b81141561340c5760185460005260206000f35b631ec0cdc18114156134245760195460005260206000f35b637ba1a74d81141561343c57601a5460005260206000f35b630b7b594b81141561345457601b5460005260206000f35b630c46b72a81141561346c57601c5460005260206000f35b639c868ac081141561348457601d5460005260206000f35b632a42689681141561349c57601e5460005260206000f35b63e0a0b5868114156134b457601f5460005260206000f35b63405e28f88114156134cc5760205460005260206000f35b63b618ba628114156134e45760215460005260206000f35b636e42e4d28114156134fc5760225460005260206000f35b505b60006000fd5b6101805261014052610160526002610140511061352057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806101405160405181111561356557600080fd5b8082028080600081121561357557195b607f1c1561358257600080fd5b905090509050600081121561359f5761016051816000031c6135a6565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05260016101e0526402540be4006102005260016102205261016080516101e051808202821582848304141761362657600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e0610240516003811061366657600080fd5b6020020151808202821582848304141761367f57600080fd5b8090509050905061026052610160610240516003811061369e57600080fd5b60200201516102605180820282158284830414176136bb57600080fd5b80905090509050670de0b6b3a76400008082049050905061016061024051600381106136e657600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561363c575b50506060610240525b6000610240511115156137225761373e565b6020610240510361016001516020610240510361024052613710565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613901576004546101e05260065461020052610160805161020051808210156137aa57600080fd5b808203905090508152504261020051808210156137c657600080fd5b80820390509050610200526101e05160801c6101605161020051808210156137ed57600080fd5b80820390509050808202821582848304141761380857600080fd5b809050905090506101c05161020051808202821582848304141761382b57600080fd5b8090509050905081818301101561384157600080fd5b8082019050905061016051808061385757600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e0511661016051610200518082101561388c57600080fd5b8082039050905080820282158284830414176138a757600080fd5b809050905090506101a0516102005180820282158284830414176138ca57600080fd5b809050905090508181830110156138e057600080fd5b808201905090506101605180806138f657600080fd5b8204905090506101a0525b6102206101c05181526101a0518160200152506040610260525b60006102605111151561392d57613949565b602061026051036102200151602061026051036102605261391b565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc731689acd208d817b32eeaccce8121278c5766f5305afa6139b157600080fd5b601f3d116139be57600080fd5b6000506102c0516101c0526010546101c05180820282158284830414176139e457600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613a0857600080fd5b808203905090508082028215828483041417613a2357600080fd5b80905090509050818183011015613a3957600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613ab057600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613ae357600080fd5b809050905090508080613af557600080fd5b8204905090506101806102005160038110613b0f57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613a8f575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c731689acd208d817b32eeaccce8121278c5766f5305afa613b7d57600080fd5b601f3d11613b8a57600080fd5b6000506102c05160005260005161016051565b6101405260225461016052601a5461018052601c546101a05261018051601b5480821015613bca57600080fd5b808203905090506012548082028215828483041417613be857600080fd5b809050905090506404a817c800808204905090506101c05260006101c05111156140cc576101a051670de0b6b3a76400008082028215828483041417613c2d57600080fd5b809050905090506101a0516101c05180821015613c4957600080fd5b808203905090508080613c5b57600080fd5b820490509050670de0b6b3a764000080821015613c7757600080fd5b808203905090506101e05260206102c06044636962f8456102205261016051610240526101e0516102605261023c6000738096ac61db23291252574d49f036f0f9ed8ab3905af1613cc757600080fd5b601f3d11613cd457600080fd5b6000506102c0516102005260206102a060046318160ddd6102405261025c738096ac61db23291252574d49f036f0f9ed8ab3905afa613d1257600080fd5b601f3d11613d1f57600080fd5b6000506102a0516102205273e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d17161024052735c2ed810328349100a66b82b78a1791b101c9d61610260527328424507fefb6f7f8e9d3860f56504e4e5f5f390610280526102a060006003818352015b602061034060246370a082316102c052306102e0526102dc6102406102a05160038110613dad57600080fd5b60200201515afa613dbd57600080fd5b601f3d11613dca57600080fd5b600050610340516102a05160038110613de257600080fd5b601660c052602060c02001555b8151600101808352811415613d81575b50506040366102a0376101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015613e3257613e10565b60065801613744565b61030052610320526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515613e6e57613e4b565b610300808080805161034052505060208101905080808051610360525050505061034080516102a05280602001516102c05250610140610340525b61034051516020610340510161034052610340610340511015613ecb57613ea9565b600658016135b5565b61036052610380526103a052610320610340525b6103405152602061034051036103405261014061034051101515613f0b57613ee8565b61036080516102e05280602001516103005280604001516103205250602061046060a463c7fab708610360526102a051610380526102c0516103a0526102e0516103c052610300516103e052610320516104005261037c731689acd208d817b32eeaccce8121278c5766f5305afa613f8257600080fd5b601f3d11613f8f57600080fd5b6000506104605161034052670de0b6b3a7640000610140610380525b61038051516020610380510161038052610380610380511015613fcd57613fab565b610340516103a0526103a05160065801613a5c565b61040052610360610380525b610380515260206103805103610380526101406103805110151561401157613fee565b61040051808202821582848304141761402957600080fd5b8090509050905061022051808061403f57600080fd5b8204905090506103605261036051601c55610360516101805181818301101561406757600080fd5b808201905090506101a0518082101561407f57600080fd5b808203905090506101805261018051601b5561018051601a556102005161038052610160517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596020610380a25b6021546101605260006101605118156142f55760006004610240527f3111e7b300000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af150508051820191505060606020826102a00101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020826102a0010152602081019050306020826102a001015260208101905060026020826102a0010152602081019050735c2ed810328349100a66b82b78a1791b101c9d616020826102a00101526020810190507328424507fefb6f7f8e9d3860f56504e4e5f5f3906020826102a0010152602081019050806102a0526102a090508051602001806103c08284600060045af16141fc57600080fd5b505060206105006103c0516103e0600073357d51124f59836ded84c8a1730d72b749d8bc235af161422c57600080fd5b60203d8082111561423d578061423f565b815b905090506104e0526104e08051602001806101e08284600060045af161426457600080fd5b505060206102e0604463a9059cbb6102405261016051610260526101e080602001516000825180602090131561429957600080fd5b80919012156142a757600080fd5b806020036101000a82049050905090506102805261025c6000730d500b1d8e8ef31e21c99d1db9a6444d3adf12705af16142e057600080fd5b601f3d116142ed57600080fd5b6000506102e0505b610140515661432d575b610240526000610220526101405261016052610180526101a0526101c0526101e05261020052600050614361565b600015614361575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052600050614361565b604036610260376001546102a0526102c060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102606102c051600281106143a557600080fd5b60200201526102a05160801c6102a0525b815160010180835281141561437b575b50506003546102c0526040366102e0376002546102a05261032060006002818352015b6fffffffffffffffffffffffffffffffff6102a051166102e0610320516002811061441357600080fd5b60200201526102a05160801c6102a0525b81516001018083528114156143e9575b5050426102c051101561467957600e54610320526020610400604463571bae3f61036052426102c0518082101561446a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761448e57600080fd5b809050905090506103205180806144a457600080fd5b820490509050610380526402540be4006103a05261037c731689acd208d817b32eeaccce8121278c5766f5305afa6144db57600080fd5b601f3d116144e857600080fd5b600050610400516103405260006102a05261036060006002818352015b6102e0610360516002811061451957600080fd5b6020020151670de0b6b3a7640000610340518082101561453857600080fd5b80820390509050808202821582848304141761455357600080fd5b80905090509050610260610360516002811061456e57600080fd5b602002015161034051808202821582848304141761458b57600080fd5b809050905090508181830110156145a157600080fd5b80820190509050670de0b6b3a76400008082049050905061026061036051600281106145cc57600080fd5b60200201525b8151600101808352811415614505575b505061036060006002818352015b6102a05160801b6102a0526102606001610360518082101561461157600080fd5b808203905090506002811061462557600080fd5b6020020151610380526fffffffffffffffffffffffffffffffff610380511061464d57600080fd5b6102a05161038051176102a0525b81516001018083528114156145f0575b50506102a051600155426003555b61022051610320526102205115156146ff57602061044060a463c7fab7086103405261014051610360526101605161038052610180516103a0526101a0516103c0526101c0516103e05261035c731689acd208d817b32eeaccce8121278c5766f5305afa6146e657600080fd5b601f3d116146f357600080fd5b60005061044051610320525b6000546102a0526040366103403761038060006002818352015b6fffffffffffffffffffffffffffffffff6102a05116610340610380516002811061474357600080fd5b60200201526102a05160801c6102a0525b8151600101808352811415614719575b505060006102005111156148465760006101e05111156147b657610200516102e06101e05160018082101561479857600080fd5b80820390509050600281106147ac57600080fd5b6020020152614841565b61038060006002818352015b6102e061038051600281106147d657600080fd5b6020020151670de0b6b3a764000080820282158284830414176147f857600080fd5b8090509050905061020051808061480e57600080fd5b8204905090506102e0610380516002811061482857600080fd5b60200201525b81516001018083528114156147c2575b50505b6149f1565b61018051610380526101a0516103a0526101c0516103c05261038051620f4240808204905090506103e05261038080516103e05181818301101561488957600080fd5b8082019050905081525061040060006002818352015b61034061040051600281106148b357600080fd5b60200201516103e05180820282158284830414176148d057600080fd5b809050905090506101806104005160018181830110156148ef57600080fd5b808201905090506003811061490357600080fd5b6020020151602061056060e46336bc8855610420526101405161044052610160516104605261038051610480526103a0516104a0526103c0516104c052610320516104e05261040051600181818301101561495d57600080fd5b808201905090506105005261043c731689acd208d817b32eeaccce8121278c5766f5305afa61498b57600080fd5b601f3d1161499857600080fd5b60005061056051808210156149ac57600080fd5b8082039050905080806149be57600080fd5b8204905090506102e061040051600281106149d857600080fd5b60200201525b815160010180835281141561489f575b50505b60006102a05261038060006002818352015b6102a05160801b6102a0526102e060016103805180821015614a2457600080fd5b8082039050905060028110614a3857600080fd5b60200201516103a0526fffffffffffffffffffffffffffffffff6103a05110614a6057600080fd5b6102a0516103a051176102a0525b8151600101808352811415614a03575b50506102a051600255600061038052602061042060046318160ddd6103c0526103dc738096ac61db23291252574d49f036f0f9ed8ab3905afa614ac057600080fd5b601f3d11614acd57600080fd5b600050610420516103a052601a546103c052601c546103e05261040060006002818352015b6102606104005160028110614b0657600080fd5b6020020151670de0b6b3a76400008082028215828483041417614b2857600080fd5b809050905090506103406104005160028110614b4357600080fd5b60200201518080614b5357600080fd5b82049050905061042052670de0b6b3a7640000610420511115614b9a576104208051670de0b6b3a764000080821015614b8b57600080fd5b80820390509050815250614bc0565b670de0b6b3a76400006104205180821015614bb457600080fd5b80820390509050610420525b61038080517001000000000000000000000000000000006104205110614be557600080fd5b6002610420510a818183011015614bfb57600080fd5b808201905090508152505b8151600101808352811415614af2575b505060603661040037610320516003808204905090506104005261046060006002818352015b61032051670de0b6b3a76400008082028215828483041417614c5d57600080fd5b8090509050905060036103406104605160028110614c7a57600080fd5b60200201518082028215828483041417614c9357600080fd5b809050905090508080614ca557600080fd5b820490509050610400610460516001818183011015614cc357600080fd5b8082019050905060038110614cd757600080fd5b60200201525b8151600101808352811415614c3c575b5050670de0b6b3a764000061046052670de0b6b3a76400006104805260006103e0511115614e48576020610580606463bad1dc266104c052610400516104e052610420516105005261044051610520526104dc731689acd208d817b32eeaccce8121278c5766f5305afa614d6057600080fd5b601f3d11614d6d57600080fd5b600050610580516104a052670de0b6b3a76400006104a0518082028215828483041417614d9957600080fd5b809050905090506103a0518080614daf57600080fd5b820490509050610480526103c051610480518082028215828483041417614dd557600080fd5b809050905090506103e0518080614deb57600080fd5b820490509050610460526103e051610480511015614e48576308c379a06104c05260206104e0526004610500527f4c6f737300000000000000000000000000000000000000000000000000000000610520526105005060646104dcfd5b61046051601a5570010000000000000000000000000000000060085410614e6e57600080fd5b60026008540a610380511115614e8a5760006103e05111614e8d565b60005b1561544f5760206105206024634e60b1416104a05261038051670de0b6b3a7640000808204905090506104c0526104bc731689acd208d817b32eeaccce8121278c5766f5305afa614edd57600080fd5b601f3d11614eea57600080fd5b6000506105205161038052600c546104a0526040366104c03761050060006002818352015b6103406105005160028110614f2357600080fd5b6020020151610380516104a05180821015614f3d57600080fd5b808203905090508082028215828483041417614f5857600080fd5b809050905090506104a0516102606105005160028110614f7757600080fd5b60200201518082028215828483041417614f9057600080fd5b80905090509050818183011015614fa657600080fd5b80820190509050610380518080614fbc57600080fd5b8204905090506104c06105005160028110614fd657600080fd5b60200201525b8151600101808352811415614f0f575b505061018051610400526101a051610420526101c0516104405261050060006002818352015b61018061050051600181818301101561502a57600080fd5b808201905090506003811061503e57600080fd5b60200201516104c0610500516002811061505757600080fd5b6020020151808202821582848304141761507057600080fd5b80905090509050610340610500516002811061508b57600080fd5b6020020151808061509b57600080fd5b8204905090506104006105005160018181830110156150b957600080fd5b80820190509050600381106150cd57600080fd5b60200201525b8151600101808352811415615012575b5050602061062060a463c7fab70861052052610140516105405261016051610560526104005161058052610420516105a052610440516105c05261053c731689acd208d817b32eeaccce8121278c5766f5305afa61514057600080fd5b601f3d1161514d57600080fd5b6000506106205161050052610500516003808204905090506104005261052060006002818352015b61050051670de0b6b3a7640000808202821582848304141761519657600080fd5b8090509050905060036104c061052051600281106151b357600080fd5b602002015180820282158284830414176151cc57600080fd5b8090509050905080806151de57600080fd5b8204905090506104006105205160018181830110156151fc57600080fd5b808201905090506003811061521057600080fd5b60200201525b8151600101808352811415615175575b5050670de0b6b3a764000060206105e0606463bad1dc266105205261040051610540526104205161056052610440516105805261053c731689acd208d817b32eeaccce8121278c5766f5305afa61527c57600080fd5b601f3d1161528957600080fd5b6000506105e05180820282158284830414176152a457600080fd5b809050905090506103a05180806152ba57600080fd5b8204905090506103e052670de0b6b3a76400006103e051111561533c5761046051670de0b6b3a7640000808210156152f157600080fd5b8082039050905060026103e051670de0b6b3a76400008082101561531457600080fd5b80820390509050808202821582848304141761532f57600080fd5b809050905090501161533f565b60005b1561544f5760006102a05261052060006002818352015b6102a05160801b6102a0526104c06001610520518082101561537757600080fd5b808203905090506002811061538b57600080fd5b6020020151610540526fffffffffffffffffffffffffffffffff61054051106153b357600080fd5b6102a05161054051176102a0525b8151600101808352811415615356575b50506102a051600055610500516017556103e051601c55610140610520525b61052051516020610520510161052052610520610520511015615412576153f0565b60065801613b9d565b610500610520525b610520515260206105205103610520526101406105205110151561544657615423565b60005061024051565b6103205160175561048051601c556101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561548757615465565b60065801613b9d565b6104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156154bb57615498565b60005061024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e051610280526102805161026051610240516006580161394f565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516003808202821582848304141761556b57600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b602061028051026101400151610260526102408051610260518181830110156155b957600080fd5b808201905090508152505b8151600101808352811415615591575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156156565761028080516102a051610260518082101561563157600080fd5b8082039050905081818301101561564757600080fd5b80820190509050815250615691565b6102808051610260516102a0518082101561567057600080fd5b8082039050905081818301101561568657600080fd5b808201905090508152505b81516001018083528114156155f9575b5050610220516102805180820282158284830414176156bf57600080fd5b809050905090506102405180806156d557600080fd5b820490509050620186a08181830110156156ee57600080fd5b8082019050905060005260005161020051565b6101e0526101405261016052610180526101a0526101c05260175461020052610200516102205260206102c060046318160ddd6102605261027c738096ac61db23291252574d49f036f0f9ed8ab3905afa61575b57600080fd5b601f3d1161576857600080fd5b6000506102c051610240526102405161018051111561578657600080fd5b60036101a0511061579657600080fd5b60168060c052602060c020546102605260018160c052602060c02001546102805260028160c052602060c02001546102a0525060016102c0526402540be4006102e052600161030052670de0b6b3a76400006102c051808202821582848304141761580057600080fd5b809050905090506103205260011561596557600054610340526102c0805161026051808202821582848304141761583657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a05114156158b157610380516102c06101a0516003811061588c57600080fd5b602002015180820282158284830414176158a557600080fd5b80905090509050610320525b6102c061036051600381106158c557600080fd5b602002015161026061036051600381106158de57600080fd5b602002015180820282158284830414176158f757600080fd5b8090509050905061038051808202821582848304141761591657600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0610360516003811061594157600080fd5b60200201526103405160801c610340525b815160010180835281141561584c575b50505b610140610360525b6103605151602061036051016103605261036061036051101561598f5761596d565b6102c051610380526102e0516103a052610300516103c0526103c0516103a051610380516006580161394f565b61042052610340610360525b61036051526020610360510361036052610140610360511015156159eb576159c8565b610420516103405261018051610200518082028215828483041417615a0f57600080fd5b80905090509050610240518080615a2557600080fd5b8204905090506103605261020080516103605161034051610360518082028215828483041417615a5457600080fd5b809050905090506404a817c800808204905090506001818183011015615a7957600080fd5b8082019050905080821015615a8d57600080fd5b8082039050905080821015615aa157600080fd5b8082039050905081525060206104e060e46336bc88556103a052610140516103c052610160516103e0526102c051610400526102e05161042052610300516104405261020051610460526101a051610480526103bc731689acd208d817b32eeaccce8121278c5766f5305afa615b1657600080fd5b601f3d11615b2357600080fd5b6000506104e051610380526102c06101a05160038110615b4257600080fd5b60200201516103805180821015615b5857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b7c57600080fd5b80905090509050610320518080615b9257600080fd5b8204905090506103a052610380516102c06101a05160038110615bb457600080fd5b602002015260006103c0526101c05115615bec57620186a06103a0511115615be457620186a06101805111615be7565b60005b615bef565b60005b15615f005760006103e0526001610400526402540be40061042052600161044052604036610460376002546104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff6104a051166104606104c05160028110615c5457600080fd5b60200201526104a05160801c6104a0525b8151600101808352811415615c2a575b50506104c060006003818352015b6101a0516104c0511815615da7576104c0511515615ce1576103e0805161026051610400518082028215828483041417615cbc57600080fd5b80905090509050818183011015615cd257600080fd5b80820190509050815250615da7565b6103e080516102606104c05160038110615cfa57600080fd5b60200201516104606104c051600180821015615d1557600080fd5b8082039050905060028110615d2957600080fd5b60200201518082028215828483041417615d4257600080fd5b809050905090506104006104c05160038110615d5d57600080fd5b60200201518082028215828483041417615d7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9c57600080fd5b808201905090508152505b8151600101808352811415615c83575b50506103e051610360518082028215828483041417615dd557600080fd5b80905090509050610220518080615deb57600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417615e1657600080fd5b809050905090506103a0516104006101a05160038110615e3557600080fd5b60200201518082028215828483041417615e4e57600080fd5b80905090509050610360516102606101a05160038110615e6d57600080fd5b60200201518082028215828483041417615e8657600080fd5b809050905090506104006101a05160038110615ea157600080fd5b60200201518082028215828483041417615eba57600080fd5b80905090509050610220518080615ed057600080fd5b82049050905080821015615ee357600080fd5b808203905090508080615ef557600080fd5b8204905090506103c0525b6104a06103a05181526103c0518160200152610200518160400152806060016102c05181526102e0518160200152610300518160400152505060c0610560525b600061056051111515615f5257615f6e565b602061056051036104a001516020610560510361056052615f40565b6101e05156

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f670000000000000000000000000000000000000000000000000000000000000e3d00000000000000000000000000000000000000000000000000003faa25225fff00000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000009f295cd5f0000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000008043864d56e85dd423f0000000000000000000000000000000000000000000000891df2f32fd9b934f1

-----Decoded View---------------
Arg [0] : owner (address): 0xbabe61887f1de2713c6f97e567623453d3C79f67
Arg [1] : A (uint256): 3645
Arg [2] : gamma (uint256): 69999999999999
Arg [3] : mid_fee (uint256): 4000000
Arg [4] : out_fee (uint256): 40000000
Arg [5] : price_threshold (uint256): 2800000000000000
Arg [6] : fee_gamma (uint256): 10000000000000000
Arg [7] : adjustment_step (uint256): 1500000000000000
Arg [8] : admin_fee (uint256): 0
Arg [9] : ma_half_time (uint256): 600
Arg [10] : initial_prices (uint256[2]): 37856782446686463935039,2529361992656514266353

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e3d
Arg [2] : 00000000000000000000000000000000000000000000000000003faa25225fff
Arg [3] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [4] : 0000000000000000000000000000000000000000000000000000000002625a00
Arg [5] : 0000000000000000000000000000000000000000000000000009f295cd5f0000
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 0000000000000000000000000000000000000000000000000005543df729c000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [10] : 0000000000000000000000000000000000000000000008043864d56e85dd423f
Arg [11] : 0000000000000000000000000000000000000000000000891df2f32fd9b934f1


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.