Contract 0xC57120368a86FB33c5F89f8a698909D1E97e501f 12

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xb926a9c0c3c0f886571008b772720202df610b361f84ef7a51fe04eb8af33442Withdraw1352604322023-09-27 23:55:47182 days 21 hrs ago0xd619f816156effabf9ddab313cff6b46cad3fbdd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.000066040.1
0x030e3d5e0d4ec6c2e18dfb0ff7f580621b41c81d7371bf298a20c907123329c3Withdraw1340627972023-09-24 6:59:14186 days 14 hrs ago0xbde26f3364d07690113eb1e6e1229f8c234c30bd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00006767 0.1
0xd444cbb8a7dd388718215be7ab6d63e65c0ca03947118eb8088ec083643e2098Deposit1210726002023-08-13 18:49:54228 days 2 hrs ago0xbde26f3364d07690113eb1e6e1229f8c234c30bd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00006094 0.1
0xf4089a8dc516a011f922a0fc9c1441c04720ee13eafc1512b66b70fe6b1f87a1Withdraw1087346132023-07-07 9:49:54265 days 11 hrs ago0x78f9741828a71d69392a8185e7e7eb3d1de36c02 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009243 0.1
0x8fc2aefd5315609a42bece8f224fd0fa513af96c9ded0b3e4fbea8664284fd44Withdraw1039703312023-06-23 3:16:11279 days 17 hrs ago0xd619f816156effabf9ddab313cff6b46cad3fbdd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00008456 0.1
0xce76e5230a94976bc9f138c2bac58dcbdb3356d34ed2df987a3047f96be0b107Deposit1021487862023-06-17 16:45:49285 days 4 hrs ago0x23cbf6d1b738423365c6930f075ed6feef7d14f3 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009733 0.1
0x580e193cd0356767081bfda56cabfbc83e047299e7376217d2a2bc8c683fb426Deposit1021481222023-06-17 16:42:57285 days 4 hrs ago0x23cbf6d1b738423365c6930f075ed6feef7d14f3 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009781 0.1
0xd73050c7dee2cf44d835dae95f4d089a4ec504eb726f7856442c630cf6411cddDeposit1021398622023-06-17 16:07:57285 days 4 hrs ago0x23cbf6d1b738423365c6930f075ed6feef7d14f3 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009122 0.1
0xb2e84c8f873d56d7aede172ee091a83c27e518f7b44bdcfa9a34418ca82efde2Deposit1018513632023-06-16 19:29:23286 days 1 hr ago0xbde26f3364d07690113eb1e6e1229f8c234c30bd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00007507 0.1
0x432c167fa2d78533703bcc9de52e3750e05c27864794ec3a49da426358b6571eWithdraw974783122023-06-03 20:51:45299 days 13 mins ago0x01eda16f6a6c3b051ecc63b0d93c8c3a27491dc2 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009197 0.1
0x7675076aed46f92f68996ffeb464c7a66818560652537cd9c6b932d0d47ccd75Withdraw925058062023-05-20 5:46:09313 days 15 hrs ago0x66d1f600b54b9c2576ba45cfd2090ac8e941db2e IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00010223 0.1
0xf4bfc8a0f9335dd5456ae8afd7a4e2e19aa3b383447416101b10bf6082fc7ad9Withdraw813054402023-04-17 6:11:53346 days 14 hrs ago0xda23de4fea79bc6eb8147c147650030a4d7d0730 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.000092790.10104
0x4474ac2967d6780c0ba0658091ffe759f9a1d6d82e582cfdd664ff5fbf96d4dcDeposit808332822023-04-15 21:15:57347 days 23 hrs ago0xbde26f3364d07690113eb1e6e1229f8c234c30bd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00007139 0.1
0x06ac1ec71add66e2541c1a8b80923392903eb9180e48791719da3f9cd3047c24Deposit808292672023-04-15 20:59:02348 days 5 mins ago0x23cbf6d1b738423365c6930f075ed6feef7d14f3 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00007583 0.1
0x43a8c4dde48487afca4399128acb8f35daa03fe568d9affd7a8db28d5bcd9fa5Deposit807781932023-04-15 17:26:25348 days 3 hrs ago0x01eda16f6a6c3b051ecc63b0d93c8c3a27491dc2 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00008166 0.1
0x30c5f02c3baf1da554db84007d869be7ae3d588bbf1fcaad3b2a57b5b237d2dcDeposit806343782023-04-15 7:31:28348 days 13 hrs ago0xda23de4fea79bc6eb8147c147650030a4d7d0730 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00006539 0.1
0xfb2802befaf1f563d6e8af4404bcf3dffe3838e04b78a6b50263f0f754b8d352Deposit804173902023-04-14 16:14:48349 days 4 hrs ago0xda23de4fea79bc6eb8147c147650030a4d7d0730 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009436 0.1
0x0e9f35d10ce67fa60cfe740dd03937e2f1930cf74f78c13f25623647aed7155cWithdraw803083262023-04-14 8:42:44349 days 12 hrs ago0xda23de4fea79bc6eb8147c147650030a4d7d0730 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009491 0.1
0xdd21da3be80476f90184a1c3fd23e60759b5df1cc83144a1a99ac921daa7e0aeDeposit803073672023-04-14 8:38:46349 days 12 hrs ago0xda23de4fea79bc6eb8147c147650030a4d7d0730 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00006774 0.1
0x5dd9e9204860497b4343a26c7758ecc142ce1d3ddd24a1539e18e94c6f56b8f5Deposit785709822023-04-09 6:36:14354 days 14 hrs ago0xe7d43587006d823ef1808889a76187e5131fca36 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00007288 0.1
0x2f46dc7f6e95e0aace4b039560f78d5c9d577ee3ceb4b0ee60ce7cc30d33b17eDeposit751496052023-03-30 5:39:02364 days 15 hrs ago0x170be25a54bdc760ac39d64bd97ca09e68e0bc52 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00007449 0.1
0x8630f51189193b3a3d751e96ceef871e682dff5d351402525d5676dae3112b87Deposit730240042023-03-24 1:57:59370 days 19 hrs ago0xd619f816156effabf9ddab313cff6b46cad3fbdd IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00006664 0.1
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075eDeposit696480342023-03-14 5:40:45380 days 15 hrs ago0xb2186abe9758f0d8bdade867475c0e588902fca9 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00007308 0.1
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140Deposit673069992023-03-06 14:01:04388 days 7 hrs ago0xdda7f2654d85653c92513b58305348da627c7cf0 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00008548 0.1
0x1cbfbec30c832ffd2b73c057dd832f0986983ad9e4a15aa21c6bf12860102c68Withdraw657004022023-03-01 10:03:20393 days 11 hrs ago0x23cbf6d1b738423365c6930f075ed6feef7d14f3 IN  0xc57120368a86fb33c5f89f8a698909d1e97e501f0 ETH0.00009466 0.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x5f6c95363530144376e02b5b00ad2dc5b6e54c320 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0xc7e458c6727742178320f58b4f3de2178223b7730 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x30efbca5507d8bc7ab33cd4eff5dcbe22a2e61a40 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x30efbca5507d8bc7ab33cd4eff5dcbe22a2e61a40 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x78d46cecf0ae4757f430d95b2d7eaa18d70878720 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f Vesta Finance: VST Token0 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x9a79a2b1c777bf2bf291cc25249f430499517a120 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x9a79a2b1c777bf2bf291cc25249f430499517a120 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f GMX: GMX Token0 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x78d46cecf0ae4757f430d95b2d7eaa18d70878720 ETH
0xb2c54df6c07e2e49aa67306dd9ab4e112e0b00c93d88c0c5e5e056200ff4075e696480342023-03-14 5:40:45380 days 15 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x78d46cecf0ae4757f430d95b2d7eaa18d70878720 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x5f6c95363530144376e02b5b00ad2dc5b6e54c320 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0xc7e458c6727742178320f58b4f3de2178223b7730 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x30efbca5507d8bc7ab33cd4eff5dcbe22a2e61a40 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x30efbca5507d8bc7ab33cd4eff5dcbe22a2e61a40 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x78d46cecf0ae4757f430d95b2d7eaa18d70878720 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f Vesta Finance: VST Token0 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x9a79a2b1c777bf2bf291cc25249f430499517a120 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x9a79a2b1c777bf2bf291cc25249f430499517a120 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f GMX: GMX Token0 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x78d46cecf0ae4757f430d95b2d7eaa18d70878720 ETH
0x5d0008df47a82a874f9cf5856d6d8d09f58e86da396374100927227617fd7140673069992023-03-06 14:01:04388 days 7 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x78d46cecf0ae4757f430d95b2d7eaa18d70878720 ETH
0x1cbfbec30c832ffd2b73c057dd832f0986983ad9e4a15aa21c6bf12860102c68657004022023-03-01 10:03:20393 days 11 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f GMX: GMX Token0 ETH
0x1cbfbec30c832ffd2b73c057dd832f0986983ad9e4a15aa21c6bf12860102c68657004022023-03-01 10:03:20393 days 11 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f Vesta Finance: VST Token0 ETH
0x1cbfbec30c832ffd2b73c057dd832f0986983ad9e4a15aa21c6bf12860102c68657004022023-03-01 10:03:20393 days 11 hrs ago 0xc57120368a86fb33c5f89f8a698909d1e97e501f 0x5f6c95363530144376e02b5b00ad2dc5b6e54c320 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BAMM

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2022-06-06
*/

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File contracts/B.Protocol/crop.sol

// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2021 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity 0.6.11;

interface VatLike {
    function urns(bytes32, address) external view returns (uint256, uint256);
    function gem(bytes32, address) external view returns (uint256);
    function slip(bytes32, address, int256) external;
}

interface ERC20 {
    function balanceOf(address owner) external view returns (uint256);
    function transfer(address dst, uint256 amount) external returns (bool);
    function transferFrom(address src, address dst, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function decimals() external returns (uint8);
}

// receives tokens and shares them among holders
contract CropJoin {

    VatLike     public immutable vat;    // cdp engine
    bytes32     public immutable ilk;    // collateral type
    ERC20       public immutable gem;    // collateral token
    uint256     public immutable dec;    // gem decimals
    ERC20       public immutable bonus;  // rewards token

    uint256     public share;  // crops per gem    [ray]
    uint256     public total;  // total gems       [wad]
    uint256     public stock;  // crop balance     [wad]

    mapping (address => uint256) public crops; // crops per user  [wad]
    mapping (address => uint256) public stake; // gems per user   [wad]

    uint256 immutable internal to18ConversionFactor;
    uint256 immutable internal toGemConversionFactor;

    // --- Events ---
    event Join(uint256 val);
    event Exit(uint256 val);
    event Flee();
    event Tack(address indexed src, address indexed dst, uint256 wad);

    constructor(address vat_, bytes32 ilk_, address gem_, address bonus_) public {
        vat = VatLike(vat_);
        ilk = ilk_;
        gem = ERC20(gem_);
        uint256 dec_ = ERC20(gem_).decimals();
        require(dec_ <= 18);
        dec = dec_;
        to18ConversionFactor = 10 ** (18 - dec_);
        toGemConversionFactor = 10 ** dec_;

        bonus = ERC20(bonus_);
    }

    function add(uint256 x, uint256 y) public pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }
    function sub(uint256 x, uint256 y) public pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }
    function mul(uint256 x, uint256 y) public pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }
    function divup(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(x, sub(y, 1)) / y;
    }
    uint256 constant WAD  = 10 ** 18;
    function wmul(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, y) / WAD;
    }
    function wdiv(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, WAD) / y;
    }
    function wdivup(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = divup(mul(x, WAD), y);
    }
    uint256 constant RAY  = 10 ** 27;
    function rmul(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, y) / RAY;
    }
    function rmulup(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = divup(mul(x, y), RAY);
    }
    function rdiv(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, RAY) / y;
    }

    // Net Asset Valuation [wad]
    function nav() public virtual returns (uint256) {
        uint256 _nav = gem.balanceOf(address(this));
        return mul(_nav, to18ConversionFactor);
    }

    // Net Assets per Share [wad]
    function nps() public returns (uint256) {
        if (total == 0) return WAD;
        else return wdiv(nav(), total);
    }

    function crop() internal virtual returns (uint256) {
        return sub(bonus.balanceOf(address(this)), stock);
    }

    function harvest(address from, address to) internal {
        if (total > 0) share = add(share, rdiv(crop(), total));

        uint256 last = crops[from];
        uint256 curr = rmul(stake[from], share);
        if (curr > last) require(bonus.transfer(to, curr - last));
        stock = bonus.balanceOf(address(this));
    }

    function join(address urn, uint256 val) internal virtual {
        harvest(urn, urn);
        if (val > 0) {
            uint256 wad = wdiv(mul(val, to18ConversionFactor), nps());

            // Overflow check for int256(wad) cast below
            // Also enforces a non-zero wad
            require(int256(wad) > 0);

            require(gem.transferFrom(msg.sender, address(this), val));
            vat.slip(ilk, urn, int256(wad));

            total = add(total, wad);
            stake[urn] = add(stake[urn], wad);
        }
        crops[urn] = rmulup(stake[urn], share);
        emit Join(val);
    }

    function exit(address guy, uint256 val) internal virtual {
        harvest(msg.sender, guy);
        if (val > 0) {
            uint256 wad = wdivup(mul(val, to18ConversionFactor), nps());

            // Overflow check for int256(wad) cast below
            // Also enforces a non-zero wad
            require(int256(wad) > 0);

            require(gem.transfer(guy, val));
            vat.slip(ilk, msg.sender, -int256(wad));

            total = sub(total, wad);
            stake[msg.sender] = sub(stake[msg.sender], wad);
        }
        crops[msg.sender] = rmulup(stake[msg.sender], share);
        emit Exit(val);
    }
}


// File contracts/B.Protocol/CropJoinAdapter.sol

// : MIT

pragma solidity 0.6.11;

// NOTE! - this is not an ERC20 token. transfer is not supported.
contract CropJoinAdapter is CropJoin {
    string constant public name = "B.AMM LUSD-ETH";
    string constant public symbol = "LUSDETH";
    uint constant public decimals = 18;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    constructor(address _lqty) public 
        CropJoin(address(new Dummy()), "B.AMM", address(new DummyGem()), _lqty)
    {
    }

    // adapter to cropjoin
    function nav() public override returns (uint256) {
        return total;
    }
    
    function totalSupply() public view returns (uint256) {
        return total;
    }

    function balanceOf(address owner) public view returns (uint256 balance) {
        balance = stake[owner];
    }

    function mint(address to, uint value) virtual internal {
        join(to, value);
        emit Transfer(address(0), to, value);
    }

    function burn(address owner, uint value) virtual internal {
        exit(owner, value);
        emit Transfer(owner, address(0), value);        
    }
}

contract Dummy {
    fallback() external {}
}

contract DummyGem is Dummy {
    function transfer(address, uint) external pure returns(bool) {
        return true;
    }

    function transferFrom(address, address, uint) external pure returns(bool) {
        return true;
    }

    function decimals() external pure returns(uint) {
        return 18;
    } 
}


// File contracts/B.Protocol/Dependencies/SafeMath.sol

// : MIT

pragma solidity 0.6.11;

