Contract 0xE48BC2Ba0F2d2E140382d8B5C8f261a3d35Ed09C 2

 
 
Txn Hash
Method
Block
From
To
Value
0x8a91efd78963b115ac57b66e857c47ff1d9d5d70aac1222864cbea36f2e6911aWithdraw Pawn119457222021-02-28 12:09:41646 days 20 hrs ago0x166c7098c5ef786193d24b62c98b641f9fdbf931 IN  ForTube: PoolPawn0 Ether0.1733839986
0x8ae9275fa2c5eea797ea8d89e99bc5b9ac66e99176e8b12e41032c434936f292Withdraw Pawn119456852021-02-28 12:01:27646 days 20 hrs ago0x166c7098c5ef786193d24b62c98b641f9fdbf931 IN  ForTube: PoolPawn0 Ether0.154234274
0x4bee889e54b567f0a778f38f99afbac4017cc91d7c4a3051b053bf4009105f66Withdraw Pawn116647222021-01-16 6:40:44690 days 2 hrs ago0xd0b802a41e5594465d0b1f397d4a08200eaa9978 IN  ForTube: PoolPawn0 Ether0.0940483647
0x4ab188f287796adde174f6911d5eab03b8abf3151608db525eb4a0f67bb65c14Withdraw Pawn113398382020-11-27 9:40:27739 days 23 hrs ago0xeb4b4f792f62e99ededdf5a9bca1d051e6416f16 IN  ForTube: PoolPawn0 Ether0.0600303930
0x91bbd1a69257b5f05da20f673f58fb71cb7ad7310d9ccfc948aa4197903e456fSupply Pawn113370112020-11-26 23:24:24740 days 9 hrs ago0xeb4b4f792f62e99ededdf5a9bca1d051e6416f16 IN  ForTube: PoolPawn0 Ether0.0084392220
0x48c54f153698bc8c47d8a1b32cf244f9c7880fda0e7ff40bead2b7abc22f463dSupply Pawn112737902020-11-17 6:28:01750 days 2 hrs ago0x3cc24dd521101acfe77bd68106473f48841f0ab4 IN  ForTube: PoolPawn0 Ether0.0105509225
0x6e534a603ba03257a8ce34d83259f5a2f9662b7121d9b2306660cbe11818dd66Withdraw Pawn112272572020-11-10 3:00:45757 days 6 hrs ago0xc679becb71a3bb6337c3b9c05ad706bf2c1c505f IN  ForTube: PoolPawn0 Ether0.0716521734
0x29360167bef8c1998d7dffacbb1d309ff9ae12be6d9430830bfec8ba4942109bBorrow Pawn111702232020-11-01 8:59:54766 days ago0x1e3fd79513d4ea280ae92c5e8000d2a9c382dfb3 IN  ForTube: PoolPawn0 Ether0.0306964916
0x3a3212eeea71fc5a2003178a984774cd7891d41c5d50de009323b5f5c82cb47eSupply Pawn111701522020-11-01 8:45:40766 days 15 mins ago0x1e3fd79513d4ea280ae92c5e8000d2a9c382dfb3 IN  ForTube: PoolPawn0 Ether0.0071746917.00000145
0xc04fee91599635f4205c9c5dc7f3a517cd4f96dfb2c7514403587f1469717fd2Withdraw Pawn111159562020-10-24 1:05:46774 days 7 hrs ago0x55bbc5fd6dfc5a61599f2dd74c7b9a3278eb522a IN  ForTube: PoolPawn0 Ether0.0423668920.2
0xa5e422b18179814a446158bf2ab8ae30cbefcd4fe693217688162e2e66a15b17Withdraw Pawn110726302020-10-17 9:33:15780 days 23 hrs ago0x42542d1f1a465aa3e812ab5d2b0c23a1dd17b20f IN  ForTube: PoolPawn0 Ether0.0587304228
0x2f302d64345f1ea7b7cbac2c6d6d3ee8c94cca248f0a88f47bcf4fc51bf736c7Withdraw Pawn110701392020-10-17 0:17:39781 days 8 hrs ago0xf1fce7e96f8ae43de202a36ba12b3262d73e8732 IN  ForTube: PoolPawn0 Ether0.04088820.5
0xe63fa8b399e1897f7bdd538224f86eb5c930529fab363149460d918e3548dd3bWithdraw Pawn110064122020-10-07 4:16:53791 days 4 hrs ago0x42e0496f3be349b6c748df82ae292bebb956311d IN  ForTube: PoolPawn0 Ether0.0637887632
0x02ad67ffda2d9f8db3f7ba8840f94645af2e8e39c76c0fb36a74b15a5098ae6cWithdraw Pawn110012882020-10-06 9:02:23791 days 23 hrs agoENS Name incrediblez7.eth IN  ForTube: PoolPawn0 Ether0.0942692147
0x61fb9b2230fa18ea8f89fee7cc9ad9456a4514917de622be8c1429d92e766379Withdraw Pawn109435552020-09-27 8:32:03801 days 28 mins ago0x9eae30e662036687e4ce176c7fc49e232c8c229c IN  ForTube: PoolPawn0 Ether0.1030676851
0x33c12b33100fc133883c03c0165b7f7acbb0fde6888fbdcb7ca7d0ce5063a6bdWithdraw Pawn109357862020-09-26 3:15:33802 days 5 hrs ago0x64b4211820614446d514b2a774a9d24051410e79 IN  ForTube: PoolPawn0 Ether0.1050911652
0xefb11c172b39fac227073bc5cb24b6985f87a12ff317c2bc9b5060a5acfe8c05Withdraw Pawn109237832020-09-24 6:50:36804 days 2 hrs ago0x6f4b77bb873fe1962ca766e6dedecb6c03bcb2b3 IN  ForTube: PoolPawn0 Ether0.1096395855
0x3cdd8c4d41ea2203d16466ff8330c0e8e00b8cb12659430a25e214ec53a57db8Withdraw Pawn109197422020-09-23 15:42:09804 days 17 hrs ago0x6f4b77bb873fe1962ca766e6dedecb6c03bcb2b3 IN  ForTube: PoolPawn0 Ether0.0990
0xfd3b73d34ffe6aadc98011ac308c654dbefff16852f7d1c9a691712e392f6210Withdraw Pawn109105202020-09-22 5:50:04806 days 3 hrs ago0xd4af9844c32f45646438cdb6291273632c40e386 IN  ForTube: PoolPawn0 Ether0.1717060886.92187516
0x1ac52c225bca26f29fb14041045753c24c817c96510fa5c8c66b23545b539d85Withdraw Pawn109097242020-09-22 2:55:26806 days 6 hrs ago0x0000002ae956176bc22c499cdaaa656b399b7391 IN  ForTube: PoolPawn0 Ether0.1818740790
0x9ff010416a0ebcceec7085749596d11af1c745a9bdb081e35f0eb0d840573b07Withdraw Pawn108864982020-09-18 13:52:04809 days 19 hrs ago0xb7a6fc901ea7af2b2a25f972958cf92cafb236da IN  ForTube: PoolPawn0 Ether0.41857746212.00000112
0x65f3702026ef63bb07a60f1beb58c650c464b383db67b386c2426a5d9613d7d4Withdraw Pawn108858682020-09-18 11:25:54809 days 21 hrs ago0xd53fb8a50608abfe749c91d67aa53c2502f677e0 IN  ForTube: PoolPawn0 Ether0.39355693194
0x190d0b0d0b4b1cfe60b3790135739274fb9b7cf5d53307f718adfc673fcd4cc2Repay Fast Borro...108858622020-09-18 11:24:37809 days 21 hrs ago0xd53fb8a50608abfe749c91d67aa53c2502f677e0 IN  ForTube: PoolPawn75.598052 Ether0.05778216180
0x085e54ed6492a3e91bdbe5f9e338425b4d953c417fb2eec37a4387d63da1b181Repay Fast Borro...108858112020-09-18 11:14:03809 days 21 hrs ago0xd53fb8a50608abfe749c91d67aa53c2502f677e0 IN  ForTube: PoolPawn103.207552 Ether0.09008217192
0xf705a81d490d1d51d3bff216c82585f594c4ddb950a1a96ea093e090351c454dRepay Fast Borro...108857392020-09-18 10:56:34809 days 22 hrs ago0xd53fb8a50608abfe749c91d67aa53c2502f677e0 IN  ForTube: PoolPawn130.898252 Ether0.0915348200
[ Download CSV Export 

OVERVIEW

Algorithm-driven crypto digital bank, deposit and withdraw anytime, borrow and repay anytime.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8ae9275fa2c5eea797ea8d89e99bc5b9ac66e99176e8b12e41032c434936f292119456852021-02-28 12:01:27646 days 20 hrs ago ForTube: PoolPawn0x166c7098c5ef786193d24b62c98b641f9fdbf9310.25129967 Ether
0x6e534a603ba03257a8ce34d83259f5a2f9662b7121d9b2306660cbe11818dd66112272572020-11-10 3:00:45757 days 6 hrs ago ForTube: PoolPawn0xc679becb71a3bb6337c3b9c05ad706bf2c1c505f2.00767013 Ether
0xc04fee91599635f4205c9c5dc7f3a517cd4f96dfb2c7514403587f1469717fd2111159562020-10-24 1:05:46774 days 7 hrs ago ForTube: PoolPawn0x55bbc5fd6dfc5a61599f2dd74c7b9a3278eb522a0.70320922 Ether
0xa5e422b18179814a446158bf2ab8ae30cbefcd4fe693217688162e2e66a15b17110726302020-10-17 9:33:15780 days 23 hrs ago ForTube: PoolPawn0x42542d1f1a465aa3e812ab5d2b0c23a1dd17b20f0.45207191 Ether
0xd3b78915dd9142576f68cf69b18f8021afbf933a58d9c48c4d1e235a9904235f109927212020-10-05 1:13:08793 days 7 hrs ago ForTube: PoolPawn 0x4f69c9fa29d98859d8866b343dda05b502f255e72.71209683 Ether
0x5d56023a2976dcf2085229492114d464a8b0bdd9f436e71f9e8e1a525f597915109766132020-10-02 12:30:11795 days 20 hrs ago ForTube: PoolPawn 0x7a8d4a81c35f04542cd52fab98204004ca8f65054.61592794 Ether
0xfd3b73d34ffe6aadc98011ac308c654dbefff16852f7d1c9a691712e392f6210109105202020-09-22 5:50:04806 days 3 hrs ago ForTube: PoolPawn0xd4af9844c32f45646438cdb6291273632c40e38645.09333313 Ether
0x9ff010416a0ebcceec7085749596d11af1c745a9bdb081e35f0eb0d840573b07108864982020-09-18 13:52:04809 days 19 hrs ago ForTube: PoolPawn0xb7a6fc901ea7af2b2a25f972958cf92cafb236da120.08393146 Ether
0x085e54ed6492a3e91bdbe5f9e338425b4d953c417fb2eec37a4387d63da1b181108858112020-09-18 11:14:03809 days 21 hrs ago ForTube: PoolPawn0xd53fb8a50608abfe749c91d67aa53c2502f677e075.5987868 Ether
0xf705a81d490d1d51d3bff216c82585f594c4ddb950a1a96ea093e090351c454d108857392020-09-18 10:56:34809 days 22 hrs ago ForTube: PoolPawn0xd53fb8a50608abfe749c91d67aa53c2502f677e0103.20723413 Ether
0x76951c41ae919799188d6ea427adfd9248fcb0929163cea8cd5a59156bee911f108712232020-09-16 5:19:50812 days 3 hrs ago ForTube: PoolPawn0x01af51dcdb46d3cc3559db32e7280b77e995a21991.48853805 Ether
0xa70bc2ce4181707cfa650476a80b8e6dc54c0243ba68d30e5f600986fb6cfea9108607852020-09-14 14:58:20813 days 18 hrs ago ForTube: PoolPawn0xfdbcae2fe3f5dcae72d94cb4c7c11ebc7275b5738.02318266 Ether
0xc4be7bb24520b92178920002ca288317ae79a5c60c6460400010d22f8d0a3b7c108491472020-09-12 19:50:16815 days 13 hrs ago ForTube: PoolPawn0x6eb7ade7f24b2d84a452f7a8f21a812417ca49f320.02861038 Ether
0xb1b7e76086f8dabb91e0af38d6b8b8de791527473516b94e5330dcdc588cf7e7108343572020-09-10 13:47:24817 days 19 hrs ago ForTube: PoolPawn0x01af51dcdb46d3cc3559db32e7280b77e995a21928.88646195 Ether
0x339284e4b18f4fa29ce62266fdb2dfbd2229eab3c9d2ce07d17c71523e23ce77108342802020-09-10 13:30:42817 days 19 hrs ago ForTube: PoolPawn0x250345cfb5e57805382787ebbdb35dff521806b545.05611852 Ether
0xd39c9edcc81dd572a5f781daf0798f678828b8f1d680d0bb31497813997cb107108342762020-09-10 13:30:09817 days 19 hrs ago ForTube: PoolPawn0xa5e71ce224e27887bd36bfcb479954e323e7708e95.12337842 Ether
0x3b517c7b95251009f377ab5f73ad686e09630892e2a61554761760ff0c47083e108312392020-09-10 2:13:58818 days 6 hrs ago ForTube: PoolPawn0x562433892bc80223b354ef26c1a7bfcab8acbb6f7.00002841 Ether
0xff9b05bc524905fbadb73d3429fca3ab83de5543dd2c665444d6401108a5cbe1108282752020-09-09 15:22:29818 days 17 hrs ago ForTube: PoolPawn0x2e5684efbb794c111c25293f28a706d1b5f968345.00651302 Ether
0x2a96607f033e7b7ed26c0209eb946e86b002316b4539c530f2f2ab9556f650ff108267012020-09-09 9:21:41818 days 23 hrs ago ForTube: PoolPawn0x7d88792d84dcb8806814e02dfc7a8abf01e1165795.13682416 Ether
0xa0d488e8f28d9af2fe0bec4b23ac9f42a0eb61b37383469b04d443557a4b114f108263092020-09-09 7:53:16819 days 1 hr ago ForTube: PoolPawn0x7d88792d84dcb8806814e02dfc7a8abf01e116575 Ether
0x5afb82396f413e1aab8ec927d9c0a07ba832a199dd4efe0545a4e78d1433fc63108255072020-09-09 5:01:01819 days 3 hrs ago ForTube: PoolPawn0x59d4f63126bcfa5428fc1f23950da735eee92184200.02856725 Ether
0xbad5bcc5eef65f2eb3273383530a19f7e96760976d1cbc9f5249fc1a6b0041ed108246812020-09-09 1:54:39819 days 7 hrs ago ForTube: PoolPawn0xb7a6fc901ea7af2b2a25f972958cf92cafb236da500.06290784 Ether
0x8d9412dbc14684bac0804b2d0e1a60aee94046170dc48614939bfdf0ab6f643d108235552020-09-08 21:50:46819 days 11 hrs ago ForTube: PoolPawn 0xd2a285099136d16fff5299a39832e373d043344413.01564315 Ether
0x413b50fc11d32548091c1842206e2d0333fa1a9d9854f501aa58dc18465eccf6108235382020-09-08 21:46:27819 days 11 hrs ago ForTube: PoolPawnENS Name oapital.eth0.00008697 Ether
0xa9f2490be4a578399a5d96bfe54a6ec0bfc8e7fd848828c843f909ae71e7985b108235322020-09-08 21:45:12819 days 11 hrs ago ForTube: PoolPawnENS Name oapital.eth201.73700048 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PoolPawn

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-01
*/

/**
 *Submitted for verification at Etherscan.io on 2020-08-01
*/

/*
 * Copyright (c) The Force Protocol Development Team
 * Submitted for verification at Etherscan.io on 2019-09-17
 */

pragma solidity 0.5.13;
// pragma experimental ABIEncoderV2;

contract ReentrancyGuard {
    bool private _notEntered;

    constructor() internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size != 0;
    }
}

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error.
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "uint mul overflow");

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b != 0, "uint div by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "uint sub overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "uint add overflow");

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "uint mod by zero");
        return a % b;
    }
}

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

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

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function totalSupply() external view returns (uint256);

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

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

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

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

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
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 {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        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
        );
        callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.

        require(address(token).isContract());

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success);

        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)));
        }
    }
}

library addressMakePayable {
    function makePayable(address x) internal pure returns (address payable) {
        return address(uint160(x));
    }
}

contract IOracle {
    function get(address token) external view returns (uint256, bool);
}

contract IInterestRateModel {
    function getLoanRate(int256 cash, int256 borrow)
    external
    view
    returns (int256 y);

    function getDepositRate(int256 cash, int256 borrow)
    external
    view
    returns (int256 y);

    function calculateBalance(
        int256 principal,
        int256 lastIndex,
        int256 newIndex
    ) external view returns (int256 y);

    function calculateInterestIndex(
        int256 Index,
        int256 r,
        int256 t
    ) external view returns (int256 y);

    function pert(
        int256 principal,
        int256 r,
        int256 t
    ) external view returns (int256 y);

    function getNewReserve(
        int256 oldReserve,
        int256 cash,
        int256 borrow,
        int256 blockDelta
    ) external view returns (int256 y);
}

