Contract 0x285A6054DdC2980C62E716086B065E1e770fffb3 1

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x46fe5bb46d472dfcdb9194373d19ad2be9c756ef2cf65299c2edf41a5e5a96edDeposit201870592021-10-14 22:55:19534 days 13 hrs ago0x375c1dc69f05ff526498c8aca48805eec52861d5 IN  0x285a6054ddc2980c62e716086b065e1e770fffb30 MATIC0.0011628033
0xcaa4753bc130904e6a049edf15d0ae1f34ab8d837a255aa8e3eaa6d40321c754Redeem198179742021-10-06 1:49:53543 days 10 hrs ago0x693ad12dba5f6e07de86faa21098b691f60a1bea IN  0x285a6054ddc2980c62e716086b065e1e770fffb30 MATIC0.0001930173
0x3663cee0c8f8d7e80e65ac99b4dd5fe6d1a5c43df7a042323d9f6263bb7d8487Deposit196929872021-10-03 2:00:32546 days 10 hrs ago0xaa488667d0ec83e759eae071e9bcd3f5f528db59 IN  0x285a6054ddc2980c62e716086b065e1e770fffb30 MATIC0.0137920230
0xf28662cbe43adce21d9e490dfa584872a3ad282c0952fb4bffcf484ae6610d47Deposit196724962021-10-02 14:11:54546 days 22 hrs ago0x375c1dc69f05ff526498c8aca48805eec52861d5 IN  0x285a6054ddc2980c62e716086b065e1e770fffb30 MATIC0.0018388884
0xfdb3ae3a655820a317bd48bf37c511efa4abe6c0f3abaf0e96cc11e9804be5d8Deposit196439882021-10-01 21:47:42547 days 14 hrs ago0x693ad12dba5f6e07de86faa21098b691f60a1bea IN  0x285a6054ddc2980c62e716086b065e1e770fffb30 MATIC0.014304330
0xc2bbb8bed340dd5c337760750bd0b7407fa4c3decbdb64d790d859163223193dInitialize Bond ...196436962021-10-01 21:37:38547 days 14 hrs ago0x693ad12dba5f6e07de86faa21098b691f60a1bea IN  0x285a6054ddc2980c62e716086b065e1e770fffb30 MATIC0.0054549330
0xb90abf7a6aa73a8753ba14ad995943a22e7a2b7002788594399707e224acc6270x61014060196435182021-10-01 21:31:30547 days 14 hrs ago0x693ad12dba5f6e07de86faa21098b691f60a1bea IN  Contract Creation0 MATIC0.0480879420
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x2d64A576d6d97B534D643368081b9933637C359C

Contract Name:
KlimaBondDepository

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-10-01
*/

// ██╗  ██╗██╗     ██╗███╗   ███╗ █████╗     ██████╗  █████╗  ██████╗
// ██║ ██╔╝██║     ██║████╗ ████║██╔══██╗    ██╔══██╗██╔══██╗██╔═══██╗
// █████╔╝ ██║     ██║██╔████╔██║███████║    ██║  ██║███████║██║   ██║
// ██╔═██╗ ██║     ██║██║╚██╔╝██║██╔══██║    ██║  ██║██╔══██║██║   ██║
// ██║  ██╗███████╗██║██║ ╚═╝ ██║██║  ██║    ██████╔╝██║  ██║╚██████╔╝
// ╚═╝  ╚═╝╚══════╝╚═╝╚═╝     ╚═╝╚═╝  ╚═╝    ╚═════╝ ╚═╝  ╚═╝ ╚═════╝

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IOwnable {
    function policy() external view returns (address);

    function renounceManagement() external;

    function pushManagement( address newOwner_ ) external;

    function pullManagement() external;
}

contract Ownable is IOwnable {

    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPushed( address(0), _owner );
    }

    function policy() public view override returns (address) {
        return _owner;
    }

    modifier onlyPolicy() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceManagement() public virtual override onlyPolicy() {
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyPolicy() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }

    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function addressToString(address _address) internal pure returns(string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = '0';
        _addr[1] = 'x';

        for(uint256 i = 0; i < 20; i++) {
            _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);

    }
}

interface IERC20 {
    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

abstract contract ERC20 is IERC20 {

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );

    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    string internal _name;

    string internal _symbol;

    uint8 internal _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account_, uint256 ammount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, ammount_);
        _totalSupply = _totalSupply.add(ammount_);
        _balances[account_] = _balances[account_].add(ammount_);
        emit Transfer(address( this ), account_, ammount_);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

interface IERC2612Permit {

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
}

library Counters {
    using SafeMath for uint256;

    struct Counter {

        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
        keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {

        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

library FullMath {
    function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);
        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;
        require(h < d, 'FullMath::mulDiv: overflow');
        return fullDiv(l, h, d);
    }
}

library FixedPoint {

    struct uq112x112 {
        uint224 _x;
    }

    struct uq144x112 {
        uint256 _x;
    }

    uint8 private constant RESOLUTION = 112;
    uint256 private constant Q112 = 0x10000000000000000000000000000;
    uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000;
    uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)

    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    function decode112with18(uq112x112 memory self) internal pure returns (uint) {

        return uint(self._x) / 5192296858534827;
    }

    function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, 'FixedPoint::fraction: division by zero');
        if (numerator == 0) return FixedPoint.uq112x112(0);

        if (numerator <= uint144(-1)) {
            uint256 result = (numerator << RESOLUTION) / denominator;
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        } else {
            uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        }
    }
}

interface ITreasury {
    function deposit( uint _amount, address _token, uint _profit ) external returns ( bool );
    function valueOf( address _token, uint _amount ) external view returns ( uint value_ );
}

interface IBondCalculator {
    function valuation( address _LP, uint _amount ) external view returns ( uint );
    function markdown( address _LP ) external view returns ( uint );
}

interface IStaking {
    function stake( uint _amount, address _recipient ) external returns ( bool );
}

interface IStakingHelper {
    function stake( uint _amount, address _recipient ) external;
}