/**
 * Based on OpenZeppelin's SafeMath:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
 *
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


// File contracts/B.Protocol/PriceFormula.sol

// : MIT

pragma solidity 0.6.11;

contract PriceFormula {
    using SafeMath for uint256;

    function getSumFixedPoint(uint x, uint y, uint A) public pure returns(uint) {
        if(x == 0 && y == 0) return 0;

        uint sum = x.add(y);

        for(uint i = 0 ; i < 255 ; i++) {
            uint dP = sum;
            dP = dP.mul(sum) / (x.mul(2)).add(1);
            dP = dP.mul(sum) / (y.mul(2)).add(1);

            uint prevSum = sum;

            uint n = (A.mul(2).mul(x.add(y)).add(dP.mul(2))).mul(sum);
            uint d = (A.mul(2).sub(1).mul(sum));
            sum = n / d.add(dP.mul(3));

            if(sum <= prevSum.add(1) && prevSum <= sum.add(1)) break;
        }

        return sum;
    }

    function getReturn(uint xQty, uint xBalance, uint yBalance, uint A) public pure returns(uint) {
        uint sum = getSumFixedPoint(xBalance, yBalance, A);

        uint c = sum.mul(sum) / (xQty.add(xBalance)).mul(2);
        c = c.mul(sum) / A.mul(4);
        uint b = (xQty.add(xBalance)).add(sum / A.mul(2));
        uint yPrev = 0;
        uint y = sum;

        for(uint i = 0 ; i < 255 ; i++) {
            yPrev = y;
            uint n = (y.mul(y)).add(c);
            uint d = y.mul(2).add(b).sub(sum); 
            y = n / d;

            if(y <= yPrev.add(1) && yPrev <= y.add(1)) break;
        }

        return yBalance.sub(y).sub(1);
    }
}


// File contracts/B.Protocol/Interfaces/IPriceFeed.sol

// : MIT

pragma solidity 0.6.11;

interface IPriceFeed {

    // --- Events ---
    event LastGoodPriceUpdated(uint _lastGoodPrice);
   
    // --- Function ---
    function fetchPrice() external returns (uint);
}


// File contracts/B.Protocol/Dependencies/IERC20.sol

// : MIT

pragma solidity 0.6.11;

/**
 * Based on the OpenZeppelin IER20 interface:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
 *
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/B.Protocol/Dependencies/Ownable.sol

// : MIT

pragma solidity 0.6.11;

/**
 * Based on OpenZeppelin's Ownable contract:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
 *
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
        
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     *
     * NOTE: This function is not safe, as it doesn’t check owner is calling it.
     * Make sure you check it before calling it.
     */
    function _renounceOwnership() internal {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}


// File contracts/B.Protocol/Dependencies/AggregatorV3Interface.sol

// : MIT
// Code from https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol

pragma solidity 0.6.11;

interface AggregatorV3Interface {

  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}


// File contracts/B.Protocol/BAMM.sol

// : MIT

pragma solidity 0.6.11;







interface StabilityPoolLike {
    function withdrawFromSP(uint256 _amount) external;
    function provideToSP(uint256 _amount) external;
    function getCompoundedVSTDeposit(address _depositor)
        external
        view
        returns (uint256);
    function getDepositorAssetGain(address _depositor)
        external
        view
        returns (uint256);
}