contract PoolPawn is ReentrancyGuard {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;
    using addressMakePayable for address;

    uint public constant int_max = 57896044618658097711785492504343953926634992332820282019728792003956564819967;

    address public admin; //the admin address
    address public proposedAdmin; //use pull over push pattern for admin

    // uint256 public constant interestRateDenomitor = 1e18;

    /**
     * @notice Container for borrow balance information
     * @member principal Total balance (with accrued interest), after applying the most recent balance-changing action
     * @member interestIndex Global borrowIndex as of the most recent balance-changing action
     */
    // Balance struct
    struct Balance {
        uint256 principal;
        uint256 interestIndex;
        uint256 totalPnl; //total profit and loss
    }

    struct Market {
        uint256 accrualBlockNumber;
        int256 supplyRate; //存款利率
        int256 demondRate; //借款利率
        IInterestRateModel irm;
        uint256 totalSupply;
        uint256 supplyIndex;
        uint256 totalBorrows;
        uint256 borrowIndex;
        uint256 totalReserves; //系统盈利
        uint256 minPledgeRate; //最小质押率
        uint256 liquidationDiscount; //清算折扣
        uint256 decimals; //币种的最小精度
    }

    // Mappings of users' balance of each token
    mapping(address => mapping(address => Balance))
    public accountSupplySnapshot; //tokenContract->address(usr)->SupplySnapshot
    mapping(address => mapping(address => Balance))
    public accountBorrowSnapshot; //tokenContract->address(usr)->BorrowSnapshot

    struct LiquidateInfo {
        address targetAccount; //被清算账户
        address liquidator; //清算人
        address assetCollatera; //抵押物token地址
        address assetBorrow; //债务token地址
        uint256 liquidateAmount; //清算额度,抵押物
        uint256 targetAmount; //目标额度, 债务
        uint256 timestamp;
    }

    mapping(uint256 => LiquidateInfo) public liquidateInfoMap;
    uint256 public liquidateIndexes;

    function setLiquidateInfoMap(
        address _targetAccount,
        address _liquidator,
        address _assetCollatera,
        address _assetBorrow,
        uint256 x,
        uint256 y
    ) internal {
        LiquidateInfo memory newStruct = LiquidateInfo(
            _targetAccount,
            _liquidator,
            _assetCollatera,
            _assetBorrow,
            x,
            y,
            block.timestamp
        );
        // Update liquidation record
        liquidateInfoMap[liquidateIndexes] = newStruct;
        liquidateIndexes++;
    }

    //user table
    mapping(uint256 => address) public accounts;
    mapping(address => uint256) public indexes;
    uint256 public index = 1;

    // Add new user
    function join(address who) internal {
        if (indexes[who] == 0) {
            accounts[index] = who;
            indexes[who] = index;
            ++index;
        }
    }

    event SupplyPawnLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event WithdrawPawnLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event BorrowPawnLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event RepayFastBorrowLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event LiquidateBorrowPawnLog(
        address usr,
        address tBorrow,
        uint256 endBorrow,
        address liquidator,
        address tCol,
        uint256 endCol
    );
    event WithdrawPawnEquityLog(
        address t,
        uint256 equityAvailableBefore,
        uint256 amount,
        address owner
    );

    mapping(address => Market) public mkts; //tokenAddress->Market
    address[] public collateralTokens; //抵押币种
    IOracle public oracleInstance;

    uint256 public constant initialInterestIndex = 10**18;
    uint256 public constant defaultOriginationFee = 0; // default is zero bps
    uint256 public constant originationFee = 0;
    uint256 public constant ONE_ETH = 1 ether;

    // 增加抵押币种
    function addCollateralMarket(address asset) public onlyAdmin {
        for (uint256 i = 0; i < collateralTokens.length; i++) {
            if (collateralTokens[i] == asset) {
                return;
            }
        }
        collateralTokens.push(asset);
    }

    function getCollateralMarketsLength() external view returns (uint256) {
        return collateralTokens.length;
    }

    function setInterestRateModel(address t, address irm) public onlyAdmin {
        mkts[t].irm = IInterestRateModel(irm);
    }

    function setMinPledgeRate(address t, uint256 minPledgeRate)
    external
    onlyAdmin
    {
        mkts[t].minPledgeRate = minPledgeRate;
    }

    function setLiquidationDiscount(address t, uint256 liquidationDiscount)
    external
    onlyAdmin
    {
        mkts[t].liquidationDiscount = liquidationDiscount;
    }

    function initCollateralMarket(
        address t,
        address irm,
        address oracle,
        uint256 decimals
    ) external onlyAdmin {
        if (address(oracleInstance) == address(0)) {
            setOracle(oracle);
        }
        Market memory m = mkts[t];
        if (address(m.irm) == address(0)) {
            setInterestRateModel(t, irm);
        }

        addCollateralMarket(t);
        if (m.supplyIndex == 0) {
            m.supplyIndex = initialInterestIndex;
        }

        if (m.borrowIndex == 0) {
            m.borrowIndex = initialInterestIndex;
        }

        if (m.decimals == 0) {
            m.decimals = decimals;
        }
        mkts[t] = m;
    }

    constructor() public {
        admin = msg.sender;
    }

    //Starting from Solidity 0.4.0, contracts without a fallback function automatically revert payments, making the code above redundant.
    // function() external payable {
    //   revert("fallback can't be payable");
    // }

    modifier onlyAdmin() {
        require(msg.sender == admin, "only admin can do this!");
        _;
    }

    function proposeNewAdmin(address admin_) external onlyAdmin {
        proposedAdmin = admin_;
    }

    function claimAdministration() external {
        require(msg.sender == proposedAdmin, "Not proposed admin.");
        admin = proposedAdmin;
        proposedAdmin = address(0);
    }

    // Set the initial timestamp of tokens
    function setInitialTimestamp(address token) external onlyAdmin {
        mkts[token].accrualBlockNumber = now;
    }

    function setDecimals(address t, uint256 decimals) external onlyAdmin {
        mkts[t].decimals = decimals;
    }

    function setOracle(address oracle) public onlyAdmin {
        oracleInstance = IOracle(oracle);
    }

    modifier existOracle() {
        require(address(oracleInstance) != address(0), "oracle not set");
        _;
    }

    // Get price of oracle
    function fetchAssetPrice(address asset)
    public
    view
    returns (uint256, bool)
    {
        require(address(oracleInstance) != address(0), "oracle not set");
        return oracleInstance.get(asset);
    }

    function valid_uint(uint r) internal view returns (int256) {
        require(r <= int_max, "uint r is not valid");
        return int256(r);
    }

    // Get the price of assetAmount tokens
    function getPriceForAssetAmount(address asset, uint256 assetAmount)
    public
    view
    returns (uint256)
    {
        require(address(oracleInstance) != address(0), "oracle not set");
        (uint256 price, bool ok) = fetchAssetPrice(asset);
        require(ok && price != 0, "invalid token price");
        return price.mul(assetAmount).div(10**mkts[asset].decimals);
    }

    // Calc the token amount of usdValue
    function getAssetAmountForValue(address t, uint256 usdValue)
    public
    view
    returns (uint256)
    {
        require(address(oracleInstance) != address(0), "oracle not set");
        (uint256 price, bool ok) = fetchAssetPrice(t);
        require(ok && price != 0, "invalid token price");
        return usdValue.mul(10**mkts[t].decimals).div(price);
    }

    // Balance of "t" token of this contract
    function getCash(address t) public view returns (uint256) {
        // address(0) represents for eth
        if (t == address(0)) {
            return address(this).balance;
        }
        IERC20 token = IERC20(t);
        return token.balanceOf(address(this));
    }

    // Balance of "asset" token of the "from" account
    function getBalanceOf(address asset, address from)
    internal
    view
    returns (uint256)
    {
        // address(0) represents for eth
        if (asset == address(0)) {
            return address(from).balance;
        }

        IERC20 token = IERC20(asset);

        return token.balanceOf(from);
    }

    //  totalBorrows / totalSupply
    function loanToDepositRatio(address asset) public view returns (uint256) {
        uint256 loan = mkts[asset].totalBorrows;
        uint256 deposit = mkts[asset].totalSupply;
        // uint256 _1 = 1 ether;

        return loan.mul(ONE_ETH).div(deposit);
    }

    //m:market, a:account
    //i(n,m)=i(n-1,m)*(1+rm*t)
    //return P*(i(n,m)/i(n-1,a))
    // Calc the balance of the "t" token of "acc" account
    function getSupplyBalance(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage supplyBalance = accountSupplySnapshot[t][acc];

        int256 mSupplyIndex = mkts[t].irm.pert(
            int256(mkts[t].supplyIndex),
            mkts[t].supplyRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userSupplyCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(supplyBalance.principal),
                int256(supplyBalance.interestIndex),
                mSupplyIndex
            )
        );
        return userSupplyCurrent;
    }

    // Calc the actual USD value of "t" token of "who" account
    function getSupplyBalanceInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getSupplyBalance(who, t));
    }

    // Calc the profit of "t" token of "acc" account
    function getSupplyPnl(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage supplyBalance = accountSupplySnapshot[t][acc];

        int256 mSupplyIndex = mkts[t].irm.pert(
            int256(mkts[t].supplyIndex),
            mkts[t].supplyRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userSupplyCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(supplyBalance.principal),
                int256(supplyBalance.interestIndex),
                mSupplyIndex
            )
        );

        if (userSupplyCurrent > supplyBalance.principal) {
            return
            supplyBalance.totalPnl.add(
                userSupplyCurrent.sub(supplyBalance.principal)
            );
        } else {
            return supplyBalance.totalPnl;
        }
    }

    // Calc the profit of "t" token of "acc" account in USD value
    function getSupplyPnlInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getSupplyPnl(who, t));
    }

    // Gets USD all token values of supply profit
    function getTotalSupplyPnl(address who)
    public
    view
    returns (uint256 sumPnl)
    {
        uint256 length = collateralTokens.length;

        for (uint256 i = 0; i < length; i++) {
            uint256 pnl = getSupplyPnlInUSD(who, collateralTokens[i]);
            sumPnl = sumPnl.add(pnl);
        }
    }

    //m:market, a:account
    //i(n,m)=i(n-1,m)*(1+rm*t)
    //return P*(i(n,m)/i(n-1,a))
    function getBorrowBalance(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage borrowBalance = accountBorrowSnapshot[t][acc];

        int256 mBorrowIndex = mkts[t].irm.pert(
            int256(mkts[t].borrowIndex),
            mkts[t].demondRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                int256(borrowBalance.interestIndex),
                mBorrowIndex
            )
        );
        return userBorrowCurrent;
    }

    function getBorrowBalanceInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getBorrowBalance(who, t));
    }

    function getBorrowPnl(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage borrowBalance = accountBorrowSnapshot[t][acc];

        int256 mBorrowIndex = mkts[t].irm.pert(
            int256(mkts[t].borrowIndex),
            mkts[t].demondRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                int256(borrowBalance.interestIndex),
                mBorrowIndex
            )
        );

        return
        borrowBalance.totalPnl.add(userBorrowCurrent).sub(
            borrowBalance.principal
        );
    }

    function getBorrowPnlInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getBorrowPnl(who, t));
    }

    // Gets USD all token values of borrow lose
    function getTotalBorrowPnl(address who)
    public
    view
    returns (uint256 sumPnl)
    {
        uint256 length = collateralTokens.length;
        // uint sumPnl = 0;

        for (uint256 i = 0; i < length; i++) {
            uint256 pnl = getBorrowPnlInUSD(who, collateralTokens[i]);
            sumPnl = sumPnl.add(pnl);
        }
        // return sumPnl;
    }

    // BorrowBalance * collateral ratio
    // collateral ratio always great than 1
    function getBorrowBalanceLeverage(address who, address t)
    public
    view
    returns (uint256)
    {
        return
        getBorrowBalanceInUSD(who, t).mul(mkts[t].minPledgeRate).div(
            ONE_ETH
        );
    }

    // Gets USD token values of supply and borrow balances
    function calcAccountTokenValuesInternal(address who, address t)
    public
    view
    returns (uint256, uint256)
    {
        return (getSupplyBalanceInUSD(who, t), getBorrowBalanceInUSD(who, t));
    }

    // Gets USD token values of supply and borrow balances
    function calcAccountTokenValuesLeverageInternal(address who, address t)
    public
    view
    returns (uint256, uint256)
    {
        return (
        getSupplyBalanceInUSD(who, t),
        getBorrowBalanceLeverage(who, t)
        );
    }

    // Gets USD all token values of supply and borrow balances
    function calcAccountAllTokenValuesLeverageInternal(address who)
    public
    view
    returns (uint256 sumSupplies, uint256 sumBorrowLeverage)
    {
        uint256 length = collateralTokens.length;

        for (uint256 i = 0; i < length; i++) {
            (
            uint256 supplyValue,
            uint256 borrowsLeverage
            ) = calcAccountTokenValuesLeverageInternal(
                who,
                collateralTokens[i]
            );
            sumSupplies = sumSupplies.add(supplyValue);
            sumBorrowLeverage = sumBorrowLeverage.add(borrowsLeverage);
        }
    }

    function calcAccountLiquidity(address who)
    public
    view
    returns (uint256, uint256)
    {
        uint256 sumSupplies;
        uint256 sumBorrowsLeverage; //sumBorrows* collateral ratio
        (
        sumSupplies,
        sumBorrowsLeverage
        ) = calcAccountAllTokenValuesLeverageInternal(who);
        if (sumSupplies < sumBorrowsLeverage) {
            return (0, sumBorrowsLeverage.sub(sumSupplies)); //不足
        } else {
            return (sumSupplies.sub(sumBorrowsLeverage), 0); //有余
        }
    }

    struct SupplyIR {
        uint256 startingBalance;
        uint256 newSupplyIndex;
        uint256 userSupplyCurrent;
        uint256 userSupplyUpdated;
        uint256 newTotalSupply;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newBorrowIndex;
    }

    // deposit
    function supplyPawn(address t, uint256 amount)
    external
    payable
    nonReentrant
    {
        uint256 supplyAmount = amount;
        // address(0) represents for eth
        if (t == address(0)) {
            require(amount == msg.value, "Eth value should be equal to amount");
            supplyAmount = msg.value;
        } else {
            require(msg.value == 0, "Eth should not be provided");
        }
        SupplyIR memory tmp;
        Market storage market = mkts[t];
        Balance storage supplyBalance = accountSupplySnapshot[t][msg.sender];

        uint256 lastTimestamp = market.accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // Calc the supplyIndex of supplyBalance
        tmp.newSupplyIndex = uint256(
            market.irm.pert(
                int256(market.supplyIndex),
                market.supplyRate,
                int256(blockDelta)
            )
        );
        tmp.userSupplyCurrent = uint256(
            market.irm.calculateBalance(
                valid_uint(accountSupplySnapshot[t][msg.sender].principal),
                int256(supplyBalance.interestIndex),
                int256(tmp.newSupplyIndex)
            )
        );
        tmp.userSupplyUpdated = tmp.userSupplyCurrent.add(supplyAmount);
        // Update supply of the market
        tmp.newTotalSupply = market.totalSupply.add(tmp.userSupplyUpdated).sub(
            supplyBalance.principal
        );

        tmp.currentCash = getCash(t);
        // address(0) represents for eth
        // We support both ERC20 and ETH.
        // Calc the new Balance of the contract if it's ERC20
        // else(ETH) does nothing because the cash has been added(msg.value) when the contract is called
        tmp.updatedCash = t != address(0)
        ? tmp.currentCash.add(supplyAmount)
        : tmp.currentCash;

        // Update supplyRate and demondRate
        market.supplyRate = market.irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );
        tmp.newBorrowIndex = uint256(
            market.irm.pert(
                int256(market.borrowIndex),
                market.demondRate,
                int256(blockDelta)
            )
        );
        market.demondRate = market.irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );

        market.borrowIndex = tmp.newBorrowIndex;
        market.supplyIndex = tmp.newSupplyIndex;
        market.totalSupply = tmp.newTotalSupply;
        market.accrualBlockNumber = now;
        // mkts[t] = market;
        tmp.startingBalance = supplyBalance.principal;
        supplyBalance.principal = tmp.userSupplyUpdated;
        supplyBalance.interestIndex = tmp.newSupplyIndex;

        // Update total profit of user
        if (tmp.userSupplyCurrent > tmp.startingBalance) {
            supplyBalance.totalPnl = supplyBalance.totalPnl.add(
                tmp.userSupplyCurrent.sub(tmp.startingBalance)
            );
        }

        join(msg.sender);

        safeTransferFrom(
            t,
            msg.sender,
            address(this),
            address(this).makePayable(),
            supplyAmount,
            0
        );

        emit SupplyPawnLog(
            msg.sender,
            t,
            supplyAmount,
            tmp.startingBalance,
            tmp.userSupplyUpdated
        );
    }

    struct WithdrawIR {
        uint256 withdrawAmount;
        uint256 startingBalance;
        uint256 newSupplyIndex;
        uint256 userSupplyCurrent;
        uint256 userSupplyUpdated;
        uint256 newTotalSupply;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newBorrowIndex;
        uint256 accountLiquidity;
        uint256 accountShortfall;
        uint256 usdValueOfWithdrawal;
        uint256 withdrawCapacity;
    }

    // withdraw
    function withdrawPawn(address t, uint256 requestedAmount)
    external
    nonReentrant
    {
        Market storage market = mkts[t];
        Balance storage supplyBalance = accountSupplySnapshot[t][msg.sender];

        WithdrawIR memory tmp;

        uint256 lastTimestamp = mkts[t].accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // Judge if the user has ability to withdraw
        (tmp.accountLiquidity, tmp.accountShortfall) = calcAccountLiquidity(
            msg.sender
        );
        require(
            tmp.accountLiquidity != 0 && tmp.accountShortfall == 0,
            "can't withdraw, shortfall"
        );
        // Update the balance of the user
        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );
        tmp.userSupplyCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(supplyBalance.principal),
                int256(supplyBalance.interestIndex),
                int256(tmp.newSupplyIndex)
            )
        );

        // Get the balance of this contract
        tmp.currentCash = getCash(t);
        // uint(-1) represents the user want to withdraw all of his supplies of the "t" token
        if (requestedAmount == uint256(-1)) {
            // max withdraw amount = min(his account liquidity, his balance)
            tmp.withdrawCapacity = getAssetAmountForValue(
                t,
                tmp.accountLiquidity
            );
            tmp.withdrawAmount = min(
                min(tmp.withdrawCapacity, tmp.userSupplyCurrent),
                tmp.currentCash
            );
            // tmp.withdrawAmount = min(tmp.withdrawAmount, tmp.currentCash);
        } else {
            tmp.withdrawAmount = requestedAmount;
        }

        // Update balance of this contract
        tmp.updatedCash = tmp.currentCash.sub(tmp.withdrawAmount);
        tmp.userSupplyUpdated = tmp.userSupplyCurrent.sub(tmp.withdrawAmount);

        // Get the amount of token to withdraw
        tmp.usdValueOfWithdrawal = getPriceForAssetAmount(
            t,
            tmp.withdrawAmount
        );
        // require account liquidity is enough
        require(
            tmp.usdValueOfWithdrawal <= tmp.accountLiquidity,
            "account is short"
        );

        // Update totalSupply of the market
        tmp.newTotalSupply = market.totalSupply.add(tmp.userSupplyUpdated).sub(
            supplyBalance.principal
        );

        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );

        // Update loan to deposit rate
        market.supplyRate = mkts[t].irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );
        tmp.newBorrowIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].borrowIndex),
                mkts[t].demondRate,
                int256(blockDelta)
            )
        );
        market.demondRate = mkts[t].irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );

        market.accrualBlockNumber = now;
        market.totalSupply = tmp.newTotalSupply;
        market.supplyIndex = tmp.newSupplyIndex;
        market.borrowIndex = tmp.newBorrowIndex;
        // mkts[t] = market;
        tmp.startingBalance = supplyBalance.principal;
        supplyBalance.principal = tmp.userSupplyUpdated;
        supplyBalance.interestIndex = tmp.newSupplyIndex;

        safeTransferFrom(
            t,
            address(this).makePayable(),
            address(this),
            msg.sender,
            tmp.withdrawAmount,
            0
        );

        emit WithdrawPawnLog(
            msg.sender,
            t,
            tmp.withdrawAmount,
            tmp.startingBalance,
            tmp.userSupplyUpdated
        );
    }

    struct PayBorrowIR {
        uint256 newBorrowIndex;
        uint256 userBorrowCurrent;
        uint256 repayAmount;
        uint256 userBorrowUpdated;
        uint256 newTotalBorrows;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newSupplyIndex;
        uint256 startingBalance;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a < b) {
            return a;
        } else {
            return b;
        }
    }

    //`(1 + originationFee) * borrowAmount`
    function calcBorrowAmountWithFee(uint256 borrowAmount)
    public
    pure
    returns (uint256)
    {
        return borrowAmount.mul((ONE_ETH).add(originationFee)).div(ONE_ETH);
    }

    // supply value * min pledge rate
    function getPriceForAssetAmountMulCollatRatio(
        address t,
        uint256 assetAmount
    ) public view returns (uint256) {
        return
        getPriceForAssetAmount(t, assetAmount)
        .mul(mkts[t].minPledgeRate)
        .div(ONE_ETH);
    }

    struct BorrowIR {
        uint256 newBorrowIndex;
        uint256 userBorrowCurrent;
        uint256 borrowAmountWithFee;
        uint256 userBorrowUpdated;
        uint256 newTotalBorrows;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newSupplyIndex;
        uint256 startingBalance;
        uint256 accountLiquidity;
        uint256 accountShortfall;
        uint256 usdValueOfBorrowAmountWithFee;
    }

    // borrow
    function BorrowPawn(address t, uint256 amount) external nonReentrant {
        BorrowIR memory tmp;
        Market storage market = mkts[t];
        Balance storage borrowBalance = accountBorrowSnapshot[t][msg.sender];

        uint256 lastTimestamp = mkts[t].accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // Calc borrow index
        tmp.newBorrowIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].borrowIndex),
                mkts[t].demondRate,
                int256(blockDelta)
            )
        );
        int256 lastIndex = int256(borrowBalance.interestIndex);
        tmp.userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                lastIndex,
                int256(tmp.newBorrowIndex)
            )
        );
        // add borrow fee
        tmp.borrowAmountWithFee = calcBorrowAmountWithFee(amount);

        tmp.userBorrowUpdated = tmp.userBorrowCurrent.add(
            tmp.borrowAmountWithFee
        );
        // Update market borrows
        tmp.newTotalBorrows = market
        .totalBorrows
        .add(tmp.userBorrowUpdated)
        .sub(borrowBalance.principal);

        // calc account liquidity
        (tmp.accountLiquidity, tmp.accountShortfall) = calcAccountLiquidity(
            msg.sender
        );
        require(
            tmp.accountLiquidity != 0 && tmp.accountShortfall == 0,
            "can't borrow, shortfall"
        );

        // require accountLiquitidy is enough
        tmp.usdValueOfBorrowAmountWithFee = getPriceForAssetAmountMulCollatRatio(
            t,
            tmp.borrowAmountWithFee
        );
        require(
            tmp.usdValueOfBorrowAmountWithFee <= tmp.accountLiquidity,
            "can't borrow, without enough value"
        );

        // Update the balance of this contract
        tmp.currentCash = getCash(t);
        tmp.updatedCash = tmp.currentCash.sub(amount);

        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );
        market.supplyRate = mkts[t].irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );
        market.demondRate = mkts[t].irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );

        market.accrualBlockNumber = now;
        market.totalBorrows = tmp.newTotalBorrows;
        market.supplyIndex = tmp.newSupplyIndex;
        market.borrowIndex = tmp.newBorrowIndex;
        // mkts[t] = market;
        tmp.startingBalance = borrowBalance.principal;
        borrowBalance.principal = tmp.userBorrowUpdated;
        borrowBalance.interestIndex = tmp.newBorrowIndex;

        // 更新币种的借币总额
        // borrowBalance.totalPnl = borrowBalance.totalPnl.add(tmp.userBorrowCurrent.sub(tmp.startingBalance));

        safeTransferFrom(
            t,
            address(this).makePayable(),
            address(this),
            msg.sender,
            amount,
            0
        );

        emit BorrowPawnLog(
            msg.sender,
            t,
            amount,
            tmp.startingBalance,
            tmp.userBorrowUpdated
        );
        // return 0;
    }

    // repay
    function repayFastBorrow(address t, uint256 amount)
    external
    payable
    nonReentrant
    {
        PayBorrowIR memory tmp;
        Market storage market = mkts[t];
        Balance storage borrowBalance = accountBorrowSnapshot[t][msg.sender];

        uint256 lastTimestamp = mkts[t].accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // calc the new borrow index
        tmp.newBorrowIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].borrowIndex),
                mkts[t].demondRate,
                int256(blockDelta)
            )
        );

        int256 lastIndex = int256(borrowBalance.interestIndex);
        tmp.userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                lastIndex,
                int256(tmp.newBorrowIndex)
            )
        );

        // uint(-1) represents the user want to repay all of his borrows of "t" token
        if (amount == uint256(-1)) {
            // that is the minimum of (his balance, his borrows)
            tmp.repayAmount = min(
                getBalanceOf(t, msg.sender),
                tmp.userBorrowCurrent
            );
            // address(0) represents for eth
            // if the user want to repay eth, he needs to repay a little more
            // because the exact amount will be calculated in the above
            // the extra eth will be returned in the safeTransferFrom
            if (t == address(0)) {
                require(
                    msg.value > tmp.repayAmount,
                    "Eth value should be larger than repayAmount"
                );
            }
        } else {
            tmp.repayAmount = amount;
            if (t == address(0)) {
                require(
                    msg.value == tmp.repayAmount,
                    "Eth value should be equal to repayAmount"
                );
            }
        }

        // calc the new borrows of user
        tmp.userBorrowUpdated = tmp.userBorrowCurrent.sub(tmp.repayAmount);
        // calc the new borrows of market
        tmp.newTotalBorrows = market
        .totalBorrows
        .add(tmp.userBorrowUpdated)
        .sub(borrowBalance.principal);
        tmp.currentCash = getCash(t);
        // address(0) represents for eth
        // just like the supplyPawn function, eth has been transfered.
        tmp.updatedCash = t != address(0)
        ? tmp.currentCash.add(tmp.repayAmount)
        : tmp.currentCash;

        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );
        // update deposit and loan rate
        market.supplyRate = mkts[t].irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );
        market.demondRate = mkts[t].irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );

        market.accrualBlockNumber = now;
        market.totalBorrows = tmp.newTotalBorrows;
        market.supplyIndex = tmp.newSupplyIndex;
        market.borrowIndex = tmp.newBorrowIndex;
        // mkts[t] = market;
        tmp.startingBalance = borrowBalance.principal;
        borrowBalance.principal = tmp.userBorrowUpdated;
        borrowBalance.interestIndex = tmp.newBorrowIndex;

        safeTransferFrom(
            t,
            msg.sender,
            address(this),
            address(this).makePayable(),
            tmp.repayAmount,
            msg.value
        );

        emit RepayFastBorrowLog(
            msg.sender,
            t,
            tmp.repayAmount,
            tmp.startingBalance,
            tmp.userBorrowUpdated
        );

    }

    // shortfall/(price*(minPledgeRate-liquidationDiscount-1))
    // underwaterAsset is borrowAsset
    function calcDiscountedRepayToEvenAmount(
        address targetAccount,
        address underwaterAsset,
        uint256 underwaterAssetPrice
    ) public view returns (uint256) {
        (, uint256 shortfall) = calcAccountLiquidity(targetAccount);
        uint256 minPledgeRate = mkts[underwaterAsset].minPledgeRate;
        uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount;
        uint256 gap = minPledgeRate.sub(liquidationDiscount).sub(1 ether);
        return
        shortfall.mul(10**mkts[underwaterAsset].decimals).div(
            underwaterAssetPrice.mul(gap).div(ONE_ETH)
        ); //underwater asset amount
    }

    //[supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow)
    //[supplyCurrent * (Oracle price for the collateral)] / [ (1 + liquidationDiscount) * (Oracle price for the borrow) ]
    // amount of underwaterAsset to be repayed by liquidator, calculated by the amount of collateral asset
    function calcDiscountedBorrowDenominatedCollateral(
        address underwaterAsset,
        address collateralAsset,
        uint256 underwaterAssetPrice,
        uint256 collateralPrice,
        uint256 supplyCurrent_TargetCollateralAsset
    ) public view returns (uint256 res) {
        uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount;
        uint256 onePlusLiquidationDiscount = (ONE_ETH).add(liquidationDiscount);
        uint256 supplyCurrentTimesOracleCollateral
        = supplyCurrent_TargetCollateralAsset.mul(collateralPrice);

        res = supplyCurrentTimesOracleCollateral.div(
            onePlusLiquidationDiscount.mul(underwaterAssetPrice).div(ONE_ETH)
        ); //underwaterAsset amout
        res = res.mul(10**mkts[underwaterAsset].decimals);
        res = res.div(10**mkts[collateralAsset].decimals);
    }

    //closeBorrowAmount_TargetUnderwaterAsset * (1+liquidationDiscount) * priceBorrow/priceCollateral
    //underwaterAssetPrice * (1+liquidationDiscount) *closeBorrowAmount_TargetUnderwaterAsset) / collateralPrice
    //underwater is borrow
    // calc the amount of collateral asset bought by underwaterAsset(amount: closeBorrowAmount_TargetUnderwaterAsset)
    function calcAmountSeize(
        address underwaterAsset,
        address collateralAsset,
        uint256 underwaterAssetPrice,
        uint256 collateralPrice,
        uint256 closeBorrowAmount_TargetUnderwaterAsset
    ) public view returns (uint256 res) {
        uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount;
        uint256 onePlusLiquidationDiscount = (ONE_ETH).add(liquidationDiscount);
        res = underwaterAssetPrice.mul(onePlusLiquidationDiscount);
        res = res.mul(closeBorrowAmount_TargetUnderwaterAsset);
        res = res.div(collateralPrice);
        res = res.div(ONE_ETH);
        res = res.mul(10**mkts[collateralAsset].decimals);
        res = res.div(10**mkts[underwaterAsset].decimals);
    }

    struct LiquidateIR {
        // we need these addresses in the struct for use with `emitLiquidationEvent` to avoid `CompilerError: Stack too deep, try removing local variables.`
        address targetAccount;
        address assetBorrow;
        address liquidator;
        address assetCollateral;
        // borrow index and supply index are global to the asset, not specific to the user
        uint256 newBorrowIndex_UnderwaterAsset;
        uint256 newSupplyIndex_UnderwaterAsset;
        uint256 newBorrowIndex_CollateralAsset;
        uint256 newSupplyIndex_CollateralAsset;
        // the target borrow's full balance with accumulated interest
        uint256 currentBorrowBalance_TargetUnderwaterAsset;
        // currentBorrowBalance_TargetUnderwaterAsset minus whatever gets repaid as part of the liquidation
        uint256 updatedBorrowBalance_TargetUnderwaterAsset;
        uint256 newTotalBorrows_ProtocolUnderwaterAsset;
        uint256 startingBorrowBalance_TargetUnderwaterAsset;
        uint256 startingSupplyBalance_TargetCollateralAsset;
        uint256 startingSupplyBalance_LiquidatorCollateralAsset;
        uint256 currentSupplyBalance_TargetCollateralAsset;
        uint256 updatedSupplyBalance_TargetCollateralAsset;
        // If liquidator already has a balance of collateralAsset, we will accumulate
        // interest on it before transferring seized collateral from the borrower.
        uint256 currentSupplyBalance_LiquidatorCollateralAsset;
        // This will be the liquidator's accumulated balance of collateral asset before the liquidation (if any)
        // plus the amount seized from the borrower.
        uint256 updatedSupplyBalance_LiquidatorCollateralAsset;
        uint256 newTotalSupply_ProtocolCollateralAsset;
        uint256 currentCash_ProtocolUnderwaterAsset;
        uint256 updatedCash_ProtocolUnderwaterAsset;
        // cash does not change for collateral asset

        //mkts[t]
        uint256 newSupplyRateMantissa_ProtocolUnderwaterAsset;
        uint256 newBorrowRateMantissa_ProtocolUnderwaterAsset;
        // Why no variables for the interest rates for the collateral asset?
        // We don't need to calculate new rates for the collateral asset since neither cash nor borrows change

        uint256 discountedRepayToEvenAmount;
        //[supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow) (discountedBorrowDenominatedCollateral)
        uint256 discountedBorrowDenominatedCollateral;
        uint256 maxCloseableBorrowAmount_TargetUnderwaterAsset;
        uint256 closeBorrowAmount_TargetUnderwaterAsset;
        uint256 seizeSupplyAmount_TargetCollateralAsset;
        uint256 collateralPrice;
        uint256 underwaterAssetPrice;
    }

    // get the max amount to be liquidated
    function calcMaxLiquidateAmount(
        address targetAccount,
        address assetBorrow,
        address assetCollateral
    ) external view returns (uint256) {
        require(msg.sender != targetAccount, "can't self-liquidate");
        LiquidateIR memory tmp;

        uint256 blockDelta = now - mkts[assetBorrow].accrualBlockNumber;

        Market storage borrowMarket = mkts[assetBorrow];
        Market storage collateralMarket = mkts[assetCollateral];

        Balance storage borrowBalance_TargeUnderwaterAsset
        = accountBorrowSnapshot[assetBorrow][targetAccount];


        Balance storage supplyBalance_TargetCollateralAsset
        = accountSupplySnapshot[assetCollateral][targetAccount];

        tmp.newSupplyIndex_CollateralAsset = uint256(
            collateralMarket.irm.pert(
                int256(collateralMarket.supplyIndex),
                collateralMarket.supplyRate,
                int256(blockDelta)
            )
        );
        tmp.newBorrowIndex_UnderwaterAsset = uint256(
            borrowMarket.irm.pert(
                int256(borrowMarket.borrowIndex),
                borrowMarket.demondRate,
                int256(blockDelta)
            )
        );
        tmp.currentSupplyBalance_TargetCollateralAsset = uint256(
            collateralMarket.irm.calculateBalance(
                valid_uint(supplyBalance_TargetCollateralAsset.principal),
                int256(supplyBalance_TargetCollateralAsset.interestIndex),
                int256(tmp.newSupplyIndex_CollateralAsset)
            )
        );
        tmp.currentBorrowBalance_TargetUnderwaterAsset = uint256(
            borrowMarket.irm.calculateBalance(
                valid_uint(borrowBalance_TargeUnderwaterAsset.principal),
                int256(borrowBalance_TargeUnderwaterAsset.interestIndex),
                int256(tmp.newBorrowIndex_UnderwaterAsset)
            )
        );

        bool ok;
        (tmp.collateralPrice, ok) = fetchAssetPrice(assetCollateral);
        require(ok, "fail to get collateralPrice");

        (tmp.underwaterAssetPrice, ok) = fetchAssetPrice(assetBorrow);
        require(ok, "fail to get underwaterAssetPrice");

        tmp.discountedBorrowDenominatedCollateral = calcDiscountedBorrowDenominatedCollateral(
            assetBorrow,
            assetCollateral,
            tmp.underwaterAssetPrice,
            tmp.collateralPrice,
            tmp.currentSupplyBalance_TargetCollateralAsset
        );
        tmp.discountedRepayToEvenAmount = calcDiscountedRepayToEvenAmount(
            targetAccount,
            assetBorrow,
            tmp.underwaterAssetPrice
        );
        tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min(
            tmp.currentBorrowBalance_TargetUnderwaterAsset,
            tmp.discountedBorrowDenominatedCollateral
        );
        tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min(
            tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset,
            tmp.discountedRepayToEvenAmount
        );

        return tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset;
    }

    // liquidate
    function liquidateBorrowPawn(
        address targetAccount,
        address assetBorrow,
        address assetCollateral,
        uint256 requestedAmountClose
    ) external payable nonReentrant {
        require(msg.sender != targetAccount, "can't self-liquidate");
        LiquidateIR memory tmp;
        // Copy these addresses into the struct for use with `emitLiquidationEvent`
        // We'll use tmp.liquidator inside this function for clarity vs using msg.sender.
        tmp.targetAccount = targetAccount;
        tmp.assetBorrow = assetBorrow;
        tmp.liquidator = msg.sender;
        tmp.assetCollateral = assetCollateral;

        uint256 blockDelta = now - mkts[assetBorrow].accrualBlockNumber;

        Market storage borrowMarket = mkts[assetBorrow];
        Market storage collateralMarket = mkts[assetCollateral];

        // borrower's borrow balance and supply balance
        Balance storage borrowBalance_TargeUnderwaterAsset
        = accountBorrowSnapshot[assetBorrow][targetAccount];

        Balance storage supplyBalance_TargetCollateralAsset
        = accountSupplySnapshot[assetCollateral][targetAccount];

        // Liquidator might already hold some of the collateral asset
        Balance storage supplyBalance_LiquidatorCollateralAsset
        = accountSupplySnapshot[assetCollateral][tmp.liquidator];

        bool ok;
        (tmp.collateralPrice, ok) = fetchAssetPrice(assetCollateral);
        require(ok, "fail to get collateralPrice");

        (tmp.underwaterAssetPrice, ok) = fetchAssetPrice(assetBorrow);
        require(ok, "fail to get underwaterAssetPrice");

        // calc borrower's borrow balance with the newest interest
        tmp.newBorrowIndex_UnderwaterAsset = uint256(
            borrowMarket.irm.pert(
                int256(borrowMarket.borrowIndex),
                borrowMarket.demondRate,
                int256(blockDelta)
            )
        );
        tmp.currentBorrowBalance_TargetUnderwaterAsset = uint256(
            borrowMarket.irm.calculateBalance(
                valid_uint(borrowBalance_TargeUnderwaterAsset.principal),
                int256(borrowBalance_TargeUnderwaterAsset.interestIndex),
                int256(tmp.newBorrowIndex_UnderwaterAsset)
            )
        );

        // calc borrower's supply balance with the newest interest
        tmp.newSupplyIndex_CollateralAsset = uint256(
            collateralMarket.irm.pert(
                int256(collateralMarket.supplyIndex),
                collateralMarket.supplyRate,
                int256(blockDelta)
            )
        );
        tmp.currentSupplyBalance_TargetCollateralAsset = uint256(
            collateralMarket.irm.calculateBalance(
                valid_uint(supplyBalance_TargetCollateralAsset.principal),
                int256(supplyBalance_TargetCollateralAsset.interestIndex),
                int256(tmp.newSupplyIndex_CollateralAsset)
            )
        );

        // calc liquidator's balance of the collateral asset
        tmp.currentSupplyBalance_LiquidatorCollateralAsset = uint256(
            collateralMarket.irm.calculateBalance(
                valid_uint(supplyBalance_LiquidatorCollateralAsset.principal),
                int256(supplyBalance_LiquidatorCollateralAsset.interestIndex),
                int256(tmp.newSupplyIndex_CollateralAsset)
            )
        );

        // update collateral asset of the market
        tmp.newTotalSupply_ProtocolCollateralAsset = collateralMarket
        .totalSupply
        .add(tmp.currentSupplyBalance_TargetCollateralAsset)
        .sub(supplyBalance_TargetCollateralAsset.principal);
        tmp.newTotalSupply_ProtocolCollateralAsset = tmp
        .newTotalSupply_ProtocolCollateralAsset
        .add(tmp.currentSupplyBalance_LiquidatorCollateralAsset)
        .sub(supplyBalance_LiquidatorCollateralAsset.principal);

        // calc the max amount to be liquidated
        tmp.discountedBorrowDenominatedCollateral = calcDiscountedBorrowDenominatedCollateral(
            assetBorrow,
            assetCollateral,
            tmp.underwaterAssetPrice,
            tmp.collateralPrice,
            tmp.currentSupplyBalance_TargetCollateralAsset
        );
        tmp.discountedRepayToEvenAmount = calcDiscountedRepayToEvenAmount(
            targetAccount,
            assetBorrow,
            tmp.underwaterAssetPrice
        );
        tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min(
            min(
                tmp.currentBorrowBalance_TargetUnderwaterAsset,
                tmp.discountedBorrowDenominatedCollateral
            ),
            tmp.discountedRepayToEvenAmount
        );

        // uint(-1) represents the user want to liquidate all
        if (requestedAmountClose == uint256(-1)) {
            tmp.closeBorrowAmount_TargetUnderwaterAsset = tmp
            .maxCloseableBorrowAmount_TargetUnderwaterAsset;
        } else {
            tmp.closeBorrowAmount_TargetUnderwaterAsset = requestedAmountClose;
        }
        require(
            tmp.closeBorrowAmount_TargetUnderwaterAsset <=
            tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset,
            "closeBorrowAmount > maxCloseableBorrowAmount err"
        );
        // address(0) represents for eth
        if (assetBorrow == address(0)) {
            // just the repay method, eth amount be transfered should be a litte more
            require(
                msg.value >= tmp.closeBorrowAmount_TargetUnderwaterAsset,
                "Not enough ETH"
            );
        } else {
            // user needs to have enough balance
            require(
                getBalanceOf(assetBorrow, tmp.liquidator) >=
                tmp.closeBorrowAmount_TargetUnderwaterAsset,
                "insufficient balance"
            );
        }

        // 计算清算人实际清算得到的此质押币数量
        // The amount of collateral asset that liquidator can get
        tmp.seizeSupplyAmount_TargetCollateralAsset = calcAmountSeize(
            assetBorrow,
            assetCollateral,
            tmp.underwaterAssetPrice,
            tmp.collateralPrice,
            tmp.closeBorrowAmount_TargetUnderwaterAsset
        );

        // 被清算人借币余额减少
        // Update borrower's balance
        tmp.updatedBorrowBalance_TargetUnderwaterAsset = tmp
        .currentBorrowBalance_TargetUnderwaterAsset
        .sub(tmp.closeBorrowAmount_TargetUnderwaterAsset);
        // 更新借币市场总量
        // Update borrow market
        tmp.newTotalBorrows_ProtocolUnderwaterAsset = borrowMarket
        .totalBorrows
        .add(tmp.updatedBorrowBalance_TargetUnderwaterAsset)
        .sub(borrowBalance_TargeUnderwaterAsset.principal);

        tmp.currentCash_ProtocolUnderwaterAsset = getCash(assetBorrow);
        // address(0) represents for eth
        // eth has been transfered when called
        tmp.updatedCash_ProtocolUnderwaterAsset = assetBorrow != address(0)
        ? tmp.currentCash_ProtocolUnderwaterAsset.add(
            tmp.closeBorrowAmount_TargetUnderwaterAsset
        )
        : tmp.currentCash_ProtocolUnderwaterAsset;

        tmp.newSupplyIndex_UnderwaterAsset = uint256(
            borrowMarket.irm.pert(
                int256(borrowMarket.supplyIndex),
                borrowMarket.demondRate,
                int256(blockDelta)
            )
        );
        borrowMarket.supplyRate = borrowMarket.irm.getDepositRate(
            int256(tmp.updatedCash_ProtocolUnderwaterAsset),
            int256(tmp.newTotalBorrows_ProtocolUnderwaterAsset)
        );
        borrowMarket.demondRate = borrowMarket.irm.getLoanRate(
            int256(tmp.updatedCash_ProtocolUnderwaterAsset),
            int256(tmp.newTotalBorrows_ProtocolUnderwaterAsset)
        );
        tmp.newBorrowIndex_CollateralAsset = uint256(
            collateralMarket.irm.pert(
                int256(collateralMarket.supplyIndex),
                collateralMarket.demondRate,
                int256(blockDelta)
            )
        );

        // Update the balance of liquidator and borrower
        tmp.updatedSupplyBalance_TargetCollateralAsset = tmp
        .currentSupplyBalance_TargetCollateralAsset
        .sub(tmp.seizeSupplyAmount_TargetCollateralAsset);
        tmp.updatedSupplyBalance_LiquidatorCollateralAsset = tmp
        .currentSupplyBalance_LiquidatorCollateralAsset
        .add(tmp.seizeSupplyAmount_TargetCollateralAsset);

        borrowMarket.accrualBlockNumber = now;
        borrowMarket.totalBorrows = tmp.newTotalBorrows_ProtocolUnderwaterAsset;
        borrowMarket.supplyIndex = tmp.newSupplyIndex_UnderwaterAsset;
        borrowMarket.borrowIndex = tmp.newBorrowIndex_UnderwaterAsset;
        // mkts[assetBorrow] = borrowMarket;
        collateralMarket.accrualBlockNumber = now;
        collateralMarket.totalSupply = tmp
        .newTotalSupply_ProtocolCollateralAsset;
        collateralMarket.supplyIndex = tmp.newSupplyIndex_CollateralAsset;
        collateralMarket.borrowIndex = tmp.newBorrowIndex_CollateralAsset;
        // mkts[assetCollateral] = collateralMarket;
        tmp.startingBorrowBalance_TargetUnderwaterAsset = borrowBalance_TargeUnderwaterAsset
        .principal; // save for use in event
        borrowBalance_TargeUnderwaterAsset.principal = tmp
        .updatedBorrowBalance_TargetUnderwaterAsset;
        borrowBalance_TargeUnderwaterAsset.interestIndex = tmp
        .newBorrowIndex_UnderwaterAsset;

        tmp.startingSupplyBalance_TargetCollateralAsset = supplyBalance_TargetCollateralAsset
        .principal; // save for use in event
        supplyBalance_TargetCollateralAsset.principal = tmp
        .updatedSupplyBalance_TargetCollateralAsset;
        supplyBalance_TargetCollateralAsset.interestIndex = tmp
        .newSupplyIndex_CollateralAsset;

        tmp.startingSupplyBalance_LiquidatorCollateralAsset = supplyBalance_LiquidatorCollateralAsset
        .principal; // save for use in event
        supplyBalance_LiquidatorCollateralAsset.principal = tmp
        .updatedSupplyBalance_LiquidatorCollateralAsset;
        supplyBalance_LiquidatorCollateralAsset.interestIndex = tmp
        .newSupplyIndex_CollateralAsset;

        setLiquidateInfoMap(
            tmp.targetAccount,
            tmp.liquidator,
            tmp.assetCollateral,
            assetBorrow,
            tmp.seizeSupplyAmount_TargetCollateralAsset,
            tmp.closeBorrowAmount_TargetUnderwaterAsset
        );

        safeTransferFrom(
            assetBorrow,
            tmp.liquidator.makePayable(),
            address(this),
            address(this).makePayable(),
            tmp.closeBorrowAmount_TargetUnderwaterAsset,
            msg.value
        );

        emit LiquidateBorrowPawnLog(
            tmp.targetAccount,
            assetBorrow,
            tmp.updatedBorrowBalance_TargetUnderwaterAsset,
            tmp.liquidator,
            tmp.assetCollateral,
            tmp.updatedSupplyBalance_TargetCollateralAsset
        );
    }

    function safeTransferFrom(
        address token,
        address payable owner,
        address spender,
        address payable to,
        uint256 amount,
        uint256 msgValue
    ) internal {
        require(amount != 0, "invalid safeTransferFrom amount");
        if (owner != spender && token != address(0)) {
            // transfer in ERC20
            require(
                IERC20(token).allowance(owner, spender) >= amount,
                "Insufficient allowance"
            );
        }
        if (token != address(0)) {
            require(
                IERC20(token).balanceOf(owner) >= amount,
                "Insufficient balance"
            );
        } else if (owner == spender) {
            // eth, owner == spender represents for transfer out, requires enough balance
            require(owner.balance >= amount, "Insufficient eth balance");
        }

        if (owner != spender) {
            // transfer in
            if (token != address(0)) {
                // transferFrom ERC20
                IERC20(token).safeTransferFrom(owner, to, amount);
            } else if (msgValue != 0 && msgValue > amount) {
                // return the extra eth to user
                owner.transfer(msgValue.sub(amount));
            }
            // eth has been transfered when called using msg.value
        } else {
            // transfer out
            if (token != address(0)) {
                // ERC20
                IERC20(token).safeTransfer(to, amount);
            } else {
                // 参数设置, msgValue 大于0,即还款或清算逻辑,实际还的钱大于需要还的钱,需要返回多余的钱
                // msgValue 等于 0,借钱或取钱逻辑,直接转出 amount 数量的币

                // msgValue greater than 0 represents for repay or liquidate,
                // which means we should give back the extra eth to user
                // msgValue equals to 0 represents for withdraw or borrow
                // just take the wanted money
                if (msgValue != 0 && msgValue > amount) {
                    to.transfer(msgValue.sub(amount));
                } else {
                    to.transfer(amount);
                }
            }
        }
    }

    // admin transfers profit out
    function withdrawPawnEquity(address t, uint256 amount)
    external
    nonReentrant
    onlyAdmin
    {
        uint256 cash = getCash(t);
        uint256 equity = cash.add(mkts[t].totalBorrows).sub(
            mkts[t].totalSupply
        );
        require(equity >= amount, "insufficient equity amount");
        safeTransferFrom(
            t,
            address(this).makePayable(),
            address(this),
            admin.makePayable(),
            amount,
            0
        );
        emit WithdrawPawnEquityLog(t, equity, amount, admin);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"BorrowPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"tBorrow","type":"address"},{"indexed":false,"internalType":"uint256","name":"endBorrow","type":"uint256"},{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"tCol","type":"address"},{"indexed":false,"internalType":"uint256","name":"endCol","type":"uint256"}],"name":"LiquidateBorrowPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"RepayFastBorrowLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"SupplyPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"equityAvailableBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"WithdrawPawnEquityLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"WithdrawPawnLog","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BorrowPawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ONE_ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountBorrowSnapshot","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"},{"internalType":"uint256","name":"totalPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountSupplySnapshot","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"},{"internalType":"uint256","name":"totalPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accounts","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"addCollateralMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calcAccountAllTokenValuesLeverageInternal","outputs":[{"internalType":"uint256","name":"sumSupplies","type":"uint256"},{"internalType":"uint256","name":"sumBorrowLeverage","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calcAccountLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"calcAccountTokenValuesInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"calcAccountTokenValuesLeverageInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"},{"internalType":"uint256","name":"collateralPrice","type":"uint256"},{"internalType":"uint256","name":"closeBorrowAmount_TargetUnderwaterAsset","type":"uint256"}],"name":"calcAmountSeize","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"calcBorrowAmountWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"},{"internalType":"uint256","name":"collateralPrice","type":"uint256"},{"internalType":"uint256","name":"supplyCurrent_TargetCollateralAsset","type":"uint256"}],"name":"calcDiscountedBorrowDenominatedCollateral","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"}],"name":"calcDiscountedRepayToEvenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"address","name":"assetCollateral","type":"address"}],"name":"calcMaxLiquidateAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimAdministration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultOriginationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"fetchAssetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"usdValue","type":"uint256"}],"name":"getAssetAmountForValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalanceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalanceLeverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowPnl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowPnlInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCollateralMarketsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"getPriceForAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"getPriceForAssetAmountMulCollatRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyBalanceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyPnl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyPnlInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalBorrowPnl","outputs":[{"internalType":"uint256","name":"sumPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalSupplyPnl","outputs":[{"internalType":"uint256","name":"sumPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"indexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"initCollateralMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialInterestIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"int_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"address","name":"assetCollateral","type":"address"},{"internalType":"uint256","name":"requestedAmountClose","type":"uint256"}],"name":"liquidateBorrowPawn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"liquidateIndexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidateInfoMap","outputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"assetCollatera","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"loanToDepositRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mkts","outputs":[{"internalType":"uint256","name":"accrualBlockNumber","type":"uint256"},{"internalType":"int256","name":"supplyRate","type":"int256"},{"internalType":"int256","name":"demondRate","type":"int256"},{"internalType":"contract IInterestRateModel","name":"irm","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"supplyIndex","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"internalType":"uint256","name":"totalReserves","type":"uint256"},{"internalType":"uint256","name":"minPledgeRate","type":"uint256"},{"internalType":"uint256","name":"liquidationDiscount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleInstance","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"originationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"proposeNewAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposedAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayFastBorrow","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"setDecimals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setInitialTimestamp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"address","name":"irm","type":"address"}],"name":"setInterestRateModel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"liquidationDiscount","type":"uint256"}],"name":"setLiquidationDiscount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"minPledgeRate","type":"uint256"}],"name":"setMinPledgeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyPawn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"name":"withdrawPawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPawnEquity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600160085534801561001557600080fd5b5060008054600160ff1990911617610100600160a81b0319166101003302178155615f549081906200004790396000f3fe6080604052600436106103975760003560e01c80637701d0bd116101dc578063c5af0bab11610102578063e03368c1116100a0578063f2a40db81161006f578063f2a40db814610f5f578063f673e9ca14610f89578063f851a44014610fcc578063feb59ccf14610fe157610397565b8063e03368c114610ed8578063ea3a4c6014610ed8578063ed1d840d14610eed578063f0f8aff914610f2657610397565b8063d3339024116100dc578063d333902414610da2578063d7d9dba014610db7578063ddec280e14610df2578063de6843c314610e3e57610397565b8063c5af0bab14610d27578063c92fcfb314610d3c578063cb3db56314610d6f57610397565b8063a21accdc1161017a578063b7fc3ada11610149578063b7fc3ada14610c7a578063b8bb5c421461060e578063ba37773114610cb3578063bbde010214610cee57610397565b8063a21accdc14610bc4578063a637674614610bf7578063ad2cb23914610c2a578063b19322a614610c3f57610397565b8063841d0071116101b6578063841d007114610add5780638cd3b02214610b1057806391de89c614610b5f5780639c74acda14610b8b57610397565b80637701d0bd14610a225780637adbf97314610a715780637e67e5ce14610aa457610397565b806335b773cb116102c157806341ed3ad61161025f578063607b463a1161022e578063607b463a1461096c57806365dc4e3a1461099f5780636e04d137146109d25780636e2ede0314610a0d57610397565b806341ed3ad6146108315780634613f1271461087657806353131ab5146108ea5780636012481a1461093357610397565b80633e3ae88a1161029b5780633e3ae88a146107575780634100b9f01461079057806341b41316146107e957806341d6864e1461081c57610397565b806335b773cb146106a65780633c03d33e146106e15780633cb7317b1461071c57610397565b80631b6a935e116103395780632c7769b2116103085780632c7769b21461060e5780632db78d931461062357806332f751ec14610656578063332279b11461066b57610397565b80631b6a935e1461054857806326bc59fa1461057257806327001627146105c65780632986c0e5146105f957610397565b8063118e31b711610375578063118e31b71461043f578063172c48c71461048c57806317585b12146104d25780631925a7511461050d57610397565b80630cffc6761461039c5780630ddeb327146103da578063101828d114610406575b600080fd5b6103d8600480360360808110156103b257600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561101c565b005b6103d8600480360360408110156103f057600080fd5b506001600160a01b038135169060200135611c69565b34801561041257600080fd5b506103d86004803603604081101561042957600080fd5b506001600160a01b038135169060200135612250565b34801561044b57600080fd5b5061047a6004803603604081101561046257600080fd5b506001600160a01b038135811691602001351661281b565b60408051918252519081900360200190f35b34801561049857600080fd5b506104b6600480360360208110156104af57600080fd5b503561298e565b604080516001600160a01b039092168252519081900360200190f35b3480156104de57600080fd5b506103d8600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166129b5565b34801561051957600080fd5b5061047a6004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516612a38565b34801561055457600080fd5b5061047a6004803603602081101561056b57600080fd5b5035612a54565b34801561057e57600080fd5b506105ad6004803603604081101561059557600080fd5b506001600160a01b0381358116916020013516612a96565b6040805192835260208301919091528051918290030190f35b3480156105d257600080fd5b5061047a600480360360208110156105e957600080fd5b50356001600160a01b0316612ab8565b34801561060557600080fd5b5061047a612aff565b34801561061a57600080fd5b5061047a612b05565b34801561062f57600080fd5b5061047a6004803603602081101561064657600080fd5b50356001600160a01b0316612b0a565b34801561066257600080fd5b506104b6612b1c565b34801561067757600080fd5b5061047a6004803603604081101561068e57600080fd5b506001600160a01b0381358116916020013516612b2b565b3480156106b257600080fd5b5061047a600480360360408110156106c957600080fd5b506001600160a01b0381358116916020013516612cba565b3480156106ed57600080fd5b5061047a6004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516612cc6565b34801561072857600080fd5b5061047a6004803603604081101561073f57600080fd5b506001600160a01b0381358116916020013516612e77565b34801561076357600080fd5b506103d86004803603604081101561077a57600080fd5b506001600160a01b038135169060200135612e87565b34801561079c57600080fd5b506107cb600480360360408110156107b357600080fd5b506001600160a01b0381358116916020013516613066565b60408051938452602084019290925282820152519081900360600190f35b3480156107f557600080fd5b506105ad6004803603602081101561080c57600080fd5b50356001600160a01b031661308e565b34801561082857600080fd5b5061047a613108565b34801561083d57600080fd5b5061047a6004803603606081101561085457600080fd5b506001600160a01b038135811691602081013582169160409091013516613113565b34801561088257600080fd5b506108a06004803603602081101561089957600080fd5b503561357f565b604080516001600160a01b039889168152968816602088015294871686860152929095166060850152608084015260a083019390935260c082019290925290519081900360e00190f35b3480156108f657600080fd5b506103d86004803603608081101561090d57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356135ce565b34801561093f57600080fd5b506103d86004803603604081101561095657600080fd5b506001600160a01b0381351690602001356137ef565b34801561097857600080fd5b5061047a6004803603602081101561098f57600080fd5b50356001600160a01b0316613ee6565b3480156109ab57600080fd5b506103d8600480360360208110156109c257600080fd5b50356001600160a01b0316613f79565b3480156109de57600080fd5b5061047a600480360360408110156109f557600080fd5b506001600160a01b0381358116916020013516614068565b348015610a1957600080fd5b5061047a614078565b348015610a2e57600080fd5b5061047a600480360360a0811015610a4557600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561407e565b348015610a7d57600080fd5b506103d860048036036020811015610a9457600080fd5b50356001600160a01b0316614175565b348015610ab057600080fd5b506103d860048036036040811015610ac757600080fd5b506001600160a01b0381351690602001356141e9565b348015610ae957600080fd5b5061047a60048036036020811015610b0057600080fd5b50356001600160a01b031661425a565b348015610b1c57600080fd5b5061047a600480360360a0811015610b3357600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356142bb565b6103d860048036036040811015610b7557600080fd5b506001600160a01b0381351690602001356143a5565b348015610b9757600080fd5b5061047a60048036036040811015610bae57600080fd5b506001600160a01b03813516906020013561495d565b348015610bd057600080fd5b506105ad60048036036020811015610be757600080fd5b50356001600160a01b0316614a50565b348015610c0357600080fd5b506103d860048036036020811015610c1a57600080fd5b50356001600160a01b0316614aae565b348015610c3657600080fd5b506103d8614b22565b348015610c4b57600080fd5b506105ad60048036036040811015610c6257600080fd5b506001600160a01b0381358116916020013516614ba9565b348015610c8657600080fd5b506103d860048036036040811015610c9d57600080fd5b506001600160a01b038135169060200135614bc0565b348015610cbf57600080fd5b5061047a60048036036040811015610cd657600080fd5b506001600160a01b0381358116916020013516614c31565b348015610cfa57600080fd5b506103d860048036036040811015610d1157600080fd5b506001600160a01b038135169060200135614cc1565b348015610d3357600080fd5b506104b6614d33565b348015610d4857600080fd5b506103d860048036036020811015610d5f57600080fd5b50356001600160a01b0316614d42565b348015610d7b57600080fd5b5061047a60048036036020811015610d9257600080fd5b50356001600160a01b0316614db0565b348015610dae57600080fd5b5061047a614e0a565b348015610dc357600080fd5b5061047a60048036036040811015610dda57600080fd5b506001600160a01b0381358116916020013516614e10565b348015610dfe57600080fd5b50610e2560048036036020811015610e1557600080fd5b50356001600160a01b0316614e54565b6040805192835290151560208301528051918290030190f35b348015610e4a57600080fd5b50610e7160048036036020811015610e6157600080fd5b50356001600160a01b0316614f2d565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b348015610ee457600080fd5b5061047a614fa0565b348015610ef957600080fd5b5061047a60048036036040811015610f1057600080fd5b506001600160a01b038135169060200135614fac565b348015610f3257600080fd5b5061047a60048036036040811015610f4957600080fd5b506001600160a01b038135169060200135615093565b348015610f6b57600080fd5b506104b660048036036020811015610f8257600080fd5b50356150cb565b348015610f9557600080fd5b5061047a60048036036060811015610fac57600080fd5b506001600160a01b038135811691602081013590911690604001356150e6565b348015610fd857600080fd5b506104b6615188565b348015610fed57600080fd5b506107cb6004803603604081101561100457600080fd5b506001600160a01b038135811691602001351661519c565b60005460ff16611061576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055336001600160a01b03851614156110c0576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b6110c8615b14565b6001600160a01b03808616808352858216602080850182905233604080870191825288861660608801819052600085815260098552828120805483835284832097835260038752848320898452875284832084845260028089528685209a85528a89528685209585528852955190991682529690945290832042969096039591929091906111558a614e54565b6103808a01919091529050806111b2576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6111bb8b614e54565b6103a08a0191909152905080611218576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b600386015460078701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d60208110156112a957600080fd5b50516080890152600386015484546001600160a01b039091169063e14768ed906112d2906151c8565b86600101548b608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b5051610100890152600385015460058601546001870154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b505160e0890152600385015483546001600160a01b039091169063e14768ed9061140a906151c8565b85600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50516101c0890152600385015482546001600160a01b039091169063e14768ed906114aa906151c8565b84600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161020089015282546101c08901516004870154611556929161154a919063ffffffff61522016565b9063ffffffff61526e16565b610240890181905282546102008a01516115799261154a9163ffffffff61522016565b6102408901526103a08801516103808901516101c08a015161159e928e928e926142bb565b6103008901526103a08801516115b7908d908d906150e6565b6102e08901526101008801516103008901516115e1916115d6916152bf565b896102e001516152bf565b6103208901526000198914156116025761032088015161034089015261160b565b61034088018990525b87610320015188610340015111156116545760405162461bcd60e51b8152600401808060200182810382526030815260200180615ef06030913960400191505060405180910390fd5b6001600160a01b038b166116b2578761034001513410156116ad576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b611710565b8761034001516116c68c8a604001516152d7565b1015611710576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61172c8b8b8a6103a001518b61038001518c610340015161407e565b61036089015261034088015161010089015161174d9163ffffffff61526e16565b6101208901819052845460068801546117709261154a919063ffffffff61522016565b61014089015261177f8b613ee6565b6102608901526001600160a01b038b1661179e578761026001516117b9565b6103408801516102608901516117b99163ffffffff61522016565b610280890152600386015460058701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505160a089015260038601546102808901516101408a01516040805163a1d7796760e01b815260048101939093526024830191909152516001600160a01b039092169163a1d7796791604480820192602092909190829003018186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d60208110156118e357600080fd5b5051600187015560038601546102808901516101408a0151604080516313f17e7360e21b815260048101939093526024830191909152516001600160a01b0390921691634fc5f9cc91604480820192602092909190829003018186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516002808801919091556003860154600587015491870154604080516396e973f560e01b815260048101949094526024840191909152604483018a9052516001600160a01b03909116916396e973f5916064808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b505160c08901526103608801516101c0890151611a329163ffffffff61526e16565b6101e0890152610360880151610200890151611a539163ffffffff61522016565b8861022001818152505042866000018190555087610140015186600601819055508760a0015186600501819055508760800151866007018190555042856000018190555087610240015185600401819055508760e0015185600501819055508760c001518560070181905550836000015488610160018181525050876101200151846000018190555087608001518460010181905550826000015488610180018181525050876101e0015183600001819055508760e0015183600101819055508160000154886101a001818152505087610220015182600001819055508760e001518260010181905550611b61886000015189604001518a606001518e8c61036001518d6103400151615376565b611b918b611b7b8a604001516001600160a01b0316615454565b30611b8581615454565b8c610340015134615457565b7f564b05ce5b1718b3406f5483d56f1b9609a9aab4603bdaeba9c415e0b38b039e88600001518c8a61012001518b604001518c606001518d6101e0015160405180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001965050505050505060405180910390a150506000805460ff1916600117905550505050505050505050565b60005460ff16611cae576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055611cc0615c17565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed90611db7906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015611dff57600080fd5b505afa158015611e13573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b50516020870152600019871415611eab57611e51611e4789336152d7565b87602001516152bf565b60408701526001600160a01b038816611ea65785604001513411611ea65760405162461bcd60e51b815260040180806020018281038252602b815260200180615ec5602b913960400191505060405180910390fd5b611f02565b604086018790526001600160a01b038816611f025785604001513414611f025760405162461bcd60e51b8152600401808060200182810382526028815260200180615e5b6028913960400191505060405180910390fd5b60408601516020870151611f1b9163ffffffff61526e16565b6060870181905284546006870154611f3d9261154a919063ffffffff61522016565b6080870152611f4b88613ee6565b60a08701526001600160a01b038816611f68578560a00151611f81565b604086015160a0870151611f819163ffffffff61522016565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d602081101561202557600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612060906151c8565b61206d89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc9061210d906151c8565b61211a89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556121d48833306121c981615454565b8a6040015134615457565b6040808701516101008801516060808a015184513381526001600160a01b038e1660208201528086019490945290830191909152608082015290517f95536f77ac48f30901e02b7e98147d28fa621a9296283b46afa87ea9f994290d9181900360a00190a150506000805460ff19166001179055505050505050565b60005460ff16612295576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191690556122a7615c63565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed9061239e906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156123e657600080fd5b505afa1580156123fa573d6000803e3d6000fd5b505050506040513d602081101561241057600080fd5b5051602087015261242087612a54565b60408701819052602087015161243b9163ffffffff61522016565b606087018190528454600687015461245d9261154a919063ffffffff61522016565b608087015261246b33614a50565b61014088015261012087018190521580159061248a5750610140860151155b6124db576040805162461bcd60e51b815260206004820152601760248201527f63616e277420626f72726f772c2073686f727466616c6c000000000000000000604482015290519081900360640190fd5b6124e9888760400151615093565b610160870181905261012087015110156125345760405162461bcd60e51b8152600401808060200182810382526022815260200180615ea36022913960400191505060405180910390fd5b61253d88613ee6565b60a08701819052612554908863ffffffff61526e16565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b1580156125ce57600080fd5b505afa1580156125e2573d6000803e3d6000fd5b505050506040513d60208110156125f857600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612633906151c8565b61264089608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561267b57600080fd5b505afa15801561268f573d6000803e3d6000fd5b505050506040513d60208110156126a557600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc906126e0906151c8565b6126ed89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d602081101561275257600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556127a48861279a30615454565b30338b6000615457565b610100860151606080880151604080513381526001600160a01b038d1660208201528082018c905292830193909352608082015290517fccf497a6d8ab6e2d0cd3345e3f91702b378c9ba26a707adc43e47ec8ceccacbd9181900360a00190a150506000805460ff19166001179055505050505050565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b1580156128ac57600080fd5b505afa1580156128c0573d6000803e3d6000fd5b505050506040513d60208110156128d657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed9061290e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d602081101561298057600080fd5b505193505050505b92915050565b600a818154811061299b57fe5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b03163314612a07576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260096020526040902060030180546001600160a01b03191691909216179055565b6000612a4d82612a488585614c31565b614fac565b9392505050565b6000612a8e670de0b6b3a7640000612a82612a75828563ffffffff61522016565b859063ffffffff61583c16565b9063ffffffff61589f16565b90505b919050565b600080612aa38484612a38565b612aad8585614e10565b915091509250929050565b6001600160a01b03811660009081526009602052604081206006810154600490910154612af781612a8284670de0b6b3a764000063ffffffff61583c16565b949350505050565b60085481565b600081565b60076020526000908152604090205481565b6001546001600160a01b031681565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612c1e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612c6657600080fd5b505afa158015612c7a573d6000803e3d6000fd5b505050506040513d6020811015612c9057600080fd5b505183546002850154919250612cb09161154a908463ffffffff61522016565b9695505050505050565b6000612a4d82612a4885855b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b158015612d5657600080fd5b505afa158015612d6a573d6000803e3d6000fd5b505050506040513d6020811015612d8057600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612db8906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612e0057600080fd5b505afa158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b50518354909150811115612e6a578254612e6090612e4f90839063ffffffff61526e16565b60028501549063ffffffff61522016565b9350505050612988565b5050600201549050612988565b6000612a4d82612a48858561281b565b60005460ff16612ecc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169081905561010090046001600160a01b03163314612f27576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6000612f3283613ee6565b6001600160a01b038416600090815260096020526040812060048101546006909101549293509091612f70919061154a90859063ffffffff61522016565b905082811015612fc7576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e742065717569747920616d6f756e74000000000000604482015290519081900360640190fd5b612ff884612fd430615454565b6000543090612ff09061010090046001600160a01b0316615454565b876000615457565b600054604080516001600160a01b03808816825260208201859052818301879052610100909304929092166060830152517ff436439e28c1812ec03906f344bbce09c25881eae35d800d55585265cc9d7c8b9181900360800190a150506000805460ff191660011790555050565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b600a546000908190815b81811015613101576000806130ce87600a85815481106130b457fe5b6000918252602090912001546001600160a01b0316612a96565b90925090506130e3868363ffffffff61522016565b95506130f5858263ffffffff61522016565b94505050600101613098565b5050915091565b6001600160ff1b0381565b6000336001600160a01b038516141561316a576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b613172615b14565b6001600160a01b038085166000818152600960209081526040808320805489871680865283862096865260038086528487208e8a1680895290875285882092885260028752858820908852865295849020958701546005880154600189015486516396e973f560e01b81526004810192909252602482015242939093036044840181905294519498939796919591949316926396e973f5926064808201939291829003018186803b15801561322657600080fd5b505afa15801561323a573d6000803e3d6000fd5b505050506040513d602081101561325057600080fd5b505160e0870152600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201889052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156132be57600080fd5b505afa1580156132d2573d6000803e3d6000fd5b505050506040513d60208110156132e857600080fd5b50516080870152600383015481546001600160a01b039091169063e14768ed90613311906151c8565b83600101548960e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d602081101561338757600080fd5b50516101c0870152600384015482546001600160a01b039091169063e14768ed906133b1906151c8565b846001015489608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156133fd57600080fd5b505afa158015613411573d6000803e3d6000fd5b505050506040513d602081101561342757600080fd5b5051610100870152600061343a89614e54565b610380890191909152905080613497576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6134a08a614e54565b6103a08901919091529050806134fd576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b6135198a8a896103a001518a61038001518b6101c001516142bb565b6103008801526103a0870151613532908c908c906150e6565b6102e088015261010087015161030088015161354e91906152bf565b61032088018190526102e088015161356691906152bf565b6103209097018790525094955050505050509392505050565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b039485169693851695928516949093169290919087565b60005461010090046001600160a01b03163314613620576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b546001600160a01b03166136395761363982614175565b613641615cc4565b506001600160a01b038085166000908152600960208181526040928390208351610180810185528154815260018201549281019290925260028101549382019390935260038301549093166060840181905260048301546080850152600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015290820154610120840152600a820154610140840152600b909101546101608301526136f5576136f585856129b5565b6136fe85613f79565b60a081015161371657670de0b6b3a764000060a08201525b60e081015161372e57670de0b6b3a764000060e08201525b6101608101516137415761016081018290525b6001600160a01b039485166000908152600960208181526040928390208451815590840151600182015591830151600283015560608301516003830180546001600160a01b03191691909816179096556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015195810195909555610140810151600a8601556101600151600b90940193909355505050565b60005460ff16613834576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191681556001600160a01b03831681526009602090815260408083206002835281842033855290925290912061386e615d2e565b6001600160a01b0385166000908152600960205260409020544281900361389433614a50565b6101408501526101208401819052158015906138b35750610140830151155b613904576040805162461bcd60e51b815260206004820152601960248201527f63616e27742077697468647261772c2073686f727466616c6c00000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b15801561397957600080fd5b505afa15801561398d573d6000803e3d6000fd5b505050506040513d60208110156139a357600080fd5b50516040808501919091526001600160a01b03808916600090815260096020529190912060030154855491169063e14768ed906139df906151c8565b866001015486604001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015613a2b57600080fd5b505afa158015613a3f573d6000803e3d6000fd5b505050506040513d6020811015613a5557600080fd5b50516060840152613a6587613ee6565b60c0840152600019861415613aae57613a838784610120015161495d565b61018084018190526060840151613aa791613a9d916152bf565b8460c001516152bf565b8352613ab2565b8583525b825160c0840151613ac89163ffffffff61526e16565b60e084015282516060840151613ae39163ffffffff61526e16565b60808401528251613af5908890614fac565b61016084018190526101208401511015613b49576040805162461bcd60e51b815260206004820152601060248201526f1858d8dbdd5b9d081a5cc81cda1bdc9d60821b604482015290519081900360640190fd5b835460808401516004870154613b6a929161154a919063ffffffff61522016565b60a08401526001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613be457600080fd5b505afa158015613bf8573d6000803e3d6000fd5b505050506040513d6020811015613c0e57600080fd5b50516040808501919091526001600160a01b0380891660009081526009602052919091206003015460e085015191169063a1d7796790613c4d906151c8565b613c5a88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d6020811015613cbf57600080fd5b505160018601556001600160a01b038088166000908152600960209081526040918290206003810154600782015460029092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613d3b57600080fd5b505afa158015613d4f573d6000803e3d6000fd5b505050506040513d6020811015613d6557600080fd5b50516101008401526001600160a01b0380881660009081526009602052604090206003015460e0850151911690634fc5f9cc90613da1906151c8565b613dae88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613de957600080fd5b505afa158015613dfd573d6000803e3d6000fd5b505050506040513d6020811015613e1357600080fd5b5051600286015542855560a08301516004860155604083015160058601819055610100840151600787015584546020850152608084015185556001850155613e6c87613e5e30615454565b303387600001516000615457565b8251602080850151608080870151604080513381526001600160a01b038e169581019590955284810195909552606084019290925282015290517f3a0d99036aff524c10246e725551deede13cd5021ca17c7e974432fa11d0faab9181900360a00190a150506000805460ff191660011790555050505050565b60006001600160a01b038216613efd575047612a91565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015613f4657600080fd5b505afa158015613f5a573d6000803e3d6000fd5b505050506040513d6020811015613f7057600080fd5b50519392505050565b60005461010090046001600160a01b03163314613fcb576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b60005b600a5481101561401857816001600160a01b0316600a8281548110613fef57fe5b6000918252602090912001546001600160a01b031614156140105750614065565b600101613fce565b50600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0383161790555b50565b6000612a4d82612a488585612b2b565b600a5490565b6001600160a01b0385166000908152600960205260408120600a0154816140b3670de0b6b3a76400008363ffffffff61522016565b90506140c5868263ffffffff61583c16565b92506140d7838563ffffffff61583c16565b92506140e9838663ffffffff61589f16565b925061410383670de0b6b3a764000063ffffffff61589f16565b6001600160a01b0388166000908152600960205260409020600b0154909350614136908490600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909350614169908490600a0a63ffffffff61589f16565b98975050505050505050565b60005461010090046001600160a01b031633146141c7576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b0316331461423b576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600b0155565b600a54600090815b818110156142b457600061429785600a848154811061427d57fe5b6000918252602090912001546001600160a01b0316614068565b90506142a9848263ffffffff61522016565b935050600101614262565b5050919050565b6001600160a01b0385166000908152600960205260408120600a0154816142f0670de0b6b3a76400008363ffffffff61522016565b90506000614304858763ffffffff61583c16565b9050614332614325670de0b6b3a7640000612a82858b63ffffffff61583c16565b829063ffffffff61589f16565b6001600160a01b038a166000908152600960205260409020600b0154909450614365908590600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909450614398908590600a0a63ffffffff61589f16565b9998505050505050505050565b60005460ff166143ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055806001600160a01b038316614448573482146144415760405162461bcd60e51b8152600401808060200182810382526023815260200180615e186023913960400191505060405180910390fd5b503461449b565b341561449b576040805162461bcd60e51b815260206004820152601a60248201527f4574682073686f756c64206e6f742062652070726f7669646564000000000000604482015290519081900360640190fd5b6144a3615d96565b6001600160a01b03808516600090815260096020908152604080832060028352818420338552835292819020835460038501546005860154600187015485516396e973f560e01b8152600481019290925260248201524283900360448201819052945196979396929591909316926396e973f59260648083019392829003018186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d602081101561455c57600080fd5b505160208681019190915260038501546001600160a01b038a81166000908152600284526040808220338352909452929092205491169063e14768ed906145a2906151c8565b856001015488602001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156145ee57600080fd5b505afa158015614602573d6000803e3d6000fd5b505050506040513d602081101561461857600080fd5b505160408601819052614631908763ffffffff61522016565b60608601819052835460048601546146539261154a919063ffffffff61522016565b608086015261466188613ee6565b60a08601526001600160a01b03881661467e578460a00151614693565b60a0850151614693908763ffffffff61522016565b60c0860181905260038501546001600160a01b03169063a1d77967906146b8906151c8565b6146c587600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561470057600080fd5b505afa158015614714573d6000803e3d6000fd5b505050506040513d602081101561472a57600080fd5b50516001850155600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201849052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561479857600080fd5b505afa1580156147ac573d6000803e3d6000fd5b505050506040513d60208110156147c257600080fd5b505160e0860152600384015460c08601516001600160a01b0390911690634fc5f9cc906147ee906151c8565b6147fb87600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561483657600080fd5b505afa15801561484a573d6000803e3d6000fd5b505050506040513d602081101561486057600080fd5b5051600285015560e08501516007850155602085015160058501819055608086015160048601554285558354808752606087015185556001850191909155604086015111156148ca57845160408601516148c491612e4f919063ffffffff61526e16565b60028401555b6148d3336158fa565b6148ea8833306148e281615454565b8a6000615457565b8451606080870151604080513381526001600160a01b038d1660208201528082018b905292830193909352608082015290517f143bd853fff4531b869cc4385ac10699088f797a4b6fbdfe28577d7fd3fa3fa29181900360a00190a150506000805460ff19166001179055505050505050565b600b546000906001600160a01b03166149ae576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b6000806149ba85614e54565b915091508080156149ca57508115155b614a11576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a47908390612a82908790600a0a63ffffffff61583c16565b95945050505050565b600080600080614a5f8561308e565b909250905080821015614a8b576000614a7e828463ffffffff61526e16565b9094509250614aa9915050565b614a9b828263ffffffff61526e16565b935060009250614aa9915050565b915091565b60005461010090046001600160a01b03163314614b00576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314614b77576040805162461bcd60e51b81526020600482015260136024820152722737ba10383937b837b9b2b21030b236b4b71760691b604482015290519081900360640190fd5b6001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600080614bb68484612a38565b612aad8585612e77565b60005461010090046001600160a01b03163314614c12576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600a0155565b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b1580156128ac57600080fd5b60005461010090046001600160a01b03163314614d13576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b0390911660009081526009602081905260409091200155565b600b546001600160a01b031681565b60005461010090046001600160a01b03163314614d94576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020429055565b600a54600090815b818110156142b4576000614ded85600a8481548110614dd357fe5b6000918252602090912001546001600160a01b0316612cba565b9050614dff848263ffffffff61522016565b935050600101614db8565b60055481565b6001600160a01b038116600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787612e77565b9063ffffffff61583c16565b600b5460009081906001600160a01b0316614ea7576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b600b54604080516330af0bbf60e21b81526001600160a01b038681166004830152825193169263c2bc2efc92602480840193919291829003018186803b158015614ef057600080fd5b505afa158015614f04573d6000803e3d6000fd5b505050506040513d6040811015614f1a57600080fd5b5080516020909101519092509050915091565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a90046001600160a01b03169080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b670de0b6b3a764000081565b600b546000906001600160a01b0316614ffd576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b60008061500985614e54565b9150915080801561501957508115155b615060576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a4790600a0a612a82848763ffffffff61583c16565b6001600160a01b038216600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787614fac565b6006602052600090815260409020546001600160a01b031681565b6000806150f285614a50565b6001600160a01b0386166000908152600960208190526040822090810154600a909101549294509250615137670de0b6b3a764000061154a858563ffffffff61526e16565b9050614169615158670de0b6b3a7640000612a82898563ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154612a82908790600a0a63ffffffff61583c16565b60005461010090046001600160a01b031681565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60006001600160ff1b0382111561521c576040805162461bcd60e51b81526020600482015260136024820152721d5a5b9d081c881a5cc81b9bdd081d985b1a59606a1b604482015290519081900360640190fd5b5090565b600082820183811015612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e7420616464206f766572666c6f7760781b604482015290519081900360640190fd5b6000828211156152b9576040805162461bcd60e51b815260206004820152601160248201527075696e7420737562206f766572666c6f7760781b604482015290519081900360640190fd5b50900390565b6000818310156152d0575081612988565b5080612988565b60006001600160a01b0383166152f857506001600160a01b03811631612988565b604080516370a0823160e01b81526001600160a01b038481166004830152915185928316916370a08231916024808301926020929190829003018186803b15801561534257600080fd5b505afa158015615356573d6000803e3d6000fd5b505050506040513d602081101561536c57600080fd5b5051949350505050565b61537e615ddb565b506040805160e0810182526001600160a01b0397881681529587166020808801918252958816878301908152948816606088019081526080880194855260a088019384524260c089019081526005805460009081526004998a905294909420985189546001600160a01b0319908116918c16919091178a5592516001808b0180548616928d1692909217909155965160028a0180548516918c1691909117905590516003890180549093169916989098179055915193850193909355915183830155925160069092019190915580549091019055565b90565b816154a9576040805162461bcd60e51b815260206004820152601f60248201527f696e76616c696420736166655472616e7366657246726f6d20616d6f756e7400604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316141580156154d357506001600160a01b03861615155b156155a25760408051636eb1769f60e11b81526001600160a01b03878116600483015286811660248301529151849289169163dd62ed3e916044808301926020929190829003018186803b15801561552a57600080fd5b505afa15801561553e573d6000803e3d6000fd5b505050506040513d602081101561555457600080fd5b505110156155a2576040805162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015290519081900360640190fd5b6001600160a01b038616156156835781866001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561560857600080fd5b505afa15801561561c573d6000803e3d6000fd5b505050506040513d602081101561563257600080fd5b5051101561567e576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6156fc565b836001600160a01b0316856001600160a01b031614156156fc5781856001600160a01b03163110156156fc576040805162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74206574682062616c616e63650000000000000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316146157a3576001600160a01b038616156157445761573f6001600160a01b03871686858563ffffffff61596116565b61579e565b801580159061575257508181115b1561579e576001600160a01b0385166108fc615774838563ffffffff61526e16565b6040518115909202916000818181858888f1935050505015801561579c573d6000803e3d6000fd5b505b615834565b6001600160a01b038616156157cc5761579e6001600160a01b038716848463ffffffff6159c116565b80158015906157da57508181115b156157fc576001600160a01b0383166108fc615774838563ffffffff61526e16565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015615832573d6000803e3d6000fd5b505b505050505050565b60008261584b57506000612988565b8282028284828161585857fe5b0414612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e74206d756c206f766572666c6f7760781b604482015290519081900360640190fd5b6000816158e6576040805162461bcd60e51b815260206004820152601060248201526f75696e7420646976206279207a65726f60801b604482015290519081900360640190fd5b60008284816158f157fe5b04949350505050565b6001600160a01b0381166000908152600760205260409020546140655760088054600090815260066020908152604080832080546001600160a01b0387166001600160a01b0319909116811790915584549084526007909252909120819055600101905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526159bb908590615a18565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a13908490615a18565b505050565b615a2a826001600160a01b0316615b0e565b615a3357600080fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a715780518252601f199092019160209182019101615a52565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ad3576040519150601f19603f3d011682016040523d82523d6000602084013e615ad8565b606091505b509150915081615ae757600080fd5b8051156159bb57808060200190516020811015615b0357600080fd5b50516159bb57600080fd5b3b151590565b604051806103c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe4574682076616c75652073686f756c6420626520657175616c20746f20616d6f756e745265656e7472616e637947756172643a207265656e7472616e742063616c6c004574682076616c75652073686f756c6420626520657175616c20746f207265706179416d6f756e746f6e6c792061646d696e2063616e20646f20746869732100000000000000000063616e277420626f72726f772c20776974686f757420656e6f7567682076616c75654574682076616c75652073686f756c64206265206c6172676572207468616e207265706179416d6f756e74636c6f7365426f72726f77416d6f756e74203e206d6178436c6f736561626c65426f72726f77416d6f756e7420657272a265627a7a7231582092b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c62764736f6c634300050d0032

Deployed ByteCode Sourcemap

10560:57953:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54306:11252;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;54306:11252:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41135:3967;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41135:3967:0;;;;;;;;:::i;37594:3519::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37594:3519:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37594:3519:0;;;;;;;;:::i;23037:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23037:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23037:663:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14736:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14736:33:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14736:33:0;;:::i;:::-;;;;-1:-1:-1;;;;;14736:33:0;;;;;;;;;;;;;;15502:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15502:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15502:127:0;;;;;;;;;;:::i;21156:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21156:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21156:182:0;;;;;;;;;;:::i;36613:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36613:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36613:191:0;;:::i;25949:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25949:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25949:251:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19994:267;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19994:267:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19994:267:0;-1:-1:-1;;;;;19994:267:0;;:::i;13494:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13494:24:0;;;:::i;14889:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14889:49:0;;;:::i;13445:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13445:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13445:42:0;-1:-1:-1;;;;;13445:42:0;;:::i;10879:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10879:28:0;;;:::i;23898:751::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23898:751:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23898:751:0;;;;;;;;;;:::i;22375:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22375:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22375:174:0;;;;;;;;;;:::i;21400:900::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21400:900:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21400:900:0;;;;;;;;;;:::i;23708:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23708:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23708:182:0;;;;;;;;;;:::i;67928:582::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67928:582:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67928:582:0;;;;;;;;:::i;12031:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12031:81:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12031:81:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26272:621;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26272:621:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26272:621:0;-1:-1:-1;;;;;26272:621:0;;:::i;10715:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10715:108:0;;;:::i;51117:3163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51117:3163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51117:3163:0;;;;;;;;;;;;;;;;;;;:::i;12678:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12678:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12678:57:0;;:::i;:::-;;;;-1:-1:-1;;;;;12678:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15977:724;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15977:724:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15977:724:0;;;;;;;;;;;;;;;;;;;;;;:::i;31806:4243::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31806:4243:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31806:4243:0;;;;;;;;:::i;19285:277::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19285:277:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19285:277:0;-1:-1:-1;;;;;19285:277:0;;:::i;15094:273::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15094:273:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15094:273:0;-1:-1:-1;;;;;15094:273:0;;:::i;24657:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24657:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24657:174:0;;;;;;;;;;:::i;15375:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15375:119:0;;;:::i;47476:765::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47476:765:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;47476:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17723:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17723:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17723:103:0;-1:-1:-1;;;;;17723:103:0;;:::i;17600:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17600:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17600:115:0;;;;;;;;:::i;24888:384::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24888:384:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24888:384:0;-1:-1:-1;;;;;24888:384:0;;:::i;46232:872::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46232:872:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;46232:872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27772:3533::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27772:3533:0;;;;;;;;:::i;18859:372::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18859:372:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18859:372:0;;;;;;;;:::i;26901:550::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26901:550:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26901:550:0;-1:-1:-1;;;;;26901:550:0;;:::i;17126:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17126:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17126:101:0;-1:-1:-1;;;;;17126:101:0;;:::i;17235:187::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17235:187:0;;;:::i;25670:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25670:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25670:211:0;;;;;;;;;;:::i;15795:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15795:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15795:174:0;;;;;;;;:::i;20421:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20421:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20421:663:0;;;;;;;;;;:::i;15637:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15637:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15637:150:0;;;;;;;;:::i;14791:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14791:29:0;;;:::i;17474:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17474:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17474:118:0;-1:-1:-1;;;;;17474:118:0;;:::i;22608:328::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22608:328:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22608:328:0;-1:-1:-1;;;;;22608:328:0;;:::i;12742:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12742:31:0;;;:::i;25366:236::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25366:236:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25366:236:0;;;;;;;;;;:::i;17988:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17988:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17988:222:0;-1:-1:-1;;;;;17988:222:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14668:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14668:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14668:38:0;-1:-1:-1;;;;;14668:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14829:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14829:53:0;;;:::i;18419:390::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18419:390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18419:390:0;;;;;;;;:::i;36851:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36851:266:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36851:266:0;;;;;;;;:::i;13395:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13395:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13395:43:0;;:::i;45213:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45213:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45213:663:0;;;;;;;;;;;;;;;;;:::i;10832:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10832:20:0;;;:::i;12165:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12165:81:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12165:81:0;;;;;;;;;;:::i;54306:11252::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;54526:10;-1:-1:-1;;;;;54526:27:0;;;;54518:60;;;;;-1:-1:-1;;;54518:60:0;;;;;;;;;;;;-1:-1:-1;;;54518:60:0;;;;;;;;;;;;;;;54589:22;;:::i;:::-;-1:-1:-1;;;;;54798:33:0;;;;;;54842:29;;;:15;;;;:29;;;54899:10;54882:14;;;;:27;;;54920:37;;;:19;;;:37;;;54798:17;54997;;;:4;:17;;;;;:36;;55138:21;;;;;;55291:34;;;:21;:34;;;;;:49;;;;;;;;55416:38;;;:21;:38;;;;;;:53;;;;;;;;;55620:38;;;;;55659:14;;55620:54;;;;;;;;;;;;54991:3;:42;;;;;55291:49;;55416:53;;55620:54;55733:32;54942:15;55733;:32::i;:::-;55706:19;;;55705:60;;;;;-1:-1:-1;55705:60:0;55776:42;;;;;-1:-1:-1;;;55776:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55864:28;55880:11;55864:15;:28::i;:::-;55832:24;;;55831:61;;;;;-1:-1:-1;55831:61:0;55903:47;;;;;-1:-1:-1;;;55903:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56090:16;;;;56137:24;;;;56181:23;;;;56090:166;;;-1:-1:-1;;;56090:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56090:16:0;;;;:21;;:166;;;;;;;;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;56090:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56090:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56090:166:0;56031:34;;;:236;56349:16;;;;56412:44;;-1:-1:-1;;;;;56349:16:0;;;;:33;;56401:56;;:10;:56::i;:::-;56483:34;:48;;;56558:3;:34;;;56349:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56349:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56349:259:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56349:259:0;56278:46;;;:341;56759:20;;;;56810:28;;;;56759:20;56858:27;;;56759:178;;;-1:-1:-1;;;56759:178:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56759:20:0;;;;:25;;:178;;;;;56349:259;;56759:178;;;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;56759:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56759:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56759:178:0;56700:34;;;:248;57030:20;;;;57097:45;;-1:-1:-1;;;;;57030:20:0;;;;:37;;57086:57;;:10;:57::i;:::-;57169:35;:49;;;57245:3;:34;;;57030:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57030:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57030:265:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57030:265:0;56959:46;;;:347;57456:20;;;;57523:49;;-1:-1:-1;;;;;57456:20:0;;;;:37;;57512:61;;:10;:61::i;:::-;57599:39;:53;;;57679:3;:34;;;57456:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57456:273:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57456:273:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57456:273:0;57381:50;;;:359;57963:45;;57901:46;;;;57848:38;;;;:161;;57963:45;57848:100;;:38;:100;:52;:100;:::i;:::-;:114;:161;:114;:161;:::i;:::-;57803:42;;;:206;;;58198:49;;58132:50;;;;58065:183;;:118;;;:66;:118;:::i;:183::-;58020:42;;;:228;58466:24;;;;58505:19;;;;58539:46;;;;58354:242;;58410:11;;58436:15;;58354:41;:242::i;:::-;58310:41;;;:286;58741:24;;;;58641:135;;58687:13;;58715:11;;58641:31;:135::i;:::-;58607:31;;;:169;58880:46;;;;58945:41;;;;58840:218;;58858:143;;:3;:143::i;:::-;59016:3;:31;;;58840:3;:218::i;:::-;58787:50;;;:271;-1:-1:-1;;59138:35:0;;59134:277;;;59236:64;;;;59190:43;;;:110;59134:277;;;59333:43;;;:66;;;59134:277;59503:3;:50;;;59443:3;:43;;;:110;;59421:208;;;;-1:-1:-1;;;59421:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59686:25:0;;59682:547;;59854:3;:43;;;59841:9;:56;;59815:132;;;;;-1:-1:-1;;;59815:132:0;;;;;;;;;;;;-1:-1:-1;;;59815:132:0;;;;;;;;;;;;;;;59682:547;;;60118:3;:43;;;60056:41;60069:11;60082:3;:14;;;60056:12;:41::i;:::-;:105;;60030:187;;;;;-1:-1:-1;;;60030:187:0;;;;;;;;;;;;-1:-1:-1;;;60030:187:0;;;;;;;;;;;;;;;60421:213;60451:11;60477:15;60507:3;:24;;;60546:3;:19;;;60580:3;:43;;;60421:15;:213::i;:::-;60375:43;;;:259;60848:43;;;;60777:56;;;;:115;;;:70;:115;:::i;:::-;60728:46;;;:164;;;61131:44;;61019:35;;;;:157;;:97;;:35;:97;:49;:97;:::i;:157::-;60973:43;;;:203;61231:20;61239:11;61231:7;:20::i;:::-;61189:39;;;:62;-1:-1:-1;;;;;61394:25:0;;:200;;61555:3;:39;;;61394:200;;;61489:43;;;;61431:39;;;;:112;;;:43;:112;:::i;:::-;61352:39;;;:242;61666:16;;;;61713:24;;;;61757:23;;;;61666:166;;;-1:-1:-1;;;61666:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61666:16:0;;;;:21;;:166;;;;;;;;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;61666:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61666:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61666:166:0;61607:34;;;:236;61880:16;;;;61933:39;;;;61995:43;;;;61880:170;;;-1:-1:-1;;;61880:170:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61880:16:0;;;;:31;;:170;;;;;61666:166;;61880:170;;;;;;;;:16;:170;;;5:2:-1;;;;30:1;27;20:12;5:2;61880:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61880:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61880:170:0;61854:23;;;:196;62087:16;;;;62137:39;;;;62199:43;;;;62087:167;;;-1:-1:-1;;;62087:167:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62087:16:0;;;;:28;;:167;;;;;61880:170;;62087:167;;;;;;;;:16;:167;;;5:2:-1;;;;30:1;27;20:12;5:2;62087:167:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62087:167:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62087:167:0;62061:23;;;;:193;;;;62324:20;;;;62375:28;;;;62423:27;;;;62324:178;;;-1:-1:-1;;;62324:178:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62324:20:0;;;;:25;;:178;;;;;62087:167;;62324:178;;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;62324:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62324:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62324:178:0;62265:34;;;:248;62704:43;;;;62633:56;;;;:115;;;:70;:115;:::i;:::-;62584:46;;;:164;62887:43;;;;62812:60;;;;:119;;;:74;:119;:::i;:::-;62759:3;:50;;:172;;;;;62978:3;62944:12;:31;;:37;;;;63020:3;:43;;;62992:12;:25;;:71;;;;63101:3;:34;;;63074:12;:24;;:61;;;;63173:3;:34;;;63146:12;:24;;:61;;;;63302:3;63264:16;:35;;:41;;;;63347:3;:52;;;63316:16;:28;;:83;;;;63441:3;:34;;;63410:16;:28;;:65;;;;63517:3;:34;;;63486:16;:28;;:65;;;;63666:34;:54;;;63616:3;:47;;:104;;;;;63803:3;:56;;;63756:34;:44;;:103;;;;63921:3;:44;;;63870:34;:48;;:95;;;;64028:35;:55;;;63978:3;:47;;:105;;;;;64167:3;:56;;;64119:35;:45;;:104;;;;64286:3;:44;;;64234:35;:49;;:96;;;;64397:39;:59;;;64343:3;:51;;:113;;;;;64544:3;:60;;;64492:39;:49;;:112;;;;64671:3;:44;;;64615:39;:53;;:100;;;;64728:267;64762:3;:17;;;64794:3;:14;;;64823:3;:19;;;64857:11;64883:3;:43;;;64941:3;:43;;;64728:19;:267::i;:::-;65008:248;65039:11;65065:28;:3;:14;;;-1:-1:-1;;;;;65065:26:0;;:28::i;:::-;65116:4;65136:27;65116:4;65136:25;:27::i;:::-;65178:3;:43;;;65236:9;65008:16;:248::i;:::-;65274:276;65311:3;:17;;;65343:11;65369:3;:46;;;65430:3;:14;;;65459:3;:19;;;65493:3;:46;;;65274:276;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;;;;;54306:11252:0:o;41135:3967::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;41248:22;;:::i;:::-;-1:-1:-1;;;;;41305:7:0;;;41281:21;41305:7;;;:4;:7;;;;;;;;41355:21;:24;;;;;;41380:10;41355:36;;;;;;;41428:7;;;;;;;:26;;41599:11;;;;41641:19;;;;41680:18;;;;41599:151;;-1:-1:-1;;;41599:151:0;;;;;;;;;;;;;41486:3;:19;;;41599:151;;;;;;;;41305:7;;41486:19;;41599:11;;;;;:16;;:151;;;;;;;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;41599:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41599:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41599:151:0;41556:205;;41800:27;;;;-1:-1:-1;;;;;41885:7:0;;;41556:18;41885:7;;;:4;41599:151;41885:7;;;;:11;;;41943:23;;41885:11;;;:28;;41932:35;;:10;:35::i;:::-;41986:9;42021:3;:18;;;41885:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41885:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41885:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41885:170:0;;41839:21;;:227;-1:-1:-1;;42170:21:0;;42166:994;;;42292:104;42314:27;42327:1;42330:10;42314:12;:27::i;:::-;42360:3;:21;;;42292:3;:104::i;:::-;42274:15;;;:122;-1:-1:-1;;;;;42684:15:0;;42680:200;;42762:3;:15;;;42750:9;:27;42720:144;;;;-1:-1:-1;;;42720:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42166:994;;;42912:15;;;:24;;;-1:-1:-1;;;;;42955:15:0;;42951:198;;43034:3;:15;;;43021:9;:28;42991:142;;;;-1:-1:-1;;;42991:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43263:15;;;;43237:21;;;;:42;;;:25;:42;:::i;:::-;43213:21;;;:66;;;43436:23;;43355:29;;;;:105;;:66;;:29;:66;:43;:66;:::i;:105::-;43333:19;;;:127;43489:10;43497:1;43489:7;:10::i;:::-;43471:15;;;:28;-1:-1:-1;;;;;43642:15:0;;:90;;43717:3;:15;;;43642:90;;;43689:15;;;;43669;;;;:36;;;:19;:36;:::i;:::-;43624:15;;;:108;-1:-1:-1;;;;;43788:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;43830:19;;;;43788:11;43869:18;;;;43788:151;;-1:-1:-1;;;43788:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;43788:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43788:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43788:151:0;43745:18;;;:205;-1:-1:-1;;;;;44022:7:0;;;;;;;:4;43788:151;44022:7;;;;:11;;;44074:15;;;;44022:11;;;:26;;44063:27;;:10;:27::i;:::-;44105:31;44116:3;:19;;;44105:10;:31::i;:::-;44022:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44022:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44022:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44022:125:0;44002:17;;;:145;-1:-1:-1;;;;;44178:7:0;;;;;;;:4;44022:125;44178:7;;;;:11;;;44227:15;;;;44178:11;;;:23;;44216:27;;:10;:27::i;:::-;44258:31;44269:3;:19;;;44258:10;:31::i;:::-;44178:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44178:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44178:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44178:122:0;44158:17;;;:142;44341:3;44313:31;;44377:19;;;;44355;;;:41;44428:18;;;;44407;;;:39;44478:18;;44457;;;:39;;;44559:23;;44537:19;;;:45;44619:21;;;;44593:47;;-1:-1:-1;44651:27:0;;:48;44712:192;44743:1;44759:10;44792:4;44812:27;44792:4;44812:25;:27::i;:::-;44854:3;:15;;;44884:9;44712:16;:192::i;:::-;44996:15;;;;;45026:19;;;;45060:21;;;;;44922:170;;44955:10;44922:170;;-1:-1:-1;;;;;44922:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;41135:3967:0:o;37594:3519::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;37674;;:::i;:::-;-1:-1:-1;;;;;37728:7:0;;;37704:21;37728:7;;;:4;:7;;;;;;;;37778:21;:24;;;;;;37803:10;37778:36;;;;;;;37851:7;;;;;;;:26;;38014:11;;;;38056:19;;;;38095:18;;;;38014:151;;-1:-1:-1;;;38014:151:0;;;;;;;;;;;;;37909:3;:19;;;38014:151;;;;;;;;37728:7;;37909:19;;38014:11;;;;;:16;;:151;;;;;;;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;38014:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38014:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38014:151:0;37971:205;;38213:27;;;;-1:-1:-1;;;;;38298:7:0;;;37971:18;38298:7;;;:4;38014:151;38298:7;;;;:11;;;38356:23;;38298:11;;;:28;;38345:35;;:10;:35::i;:::-;38399:9;38434:3;:18;;;38298:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38298:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38298:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38298:170:0;;38252:21;;:227;38543:31;38567:6;38543:23;:31::i;:::-;38517:23;;;:57;;;38611:21;;;;:74;;;:25;:74;:::i;:::-;38587:21;;;:98;;;38833:23;;38752:29;;;;:105;;:66;;:29;:66;:43;:66;:::i;:105::-;38730:19;;;:127;38952:56;38987:10;38952:20;:56::i;:::-;38928:20;;;38905:103;38906:20;;;38905:103;;;39041:25;;;;:54;;-1:-1:-1;39070:20:0;;;;:25;39041:54;39019:127;;;;;-1:-1:-1;;;39019:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39242:101;39293:1;39309:3;:23;;;39242:36;:101::i;:::-;39206:33;;;:137;;;39413:20;;;;-1:-1:-1;39376:57:0;39354:141;;;;-1:-1:-1;;;39354:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39574:10;39582:1;39574:7;:10::i;:::-;39556:15;;;:28;;;39613:27;;39633:6;39613:27;:19;:27;:::i;:::-;39595:15;;;:45;-1:-1:-1;;;;;39696:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;39738:19;;;;39696:11;39777:18;;;;39696:151;;-1:-1:-1;;;39696:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;39696:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39696:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39696:151:0;39653:18;;;:205;-1:-1:-1;;;;;39889:7:0;;;;;;;:4;39696:151;39889:7;;;;:11;;;39941:15;;;;39889:11;;;:26;;39930:27;;:10;:27::i;:::-;39972:31;39983:3;:19;;;39972:10;:31::i;:::-;39889:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39889:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39889:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39889:125:0;39869:17;;;:145;-1:-1:-1;;;;;40045:7:0;;;;;;;:4;39889:125;40045:7;;;;:11;;;40094:15;;;;40045:11;;;:23;;40083:27;;:10;:27::i;:::-;40125:31;40136:3;:19;;;40125:10;:31::i;:::-;40045:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40045:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40045:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40045:122:0;40025:17;;;:142;40208:3;40180:31;;40244:19;;;;40222;;;:41;40295:18;;;;40274;;;:39;40345:18;;40324;;;:39;;;40426:23;;40404:19;;;:45;40486:21;;;;40460:47;;-1:-1:-1;40518:27:0;;:48;40734:175;40765:1;40781:27;40789:4;40781:25;:27::i;:::-;40831:4;40851:10;40876:6;40897:1;40734:16;:175::i;:::-;41017:19;;;;41051:21;;;;;40927:156;;;40955:10;40927:156;;-1:-1:-1;;;;;40927:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;37594:3519:0:o;23037:663::-;-1:-1:-1;;;;;23180:24:0;;;23123:7;23180:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;23244:7;;;:4;:7;;;;;:11;;;;23282:19;;;;23317:18;;;;23363:26;;23244:157;;-1:-1:-1;;;23244:157:0;;;;;;;;;;;;;;;;23357:3;:32;;;;23244:157;;;;;;23123:7;;;;23244:11;;;:16;;:157;;;;;23180:24;;23244:157;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;23244:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23244:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23244:157:0;-1:-1:-1;;;;;23464:7:0;;;23414:25;23464:7;;;:4;23244:157;23464:7;;;;:11;;;23522:23;;23244:157;;-1:-1:-1;23414:25:0;;23464:11;;;:28;;23511:35;;:10;:35::i;:::-;23572:13;:27;;;23619:12;23464:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23464:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23464:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23464:182:0;;-1:-1:-1;;;;23037:663:0;;;;;:::o;14736:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14736:33:0;;-1:-1:-1;14736:33:0;:::o;15502:127::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15584:7:0;;;;;;;:4;:7;;;;;:11;;:37;;-1:-1:-1;;;;;;15584:37:0;;;;;;;;15502:127::o;21156:182::-;21247:7;21279:51;21302:1;21305:24;21322:3;21327:1;21305:16;:24::i;:::-;21279:22;:51::i;:::-;21272:58;21156:182;-1:-1:-1;;;21156:182:0:o;36613:191::-;36704:7;36736:60;15051:7;36736:47;36753:29;15051:7;36704;36753:29;:13;:29;:::i;:::-;36736:12;;:47;:16;:47;:::i;:::-;:51;:60;:51;:60;:::i;:::-;36729:67;;36613:191;;;;:::o;25949:251::-;26057:7;26066;26109:29;26131:3;26136:1;26109:21;:29::i;:::-;26149:32;26174:3;26179:1;26149:24;:32::i;:::-;26091:101;;;;25949:251;;;;;:::o;19994:267::-;-1:-1:-1;;;;;20093:11:0;;20058:7;20093:11;;;:4;:11;;;;;:24;;;;20146:23;;;;;20223:30;20146:23;20223:17;20093:24;15051:7;20223:17;:8;:17;:::i;:30::-;20216:37;19994:267;-1:-1:-1;;;;19994:267:0:o;13494:24::-;;;;:::o;14889:49::-;14937:1;14889:49;:::o;13445:42::-;;;;;;;;;;;;;:::o;10879:28::-;;;-1:-1:-1;;;;;10879:28:0;;:::o;23898:751::-;-1:-1:-1;;;;;24037:24:0;;;23980:7;24037:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;24101:7;;;:4;:7;;;;;:11;;;;24139:19;;;;24174:18;;;;24220:26;;24101:157;;-1:-1:-1;;;24101:157:0;;;;;;;;;;;;;;;;24214:3;:32;;;;24101:157;;;;;;23980:7;;;;24101:11;;;:16;;:157;;;;;24037:24;;24101:157;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;24101:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24101:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24101:157:0;-1:-1:-1;;;;;24321:7:0;;;24271:25;24321:7;;;:4;24101:157;24321:7;;;;:11;;;24379:23;;24101:157;;-1:-1:-1;24271:25:0;;24321:11;;;:28;;24368:35;;:10;:35::i;:::-;24429:13;:27;;;24476:12;24321:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24321:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24321:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24321:182:0;24607:23;;24543:22;;;;24321:182;;-1:-1:-1;24543:98:0;;:45;;24321:182;24543:45;:26;:45;:::i;:98::-;24527:114;23898:751;-1:-1:-1;;;;;;23898:751:0:o;22375:174::-;22462:7;22494:47;22517:1;22520:20;22533:3;22538:1;21400:900;-1:-1:-1;;;;;21539:24:0;;;21482:7;21539:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;21603:7;;;:4;:7;;;;;:11;;;;21641:19;;;;21603:11;21676:18;;;21722:26;;21603:157;;-1:-1:-1;;;21603:157:0;;;;;;;;;;;;;;;;21716:3;:32;;;;21603:157;;;;;;21482:7;;;;21603:11;;;:16;;:157;;;;;;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;21603:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21603:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21603:157:0;-1:-1:-1;;;;;21823:7:0;;;21773:25;21823:7;;;:4;21603:157;21823:7;;;;:11;;;21881:23;;21603:157;;-1:-1:-1;21773:25:0;;21823:11;;;:28;;21870:35;;:10;:35::i;:::-;21931:13;:27;;;21978:12;21823:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21823:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21823:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21823:182:0;22053:23;;21823:182;;-1:-1:-1;22033:43:0;;22029:264;;;22180:23;;22113:106;;22158:46;;:17;;:46;:21;:46;:::i;:::-;22113:22;;;;;:106;:26;:106;:::i;:::-;22093:126;;;;;;;22029:264;-1:-1:-1;;22259:22:0;;;;-1:-1:-1;22252:29:0;;23708:182;23799:7;23831:51;23854:1;23857:24;23874:3;23879:1;23857:16;:24::i;67928:582::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;;;;17065:5;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;68046:12;68061:10;68069:1;68061:7;:10::i;:::-;-1:-1:-1;;;;;68148:7:0;;68082:14;68148:7;;;:4;:7;;;;;:19;;;;68108:20;;;;;68046:25;;-1:-1:-1;68082:14:0;;68099:79;;68148:19;68099:30;;68046:25;;68099:30;:8;:30;:::i;:79::-;68082:96;;68207:6;68197;:16;;68189:55;;;;;-1:-1:-1;;;68189:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68255:184;68286:1;68302:27;68310:4;68302:25;:27::i;:::-;68372:5;;68352:4;;68372:19;;:5;;;-1:-1:-1;;;;;68372:5:0;:17;:19::i;:::-;68406:6;68427:1;68255:16;:184::i;:::-;68496:5;;68455:47;;;-1:-1:-1;;;;;68455:47:0;;;;;;;;;;;;;;;;;68496:5;;;;;;;;68455:47;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;67928:582:0:o;12031:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26272:621::-;26453:16;:23;26372:19;;;;;26489:397;26513:6;26509:1;:10;26489:397;;;26556:19;26590:23;26631:113;26688:3;26710:16;26727:1;26710:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26710:19:0;26631:38;:113::i;:::-;26541:203;;-1:-1:-1;26541:203:0;-1:-1:-1;26773:28:0;:11;26541:203;26773:28;:15;:28;:::i;:::-;26759:42;-1:-1:-1;26836:38:0;:17;26858:15;26836:38;:21;:38;:::i;:::-;26816:58;-1:-1:-1;;;26521:3:0;;26489:397;;;;26272:621;;;;:::o;10715:108::-;-1:-1:-1;;;;;10715:108:0;:::o;51117:3163::-;51275:7;51303:10;-1:-1:-1;;;;;51303:27:0;;;;51295:60;;;;;-1:-1:-1;;;51295:60:0;;;;;;;;;;;;-1:-1:-1;;;51295:60:0;;;;;;;;;;;;;;;51366:22;;:::i;:::-;-1:-1:-1;;;;;51428:17:0;;;51401:18;51428:17;;;:4;:17;;;;;;;;:36;;51569:21;;;;;;;;;51665:34;;;:21;:34;;;;;;:49;;;;;;;;;;;;51792:38;;;:21;:38;;;;;:53;;;;;;;;;51917:20;;;;51968:28;;;;51917:20;52016:27;;;51917:178;;-1:-1:-1;;;51917:178:0;;;;;;;;;;;;;51422:3;:42;;;;51917:178;;;;;;;;51422:42;;51428:17;;51569:21;51665:49;;51792:53;;51917:20;;;:25;;:178;;;;;51428:17;51917:178;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;51917:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51917:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51917:178:0;51858:34;;;:248;52176:16;;;;52223:24;;;;52267:23;;;;52176:166;;;-1:-1:-1;;;52176:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52176:16:0;;;;:21;;:166;;;;;51917:178;;52176:166;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;52176:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52176:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52176:166:0;52117:34;;;:236;52435:20;;;;52502:45;;-1:-1:-1;;;;;52435:20:0;;;;:37;;52491:57;;:10;:57::i;:::-;52574:35;:49;;;52650:3;:34;;;52435:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52435:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52435:265:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52435:265:0;52364:46;;;:347;52793:16;;;;52856:44;;-1:-1:-1;;;;;52793:16:0;;;;:33;;52845:56;;:10;:56::i;:::-;52927:34;:48;;;53002:3;:34;;;52793:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52793:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52793:259:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52793:259:0;52722:46;;;:341;53076:7;53122:32;53138:15;53122;:32::i;:::-;53095:19;;;53094:60;;;;;-1:-1:-1;53094:60:0;53165:42;;;;;-1:-1:-1;;;53165:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53253:28;53269:11;53253:15;:28::i;:::-;53221:24;;;53220:61;;;;;-1:-1:-1;53220:61:0;53292:47;;;;;-1:-1:-1;;;53292:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53396:242;53452:11;53478:15;53508:3;:24;;;53547:3;:19;;;53581:3;:46;;;53396:41;:242::i;:::-;53352:41;;;:286;53783:24;;;;53683:135;;53729:13;;53757:11;;53683:31;:135::i;:::-;53649:31;;;:169;53900:46;;;;53961:41;;;;53882:131;;53900:46;53882:3;:131::i;:::-;53829:50;;;:184;;;54160:31;;;;54077:125;;53829:184;54077:3;:125::i;:::-;54024:50;;;;:178;;;-1:-1:-1;54024:178:0;;-1:-1:-1;;;;;;51117:3163:0;;;;;:::o;12678:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12678:57:0;;;;;;;;;;;;;;;;;;;;:::o;15977:724::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;16150:14;;-1:-1:-1;;;;;16150:14:0;16138:87;;16196:17;16206:6;16196:9;:17::i;:::-;16235:15;;:::i;:::-;-1:-1:-1;;;;;;16253:7:0;;;;;;;:4;:7;;;;;;;;;16235:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16271:89;;16320:28;16341:1;16344:3;16320:20;:28::i;:::-;16372:22;16392:1;16372:19;:22::i;:::-;16409:13;;;;16405:87;;14876:6;16444:13;;;:36;16405:87;16508:13;;;;16504:87;;14876:6;16543:13;;;:36;16504:87;16607:10;;;;16603:69;;16639:10;;;:21;;;16603:69;-1:-1:-1;;;;;16682:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16682:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15977:724:0:o;31806:4243::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;-1:-1:-1;;;;;31936:7:0;;;;:4;:7;;;;;;;;31986:21;:24;;;;;32011:10;31986:36;;;;;;;;32035:21;;:::i;:::-;-1:-1:-1;;;;;32093:7:0;;32069:21;32093:7;;;:4;:7;;;;;:26;32151:3;:19;;;32284:56;32319:10;32284:20;:56::i;:::-;32260:20;;;32237:103;32238:20;;;32237:103;;;32373:25;;;;:54;;-1:-1:-1;32402:20:0;;;;:25;32373:54;32351:129;;;;;-1:-1:-1;;;32351:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32577:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;32619:19;;;;32577:11;32658:18;;;;32577:151;;-1:-1:-1;;;32577:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;32577:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32577:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32577:151:0;32534:18;;;;:205;;;;-1:-1:-1;;;;;32796:7:0;;;;;;;:4;32577:151;32796:7;;;;;:11;;;32854:23;;32796:11;;;:28;;32843:35;;:10;:35::i;:::-;32904:13;:27;;;32958:3;:18;;;32796:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32796:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32796:196:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32796:196:0;32750:21;;;:253;33079:10;33087:1;33079:7;:10::i;:::-;33061:15;;;:28;-1:-1:-1;;33199:30:0;;33195:563;;;33347:96;33388:1;33408:3;:20;;;33347:22;:96::i;:::-;33324:20;;;:119;;;33527:21;;;;33479:119;;33501:48;;:3;:48::i;:::-;33568:3;:15;;;33479:3;:119::i;:::-;33458:140;;33195:563;;;33710:36;;;33195:563;33852:18;;33832:15;;;;:39;;;:19;:39;:::i;:::-;33814:15;;;:57;33932:18;;33906:21;;;;:45;;;:25;:45;:::i;:::-;33882:21;;;:69;34092:18;;34039:82;;34076:1;;34039:22;:82::i;:::-;34012:24;;;:109;;;34230:20;;;;-1:-1:-1;34202:48:0;34180:114;;;;;-1:-1:-1;;;34180:114:0;;;;;;;;;;;;-1:-1:-1;;;34180:114:0;;;;;;;;;;;;;;;34437:23;;34396:21;;;;34373:18;;;;:98;;34437:23;34373:45;;:18;:45;:22;:45;:::i;:98::-;34352:18;;;:119;-1:-1:-1;;;;;34527:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;34569:19;;;;34527:11;34608:18;;;;34527:151;;-1:-1:-1;;;34527:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;34527:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34527:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34527:151:0;34484:18;;;;:205;;;;-1:-1:-1;;;;;34762:7:0;;;;;;;:4;34527:151;34762:7;;;;;:11;;;34814:15;;;;34762:11;;;:26;;34803:27;;:10;:27::i;:::-;34845:31;34856:6;:19;;;34845:10;:31::i;:::-;34762:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34762:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34762:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34762:125:0;34742:17;;;:145;-1:-1:-1;;;;;34941:7:0;;;;;;;:4;34762:125;34941:7;;;;;;;;:11;;;;34983:19;;;;35022:18;;;;;34941:151;;-1:-1:-1;;;34941:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;34762:125;34941:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;34941:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34941:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34941:151:0;34898:18;;;:205;-1:-1:-1;;;;;35134:7:0;;;;;;;:4;34941:151;35134:7;;;;:11;;;35183:15;;;;35134:11;;;:23;;35172:27;;:10;:27::i;:::-;35214:31;35225:6;:19;;;35214:10;:31::i;:::-;35134:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35134:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35134:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35134:122:0;35114:17;;;:142;35297:3;35269:31;;35332:18;;;;35311;;;:39;35382:18;;;;35361;;;:39;;;35432:18;;;;35411;;;:39;35513:23;;35134:122;35491:19;;:45;-1:-1:-1;35573:21:0;;;35547:47;;-1:-1:-1;35605:27:0;;:48;35666:187;35697:1;35713:27;35721:4;35713:25;:27::i;:::-;35763:4;35783:10;35808:3;:18;;;35841:1;35666:16;:187::i;:::-;35942:18;;35975:19;;;;;36009:21;;;;;35871:170;;;35901:10;35871:170;;-1:-1:-1;;;;;35871:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;31806:4243:0:o;19285:277::-;19334:7;-1:-1:-1;;;;;19400:15:0;;19396:76;;-1:-1:-1;19439:21:0;19432:28;;19396:76;19524:30;;;-1:-1:-1;;;19524:30:0;;19548:4;19524:30;;;;;;19504:1;;-1:-1:-1;;;;;19524:15:0;;;;;:30;;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;19524:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19524:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19524:30:0;;19285:277;-1:-1:-1;;;19285:277:0:o;15094:273::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;15171:9;15166:155;15190:16;:23;15186:27;;15166:155;;;15262:5;-1:-1:-1;;;;;15239:28:0;:16;15256:1;15239:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15239:19:0;:28;15235:75;;;15288:7;;;15235:75;15215:3;;15166:155;;;-1:-1:-1;15331:16:0;27:10:-1;;39:1;23:18;;45:23;;-1:-1;15331:28:0;;;;;;;;-1:-1:-1;;;;;;15331:28:0;-1:-1:-1;;;;;15331:28:0;;;;;17109:1;15094:273;:::o;24657:174::-;24744:7;24776:47;24799:1;24802:20;24815:3;24820:1;24802:12;:20::i;15375:119::-;15463:16;:23;15375:119;:::o;47476:765::-;-1:-1:-1;;;;;47782:21:0;;47728:11;47782:21;;;:4;:21;;;;;:41;;;47728:11;47871:34;15051:7;47782:41;47871:34;:13;:34;:::i;:::-;47834:71;-1:-1:-1;47922:52:0;:20;47834:71;47922:52;:24;:52;:::i;:::-;47916:58;-1:-1:-1;47991:48:0;47916:58;47999:39;47991:48;:7;:48;:::i;:::-;47985:54;-1:-1:-1;48056:24:0;47985:54;48064:15;48056:24;:7;:24;:::i;:::-;48050:30;-1:-1:-1;48097:16:0;48050:30;15051:7;48097:16;:7;:16;:::i;:::-;-1:-1:-1;;;;;48142:21:0;;;;;;:4;:21;;;;;:30;;;48091:22;;-1:-1:-1;48130:43:0;;48091:22;;48138:2;:34;48130:43;:7;:43;:::i;:::-;-1:-1:-1;;;;;48202:21:0;;;;;;:4;:21;;;;;:30;;;48124:49;;-1:-1:-1;48190:43:0;;48124:49;;48198:2;:34;48190:43;:7;:43;:::i;:::-;48184:49;47476:765;-1:-1:-1;;;;;;;;47476:765:0:o;17723:103::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;17786:14;:32;;-1:-1:-1;;;;;;17786:32:0;-1:-1:-1;;;;;17786:32:0;;;;;;;;;;17723:103::o;17600:115::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17680:7:0;;;;;;;:4;:7;;;;;:16;;:27;17600:115::o;24888:384::-;25013:16;:23;24964:14;;;25078:160;25102:6;25098:1;:10;25078:160;;;25130:11;25144:43;25162:3;25167:16;25184:1;25167:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25167:19:0;25144:17;:43::i;:::-;25130:57;-1:-1:-1;25211:15:0;:6;25130:57;25211:15;:10;:15;:::i;:::-;25202:24;-1:-1:-1;;25110:3:0;;25078:160;;;;24888:384;;;;:::o;46232:872::-;-1:-1:-1;;;;;46560:21:0;;46506:11;46560:21;;;:4;:21;;;;;:41;;;46506:11;46649:34;15051:7;46560:41;46649:34;:13;:34;:::i;:::-;46612:71;-1:-1:-1;46694:42:0;46748:56;:35;46788:15;46748:56;:39;:56;:::i;:::-;46694:110;-1:-1:-1;46823:129:0;46876:65;15051:7;46876:52;:26;46907:20;46876:52;:30;:52;:::i;:65::-;46823:34;;:129;:38;:129;:::i;:::-;-1:-1:-1;;;;;47005:21:0;;;;;;:4;:21;;;;;:30;;;46817:135;;-1:-1:-1;46993:43:0;;46817:135;;47001:2;:34;46993:43;:7;:43;:::i;:::-;-1:-1:-1;;;;;47065:21:0;;;;;;:4;:21;;;;;:30;;;46987:49;;-1:-1:-1;47053:43:0;;46987:49;;47061:2;:34;47053:43;:7;:43;:::i;:::-;47047:49;46232:872;-1:-1:-1;;;;;;;;;46232:872:0:o;27772:3533::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;27903:6;-1:-1:-1;;;;;27966:15:0;;27962:240;;28016:9;28006:6;:19;27998:67;;;;-1:-1:-1;;;27998:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28095:9:0;27962:240;;;28145:9;:14;28137:53;;;;;-1:-1:-1;;;28137:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28212:19;;:::i;:::-;-1:-1:-1;;;;;28266:7:0;;;28242:21;28266:7;;;:4;:7;;;;;;;;28316:21;:24;;;;;28341:10;28316:36;;;;;;;;28389:25;;28571:10;;;;28612:18;;;;28571:10;28650:17;;;28571:148;;-1:-1:-1;;;28571:148:0;;;;;;;;;;;;;28446:3;:19;;;28571:148;;;;;;;;28266:7;;28316:36;;28389:25;;28571:10;;;;;:15;;:148;;;;;28266:7;28571:148;;;;;:10;:148;;;5:2:-1;;;;30:1;27;20:12;5:2;28571:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28571:148:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28571:148:0;;28528:18;;;:202;;;;28787:10;;;;-1:-1:-1;;;;;28844:24:0;;;28787:10;28844:24;;;:21;:24;;;;;;28869:10;28844:36;;;;;;;;;:46;28787:10;;;:27;;28833:58;;:10;:58::i;:::-;28917:13;:27;;;28971:3;:18;;;28787:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28787:218:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28787:218:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28787:218:0;28741:21;;;:275;;;29051:39;;29077:12;29051:39;:25;:39;:::i;:::-;29027:21;;;:63;;;29226:23;;29162:18;;;;:98;;:45;;:18;:45;:22;:45;:::i;:98::-;29141:18;;;:119;29291:10;29299:1;29291:7;:10::i;:::-;29273:15;;;:28;-1:-1:-1;;;;;29584:15:0;;:87;;29656:3;:15;;;29584:87;;;29611:15;;;;:33;;29631:12;29611:33;:19;:33;:::i;:::-;29566:15;;;:105;;;29749:10;;;;-1:-1:-1;;;;;29749:10:0;;:25;;29789:27;;:10;:27::i;:::-;29831:31;29842:6;:19;;;29831:10;:31::i;:::-;29749:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29749:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29749:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29749:124:0;29729:17;;;:144;29927:10;;;;29968:18;;;;30006:17;;;;29927:148;;;-1:-1:-1;;;29927:148:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29927:10:0;;;;:15;;:148;;;;;29749:124;;29927:148;;;;;;;;:10;:148;;;5:2:-1;;;;30:1;27;20:12;5:2;29927:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29927:148:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29927:148:0;29884:18;;;:202;30117:10;;;;30165:15;;;;-1:-1:-1;;;;;30117:10:0;;;;:22;;30154:27;;:10;:27::i;:::-;30196:31;30207:6;:19;;;30196:10;:31::i;:::-;30117:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30117:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30117:121:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30117:121:0;30097:17;;;:141;30272:18;;;;30251;;;:39;30117:121;30322:18;;;30301;;;:39;;;30372:18;;;;30351;;;:39;30429:3;30401:31;;30495:23;;30473:45;;;30555:21;;;;30529:47;;-1:-1:-1;30587:27:0;;:48;;;;30692:21;;;;:43;30688:207;;;30848:19;;30822:21;;;;30777:106;;30822:46;;:21;:46;:25;:46;:::i;30777:106::-;30752:22;;;:131;30688:207;30907:16;30912:10;30907:4;:16::i;:::-;30936:181;30967:1;30983:10;31016:4;31036:27;31016:4;31036:25;:27::i;:::-;31078:12;31105:1;30936:16;:181::i;:::-;31231:19;;31265:21;;;;;31135:162;;;31163:10;31135:162;;-1:-1:-1;;;;;31135:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;27772:3533:0:o;18859:372::-;18997:14;;18956:7;;-1:-1:-1;;;;;18997:14:0;18981:64;;;;;-1:-1:-1;;;18981:64:0;;;;;;;;;;;;-1:-1:-1;;;18981:64:0;;;;;;;;;;;;;;;19057:13;19072:7;19083:18;19099:1;19083:15;:18::i;:::-;19056:45;;;;19120:2;:16;;;;-1:-1:-1;19126:10:0;;;19120:16;19112:48;;;;;-1:-1:-1;;;19112:48:0;;;;;;;;;;;;-1:-1:-1;;;19112:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19195:7:0;;;;;;:4;:7;;;;;:16;;;19178:45;;19217:5;;19178:34;;:8;;19191:2;:20;19178:34;:12;:34;:::i;:45::-;19171:52;18859:372;-1:-1:-1;;;;;18859:372:0:o;26901:550::-;26980:7;26989;27014:19;27044:26;27177:46;27219:3;27177:41;:46::i;:::-;27112:111;;-1:-1:-1;27112:111:0;-1:-1:-1;27238:32:0;;;27234:210;;;27295:1;27298:35;:18;27321:11;27298:35;:22;:35;:::i;:::-;27287:47;;-1:-1:-1;27287:47:0;-1:-1:-1;27287:47:0;;-1:-1:-1;;27287:47:0;27234:210;27384:35;:11;27400:18;27384:35;:15;:35;:::i;:::-;27376:47;-1:-1:-1;27421:1:0;;-1:-1:-1;27376:47:0;;-1:-1:-1;;27376:47:0;26901:550;;;;:::o;17126:101::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;17197:13;:22;;-1:-1:-1;;;;;;17197:22:0;-1:-1:-1;;;;;17197:22:0;;;;;;;;;;17126:101::o;17235:187::-;17308:13;;-1:-1:-1;;;;;17308:13:0;17294:10;:27;17286:59;;;;;-1:-1:-1;;;17286:59:0;;;;;;;;;;;;-1:-1:-1;;;17286:59:0;;;;;;;;;;;;;;;17364:13;;;;17356:21;;-1:-1:-1;;;;;;17356:21:0;17364:13;-1:-1:-1;;;;;17364:13:0;;17356:21;;;;-1:-1:-1;;;;;;17388:26:0;;;17235:187::o;25670:211::-;25770:7;25779;25812:29;25834:3;25839:1;25812:21;:29::i;:::-;25843;25865:3;25870:1;25843:21;:29::i;15795:174::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15912:7:0;;;;;;;:4;:7;;;;;:27;;:49;15795:174::o;20421:663::-;-1:-1:-1;;;;;20564:24:0;;;20507:7;20564:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;20628:7;;;:4;:7;;;;;:11;;;;20666:19;;;;20628:11;20701:18;;;20747:26;;20628:157;;-1:-1:-1;;;20628:157:0;;;;;;;;;;;;;;;;20741:3;:32;;;;20628:157;;;;;;20507:7;;;;20628:11;;;:16;;:157;;;;;;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;15637:150:0;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15742:7:0;;;;;;;:4;:7;;;;;;;;:21;:37;15637:150::o;14791:29::-;;;-1:-1:-1;;;;;14791:29:0;;:::o;17474:118::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:11:0;;;;;:4;:11;;;;;17581:3;17548:36;;17474:118::o;22608:328::-;22733:16;:23;22684:14;;;22769:160;22793:6;22789:1;:10;22769:160;;;22821:11;22835:43;22853:3;22858:16;22875:1;22858:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22858:19:0;22835:17;:43::i;:::-;22821:57;-1:-1:-1;22902:15:0;:6;22821:57;22902:15;:10;:15;:::i;:::-;22893:24;-1:-1:-1;;22801:3:0;;22769:160;;12742:31;;;;:::o;25366:236::-;-1:-1:-1;;;;;25535:7:0;;25460;25535;;;:4;:7;;;;;;;:21;;25501:93;;15051:7;;25501:56;;:29;25523:3;25540:1;25501:21;:29::i;:::-;:33;:56;:33;:56;:::i;17988:222::-;18111:14;;18064:7;;;;-1:-1:-1;;;;;18111:14:0;18095:64;;;;;-1:-1:-1;;;18095:64:0;;;;;;;;;;;;-1:-1:-1;;;18095:64:0;;;;;;;;;;;;;;;18177:14;;:25;;;-1:-1:-1;;;18177:25:0;;-1:-1:-1;;;;;18177:25:0;;;;;;;;;:14;;;:18;;:25;;;;;;;;;;;;;:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;18177:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18177:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18177:25:0;;;;;;;;;-1:-1:-1;18177:25:0;-1:-1:-1;17988:222:0;;;:::o;14668:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14829:53::-;14876:6;14829:53;:::o;18419:390::-;18564:14;;18523:7;;-1:-1:-1;;;;;18564:14:0;18548:64;;;;;-1:-1:-1;;;18548:64:0;;;;;;;;;;;;-1:-1:-1;;;18548:64:0;;;;;;;;;;;;;;;18624:13;18639:7;18650:22;18666:5;18650:15;:22::i;:::-;18623:49;;;;18691:2;:16;;;;-1:-1:-1;18697:10:0;;;18691:16;18683:48;;;;;-1:-1:-1;;;18683:48:0;;;;;;;;;;;;-1:-1:-1;;;18683:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18780:11:0;;;;;;:4;:11;;;;;:20;;;18749:52;;18776:2;:24;18749:22;:5;18759:11;18749:22;:9;:22;:::i;36851:266::-;-1:-1:-1;;;;;37064:7:0;;36975;37064;;;:4;:7;;;;;;;:21;;37011:98;;15051:7;;37011:75;;:38;37069:1;37037:11;37011:22;:38::i;13395:43::-;;;;;;;;;;;;-1:-1:-1;;;;;13395:43:0;;:::o;45213:663::-;45387:7;45410:17;45431:35;45452:13;45431:20;:35::i;:::-;-1:-1:-1;;;;;45501:21:0;;45477;45501;;;:4;:21;;;;;;;:35;;;;45577:41;;;;;45407:59;;-1:-1:-1;45501:35:0;-1:-1:-1;45643:51:0;45686:7;45643:38;45501:35;45577:41;45643:38;:17;:38;:::i;:51::-;45629:65;-1:-1:-1;45721:121:0;45789:42;15051:7;45789:29;:20;45629:65;45789:29;:24;:29;:::i;:42::-;-1:-1:-1;;;;;45739:21:0;;;;;;:4;:21;;;;;:30;;;45721:49;;:9;;45735:2;:34;45721:49;:13;:49;:::i;10832:20::-;;;;;;-1:-1:-1;;;;;10832:20:0;;:::o;12165:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18218:149::-;18269:6;-1:-1:-1;;;;;18296:1:0;:12;;18288:44;;;;;-1:-1:-1;;;18288:44:0;;;;;;;;;;;;-1:-1:-1;;;18288:44:0;;;;;;;;;;;;;;;-1:-1:-1;18357:1:0;18218:149::o;4273:171::-;4331:7;4363:5;;;4387:6;;;;4379:36;;;;;-1:-1:-1;;;4379:36:0;;;;;;;;;;;;-1:-1:-1;;;4379:36:0;;;;;;;;;;;;;;4014:171;4072:7;4105:1;4100;:6;;4092:36;;;;;-1:-1:-1;;;4092:36:0;;;;;;;;;;;;-1:-1:-1;;;4092:36:0;;;;;;;;;;;;;;;-1:-1:-1;4151:5:0;;;4014:171::o;36388:172::-;36446:7;36474:1;36470;:5;36466:87;;;-1:-1:-1;36499:1:0;36492:8;;36466:87;-1:-1:-1;36540:1:0;36533:8;;19625:325;19714:7;-1:-1:-1;;;;;19785:19:0;;19781:80;;-1:-1:-1;;;;;;19828:21:0;;;19821:28;;19781:80;19921:21;;;-1:-1:-1;;;19921:21:0;;-1:-1:-1;;;;;19921:21:0;;;;;;;;;19895:5;;19921:15;;;;;:21;;;;;;;;;;;;;;:15;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;19921:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19921:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19921:21:0;;19625:325;-1:-1:-1;;;;19625:325:0:o;12782:587::-;13006:30;;:::i;:::-;-1:-1:-1;13039:198:0;;;;;;;;-1:-1:-1;;;;;13039:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13211:15;13039:198;;;;;;13303:16;;;-1:-1:-1;13286:34:0;;;:16;:34;;;;;;;;:46;;;;-1:-1:-1;;;;;;13286:46:0;;;;;;;;;;;;;;-1:-1:-1;13286:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13343:18;;;;;;;12782:587::o;9497:117::-;9603:1;9497:117::o;65566:2319::-;65790:11;65782:55;;;;;-1:-1:-1;;;65782:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65861:7;-1:-1:-1;;;;;65852:16:0;:5;-1:-1:-1;;;;;65852:16:0;;;:39;;;;-1:-1:-1;;;;;;65872:19:0;;;;65852:39;65848:239;;;65968:39;;;-1:-1:-1;;;65968:39:0;;-1:-1:-1;;;;;65968:39:0;;;;;;;;;;;;;;;;66011:6;;65968:23;;;;;:39;;;;;;;;;;;;;;:23;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;65968:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65968:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65968:39:0;:49;;65942:133;;;;;-1:-1:-1;;;65942:133:0;;;;;;;;;;;;-1:-1:-1;;;65942:133:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;66101:19:0;;;66097:382;;66197:6;66170:5;-1:-1:-1;;;;;66163:23:0;;66187:5;66163:30;;;;;;;;;;;;;-1:-1:-1;;;;;66163:30:0;-1:-1:-1;;;;;66163:30:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66163:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66163:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66163:30:0;:40;;66137:122;;;;;-1:-1:-1;;;66137:122:0;;;;;;;;;;;;-1:-1:-1;;;66137:122:0;;;;;;;;;;;;;;;66097:382;;;66290:7;-1:-1:-1;;;;;66281:16:0;:5;-1:-1:-1;;;;;66281:16:0;;66277:202;;;66432:6;66415:5;-1:-1:-1;;;;;66415:13:0;;:23;;66407:60;;;;;-1:-1:-1;;;66407:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66504:7;-1:-1:-1;;;;;66495:16:0;:5;-1:-1:-1;;;;;66495:16:0;;66491:1387;;-1:-1:-1;;;;;66560:19:0;;;66556:314;;66639:49;-1:-1:-1;;;;;66639:30:0;;66670:5;66677:2;66681:6;66639:49;:30;:49;:::i;:::-;66556:314;;;66714:13;;;;;:34;;;66742:6;66731:8;:17;66714:34;66710:160;;;-1:-1:-1;;;;;66818:14:0;;:36;66833:20;:8;66846:6;66833:20;:12;:20;:::i;:::-;66818:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66818:36:0;66710:160;66491:1387;;;-1:-1:-1;;;;;67003:19:0;;;66999:868;;67069:38;-1:-1:-1;;;;;67069:26:0;;67096:2;67100:6;67069:38;:26;:38;:::i;66999:868::-;67672:13;;;;;:34;;;67700:6;67689:8;:17;67672:34;67668:184;;;-1:-1:-1;;;;;67731:11:0;;:33;67743:20;:8;67756:6;67743:20;:12;:20;:::i;67668:184::-;67813:19;;-1:-1:-1;;;;;67813:11:0;;;:19;;;;;67825:6;;67813:19;;;;67825:6;67813:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67813:19:0;67668:184;65566:2319;;;;;;:::o;2963:454::-;3021:7;3265:6;3261:47;;-1:-1:-1;3295:1:0;3288:8;;3261:47;3332:5;;;3336:1;3332;:5;:1;3356:5;;;;;:10;3348:40;;;;;-1:-1:-1;;;3348:40:0;;;;;;;;;;;;-1:-1:-1;;;3348:40:0;;;;;;;;;;;;;;3552:324;3610:7;3705:6;3697:35;;;;;-1:-1:-1;;;3697:35:0;;;;;;;;;;;;-1:-1:-1;;;3697:35:0;;;;;;;;;;;;;;;3743:9;3759:1;3755;:5;;;;;;;3552:324;-1:-1:-1;;;;3552:324:0:o;13548:182::-;-1:-1:-1;;;;;13599:12:0;;;;;;:7;:12;;;;;;13595:128;;13642:5;;;13633:15;;;;:8;:15;;;;;;;;:21;;-1:-1:-1;;;;;13633:21:0;;-1:-1:-1;;;;;;13633:21:0;;;;;;;;13684:5;;13669:12;;;:7;:12;;;;;;:20;;;13633:21;13704:7;;;13548:182;:::o;6408:284::-;6605:68;;;-1:-1:-1;;;;;6605:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6605:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;6552:132:0;;6585:5;;6552:18;:132::i;:::-;6408:284;;;;:::o;6153:247::-;6323:58;;;-1:-1:-1;;;;;6323:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6323:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;6270:122:0;;6303:5;;6270:18;:122::i;:::-;6153:247;;;:::o;8556:900::-;9108:27;9116:5;-1:-1:-1;;;;;9108:25:0;;:27::i;:::-;9100:36;;;;;;9210:12;9224:23;9259:5;-1:-1:-1;;;;;9251:19:0;9271:4;9251:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9251:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9209:67:0;;;;9295:7;9287:16;;;;;;9320:17;;:21;9316:133;;9417:10;9406:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9406:30:0;9398:39;;;;;2091:650;2676:20;2724:9;;;2091:650::o;10560:57953::-;;;;;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://92b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c627
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.