contract KlimaBondDepository is Ownable {

    using FixedPoint for *;
    using SafeERC20 for IERC20;
    using SafeMath for uint;




    /* ======== EVENTS ======== */

    event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD );
    event BondRedeemed( address indexed recipient, uint payout, uint remaining );
    event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio );
    event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition );




    /* ======== STATE VARIABLES ======== */

    address public immutable KLIMA; // token given as payment for bond
    address public immutable principle; // token used to create bond
    address public immutable treasury; // mints KLIMA when receives principle
    address public immutable DAO; // receives profit share from bond

    bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different
    address public immutable bondCalculator; // calculates value of LP tokens

    address public staking; // to auto-stake payout
    address public stakingHelper; // to stake and claim if no staking warmup
    bool public useHelper;

    Terms public terms; // stores terms for new bonds
    Adjust public adjustment; // stores adjustment to BCV data

    mapping( address => Bond ) public bondInfo; // stores bond information for depositors

    uint public totalDebt; // total value of outstanding bonds; used for pricing
    uint public lastDecay; // reference block for debt decay




    /* ======== STRUCTS ======== */

    // Info for creating new bonds
    struct Terms {
        uint controlVariable; // scaling variable for price
        uint vestingTerm; // in blocks
        uint minimumPrice; // vs principle value
        uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5%
        uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid)
        uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt
    }

    // Info for bond holder
    struct Bond {
        uint payout; // KLIMA remaining to be paid
        uint vesting; // Blocks left to vest
        uint lastBlock; // Last interaction
        uint pricePaid; // In BCT, for front end viewing
    }

    // Info for incremental adjustments to control variable 
    struct Adjust {
        bool add; // addition or subtraction
        uint rate; // increment
        uint target; // BCV when adjustment finished
        uint buffer; // minimum length (in blocks) between adjustments
        uint lastBlock; // block when last adjustment made
    }

    /* ======== INITIALIZATION ======== */

    constructor (
        address _KLIMA,
        address _principle,
        address _treasury,
        address _DAO,
        address _bondCalculator
    ) {
        require( _KLIMA != address(0) );
        KLIMA = _KLIMA;
        require( _principle != address(0) );
        principle = _principle;
        require( _treasury != address(0) );
        treasury = _treasury;
        require( _DAO != address(0) );
        DAO = _DAO;
        // bondCalculator should be address(0) if not LP bond
        bondCalculator = _bondCalculator;
        isLiquidityBond = ( _bondCalculator != address(0) );
    }

    /**
     *  @notice initializes bond parameters
     *  @param _controlVariable uint
     *  @param _vestingTerm uint
     *  @param _minimumPrice uint
     *  @param _maxPayout uint
     *  @param _fee uint
     *  @param _maxDebt uint
     *  @param _initialDebt uint
     */
    function initializeBondTerms(
        uint _controlVariable,
        uint _vestingTerm,
        uint _minimumPrice,
        uint _maxPayout,
        uint _fee,
        uint _maxDebt,
        uint _initialDebt
    ) external onlyPolicy() {
        require( terms.controlVariable == 0, "Bonds must be initialized from 0" );
        terms = Terms ({
        controlVariable: _controlVariable,
        vestingTerm: _vestingTerm,
        minimumPrice: _minimumPrice,
        maxPayout: _maxPayout,
        fee: _fee,
        maxDebt: _maxDebt
        });
        totalDebt = _initialDebt;
        lastDecay = block.number;
    }
    /* ======== POLICY FUNCTIONS ======== */

    enum PARAMETER { VESTING, PAYOUT, FEE, DEBT }
    /**
     *  @notice set parameters for new bonds
     *  @param _parameter PARAMETER
     *  @param _input uint
     */
    function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() {
        if ( _parameter == PARAMETER.VESTING ) { // 0
            require( _input >= 10000, "Vesting must be longer than 36 hours" );
            terms.vestingTerm = _input;
        } else if ( _parameter == PARAMETER.PAYOUT ) { // 1
            require( _input <= 1000, "Payout cannot be above 1 percent" );
            terms.maxPayout = _input;
        } else if ( _parameter == PARAMETER.FEE ) { // 2
            require( _input <= 10000, "DAO fee cannot exceed payout" );
            terms.fee = _input;
        } else if ( _parameter == PARAMETER.DEBT ) { // 3
            terms.maxDebt = _input;
        }
    }

    /**
     *  @notice set control variable adjustment
     *  @param _addition bool
     *  @param _increment uint
     *  @param _target uint
     *  @param _buffer uint
     */
    function setAdjustment (
        bool _addition,
        uint _increment,
        uint _target,
        uint _buffer
    ) external onlyPolicy() {
        require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" );

        adjustment = Adjust({
        add: _addition,
        rate: _increment,
        target: _target,
        buffer: _buffer,
        lastBlock: block.number
        });
    }

    /**
     *  @notice set contract for auto stake
     *  @param _staking address
     *  @param _helper bool
     */
    function setStaking( address _staking, bool _helper ) external onlyPolicy() {
        require( _staking != address(0) );
        if ( _helper ) {
            useHelper = true;
            stakingHelper = _staking;
        } else {
            useHelper = false;
            staking = _staking;
        }
    }

    /* ======== USER FUNCTIONS ======== */

    /**
     *  @notice deposit bond
     *  @param _amount uint
     *  @param _maxPrice uint
     *  @param _depositor address
     *  @return uint
     */
    function deposit(
        uint _amount,
        uint _maxPrice,
        address _depositor
    ) external returns ( uint ) {
        require( _depositor != address(0), "Invalid address" );

        decayDebt();
        require( totalDebt <= terms.maxDebt, "Max capacity reached" );

        uint priceInUSD = bondPriceInUSD(); // Stored in bond info
        uint nativePrice = _bondPrice();

        require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection

        uint value = ITreasury( treasury ).valueOf( principle, _amount );
        uint payout = payoutFor( value ); // payout to bonder is computed

        require( payout >= 10000000, "Bond too small" ); // must be > 0.01 KLIMA ( underflow protection )
        require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage

        // profits are calculated
        uint fee = payout.mul( terms.fee ).div( 10000 );
        uint profit = 0 ;
        if (payout + fee < value){
           profit = value.sub( payout ).sub( fee );
        }
        
        

        /**
            principle is transferred in
            approved and
            deposited into the treasury, returning (_amount - profit) KLIMA
         */
        IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount );
        IERC20( principle ).approve( address( treasury ), _amount );
        ITreasury( treasury ).deposit( _amount, principle, profit );

        if ( fee != 0 ) { // fee is transferred to dao 
            IERC20( KLIMA ).safeTransfer( DAO, fee );
        }

        // total debt is increased
        totalDebt = totalDebt.add( value );

        // depositor info is stored
        bondInfo[ _depositor ] = Bond({
        payout: bondInfo[ _depositor ].payout.add( payout ),
        vesting: terms.vestingTerm,
        lastBlock: block.number,
        pricePaid: priceInUSD
        });

        // indexed events are emitted
        emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD );
        emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() );

        adjust(); // control variable is adjusted
        return payout;
    }

    /** 
     *  @notice redeem bond for user
     *  @param _recipient address
     *  @param _stake bool
     *  @return uint
     */
    function redeem( address _recipient, bool _stake ) external returns ( uint ) {
        Bond memory info = bondInfo[ _recipient ];
        uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining)

        if ( percentVested >= 10000 ) { // if fully vested
            delete bondInfo[ _recipient ]; // delete user info
            emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data
            return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due

        } else { // if unfinished
            // calculate payout vested
            uint payout = info.payout.mul( percentVested ).div( 10000 );

            // store updated deposit info
            bondInfo[ _recipient ] = Bond({
            payout: info.payout.sub( payout ),
            vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ),
            lastBlock: block.number,
            pricePaid: info.pricePaid
            });

            emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout );
            return stakeOrSend( _recipient, _stake, payout );
        }
    }




    /* ======== INTERNAL HELPER FUNCTIONS ======== */

    /**
     *  @notice allow user to stake payout automatically
     *  @param _stake bool
     *  @param _amount uint
     *  @return uint
     */
    function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) {
        if ( !_stake ) { // if user does not want to stake
            IERC20( KLIMA ).transfer( _recipient, _amount ); // send payout
        } else { // if user wants to stake
            if ( useHelper ) { // use if staking warmup is 0
                IERC20( KLIMA ).approve( stakingHelper, _amount );
                IStakingHelper( stakingHelper ).stake( _amount, _recipient );
            } else {
                IERC20( KLIMA ).approve( staking, _amount );
                IStaking( staking ).stake( _amount, _recipient );
            }
        }
        return _amount;
    }

    /**
     *  @notice makes incremental adjustment to control variable
     */
    function adjust() internal {
        uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer );
        if( adjustment.rate != 0 && block.number >= blockCanAdjust ) {
            uint initial = terms.controlVariable;
            if ( adjustment.add ) {
                terms.controlVariable = terms.controlVariable.add( adjustment.rate );
                if ( terms.controlVariable >= adjustment.target ) {
                    adjustment.rate = 0;
                }
            } else {
                terms.controlVariable = terms.controlVariable.sub( adjustment.rate );
                if ( terms.controlVariable <= adjustment.target ) {
                    adjustment.rate = 0;
                }
            }
            adjustment.lastBlock = block.number;
            emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add );
        }
    }

    /**
     *  @notice reduce total debt
     */
    function decayDebt() internal {
        totalDebt = totalDebt.sub( debtDecay() );
        lastDecay = block.number;
    }




    /* ======== VIEW FUNCTIONS ======== */

    /**
     *  @notice determine maximum bond size
     *  @return uint
     */
    function maxPayout() public view returns ( uint ) {
        return IERC20( KLIMA ).totalSupply().mul( terms.maxPayout ).div( 100000 );
    }

    /**
     *  @notice calculate interest due for new bond
     *  @param _value uint
     *  @return uint
     */
    function payoutFor( uint _value ) public view returns ( uint ) {
        return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 );
    }


    /**
     *  @notice calculate current bond premium
     *  @return price_ uint
     */
    function bondPrice() public view returns ( uint price_ ) {
        price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;
        }
    }

    /**
     *  @notice calculate current bond price and remove floor if above
     *  @return price_ uint
     */
    function _bondPrice() internal returns ( uint price_ ) {
        price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;
        } else if ( terms.minimumPrice != 0 ) {
            terms.minimumPrice = 0;
        }
    }

    /**
     *  @notice converts bond price to BCT value
     *  @return price_ uint
     */
    function bondPriceInUSD() public view returns ( uint price_ ) {
        if( isLiquidityBond ) {
            price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 );
        } else {
            price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 );
        }
    }


    /**
     *  @notice calculate current ratio of debt to KLIMA supply
     *  @return debtRatio_ uint
     */
    function debtRatio() public view returns ( uint debtRatio_ ) {
        uint supply = IERC20( KLIMA ).totalSupply();
        debtRatio_ = FixedPoint.fraction(
            currentDebt().mul( 1e9 ),
            supply
        ).decode112with18().div( 1e18 );
    }

    /**
     *  @notice debt ratio in same terms for reserve or liquidity bonds
     *  @return uint
     */
    function standardizedDebtRatio() external view returns ( uint ) {
        if ( isLiquidityBond ) {
            return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 );
        } else {
            return debtRatio();
        }
    }

    /**
     *  @notice calculate debt factoring in decay
     *  @return uint
     */
    function currentDebt() public view returns ( uint ) {
        return totalDebt.sub( debtDecay() );
    }

    /**
     *  @notice amount to decay total debt by
     *  @return decay_ uint
     */
    function debtDecay() public view returns ( uint decay_ ) {
        uint blocksSinceLast = block.number.sub( lastDecay );
        decay_ = totalDebt.mul( blocksSinceLast ).div( terms.vestingTerm );
        if ( decay_ > totalDebt ) {
            decay_ = totalDebt;
        }
    }


    /**
     *  @notice calculate how far into vesting a depositor is
     *  @param _depositor address
     *  @return percentVested_ uint
     */
    function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) {
        Bond memory bond = bondInfo[ _depositor ];
        uint blocksSinceLast = block.number.sub( bond.lastBlock );
        uint vesting = bond.vesting;

        if ( vesting > 0 ) {
            percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting );
        } else {
            percentVested_ = 0;
        }
    }

    /**
     *  @notice calculate amount of KLIMA available for claim by depositor
     *  @param _depositor address
     *  @return pendingPayout_ uint
     */
    function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) {
        uint percentVested = percentVestedFor( _depositor );
        uint payout = bondInfo[ _depositor ].payout;

        if ( percentVested >= 10000 ) {
            pendingPayout_ = payout;
        } else {
            pendingPayout_ = payout.mul( percentVested ).div( 10000 );
        }
    }

    /* ======= AUXILLIARY ======= */

    /**
     *  @notice allow anyone to send lost tokens (excluding principle or KLIMA) to the DAO
     *  @return bool
     */
    function recoverLostToken( address _token ) external returns ( bool ) {
        require( _token != KLIMA );
        require( _token != principle );
        IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) );
        return true;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_KLIMA","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KLIMA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KlimaBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101406040523480156200001257600080fd5b5060405162002c4938038062002c49833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000b557600080fd5b6001600160601b0319606086901b166080526001600160a01b038416620000db57600080fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200010157600080fd5b6001600160601b0319606084901b1660c0526001600160a01b0382166200012757600080fd5b6001600160601b0319606092831b811660e0529181901b909116610120526001600160a01b0316151560f81b6101005250505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c612a1b6200022e60003980610f5852806116e8528061190b525080610f2a52806116b75280611ae652508061155d52806117b15280611858525080610dc052806111c152806113cf52806114b152508061059b5280610f87528061102e52806111f0528061137652806113a052806114805280611717528061181652508061153b52806117d752806119595280611b5b5280611c2b5280611d045280611de95280611efe5250612a1b6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063d4d863ce116100ad578063e0176de81161007c578063e0176de814610571578063e392a26214610579578063e3ed12a014610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063d4d863ce146104f8578063d502562514610526578063d796906014610561578063d7ccfb0b1461056957610211565b806398fabd3a116100f457806398fabd3a1461046e578063b4abccba14610476578063c5332b7c1461049c578063cd1234b3146104a4578063cea55f57146104f057610211565b80637927ebf81461040f578063844b5c7c1461042c5780638dbdbe6d14610434578063904b3ece1461046657610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146103ae57806361d027b3146103b657806371535008146103be578063759076e5146103ff57806377b818951461040757610211565b8063451ee4a11461032557806346f68ee91461035a5780634cf088d914610380578063507930ec1461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b61032d610b6e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037057600080fd5b50356001600160a01b0316610b86565b61021e610c73565b6102606004803603602081101561039e57600080fd5b50356001600160a01b0316610c82565b610282610d14565b61021e610dbe565b610282600480360360e08110156103d457600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610de2565b610260610ed6565b61021e610ef1565b6102606004803603602081101561042557600080fd5b5035610f00565b610260610f26565b6102606004803603606081101561044a57600080fd5b50803590602081013590604001356001600160a01b03166110bf565b6102606116b3565b61021e6117af565b6103116004803603602081101561048c57600080fd5b50356001600160a01b03166117d3565b61021e611909565b6104ca600480360360208110156104ba57600080fd5b50356001600160a01b031661192d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610260611954565b6102826004803603604081101561050e57600080fd5b506001600160a01b0381351690602001351515611a0c565b61052e611acf565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611ae4565b610260611b08565b610260611b47565b610260611be4565b61021e611c29565b610260611c4d565b610260611c53565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806105c983610c82565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c59565b90611cb9565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b81526020600482018190526024820152600080516020612955833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b81526020600482018190526024820152600080516020612955833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c59565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b81526020600482018190526024820152600080516020612955833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576127108110156108575760405162461bcd60e51b81526004018080602001828103825260248152602001806129986024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b600061097361288b565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610c82565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611cfb565b92505050610b58565b8151600090610a6d90612710906106069085611c59565b90506040518060800160405280610a91838660000151611fff90919063ffffffff16565b8152602001610abb610ab0866040015143611fff90919063ffffffff16565b602087015190611fff565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611cfb565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610bd3576040805162461bcd60e51b81526020600482018190526024820152600080516020612955833981519152604482015290519081900360640190fd5b6001600160a01b038116610c185760405162461bcd60e51b81526004018080602001828103825260268152602001806128c66026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610c8c61288b565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610ce2904390611fff565b60208301519091508015610d0757610d008161060684612710611c59565b9350610d0c565b600093505b505050919050565b6001546001600160a01b03163314610d5d5760405162461bcd60e51b81526004018080602001828103825260228152602001806128ec6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610e2f576040805162461bcd60e51b81526020600482018190526024820152600080516020612955833981519152604482015290519081900360640190fd5b60045415610e84576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610eec610ee3611be4565b60105490611fff565b905090565b6003546001600160a01b031681565b6000610b58662386f26fc10000610606610f2185610f1c611b08565b612041565b6121b8565b60007f0000000000000000000000000000000000000000000000000000000000000000156110245761101d60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fe357600080fd5b505afa158015610ff7573d6000803e3d6000fd5b505050506040513d602081101561100d57600080fd5b5051611017611b08565b90611c59565b9050610623565b610eec60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d60208110156110af57600080fd5b505160ff16600a0a611017611b08565b60006001600160a01b03821661110e576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6111166121d0565b6009546010541115611166576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000611170610f26565b9050600061117c6121e4565b9050808510156111bd5760405162461bcd60e51b81526004018080602001828103825260238152602001806129756023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d602081101561127e57600080fd5b50519050600061128d82610f00565b9050629896808110156112d8576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6112e0611b47565b811115611325576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611344612710610606600480015485611c5990919063ffffffff16565b9050600083828401101561136957611366826113608686611fff565b90611fff565b90505b61139e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308d612226565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561143557600080fd5b505af1158015611449573d6000803e3d6000fd5b505050506040513d602081101561145f57600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b1580156114fc57600080fd5b505af1158015611510573d6000803e3d6000fd5b505050506040513d602081101561152657600080fd5b50508115611582576115826001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000084612286565b60105461158f90856122dd565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906115c190866122dd565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f84528190208651815592860151600184015585015160028301559390920151600390920191909155548791611626916122dd565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611664611954565b61166c6121e4565b611674610f26565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a46116a5612337565b509098975050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156117a75761101d633b9aca006106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561177357600080fd5b505afa158015611787573d6000803e3d6000fd5b505050506040513d602081101561179d57600080fd5b5051611017611954565b61101d611954565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561181457600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561185357600080fd5b6119017f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118c457600080fd5b505afa1580156118d8573d6000803e3d6000fd5b505050506040513d60208110156118ee57600080fd5b50516001600160a01b0385169190612286565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119b057600080fd5b505afa1580156119c4573d6000803e3d6000fd5b505050506040513d60208110156119da57600080fd5b50519050611a06670de0b6b3a7640000610606610f21611a00633b9aca00611017610ed6565b85612041565b91505090565b6000546001600160a01b03163314611a59576040805162461bcd60e51b81526020600482018190526024820152600080516020612955833981519152604482015290519081900360640190fd5b6001600160a01b038216611a6c57600080fd5b8015611aa15760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b3362989680610606633b9aca00611b2d611b24611954565b60045490611c59565b906122dd565b600654909150811015610623575060065490565b6000610eec620186a06106066004600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bb257600080fd5b505afa158015611bc6573d6000803e3d6000fd5b505050506040513d6020811015611bdc57600080fd5b505190611c59565b600080611bfc60115443611fff90919063ffffffff16565b600554601054919250611c13916106069084611c59565b9150601054821115611c255760105491505b5090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b60105481565b600082611c6857506000610b58565b82820282848281611c7557fe5b0414611cb25760405162461bcd60e51b81526004018080602001828103825260218152602001806129346021913960400191505060405180910390fd5b9392505050565b6000611cb283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612417565b600082611dab577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d7957600080fd5b505af1158015611d8d573d6000803e3d6000fd5b505050506040513d6020811015611da357600080fd5b50611ff89050565b600354600160a01b900460ff1615611ed2576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611e3457600080fd5b505af1158015611e48573d6000803e3d6000fd5b505050506040513d6020811015611e5e57600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611eb557600080fd5b505af1158015611ec9573d6000803e3d6000fd5b50505050611ff8565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611f4957600080fd5b505af1158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505050506040513d6020811015611ff557600080fd5b50505b5092915050565b6000611cb283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124b9565b6120496128b3565b600082116120885760405162461bcd60e51b815260040180806020018281038252602681526020018061290e6026913960400191505060405180910390fd5b826120a25750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161214957600082607085901b816120ca57fe5b0490506001600160e01b03811115612129576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061215a84600160701b85612513565b90506001600160e01b03811115612129576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b6121db610ee3611be4565b60105543601155565b600061220062989680610606633b9aca00611b2d611b24611954565b6006549091508110156122165750600654610623565b6006541561062357600060065590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122809085906125b3565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526122d89084906125b3565b505050565b600082820183811015611cb2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e5460009161234a91906122dd565b600b549091501580159061235e5750804310155b1561241457600454600a5460ff161561239857600b54600454612380916122dd565b6004819055600c5411612393576000600b555b6123ba565b600b546004546123a791611fff565b6004819055600c54106123ba576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081836124a35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612468578181015183820152602001612450565b50505050905090810190601f1680156124955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124af57fe5b0495945050505050565b6000818484111561250b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612468578181015183820152602001612450565b505050900390565b60008060006125228686612664565b915091506000848061253057fe5b868809905082811115612544576001820391505b808303925084821061259d576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6125a8838387612691565b979650505050505050565b6060612608826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127019092919063ffffffff16565b8051909150156122d85780806020019051602081101561262757600080fd5b50516122d85760405162461bcd60e51b815260040180806020018281038252602a8152602001806129bc602a913960400191505060405180910390fd5b6000808060001984860990508385029250828103915082811015612689576001820391505b509250929050565b600081810382168083816126a157fe5b0492508085816126ad57fe5b0494508081600003816126bc57fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606127108484600085612718565b949350505050565b606061272385612885565b612774576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127b35780518252601f199092019160209182019101612794565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612815576040519150601f19603f3d011682016040523d82523d6000602084013e61281a565b606091505b5091509150811561282e5791506127109050565b80511561283e5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612468578181015183820152602001612450565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220f79214001dad4755e5770e247e4887c37967d376a6ef0655bc0b297996afb1e264736f6c634300070500330000000000000000000000006b4499909fd8947a3bdea5d524fb3697018fc750000000000000000000000000b7225519550ed89c9b36c88d57d6059f698aae97000000000000000000000000e93d6c3563fb3e547f891ef01d8bbd963c0e8436000000000000000000000000693ad12dba5f6e07de86faa21098b691f60a1bea0000000000000000000000007087d55d9cd826de4f0eab4625698ff641bd342a

