false
false
100

Contract Address Details

0xEfadDdE5B43917CcC738AdE6962295A0B343f7CE

Contract Name
Vyper_contract
Creator
0xe6b328–04353e at 0x561668–ccd31f
Balance
0 KAVA ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
11602711
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Vyper_contract




Optimization enabled
false
Compiler version
v0.3.1




Verified at
2023-07-14T13:27:10.521882Z

Contract source code

# @version 0.3.1
# (c) Curve.Fi, 2023
# Math for crypto pools with 2 coins
#
# Unless otherwise agreed on, only contracts owned by Curve DAO or
# Swiss Stake GmbH are allowed to call this contract.

interface Curve:
    def fee_gamma() -> uint256: view
    def out_fee() -> uint256: view
    def mid_fee() -> uint256: view


N_COINS: constant(int128) = 2
A_MULTIPLIER: constant(uint256) = 10000
MIN_GAMMA: constant(uint256) = 10**10
MAX_GAMMA: constant(uint256) = 2 * 10**16
MIN_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER / 10
MAX_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER * 100000

@internal
@pure
def geometric_mean(unsorted_x: uint256[N_COINS], sort: bool) -> uint256:
    """
    (x[0] * x[1] * ...) ** (1/N)
    """
    x: uint256[N_COINS] = unsorted_x
    if sort and x[0] < x[1]:
        x = [unsorted_x[1], unsorted_x[0]]
    D: uint256 = x[0]
    diff: uint256 = 0
    for i in range(255):
        D_prev: uint256 = D
        # tmp: uint256 = 10**18
        # for _x in x:
        #     tmp = tmp * _x / D
        # D = D * ((N_COINS - 1) * 10**18 + tmp) / (N_COINS * 10**18)
        # line below makes it for 2 coins
        D = (D + x[0] * x[1] / D) / N_COINS
        if D > D_prev:
            diff = D - D_prev
        else:
            diff = D_prev - D
        if diff <= 1 or diff * 10**18 < D:
            return D
    raise "Did not converge"


@external
@view
def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256:
    """
    Finding the invariant using Newton method.
    ANN is higher by the factor A_MULTIPLIER
    ANN is already A * N**N

    Currently uses 60k gas
    """
    # Safety checks
    assert ANN > MIN_A - 1 and ANN < MAX_A + 1  # dev: unsafe values A
    assert gamma > MIN_GAMMA - 1 and gamma < MAX_GAMMA + 1  # dev: unsafe values gamma

    # Initial value of invariant D is that for constant-product invariant
    x: uint256[N_COINS] = x_unsorted
    if x[0] < x[1]:
        x = [x_unsorted[1], x_unsorted[0]]

    assert x[0] > 10**9 - 1 and x[0] < 10**15 * 10**18 + 1  # dev: unsafe values x[0]
    assert x[1] * 10**18 / x[0] > 10**14-1  # dev: unsafe values x[i] (input)

    D: uint256 = N_COINS * self.geometric_mean(x, False)
    S: uint256 = x[0] + x[1]

    for i in range(255):
        D_prev: uint256 = D

        # K0: uint256 = 10**18
        # for _x in x:
        #     K0 = K0 * _x * N_COINS / D
        # collapsed for 2 coins
        K0: uint256 = (10**18 * N_COINS**2) * x[0] / D * x[1] / D

        _g1k0: uint256 = gamma + 10**18
        if _g1k0 > K0:
            _g1k0 = _g1k0 - K0 + 1
        else:
            _g1k0 = K0 - _g1k0 + 1

        # D / (A * N**N) * _g1k0**2 / gamma**2
        mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN

        # 2*N*K0 / _g1k0
        mul2: uint256 = (2 * 10**18) * N_COINS * K0 / _g1k0

        neg_fprime: uint256 = (S + S * mul2 / 10**18) + mul1 * N_COINS / K0 - mul2 * D / 10**18

        # D -= f / fprime
        D_plus: uint256 = D * (neg_fprime + S) / neg_fprime
        D_minus: uint256 = D*D / neg_fprime
        if 10**18 > K0:
            D_minus += D * (mul1 / neg_fprime) / 10**18 * (10**18 - K0) / K0
        else:
            D_minus -= D * (mul1 / neg_fprime) / 10**18 * (K0 - 10**18) / K0

        if D_plus > D_minus:
            D = D_plus - D_minus
        else:
            D = (D_minus - D_plus) / 2

        diff: uint256 = 0
        if D > D_prev:
            diff = D - D_prev
        else:
            diff = D_prev - D
        if diff * 10**14 < max(10**16, D):  # Could reduce precision for gas efficiency here
            # Test that we are safe with the next newton_y
            for _x in x:
                frac: uint256 = _x * 10**18 / D
                assert (frac > 10**16 - 1) and (frac < 10**20 + 1)  # dev: unsafe values x[i]
            return D

    raise "Did not converge"


@external
@view
def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256:
    """
    Calculating x[i] given other balances x[0..N_COINS-1] and invariant D
    ANN = A * N**N
    """
    # Safety checks
    assert ANN > MIN_A - 1 and ANN < MAX_A + 1  # dev: unsafe values A
    assert gamma > MIN_GAMMA - 1 and gamma < MAX_GAMMA + 1  # dev: unsafe values gamma
    assert D > 10**17 - 1 and D < 10**15 * 10**18 + 1 # dev: unsafe values D

    x_j: uint256 = x[1 - i]
    y: uint256 = D**2 / (x_j * N_COINS**2)
    K0_i: uint256 = (10**18 * N_COINS) * x_j / D
    # S_i = x_j

    # frac = x_j * 1e18 / D => frac = K0_i / N_COINS
    assert (K0_i > 10**16*N_COINS - 1) and (K0_i < 10**20*N_COINS + 1)  # dev: unsafe values x[i]

    # x_sorted: uint256[N_COINS] = x
    # x_sorted[i] = 0
    # x_sorted = self.sort(x_sorted)  # From high to low
    # x[not i] instead of x_sorted since x_soted has only 1 element

    convergence_limit: uint256 = max(max(x_j / 10**14, D / 10**14), 100)

    for j in range(255):
        y_prev: uint256 = y

        K0: uint256 = K0_i * y * N_COINS / D
        S: uint256 = x_j + y

        _g1k0: uint256 = gamma + 10**18
        if _g1k0 > K0:
            _g1k0 = _g1k0 - K0 + 1
        else:
            _g1k0 = K0 - _g1k0 + 1

        # D / (A * N**N) * _g1k0**2 / gamma**2
        mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN

        # 2*K0 / _g1k0
        mul2: uint256 = 10**18 + (2 * 10**18) * K0 / _g1k0

        yfprime: uint256 = 10**18 * y + S * mul2 + mul1
        _dyfprime: uint256 = D * mul2
        if yfprime < _dyfprime:
            y = y_prev / 2
            continue
        else:
            yfprime -= _dyfprime
        fprime: uint256 = yfprime / y

        # y -= f / f_prime;  y = (y * fprime - f) / fprime
        # y = (yfprime + 10**18 * D - 10**18 * S) // fprime + mul1 // fprime * (10**18 - K0) // K0
        y_minus: uint256 = mul1 / fprime
        y_plus: uint256 = (yfprime + 10**18 * D) / fprime + y_minus * 10**18 / K0
        y_minus += 10**18 * S / fprime

        if y_plus < y_minus:
            y = y_prev / 2
        else:
            y = y_plus - y_minus

        diff: uint256 = 0
        if y > y_prev:
            diff = y - y_prev
        else:
            diff = y_prev - y
        if diff < max(convergence_limit, y / 10**14):
            frac: uint256 = y * 10**18 / D
            assert (frac > 10**16 - 1) and (frac < 10**20 + 1)  # dev: unsafe value for y
            return y

    raise "Did not converge"


@external
@view
def fee_calc(pool: address, xp: uint256[N_COINS]) -> uint256:
    """
    f = fee_gamma / (fee_gamma + (1 - K))
    where
    K = prod(x) / (sum(x) / N)**N
    (all normalized to 1e18)
    """
    fee_gamma: uint256 = Curve(pool).fee_gamma()
    f: uint256 = xp[0] + xp[1]  # sum
    f = fee_gamma * 10**18 / (
        fee_gamma + 10**18 - (10**18 * N_COINS**N_COINS) * xp[0] / f * xp[1] / f
    )
    return (Curve(pool).mid_fee() * f + Curve(pool).out_fee() * (10**18 - f)) / 10**18
        

Contract ABI

[{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"newton_D","inputs":[{"type":"uint256","name":"ANN"},{"type":"uint256","name":"gamma"},{"type":"uint256[2]","name":"x_unsorted"}],"gas":2021722},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"newton_y","inputs":[{"type":"uint256","name":"ANN"},{"type":"uint256","name":"gamma"},{"type":"uint256[2]","name":"x"},{"type":"uint256","name":"D"},{"type":"uint256","name":"i"}],"gas":1538483},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"fee_calc","inputs":[{"type":"address","name":"pool"},{"type":"uint256[2]","name":"xp"}],"gas":9449}]
              

Contract Creation Code

0x61129956600436101561000d576110bf565b60046000601c37600051346112905763b0872d5d81186107b157610f9f60043511610039576000610043565b63ee6b2801600435105b15611290576402540be3ff6024351161005d57600061006a565b66470de4df820001602435105b156112905760443561020052606435610220526102205161020051101561009a5760643561020052604435610220525b633b9ac9ff61020051116100af5760006100c4565b6d314dc6448d9338c15b0a0000000161020051105b1561129057655af3107a3fff61022051670de0b6b3a76400008082028215828483041417156112905790509050610200518080156112905782049050905011156112905760026102005160e052610220516101005260006101205261012a6102606110c5565b6102605180820282158284830414171561129057905090506102405261020051610220518181830110611290578082019050905061026052610280600060ff818352015b610240516102a052673782dace9d900000610200518082028215828483041417156112905790509050610240518080156112905782049050905061022051808202821582848304141715611290579050905061024051808015611290578204905090506102c052602435670de0b6b3a7640000818183011061129057808201905090506102e0526102c0516102e05111610233576102c0516102e05180821061129057808203905090506001818183011061129057808201905090506102e052610260565b6102e0516102c05180821061129057808203905090506001818183011061129057808201905090506102e0525b670de0b6b3a7640000610240518082028215828483041417156112905790509050602435808015611290578204905090506102e0518082028215828483041417156112905790509050602435808015611290578204905090506102e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061030052673782dace9d9000006102c05180820282158284830414171561129057905090506102e05180801561129057820490509050610320526102605161026051610320518082028215828483041417156112905790509050670de0b6b3a7640000808204905090508181830110611290578082019050905061030051600280820282158284830414171561129057905090506102c051808015611290578204905090508181830110611290578082019050905061032051610240518082028215828483041417156112905790509050670de0b6b3a764000080820490509050808210611290578082039050905061034052610240516103405161026051818183011061129057808201905090508082028215828483041417156112905790509050610340518080156112905782049050905061036052610240516102405180820282158284830414171561129057905090506103405180801561129057820490509050610380526102c051670de0b6b3a76400001161050b576103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a7640000808204905090506102c051670de0b6b3a7640000808210611290578082039050905080820282158284830414171561129057905090506102c0518080156112905782049050905080821061129057808203905090508152506105a1565b6103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a764000080820490509050670de0b6b3a76400006102c051808210611290578082039050905080820282158284830414171561129057905090506102c05180801561129057820490509050818183011061129057808201905090508152505b6103805161036051116105d65761038051610360518082106112905780820390509050600280820490509050610240526105f1565b61036051610380518082106112905780820390509050610240525b60006103a0526102a0516102405111610623576102a0516102405180821061129057808203905090506103a05261063e565b610240516102a05180821061129057808203905090506103a0525b662386f26fc10000610240518082106106575781610659565b805b905090506103a051655af3107a400080820282158284830414171561129057905090501015610727576103e060006002818352015b60206103e0510261020001516103c0526103c051670de0b6b3a76400008082028215828483041417156112905790509050610240518080156112905782049050905061040052662386f26fc0ffff61040051116106ec5760006106fc565b68056bc75e2d6310000161040051105b1561129057815160010180835281141561068e575050505050610240516103c05260206103c06107af565b815160010180835281141561016e5750506010610280527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102a0526102805061028051806102a001818260206001820306601f82010390500336823750506308c379a0610240526020610260526102805160206001820306601f820103905060440161025cfd5bf35b6329fcfcf28118610ec257610f9f600435116107ce5760006107d8565b63ee6b2801600435105b15611290576402540be3ff602435116107f25760006107ff565b66470de4df820001602435105b156112905767016345785d89ffff6084351161081c576000610830565b6d314dc6448d9338c15b0a00000001608435105b15611290576020600160a4358082106112905780820390509050026044013560e05270010000000000000000000000000000000060843510156112905760026084350a60e051600480820282158284830414171561129057905090508080156112905782049050905061010052671bc16d674ec8000060e0518082028215828483041417156112905790509050608435808015611290578204905090506101205266470de4df81ffff61012051116108e95760006108f9565b680ad78ebc5ac620000161012051105b156112905760e051655af3107a400080820490509050608435655af3107a40008082049050905080821061092d578161092f565b805b9050905060648082106109425781610944565b805b9050905061014052610160600060ff818352015b61010051610180526101205161010051808202821582848304141715611290579050905060028082028215828483041417156112905790509050608435808015611290578204905090506101a05260e05161010051818183011061129057808201905090506101c052602435670de0b6b3a7640000818183011061129057808201905090506101e0526101a0516101e05111610a1f576101a0516101e05180821061129057808203905090506001818183011061129057808201905090506101e052610a4c565b6101e0516101a05180821061129057808203905090506001818183011061129057808201905090506101e0525b670de0b6b3a76400006084358082028215828483041417156112905790509050602435808015611290578204905090506101e0518082028215828483041417156112905790509050602435808015611290578204905090506101e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061020052670de0b6b3a7640000671bc16d674ec800006101a05180820282158284830414171561129057905090506101e051808015611290578204905090508181830110611290578082019050905061022052670de0b6b3a76400006101005180820282158284830414171561129057905090506101c0516102205180820282158284830414171561129057905090508181830110611290578082019050905061020051818183011061129057808201905090506102405260843561022051808202821582848304141715611290579050905061026052610260516102405110610be6576102408051610260518082106112905780820390509050815250610bfc565b6101805160028082049050905061010052610e38565b610240516101005180801561129057820490509050610280526102005161028051808015611290578204905090506102a05261024051670de0b6b3a764000060843580820282158284830414171561129057905090508181830110611290578082019050905061028051808015611290578204905090506102a051670de0b6b3a764000080820282158284830414171561129057905090506101a05180801561129057820490509050818183011061129057808201905090506102c0526102a08051670de0b6b3a76400006101c05180820282158284830414171561129057905090506102805180801561129057820490509050818183011061129057808201905090508152506102a0516102c05110610d2f576102c0516102a051808210611290578082039050905061010052610d41565b61018051600280820490509050610100525b60006102e052610180516101005111610d7357610180516101005180821061129057808203905090506102e052610d8e565b610100516101805180821061129057808203905090506102e0525b6101405161010051655af3107a400080820490509050808210610db15781610db3565b805b905090506102e0511015610e385761010051670de0b6b3a764000080820282158284830414171561129057905090506084358080156112905782049050905061030052662386f26fc0ffff6103005111610e0e576000610e1e565b68056bc75e2d6310000161030051105b156112905750505061010051610320526020610320610ec0565b81516001018083528114156109585750506010610160527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101805261016050610160518061018001818260206001820306601f82010390500336823750506308c379a0610120526020610140526101605160206001820306601f820103905060440161013cfd5bf35b63e83502fa81186110bd576004358060a01c6112905760e0526372d4f0e2610120526020610120600461013c60e0515afa610f02573d600060003e3d6000fd5b601f3d1115611290576101205161010052602435604435818183011061129057808201905090506101205261010051670de0b6b3a7640000808202821582848304141715611290579050905061010051670de0b6b3a764000081818301106112905780820190509050673782dace9d9000006024358082028215828483041417156112905790509050610120518080156112905782049050905060443580820282158284830414171561129057905090506101205180801561129057820490509050808210611290578082039050905080801561129057820490509050610120526392526c0c610140526020610140600461015c60e0515afa61100a573d600060003e3d6000fd5b601f3d1115611290576101405161012051808202821582848304141715611290579050905063ee8de675610180526020610180600461019c60e0515afa611056573d600060003e3d6000fd5b601f3d11156112905761018051670de0b6b3a7640000610120518082106112905780820390509050808202821582848304141715611290579050905081818301106112905780820190509050670de0b6b3a7640000808204905090506101c05260206101c0f35b505b60006000fd5b60e051610140526101005161016052610120516110e35760006110ed565b6101605161014051105b1561110257610100516101405260e051610160525b610140516101805260006101a0526101c0600060ff818352015b610180516101e0526101805161014051610160518082028215828483041417156112905790509050610180518080156112905782049050905081818301106112905780820190509050600280820490509050610180526101e051610180511161119e576101e0516101805180821061129057808203905090506101a0526111b9565b610180516101e05180821061129057808203905090506101a0525b60016101a05111156111f057610180516101a051670de0b6b3a76400008082028215828483041417156112905790509050106111f3565b60015b156112065750506101805181525061128e565b815160010180835281141561111c57505060106101c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101e0526101c0506101c051806101e001818260206001820306601f82010390500336823750506308c379a06101805260206101a0526101c05160206001820306601f820103905060440161019cfd5b565b600080fd5b61000461129903610004600039610004611299036000f3

Deployed ByteCode

0x600436101561000d576110bf565b60046000601c37600051346112905763b0872d5d81186107b157610f9f60043511610039576000610043565b63ee6b2801600435105b15611290576402540be3ff6024351161005d57600061006a565b66470de4df820001602435105b156112905760443561020052606435610220526102205161020051101561009a5760643561020052604435610220525b633b9ac9ff61020051116100af5760006100c4565b6d314dc6448d9338c15b0a0000000161020051105b1561129057655af3107a3fff61022051670de0b6b3a76400008082028215828483041417156112905790509050610200518080156112905782049050905011156112905760026102005160e052610220516101005260006101205261012a6102606110c5565b6102605180820282158284830414171561129057905090506102405261020051610220518181830110611290578082019050905061026052610280600060ff818352015b610240516102a052673782dace9d900000610200518082028215828483041417156112905790509050610240518080156112905782049050905061022051808202821582848304141715611290579050905061024051808015611290578204905090506102c052602435670de0b6b3a7640000818183011061129057808201905090506102e0526102c0516102e05111610233576102c0516102e05180821061129057808203905090506001818183011061129057808201905090506102e052610260565b6102e0516102c05180821061129057808203905090506001818183011061129057808201905090506102e0525b670de0b6b3a7640000610240518082028215828483041417156112905790509050602435808015611290578204905090506102e0518082028215828483041417156112905790509050602435808015611290578204905090506102e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061030052673782dace9d9000006102c05180820282158284830414171561129057905090506102e05180801561129057820490509050610320526102605161026051610320518082028215828483041417156112905790509050670de0b6b3a7640000808204905090508181830110611290578082019050905061030051600280820282158284830414171561129057905090506102c051808015611290578204905090508181830110611290578082019050905061032051610240518082028215828483041417156112905790509050670de0b6b3a764000080820490509050808210611290578082039050905061034052610240516103405161026051818183011061129057808201905090508082028215828483041417156112905790509050610340518080156112905782049050905061036052610240516102405180820282158284830414171561129057905090506103405180801561129057820490509050610380526102c051670de0b6b3a76400001161050b576103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a7640000808204905090506102c051670de0b6b3a7640000808210611290578082039050905080820282158284830414171561129057905090506102c0518080156112905782049050905080821061129057808203905090508152506105a1565b6103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a764000080820490509050670de0b6b3a76400006102c051808210611290578082039050905080820282158284830414171561129057905090506102c05180801561129057820490509050818183011061129057808201905090508152505b6103805161036051116105d65761038051610360518082106112905780820390509050600280820490509050610240526105f1565b61036051610380518082106112905780820390509050610240525b60006103a0526102a0516102405111610623576102a0516102405180821061129057808203905090506103a05261063e565b610240516102a05180821061129057808203905090506103a0525b662386f26fc10000610240518082106106575781610659565b805b905090506103a051655af3107a400080820282158284830414171561129057905090501015610727576103e060006002818352015b60206103e0510261020001516103c0526103c051670de0b6b3a76400008082028215828483041417156112905790509050610240518080156112905782049050905061040052662386f26fc0ffff61040051116106ec5760006106fc565b68056bc75e2d6310000161040051105b1561129057815160010180835281141561068e575050505050610240516103c05260206103c06107af565b815160010180835281141561016e5750506010610280527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102a0526102805061028051806102a001818260206001820306601f82010390500336823750506308c379a0610240526020610260526102805160206001820306601f820103905060440161025cfd5bf35b6329fcfcf28118610ec257610f9f600435116107ce5760006107d8565b63ee6b2801600435105b15611290576402540be3ff602435116107f25760006107ff565b66470de4df820001602435105b156112905767016345785d89ffff6084351161081c576000610830565b6d314dc6448d9338c15b0a00000001608435105b15611290576020600160a4358082106112905780820390509050026044013560e05270010000000000000000000000000000000060843510156112905760026084350a60e051600480820282158284830414171561129057905090508080156112905782049050905061010052671bc16d674ec8000060e0518082028215828483041417156112905790509050608435808015611290578204905090506101205266470de4df81ffff61012051116108e95760006108f9565b680ad78ebc5ac620000161012051105b156112905760e051655af3107a400080820490509050608435655af3107a40008082049050905080821061092d578161092f565b805b9050905060648082106109425781610944565b805b9050905061014052610160600060ff818352015b61010051610180526101205161010051808202821582848304141715611290579050905060028082028215828483041417156112905790509050608435808015611290578204905090506101a05260e05161010051818183011061129057808201905090506101c052602435670de0b6b3a7640000818183011061129057808201905090506101e0526101a0516101e05111610a1f576101a0516101e05180821061129057808203905090506001818183011061129057808201905090506101e052610a4c565b6101e0516101a05180821061129057808203905090506001818183011061129057808201905090506101e0525b670de0b6b3a76400006084358082028215828483041417156112905790509050602435808015611290578204905090506101e0518082028215828483041417156112905790509050602435808015611290578204905090506101e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061020052670de0b6b3a7640000671bc16d674ec800006101a05180820282158284830414171561129057905090506101e051808015611290578204905090508181830110611290578082019050905061022052670de0b6b3a76400006101005180820282158284830414171561129057905090506101c0516102205180820282158284830414171561129057905090508181830110611290578082019050905061020051818183011061129057808201905090506102405260843561022051808202821582848304141715611290579050905061026052610260516102405110610be6576102408051610260518082106112905780820390509050815250610bfc565b6101805160028082049050905061010052610e38565b610240516101005180801561129057820490509050610280526102005161028051808015611290578204905090506102a05261024051670de0b6b3a764000060843580820282158284830414171561129057905090508181830110611290578082019050905061028051808015611290578204905090506102a051670de0b6b3a764000080820282158284830414171561129057905090506101a05180801561129057820490509050818183011061129057808201905090506102c0526102a08051670de0b6b3a76400006101c05180820282158284830414171561129057905090506102805180801561129057820490509050818183011061129057808201905090508152506102a0516102c05110610d2f576102c0516102a051808210611290578082039050905061010052610d41565b61018051600280820490509050610100525b60006102e052610180516101005111610d7357610180516101005180821061129057808203905090506102e052610d8e565b610100516101805180821061129057808203905090506102e0525b6101405161010051655af3107a400080820490509050808210610db15781610db3565b805b905090506102e0511015610e385761010051670de0b6b3a764000080820282158284830414171561129057905090506084358080156112905782049050905061030052662386f26fc0ffff6103005111610e0e576000610e1e565b68056bc75e2d6310000161030051105b156112905750505061010051610320526020610320610ec0565b81516001018083528114156109585750506010610160527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101805261016050610160518061018001818260206001820306601f82010390500336823750506308c379a0610120526020610140526101605160206001820306601f820103905060440161013cfd5bf35b63e83502fa81186110bd576004358060a01c6112905760e0526372d4f0e2610120526020610120600461013c60e0515afa610f02573d600060003e3d6000fd5b601f3d1115611290576101205161010052602435604435818183011061129057808201905090506101205261010051670de0b6b3a7640000808202821582848304141715611290579050905061010051670de0b6b3a764000081818301106112905780820190509050673782dace9d9000006024358082028215828483041417156112905790509050610120518080156112905782049050905060443580820282158284830414171561129057905090506101205180801561129057820490509050808210611290578082039050905080801561129057820490509050610120526392526c0c610140526020610140600461015c60e0515afa61100a573d600060003e3d6000fd5b601f3d1115611290576101405161012051808202821582848304141715611290579050905063ee8de675610180526020610180600461019c60e0515afa611056573d600060003e3d6000fd5b601f3d11156112905761018051670de0b6b3a7640000610120518082106112905780820390509050808202821582848304141715611290579050905081818301106112905780820190509050670de0b6b3a7640000808204905090506101c05260206101c0f35b505b60006000fd5b60e051610140526101005161016052610120516110e35760006110ed565b6101605161014051105b1561110257610100516101405260e051610160525b610140516101805260006101a0526101c0600060ff818352015b610180516101e0526101805161014051610160518082028215828483041417156112905790509050610180518080156112905782049050905081818301106112905780820190509050600280820490509050610180526101e051610180511161119e576101e0516101805180821061129057808203905090506101a0526111b9565b610180516101e05180821061129057808203905090506101a0525b60016101a05111156111f057610180516101a051670de0b6b3a76400008082028215828483041417156112905790509050106111f3565b60015b156112065750506101805181525061128e565b815160010180835281141561111c57505060106101c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101e0526101c0506101c051806101e001818260206001820306601f82010390500336823750506308c379a06101805260206101a0526101c05160206001820306601f820103905060440161019cfd5b565b600080fd