contract BAMM is CropJoinAdapter, PriceFormula, Ownable {
    using SafeMath for uint256;

    AggregatorV3Interface public immutable priceAggregator;
    IERC20 public immutable LUSD;
    IERC20 public immutable collateral;    
    StabilityPoolLike immutable public SP;

    address payable public immutable feePool;
    uint public constant MAX_FEE = 100; // 1%
    uint public fee = 0; // fee in bps
    uint public A = 20;
    uint public constant MIN_A = 20;
    uint public constant MAX_A = 200;    

    uint public immutable maxDiscount; // max discount in bips

    address public immutable frontEndTag;

    uint constant public PRECISION = 1e18;

    event ParamsSet(uint A, uint fee);
    event UserDeposit(address indexed user, uint lusdAmount, uint numShares);
    event UserWithdraw(address indexed user, uint lusdAmount, uint ethAmount, uint numShares);
    event RebalanceSwap(address indexed user, uint lusdAmount, uint ethAmount, uint timestamp);

    constructor(
        address _priceAggregator,
        address payable _SP,
        address _LUSD,
        address _LQTY,
        address _collateral,
        uint _maxDiscount,
        address payable _feePool,
        address _fronEndTag)
        public
        CropJoinAdapter(_LQTY)
    {
        priceAggregator = AggregatorV3Interface(_priceAggregator);
        LUSD = IERC20(_LUSD);
        collateral = IERC20(_collateral);
        SP = StabilityPoolLike(_SP);

        feePool = _feePool;
        maxDiscount = _maxDiscount;
        frontEndTag = _fronEndTag;
    }

    function setParams(uint _A, uint _fee) external onlyOwner {
        require(_fee <= MAX_FEE, "setParams: fee is too big");
        require(_A >= MIN_A, "setParams: A too small");
        require(_A <= MAX_A, "setParams: A too big");

        fee = _fee;
        A = _A;

        emit ParamsSet(_A, _fee);
    }

    function fetchPrice() public view returns(uint) {
        uint chainlinkDecimals;
        uint chainlinkLatestAnswer;
        uint chainlinkTimestamp;

        // First, try to get current decimal precision:
        try priceAggregator.decimals() returns (uint8 decimals) {
            // If call to Chainlink succeeds, record the current decimal precision
            chainlinkDecimals = decimals;
        } catch {
            // If call to Chainlink aggregator reverts, return a zero response with success = false
            return 0;
        }

        // Secondly, try to get latest price data:
        try priceAggregator.latestRoundData() returns
        (
            uint80 /* roundId */,
            int256 answer,
            uint256 /* startedAt */,
            uint256 timestamp,
            uint80 /* answeredInRound */
        )
        {
            // If call to Chainlink succeeds, return the response and success = true
            chainlinkLatestAnswer = uint(answer);
            chainlinkTimestamp = timestamp;
        } catch {
            // If call to Chainlink aggregator reverts, return a zero response with success = false
            return 0;
        }

        if(chainlinkTimestamp + 1 hours < now) return 0; // price is down

        uint chainlinkFactor = 10 ** chainlinkDecimals;
        return chainlinkLatestAnswer.mul(PRECISION) / chainlinkFactor;
    }

    function deposit(uint lusdAmount) external {        
        // update share
        uint lusdValue = SP.getCompoundedVSTDeposit(address(this));
        uint ethValue = getCollateralBalance();

        uint price = fetchPrice();
        require(ethValue == 0 || price > 0, "deposit: chainlink is down");

        uint totalValue = lusdValue.add(ethValue.mul(price) / PRECISION);

        // this is in theory not reachable. if it is, better halt deposits
        // the condition is equivalent to: (totalValue = 0) ==> (total = 0)
        require(totalValue > 0 || total == 0, "deposit: system is rekt");

        uint newShare = PRECISION;
        if(total > 0) newShare = total.mul(lusdAmount) / totalValue;

        // deposit
        require(LUSD.transferFrom(msg.sender, address(this), lusdAmount), "deposit: transferFrom failed");
        SP.provideToSP(lusdAmount);

        // update LP token
        mint(msg.sender, newShare);

        emit UserDeposit(msg.sender, lusdAmount, newShare);        
    }

    function withdraw(uint numShares) external {
        uint lusdValue = SP.getCompoundedVSTDeposit(address(this));
        uint ethValue = getCollateralBalance();

        uint lusdAmount = lusdValue.mul(numShares).div(total);
        uint ethAmount = ethValue.mul(numShares).div(total);

        // this withdraws lusd, lqty, and eth
        SP.withdrawFromSP(lusdAmount);

        // update LP token
        burn(msg.sender, numShares);

        // send lusd and eth
        if(lusdAmount > 0) LUSD.transfer(msg.sender, lusdAmount);
        if(ethAmount > 0) {
            sendCollateral(msg.sender, ethAmount);
        }

        emit UserWithdraw(msg.sender, lusdAmount, ethAmount, numShares);            
    }

    function addBps(uint n, int bps) internal pure returns(uint) {
        require(bps <= 10000, "reduceBps: bps exceeds max");
        require(bps >= -10000, "reduceBps: bps exceeds min");

        return n.mul(uint(10000 + bps)) / 10000;
    }

    function getSwapEthAmount(uint lusdQty) public view returns(uint ethAmount, uint feeLusdAmount) {
        uint lusdBalance = SP.getCompoundedVSTDeposit(address(this));
        uint ethBalance  = getCollateralBalance();

        uint eth2usdPrice = fetchPrice();
        if(eth2usdPrice == 0) return (0, 0); // chainlink is down

        uint ethUsdValue = ethBalance.mul(eth2usdPrice) / PRECISION;
        uint maxReturn = addBps(lusdQty.mul(PRECISION) / eth2usdPrice, int(maxDiscount));

        uint xQty = lusdQty;
        uint xBalance = lusdBalance;
        uint yBalance = lusdBalance.add(ethUsdValue.mul(2));
        
        uint usdReturn = getReturn(xQty, xBalance, yBalance, A);
        uint basicEthReturn = usdReturn.mul(PRECISION) / eth2usdPrice;

        if(ethBalance < basicEthReturn) basicEthReturn = ethBalance; // cannot give more than balance 
        if(maxReturn < basicEthReturn) basicEthReturn = maxReturn;

        ethAmount = basicEthReturn;
        feeLusdAmount = addBps(lusdQty, int(fee)).sub(lusdQty);
    }

    // get ETH in return to LUSD
    function swap(uint lusdAmount, uint minEthReturn, address payable dest) public returns(uint) {
        (uint ethAmount, uint feeAmount) = getSwapEthAmount(lusdAmount);

        require(ethAmount >= minEthReturn, "swap: low return");

        LUSD.transferFrom(msg.sender, address(this), lusdAmount);
        SP.provideToSP(lusdAmount.sub(feeAmount));

        if(feeAmount > 0) LUSD.transfer(feePool, feeAmount);
        sendCollateral(dest, ethAmount); // re-entry is fine here

        emit RebalanceSwap(msg.sender, lusdAmount, ethAmount, now);

        return ethAmount;
    }

    // kyber network reserve compatible function
    function trade(
        IERC20 /* srcToken */,
        uint256 srcAmount,
        IERC20 /* destToken */,
        address payable destAddress,
        uint256 /* conversionRate */,
        bool /* validate */
    ) external payable returns (bool) {
        return swap(srcAmount, 0, destAddress) > 0;
    }

    function getConversionRate(
        IERC20 /* src */,
        IERC20 /* dest */,
        uint256 srcQty,
        uint256 /* blockNumber */
    ) external view returns (uint256) {
        (uint ethQty, ) = getSwapEthAmount(srcQty);
        return ethQty.mul(PRECISION) / srcQty;
    }

    receive() external payable {}

    // multi collateral competability
    function collaterals(uint index) public view returns(address) {
        require(index == 0, "only one collateral");
        return address(collateral);
    }

    function sendCollateral(address to, uint amount) internal {
        if(collateral == IERC20(0x0)) {
            (bool success, ) = to.call{ value: amount }("");
            require(success, "sendCollateral: sending ETH failed");            
        }
        else {
            require(collateral.transfer(to, amount), "sendCollateral: swap failed");
        }
    }

    function getCollateralBalance() public view returns(uint) {
        uint spBalance = SP.getDepositorAssetGain(address(this));
        uint contractBalance;

        if(collateral == IERC20(0x0)) {
            contractBalance = address(this).balance;            
        }
        else {
            contractBalance = collateral.balanceOf(address(this));
        }

        return spBalance.add(contractBalance);
    }

    function getCollateralValue() public view returns(bool succ, uint value) {
        uint ethValue = getCollateralBalance();

        uint price = fetchPrice();

        succ = price > 0;
        value = (ethValue.mul(price) / PRECISION);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_priceAggregator","type":"address"},{"internalType":"address payable","name":"_SP","type":"address"},{"internalType":"address","name":"_LUSD","type":"address"},{"internalType":"address","name":"_LQTY","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_maxDiscount","type":"uint256"},{"internalType":"address payable","name":"_feePool","type":"address"},{"internalType":"address","name":"_fronEndTag","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[],"name":"Flee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"A","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RebalanceSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Tack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"UserDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"UserWithdraw","type":"event"},{"inputs":[],"name":"A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSD","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SP","outputs":[{"internalType":"contract StabilityPoolLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"add","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonus","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"collaterals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"crops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frontEndTag","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gem","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralValue","outputs":[{"internalType":"bool","name":"succ","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"xQty","type":"uint256"},{"internalType":"uint256","name":"xBalance","type":"uint256"},{"internalType":"uint256","name":"yBalance","type":"uint256"},{"internalType":"uint256","name":"A","type":"uint256"}],"name":"getReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"A","type":"uint256"}],"name":"getSumFixedPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdQty","type":"uint256"}],"name":"getSwapEthAmount","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"feeLusdAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"mul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAggregator","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmulup","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_A","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"sub","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"internalType":"uint256","name":"minEthReturn","type":"uint256"},{"internalType":"address payable","name":"dest","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"trade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract VatLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wdivup","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]

610240604052600060065560146007553480156200001c57600080fd5b50604051620036d3380380620036d383398181016040526101008110156200004357600080fd5b50805160208201516040808401516060850151608086015160a087015160c088015160e090980151945196979596939592949193909291908590620000889062000240565b604051809103906000f080158015620000a5573d6000803e3d6000fd5b5064422e414d4d60d81b604051620000bd906200024d565b604051809103906000f080158015620000da573d6000803e3d6000fd5b506001600160601b0319606084811b821660805260a084905282901b1660c0526040805163313ce56760e01b8152905185916000916001600160a01b0385169163313ce56791600480830192602092919082900301818787803b1580156200014157600080fd5b505af115801562000156573d6000803e3d6000fd5b505050506040513d60208110156200016d57600080fd5b505160ff16905060128111156200018357600080fd5b60e08190526012819003600a90810a610120520a6101405260601b6001600160601b03191661010052505060058054336001600160a01b03199091168117909155604051909250600091507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606098891b81166101605295881b86166101805292871b85166101a05294861b84166101c05293851b83166101e0526102009390935250911b16610220526200025b565b6065806200353c83390190565b61013280620035a183390190565b60805160601c60a05160c05160601c60e0516101005160601c61012051610140516101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c610200516102205160601c61319b620003a160003980611421525080611ccc528061201d52508061164e52806118a2525080610efd528061113d528061120652806113dc5280611591528061195b5280611c025280611f01525080610f755280610fc852806110cc528061219b528061259052806126545250806112b95280611513528061161f5280611b3b5280612141525080610d4b5280610dde528061138a525050806129d15280612c305250806117615280612f065280612fdb528061307d5250806118c65250806117da5280612a135280612c9d525080611ed85280612ad65280612d4b5250806113b35280612b165280612d1c525061319b6000f3fe6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f0000000000000000000000000000000000000000000000000000000000000000919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601281565b7f000000000000000000000000000000000000000000000000000000000000000081565b60c881565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000000006127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000006120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000006120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cdd3fde7f000000000000000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b00336080604052348015600f57600080fd5b50604880601d6000396000f3fe6080604052348015600f57600080fd5b5000fea2646970667358221220c9dbde2b8bd5037d447820e2775b3e09ebae168220c996babde4dae9f370b5d564736f6c634300060b0033608060405234801561001057600080fd5b50610112806100206000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c806323b872dd14603e578063313ce567146085578063a9059cbb14609d575b005b607160048036036060811015605257600080fd5b506001600160a01b0381358116916020810135909116906040013560c6565b604080519115158252519081900360200190f35b608b60cf565b60408051918252519081900360200190f35b60716004803603604081101560b157600080fd5b506001600160a01b03813516906020013560d4565b60019392505050565b601290565b60019291505056fea2646970667358221220e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a81396164736f6c634300060b00330000000000000000000000009a79a2b1c777bf2bf291cc25249f430499517a1200000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d708787200000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1700000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a4000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a3900000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a4

Deployed Bytecode

0x6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f0000000000000000000000009a79a2b1c777bf2bf291cc25249f430499517a126001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f0000000000000000000000009a79a2b1c777bf2bf291cc25249f430499517a126001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d7087872169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a6001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a16916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d7087872169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d70878726001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f0000000000000000000000009a79a2b1c777bf2bf291cc25249f430499517a1281565b601281565b7f0000000000000000000000005f6c95363530144376e02b5b00ad2dc5b6e54c3281565b60c881565b7f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d708787281565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a481565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d7087872166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f176001600160a01b031663a9059cbb7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a481565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f000000000000000000000000c7e458c6727742178320f58b4f3de2178223b77381565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a3981565b7f000000000000000000000000000000000000000000000000000000000000001281565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d7087872169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d70878726001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000032081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f422e414d4d00000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d70878726001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000003206127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1781565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a81565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a6001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a6001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000016120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f000000000000000000000000c7e458c6727742178320f58b4f3de2178223b7736001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f422e414d4d00000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f0000000000000000000000005f6c95363530144376e02b5b00ad2dc5b6e54c321692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000016120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f000000000000000000000000c7e458c6727742178320f58b4f3de2178223b77316916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f0000000000000000000000005f6c95363530144376e02b5b00ad2dc5b6e54c326001600160a01b0316637cdd3fde7f422e414d4d00000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a46001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a416916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a416916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b0033

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

0000000000000000000000009a79a2b1c777bf2bf291cc25249f430499517a1200000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d708787200000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1700000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a4000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a3900000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a4

-----Decoded View---------------
Arg [0] : _priceAggregator (address): 0x9a79a2b1C777BF2bf291Cc25249f430499517a12
Arg [1] : _SP (address): 0x78D46Cecf0AE4757F430d95B2d7Eaa18D7087872
Arg [2] : _LUSD (address): 0x64343594Ab9b56e99087BfA6F2335Db24c2d1F17
Arg [3] : _LQTY (address): 0x30EFbCA5507d8bC7AB33Cd4EfF5dCbe22a2E61A4
Arg [4] : _collateral (address): 0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a
Arg [5] : _maxDiscount (uint256): 800
Arg [6] : _feePool (address): 0xf2bb803010FA55ab60aF1a4740d1A1D6c9C93a39
Arg [7] : _fronEndTag (address): 0x30EFbCA5507d8bC7AB33Cd4EfF5dCbe22a2E61A4

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000009a79a2b1c777bf2bf291cc25249f430499517a12
Arg [1] : 00000000000000000000000078d46cecf0ae4757f430d95b2d7eaa18d7087872
Arg [2] : 00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17
Arg [3] : 00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a4
Arg [4] : 000000000000000000000000fc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [6] : 000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39
Arg [7] : 00000000000000000000000030efbca5507d8bc7ab33cd4eff5dcbe22a2e61a4


Deployed ByteCode Sourcemap

22896:9093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14509:672;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14509:672:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;6659:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4219:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4219:106:0;;;;;;;:::i;24823:1428::-;;;;;;;;;;;;;:::i;31300:429::-;;;;;;;;;;;;;:::i;7143:84::-;;;;;;;;;;;;;:::i;3828:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3828:114:0;;;;;;;:::i;30750:160::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30750:160:0;;:::i;:::-;;;;-1:-1:-1;;;;;30750:160:0;;;;;;;;;;;;;;2243:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2243:41:0;-1:-1:-1;;;;;2243:41:0;;:::i;2170:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2170:41:0;-1:-1:-1;;;;;2170:41:0;;:::i;2052:24::-;;;;;;;;;;;;;:::i;27303:733::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27303:733:0;;:::i;:::-;;22994:54;;;;;;;;;;;;;:::i;6760:34::-;;;;;;;;;;;;;:::i;1696:32::-;;;;;;;;;;;;;:::i;23378:::-;;;;;;;;;;;;;:::i;23135:37::-;;;;;;;;;;;;;:::i;4099:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4099:114:0;;;;;;;:::i;23489:36::-;;;;;;;;;;;;;:::i;3716:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3716:106:0;;;;;;;:::i;3987:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3987:106:0;;;;;;;:::i;30052:315::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30052:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;29400:594;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29400:594:0;;;;;;;;;;;-1:-1:-1;;;;;29400:594:0;;:::i;23340:31::-;;;;;;;;;;;;;:::i;7235:113::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7235:113:0;-1:-1:-1;;;;;7235:113:0;;:::i;1933:34::-;;;;;;;;;;;;;:::i;3006:135::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3006:135:0;;;;;;;:::i;1813:32::-;;;;;;;;;;;;;:::i;30375:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30375:291:0;;;;;;;;;;;;;;;;;;;;;;:::i;3604:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3604:106:0;;;;;;;:::i;19886:79::-;;;;;;;;;;;;;:::i;20252:92::-;;;;;;;;;;;;;:::i;6712:41::-;;;;;;;;;;;;;:::i;1994:24::-;;;;;;;;;;;;;:::i;23534:37::-;;;;;;;;;;;;;:::i;23181:40::-;;;;;;;;;;;;;:::i;1875:32::-;;;;;;;;;;;;;:::i;3147:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3147:136:0;;;;;;;:::i;26259:1036::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26259:1036:0;;:::i;23423:33::-;;;;;;;;;;;;;:::i;23228:34::-;;;;;;;;;;;;;:::i;2110:24::-;;;;;;;;;;;;;:::i;24496:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24496:319:0;;;;;;;:::i;31737:249::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1752:32;;;;;;;;;;;;;:::i;28298:1060::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28298:1060:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3289:149;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3289:149:0;;;;;;;:::i;23055:28::-;;;;;;;;;;;;;:::i;4569:126::-;;;;;;;;;;;;;:::i;23090:34::-;;;;;;;;;;;;;:::i;23275:19::-;;;;;;;;;;;;;:::i;13863:638::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13863:638:0;;;;;;;;;;;;:::i;20352:192::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20352:192:0;-1:-1:-1;;;;;20352:192:0;;:::i;23315:18::-;;;;;;;;;;;;;:::i;14509:672::-;14597:4;14614:8;14625:39;14642:8;14652;14662:1;14625:16;:39::i;:::-;14614:50;-1:-1:-1;14677:6:0;14701:27;14726:1;14702:18;:4;14711:8;14702:18;:8;:18;:::i;:::-;14701:24;:27;:24;:27;:::i;:::-;14686:12;14694:3;;14686:12;:7;:12;:::i;:::-;:42;;;;;;;-1:-1:-1;14756:8:0;:1;14762;14756:8;:5;:8;:::i;:::-;14743:10;:1;14749:3;14743:10;:5;:10;:::i;:::-;:21;;;;;;;-1:-1:-1;14775:6:0;14784:40;14815:8;:1;14821;14815:8;:5;:8;:::i;:::-;14809:3;:14;;;;;;14785:18;:4;14794:8;14785:18;:8;:18;:::i;:::-;14784:24;:40;:24;:40;:::i;:::-;14775:49;-1:-1:-1;14835:10:0;14869:3;14835:10;14885:247;14906:3;14902:1;:7;14885:247;;;14940:1;;-1:-1:-1;14940:1:0;;14956:6;14965:17;14980:1;14966:8;14940:1;;14966:8;:5;:8;:::i;14965:17::-;14956:26;-1:-1:-1;14997:6:0;15006:24;15026:3;15006:15;15019:1;15006:8;:1;15012;15006:8;:5;:8;:::i;:15::-;:19;:24;:19;:24;:::i;:::-;14997:33;;15054:1;15050;:5;;;;;;;-1:-1:-1;15080:12:0;:5;15090:1;15080:12;:9;:12;:::i;:::-;15075:1;:17;;:38;;;;-1:-1:-1;15105:8:0;:1;15111;15105:8;:5;:8;:::i;:::-;15096:5;:17;;15075:38;15072:48;;;15115:5;;;;15072:48;-1:-1:-1;;14912:3:0;;14885:247;;;-1:-1:-1;15151:22:0;15171:1;15151:15;:8;15164:1;15151:15;:12;:15;:::i;:22::-;15144:29;14509:672;-1:-1:-1;;;;;;;;;;14509:672:0:o;6659:46::-;;;;;;;;;;;;;;-1:-1:-1;;;6659:46:0;;;;:::o;4219:106::-;4276:9;4316:1;4302:11;4306:1;3972:8;4302:3;:11::i;:::-;:15;;;;;;;4219:106;-1:-1:-1;;;4219:106:0:o;24823:1428::-;24865:4;24882:22;24915:26;24952:23;25049:15;-1:-1:-1;;;;;25049:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25049:26:0;;;25045:338;;25370:1;25363:8;;;;;;;25045:338;25200:28;;;-1:-1:-1;25451:15:0;-1:-1:-1;;;;;25451:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25451:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:589;;26023:1;26016:8;;;;;;;25447:589;-1:-1:-1;25829:6:0;;-1:-1:-1;25872:9:0;;-1:-1:-1;;;26082:3:0;26051:18;26072:7;26051:28;:34;26048:47;;;26094:1;26087:8;;;;;;;26048:47;26148:2;:23;;;;26189:36;:21;23567:4;26189:36;:25;:36;:::i;:::-;:54;;;;;;26182:61;;;;;;24823:1428;;:::o;31300:429::-;31386:39;;;-1:-1:-1;;;31386:39:0;;31419:4;31386:39;;;;;;31352:4;;;;-1:-1:-1;;;;;31386:2:0;:24;;;;:39;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31386:39:0;;-1:-1:-1;31436:20:0;31472:10;-1:-1:-1;;;;;31472:25:0;31469:203;;-1:-1:-1;31532:21:0;31469:203;;;31625:35;;;-1:-1:-1;;;31625:35:0;;31654:4;31625:35;;;;;;-1:-1:-1;;;;;31625:10:0;:20;;;;:35;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31625:35:0;;-1:-1:-1;31469:203:0;31691:30;:9;31705:15;31691:30;:13;:30;:::i;:::-;31684:37;;;;31300:429;:::o;7143:84::-;7214:5;;7143:84;:::o;3828:114::-;3887:9;3913:21;3919:11;3923:1;3589:8;3919:3;:11::i;:::-;3932:1;3913:5;:21::i;:::-;3909:25;3828:114;-1:-1:-1;;;3828:114:0:o;30750:160::-;30803:7;30831:10;;30823:42;;;;;-1:-1:-1;;;30823:42:0;;;;;;;;;;;;-1:-1:-1;;;30823:42:0;;;;;;;;;;;;;;;-1:-1:-1;30891:10:0;30750:160;;;:::o;2243:41::-;;;;;;;;;;;;;:::o;2170:::-;;;;;;;;;;;;;:::o;2052:24::-;;;;:::o;27303:733::-;27374:41;;;-1:-1:-1;;;27374:41:0;;27409:4;27374:41;;;;;;27357:14;;-1:-1:-1;;;;;27374:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27374:41:0;;-1:-1:-1;27426:13:0;27442:22;:20;:22::i;:::-;27426:38;;27477:15;27495:35;27524:5;;27495:24;27509:9;27495;:13;;:24;;;;:::i;:::-;:28;:35;:28;:35;:::i;:::-;27477:53;;27541:14;27558:34;27586:5;;27558:23;27571:9;27558:8;:12;;:23;;;;:::i;:34::-;27541:51;;27652:2;-1:-1:-1;;;;;27652:17:0;;27670:10;27652:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27722:27;27727:10;27739:9;27722:4;:27::i;:::-;27795:14;;27792:56;;27811:37;;;-1:-1:-1;;;27811:37:0;;27825:10;27811:37;;;;;;;;;;;;-1:-1:-1;;;;;27811:4:0;:13;;;;:37;;;;;;;;;;;;;;-1:-1:-1;27811:13:0;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27792:56:0;27862:13;;27859:82;;27892:37;27907:10;27919:9;27892:14;:37::i;:::-;27958:58;;;;;;;;;;;;;;;;;;;;27971:10;;27958:58;;;;;;;;;;27303:733;;;;;:::o;22994:54::-;;;:::o;6760:34::-;6792:2;6760:34;:::o;1696:32::-;;;:::o;23378:::-;23407:3;23378:32;:::o;23135:37::-;;;:::o;4099:114::-;4158:9;4184:21;4190:9;4194:1;4197;4190:3;:9::i;:::-;3972:8;4184:5;:21::i;23489:36::-;;;:::o;3716:106::-;3773:9;3813:1;3799:11;3803:1;3589:8;3799:3;:11::i;3987:106::-;4044:9;3972:8;4070:9;4074:1;4077;4070:3;:9::i;30052:315::-;30300:4;30358:1;30324:31;30329:9;30340:1;30343:11;30324:4;:31::i;:::-;:35;;30052:315;-1:-1:-1;;;;;;;30052:315:0:o;29400:594::-;29487:4;29505:14;29521;29539:28;29556:10;29539:16;:28::i;:::-;29504:63;;;;29601:12;29588:9;:25;;29580:54;;;;;-1:-1:-1;;;29580:54:0;;;;;;;;;;;;-1:-1:-1;;;29580:54:0;;;;;;;;;;;;;;;29647:56;;;-1:-1:-1;;;29647:56:0;;29665:10;29647:56;;;;29685:4;29647:56;;;;;;;;;;;;-1:-1:-1;;;;;29647:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;29647:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;29714:2:0;:14;;29729:25;:10;29744:9;29729:25;:14;:25;:::i;:::-;29714:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29783:1;29771:9;:13;29768:51;;;29786:4;-1:-1:-1;;;;;29786:13:0;;29800:7;29809:9;29786:33;;;;;;;;;;;;;-1:-1:-1;;;;;29786:33:0;-1:-1:-1;;;;;29786:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29768:51:0;29830:31;29845:4;29851:9;29830:14;:31::i;:::-;29904:53;;;;;;;;;;;;29953:3;29904:53;;;;;;29918:10;;29904:53;;;;;;;;;;-1:-1:-1;29977:9:0;29400:594;-1:-1:-1;;;;29400:594:0:o;23340:31::-;23369:2;23340:31;:::o;7235:113::-;-1:-1:-1;;;;;7328:12:0;7290:15;7328:12;;;:5;:12;;;;;;;7235:113::o;1933:34::-;;;:::o;3006:135::-;3097:5;;;3092:16;;;;3084:49;;;;;-1:-1:-1;;;3084:49:0;;;;;;;;;;;;-1:-1:-1;;;3084:49:0;;;;;;;;;;;;;;;3006:135;;;;:::o;1813:32::-;;;:::o;30375:291::-;30548:7;30569:11;30586:24;30603:6;30586:16;:24::i;:::-;-1:-1:-1;30568:42:0;-1:-1:-1;30652:6:0;30628:21;30568:42;23567:4;30628:21;:10;:21;:::i;:::-;:30;;;;;;;30375:291;-1:-1:-1;;;;;;30375:291:0:o;3604:106::-;3661:9;3589:8;3687:9;3691:1;3694;3687:3;:9::i;19886:79::-;19951:6;;-1:-1:-1;;;;;19951:6:0;19886:79;:::o;20252:92::-;20330:6;;-1:-1:-1;;;;;20330:6:0;20316:10;:20;;20252:92::o;6712:41::-;;;;;;;;;;;;;;-1:-1:-1;;;6712:41:0;;;;:::o;1994:24::-;;;;:::o;23534:37::-;23567:4;23534:37;:::o;23181:40::-;;;:::o;1875:32::-;;;:::o;3147:136::-;3238:5;;;3233:16;;;;3225:50;;;;;-1:-1:-1;;;3225:50:0;;;;;;;;;;;;-1:-1:-1;;;3225:50:0;;;;;;;;;;;;;;26259:1036;26363:41;;;-1:-1:-1;;;26363:41:0;;26398:4;26363:41;;;;;;26346:14;;-1:-1:-1;;;;;26363:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26363:41:0;;-1:-1:-1;26415:13:0;26431:22;:20;:22::i;:::-;26415:38;;26466:10;26479:12;:10;:12::i;:::-;26466:25;-1:-1:-1;26510:13:0;;;:26;;;26535:1;26527:5;:9;26510:26;26502:65;;;;;-1:-1:-1;;;26502:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26580:15;26598:46;23567:4;26612:19;:8;26625:5;26612:19;:12;:19;:::i;:::-;:31;;;;;26598:9;;26612:31;;26598:46;:13;:46;:::i;:::-;26580:64;;26831:1;26818:10;:14;:28;;;-1:-1:-1;26836:5:0;;:10;26818:28;26810:64;;;;;-1:-1:-1;;;26810:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26926:5;;23567:4;;26926:9;26923:59;;26948:5;;26972:10;;26948:21;;26958:10;26948:21;:9;:21;:::i;:::-;:34;;;;;;26937:45;;26923:59;27023:56;;;-1:-1:-1;;;27023:56:0;;27041:10;27023:56;;;;27061:4;27023:56;;;;;;;;;;;;-1:-1:-1;;;;;27023:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;27023:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27023:56:0;27015:97;;;;;-1:-1:-1;;;27015:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27123:2;-1:-1:-1;;;;;27123:14:0;;27138:10;27123:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27190;27195:10;27207:8;27190:4;:26::i;:::-;27234:45;;;;;;;;;;;;;;27246:10;;27234:45;;;;;;;;26259:1036;;;;;;:::o;23423:33::-;;;:::o;23228:34::-;23259:3;23228:34;:::o;2110:24::-;;;;:::o;24496:319::-;20098:9;:7;:9::i;:::-;20090:54;;;;;-1:-1:-1;;;20090:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23259:3:::1;24573:4;:15;;24565:53;;;::::0;;-1:-1:-1;;;24565:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23369:2;24637;:11;;24629:46;;;::::0;;-1:-1:-1;;;24629:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24629:46:0;;;;;;;;;;;;;::::1;;23407:3;24694:2;:11;;24686:44;;;::::0;;-1:-1:-1;;;24686:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24686:44:0;;;;;;;;;;;;;::::1;;24743:3;:10:::0;;;24764:1:::1;:6:::0;;;24788:19:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;24496:319:::0;;:::o;31737:249::-;31787:9;31798:10;31821:13;31837:22;:20;:22::i;:::-;31821:38;;31872:10;31885:12;:10;:12::i;:::-;31917:9;;;;-1:-1:-1;31872:25:0;-1:-1:-1;23567:4:0;31946:19;:8;31872:25;31946:19;:12;:19;:::i;:::-;:31;;;;;;31937:41;;31737:249;;;;:::o;1752:32::-;;;:::o;28298:1060::-;28358:14;28374:18;28405:16;28424:2;-1:-1:-1;;;;;28424:26:0;;28459:4;28424:41;;;;;;;;;;;;;-1:-1:-1;;;;;28424:41:0;-1:-1:-1;;;;;28424:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28424:41:0;;-1:-1:-1;28476:15:0;28495:22;:20;:22::i;:::-;28476:41;;28530:17;28550:12;:10;:12::i;:::-;28530:32;-1:-1:-1;28576:17:0;28573:35;;-1:-1:-1;28603:1:0;;-1:-1:-1;28603:1:0;;-1:-1:-1;28595:13:0;;-1:-1:-1;;28595:13:0;28573:35;28642:16;23567:4;28661:28;:10;28676:12;28661:28;:14;:28;:::i;:::-;:40;;;;;;;-1:-1:-1;28712:14:0;28729:63;28761:12;28736:22;:7;23567:4;28736:22;:11;:22;:::i;:::-;:37;;;;;;28779:11;28729:6;:63::i;:::-;28712:80;-1:-1:-1;28817:7:0;28851:11;28805:9;28889:35;28905:18;:11;28921:1;28905:18;:15;:18;:::i;:::-;28889:11;;:35;:15;:35;:::i;:::-;28873:51;;28945:14;28962:38;28972:4;28978:8;28988;28998:1;;28962:9;:38::i;:::-;28945:55;-1:-1:-1;29011:19:0;29060:12;29033:24;28945:55;23567:4;29033:24;:13;:24;:::i;:::-;:39;;;;;;29011:61;;29101:14;29088:10;:27;29085:59;;;-1:-1:-1;29134:10:0;29085:59;29204:14;29192:9;:26;29189:57;;;-1:-1:-1;29237:9:0;29189:57;29271:14;29259:26;;29312:38;29342:7;29312:25;29319:7;29332:3;;29312:6;:25::i;:38::-;29296:54;;28298:1060;;;;;;;;;;;;;;:::o;3289:149::-;3345:9;3375:6;;;:30;;-1:-1:-1;;3390:5:0;;;3404:1;3399;3390:5;3399:1;3385:15;;;;;:20;3375:30;3367:63;;;;;-1:-1:-1;;;3367:63:0;;;;;;;;;;;;-1:-1:-1;;;3367:63:0;;;;;;;;;;;;;;23055:28;;;:::o;4569:126::-;4600:7;4624:5;;4633:1;4624:10;4620:67;;;-1:-1:-1;3589:8:0;4636:10;;4620:67;4669:18;4674:5;:3;:5::i;:::-;4681;;4669:4;:18::i;:::-;4662:25;;;;23090:34;;;:::o;23275:19::-;;;;:::o;13863:638::-;13933:4;13953:6;;:16;;;;-1:-1:-1;13963:6:0;;13953:16;13950:29;;;-1:-1:-1;13978:1:0;13971:8;;13950:29;13992:8;14003;:1;14009;14003:8;:5;:8;:::i;:::-;13992:19;-1:-1:-1;14028:6:0;14024:447;14045:3;14041:1;:7;14024:447;;;14081:3;14118:17;14133:1;14119:8;:1;14125;14119:8;:5;:8;:::i;14118:17::-;14104:11;:2;14111:3;14104:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;14169:17:0;14184:1;14170:8;:1;14176;14170:8;:5;:8;:::i;14169:17::-;14155:11;:2;14162:3;14155:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;14218:3:0;14203:12;14247:48;14218:3;14248:37;14275:9;14155:31;14282:1;14275:9;:6;:9;:::i;:::-;14248:22;14261:8;:1;14267;14261:8;:5;:8;:::i;:::-;14248;:1;14254;14248:8;:5;:8;:::i;14247:48::-;14238:57;-1:-1:-1;14310:6:0;14320:24;14340:3;14320:15;14333:1;14320:8;:1;14326;14320:8;:5;:8;:::i;:24::-;14310:35;-1:-1:-1;14370:16:0;14376:9;:2;14383:1;14376:9;:6;:9;:::i;:::-;14370:1;;:16;:5;:16;:::i;:::-;14366:1;:20;;;;;;;-1:-1:-1;14413:14:0;:7;14425:1;14413:14;:11;:14;:::i;:::-;14406:3;:21;;:46;;;;-1:-1:-1;14442:10:0;:3;14450:1;14442:10;:7;:10;:::i;:::-;14431:7;:21;;14406:46;14403:56;;;14454:5;;;;;;14403:56;-1:-1:-1;;14051:3:0;;;;;-1:-1:-1;14024:447:0;;-1:-1:-1;14024:447:0;;-1:-1:-1;14490:3:0;13863:638;-1:-1:-1;;;;13863:638:0:o;20352:192::-;20098:9;:7;:9::i;:::-;20090:54;;;;;-1:-1:-1;;;20090:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20441:22:0;::::1;20433:73;;;;-1:-1:-1::0;;;20433:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20517:19;20527:8;20517:9;:19::i;:::-;20352:192:::0;:::o;23315:18::-;;;;:::o;9112:181::-;9170:7;9202:5;;;9226:6;;;;9218:46;;;;;-1:-1:-1;;;9218:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10484:471;10542:7;10787:6;10783:47;;-1:-1:-1;10817:1:0;10810:8;;10783:47;10854:5;;;10858:1;10854;:5;:1;10878:5;;;;;:10;10870:56;;;;-1:-1:-1;;;10870:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9568:136;9626:7;9653:43;9657:1;9660;9653:43;;;;;;;;;;;;;;;;;:3;:43::i;3444:115::-;3504:9;3550:1;3530:17;3534:1;3537:9;3541:1;3544;3537:3;:9::i;:::-;3530:3;:17::i;11423:132::-;11481:7;11508:39;11512:1;11515;11508:39;;;;;;;;;;;;;;;;;:3;:39::i;7500:153::-;7569:18;7574:5;7581;7569:4;:18::i;:::-;7603:34;;;;;;;;7627:1;;-1:-1:-1;;;;;7603:34:0;;;;;;;;;;;;7500:153;;:::o;30918:374::-;30990:10;-1:-1:-1;;;;;30990:25:0;30987:298;;31051:28;;31033:12;;-1:-1:-1;;;;;31051:7:0;;;31067:6;;31033:12;31051:28;31033:12;31051:28;31067:6;31051:7;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31032:47;;;31102:7;31094:54;;;;-1:-1:-1;;;31094:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30987:298;;;;31210:10;-1:-1:-1;;;;;31210:19:0;;31230:2;31234:6;31210:31;;;;;;;;;;;;;-1:-1:-1;;;;;31210:31:0;-1:-1:-1;;;;;31210:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31210:31:0;31202:71;;;;;-1:-1:-1;;;31202:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30918:374;;:::o;7356:136::-;7422:15;7427:2;7431:5;7422:4;:15::i;:::-;7453:31;;;;;;;;-1:-1:-1;;;;;7453:31:0;;;7470:1;;7453:31;;;;;;;;;7356:136;;:::o;28044:246::-;28099:4;28131:5;28124:3;:12;;28116:51;;;;;-1:-1:-1;;;28116:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28186:3:0;:13;;28178:52;;;;;-1:-1:-1;;;28178:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28277:5;28250:24;:1;28261:11;;;28250:24;:5;:24;:::i;20552:173::-;20627:6;;;-1:-1:-1;;;;;20644:17:0;;;-1:-1:-1;;;;;;20644:17:0;;;;;;;20677:40;;20627:6;;;20644:17;20627:6;;20677:40;;20608:16;;20677:40;20552:173;;:::o;10041:192::-;10127:7;10163:12;10155:6;;;;10147:29;;;;-1:-1:-1;;;10147:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10199:5:0;;;10041:192::o;12085:345::-;12171:7;12273:12;12266:5;12258:28;;;;-1:-1:-1;;;12258:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12297:9;12313:1;12309;:5;;;;;;;12085:345;-1:-1:-1;;;;;12085:345:0:o;5803:645::-;5871:24;5879:10;5891:3;5871:7;:24::i;:::-;5910:7;;5906:447;;5934:11;5948:45;5955:30;5959:3;5964:20;5955:3;:30::i;:::-;5987:5;:3;:5::i;:::-;5948:6;:45::i;:::-;5934:59;;6135:1;6128:3;6121:15;6113:24;;;;;;6162:3;-1:-1:-1;;;;;6162:12:0;;6175:3;6180;6162:22;;;;;;;;;;;;;-1:-1:-1;;;;;6162:22:0;-1:-1:-1;;;;;6162:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6162:22:0;6154:31;;;;;;6200:39;;;-1:-1:-1;;;6200:39:0;;6209:3;6200:39;;;;6214:10;6200:39;;;;6226:12;;;;6200:39;;;;;;-1:-1:-1;;;;;6200:3:0;:8;;;;:39;;;;;;;;;;;6226:12;6200:8;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6264:15;6268:5;;6275:3;6264;:15::i;:::-;6256:5;:23;6324:10;6318:17;;;;:5;:17;;;;;;6314:27;;6337:3;6314;:27::i;:::-;6300:10;6294:17;;;;:5;:17;;;;;:47;-1:-1:-1;5906:447:0;6396:10;6390:17;;;;:5;:17;;;;;;6409:5;;6383:32;;6390:17;6383:6;:32::i;:::-;6369:10;6363:17;;;;:5;:17;;;;;;;;;:52;;;;6431:9;;;;;;;;;;;;;;;;;;5803:645;;:::o;5169:626::-;5237:17;5245:3;5250;5237:7;:17::i;:::-;5269:7;;5265:449;;5293:11;5307:43;5312:30;5316:3;5321:20;5312:3;:30::i;:::-;5344:5;:3;:5::i;:::-;5307:4;:43::i;:::-;5293:57;;5492:1;5485:3;5478:15;5470:24;;;;;;5519:48;;;-1:-1:-1;;;5519:48:0;;5536:10;5519:48;;;;5556:4;5519:48;;;;;;;;;;;;-1:-1:-1;;;;;5519:3:0;:16;;;;:48;;;;;;;;;;;;;;-1:-1:-1;5519:16:0;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5519:48:0;5511:57;;;;;;5583:3;-1:-1:-1;;;;;5583:8:0;;5592:3;5597;5609;5583:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5583:31:0;-1:-1:-1;;;;;5583:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5639:15;5643:5;;5650:3;5639;:15::i;:::-;5631:5;:23;-1:-1:-1;;;;;5686:10:0;;;;;;:5;:10;;;;;;5682:20;;5698:3;5682;:20::i;:::-;-1:-1:-1;;;;;5669:10:0;;;;;;:5;:10;;;;;:33;-1:-1:-1;5265:449:0;-1:-1:-1;;;;;5744:10:0;;;;;;:5;:10;;;;;;5756:5;;5737:25;;5744:10;5737:6;:25::i;:::-;-1:-1:-1;;;;;5724:10:0;;;;;;:5;:10;;;;;;;;;:38;;;;5778:9;;;;;;;;;;;;;;;;;;5169:626;;:::o;4830:331::-;4897:5;;:9;4893:54;;4916:31;4920:5;;4927:19;4932:6;:4;:6::i;:::-;4940:5;;4927:4;:19::i;4916:31::-;4908:5;:39;4893:54;-1:-1:-1;;;;;4975:11:0;;4960:12;4975:11;;;:5;:11;;;;;;;;;5017:5;:11;;;;;;5030:5;;4975:11;;4960:12;5012:24;;5017:11;5012:4;:24::i;:::-;4997:39;;5058:4;5051;:11;5047:57;;;5072:5;-1:-1:-1;;;;;5072:14:0;;5087:2;5098:4;5091;:11;5072:31;;;;;;;;;;;;;-1:-1:-1;;;;;5072:31:0;-1:-1:-1;;;;;5072:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5072:31:0;5064:40;;;;;;5123:30;;;-1:-1:-1;;;5123:30:0;;5147:4;5123:30;;;;;;-1:-1:-1;;;;;5123:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5123:30:0;5115:5;:38;-1:-1:-1;;;;4830:331:0:o;4703:119::-;4776:30;;;-1:-1:-1;;;4776:30:0;;4800:4;4776:30;;;;;;4745:7;;4772:42;;-1:-1:-1;;;;;4776:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4776:30:0;4808:5;;4772:3;:42::i;:::-;4765:49;;4703:119;:::o

Metadata Hash

e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a813961
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.