Deployed ByteCode Sourcemap

22336:17187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23051:34;;;:::i;:::-;;;;-1:-1:-1;;;;;23051:34:0;;;;;;;;;;;;;;38670:400;;;;;;;;;;;;;;;;-1:-1:-1;38670:400:0;-1:-1:-1;;;;;38670:400:0;;:::i;:::-;;;;;;;;;;;;;;;;1749:89;;;:::i;1974:158::-;;;:::i;:::-;;27843:443;;;;;;;;;;;;;;;;-1:-1:-1;27843:443:0;;;;;;;;;;;;;;;;;;;:::i;26933:714::-;;;;;;;;;;;;;;;;-1:-1:-1;26933:714:0;;;;;;;;;:::i;31391:1182::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31391:1182:0;;;;;;;;;;:::i;23583:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;23668:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2140:260;;;;;;;;;;;;;;;;-1:-1:-1;2140:260:0;-1:-1:-1;;;;;2140:260:0;;:::i;23452:22::-;;;:::i;38069:427::-;;;;;;;;;;;;;;;;-1:-1:-1;38069:427:0;-1:-1:-1;;;;;38069:427:0;;:::i;2408:221::-;;;:::i;23121:33::-;;;:::i;26056:643::-;;;;;;;;;;;;;;;;-1:-1:-1;26056:643:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37412:106::-;;;:::i;23505:28::-;;;:::i;35105:161::-;;;;;;;;;;;;;;;;-1:-1:-1;35105:161:0;;:::i;36193:331::-;;;:::i;28956:2285::-;;;;;;;;;;;;;;;;-1:-1:-1;28956:2285:0;;;;;;;;;;;-1:-1:-1;;;;;28956:2285:0;;:::i;37038:275::-;;;:::i;23200:28::-;;;:::i;39250:270::-;;;;;;;;;;;;;;;;-1:-1:-1;39250:270:0;-1:-1:-1;;;;;39250:270:0;;:::i;23371:39::-;;;:::i;23734:42::-;;;;;;;;;;;;;;;;-1:-1:-1;23734:42:0;-1:-1:-1;;;;;23734:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36650:267;;;:::i;28419:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28419:318:0;;;;;;;;;;:::i;23613:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23272:37;;;:::i;35371:253::-;;;:::i;34834:142::-;;;:::i;37620:286::-;;;:::i;22979:30::-;;;:::i;23909:21::-;;;:::i;23827:::-;;;:::i;23051:34::-;;;:::o;38670:400::-;38742:19;38775:18;38796:30;38814:10;38796:16;:30::i;:::-;-1:-1:-1;;;;;38851:22:0;;38837:11;38851:22;;;:8;:22;;;;;:29;38775:51;;-1:-1:-1;38915:5:0;38898:22;;38893:170;;38955:6;38938:23;;38893:170;;;39011:40;39044:5;39011:27;:6;39023:13;39011:10;:27::i;:::-;:31;;:40::i;:::-;38994:57;;38893:170;38670:400;;;;;:::o;1749:89::-;1797:7;1824:6;-1:-1:-1;;;;;1824:6:0;1749:89;;:::o;1974:158::-;1888:6;;-1:-1:-1;;;;;1888:6:0;1898:10;1888:20;1879:67;;;;;-1:-1:-1;;;1879:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1879:67:0;;;;;;;;;;;;;;;2090:1:::1;2074:6:::0;;2057:37:::1;::::0;-1:-1:-1;;;;;2074:6:0;;::::1;::::0;2057:37:::1;::::0;2090:1;;2057:37:::1;2122:1;2105:19:::0;;-1:-1:-1;;;;;;2105:19:0::1;::::0;;1974:158::o;27843:443::-;1888:6;;-1:-1:-1;;;;;1888:6:0;1898:10;1888:20;1879:67;;;;;-1:-1:-1;;;1879:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1879:67:0;;;;;;;;;;;;;;;28027:5:::1;:21:::0;:43:::1;::::0;28064:4:::1;::::0;28027:31:::1;::::0;28054:2:::1;28027:25;:31::i;:43::-;28013:10;:57;;28004:91;;;::::0;;-1:-1:-1;;;28004:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28004:91:0;;;;;;;;;;;;;::::1;;28121:157;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;28254:12:::1;28121:157:::0;;;;;;;28108:10:::1;:170:::0;;-1:-1:-1;;28108:170:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;27843:443::o;26933:714::-;1888:6;;-1:-1:-1;;;;;1888:6:0;1898:10;1888:20;1879:67;;;;;-1:-1:-1;;;1879:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1879:67:0;;;;;;;;;;;;;;;27045:17:::1;27031:10;:31;;;;;;;;;27026:614;;;27104:5;27094:6;:15;;27085:66;;;;-1:-1:-1::0;;;27085:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27166:17:::0;:26;;;27026:614:::1;;;27229:16;27215:10;:30;;;;;;;;;27210:430;;;27287:4;27277:6;:14;;27268:61;;;::::0;;-1:-1:-1;;;27268:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27344:15:::0;:24;;;27210:430:::1;;;27405:13;27391:10;:27;;;;;;;;;27386:254;;;27460:5;27450:6;:15;;27441:58;;;::::0;;-1:-1:-1;;;27441:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27514:9:::0;:18;;;27386:254:::1;;;27569:14;27555:10;:28;;;;;;;;;27550:90;;;27606:13:::0;:22;;;27550:90:::1;26933:714:::0;;:::o;31391:1182::-;31461:4;31479:16;;:::i;:::-;-1:-1:-1;;;;;;31498:22:0;;;;;;:8;:22;;;;;;;;31479:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31552:30;31508:10;31552:16;:30::i;:::-;31531:51;;31677:5;31660:13;:22;31655:911;;-1:-1:-1;;;;;31726:22:0;;;;;;:8;:22;;;;;;;;31719:29;;;;;;;;;;;;;;;;;;;;31814:11;;31788:42;;;;;;;;;;;;;;;;;;;;;;;;;31870:46;31883:10;31895:6;31903:4;:11;;;31870;:46::i;:::-;31863:53;;;;;;31655:911;32049:11;;32035;;32049:45;;32087:5;;32049:32;;32066:13;32049:15;:32::i;:45::-;32035:59;;32179:225;;;;;;;;32207:25;32224:6;32207:4;:11;;;:15;;:25;;;;:::i;:::-;32179:225;;;;32256:54;32274:34;32292:4;:14;;;32274:12;:16;;:34;;;;:::i;:::-;32256:12;;;;;:16;:54::i;:::-;32179:225;;32336:12;32179:225;;;;;;;;32374:14;;;;;32179:225;;;;;-1:-1:-1;;;;;32154:22:0;;-1:-1:-1;32154:22:0;;;:8;:22;;;;;:250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32426:65;;;;;;;;;;;;;;;;;;;;;;;;;32513:41;32526:10;32538:6;32546;32513:11;:41::i;:::-;32506:48;;;;;31391:1182;;;;;:::o;23583:21::-;;;-1:-1:-1;;;23583:21:0;;;;;:::o;23668:24::-;;;;;;;;;;;;;;;;;:::o;2140:260::-;1888:6;;-1:-1:-1;;;;;1888:6:0;1898:10;1888:20;1879:67;;;;;-1:-1:-1;;;1879:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1879:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2242:23:0;::::1;2233:75;;;;-1:-1:-1::0;;;2233:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2341:6;::::0;;2324:36:::1;::::0;-1:-1:-1;;;;;2324:36:0;;::::1;::::0;2341:6;::::1;::::0;2324:36:::1;::::0;::::1;2371:9;:21:::0;;-1:-1:-1;;;;;;2371:21:0::1;-1:-1:-1::0;;;;;2371:21:0;;;::::1;::::0;;;::::1;::::0;;2140:260::o;23452:22::-;;;-1:-1:-1;;;;;23452:22:0;;:::o;38069:427::-;38139:19;38172:16;;:::i;:::-;-1:-1:-1;;;;;;38191:22:0;;;;;;:8;:22;;;;;;;;38172:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38191:22;38247:34;;:12;;:16;:34::i;:::-;38307:12;;;;38224:57;;-1:-1:-1;38337:11:0;;38332:157;;38383:43;38417:7;38383:28;:15;38404:5;38383:19;:28::i;:43::-;38366:60;;38332:157;;;38476:1;38459:18;;38332:157;38069:427;;;;;;:::o;2408:221::-;2492:9;;-1:-1:-1;;;;;2492:9:0;2478:10;:23;2469:71;;;;-1:-1:-1;;;2469:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2581:9;;;2573:6;;2556:36;;-1:-1:-1;;;;;2581:9:0;;;;2573:6;;;;2556:36;;;2612:9;;;2603:18;;-1:-1:-1;;;;;;2603:18:0;-1:-1:-1;;;;;2612:9:0;;;2603:18;;;;;;2408:221::o;23121:33::-;;;:::o;26056:643::-;1888:6;;-1:-1:-1;;;;;1888:6:0;1898:10;1888:20;1879:67;;;;;-1:-1:-1;;;1879:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1879:67:0;;;;;;;;;;;;;;;26321:5:::1;:21:::0;:26;26312:73:::1;;;::::0;;-1:-1:-1;;;26312:73:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26404:217;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;26396:5:::1;:225:::0;;;;;;;;;;;;;;;;;;;;26632:9:::1;:24:::0;26679:12:::1;26667:9;:24:::0;26056:643::o;37412:106::-;37457:4;37482:28;37497:11;:9;:11::i;:::-;37482:9;;;:13;:28::i;:::-;37475:35;;37412:106;:::o;23505:28::-;;;-1:-1:-1;;;;;23505:28:0;;:::o;35105:161::-;35161:4;35186:72;35252:4;35186:60;:42;35207:6;35215:11;:9;:11::i;:::-;35186:19;:42::i;:::-;:58;:60::i;36193:331::-;36241:11;36270:15;36266:251;;;36312:85;36392:3;36312:74;36346:14;-1:-1:-1;;;;;36329:42:0;;36373:9;36329:55;;;;;;;;;;;;;-1:-1:-1;;;;;36329:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36329:55:0;36312:11;:9;:11::i;:::-;:15;;:74::i;:85::-;36303:94;;36266:251;;;36439:66;36500:3;36439:55;36470:9;-1:-1:-1;;;;;36462:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36462:30:0;36456:36;;:2;:36;36439:11;:9;:11::i;28956:2285::-;29076:4;-1:-1:-1;;;;;29103:24:0;;29094:54;;;;;-1:-1:-1;;;29094:54:0;;;;;;;;;;;;-1:-1:-1;;;29094:54:0;;;;;;;;;;;;;;;29161:11;:9;:11::i;:::-;29205:13;;29192:9;;:26;;29183:61;;;;;-1:-1:-1;;;29183:61:0;;;;;;;;;;;;-1:-1:-1;;;29183:61:0;;;;;;;;;;;;;;;29257:15;29275:16;:14;:16::i;:::-;29257:34;;29325:16;29344:12;:10;:12::i;:::-;29325:31;;29391:11;29378:9;:24;;29369:74;;;;-1:-1:-1;;;29369:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29479:10;29503:8;-1:-1:-1;;;;;29492:29:0;;29523:9;29534:7;29492:51;;;;;;;;;;;;;-1:-1:-1;;;;;29492:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29492:51:0;;-1:-1:-1;29554:11:0;29568:18;29492:51;29568:9;:18::i;:::-;29554:32;;29650:8;29640:6;:18;;29631:47;;;;;-1:-1:-1;;;29631:47:0;;;;;;;;;;;;-1:-1:-1;;;29631:47:0;;;;;;;;;;;;;;;29757:11;:9;:11::i;:::-;29747:6;:21;;29738:49;;;;;-1:-1:-1;;;29738:49:0;;;;;;;;;;;;-1:-1:-1;;;29738:49:0;;;;;;;;;;;;;;;29883:8;29894:36;29923:5;29894:23;29906:5;:9;;;29894:6;:10;;:23;;;;:::i;:36::-;29883:47;;29941:11;29987:5;29981:3;29972:6;:12;:20;29968:90;;;30016:30;30041:3;30016:19;:5;30027:6;30016:9;:19::i;:::-;:23;;:30::i;:::-;30007:39;;29968:90;30260:74;-1:-1:-1;;;;;30268:9:0;30260:36;30298:10;30318:4;30325:7;30260:36;:74::i;:::-;30353:9;-1:-1:-1;;;;;30345:27:0;;30383:8;30395:7;30345:59;;;;;;;;;;;;;-1:-1:-1;;;;;30345:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30415:59:0;;;-1:-1:-1;;;30415:59:0;;;;;;;;-1:-1:-1;;;;;30455:9:0;30415:59;;;;;;;;;;;;;;30426:8;30415:29;;;;;;:59;;;;;30345;;30415;;;;;;;;-1:-1:-1;30415:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30492:8:0;;30487:113;;30548:40;-1:-1:-1;;;;;30556:5:0;30548:28;30578:3;30583;30548:28;:40::i;:::-;30660:9;;:22;;30675:5;30660:13;:22::i;:::-;30648:9;:34;30757:182;;;;;;;;-1:-1:-1;;;;;30781:22:0;;-1:-1:-1;30781:22:0;;;:8;:22;;;;;;:29;30757:182;;30781:43;;30816:6;30781:33;:43::i;:::-;30757:182;;30844:17;;;30757:182;;;;;;;;30883:12;30757:182;;;;;;;;;;;;;;-1:-1:-1;;;;;30732:22:0;;-1:-1:-1;30732:22:0;;;:8;:22;;;;;:207;;;;;;;;30844:17;30732:207;;;;;;;;;;;;;;;;;;;;;;;31044:17;30917:10;;31026:37;;:16;:37::i;:::-;30996:81;;;;;;;;31018:6;;30996:81;;;;;;;;;;31143:11;:9;:11::i;:::-;31129:12;:10;:12::i;:::-;31111:16;:14;:16::i;:::-;31093:63;;;;;;;31169:8;:6;:8::i;:::-;-1:-1:-1;31227:6:0;;28956:2285;-1:-1:-1;;;;;;;;28956:2285:0:o;37038:275::-;37095:4;37118:15;37113:193;;;37158:85;37238:3;37158:74;37192:14;-1:-1:-1;;;;;37175:42:0;;37219:9;37175:55;;;;;;;;;;;;;-1:-1:-1;;;;;37175:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37175:55:0;37158:11;:9;:11::i;37113:193::-;37283:11;:9;:11::i;23200:28::-;;;:::o;39250:270::-;39313:4;39350:5;-1:-1:-1;;;;;39340:15:0;:6;-1:-1:-1;;;;;39340:15:0;;;39331:26;;;;;;39387:9;-1:-1:-1;;;;;39377:19:0;:6;-1:-1:-1;;;;;39377:19:0;;;39368:30;;;;;;39409:81;39440:3;39453:6;-1:-1:-1;;;;;39445:26:0;;39481:4;39445:43;;;;;;;;;;;;;-1:-1:-1;;;;;39445:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39445:43:0;-1:-1:-1;;;;;39409:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;39508:4:0;39250:270;;;:::o;23371:39::-;;;:::o;23734:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36650:267::-;36693:15;36722:11;36744:5;-1:-1:-1;;;;;36736:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36736:29:0;;-1:-1:-1;36789:120:0;36903:4;36789:108;:90;36823:24;36842:3;36823:13;:11;:13::i;:24::-;36862:6;36789:19;:90::i;:120::-;36776:133;;36650:267;;:::o;28419:318::-;1888:6;;-1:-1:-1;;;;;1888:6:0;1898:10;1888:20;1879:67;;;;;-1:-1:-1;;;1879:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1879:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28515:22:0;::::1;28506:33;;;::::0;::::1;;28555:7;28550:180;;;28580:9;:16:::0;;-1:-1:-1;;;;;;;28580:16:0;;::::1;;-1:-1:-1::0;;;;;;28611:24:0::1;-1:-1:-1::0;;;;;28611:24:0;::::1;;::::0;;28550:180:::1;;;28668:9;:17:::0;;-1:-1:-1;;;;28668:17:0::1;::::0;;28700:7:::1;:18:::0;;-1:-1:-1;;;;;28700:18:0;::::1;-1:-1:-1::0;;;;;;28700:18:0;;::::1;;::::0;;28419:318;;:::o;23613:18::-;;;;;;;;;;;;;;:::o;23272:37::-;;;:::o;35371:253::-;35414:11;35448:69;35512:3;35448:58;35494:10;35448:40;35475:11;:9;:11::i;:::-;35448:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;35542:18;;35439:78;;-1:-1:-1;35533:27:0;;35528:89;;;-1:-1:-1;35587:18:0;;35371:253;:::o;34834:142::-;34877:4;34902:66;34960:6;34902:52;34937:5;:15;;;34910:5;-1:-1:-1;;;;;34902:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34902:29:0;;:33;:52::i;37620:286::-;37663:11;37688:20;37711:29;37729:9;;37711:12;:16;;:29;;;;:::i;:::-;37798:17;;37760:9;;37688:52;;-1:-1:-1;37760:57:0;;:32;;37688:52;37760:13;:32::i;:57::-;37751:66;;37842:9;;37833:6;:18;37828:71;;;37878:9;;37869:18;;37828:71;37620:286;;:::o;22979:30::-;;;:::o;23909:21::-;;;;:::o;23827:::-;;;;:::o;3195:250::-;3253:7;3277:6;3273:47;;-1:-1:-1;3307:1:0;3300:8;;3273:47;3344:5;;;3348:1;3344;:5;:1;3368:5;;;;;:10;3360:56;;;;-1:-1:-1;;;3360:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3436:1;3195:250;-1:-1:-1;;;3195:250:0:o;3453:132::-;3511:7;3538:39;3542:1;3545;3538:39;;;;;;;;;;;;;;;;;:3;:39::i;32799:696::-;32888:4;32912:6;32906:557;;32978:5;-1:-1:-1;;;;;32970:24:0;;32996:10;33008:7;32970:47;;;;;;;;;;;;;-1:-1:-1;;;;;32970:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32906:557:0;;-1:-1:-1;32906:557:0;;33096:9;;-1:-1:-1;;;33096:9:0;;;;33091:361;;;33182:13;;33157:49;;;-1:-1:-1;;;33157:49:0;;-1:-1:-1;;;;;33182:13:0;;;33157:49;;;;;;;;;;;;33165:5;33157:23;;;;;;:49;;;;;;;;;;;;;;;-1:-1:-1;33157:23:0;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33241:13:0;;33225:60;;;-1:-1:-1;;;33225:60:0;;;;;;;;-1:-1:-1;;;;;33225:60:0;;;;;;;;;33241:13;;;;;33225:37;;:60;;;;;33241:13;;33225:60;;;;;;;33241:13;;33225:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33091:361;;;33351:7;;33326:43;;;-1:-1:-1;;;33326:43:0;;-1:-1:-1;;;;;33351:7:0;;;33326:43;;;;;;;;;;;;33334:5;33326:23;;;;;;:43;;;;;;;;;;;;;;;-1:-1:-1;33326:23:0;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33398:7:0;;33388:48;;;-1:-1:-1;;;33388:48:0;;;;;;;;-1:-1:-1;;;;;33388:48:0;;;;;;;;;33398:7;;;;;33388:25;;:48;;;;;33326:43;;33388:48;;;;;;;33398:7;;33388:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33091:361:0;-1:-1:-1;33480:7:0;32799:696;-1:-1:-1;;32799:696:0:o;2851:136::-;2909:7;2936:43;2940:1;2943;2936:43;;;;;;;;;;;;;;;;;:3;:43::i;20996:719::-;21077:16;;:::i;:::-;21128:1;21114:11;:15;21106:66;;;;-1:-1:-1;;;21106:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21187:14;21183:50;;-1:-1:-1;21210:23:0;;;;;;;;;-1:-1:-1;21210:23:0;;21203:30;;21183:50;21250:24;;;21246:462;;21291:14;21336:11;20422:3;21309:23;;;21336:11;21308:39;;;;;;-1:-1:-1;;;;;;21370:21:0;;;21362:64;;;;;-1:-1:-1;;;21362:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21448:26;;;;;;;;21466:6;-1:-1:-1;;;;;21448:26:0;;;;21441:33;;;;;21246:462;21507:14;21524:45;21540:9;-1:-1:-1;;;21557:11:0;21524:15;:45::i;:::-;21507:62;-1:-1:-1;;;;;;21592:21:0;;;21584:64;;;;;-1:-1:-1;;;21584:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20851:137;20953:7;20964:16;-1:-1:-1;;;;;20948:13:0;;;:32;;20851:137::o;34565:124::-;34618:28;34633:11;:9;:11::i;34618:28::-;34606:9;:40;34669:12;34657:9;:24;34565:124::o;35751:337::-;35792:11;35826:69;35890:3;35826:58;35872:10;35826:40;35853:11;:9;:11::i;35826:69::-;35920:18;;35817:78;;-1:-1:-1;35911:27:0;;35906:175;;;-1:-1:-1;35965:18:0;;35906:175;;;36006:18;;:23;36001:80;;36068:1;36047:18;:22;35751:337;:::o;17533:205::-;17661:68;;;-1:-1:-1;;;;;17661:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17661:68:0;-1:-1:-1;;;17661:68:0;;;17634:96;;17654:5;;17634:19;:96::i;:::-;17533:205;;;;:::o;17348:177::-;17458:58;;;-1:-1:-1;;;;;17458:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17458:58:0;-1:-1:-1;;;17458:58:0;;;17431:86;;17451:5;;17431:19;:86::i;:::-;17348:177;;;:::o;2662:181::-;2720:7;2752:5;;;2776:6;;;;2768:46;;;;;-1:-1:-1;;;2768:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33587:917;33673:17;;33647:20;;33625:19;;33647:45;;:20;:24;:45::i;:::-;33707:15;;33625:67;;-1:-1:-1;33707:20:0;;;;:54;;;33747:14;33731:12;:30;;33707:54;33703:794;;;33794:5;:21;33835:10;:14;;;33830:494;;;33922:15;;33895:5;:21;:44;;:25;:44::i;:::-;33871:5;:68;;;33988:17;;-1:-1:-1;33958:112:0;;34049:1;34031:15;:19;33958:112;33830:494;;;34161:15;;34134:5;:21;:44;;:25;:44::i;:::-;34110:5;:68;;;34227:17;;-1:-1:-1;34197:112:0;;34288:1;34270:15;:19;34197:112;34361:12;34338:20;:35;:20;34429:21;34452:15;;34338:10;34469:14;34393:92;;;;;;;;;;;;;;;;;;;;34469:14;;34393:92;;;;;;;;;;;;;;;;33703:794;;33587:917;:::o;3593:189::-;3679:7;3714:12;3707:5;3699:28;;;;-1:-1:-1;;;3699:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3738:9;3754:1;3750;:5;;;;;;;3593:189;-1:-1:-1;;;;;3593:189:0:o;2995:192::-;3081:7;3117:12;3109:6;;;;3101:29;;;;-1:-1:-1;;;3101:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3153:5:0;;;2995:192::o;19896:347::-;20002:7;20023:9;20034;20047:13;20055:1;20058;20047:7;:13::i;:::-;20022:38;;;;20071:10;20097:1;20084:15;;;;;20094:1;20091;20084:15;20071:28;;20119:1;20114:2;:6;20110:18;;;20127:1;20122:6;;;;20110:18;20144:2;20139:7;;;;20169:1;20165;:5;20157:44;;;;;-1:-1:-1;;;20157:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20219:16;20227:1;20230;20233;20219:7;:16::i;:::-;20212:23;19896:347;-1:-1:-1;;;;;;;19896:347:0:o;18737:420::-;18820:23;18846:69;18874:4;18846:69;;;;;;;;;;;;;;;;;18854:5;-1:-1:-1;;;;;18846:27:0;;;:69;;;;;:::i;:::-;18930:17;;18820:95;;-1:-1:-1;18930:21:0;18926:224;;19072:10;19061:30;;;;;;;;;;;;;;;-1:-1:-1;19061:30:0;19053:85;;;;-1:-1:-1;;;19053:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19188:210;19249:9;;;-1:-1:-1;;19305:1:0;19302;19295:25;19282:38;;19339:1;19335;:5;19331:9;;19360:1;19355:2;:6;19351:10;;19381:1;19376:2;:6;19372:18;;;19389:1;19384:6;;;;19372:18;19188:210;;;;;;:::o;19406:482::-;19512:7;19551:2;;;19547:6;;;19552:1;19547:6;19564:9;;;;;;;19589:4;19584:9;;;;;;;;;19624:4;19616;19615:5;;19614:14;;;;;19673:1;:9;;;19702:5;;;19698:9;;19693:14;19727:5;;;19723:9;;19718:14;19752:5;;;19748:9;;19743:14;19777:5;;;19773:9;;19768:14;19802:5;;;19798:9;;19793:14;19827:5;;;19823:9;;19818:14;19852:5;;;19848:9;;19843:14;;;19614;;19631:1;19614:18;19609:24;;;;19604:29;;;;19875:5;;19406:482;-1:-1:-1;;19406:482:0:o;5296:196::-;5399:12;5431:53;5454:6;5462:4;5468:1;5471:12;5431:22;:53::i;:::-;5424:60;5296:196;-1:-1:-1;;;;5296:196:0:o;6272:979::-;6402:12;6435:18;6446:6;6435:10;:18::i;:::-;6427:60;;;;;-1:-1:-1;;;6427:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6561:12;6575:23;6602:6;-1:-1:-1;;;;;6602:11:0;6622:8;6633:4;6602:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6602:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6560:78;;;;6653:7;6649:595;;;6684:10;-1:-1:-1;6677:17:0;;-1:-1:-1;6677:17:0;6649:595;6798:17;;:21;6794:439;;7061:10;7055:17;7122:15;7109:10;7105:2;7101:19;7094:44;7009:148;7197:20;;-1:-1:-1;;;7197:20:0;;;;;;;;;;;;;;;;;7204:12;;7197:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4467:233;4645:20;4684:8;;;4467:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://f79214001dad4755e5770e247e4887c37967d376a6ef0655bc0b297996afb1e2
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading