Contract 0xa17635592d28c30ade3fc8893016896cfe5f5e16

Contract Overview

Balance:
0 BNB

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0x3b19c40570a5bc7dcf114378155baa7e667534657d4b4269112280b758b5f44d94260882021-06-04 2:58:308 days 11 hrs ago0xcfb384cc709216cfb81c0fe2ec931aea689bc472 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00021436
0xe8fe0c0f880fc9fbfb4e64dc6a7b24d519a6a6c7699e156876ec524a421dea5994260832021-06-04 2:58:158 days 11 hrs ago0xcfb384cc709216cfb81c0fe2ec931aea689bc472 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00065576
0xd05cc0a0eadc50b97fc6a0add12329a018ab3c06858d83902ede9b01aae22abe93443802021-06-01 6:51:3611 days 7 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00121339
0x3b52b71f9dd680a741d507735bed4651f94c5232afa14b00a02ae0c2152508c493405822021-06-01 3:41:4211 days 10 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00332452
0x6d59691f64b1cd6b87673f1306103a2fa2f46a6c5a6a7d3ab28c72d75893df9193405822021-06-01 3:41:4211 days 10 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00471884
0x0c202d3e9d9e605f9fb7d9c01f3b803e467eccbe755b77438763d0d608865aa393222652021-05-31 12:25:5112 days 1 hr ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00121339
0x1f80026151510910f764751eea07d8f0a3bd68ffcef6f9f62c2c5a4af37ddd3393217952021-05-31 12:02:2112 days 2 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00471884
0x952c94df7c9b534cb0b962e3d47119b8f315e5fe9a95cff378eff5e34ad1757793215622021-05-31 11:50:4212 days 2 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00106363
0x5af94367b8d98ed4b628c3961ff417c3745a7b6bb2c7cfe3a2590373d332781393214452021-05-31 11:44:5112 days 2 hrs ago0x86e958b4244ca98482be4195fa49e9dab760a12c IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00121339
0xa8d69eab40d27f41cf72fc9b4aecd0150ecd47479ac25407e68607deeb0427f393204372021-05-31 10:54:2712 days 3 hrs ago0x86e958b4244ca98482be4195fa49e9dab760a12c IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00471884
0x66102deb387103a1edd782a064fecefbfebe19bb206975420c5845bccd03627493204132021-05-31 10:53:1512 days 3 hrs ago0x86e958b4244ca98482be4195fa49e9dab760a12c IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00121339
0xf0932b8409ab00837e49ba56f01ec91b03add24bbef96fb9ca5ad6266084eb4c93196452021-05-31 10:14:5112 days 4 hrs ago0x86e958b4244ca98482be4195fa49e9dab760a12c IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.0055505
0xfbd7f06492f17410d38a9b081a52c9bf997d3c5b89c353a1be6d4a576f0bdb2793193622021-05-31 10:00:4212 days 4 hrs ago0x54c34a702acbcb408e35958f74254e334c119b4d IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.0035366
0x3b780d4b7c1fab511d6dab7e18f73790eecfe8df407872651f1cf357598fd51c93190602021-05-31 9:45:3612 days 4 hrs ago0x54c34a702acbcb408e35958f74254e334c119b4d IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00512684
0x93e9a6ddad177cf14da7b8d218554ead708d6a9a9c14cfd3bbfb593fb349fb8293096802021-05-31 1:29:4412 days 12 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.001249
0x2d51db2fd87dff6aca2ceea7cf5f856d2af46252ff6cbd6b94473aa3a136c33492335912021-05-28 9:39:4415 days 4 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00450043
0xe20c6e09a3ec038575cd191aa7615c7af6e3056b063f1f504db1e94508161d9392335702021-05-28 9:38:4115 days 4 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00450043
0x876a1383b8705fe83ff9eac13e18ca336c489ce094fea85dcade48d10ea7860692335612021-05-28 9:38:1415 days 4 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00139538
0x737c8b61e6160920694f7216ccb13d3bb22a2191d6345f453f5e0c9d721f23a392316332021-05-28 8:01:5015 days 6 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00501884
0x26781a6064e9a0c08fa6782f051b38df3a2b4f8b6c00f3cfc4cef0872bfa2aa192316122021-05-28 8:00:4715 days 6 hrs ago0xcf60a5d7986033907a6b95790d5f4fa6746f619f IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.001457
0x9cc8b56a6680d7099f1272aece72a65d140dff6707304b36d1f128b74cbf1ae190266182021-05-21 4:46:4122 days 9 hrs ago0x178554d52250f0368a5349ea61d7daa97f7a0e2e IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00061025
0xa1e1134d36c6d63f91ff57a038976c9b18c6ab372f50975bce898bde01d2ff1d90266102021-05-21 4:46:1722 days 9 hrs ago0x178554d52250f0368a5349ea61d7daa97f7a0e2e IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00139526
0xddf7f4166d3b000e222c2a3bf6950739cf17ff18bd393473097ad6e5b56fd40190265952021-05-21 4:45:3222 days 9 hrs ago0x178554d52250f0368a5349ea61d7daa97f7a0e2e IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00527684
0x8d16dbcea9935138991e751d5c8599dad86c4f1034b9bd20ac4202a9f782f5db89673362021-05-19 3:19:2824 days 11 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00061025
0x3501fa5c114fd93a9f6c8f428a6758a307207457849f284fbba79c0084366c8489673272021-05-19 3:19:0124 days 11 hrs ago0xcc7c496d1c84063d7bf20733ec42020ee8105da8 IN  0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB0.00139526
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x8f2c19b06ba6be41588c4cc17c9c0fdb5dda3ae1c672969581f4f2de138afae696294802021-06-11 4:29:251 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x8f2c19b06ba6be41588c4cc17c9c0fdb5dda3ae1c672969581f4f2de138afae696294802021-06-11 4:29:251 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x8f2c19b06ba6be41588c4cc17c9c0fdb5dda3ae1c672969581f4f2de138afae696294802021-06-11 4:29:251 day 9 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x8f2c19b06ba6be41588c4cc17c9c0fdb5dda3ae1c672969581f4f2de138afae696294802021-06-11 4:29:251 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x8f2c19b06ba6be41588c4cc17c9c0fdb5dda3ae1c672969581f4f2de138afae696294802021-06-11 4:29:251 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x8f2c19b06ba6be41588c4cc17c9c0fdb5dda3ae1c672969581f4f2de138afae696294802021-06-11 4:29:251 day 9 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x26cdbdc22dc9d9ddd10192ae28225e8362d399560983feda1b77b4147874d8b896294222021-06-11 4:26:311 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x26cdbdc22dc9d9ddd10192ae28225e8362d399560983feda1b77b4147874d8b896294222021-06-11 4:26:311 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x26cdbdc22dc9d9ddd10192ae28225e8362d399560983feda1b77b4147874d8b896294222021-06-11 4:26:311 day 9 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x26cdbdc22dc9d9ddd10192ae28225e8362d399560983feda1b77b4147874d8b896294222021-06-11 4:26:311 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x26cdbdc22dc9d9ddd10192ae28225e8362d399560983feda1b77b4147874d8b896294222021-06-11 4:26:311 day 9 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x26cdbdc22dc9d9ddd10192ae28225e8362d399560983feda1b77b4147874d8b896294222021-06-11 4:26:311 day 9 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x73f543c2abc9e4c02d7c537eddb1fc91a4c55d5514c01acd1159fb401711178996289602021-06-11 4:03:251 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x73f543c2abc9e4c02d7c537eddb1fc91a4c55d5514c01acd1159fb401711178996289602021-06-11 4:03:251 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x73f543c2abc9e4c02d7c537eddb1fc91a4c55d5514c01acd1159fb401711178996289602021-06-11 4:03:251 day 10 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x73f543c2abc9e4c02d7c537eddb1fc91a4c55d5514c01acd1159fb401711178996289602021-06-11 4:03:251 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x73f543c2abc9e4c02d7c537eddb1fc91a4c55d5514c01acd1159fb401711178996289602021-06-11 4:03:251 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x73f543c2abc9e4c02d7c537eddb1fc91a4c55d5514c01acd1159fb401711178996289602021-06-11 4:03:251 day 10 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0xfd98e004b56e56ae11a05ba82c533e5fe13eef38b5548f797119a9ab242f28f696289132021-06-11 4:01:041 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0xfd98e004b56e56ae11a05ba82c533e5fe13eef38b5548f797119a9ab242f28f696289132021-06-11 4:01:041 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0xfd98e004b56e56ae11a05ba82c533e5fe13eef38b5548f797119a9ab242f28f696289132021-06-11 4:01:041 day 10 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0xfd98e004b56e56ae11a05ba82c533e5fe13eef38b5548f797119a9ab242f28f696289132021-06-11 4:01:041 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0xfd98e004b56e56ae11a05ba82c533e5fe13eef38b5548f797119a9ab242f28f696289132021-06-11 4:01:041 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0xfd98e004b56e56ae11a05ba82c533e5fe13eef38b5548f797119a9ab242f28f696289132021-06-11 4:01:041 day 10 hrs ago 0xeba3f3e2d327bfd11f02eb13807607416b0a46fc 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
0x12a78b0fdd19d0ceee679c2dfa37832b4f7154755a8e5c759ad2693296de929496288662021-06-11 3:58:431 day 10 hrs ago 0xaeef26b17228ce8d5847426a6cd9911905fc9f94 0xa17635592d28c30ade3fc8893016896cfe5f5e160 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xb7B6DC45b3C5402a13dE490d6bD63A8EA3a66e27

Contract Name:
DevDefiPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-05
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12;

library SafeMath {
  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    require(c / a == b, 'INVALID_MUL');
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0, 'INVALID_DIV'); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a, 'INVALID_SUB');
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, 'INVALID_ADD');
    return c;
  }
}
// "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol";
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being 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 percentage 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.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @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(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

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

    function calUtilizationRate(uint256 _totalDemand, uint256 _totalSupply) external pure returns (uint256);
    
    function calBorrowRate(uint256 _totalDemand, uint256 _totalSupply) external pure returns(uint256);
}
contract IDevDefiPool {

	InterfaceRate public rateContract;
	uint256 public totalSupplier;
    uint256 public totalBorrower;
	
	function borrow(address _borrower, uint256 _amount) external returns(bool) {}
	function repay(address _borrower, uint256 _amount) external returns(bool) {}

	function isCollateral(address _user) external view returns(bool) {}
	function balanceOf(address _addr) external view returns(uint256) {}
	function getBaseToken() external view returns(address) {}
	function getCollateralOf(address _whoAddr) external view returns(uint256) {}
	function getPrincipalOf(address _borrower) external view returns(uint256) {}
	function getAmountOwed(address _borrower) external view returns(uint256) {}
	function getData() external view returns(uint256 totalSupply_, uint256 totalDemand_, uint256 liquidityAmt_, uint256 borrowAPY_, uint256 supplyAPY_) {}
	function getBorrowerDetail(address _borrower) external view returns(uint256 principal_, uint256 amountOwed_, uint256 dayToRepayInterest_, uint256 numberDayToBorrow_) {} 
	function getUserDetail(address _user) external view returns(uint256 supplyBal_, uint256 interestPending_, uint256 baseTokenBal_, uint256 bnbBal_, bool isCollateral_ ) {}
}
interface IBEP20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the token decimals.
   */
  function decimals() external view returns (uint256);

  /**
   * @dev Returns the token symbol.
   */
  function symbol() external view returns (string memory);

  /**
  * @dev Returns the token name.
  */
  function name() external view returns (string memory);

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address);

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

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

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

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

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

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

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

	PoolInfo[] public poolInfo;

	struct PoolInfo {
    	IDevDefiPool pool;
        IBEP20 baseToken;         
      	string tokenName;
      	uint256 minBorrow;
	    uint256 liquidationRaito; // use for asset collateral: 10000 == 100%
	    bool status;
    }

	function verifyBurn(uint256 _pid, address _whoAddr, uint256 _amount) external view returns(bool) {}
	function verifyBorrow(uint256 _pid, address _whoAddr, uint256 _amount) external view returns(bool) {}
	function verifySupply(uint256 _pid, address _user) external view returns(bool) {}
	function verifyEnableCollateral(uint256 _pid, address _user) external view returns(bool) {}
	function isBorrowerNeedLiquidate(address _borrower) external view returns(bool) {}
	function getMaxLiquidationAmount(uint256 _pid, address _borrower) external view returns(uint256) {}
	function getTotalPool() external view returns(uint256) {}
}
interface IPriceOracle {
	function assetPrices(IDevDefiPool _zPool) external view returns (uint256 collateralPrice_, uint256 loanPrice_); 
} 

contract TimeLock {

    enum Functions { 
        TRANSFER_OWNER_SHIP, // 0
        CHANGE_UINT_CONFIG, // 1
        CHANGE_BORROW_ROUTING_CONTRACT, // 2
        CHANGE_RATE_CONTRACT, // 3
        CHANGE_PRICE_ORACLE_CONTRACT,  // 4
        CHANGE_DEV_DEFI_INFO_CONTRACT, // 5
        SET_POOL, // 6
        CONNECT_TO_ANOTHER_POOL, // 7
        CONNECT_TO_ALL_ANOTHER_POOL, // 8
        DISCONNECT_TO_ANOTHER_POOL, // 9
        CHANGE_CONTROLLER_FEE_ADDR, // 10
        CHANGE_ACTION_STATUS // 11
    } 

    using SafeMath for uint256;
  
    address public owner;

    mapping(Functions => LockTransaction) public lockTransactionOf;

    uint256 public constant GRACE_PERIOD = 30 days;
    uint256 public constant MINIMUM_DELAY = 3 days;
    uint256 public constant MAXIMUM_DELAY = 30 days;
    uint256 public DELAY;

    struct LockTransaction {
        bool queued;
        uint256 executeTime;
    }

    modifier onlyOwner()
    {
        require(msg.sender == owner, 'ONLY_OWNER');
        _;
    }

    modifier isQueued(Functions _fn) 
    {
        LockTransaction memory _lock = lockTransactionOf[_fn];
        require(_lock.queued == true, "TLConf::01");
        require(_lock.executeTime <= block.timestamp, "TLConf::02");
        require(_lock.executeTime.add(GRACE_PERIOD) >= block.timestamp, "TLConf::03");
        _;
    }

    event onQueuedTransaction(Functions _fn, uint256 _executeTime);
    event onCancelTransaction(Functions _fn);

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

    function setDelay(uint delay_) public onlyOwner {
        require(delay_ >= MINIMUM_DELAY);
        require(delay_ <= MAXIMUM_DELAY);
        DELAY = delay_;
    }

    function cancelTransaction(Functions _fn) public onlyOwner 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[_fn];
        /*------------------------- handle -------------------------------------*/
        _lock.queued = false;
        /*------------------------- response -------------------------------------*/
        emit onCancelTransaction(_fn);
    }

    function queuedTransaction(Functions _fn) public onlyOwner 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[_fn];
        /*------------------------- handle -------------------------------------*/
        _lock.executeTime = block.timestamp.add(DELAY);
        _lock.queued = true;
        /*------------------------- response -------------------------------------*/
        emit onQueuedTransaction(_fn, _lock.executeTime);
    }

    function transferOwnership(address _owner) public onlyOwner isQueued(Functions.TRANSFER_OWNER_SHIP) 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[Functions.TRANSFER_OWNER_SHIP];
        /*------------------------- validate -----------------------------------*/
        require(_owner != address(0), "INVALID_ADDRESS");
        /*------------------------- handle -------------------------------------*/
        owner = _owner;
        _lock.queued = false;
    }
}

contract DevDefiPool is TimeLock, ReentrancyGuard {

    IBEP20 public BASE; // Base of token zBNB: BASE = WBNB - original token
    uint256 public POOL_IDX;

    IDevDefiInfo public DevDefiInfoContract;
    InterfaceRate public RateContract;
    IPriceOracle public PriceOracleContract;

    address public borrowRoutingContract;
    address public controllerFeeAddr;

    mapping(address => uint256) public sharesOf; // 
    mapping(address => uint256) public supplyOf; //
   
    uint256 public totalSupplier;
    uint256 public totalBorrower;

    address[] public borrowerList;
    mapping(address => bool) private _isCollateral;
    mapping(address => bool) private _isSupplier;
    mapping(address => bool) private _isBorrower;

    uint256 public totalDeposit;
    uint256 public totalDemand;
    uint256 public totalControllerFee;
    uint256 public totalShare;
    uint256 public latestTotalBalance;

    bool public isDisableSupply;
    bool public isDisableWithdraw;
    bool public isDisableBorrow;
    bool public isDisableRepay;
    bool public isDisableLiquidate;

    uint256 public RATE_OF_CONTROLLER_FEE = 50; // 0.5% 50 / 10000
    uint256 public UNDERQUOTED_LIQUIDATION_RATE = 92; // 92%

    uint256 public DAY_PERIOD = 60 * 60 * 24; // 24h

    mapping(address => Borrower) private borrowerInfo;

    struct Borrower {
        uint256 principal; 
        uint256 joinTime;
        uint256 lastDayRepay;
    }

    event onChangeUintConfig(uint256 _rateOfControllerFee, uint256 _underquotedLiquidationRate, uint256 _dayPeriod);
    event onChangeActionStatus(uint8 _isDisableSupply, uint8 _isDisableBorrow, uint8 _isDisableWithdraw, uint8 _isDisableRepay, uint8 _isDisableLiquidate);

    event onEnableCollateral(uint256 _pid, address _user);
    event onDisableCollateral(uint256 _pid, address _user);

    event onSupply(uint256 _pid, address indexed _user, uint _amount, uint256 _shares);
    event onWithdrawal(uint256 _pid, address indexed _user, uint _amount, uint256 _shares);
    event onWithdrawControllerFee(uint256 _pid, address indexed _userCall, address _controllerFeeAddr, uint256 _amount);
    event onBorrow(uint256 _pid, address indexed _user, uint _amount);
    event onRepay(uint256 _pid, address indexed _user, uint _amount);
    event onRepayInterest(uint256 _pid, address indexed _user, uint _amount, uint256 _controllerFee);
    event onRepayPrincipal(uint256 _pid, address indexed _user, uint _amount);

    event onUpdateUserByRepay(uint256 _pid, address indexed _user, uint256 _principal, uint256 _dayToRepay);
    event onLiquidate(uint256 _pidOfLoan, uint256 _pidOfCollateral, address _adjudicator, address _borrowerAddr, uint256 _repayAmt, uint256 _collateralAmt, uint256 _collateralPrice, uint256 _loanPrice, uint256 _underquotedLiquidationRate);

    constructor(
        IBEP20 _baseToken,
        InterfaceRate _rateContract,
        IDevDefiInfo _devDefiInfoContract,
        IPriceOracle _priceOracleContract
        ) public {
        RateContract = _rateContract;
        DevDefiInfoContract = _devDefiInfoContract;
        PriceOracleContract = _priceOracleContract;

        BASE = _baseToken;

        controllerFeeAddr = msg.sender;
    }

    function changeUintConfig(uint256 _rateOfControllerFee, uint256 _underquotedLiquidationRate, uint256 _dayPeriod) external onlyOwner isQueued(Functions.CHANGE_UINT_CONFIG) 
    {
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_UINT_CONFIG];

        RATE_OF_CONTROLLER_FEE = _rateOfControllerFee;
        UNDERQUOTED_LIQUIDATION_RATE = _underquotedLiquidationRate;
        DAY_PERIOD = _dayPeriod;
        
        _lock.queued = false;

        emit onChangeUintConfig(_rateOfControllerFee, _underquotedLiquidationRate, _dayPeriod);
    }

    function changeActionStatus(uint8 _isDisableSupply, uint8 _isDisableBorrow, uint8 _isDisableWithdraw, uint8 _isDisableRepay, uint8 _isDisableLiquidate) external onlyOwner isQueued(Functions.CHANGE_ACTION_STATUS) 
    {
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_ACTION_STATUS];

        if (_isDisableSupply == 1) {
            isDisableSupply = true;
        } else {
            isDisableSupply = false;
        }

        if (_isDisableBorrow == 1) {
            isDisableBorrow = true;
        } else {
            isDisableBorrow = false;    
        }

        if (_isDisableWithdraw == 1) {
            isDisableWithdraw = true;
        } else {
            isDisableWithdraw = false;
        }

        if (_isDisableRepay == 1) {
            isDisableRepay = true;
        } else {
            isDisableRepay = false;
        }

        if (_isDisableLiquidate == 1) {
            isDisableLiquidate = true;
        } else {
            isDisableLiquidate = false;
        }
        
        _lock.queued = false;

        emit onChangeActionStatus(_isDisableSupply, _isDisableBorrow, _isDisableWithdraw, _isDisableRepay, _isDisableLiquidate);
    }

    function changeBorrowRoutingContract(address _addr) external onlyOwner isQueued(Functions.CHANGE_BORROW_ROUTING_CONTRACT) 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_BORROW_ROUTING_CONTRACT];
        /*------------------------- validate -----------------------------------*/
        require(_addr != address(0), "[INVALID]::ADDRESS");
        /*------------------------- handle -------------------------------------*/
        borrowRoutingContract = _addr;
        _lock.queued = false;
        /*------------------------- response -------------------------------------*/
    }
   /**
    * Action::changeControllerFeeAddr
    */
    function changeControllerFeeAddr(address _addr) external onlyOwner isQueued(Functions.CHANGE_CONTROLLER_FEE_ADDR) 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_CONTROLLER_FEE_ADDR];
        /*------------------------- validate -----------------------------------*/
        require(_addr != address(0), "[INVALID]::ADDRESS");
        /*------------------------- handle -------------------------------------*/
        controllerFeeAddr = _addr;
        _lock.queued = false;
        /*------------------------- response -------------------------------------*/
    }
    /**
    * Action::changeRateContract
    */
    function changeRateContract(address _addr) external onlyOwner isQueued(Functions.CHANGE_RATE_CONTRACT) 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_RATE_CONTRACT];
        /*------------------------- validate -----------------------------------*/
        require(_addr != address(0), "[INVALID]::ADDRESS");
        /*------------------------- handle -------------------------------------*/
        RateContract = InterfaceRate(_addr);
        _lock.queued = false;
        /*------------------------- response -------------------------------------*/
    }
    /**
    * Action::changePriceOracleContract
    */
    function changePriceOracleContract(address _addr) external onlyOwner isQueued(Functions.CHANGE_PRICE_ORACLE_CONTRACT)  
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_PRICE_ORACLE_CONTRACT];
        /*------------------------- validate -----------------------------------*/
        require(_addr != address(0), "[INVALID]::ADDRESS");
        /*------------------------- handle -------------------------------------*/
        PriceOracleContract = IPriceOracle(_addr);
        _lock.queued = false;
        /*------------------------- response -------------------------------------*/
    }  
        
    function changeDevDefiInfo(address _addr) external onlyOwner isQueued(Functions.CHANGE_DEV_DEFI_INFO_CONTRACT) 
    {
        /*------------------------- declare ------------------------------------*/
        LockTransaction storage _lock = lockTransactionOf[Functions.CHANGE_DEV_DEFI_INFO_CONTRACT];
        /*------------------------- validate -----------------------------------*/
        require(_addr != address(0), "[INVALID]::ADDRESS");
        /*------------------------- handle -------------------------------------*/
        DevDefiInfoContract = IDevDefiInfo(_addr);
        _lock.queued = false;
        /*------------------------- response -------------------------------------*/
    }

    function setPool(uint256 _pid) external onlyOwner isQueued(Functions.SET_POOL)  
    {
        LockTransaction storage _lock = lockTransactionOf[Functions.SET_POOL];
        (IDevDefiPool _pool, IBEP20 _baseToken, , , , bool _status) = DevDefiInfoContract.poolInfo(_pid);
        require(address(_pool) == address(this), '[INVALID]::Zethyr Pool');
        require(address(_baseToken) == address(BASE), '[INVALID]::Base Token');
        require(_status == true, '[INVALID]::Pool Status');

        POOL_IDX = _pid;
        _lock.queued = false;
    }

    function connectToAllAnotherPool() external onlyOwner isQueued(Functions.CONNECT_TO_ALL_ANOTHER_POOL)  
    {
        LockTransaction storage _lock = lockTransactionOf[Functions.CONNECT_TO_ALL_ANOTHER_POOL];

        uint256 _totalPool = DevDefiInfoContract.getTotalPool();

        for (uint256 _idx = 0; _idx < _totalPool; _idx++) {
             (IDevDefiPool _pool, IBEP20 _baseToken, , , , bool _status) = DevDefiInfoContract.poolInfo(_idx);    
             if (
                _idx != POOL_IDX &&
                _status == true &&
                address(_baseToken) != address(BASE) 
                ) {
                _baseToken.approve(address(_pool), uint256(-1));
             } 
        } 
        _lock.queued = false;
    }

    function connectToAnotherPool(uint256 _pid) external onlyOwner isQueued(Functions.CONNECT_TO_ANOTHER_POOL)  
    {
        LockTransaction storage _lock = lockTransactionOf[Functions.CONNECT_TO_ANOTHER_POOL];
        (IDevDefiPool _pool, IBEP20 _baseToken, , , , bool _status) = DevDefiInfoContract.poolInfo(_pid);
        require(_pid != POOL_IDX, '[INVALID]::Pool Status');
        require(_status == true, '[INVALID]::Pool Status');

        _baseToken.approve(address(_pool), uint256(-1));
        _lock.queued = false;
    }

    function disconnectToAnotherPool(uint256 _pid) external onlyOwner isQueued(Functions.DISCONNECT_TO_ANOTHER_POOL)  
    {
        LockTransaction storage _lock = lockTransactionOf[Functions.DISCONNECT_TO_ANOTHER_POOL];
        (IDevDefiPool _pool, IBEP20 _baseToken, , , , ) = DevDefiInfoContract.poolInfo(_pid);
        require(_pid != POOL_IDX, '[INVALID]::Pool Status');
        // require(_status == true, '[INVALID]::Pool Status');

        _baseToken.approve(address(_pool), uint256(0));
        _lock.queued = false;
    }
    
    function enableCollateral() external virtual nonReentrant returns(bool) 
    {
        require(_isCollateral[msg.sender] == false, 'INVALID_COLLATERAL');
        require(DevDefiInfoContract.verifyEnableCollateral(POOL_IDX, msg.sender) == true, '[INVALID]::ENABLE_COLLATERAL');
    
        _isCollateral[msg.sender] = true;
        
        emit onEnableCollateral(POOL_IDX, msg.sender);
        return true;
    }
    
    function disableCollateral() external virtual nonReentrant returns(bool) 
    {
        require(_isCollateral[msg.sender] == true, 'INVALID_COLLATERAL');
        require(DevDefiInfoContract.verifyBurn(POOL_IDX, msg.sender, balanceOf(msg.sender)) == true, 'INVALID_BURN');
        _isCollateral[msg.sender] = false;

        emit onDisableCollateral(POOL_IDX, msg.sender);
        return true;

    }

    function borrow(address _borrower, uint256 _amount) external virtual nonReentrant returns(bool) 
    {
        /*------------------------- declare ------------------------------------*/
        /*------------------------- validate -----------------------------------*/
        require(isDisableBorrow == false, 'ACTION_IS_DISABLED');
        if (msg.sender != borrowRoutingContract) {
            require(msg.sender == _borrower, 'INVALID_PERMISTION');
        }
        require(_amount > 0, '[INVALID]::AMOUNT');
        require(DevDefiInfoContract.isBorrowerNeedLiquidate(_borrower) == false, '[INVALID]::LIQUIDATE'); 
        require(DevDefiInfoContract.verifyBorrow(POOL_IDX, _borrower, _amount) == true, '[INVALID]::BORROW');
        /*------------------------- handle -------------------------------------*/
        harvest();

        uint256 _liquidityAmt = getLiquidityBalance();
        require(_liquidityAmt >= _amount, '[INVALID]::INVALID_LIQUIDITY_AMT');
        // update total demand
        totalDemand = totalDemand.add(_amount);
        // update principal of borrower
        Borrower storage _b = borrowerInfo[_borrower];
        uint256 _currentPrincipal = _b.principal;

         _b.principal = _b.principal.add(_amount);
        
        if (_currentPrincipal == 0) {
          _b.joinTime     = now;
          _b.lastDayRepay = 0;
        }
        // update total borrower
        if (_isBorrower[_borrower] == false) {
            _isBorrower[_borrower] = true;
            borrowerList.push(msg.sender);
            totalBorrower = totalBorrower.add(1);
        }
        // transfer borrowing to borrower.
        BASE.transfer(_borrower, _amount);
        _updateBalance();
        /*------------------------ emit event ----------------------------------*/
        emit onBorrow(POOL_IDX, _borrower, _amount);
        /*------------------------ Done ----------------------------------*/
        return true;
    }

    function liquidate(address _borrower, uint256 _pidOfLoan, uint256 _liquidateAmt) external virtual nonReentrant returns(bool)  
    {
        require(isDisableLiquidate == false, 'ACTION_IS_DISABLED');

        (IDevDefiPool _pool, , , , , bool _statusOfPool) = DevDefiInfoContract.poolInfo(_pidOfLoan);
        /*------------------------- validate -----------------------------------*/
        require(_borrower != address(0), '[INVALID]::BORROWER');
        require(DevDefiInfoContract.isBorrowerNeedLiquidate(_borrower) == true, 'INVALID_PERMISTION');
        require(_pidOfLoan >= 0, '[INVALID]::POOL');
        require(_pidOfLoan != POOL_IDX, '[INVALID]::POOL');
        require(_liquidateAmt > 0, '[INVALID]::LIQUIDATE_AMT');
        require(_statusOfPool == true, '[INVALID]::POOL');
        
        (bool _canLiquidation, uint256 _collateralGet, uint256 _liquidateAmtNeed, uint256 _collateralPrice, uint256 _loanPrice) = estimateLiquidate(_pool, _borrower, _pidOfLoan, _liquidateAmt);
        
        require(_canLiquidation == true, '[INVALID]::CANNOT_LIQUIDATE');
        require(_collateralGet > 0, '[INVALID]::COLLATERAL_AMOUNT_GET');
        require(_liquidateAmtNeed > 0, '[INVALID]::LIQUIDATE_AMT_MIN');
        /*------------------------- handle -------------------------------------*/
        harvest();

        _liquidate(_pidOfLoan, _borrower, _liquidateAmtNeed, _collateralGet);

        _updateUserSupply(_borrower);
        _updateBalance();
        /*------------------------ emit event ----------------------------------*/
        emit onLiquidate(_pidOfLoan, POOL_IDX, msg.sender, _borrower, _liquidateAmtNeed, _collateralGet, _collateralPrice, _loanPrice, UNDERQUOTED_LIQUIDATION_RATE);      
        /*------------------------ Done ----------------------------------*/
        return true;   
    }

    function repay(address _borrower, uint256 _amount) external virtual nonReentrant returns(bool)
    {
        require(isDisableRepay == false, 'ACTION_IS_DISABLED');
        /*------------------------- declare ------------------------------------*/
        Borrower storage _b = borrowerInfo[_borrower];
        uint256 _amountRepay = _amount;
        // get borrower detail
        (uint256 _principal, uint256 _amountOwed, uint256 _dayToRepayInterest, uint256 _numberDayToBorrow) = getBorrowerDetail(_borrower);
        /*------------------------- validate -----------------------------------*/
        require(_dayToRepayInterest >= 0, '[INVALID]::DAY_TO_REPAY_INTEREST');
        require(_principal > 0, '[INVALID]::PRINCIPAL');
        require(_amount > 0, '[INVALID]::AMOUNT');
        require(_amountOwed >= _principal, '[INVALID]::OWED');
        require(_amount >= _amountOwed.sub(_principal), '[INVALID]::REPAY_AMOUNT');
        /*------------------------- handle -------------------------------------*/
        harvest();
        if (_amountRepay > _amountOwed) {
            _amountRepay = _amountOwed;
        }
        // Get princial token to repay for borrower.
        BASE.transferFrom(msg.sender, address(this), _amountRepay);
        _repay(msg.sender, _principal, _amountOwed, _amountRepay);
        // calculate new principal of borrower
        _principal = _amountOwed.sub(_amountRepay);
         // update user's info 
        _b.principal    = _principal;
        _b.lastDayRepay = _numberDayToBorrow;
         // update total borrower
        if (borrowerInfo[_borrower].principal <= 0) {
            _isBorrower[_borrower] = false;
            totalBorrower = totalBorrower.sub(1);
        }
        _updateBalance();
        /*------------------------ emit event ----------------------------------*/
        emit onRepay(POOL_IDX, _borrower, _amountRepay); 
        /*------------------------ Done ----------------------------------*/
        return true;
    }
     
    function supply(uint256 _amount) external virtual nonReentrant returns (bool) 
    {
        require(isDisableSupply == false, 'ACTION_IS_DISABLED');
        uint256 _uBal = BASE.balanceOf(msg.sender);
        if (_amount > _uBal) {
            _amount = _uBal;
        }
        /*------------------------- validate -----------------------------------*/
        require(_amount > 0, "INVALID_AMOUNT");
        require(DevDefiInfoContract.verifySupply(POOL_IDX, msg.sender) == true, '[INVALID]::SUPPLY');
        /*------------------------- handle -------------------------------------*/
        harvest();
        uint256 _pool = getTotalSupply();
        // Get the principal token from user.
        BASE.transferFrom(msg.sender, address(this), _amount);

        uint256 _shares = 0;
        if (totalShare == 0) {
            _shares = _amount;
        } else {
            _shares = (_amount.mul(totalShare)).div(_pool);
        }
        sharesOf[msg.sender] = sharesOf[msg.sender].add(_shares);
        supplyOf[msg.sender] = supplyOf[msg.sender].add(_amount);

        totalDeposit = totalDeposit.add(_amount);
        totalShare = totalShare.add(_shares);
        // update total supplier
        if (_isSupplier[msg.sender] == false) {
            _isSupplier[msg.sender] = true;
            totalSupplier = totalSupplier.add(1);
        }
        _updateBalance();
        /*------------------------ emit event ----------------------------------*/
        emit onSupply(POOL_IDX, msg.sender, _amount, _shares);
        /*------------------------ Done ----------------------------------*/
        return true;
    }

    function withdraw(uint256 _amount) external virtual nonReentrant returns (bool) 
    {
        require(isDisableWithdraw == false, 'ACTION_IS_DISABLED');
        /*------------------------- validate -----------------------------------*/
        require(_amount > 0, "INVALID_AMOUNT");
        /*------------------------- handle -------------------------------------*/
        harvest();
        uint256 _uBal = balanceOf(msg.sender);
        uint256 _liquidityAmt = getLiquidityBalance();
        if (_amount > _uBal) {
            _amount = _uBal;
        }
        if (_liquidityAmt < _amount) {
            _amount = _liquidityAmt;
        }
        require(DevDefiInfoContract.verifyBurn(POOL_IDX, msg.sender, _amount) == true, 'INVALID_BURN');
        
        uint256 _pool = getTotalSupply();
        uint256 _shares = _amount.mul(totalShare).div(_pool);

        if (_shares > sharesOf[msg.sender]) {
            _shares = sharesOf[msg.sender];
        }

        sharesOf[msg.sender] = sharesOf[msg.sender].sub(_shares);
        totalShare = totalShare.sub(_shares);

        // update total supplier
        if (balanceOf(msg.sender) <= 0) {
            _isSupplier[msg.sender] = false;
            totalSupplier = totalSupplier.sub(1);
        }
        BASE.transfer(msg.sender, _amount);

        _updateUserSupply(msg.sender);
        _updateBalance();
        /*------------------------ emit event ----------------------------------*/
        emit onWithdrawal(POOL_IDX, msg.sender, _amount, _shares);
        /*------------------------ Done ----------------------------------*/
        return true;
    }
    function harvest() public {
        
        uint256 _totalBalance = getTotalBalance();

        if (_totalBalance > latestTotalBalance) {
            uint256 _reward = _totalBalance.sub(latestTotalBalance);
            uint256 _controllerFee = _reward.mul(RATE_OF_CONTROLLER_FEE).div(10000);
            totalControllerFee = totalControllerFee.add(_controllerFee);
        }

        latestTotalBalance = _totalBalance;
    }
    function withdrawControllerFee(uint256 _amount) external virtual nonReentrant returns (bool) 
    {
        /*------------------------- validate -----------------------------------*/
        /*------------------------- handle -------------------------------------*/
        harvest();
        uint256 _available = getAvailableBalance();

        if (_amount > totalControllerFee) {
            _amount = totalControllerFee;
        }
        if (_available < _amount) {
            _amount = _available;
        }

        totalControllerFee = totalControllerFee.sub(_amount);

        BASE.transfer(controllerFeeAddr, _amount);
        _updateBalance();
        /*------------------------ emit event ----------------------------------*/
        emit onWithdrawControllerFee(POOL_IDX, msg.sender, controllerFeeAddr, _amount);
        /*------------------------ Done ----------------------------------*/
        return true;
    }
    /**
    * ----------------------------------------------------------------------------
    * PRIVATE FUNCTION
    * ----------------------------------------------------------------------------
    */
    function _updateBalance() private {
        latestTotalBalance = getTotalBalance();
    }
    function _updateUserSupply(address _user) private 
    {
        uint256 _uBal = balanceOf(_user);
        uint256 _uSupply = supplyOf[_user];
        if (_uSupply >= _uBal) {
            supplyOf[_user] = _uBal;
            totalDeposit = totalDeposit.sub(_uSupply).add(_uBal);
        } 
    }

    function _liquidate(uint256 _pidOfLoan, address _borrower, uint256 _liquidateAmt, uint256 _collateralAmt) private 
    {
        (IDevDefiPool _pool, IBEP20 _baseToken, , , , ) = DevDefiInfoContract.poolInfo(_pidOfLoan);

        require(_baseToken.balanceOf(msg.sender) >= _liquidateAmt, '[INVALID]::REPAY_AMOUNT');

        _baseToken.transferFrom(msg.sender, address(this), _liquidateAmt);

        if (_pool.repay(_borrower, _liquidateAmt) == false) {
            revert('[FAILURE]::REPAY_FOR_BORROWER');
        }
        uint256 _liquidityAmt = getLiquidityBalance();
        require(_liquidityAmt >= _collateralAmt, '[INVALID]::INVALID_LIQUIDITY_AMT');
        
        uint256 _shares = _collateralAmt.mul(totalShare).div(getTotalSupply());

        if (_shares > sharesOf[_borrower]) {
            _shares = sharesOf[_borrower];
        }

        sharesOf[_borrower] = sharesOf[_borrower].sub(_shares);

        totalShare = totalShare.sub(_shares);

        if (balanceOf(_borrower) <= 0) {
            _isSupplier[_borrower] = false;
            totalSupplier = totalSupplier.sub(1);
        }
        BASE.transfer(msg.sender, _collateralAmt);
    }
    /**
    * Action::Internall::_repay
    */
    function _repay(address _borrower, uint256 _principal, uint256 _amountOwed, uint256 _amountRepay) private 
    {
        uint256 _interestPay  = _amountOwed.sub(_principal);
        uint256 _principalPay = _amountRepay.sub(_interestPay);

        if (_principalPay > _principal) {
            _principalPay = _principal;
        }
        if (_interestPay > 0) { 
            uint256 _controllerFee = _interestPay.mul(RATE_OF_CONTROLLER_FEE).div(10000);
            totalControllerFee = totalControllerFee.add(_controllerFee);
            emit onRepayInterest(POOL_IDX, _borrower, _interestPay, _controllerFee);
        }

        if (_principalPay > 0) {
            totalDemand = totalDemand.sub(_principalPay);
            emit onRepayPrincipal(POOL_IDX, _borrower, _principalPay);
        }
    }
   
    function estimateLiquidate(IDevDefiPool _poolOfLoan, address _borrower, uint256 _pidOfLoan, uint256 _liquidateAmt) public view returns(bool canLiquidation_, uint256 collateralGet_, uint256 liquidateAmtNeed_, uint256 collateralPrice_, uint256 loanPrice_) {                
         // get borrower detail
        (uint256 _principal, uint256 _amountOwed, , ) = _poolOfLoan.getBorrowerDetail(_borrower);

        require(_amountOwed >= _principal, '[INVALID]::OWED');

        if (_liquidateAmt > _amountOwed) {
            _liquidateAmt = _amountOwed;
        }
        uint256 _maxLiquidateAmt = DevDefiInfoContract.getMaxLiquidationAmount(_pidOfLoan, _borrower);
        if (_liquidateAmt > _maxLiquidateAmt) {
            _liquidateAmt = _maxLiquidateAmt;
        }
        require(_liquidateAmt >= _amountOwed.sub(_principal), '[INVALID]::REPAY_AMOUNT');

        (collateralPrice_, ) = PriceOracleContract.assetPrices(IDevDefiPool(address(this)));
        ( ,  loanPrice_) = PriceOracleContract.assetPrices(IDevDefiPool(address(_poolOfLoan)));
        uint256 _collateralAmt = 0;

        if (collateralPrice_ > 0) {
            _collateralAmt = _liquidateAmt.mul(loanPrice_).mul(100).div(collateralPrice_.mul(UNDERQUOTED_LIQUIDATION_RATE));
        }
        require(_collateralAmt > 0, '[INVALID]::COLLATERAL_AMOUNT_GET');
        require(balanceOf(_borrower) >= _collateralAmt, '[INVALID]::COLLATERAL_AMOUNT_OF_BORROWER');
        /*------------------------ response ----------------------------------*/
        liquidateAmtNeed_ = _liquidateAmt;
        collateralGet_ = _collateralAmt;
        canLiquidation_ = true;
    } 
   
    function balanceOf(address _addr) public view returns(uint256) 
    {
        if (totalShare <= 0) {
            return 0;
        }
        return (getTotalSupply().mul(sharesOf[_addr])).div(totalShare);
    }

    function getCollateralOf(address _borrower) public view returns(uint256) 
    {
        if (_isCollateral[_borrower] == false) {
          return 0;
        } 
        return balanceOf(_borrower);
    }

    function getPrincipalOf(address _borrower) public view returns(uint256) 
    {
        return borrowerInfo[_borrower].principal;
    }

    function getBaseToken() public view returns(address) 
    {
        return address(BASE);
    }

    function isCollateral(address _borrower) public view returns(bool) 
    {
        return _isCollateral[_borrower];
    }

    function getData() public view returns(uint256 totalSupply_, uint256 totalDemand_, uint256 liquidityAmt_, uint256 borrowAPY_, uint256 supplyAPY_) 
    {
        totalDemand_ = totalDemand;
        totalSupply_  = getTotalSupply();
        liquidityAmt_ = getLiquidityBalance();
        borrowAPY_ = RateContract.calBorrowRate(totalDemand_, totalSupply_);
        if (totalSupply_ > 0) {
            supplyAPY_ = borrowAPY_.mul(totalDemand_).div(totalSupply_);
        }
    }

    function getUserDetail(address _user) public view returns(uint256 supplyBal_, uint256 interestPending_, uint256 baseTokenBal_, uint256 bnbBal_, bool isCollateral_ ) 
    {
        supplyBal_ = supplyOf[_user];
        baseTokenBal_ = BASE.balanceOf(_user);
        bnbBal_ = address(_user).balance;
        isCollateral_ = _isCollateral[_user];

        uint256 _uBalance = balanceOf(_user);
        if (_uBalance > supplyBal_) {
            interestPending_ = _uBalance.sub(supplyBal_);
        }
    } 

    /**
    * LOAD::getBorrowerDetail
    */
    function getBorrowerDetail(address _borrower) public view returns(uint256 principal_, uint256 amountOwed_, uint256 dayToRepayInterest_, uint256 numberDayToBorrow_) 
    {
        principal_        = borrowerInfo[_borrower].principal;
        amountOwed_       = getAmountOwed(_borrower);  
        ( numberDayToBorrow_, dayToRepayInterest_) = _countDayNeedToRepayInterest(borrowerInfo[_borrower].lastDayRepay, borrowerInfo[_borrower].joinTime);
    }
    /**
    * GET getAmountOwed
    */
    function getAmountOwed(address _borrower) public view returns(uint256) 
    {
        if (borrowerInfo[_borrower].principal <= 0) {
          return 0;
        }
        uint256 dayToRepayInterest;
        (, dayToRepayInterest) = _countDayNeedToRepayInterest(borrowerInfo[_borrower].lastDayRepay, borrowerInfo[_borrower].joinTime);
        uint256 _borrowerAPR = RateContract.calBorrowRate(totalDemand, getTotalSupply()); 
        uint256 _totalOwed   = borrowerInfo[_borrower].principal;

        for (uint256 idx = 0; idx < dayToRepayInterest; idx++) {
          _totalOwed = _totalOwed.add(_totalOwed.mul(_borrowerAPR).div(365 * 1e12));
        }
        return _totalOwed;
    }
    
    /**
    * CALCULATION countDayNeedToRepayInterest
    */
    function _countDayNeedToRepayInterest(uint256 _lastDayRepay, uint256 _joinTime) private view returns(uint256 numberDayToBorrow_, uint256 dayToRepayInterest_) 
    {
        if (_joinTime > 0) {
          numberDayToBorrow_  = (now.sub(_joinTime)).div(DAY_PERIOD);
          numberDayToBorrow_  = numberDayToBorrow_.add(1);
          dayToRepayInterest_ = numberDayToBorrow_.sub(_lastDayRepay);
        }
    }

    function getLiquidityBalance() public view returns(uint256)
    {
        uint256 _available = getAvailableBalance();
        uint256 _liquidityAmt = 0;
        if (_available > totalControllerFee) {
            _liquidityAmt = _available.sub(totalControllerFee);
        }
        return _liquidityAmt;
    }

    function getAvailableBalance() public view returns(uint256) 
    {
        return BASE.balanceOf(address(this));
    }

    function getTotalBalance() public view returns(uint256) 
    {
        return getAvailableBalance().add(totalDemand);
    }

    function getTotalSupply() public view returns(uint256) 
    {
        uint256 _totalBalance = getTotalBalance();
        uint256 _totalControllerFee = getTotalControllerFee();
        if (_totalControllerFee > _totalBalance) {
            return 0;
        }
        return _totalBalance.sub(_totalControllerFee);
    }

    function getTotalControllerFee() public view returns(uint256) 
    {
        uint256 _totalBalance = getTotalBalance();
        uint256 _totalControllerFee = totalControllerFee;
        if (_totalBalance > latestTotalBalance) {
            uint256 _reward = _totalBalance.sub(latestTotalBalance);
            uint256 _controllerFee = _reward.mul(RATE_OF_CONTROLLER_FEE).div(10000);
            _totalControllerFee = _totalControllerFee.add(_controllerFee);
        }
        return _totalControllerFee;
    }

    function getBorrowerList() public view returns(address[] memory) 
    {
        return borrowerList;
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IBEP20","name":"_baseToken","type":"address"},{"internalType":"contract InterfaceRate","name":"_rateContract","type":"address"},{"internalType":"contract IDevDefiInfo","name":"_devDefiInfoContract","type":"address"},{"internalType":"contract IPriceOracle","name":"_priceOracleContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum TimeLock.Functions","name":"_fn","type":"uint8"}],"name":"onCancelTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_isDisableSupply","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_isDisableBorrow","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_isDisableWithdraw","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_isDisableRepay","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"_isDisableLiquidate","type":"uint8"}],"name":"onChangeActionStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_rateOfControllerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_underquotedLiquidationRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dayPeriod","type":"uint256"}],"name":"onChangeUintConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_user","type":"address"}],"name":"onDisableCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_user","type":"address"}],"name":"onEnableCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pidOfLoan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pidOfCollateral","type":"uint256"},{"indexed":false,"internalType":"address","name":"_adjudicator","type":"address"},{"indexed":false,"internalType":"address","name":"_borrowerAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_repayAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_collateralAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_collateralPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_loanPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_underquotedLiquidationRate","type":"uint256"}],"name":"onLiquidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum TimeLock.Functions","name":"_fn","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_executeTime","type":"uint256"}],"name":"onQueuedTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onRepay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_controllerFee","type":"uint256"}],"name":"onRepayInterest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onRepayPrincipal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"onSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_principal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dayToRepay","type":"uint256"}],"name":"onUpdateUserByRepay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_userCall","type":"address"},{"indexed":false,"internalType":"address","name":"_controllerFeeAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onWithdrawControllerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"onWithdrawal","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAY_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DevDefiInfoContract","outputs":[{"internalType":"contract IDevDefiInfo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_IDX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PriceOracleContract","outputs":[{"internalType":"contract IPriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RATE_OF_CONTROLLER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RateContract","outputs":[{"internalType":"contract InterfaceRate","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNDERQUOTED_LIQUIDATION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrowRoutingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"borrowerList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum TimeLock.Functions","name":"_fn","type":"uint8"}],"name":"cancelTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_isDisableSupply","type":"uint8"},{"internalType":"uint8","name":"_isDisableBorrow","type":"uint8"},{"internalType":"uint8","name":"_isDisableWithdraw","type":"uint8"},{"internalType":"uint8","name":"_isDisableRepay","type":"uint8"},{"internalType":"uint8","name":"_isDisableLiquidate","type":"uint8"}],"name":"changeActionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"changeBorrowRoutingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"changeControllerFeeAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"changeDevDefiInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"changePriceOracleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"changeRateContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rateOfControllerFee","type":"uint256"},{"internalType":"uint256","name":"_underquotedLiquidationRate","type":"uint256"},{"internalType":"uint256","name":"_dayPeriod","type":"uint256"}],"name":"changeUintConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"connectToAllAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"connectToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controllerFeeAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableCollateral","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"disconnectToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableCollateral","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IDevDefiPool","name":"_poolOfLoan","type":"address"},{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"uint256","name":"_pidOfLoan","type":"uint256"},{"internalType":"uint256","name":"_liquidateAmt","type":"uint256"}],"name":"estimateLiquidate","outputs":[{"internalType":"bool","name":"canLiquidation_","type":"bool"},{"internalType":"uint256","name":"collateralGet_","type":"uint256"},{"internalType":"uint256","name":"liquidateAmtNeed_","type":"uint256"},{"internalType":"uint256","name":"collateralPrice_","type":"uint256"},{"internalType":"uint256","name":"loanPrice_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"}],"name":"getAmountOwed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"}],"name":"getBorrowerDetail","outputs":[{"internalType":"uint256","name":"principal_","type":"uint256"},{"internalType":"uint256","name":"amountOwed_","type":"uint256"},{"internalType":"uint256","name":"dayToRepayInterest_","type":"uint256"},{"internalType":"uint256","name":"numberDayToBorrow_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBorrowerList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"}],"name":"getCollateralOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getData","outputs":[{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint256","name":"totalDemand_","type":"uint256"},{"internalType":"uint256","name":"liquidityAmt_","type":"uint256"},{"internalType":"uint256","name":"borrowAPY_","type":"uint256"},{"internalType":"uint256","name":"supplyAPY_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"}],"name":"getPrincipalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalControllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserDetail","outputs":[{"internalType":"uint256","name":"supplyBal_","type":"uint256"},{"internalType":"uint256","name":"interestPending_","type":"uint256"},{"internalType":"uint256","name":"baseTokenBal_","type":"uint256"},{"internalType":"uint256","name":"bnbBal_","type":"uint256"},{"internalType":"bool","name":"isCollateral_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"}],"name":"isCollateral","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDisableBorrow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDisableLiquidate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDisableRepay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDisableSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDisableWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTotalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"uint256","name":"_pidOfLoan","type":"uint256"},{"internalType":"uint256","name":"_liquidateAmt","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum TimeLock.Functions","name":"","type":"uint8"}],"name":"lockTransactionOf","outputs":[{"internalType":"bool","name":"queued","type":"bool"},{"internalType":"uint256","name":"executeTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum TimeLock.Functions","name":"_fn","type":"uint8"}],"name":"queuedTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delay_","type":"uint256"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"supply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalControllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDemand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawControllerFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526032601955605c601a5562015180601b553480156200002257600080fd5b506040516200605038038062006050833981810160405260808110156200004857600080fd5b5080516020820151604083015160609093015160008054336001600160a01b03199182168117835560016003556007805483166001600160a01b0396871617905560068054831697861697909717909655600880548216938516939093179092556004805483169390941692909217909255600a80549092169092179055615f79908190620000d790396000f3fe608060405234801561001057600080fd5b506004361061041d5760003560e01c80638bd1358d1161022b578063c978736011610130578063f21e2d86116100b8578063f5eb42dc11610087578063f5eb42dc14610b04578063f6153ccd14610b2a578063f755fe5514610b32578063fa9978e514610b4f578063fb1b919a14610b575761041d565b8063f21e2d8614610aa8578063f2e99ff614610ab0578063f2fde38b14610ab8578063f55970d914610ade5761041d565b8063e70dd625116100ff578063e70dd62514610a53578063e9f42ca514610a73578063ec342ad014610a7b578063ec47199014610a83578063f14a0c6014610aa05761041d565b8063c978736014610a00578063cf1e02ba14610a08578063dab14ec914610a2e578063e177246e14610a365761041d565b8063b15f25c3116101b3578063bc9cd79011610182578063bc9cd790146109aa578063c1a287e214610882578063c3b62d80146109c7578063c4e41b22146109f0578063c66d3f27146109f85761041d565b8063b15f25c314610942578063b1b43ae51461094a578063b3a6652414610952578063bbba68b61461096f5761041d565b80639b09dd62116101fa5780639b09dd62146108fc578063a0a6e72614610904578063a753cbbe1461090c578063aba317a914610914578063aff206571461093a5761041d565b80638bd1358d146108dc5780638da5cb5b146108e45780638ec840f1146108ec57806398acd7a6146108f45761041d565b80634a48c84b1161033157806370a08231116102b957806378a4a65c1161028857806378a4a65c1461085c5780637d645fab146108825780637dc199f11461088a578063809dab6a146108cc57806386657b96146108d45761041d565b806370a08231146107b057806372f6b20b146107d65780637325982a1461082e57806373bb1802146108365761041d565b806356d8776b1161030057806356d8776b1461073d57806360ff87a41461074557806362400e4c1461076557806369b411701461078b57806369eaf2d3146107935761041d565b80634a48c84b1461064d5780634b8a3529146106a05780634c9b48bb146106cc57806352815108146107355761041d565b806332d720fd116103b45780633bdfa920116103835780633bdfa920146105ad5780633fe8ba5c146105d35780634196f382146105f75780634641257d1461061f5780634a42db5e146106275761041d565b806332d720fd1461050957806335403023146105555780633a2c08a7146105725780633bc5de301461057a5761041d565b806322867d78116103f057806322867d78146104b057806326341031146104dc5780632c82d1c3146104e45780632e1a7d4d146104ec5761041d565b8063026c4207146104225780630710285c1461043c5780630ee21e541461048257806312b58349146104a8575b600080fd5b61042a610b5f565b60408051918252519081900360200190f35b61046e6004803603606081101561045257600080fd5b506001600160a01b038135169060208101359060400135610b65565b604080519115158252519081900360200190f35b61046e6004803603602081101561049857600080fd5b50356001600160a01b031661112a565b61042a61114c565b61046e600480360360408110156104c657600080fd5b506001600160a01b038135169060200135611168565b61046e6114e0565b61042a6114ef565b61046e6004803603602081101561050257600080fd5b50356114f5565b61052f6004803603602081101561051f57600080fd5b50356001600160a01b0316611896565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61046e6004803603602081101561056b57600080fd5b50356118f5565b61046e611d03565b610582611eec565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b61042a600480360360208110156105c357600080fd5b50356001600160a01b0316611fa9565b6105db6120de565b604080516001600160a01b039092168252519081900360200190f35b61061d6004803603602081101561060d57600080fd5b50356001600160a01b03166120ed565b005b61061d612314565b61061d6004803603602081101561063d57600080fd5b50356001600160a01b031661237b565b6106736004803603602081101561066357600080fd5b50356001600160a01b03166125a2565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b61046e600480360360408110156106b657600080fd5b506001600160a01b038135169060200135612686565b610708600480360360808110156106e257600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612b98565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b61042a612f74565b6105db612f7a565b61061d6004803603602081101561075b57600080fd5b503560ff16612f89565b61042a6004803603602081101561077b57600080fd5b50356001600160a01b0316613077565b61042a613089565b61046e600480360360208110156107a957600080fd5b503561308f565b61042a600480360360208110156107c657600080fd5b50356001600160a01b031661320b565b6107de613251565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561081a578181015183820152602001610802565b505050509050019250505060405180910390f35b61046e6132b3565b61061d6004803603602081101561084c57600080fd5b50356001600160a01b03166132c1565b61061d6004803603602081101561087257600080fd5b50356001600160a01b03166134e8565b61042a61370f565b61061d600480360360a08110156108a057600080fd5b5060ff813581169160208101358216916040820135811691606081013582169160809091013516613716565b61042a613a12565b61042a613a92565b61042a613a98565b6105db613a9e565b61046e613aad565b6105db613abd565b61046e613acc565b6105db613cad565b61042a613cbc565b61042a6004803603602081101561092a57600080fd5b50356001600160a01b0316613cc2565b61042a613cdd565b6105db613ce3565b61042a613cf2565b6105db6004803603602081101561096857600080fd5b5035613cf9565b61098f6004803603602081101561098557600080fd5b503560ff16613d20565b60408051921515835260208301919091528051918290030190f35b61061d600480360360208110156109c057600080fd5b5035613d3f565b61061d600480360360608110156109dd57600080fd5b5080359060208101359060400135614154565b61042a614360565b61042a61439d565b61042a614406565b61042a60048036036020811015610a1e57600080fd5b50356001600160a01b031661440c565b61046e61443d565b61061d60048036036020811015610a4c57600080fd5b5035614446565b61061d60048036036020811015610a6957600080fd5b503560ff166144b7565b61046e614584565b6105db614594565b61061d60048036036020811015610a9957600080fd5b50356145a3565b61042a61497f565b6105db614985565b61042a614994565b61061d60048036036020811015610ace57600080fd5b50356001600160a01b03166149c2565b61061d60048036036020811015610af457600080fd5b50356001600160a01b0316614be5565b61042a60048036036020811015610b1a57600080fd5b50356001600160a01b0316614e0c565b61042a614e1e565b61061d60048036036020811015610b4857600080fd5b5035614e24565b61042a61525a565b61061d615260565b60165481565b600060026003541415610bad576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b6002600355601854600160201b900460ff1615610c06576040805162461bcd60e51b81526020600482015260126024820152711050d51253d397d254d7d11254d05093115160721b604482015290519081900360640190fd5b60065460408051631526fe2760e01b815260048101869052905160009283926001600160a01b0390911691631526fe27916024808201928692909190829003018186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c0811015610c9357600080fd5b81516020830151604080850180519151939592948301929184600160201b821115610cbd57600080fd5b908301906020820185811115610cd257600080fd5b8251600160201b811182820188101715610ceb57600080fd5b82525081516020918201929091019080838360005b83811015610d18578181015183820152602001610d00565b50505050905090810190601f168015610d455780820380516001836020036101000a031916815260200191505b5060405260600151949650939450505050506001600160a01b038616610da8576040805162461bcd60e51b81526020600482015260136024820152722da4a72b20a624a22e9d1d2127a92927aba2a960691b604482015290519081900360640190fd5b6006546040805163d49071d760e01b81526001600160a01b0389811660048301529151919092169163d49071d7916024808301926020929190829003018186803b158015610df557600080fd5b505afa158015610e09573d6000803e3d6000fd5b505050506040513d6020811015610e1f57600080fd5b50511515600114610e6c576040805162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa822a926a4a9aa24a7a760711b604482015290519081900360640190fd5b600554851415610eb5576040805162461bcd60e51b815260206004820152600f60248201526e16d2539590531251174e8e9413d3d3608a1b604482015290519081900360640190fd5b60008411610f0a576040805162461bcd60e51b815260206004820152601860248201527f5b494e56414c49445d3a3a4c49515549444154455f414d540000000000000000604482015290519081900360640190fd5b600181151514610f53576040805162461bcd60e51b815260206004820152600f60248201526e16d2539590531251174e8e9413d3d3608a1b604482015290519081900360640190fd5b6000806000806000610f67878c8c8c612b98565b945094509450945094508415156001151514610fca576040805162461bcd60e51b815260206004820152601b60248201527f5b494e56414c49445d3a3a43414e4e4f545f4c49515549444154450000000000604482015290519081900360640190fd5b6000841161101f576040805162461bcd60e51b815260206004820181905260248201527f5b494e56414c49445d3a3a434f4c4c41544552414c5f414d4f554e545f474554604482015290519081900360640190fd5b60008311611074576040805162461bcd60e51b815260206004820152601c60248201527f5b494e56414c49445d3a3a4c49515549444154455f414d545f4d494e00000000604482015290519081900360640190fd5b61107c612314565b6110888a8c85876156b0565b6110918b615bdf565b611099615c44565b600554601a54604080518d8152602081019390935233838201526001600160a01b038e1660608401526080830186905260a0830187905260c0830185905260e08301849052610100830191909152517f063673bf3729ea8c5ba1f1a1f92aba5411de32bd3273366c4db83b2b926aa3b0918190036101200190a1600197505050505050505060016003559392505050565b6001600160a01b03811660009081526010602052604090205460ff165b919050565b600061116260145461115c613a12565b90615c4c565b90505b90565b6000600260035414156111b0576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b60026003556018546301000000900460ff1615611209576040805162461bcd60e51b81526020600482015260126024820152711050d51253d397d254d7d11254d05093115160721b604482015290519081900360640190fd5b6001600160a01b0383166000908152601c6020526040812090839080808061123089611896565b9296509094509250905060008411611286576040805162461bcd60e51b815260206004820152601460248201527316d2539590531251174e8e9414925390d254105360621b604482015290519081900360640190fd5b600088116112cf576040805162461bcd60e51b815260206004820152601160248201527016d2539590531251174e8e905353d55395607a1b604482015290519081900360640190fd5b83831015611316576040805162461bcd60e51b815260206004820152600f60248201526e16d2539590531251174e8e93d5d151608a1b604482015290519081900360640190fd5b6113208385615c94565b88101561136e576040805162461bcd60e51b815260206004820152601760248201527616d2539590531251174e8e949154105657d05353d55395604a1b604482015290519081900360640190fd5b611376612314565b82851115611382578294505b60048054604080516323b872dd60e01b8152339381019390935230602484015260448301889052516001600160a01b03909116916323b872dd9160648083019260209291908290030181600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505050506040513d602081101561140757600080fd5b50611416905033858588615cdf565b6114208386615c94565b808755600287018290556001600160a01b038a166000908152601c602052604090205490945061147c576001600160a01b0389166000908152601260205260409020805460ff19169055600e54611478906001615c94565b600e555b611484615c44565b600554604080519182526020820187905280516001600160a01b038c16927fdbb8ad1de0241ac8c43d26e116d28d43112479b5237854f353efd3ea44476f8a92908290030190a260019650505050505050600160035592915050565b60185462010000900460ff1681565b60055481565b60006002600354141561153d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b6002600355601854610100900460ff1615611594576040805162461bcd60e51b81526020600482015260126024820152711050d51253d397d254d7d11254d05093115160721b604482015290519081900360640190fd5b600082116115da576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b6115e2612314565b60006115ed3361320b565b905060006115f9614994565b905081841115611607578193505b83811015611613578093505b60065460055460408051633424a5e360e11b8152600481019290925233602483015260448201879052516001600160a01b03909216916368494bc691606480820192602092909190829003018186803b15801561166f57600080fd5b505afa158015611683573d6000803e3d6000fd5b505050506040513d602081101561169957600080fd5b505115156001146116e0576040805162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa12aa92760a11b604482015290519081900360640190fd5b60006116ea614360565b9050600061170d8261170760165489615df290919063ffffffff16565b90615e4f565b336000908152600b60205260409020549091508111156117395750336000908152600b60205260409020545b336000908152600b60205260409020546117539082615c94565b336000908152600b60205260409020556016546117709082615c94565b601655600061177e3361320b565b116117ac57336000908152601160205260409020805460ff19169055600d546117a8906001615c94565b600d555b600480546040805163a9059cbb60e01b8152339381019390935260248301899052516001600160a01b039091169163a9059cbb9160448083019260209291908290030181600087803b15801561180157600080fd5b505af1158015611815573d6000803e3d6000fd5b505050506040513d602081101561182b57600080fd5b50611837905033615bdf565b61183f615c44565b60055460408051918252602082018890528181018390525133917ffd7a0b71d7811b13f2c84aea576e78a87a151a1291b675e16738bf80a5833393919081900360600190a260019450505050506001600355919050565b6001600160a01b0381166000908152601c60205260408120549080806118bb85611fa9565b6001600160a01b0386166000908152601c6020526040902060028101546001909101549194506118ea91615ea7565b949693955092915050565b60006002600354141561193d576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b600260035560185460ff161561198f576040805162461bcd60e51b81526020600482015260126024820152711050d51253d397d254d7d11254d05093115160721b604482015290519081900360640190fd5b60048054604080516370a0823160e01b81523393810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b1580156119de57600080fd5b505afa1580156119f2573d6000803e3d6000fd5b505050506040513d6020811015611a0857600080fd5b5051905080831115611a18578092505b60008311611a5e576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125117d05353d5539560921b604482015290519081900360640190fd5b6006546005546040805163367e9e4d60e11b81526004810192909252336024830152516001600160a01b0390921691636cfd3c9a91604480820192602092909190829003018186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d6020811015611add57600080fd5b50511515600114611b29576040805162461bcd60e51b81526020600482015260116024820152705b494e56414c49445d3a3a535550504c5960781b604482015290519081900360640190fd5b611b31612314565b6000611b3b614360565b60048054604080516323b872dd60e01b8152339381019390935230602484015260448301889052519293506001600160a01b0316916323b872dd916064808201926020929091908290030181600087803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b505050506040513d6020811015611bc257600080fd5b5050601654600090611bd5575083611bf1565b611bee8261170760165488615df290919063ffffffff16565b90505b336000908152600b6020526040902054611c0b9082615c4c565b336000908152600b6020908152604080832093909355600c90522054611c319086615c4c565b336000908152600c6020526040902055601354611c4e9086615c4c565b601355601654611c5e9082615c4c565b6016553360009081526011602052604090205460ff16611ca557336000908152601160205260409020805460ff19166001908117909155600d54611ca191615c4c565b600d555b611cad615c44565b60055460408051918252602082018790528181018390525133917ff934b8b1f3e7901d4d2d64209bcaeea7659bbf314e1cb2c6048d747d472d2af5919081900360600190a2600193505050506001600355919050565b600060026003541415611d4b576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b60026003553360009081526010602052604090205460ff161515600114611dae576040805162461bcd60e51b81526020600482015260126024820152711253959053125117d0d3d31310551154905360721b604482015290519081900360640190fd5b6006546005546001600160a01b03909116906368494bc69033611dd08161320b565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03168152602001828152602001935050505060206040518083038186803b158015611e1b57600080fd5b505afa158015611e2f573d6000803e3d6000fd5b505050506040513d6020811015611e4557600080fd5b50511515600114611e8c576040805162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa12aa92760a11b604482015290519081900360640190fd5b33600081815260106020908152604091829020805460ff1916905560055482519081529081019290925280517f6df2d6aa1fae827dde25ebdb604ed2b785bd7232bff4a47b8f0fea04564d88bd9281900390910190a15060018060035590565b601454600090818080611efd614360565b9450611f07614994565b60075460408051631a5e5eb760e11b8152600481018890526024810189905290519295506001600160a01b03909116916334bcbd6e91604480820192602092909190829003018186803b158015611f5d57600080fd5b505afa158015611f71573d6000803e3d6000fd5b505050506040513d6020811015611f8757600080fd5b505191508415611fa257611f9f856117078487615df2565b90505b9091929394565b6001600160a01b0381166000908152601c6020526040812054611fce57506000611147565b6001600160a01b0382166000908152601c602052604081206002810154600190910154611ffb9190615ea7565b600754601454919350600092506001600160a01b0316906334bcbd6e90612020614360565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561205b57600080fd5b505afa15801561206f573d6000803e3d6000fd5b505050506040513d602081101561208557600080fd5b50516001600160a01b0385166000908152601c60205260408120549192505b838110156120d5576120cb6120c466014bf72f57d0006117078587615df2565b8390615c4c565b91506001016120a4565b50949350505050565b6006546001600160a01b031681565b6000546001600160a01b03163314612139576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b6004612143615ee4565b6001600083600b81111561215357fe5b600b81111561215e57fe5b815260208082019290925260409081016000208151808301909252805460ff16151580835260019182015493830193909352909250146121d2576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115612218576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b6020810151429061222c9062278d00615c4c565b101561226c576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600460005260016020527fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b5676436001600160a01b0384166122e7576040805162461bcd60e51b81526020600482015260126024820152715b494e56414c49445d3a3a4144445245535360701b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0395909516949094179093555050805460ff19169055565b600061231e61114c565b905060175481111561237657600061234160175483615c9490919063ffffffff16565b9050600061236061271061170760195485615df290919063ffffffff16565b6015549091506123709082615c4c565b60155550505b601755565b6000546001600160a01b031633146123c7576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b60036123d1615ee4565b6001600083600b8111156123e157fe5b600b8111156123ec57fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014612460576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b42816020015111156124a6576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b602081015142906124ba9062278d00615c4c565b10156124fa576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600360005260016020527f7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b6001600160a01b038416612575576040805162461bcd60e51b81526020600482015260126024820152715b494e56414c49445d3a3a4144445245535360701b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0395909516949094179093555050805460ff19169055565b6001600160a01b038082166000818152600c60209081526040808320546004805483516370a0823160e01b81529182019690965291519095939485948594859492909116926370a08231926024808201939291829003018186803b15801561260957600080fd5b505afa15801561261d573d6000803e3d6000fd5b505050506040513d602081101561263357600080fd5b50516001600160a01b0387166000818152601060205260408120549295509031935060ff90911691506126658761320b565b90508581111561267c576126798187615c94565b94505b5091939590929450565b6000600260035414156126ce576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b600260035560185462010000900460ff1615612726576040805162461bcd60e51b81526020600482015260126024820152711050d51253d397d254d7d11254d05093115160721b604482015290519081900360640190fd5b6009546001600160a01b0316331461278a57336001600160a01b0384161461278a576040805162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa822a926a4a9aa24a7a760711b604482015290519081900360640190fd5b600082116127d3576040805162461bcd60e51b815260206004820152601160248201527016d2539590531251174e8e905353d55395607a1b604482015290519081900360640190fd5b6006546040805163d49071d760e01b81526001600160a01b0386811660048301529151919092169163d49071d7916024808301926020929190829003018186803b15801561282057600080fd5b505afa158015612834573d6000803e3d6000fd5b505050506040513d602081101561284a57600080fd5b505115612895576040805162461bcd60e51b81526020600482015260146024820152735b494e56414c49445d3a3a4c495155494441544560601b604482015290519081900360640190fd5b60065460055460408051630a01f88360e31b815260048101929092526001600160a01b03868116602484015260448301869052905192169163500fc41891606480820192602092909190829003018186803b1580156128f357600080fd5b505afa158015612907573d6000803e3d6000fd5b505050506040513d602081101561291d57600080fd5b50511515600114612969576040805162461bcd60e51b81526020600482015260116024820152705b494e56414c49445d3a3a424f52524f5760781b604482015290519081900360640190fd5b612971612314565b600061297b614994565b9050828110156129d2576040805162461bcd60e51b815260206004820181905260248201527f5b494e56414c49445d3a3a494e56414c49445f4c49515549444954595f414d54604482015290519081900360640190fd5b6014546129df9084615c4c565b6014556001600160a01b0384166000908152601c602052604090208054612a068186615c4c565b825580612a1b57426001830155600060028301555b6001600160a01b03861660009081526012602052604090205460ff16612ab0576001600160a01b0386166000908152601260205260408120805460ff19166001908117909155600f8054808301825592527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80290910180546001600160a01b03191633179055600e54612aac91615c4c565b600e555b600480546040805163a9059cbb60e01b81526001600160a01b038a811694820194909452602481018990529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015612b0a57600080fd5b505af1158015612b1e573d6000803e3d6000fd5b505050506040513d6020811015612b3457600080fd5b50612b3f9050615c44565b600554604080519182526020820187905280516001600160a01b038916927f7a6bd2040c0402cb9ae2776b71b6cffea1fbf68eae0e001fa6be1fb42297946192908290030190a260019350505050600160035592915050565b60008060008060008060008a6001600160a01b03166332d720fd8b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b158015612bf057600080fd5b505afa158015612c04573d6000803e3d6000fd5b505050506040513d6080811015612c1a57600080fd5b508051602090910151909250905081811015612c6f576040805162461bcd60e51b815260206004820152600f60248201526e16d2539590531251174e8e93d5d151608a1b604482015290519081900360640190fd5b80881115612c7b578097505b6006546040805163231d562360e21b8152600481018c90526001600160a01b038d8116602483015291516000939290921691638c75588c91604480820192602092909190829003018186803b158015612cd357600080fd5b505afa158015612ce7573d6000803e3d6000fd5b505050506040513d6020811015612cfd57600080fd5b5051905080891115612d0d578098505b612d178284615c94565b891015612d65576040805162461bcd60e51b815260206004820152601760248201527616d2539590531251174e8e949154105657d05353d55395604a1b604482015290519081900360640190fd5b600854604080516317a6948f60e21b815230600482015281516001600160a01b0390931692635e9a523c92602480840193919291829003018186803b158015612dad57600080fd5b505afa158015612dc1573d6000803e3d6000fd5b505050506040513d6040811015612dd757600080fd5b8101908080519060200190929190805190602001909291905050505080955050600860009054906101000a90046001600160a01b03166001600160a01b0316635e9a523c8d6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050604080518083038186803b158015612e5857600080fd5b505afa158015612e6c573d6000803e3d6000fd5b505050506040513d6040811015612e8257600080fd5b5060200151935060008515612ec157612ebe612ea9601a5488615df290919063ffffffff16565b6117076064612eb88e8a615df2565b90615df2565b90505b60008111612f16576040805162461bcd60e51b815260206004820181905260248201527f5b494e56414c49445d3a3a434f4c4c41544552414c5f414d4f554e545f474554604482015290519081900360640190fd5b80612f208d61320b565b1015612f5d5760405162461bcd60e51b8152600401808060200182810382526028815260200180615f1c6028913960400191505060405180910390fd5b60019d909c50989a50939850919695505050505050565b60145481565b6009546001600160a01b031681565b6000546001600160a01b03163314612fd5576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b60006001600083600b811115612fe757fe5b600b811115612ff257fe5b8152602001908152602001600020905061301760025442615c4c90919063ffffffff16565b6001808301829055825460ff19161782556040517f2750180134a7141597efe494a023e1de200534e6bdbf4d68443c20731701c7c39184918083600b81111561305c57fe5b81526020018281526020019250505060405180910390a15050565b600c6020526000908152604090205481565b60025481565b6000600260035414156130d7576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b60026003556130e4612314565b60006130ee613a12565b90506015548311156131005760155492505b8281101561310c578092505b6015546131199084615c94565b60155560048054600a546040805163a9059cbb60e01b81526001600160a01b0392831694810194909452602484018790525191169163a9059cbb9160448083019260209291908290030181600087803b15801561317557600080fd5b505af1158015613189573d6000803e3d6000fd5b505050506040513d602081101561319f57600080fd5b506131aa9050615c44565b600554600a54604080519283526001600160a01b039190911660208301528181018590525133917f6a6dcf69908e102be80d5b8bdd5ee56056923ef96a5655f3851319242ffad252919081900360600190a260019150506001600355919050565b6000806016541161321e57506000611147565b6016546001600160a01b0383166000908152600b602052604090205461324b919061170790612eb8614360565b92915050565b6060600f8054806020026020016040519081016040528092919081815260200182805480156132a957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161328b575b5050505050905090565b601854610100900460ff1681565b6000546001600160a01b0316331461330d576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b6002613317615ee4565b6001600083600b81111561332757fe5b600b81111561333257fe5b815260208082019290925260409081016000208151808301909252805460ff16151580835260019182015493830193909352909250146133a6576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b42816020015111156133ec576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b602081015142906134009062278d00615c4c565b1015613440576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600260005260016020527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f6001600160a01b0384166134bb576040805162461bcd60e51b81526020600482015260126024820152715b494e56414c49445d3a3a4144445245535360701b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0395909516949094179093555050805460ff19169055565b6000546001600160a01b03163314613534576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b600561353e615ee4565b6001600083600b81111561354e57fe5b600b81111561355957fe5b815260208082019290925260409081016000208151808301909252805460ff16151580835260019182015493830193909352909250146135cd576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115613613576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b602081015142906136279062278d00615c4c565b1015613667576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600560005260016020527fe2689cd4a84e23ad2f564004f1c9013e9589d260bde6380aba3ca7e09e4df40c6001600160a01b0384166136e2576040805162461bcd60e51b81526020600482015260126024820152715b494e56414c49445d3a3a4144445245535360701b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0395909516949094179093555050805460ff19169055565b62278d0081565b6000546001600160a01b03163314613762576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b600b61376c615ee4565b6001600083600b81111561377c57fe5b600b81111561378757fe5b815260208082019290925260409081016000208151808301909252805460ff16151580835260019182015493830193909352909250146137fb576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115613841576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b602081015142906138559062278d00615c4c565b1015613895576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600b600052600160208190527ffc80cd5fe514767bc6e66ec558e68a5429ea70b50fa6caa3b53fc9278e9186329060ff891614156138df576018805460ff191660011790556138ea565b6018805460ff191690555b8660ff166001141561390c576018805462ff0000191662010000179055613919565b6018805462ff0000191690555b8560ff1660011415613939576018805461ff001916610100179055613945565b6018805461ff00191690555b8460ff1660011415613969576018805463ff00000019166301000000179055613977565b6018805463ff000000191690555b8360ff166001141561399c576018805464ff000000001916600160201b1790556139ab565b6018805464ff00000000191690555b805460ff191681556040805160ff8a8116825289811660208301528881168284015287811660608301528616608082015290517f71f830389d4666f6eac23f66ac5029105040128e59805979d23fb952f8cabed09181900360a00190a15050505050505050565b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015613a6157600080fd5b505afa158015613a75573d6000803e3d6000fd5b505050506040513d6020811015613a8b57600080fd5b5051905090565b600e5481565b601a5481565b6000546001600160a01b031681565b6018546301000000900460ff1681565b6004546001600160a01b031690565b600060026003541415613b14576040805162461bcd60e51b815260206004820152601f6024820152600080516020615efc833981519152604482015290519081900360640190fd5b60026003553360009081526010602052604090205460ff1615613b73576040805162461bcd60e51b81526020600482015260126024820152711253959053125117d0d3d31310551154905360721b604482015290519081900360640190fd5b60065460055460408051634b1debc960e01b81526004810192909252336024830152516001600160a01b0390921691634b1debc991604480820192602092909190829003018186803b158015613bc857600080fd5b505afa158015613bdc573d6000803e3d6000fd5b505050506040513d6020811015613bf257600080fd5b50511515600114613c4a576040805162461bcd60e51b815260206004820152601c60248201527f5b494e56414c49445d3a3a454e41424c455f434f4c4c41544552414c00000000604482015290519081900360640190fd5b33600081815260106020908152604091829020805460ff1916600117905560055482519081529081019290925280517fb63b534f4f806052e5cc79ae7c3e161b6785d009d4a038b851608307634ec2cf9281900390910190a15060018060035590565b6008546001600160a01b031681565b60195481565b6001600160a01b03166000908152601c602052604090205490565b600d5481565b600a546001600160a01b031681565b6203f48081565b600f8181548110613d0657fe5b6000918252602090912001546001600160a01b0316905081565b6001602081905260009182526040909120805491015460ff9091169082565b6000546001600160a01b03163314613d8b576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b6006613d95615ee4565b6001600083600b811115613da557fe5b600b811115613db057fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014613e24576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115613e6a576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b60208101514290613e7e9062278d00615c4c565b1015613ebe576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600660008181526001602052905460408051631526fe2760e01b81526004810187905290517f8f331abe73332f95a25873e8b430885974c0409691f89d643119a11623a7924a9392839283926001600160a01b0390921691631526fe27916024808201928692909190829003018186803b158015613f3b57600080fd5b505afa158015613f4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c0811015613f7857600080fd5b81516020830151604080850180519151939592948301929184600160201b821115613fa257600080fd5b908301906020820185811115613fb757600080fd5b8251600160201b811182820188101715613fd057600080fd5b82525081516020918201929091019080838360005b83811015613ffd578181015183820152602001613fe5565b50505050905090810190601f16801561402a5780820380516001836020036101000a031916815260200191505b506040526060015194975092955092935050506001600160a01b03841630149050614095576040805162461bcd60e51b815260206004820152601660248201527516d2539590531251174e8e96995d1a1e5c88141bdbdb60521b604482015290519081900360640190fd5b6004546001600160a01b038381169116146140ef576040805162461bcd60e51b81526020600482015260156024820152742da4a72b20a624a22e9d1d2130b9b2902a37b5b2b760591b604482015290519081900360640190fd5b60018115151461413f576040805162461bcd60e51b81526020600482015260166024820152755b494e56414c49445d3a3a506f6f6c2053746174757360501b604482015290519081900360640190fd5b5050506005939093555050805460ff19169055565b6000546001600160a01b031633146141a0576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b60016141aa615ee4565b6001600083600b8111156141ba57fe5b600b8111156141c557fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014614239576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b428160200151111561427f576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b602081015142906142939062278d00615c4c565b10156142d3576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b6001600081905260209081526019869055601a859055601b8490557fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805460ff19168155604080518881529283018790528281018690525190917f77ed40d15886d6cd885b712aff1d3007816d0cbba452ec7cdc402efef84bcb63919081900360600190a1505050505050565b60008061436b61114c565b9050600061437761439d565b90508181111561438c57600092505050611165565b6143968282615c94565b9250505090565b6000806143a861114c565b601554601754919250908211156144005760006143d060175484615c9490919063ffffffff16565b905060006143ef61271061170760195485615df290919063ffffffff16565b90506143fb8382615c4c565b925050505b91505090565b60155481565b6001600160a01b03811660009081526010602052604081205460ff1661443457506000611147565b61324b8261320b565b60185460ff1681565b6000546001600160a01b03163314614492576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b6203f4808110156144a257600080fd5b62278d008111156144b257600080fd5b600255565b6000546001600160a01b03163314614503576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b60006001600083600b81111561451557fe5b600b81111561452057fe5b815260208101919091526040908101600020805460ff1916815590519091507f8601523a44261067758b7786fcd66c33669bd716969a7f6bff9bb0f70f8bbf719083908082600b81111561457057fe5b815260200191505060405180910390a15050565b601854600160201b900460ff1681565b6004546001600160a01b031681565b6000546001600160a01b031633146145ef576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b60096145f9615ee4565b6001600083600b81111561460957fe5b600b81111561461457fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014614688576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b42816020015111156146ce576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b602081015142906146e29062278d00615c4c565b1015614722576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b60096000908152600160205260065460408051631526fe2760e01b81526004810187905290517f74a5fbcb419ab7dbacbb2c92a4e163730f0da5c72b911deecf4f05a6b327d0a4939283926001600160a01b0390911691631526fe27916024808201928692909190829003018186803b15801561479e57600080fd5b505afa1580156147b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c08110156147db57600080fd5b81516020830151604080850180519151939592948301929184600160201b82111561480557600080fd5b90830190602082018581111561481a57600080fd5b8251600160201b81118282018810171561483357600080fd5b82525081516020918201929091019080838360005b83811015614860578181015183820152602001614848565b50505050905090810190601f16801561488d5780820380516001836020036101000a031916815260200191505b50604052505060055493955091935050508614156148eb576040805162461bcd60e51b81526020600482015260166024820152755b494e56414c49445d3a3a506f6f6c2053746174757360501b604482015290519081900360640190fd5b806001600160a01b031663095ea7b38360006040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561494357600080fd5b505af1158015614957573d6000803e3d6000fd5b505050506040513d602081101561496d57600080fd5b5050825460ff19169092555050505050565b60175481565b6007546001600160a01b031681565b60008061499f613a12565b90506000601554821115614400576015546149bb908390615c94565b9392505050565b6000546001600160a01b03163314614a0e576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b6000614a18615ee4565b6001600083600b811115614a2857fe5b600b811115614a3357fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014614aa7576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115614aed576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b60208101514290614b019062278d00615c4c565b1015614b41576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b6000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496001600160a01b038416614bb8576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0395909516949094179093555050805460ff19169055565b6000546001600160a01b03163314614c31576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b600a614c3b615ee4565b6001600083600b811115614c4b57fe5b600b811115614c5657fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014614cca576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115614d10576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b60208101514290614d249062278d00615c4c565b1015614d64576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b600a60005260016020527f2a32391a76c35a36352b711f9152c0d0a340cd686850c8ef25fbb11c71b89e7b6001600160a01b038416614ddf576040805162461bcd60e51b81526020600482015260126024820152715b494e56414c49445d3a3a4144445245535360701b604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0395909516949094179093555050805460ff19169055565b600b6020526000908152604090205481565b60135481565b6000546001600160a01b03163314614e70576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b6007614e7a615ee4565b6001600083600b811115614e8a57fe5b600b811115614e9557fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014614f09576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b4281602001511115614f4f576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b60208101514290614f639062278d00615c4c565b1015614fa3576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b60076000908152600160205260065460408051631526fe2760e01b81526004810187905290517fdc686ec4a0ff239c70e7c7c36e8f853eced3bc8618f48d2b816da2a74311237e9392839283926001600160a01b0390921691631526fe27916024808201928692909190829003018186803b15801561502157600080fd5b505afa158015615035573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c081101561505e57600080fd5b81516020830151604080850180519151939592948301929184600160201b82111561508857600080fd5b90830190602082018581111561509d57600080fd5b8251600160201b8111828201881017156150b657600080fd5b82525081516020918201929091019080838360005b838110156150e35781810151838201526020016150cb565b50505050905090810190601f1680156151105780820380516001836020036101000a031916815260200191505b5060405260600151600554959850939650929450505050871415615174576040805162461bcd60e51b81526020600482015260166024820152755b494e56414c49445d3a3a506f6f6c2053746174757360501b604482015290519081900360640190fd5b6001811515146151c4576040805162461bcd60e51b81526020600482015260166024820152755b494e56414c49445d3a3a506f6f6c2053746174757360501b604482015290519081900360640190fd5b816001600160a01b031663095ea7b3846000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561521d57600080fd5b505af1158015615231573d6000803e3d6000fd5b505050506040513d602081101561524757600080fd5b5050835460ff1916909355505050505050565b601b5481565b6000546001600160a01b031633146152ac576040805162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b604482015290519081900360640190fd5b60086152b6615ee4565b6001600083600b8111156152c657fe5b600b8111156152d157fe5b815260208082019290925260409081016000208151808301909252805460ff1615158083526001918201549383019390935290925014615345576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303160b01b604482015290519081900360640190fd5b428160200151111561538b576040805162461bcd60e51b815260206004820152600a6024820152692a2621b7b7331d1d181960b11b604482015290519081900360640190fd5b6020810151429061539f9062278d00615c4c565b10156153df576040805162461bcd60e51b815260206004820152600a602482015269544c436f6e663a3a303360b01b604482015290519081900360640190fd5b6008600090815260016020908152600654604080516375f4d67760e01b815290517f4db623e5c4870b62d3fc9b4e8f893a1a77627d75ab45d9ff7e56ba19564af99b94936001600160a01b03909316926375f4d6779260048082019391829003018186803b15801561545057600080fd5b505afa158015615464573d6000803e3d6000fd5b505050506040513d602081101561547a57600080fd5b5051905060005b818110156156a25760065460408051631526fe2760e01b8152600481018490529051600092839283926001600160a01b0390921691631526fe27916024808201928692909190829003018186803b1580156154db57600080fd5b505afa1580156154ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c081101561551857600080fd5b81516020830151604080850180519151939592948301929184600160201b82111561554257600080fd5b90830190602082018581111561555757600080fd5b8251600160201b81118282018810171561557057600080fd5b82525081516020918201929091019080838360005b8381101561559d578181015183820152602001615585565b50505050905090810190601f1680156155ca5780820380516001836020036101000a031916815260200191505b506040526060015160055495985093965092945050505084148015906155f257506001811515145b801561560c57506004546001600160a01b03838116911614155b1561569757816001600160a01b031663095ea7b3846000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561566a57600080fd5b505af115801561567e573d6000803e3d6000fd5b505050506040513d602081101561569457600080fd5b50505b505050600101615481565b5050805460ff191690555050565b60065460408051631526fe2760e01b815260048101879052905160009283926001600160a01b0390911691631526fe27916024808201928692909190829003018186803b15801561570057600080fd5b505afa158015615714573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c081101561573d57600080fd5b81516020830151604080850180519151939592948301929184600160201b82111561576757600080fd5b90830190602082018581111561577c57600080fd5b8251600160201b81118282018810171561579557600080fd5b82525081516020918201929091019080838360005b838110156157c25781810151838201526020016157aa565b50505050905090810190601f1680156157ef5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82523360048301525196985094965089956001600160a01b038816956370a0823195506024808201955060209450919250829003018186803b15801561584257600080fd5b505afa158015615856573d6000803e3d6000fd5b505050506040513d602081101561586c57600080fd5b505110156158bb576040805162461bcd60e51b815260206004820152601760248201527616d2539590531251174e8e949154105657d05353d55395604a1b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b038316916323b872dd9160648083019260209291908290030181600087803b15801561591057600080fd5b505af1158015615924573d6000803e3d6000fd5b505050506040513d602081101561593a57600080fd5b505060408051630450cfaf60e31b81526001600160a01b038781166004830152602482018790529151918416916322867d78916044808201926020929091908290030181600087803b15801561598f57600080fd5b505af11580156159a3573d6000803e3d6000fd5b505050506040513d60208110156159b957600080fd5b5051615a0c576040805162461bcd60e51b815260206004820152601d60248201527f5b4641494c5552455d3a3a52455041595f464f525f424f52524f574552000000604482015290519081900360640190fd5b6000615a16614994565b905083811015615a6d576040805162461bcd60e51b815260206004820181905260248201527f5b494e56414c49445d3a3a494e56414c49445f4c49515549444954595f414d54604482015290519081900360640190fd5b6000615a88615a7a614360565b601654611707908890615df2565b6001600160a01b0388166000908152600b6020526040902054909150811115615ac657506001600160a01b0386166000908152600b60205260409020545b6001600160a01b0387166000908152600b6020526040902054615ae99082615c94565b6001600160a01b0388166000908152600b6020526040902055601654615b0f9082615c94565b6016556000615b1d8861320b565b11615b54576001600160a01b0387166000908152601160205260409020805460ff19169055600d54615b50906001615c94565b600d555b600480546040805163a9059cbb60e01b8152339381019390935260248301889052516001600160a01b039091169163a9059cbb9160448083019260209291908290030181600087803b158015615ba957600080fd5b505af1158015615bbd573d6000803e3d6000fd5b505050506040513d6020811015615bd357600080fd5b50505050505050505050565b6000615bea8261320b565b6001600160a01b0383166000908152600c6020526040902054909150818110615c3f576001600160a01b0383166000908152600c60205260409020829055601354615c3b90839061115c9084615c94565b6013555b505050565b61237661114c565b6000828201838110156149bb576040805162461bcd60e51b815260206004820152600b60248201526a1253959053125117d0511160aa1b604482015290519081900360640190fd5b600082821115615cd9576040805162461bcd60e51b815260206004820152600b60248201526a24a72b20a624a22fa9aaa160a91b604482015290519081900360640190fd5b50900390565b6000615ceb8385615c94565b90506000615cf98383615c94565b905084811115615d065750835b8115615d8c576000615d2961271061170760195486615df290919063ffffffff16565b601554909150615d399082615c4c565b6015556005546040805191825260208201859052818101839052516001600160a01b038916917f568093f5d4abd1ab12c1647515ae3b6c9435bc8fd269600a944fa860b9f1117d919081900360600190a2505b8015615dea57601454615d9f9082615c94565b601455600554604080519182526020820183905280516001600160a01b038916927f2594208a7be20f40e15b9052593b4893f771626ff2cc8478011176f7f1457ac792908290030190a25b505050505050565b600082615e015750600061324b565b82820282848281615e0e57fe5b04146149bb576040805162461bcd60e51b815260206004820152600b60248201526a1253959053125117d3555360aa1b604482015290519081900360640190fd5b6000808211615e93576040805162461bcd60e51b815260206004820152600b60248201526a24a72b20a624a22fa224ab60a91b604482015290519081900360640190fd5b6000828481615e9e57fe5b04949350505050565b6000808215615edd57601b54615ec1906117074286615c94565b9150615ece826001615c4c565b9150615eda8285615c94565b90505b9250929050565b60408051808201909152600080825260208201529056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c005b494e56414c49445d3a3a434f4c4c41544552414c5f414d4f554e545f4f465f424f52524f574552a2646970667358221220682975a8b329283719ede8df88dbdd2393811575fc82ed0aa5c2bb35ff4185f164736f6c634300060c0033000000000000000000000000e83d391b766e399ed9c55546fa818f9322b083b800000000000000000000000017bfbdf2d11d8f909775bafc6af43fbf3ba86000000000000000000000000000aeef26b17228ce8d5847426a6cd9911905fc9f94000000000000000000000000849f4e7ac7d06caca8de6fb8180b4cb575c9c630

Deployed ByteCode Sourcemap

12000:32243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12870:25;;;:::i;:::-;;;;;;;;;;;;;;;;26092:1856;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26092:1856:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39788:123;;;;;;;;;;;;;;;;-1:-1:-1;39788:123:0;-1:-1:-1;;;;;39788:123:0;;:::i;43136:126::-;;;:::i;27956:2026::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27956:2026:0;;;;;;;;:::i;13014:27::-;;;:::i;12136:23::-;;;:::i;31666:1660::-;;;;;;;;;;;;;;;;-1:-1:-1;31666:1660:0;;:::i;40982:455::-;;;;;;;;;;;;;;;;-1:-1:-1;40982:455:0;-1:-1:-1;;;;;40982:455:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29995:1663;;;;;;;;;;;;;;;;-1:-1:-1;29995:1663:0;;:::i;23685:408::-;;;:::i;39919:484::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41485:697;;;;;;;;;;;;;;;;-1:-1:-1;41485:697:0;-1:-1:-1;;;;;41485:697:0;;:::i;12168:39::-;;;:::i;:::-;;;;-1:-1:-1;;;;;12168:39:0;;;;;;;;;;;;;;19374:715;;;;;;;;;;;;;;;;-1:-1:-1;19374:715:0;-1:-1:-1;;;;;19374:715:0;;:::i;:::-;;33332:437;;;:::i;18625:685::-;;;;;;;;;;;;;;;;-1:-1:-1;18625:685:0;-1:-1:-1;;;;;18625:685:0;;:::i;40411:514::-;;;;;;;;;;;;;;;;-1:-1:-1;40411:514:0;-1:-1:-1;;;;;40411:514:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24101:1983;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24101:1983:0;;;;;;;;:::i;37425:1660::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37425:1660:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12797:26;;;:::i;12302:36::-;;;:::i;10875:538::-;;;;;;;;;;;;;;;;-1:-1:-1;10875:538:0;;;;:::i;12440:43::-;;;;;;;;;;;;;;;;-1:-1:-1;12440:43:0;-1:-1:-1;;;;;12440:43:0;;:::i;9475:20::-;;;:::i;33775:951::-;;;;;;;;;;;;;;;;-1:-1:-1;33775:951:0;;:::i;39097:216::-;;;;;;;;;;;;;;;;-1:-1:-1;39097:216:0;-1:-1:-1;;;;;39097:216:0;;:::i;44131:109::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12978:29;;;:::i;17107:708::-;;;;;;;;;;;;;;;;-1:-1:-1;17107:708:0;-1:-1:-1;;;;;17107:708:0;;:::i;20107:::-;;;;;;;;;;;;;;;;-1:-1:-1;20107:708:0;-1:-1:-1;;;;;20107:708:0;;:::i;9421:47::-;;;:::i;15872:1227::-;;;;;;;;;;;;;;;;-1:-1:-1;15872:1227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43007:121::-;;;:::i;12533:28::-;;;:::i;13188:48::-;;;:::i;9215:20::-;;;:::i;13048:26::-;;;:::i;39682:98::-;;;:::i;23250:423::-;;;:::i;12254:39::-;;;:::i;13120:42::-;;;:::i;39537:137::-;;;;;;;;;;;;;;;;-1:-1:-1;39537:137:0;-1:-1:-1;;;;;39537:137:0;;:::i;12498:28::-;;;:::i;12345:32::-;;;:::i;9368:46::-;;;:::i;12570:29::-;;;;;;;;;;;;;;;;-1:-1:-1;12570:29:0;;:::i;9244:62::-;;;;;;;;;;;;;;;;-1:-1:-1;9244:62:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;20823:559;;;;;;;;;;;;;;;;-1:-1:-1;20823:559:0;;:::i;15288:576::-;;;;;;;;;;;;;;;;-1:-1:-1;15288:576:0;;;;;;;;;;;;:::i;43270:327::-;;;:::i;43605:518::-;;;:::i;12830:33::-;;;:::i;39321:208::-;;;;;;;;;;;;;;;;-1:-1:-1;39321:208:0;-1:-1:-1;;;;;39321:208:0;;:::i;12944:27::-;;;:::i;10229:167::-;;;;;;;;;;;;;;;;-1:-1:-1;10229:167:0;;:::i;10404:463::-;;;;;;;;;;;;;;;;-1:-1:-1;10404:463:0;;;;:::i;13081:30::-;;;:::i;12059:18::-;;;:::i;22701:537::-;;;;;;;;;;;;;;;;-1:-1:-1;22701:537:0;;:::i;12902:33::-;;;:::i;12214:::-;;;:::i;42682:317::-;;;:::i;11421:572::-;;;;;;;;;;;;;;;;-1:-1:-1;11421:572:0;-1:-1:-1;;;;;11421:572:0;;:::i;17876:692::-;;;;;;;;;;;;;;;;-1:-1:-1;17876:692:0;-1:-1:-1;;;;;17876:692:0;;:::i;12386:43::-;;;;;;;;;;;;;;;;-1:-1:-1;12386:43:0;-1:-1:-1;;;;;12386:43:0;;:::i;12763:27::-;;;:::i;22155:538::-;;;;;;;;;;;;;;;;-1:-1:-1;22155:538:0;;:::i;13252:40::-;;;:::i;21390:757::-;;;:::i;12870:25::-;;;;:::o;26092:1856::-;26211:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;26243::::1;::::0;-1:-1:-1;;;26243:18:0;::::1;;;:27;26235:58;;;::::0;;-1:-1:-1;;;26235:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26235:58:0;;;;;;;;;;;;;::::1;;26357:19;::::0;:40:::1;::::0;;-1:-1:-1;;;26357:40:0;;::::1;::::0;::::1;::::0;;;;;26307:18:::1;::::0;;;-1:-1:-1;;;;;26357:19:0;;::::1;::::0;:28:::1;::::0;:40;;;;;26307:18;;26357:40;;;;;;;;:19;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;26357:40:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;;-1:-1:-1;;;26357:40:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;26357:40:0;::::1;::::0;;::::1;::::0;-1:-1:-1;26357:40:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;26357:40:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;26357:40:0::1;::::0;;;;26306:91;;-1:-1:-1;26357:40:0;;-1:-1:-1;;;;;;;;;;26500:23:0;::::1;26492:55;;;::::0;;-1:-1:-1;;;26492:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26492:55:0;;;;;;;;;;;;;::::1;;26566:19;::::0;:54:::1;::::0;;-1:-1:-1;;;26566:54:0;;-1:-1:-1;;;;;26566:54:0;;::::1;;::::0;::::1;::::0;;;:19;;;::::1;::::0;:43:::1;::::0;:54;;;;;::::1;::::0;;;;;;;;:19;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26566:54:0;:62:::1;;26624:4;26566:62;26558:93;;;::::0;;-1:-1:-1;;;26558:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26558:93:0;;;;;;;;;;;;;::::1;;26738:8;;26724:10;:22;;26716:50;;;::::0;;-1:-1:-1;;;26716:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26716:50:0;;;;;;;;;;;;;::::1;;26801:1;26785:13;:17;26777:54;;;::::0;;-1:-1:-1;;;26777:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26867:4;26850:21:::0;::::1;;;26842:49;;;::::0;;-1:-1:-1;;;26842:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26842:49:0;;;;;;;;;;;;;::::1;;26913:20;26935:22:::0;26959:25:::1;26986:24:::0;27012:18:::1;27034:62;27052:5;27059:9;27070:10;27082:13;27034:17;:62::i;:::-;26912:184;;;;;;;;;;27125:15;:23;;27144:4;27125:23;;;27117:63;;;::::0;;-1:-1:-1;;;27117:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27216:1;27199:14;:18;27191:63;;;::::0;;-1:-1:-1;;;27191:63:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27293:1;27273:17;:21;27265:62;;;::::0;;-1:-1:-1;;;27265:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27422:9;:7;:9::i;:::-;27444:68;27455:10;27467:9;27478:17;27497:14;27444:10;:68::i;:::-;27525:28;27543:9;27525:17;:28::i;:::-;27564:16;:14;:16::i;:::-;27704:8;::::0;27802:28:::1;::::0;27680:151:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;27714:10:::1;27680:151:::0;;;;-1:-1:-1;;;;;27680:151:0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;27933:4;27926:11;;;;;;;;;2135:1:::0;3096:7;:22;26092:1856;;-1:-1:-1;;;26092:1856:0:o;39788:123::-;-1:-1:-1;;;;;39879:24:0;;39849:4;39879:24;;;:13;:24;;;;;;;;39788:123;;;;:::o;43136:126::-;43183:7;43216:38;43242:11;;43216:21;:19;:21::i;:::-;:25;;:38::i;:::-;43209:45;;43136:126;;:::o;27956:2026::-;28045:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;28075:14:::1;::::0;;;::::1;;;:23;28067:54;;;::::0;;-1:-1:-1;;;28067:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28067:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;28238:23:0;::::1;28216:19;28238:23:::0;;;:12:::1;:23;::::0;;;;;28295:7;;28216:19;;;28446:28:::1;28251:9:::0;28446:17:::1;:28::i;:::-;28345:129:::0;;-1:-1:-1;28345:129:0;;-1:-1:-1;28345:129:0;-1:-1:-1;28345:129:0;-1:-1:-1;28670:1:0::1;28657:10;:14;28649:47;;;::::0;;-1:-1:-1;;;28649:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28649:47:0;;;;;;;;;;;;;::::1;;28725:1;28715:7;:11;28707:41;;;::::0;;-1:-1:-1;;;28707:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28707:41:0;;;;;;;;;;;;;::::1;;28782:10;28767:11;:25;;28759:53;;;::::0;;-1:-1:-1;;;28759:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28759:53:0;;;;;;;;;;;;;::::1;;28842:27;:11:::0;28858:10;28842:15:::1;:27::i;:::-;28831:7;:38;;28823:74;;;::::0;;-1:-1:-1;;;28823:74:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;28823:74:0;;;;;;;;;;;;;::::1;;28992:9;:7;:9::i;:::-;29031:11;29016:12;:26;29012:85;;;29074:11;29059:26;;29012:85;29161:4;::::0;;:58:::1;::::0;;-1:-1:-1;;;29161:58:0;;29179:10:::1;29161:58:::0;;::::1;::::0;;;;29199:4:::1;29161:58:::0;;;;;;;;;;;-1:-1:-1;;;;;29161:4:0;;::::1;::::0;:17:::1;::::0;:58;;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:58;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29230:57:0::1;::::0;-1:-1:-1;29237:10:0::1;29249::::0;29261:11;29274:12;29230:6:::1;:57::i;:::-;29359:29;:11:::0;29375:12;29359:15:::1;:29::i;:::-;29432:28:::0;;;29471:15:::1;::::0;::::1;:36:::0;;;-1:-1:-1;;;;;29557:23:0;::::1;29432:12;29557:23:::0;;;:12:::1;:23;::::0;;;;:33;29346:42;;-1:-1:-1;29553:152:0::1;;-1:-1:-1::0;;;;;29612:22:0;::::1;29637:5;29612:22:::0;;;:11:::1;:22;::::0;;;;:30;;-1:-1:-1;;29612:30:0::1;::::0;;29673:13:::1;::::0;:20:::1;::::0;29612:30;29673:17:::1;:20::i;:::-;29657:13;:36:::0;29553:152:::1;29715:16;:14;:16::i;:::-;29839:8;::::0;29831:42:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;29831:42:0;::::1;::::0;::::1;::::0;;;;;;;::::1;29970:4;29963:11;;;;;;;;2135:1:::0;3096:7;:22;27956:2026;;-1:-1:-1;;27956:2026:0:o;13014:27::-;;;;;;;;;:::o;12136:23::-;;;;:::o;31666:1660::-;31740:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;31771:17:::1;::::0;::::1;::::0;::::1;;;:26;31763:57;;;::::0;;-1:-1:-1;;;31763:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31763:57:0;;;;;;;;;;;;;::::1;;31933:1;31923:7;:11;31915:38;;;::::0;;-1:-1:-1;;;31915:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31915:38:0;;;;;;;;;;;;;::::1;;32048:9;:7;:9::i;:::-;32068:13;32084:21;32094:10;32084:9;:21::i;:::-;32068:37;;32116:21;32140;:19;:21::i;:::-;32116:45;;32186:5;32176:7;:15;32172:63;;;32218:5;32208:15;;32172:63;32265:7;32249:13;:23;32245:79;;;32299:13;32289:23;;32245:79;32342:19;::::0;32373:8:::1;::::0;32342:61:::1;::::0;;-1:-1:-1;;;32342:61:0;;::::1;::::0;::::1;::::0;;;;32383:10:::1;32342:61:::0;;;;;;;;;;;-1:-1:-1;;;;;32342:19:0;;::::1;::::0;:30:::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;:19;:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32342:61:0;:69:::1;;32407:4;32342:69;32334:94;;;::::0;;-1:-1:-1;;;32334:94:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32334:94:0;;;;;;;;;;;;;::::1;;32449:13;32465:16;:14;:16::i;:::-;32449:32;;32492:15;32510:34;32538:5;32510:23;32522:10;;32510:7;:11;;:23;;;;:::i;:::-;:27:::0;::::1;:34::i;:::-;32580:10;32571:20;::::0;;;:8:::1;:20;::::0;;;;;32492:52;;-1:-1:-1;32561:30:0;::::1;32557:93;;;-1:-1:-1::0;32627:10:0::1;32618:20;::::0;;;:8:::1;:20;::::0;;;;;32557:93:::1;32694:10;32685:20;::::0;;;:8:::1;:20;::::0;;;;;:33:::1;::::0;32710:7;32685:24:::1;:33::i;:::-;32671:10;32662:20;::::0;;;:8:::1;:20;::::0;;;;:56;32742:10:::1;::::0;:23:::1;::::0;32757:7;32742:14:::1;:23::i;:::-;32729:10;:36:::0;32841:1:::1;32816:21;32826:10;32816:9;:21::i;:::-;:26;32812:141;;32871:10;32885:5;32859:23:::0;;;:11:::1;:23;::::0;;;;:31;;-1:-1:-1;;32859:31:0::1;::::0;;32921:13:::1;::::0;:20:::1;::::0;32859:31;32921:17:::1;:20::i;:::-;32905:13;:36:::0;32812:141:::1;32963:4;::::0;;:34:::1;::::0;;-1:-1:-1;;;32963:34:0;;32977:10:::1;32963:34:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;32963:4:0;;::::1;::::0;:13:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33010:29:0::1;::::0;-1:-1:-1;33028:10:0::1;33010:17;:29::i;:::-;33050:16;:14;:16::i;:::-;33179:8;::::0;33166:52:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;33189:10:::1;::::0;33166:52:::1;::::0;;;;;;;;::::1;33314:4;33307:11;;;;;;2135:1:::0;3096:7;:22;31666:1660;;-1:-1:-1;31666:1660:0:o;40982:455::-;-1:-1:-1;;;;;41183:23:0;;41048:18;41183:23;;;:12;:23;;;;;:33;;41048:18;;41247:24;41196:9;41247:13;:24::i;:::-;-1:-1:-1;;;;;41358:23:0;;;;;;:12;:23;;;;;:36;;;;41396:32;;;;;41227:44;;-1:-1:-1;41329:100:0;;:28;:100::i;:::-;40982:455;;;;-1:-1:-1;41284:145:0;40982:455;-1:-1:-1;;40982:455:0:o;29995:1663::-;30067:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;30098:15:::1;::::0;::::1;;:24;30090:55;;;::::0;;-1:-1:-1;;;30090:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30090:55:0;;;;;;;;;;;;;::::1;;30172:4;::::0;;:26:::1;::::0;;-1:-1:-1;;;30172:26:0;;30187:10:::1;30172:26:::0;;::::1;::::0;;;;;30156:13:::1;::::0;-1:-1:-1;;;;;30172:4:0;;::::1;::::0;:14:::1;::::0;:26;;;;;::::1;::::0;;;;;;;;:4;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30172:26:0;;-1:-1:-1;30213:15:0;;::::1;30209:63;;;30255:5;30245:15;;30209:63;30384:1;30374:7;:11;30366:38;;;::::0;;-1:-1:-1;;;30366:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30366:38:0;;;;;;;;;;;;;::::1;;30423:19;::::0;30456:8:::1;::::0;30423:54:::1;::::0;;-1:-1:-1;;;30423:54:0;;::::1;::::0;::::1;::::0;;;;30466:10:::1;30423:54:::0;;;;;-1:-1:-1;;;;;30423:19:0;;::::1;::::0;:32:::1;::::0;:54;;;;;::::1;::::0;;;;;;;;;:19;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30423:54:0;:62:::1;;30481:4;30423:62;30415:92;;;::::0;;-1:-1:-1;;;30415:92:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30415:92:0;;;;;;;;;;;;;::::1;;30602:9;:7;:9::i;:::-;30622:13;30638:16;:14;:16::i;:::-;30712:4;::::0;;:53:::1;::::0;;-1:-1:-1;;;30712:53:0;;30730:10:::1;30712:53:::0;;::::1;::::0;;;;30750:4:::1;30712:53:::0;;;;;;;;;;;30622:32;;-1:-1:-1;;;;;;30712:4:0::1;::::0;:17:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;:4:::1;::::0;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;30812:10:0::1;::::0;30778:15:::1;::::0;30808:144:::1;;-1:-1:-1::0;30854:7:0;30808:144:::1;;;30904:36;30934:5;30905:23;30917:10;;30905:7;:11;;:23;;;;:::i;30904:36::-;30894:46;;30808:144;30994:10;30985:20;::::0;;;:8:::1;:20;::::0;;;;;:33:::1;::::0;31010:7;30985:24:::1;:33::i;:::-;30971:10;30962:20;::::0;;;:8:::1;:20;::::0;;;;;;;:56;;;;31052:8:::1;:20:::0;;;;:33:::1;::::0;31077:7;31052:24:::1;:33::i;:::-;31038:10;31029:20;::::0;;;:8:::1;:20;::::0;;;;:56;31113:12:::1;::::0;:25:::1;::::0;31130:7;31113:16:::1;:25::i;:::-;31098:12;:40:::0;31162:10:::1;::::0;:23:::1;::::0;31177:7;31162:14:::1;:23::i;:::-;31149:10;:36:::0;31246:10:::1;31234:23;::::0;;;:11:::1;:23;::::0;;;;;::::1;;31230:146;;31295:10;31283:23;::::0;;;:11:::1;:23;::::0;;;;:30;;-1:-1:-1;;31283:30:0::1;31309:4;31283:30:::0;;::::1;::::0;;;31344:13:::1;::::0;:20:::1;::::0;:17:::1;:20::i;:::-;31328:13;:36:::0;31230:146:::1;31386:16;:14;:16::i;:::-;31511:8;::::0;31502:48:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;31521:10:::1;::::0;31502:48:::1;::::0;;;;;;;;::::1;31646:4;31639:11;;;;;2135:1:::0;3096:7;:22;29995:1663;;-1:-1:-1;29995:1663:0:o;23685:408::-;23752:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;23797:10:::1;23783:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;:33;;:25:::0;:33:::1;23775:64;;;::::0;;-1:-1:-1;;;23775:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23775:64:0;;;;;;;;;;;;;::::1;;23858:19;::::0;23889:8:::1;::::0;-1:-1:-1;;;;;23858:19:0;;::::1;::::0;:30:::1;::::0;23899:10:::1;23911:21;23899:10:::0;23911:9:::1;:21::i;:::-;23858:75;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;23858:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23858:75:0;:83:::1;;23937:4;23858:83;23850:108;;;::::0;;-1:-1:-1;;;23850:108:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23850:108:0;;;;;;;;;;;;;::::1;;23983:10;23997:5;23969:25:::0;;;:13:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;23969:33:0::1;::::0;;24040:8:::1;::::0;24020:41;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;24079:4:0::1;2135:1:::0;3096:7;:22;23685:408;:::o;39919:484::-;40097:11;;39958:20;;;;;40135:16;:14;:16::i;:::-;40119:32;;40178:21;:19;:21::i;:::-;40223:12;;:54;;;-1:-1:-1;;;40223:54:0;;;;;;;;;;;;;;;;40162:37;;-1:-1:-1;;;;;;40223:12:0;;;;:26;;:54;;;;;;;;;;;;;;;:12;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40223:54:0;;-1:-1:-1;40292:16:0;;40288:108;;40338:46;40371:12;40338:28;:10;40353:12;40338:14;:28::i;:46::-;40325:59;;40288:108;39919:484;;;;;:::o;41485:697::-;-1:-1:-1;;;;;41577:23:0;;41547:7;41577:23;;;:12;:23;;;;;:33;41573:77;;-1:-1:-1;41637:1:0;41630:8;;41573:77;-1:-1:-1;;;;;41751:23:0;;41660:26;41751:23;;;:12;:23;;;;;:36;;;;41789:32;;;;;41722:100;;41751:36;41722:28;:100::i;:::-;41856:12;;41883:11;;41697:125;;-1:-1:-1;41833:20:0;;-1:-1:-1;;;;;;41856:12:0;;:26;;41896:16;:14;:16::i;:::-;41856:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41856:57:0;-1:-1:-1;;;;;41948:23:0;;41925:18;41948:23;;;:12;41856:57;41948:23;;;;:33;41856:57;;-1:-1:-1;41994:153:0;42022:18;42016:3;:24;41994:153;;;42075:60;42090:44;42123:10;42090:28;:10;42105:12;42090:14;:28::i;:44::-;42075:10;;:14;:60::i;:::-;42062:73;-1:-1:-1;42042:5:0;;41994:153;;;-1:-1:-1;42164:10:0;41485:697;-1:-1:-1;;;;41485:697:0:o;12168:39::-;;;-1:-1:-1;;;;;12168:39:0;;:::o;19374:715::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;19452:38:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;19644:38:::2;19594:29;19626:57:::0;:17:::2;:57;::::0;;-1:-1:-1;;;;;19786:19:0;::::2;19778:50;;;::::0;;-1:-1:-1;;;19778:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19778:50:0;;;;;;;;;;;;;::::2;;19923:19;:41:::0;;-1:-1:-1;;;;;;19923:41:0::2;-1:-1:-1::0;;;;;19923:41:0;;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;19975:20:0;;-1:-1:-1;;19975:20:0::2;::::0;;19374:715::o;33332:437::-;33379:21;33403:17;:15;:17::i;:::-;33379:41;;33453:18;;33437:13;:34;33433:282;;;33488:15;33506:37;33524:18;;33506:13;:17;;:37;;;;:::i;:::-;33488:55;;33558:22;33583:46;33623:5;33583:35;33595:22;;33583:7;:11;;:35;;;;:::i;:46::-;33665:18;;33558:71;;-1:-1:-1;33665:38:0;;33558:71;33665:22;:38::i;:::-;33644:18;:59;-1:-1:-1;;33433:282:0;33727:18;:34;33332:437::o;18625:685::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;18696:30:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;18879:30:::2;18829:29;18861:49:::0;:17:::2;:49;::::0;;-1:-1:-1;;;;;19013:19:0;::::2;19005:50;;;::::0;;-1:-1:-1;;;19005:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19005:50:0;;;;;;;;;;;;;::::2;;19150:12;:35:::0;;-1:-1:-1;;;;;;19150:35:0::2;-1:-1:-1::0;;;;;19150:35:0;;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;19196:20:0;;-1:-1:-1;;19196:20:0::2;::::0;;18625:685::o;40411:514::-;-1:-1:-1;;;;;40606:15:0;;;40469:18;40606:15;;;:8;:15;;;;;;;;;40648:4;;;:21;;-1:-1:-1;;;40648:21:0;;;;;;;;;;;40606:15;;40469:18;;;;;;;;40648:4;;;;;:14;;:21;;;;;40606:15;40648:21;;;;;;:4;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40648:21:0;-1:-1:-1;;;;;40690:22:0;;40739:20;;;;:13;40648:21;40739:20;;;;;40648:21;;-1:-1:-1;40690:22:0;;;-1:-1:-1;40739:20:0;;;;;-1:-1:-1;40792:16:0;40698:5;40792:9;:16::i;:::-;40772:36;;40835:10;40823:9;:22;40819:99;;;40881:25;:9;40895:10;40881:13;:25::i;:::-;40862:44;;40819:99;40411:514;;;;;;;;:::o;24101:1983::-;24191:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;24390:15:::1;::::0;;;::::1;;;:24;24382:55;;;::::0;;-1:-1:-1;;;24382:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24382:55:0;;;;;;;;;;;;;::::1;;24466:21;::::0;-1:-1:-1;;;;;24466:21:0::1;24452:10;:35;24448:122;;24512:10;-1:-1:-1::0;;;;;24512:23:0;::::1;;24504:54;;;::::0;;-1:-1:-1;;;24504:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24504:54:0;;;;;;;;;;;;;::::1;;24598:1;24588:7;:11;24580:41;;;::::0;;-1:-1:-1;;;24580:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24580:41:0;;;;;;;;;;;;;::::1;;24640:19;::::0;:54:::1;::::0;;-1:-1:-1;;;24640:54:0;;-1:-1:-1;;;;;24640:54:0;;::::1;;::::0;::::1;::::0;;;:19;;;::::1;::::0;:43:::1;::::0;:54;;;;;::::1;::::0;;;;;;;;:19;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24640:54:0;:63:::1;24632:96;;;::::0;;-1:-1:-1;;;24632:96:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24632:96:0;;;;;;;;;;;;;::::1;;24748:19;::::0;24781:8:::1;::::0;24748:62:::1;::::0;;-1:-1:-1;;;24748:62:0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;24748:62:0;;::::1;::::0;;;;;;;;;;;;:19;::::1;::::0;:32:::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;:19;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24748:62:0;:70:::1;;24814:4;24748:70;24740:100;;;::::0;;-1:-1:-1;;;24740:100:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;24740:100:0;;;;;;;;;;;;;::::1;;24935:9;:7;:9::i;:::-;24957:21;24981;:19;:21::i;:::-;24957:45;;25038:7;25021:13;:24;;25013:69;;;::::0;;-1:-1:-1;;;25013:69:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25139:11;::::0;:24:::1;::::0;25155:7;25139:15:::1;:24::i;:::-;25125:11;:38:::0;-1:-1:-1;;;;;25237:23:0;::::1;25215:19;25237:23:::0;;;:12:::1;:23;::::0;;;;25299:12;;25340:25:::1;25299:12:::0;25357:7;25340:16:::1;:25::i;:::-;25325:40:::0;;25390:22;25386:106:::1;;25445:3;25427:11;::::0;::::1;:21:::0;25479:1:::1;25461:15;::::0;::::1;:19:::0;25386:106:::1;-1:-1:-1::0;;;;;25540:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;;::::1;;25536:188;;-1:-1:-1::0;;;;;25588:22:0;::::1;;::::0;;;:11:::1;:22;::::0;;;;:29;;-1:-1:-1;;25588:29:0::1;25613:4;25588:29:::0;;::::1;::::0;;;25632:12:::1;:29:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;25632:29:0::1;25650:10;25632:29;::::0;;25692:13:::1;::::0;:20:::1;::::0;:17:::1;:20::i;:::-;25676:13;:36:::0;25536:188:::1;25778:4;::::0;;:33:::1;::::0;;-1:-1:-1;;;25778:33:0;;-1:-1:-1;;;;;25778:33:0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;:4;;;::::1;::::0;:13:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:4:::1;::::0;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25822:16:0::1;::::0;-1:-1:-1;25822:14:0::1;:16::i;:::-;25947:8;::::0;25938:38:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;25938:38:0;::::1;::::0;::::1;::::0;;;;;;;::::1;26072:4;26065:11;;;;;2135:1:::0;3096:7;:22;24101:1983;;-1:-1:-1;;24101:1983:0:o;37425:1660::-;37560:20;37582:22;37606:25;37633:24;37659:18;37740;37760:19;37787:11;-1:-1:-1;;;;;37787:29:0;;37817:9;37787:40;;;;;;;;;;;;;-1:-1:-1;;;;;37787:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37787:40:0;;;;;;;;;-1:-1:-1;37787:40:0;-1:-1:-1;37848:25:0;;;;37840:53;;;;;-1:-1:-1;;;37840:53:0;;;;;;;;;;;;-1:-1:-1;;;37840:53:0;;;;;;;;;;;;;;;37926:11;37910:13;:27;37906:87;;;37970:11;37954:27;;37906:87;38030:19;;:66;;;-1:-1:-1;;;38030:66:0;;;;;;;;-1:-1:-1;;;;;38030:66:0;;;;;;;;;38003:24;;38030:19;;;;;:43;;:66;;;;;;;;;;;;;;;:19;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38030:66:0;;-1:-1:-1;38111:32:0;;;38107:97;;;38176:16;38160:32;;38107:97;38239:27;:11;38255:10;38239:15;:27::i;:::-;38222:13;:44;;38214:80;;;;;-1:-1:-1;;;38214:80:0;;;;;;;;;;;;-1:-1:-1;;;38214:80:0;;;;;;;;;;;;;;;38330:19;;:60;;;-1:-1:-1;;;38330:60:0;;38383:4;38330:60;;;;;;-1:-1:-1;;;;;38330:19:0;;;;:31;;:60;;;;;;;;;;;;;:19;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38307:83;;;;;38420:19;;;;;;;;;-1:-1:-1;;;;;38420:19:0;-1:-1:-1;;;;;38420:31:0;;38473:11;38420:67;;;;;;;;;;;;;-1:-1:-1;;;;;38420:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38420:67:0;;;;-1:-1:-1;38498:22:0;38541:20;;38537:164;;38595:94;38638:50;38659:28;;38638:16;:20;;:50;;;;:::i;:::-;38595:38;38629:3;38595:29;:13;38613:10;38595:17;:29::i;:::-;:33;;:38::i;:94::-;38578:111;;38537:164;38736:1;38719:14;:18;38711:63;;;;;-1:-1:-1;;;38711:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38817:14;38793:20;38803:9;38793;:20::i;:::-;:38;;38785:91;;;;-1:-1:-1;;;38785:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39073:4;;39030:14;;-1:-1:-1;38989:13:0;;-1:-1:-1;37425:1660:0;;-1:-1:-1;37425:1660:0;;;-1:-1:-1;;;;;;37425:1660:0:o;12797:26::-;;;;:::o;12302:36::-;;;-1:-1:-1;;;;;12302:36:0;;:::o;10875:538::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;11035:29:::1;11067:17;:22;11085:3;11067:22;;;;;;;;;;;;;;;;;;;;;;;;;;;11035:54;;11204:26;11224:5;;11204:15;:19;;:26;;;;:::i;:::-;11184:17;::::0;;::::1;:46:::0;;;11241:19;;-1:-1:-1;;11241:19:0::1;;::::0;;11362:43:::1;::::0;::::1;::::0;11382:3;;11362:43;11382:3;11362:43:::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;9685:1;10875:538:::0;:::o;12440:43::-;;;;;;;;;;;;;:::o;9475:20::-;;;;:::o;33775:951::-;33862:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;34053:9:::1;:7;:9::i;:::-;34073:18;34094:21;:19;:21::i;:::-;34073:42;;34142:18;;34132:7;:28;34128:89;;;34187:18;;34177:28;;34128:89;34244:7;34231:10;:20;34227:73;;;34278:10;34268:20;;34227:73;34333:18;::::0;:31:::1;::::0;34356:7;34333:22:::1;:31::i;:::-;34312:18;:52:::0;34377:4:::1;::::0;;34391:17:::1;::::0;34377:41:::1;::::0;;-1:-1:-1;;;34377:41:0;;-1:-1:-1;;;;;34391:17:0;;::::1;34377:41:::0;;::::1;::::0;;;;;;;;;;;:4;::::1;::::0;:13:::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34429:16:0::1;::::0;-1:-1:-1;34429:14:0::1;:16::i;:::-;34569:8;::::0;34591:17:::1;::::0;34545:73:::1;::::0;;;;;-1:-1:-1;;;;;34591:17:0;;;::::1;34545:73;::::0;::::1;::::0;;;;;;;;34579:10:::1;::::0;34545:73:::1;::::0;;;;;;;;::::1;34714:4;34707:11;;;2135:1:::0;3096:7;:22;33775:951;;-1:-1:-1;33775:951:0:o;39097:216::-;39151:7;39195:1;39181:10;;:15;39177:56;;-1:-1:-1;39220:1:0;39213:8;;39177:56;39294:10;;-1:-1:-1;;;;;39272:15:0;;;;;;:8;:15;;;;;;39250:55;;39294:10;39251:37;;:16;:14;:16::i;39250:55::-;39243:62;39097:216;-1:-1:-1;;39097:216:0:o;44131:109::-;44178:16;44220:12;44213:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44213:19:0;;;;;;;;;;;;;;;;;;;;;;;44131:109;:::o;12978:29::-;;;;;;;;;:::o;17107:708::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;17187:40:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;17380:40:::2;17330:29;17362:59:::0;:17:::2;:59;::::0;;-1:-1:-1;;;;;17524:19:0;::::2;17516:50;;;::::0;;-1:-1:-1;;;17516:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;17516:50:0;;;;;;;;;;;;;::::2;;17661:21;:29:::0;;-1:-1:-1;;;;;;17661:29:0::2;-1:-1:-1::0;;;;;17661:29:0;;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;17701:20:0;;-1:-1:-1;;17701:20:0::2;::::0;;17107:708::o;20107:::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;20177:39:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;20369:39:::2;20319:29;20351:58:::0;:17:::2;:58;::::0;;-1:-1:-1;;;;;20512:19:0;::::2;20504:50;;;::::0;;-1:-1:-1;;;20504:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20504:50:0;;;;;;;;;;;;;::::2;;20649:19;:41:::0;;-1:-1:-1;;;;;;20649:41:0::2;-1:-1:-1::0;;;;;20649:41:0;;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;20701:20:0;;-1:-1:-1;;20701:20:0::2;::::0;;20107:708::o;9421:47::-;9461:7;9421:47;:::o;15872:1227::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;16052:30:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;16151:30:::2;16101:29;16133:49:::0;:17:::2;:49;::::0;;;;;16199:21:::2;::::0;::::2;;16195:132;;;16237:15;:22:::0;;-1:-1:-1;;16237:22:0::2;16255:4;16237:22;::::0;;16195:132:::2;;;16292:15;:23:::0;;-1:-1:-1;;16292:23:0::2;::::0;;16195:132:::2;16343:16;:21;;16363:1;16343:21;16339:136;;;16381:15;:22:::0;;-1:-1:-1;;16381:22:0::2;::::0;::::2;::::0;;16339:136:::2;;;16436:15;:23:::0;;-1:-1:-1;;16436:23:0::2;::::0;;16339:136:::2;16491:18;:23;;16513:1;16491:23;16487:138;;;16531:17;:24:::0;;-1:-1:-1;;16531:24:0::2;;;::::0;;16487:138:::2;;;16588:17;:25:::0;;-1:-1:-1;;16588:25:0::2;::::0;;16487:138:::2;16641:15;:20;;16660:1;16641:20;16637:129;;;16678:14;:21:::0;;-1:-1:-1;;16678:21:0::2;::::0;::::2;::::0;;16637:129:::2;;;16732:14;:22:::0;;-1:-1:-1;;16732:22:0::2;::::0;;16637:129:::2;16782:19;:24;;16805:1;16782:24;16778:141;;;16823:18;:25:::0;;-1:-1:-1;;16823:25:0::2;-1:-1:-1::0;;;16823:25:0::2;::::0;;16778:141:::2;;;16881:18;:26:::0;;-1:-1:-1;;16881:26:0::2;::::0;;16778:141:::2;16939:20:::0;;-1:-1:-1;;16939:20:0::2;::::0;;16977:114:::2;::::0;;16939:20:::2;16977:114:::0;;::::2;::::0;;;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;::::2;10028:1;9685::::1;;15872:1227:::0;;;;;:::o;43007:121::-;43091:4;;;:29;;;-1:-1:-1;;;43091:29:0;;43114:4;43091:29;;;;;;;;43058:7;;-1:-1:-1;;;;;43091:4:0;;;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43091:29:0;;-1:-1:-1;43007:121:0;:::o;12533:28::-;;;;:::o;13188:48::-;;;;:::o;9215:20::-;;;-1:-1:-1;;;;;9215:20:0;;:::o;13048:26::-;;;;;;;;;:::o;39682:98::-;39767:4;;-1:-1:-1;;;;;39767:4:0;39682:98;:::o;23250:423::-;23316:4;2179:1;2784:7;;:19;;2776:63;;;;;-1:-1:-1;;;2776:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2776:63:0;;;;;;;;;;;;;;;2179:1;2917:7;:18;23361:10:::1;23347:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;:34;23339:65;;;::::0;;-1:-1:-1;;;23339:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23339:65:0;;;;;;;;;;;;;::::1;;23423:19;::::0;23466:8:::1;::::0;23423:64:::1;::::0;;-1:-1:-1;;;23423:64:0;;::::1;::::0;::::1;::::0;;;;23476:10:::1;23423:64:::0;;;;;-1:-1:-1;;;;;23423:19:0;;::::1;::::0;:42:::1;::::0;:64;;;;;::::1;::::0;;;;;;;;;:19;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23423:64:0;:72:::1;;23491:4;23423:72;23415:113;;;::::0;;-1:-1:-1;;;23415:113:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23559:10;23545:25;::::0;;;:13:::1;:25;::::0;;;;;;;;:32;;-1:-1:-1;;23545:32:0::1;23573:4;23545:32;::::0;;23622:8:::1;::::0;23603:40;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;23661:4:0::1;2135:1:::0;3096:7;:22;23250:423;:::o;12254:39::-;;;-1:-1:-1;;;;;12254:39:0;;:::o;13120:42::-;;;;:::o;39537:137::-;-1:-1:-1;;;;;39633:23:0;39600:7;39633:23;;;:12;:23;;;;;:33;;39537:137::o;12498:28::-;;;;:::o;12345:32::-;;;-1:-1:-1;;;;;12345:32:0;;:::o;9368:46::-;9408:6;9368:46;:::o;12570:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12570:29:0;;-1:-1:-1;12570:29:0;:::o;9244:62::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20823:559::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;20882:18:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;20970:18:::2;20920:29;20952:37:::0;;;:17:::2;:37;::::0;21062:19;;20952:37;21062:34;;-1:-1:-1;;;21062:34:0;;::::2;::::0;::::2;::::0;;;;;20952:37;;20920:29;;;;;-1:-1:-1;;;;;21062:19:0;;::::2;::::0;:28:::2;::::0;:34;;;;;20920:29;;21062:34;;;;;;;;:19;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;21062:34:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;::::2;::::0;;;-1:-1:-1;;;21062:34:0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;;;21062:34:0;::::2;::::0;;::::2;::::0;-1:-1:-1;21062:34:0::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;21062:34:0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;21062:34:0::2;::::0;;;;21000:96;;-1:-1:-1;21000:96:0;;-1:-1:-1;21062:34:0;;-1:-1:-1;;;;;;;;21115:31:0;::::2;21141:4;21115:31;::::0;-1:-1:-1;21107:66:0::2;;;::::0;;-1:-1:-1;;;21107:66:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21107:66:0;;;;;;;;;;;;;::::2;;21223:4;::::0;-1:-1:-1;;;;;21192:36:0;;::::2;21223:4:::0;::::2;21192:36;21184:70;;;::::0;;-1:-1:-1;;;21184:70:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21184:70:0;;;;;;;;;;;;;::::2;;21284:4;21273:15:::0;::::2;;;21265:50;;;::::0;;-1:-1:-1;;;21265:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21265:50:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;21328:8:0::2;:15:::0;;;;-1:-1:-1;;21354:20:0;;-1:-1:-1;;21354:20:0::2;::::0;;20823:559::o;15288:576::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;15429:28:::1;9752;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;15508:17:::2;15476:29;15508:47:::0;;;::::2;::::0;;;15568:22:::2;:45:::0;;;15624:28:::2;:58:::0;;;15693:10:::2;:23:::0;;;15508:47;15737:20;;-1:-1:-1;;15737:20:0::2;::::0;;15508:47;15775:81;;;;;;;::::2;::::0;;;;;;;;;;15508:47;;15775:81:::2;::::0;;;;;;;;::::2;10028:1;9685::::1;;15288:576:::0;;;:::o;43270:327::-;43316:7;43342:21;43366:17;:15;:17::i;:::-;43342:41;;43394:27;43424:23;:21;:23::i;:::-;43394:53;;43484:13;43462:19;:35;43458:76;;;43521:1;43514:8;;;;;;43458:76;43551:38;:13;43569:19;43551:17;:38::i;:::-;43544:45;;;;43270:327;:::o;43605:518::-;43658:7;43684:21;43708:17;:15;:17::i;:::-;43766:18;;43815;;43684:41;;-1:-1:-1;43766:18:0;43799:34;;43795:284;;;43850:15;43868:37;43886:18;;43868:13;:17;;:37;;;;:::i;:::-;43850:55;;43920:22;43945:46;43985:5;43945:35;43957:22;;43945:7;:11;;:35;;;;:::i;:46::-;43920:71;-1:-1:-1;44028:39:0;:19;43920:71;44028:23;:39::i;:::-;44006:61;;43795:284;;;44096:19;-1:-1:-1;;43605:518:0;:::o;12830:33::-;;;;:::o;39321:208::-;-1:-1:-1;;;;;39415:24:0;;39385:7;39415:24;;;:13;:24;;;;;;;;39411:72;;-1:-1:-1;39470:1:0;39463:8;;39411:72;39501:20;39511:9;39501;:20::i;12944:27::-;;;;;;:::o;10229:167::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;9408:6:::1;10296;:23;;10288:32;;;::::0;::::1;;9461:7;10339:6;:23;;10331:32;;;::::0;::::1;;10374:5;:14:::0;10229:167::o;10404:463::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;10564:29:::1;10596:17;:22;10614:3;10596:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;;;-1:-1:-1;10596:22:0;10713:20;;-1:-1:-1;;10713:20:0::1;::::0;;10835:24;;10596:22;;-1:-1:-1;10835:24:0::1;::::0;10855:3;;10835:24;10855:3;10835:24:::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;9685:1;10404:463:::0;:::o;13081:30::-;;;-1:-1:-1;;;13081:30:0;;;;;:::o;12059:18::-;;;-1:-1:-1;;;;;12059:18:0;;:::o;22701:537::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;22776:36:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;22882:36:::2;22832:29;22864:55:::0;;;:17:::2;:55;::::0;22980:19:::2;::::0;22864:55;22980:34;;-1:-1:-1;;;22980:34:0;;::::2;::::0;::::2;::::0;;;;;22864:55;;22832:29;;;-1:-1:-1;;;;;22980:19:0;;::::2;::::0;:28:::2;::::0;:34;;;;;22832:29;;22980:34;;;;;;;;:19;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;22980:34:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;::::2;::::0;;;-1:-1:-1;;;22980:34:0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;;;22980:34:0;::::2;::::0;;::::2;::::0;-1:-1:-1;22980:34:0::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;22980:34:0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;22980:34:0::2;::::0;-1:-1:-1;;23041:8:0::2;::::0;22930:84;;-1:-1:-1;22930:84:0;;-1:-1:-1;;;23033:16:0;::::2;;23025:51;;;::::0;;-1:-1:-1;;;23025:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;23025:51:0;;;;;;;;;;;;;::::2;;23153:10;-1:-1:-1::0;;;;;23153:18:0::2;;23180:5;23196:1;23153:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;23153:46:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;23210:20:0;;-1:-1:-1;;23210:20:0::2;::::0;;;-1:-1:-1;;;;;22701:537:0:o;12902:33::-;;;;:::o;12214:::-;;;-1:-1:-1;;;;;12214:33:0;;:::o;42682:317::-;42733:7;42758:18;42779:21;:19;:21::i;:::-;42758:42;;42811:21;42864:18;;42851:10;:31;42847:114;;;42930:18;;42915:34;;:10;;:14;:34::i;:::-;42899:50;42682:317;-1:-1:-1;;;42682:317:0:o;11421:572::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;11490:29:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;11622:29:::2;11654:48:::0;;:17:::2;:48;::::0;;-1:-1:-1;;;;;11805:20:0;::::2;11797:48;;;::::0;;-1:-1:-1;;;11797:48:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;11797:48:0;;;;;;;;;;;;;::::2;;11940:5;:14:::0;;-1:-1:-1;;;;;;11940:14:0::2;-1:-1:-1::0;;;;;11940:14:0;;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;11965:20:0;;-1:-1:-1;;11965:20:0::2;::::0;;11421:572::o;17876:692::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;17952:36:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;18141:36:::2;18091:29;18123:55:::0;:17:::2;:55;::::0;;-1:-1:-1;;;;;18281:19:0;::::2;18273:50;;;::::0;;-1:-1:-1;;;18273:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;18273:50:0;;;;;;;;;;;;;::::2;;18418:17;:25:::0;;-1:-1:-1;;;;;;18418:25:0::2;-1:-1:-1::0;;;;;18418:25:0;;;::::2;::::0;;;::::2;::::0;;;-1:-1:-1;;18454:20:0;;-1:-1:-1;;18454:20:0::2;::::0;;17876:692::o;12386:43::-;;;;;;;;;;;;;:::o;12763:27::-;;;;:::o;22155:538::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;22227:33:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;22330:33:::2;22280:29;22312:52:::0;;;:17:::2;:52;::::0;22437:19:::2;::::0;22312:52;22437:34;;-1:-1:-1;;;22437:34:0;;::::2;::::0;::::2;::::0;;;;;22312:52;;22280:29;;;;;-1:-1:-1;;;;;22437:19:0;;::::2;::::0;:28:::2;::::0;:34;;;;;22280:29;;22437:34;;;;;;;;:19;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;22437:34:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;::::2;::::0;;;-1:-1:-1;;;22437:34:0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;;;22437:34:0;::::2;::::0;;::::2;::::0;-1:-1:-1;22437:34:0::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;22437:34:0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;22437:34:0::2;::::0;;;;22498:8:::2;::::0;22375:96;;-1:-1:-1;22375:96:0;;-1:-1:-1;22437:34:0;;-1:-1:-1;;;;22490:16:0;::::2;;22482:51;;;::::0;;-1:-1:-1;;;22482:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;22482:51:0;;;;;;;;;;;;;::::2;;22563:4;22552:15:::0;::::2;;;22544:50;;;::::0;;-1:-1:-1;;;22544:50:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;22544:50:0;;;;;;;;;;;;;::::2;;22607:10;-1:-1:-1::0;;;;;22607:18:0::2;;22634:5;-1:-1:-1::0;;22607:47:0::2;;;;;;;;;;;;;-1:-1:-1::0;;;;;22607:47:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;22665:20:0;;-1:-1:-1;;22665:20:0::2;::::0;;;-1:-1:-1;;;;;;22155:538:0:o;13252:40::-;;;;:::o;21390:757::-;9654:5;;-1:-1:-1;;;;;9654:5:0;9640:10;:19;9632:42;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;-1:-1:-1;;;9632:42:0;;;;;;;;;;;;;;;21453:37:::1;9752:28;;:::i;:::-;9783:17;:22;9801:3;9783:22;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;9783:22:0;9752:53;;;;::::1;::::0;;;;;::::1;;;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9824:20:0::1;9816:43;;;::::0;;-1:-1:-1;;;9816:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9816:43:0;;;;;;;;;;;;;::::1;;9899:15;9878:5;:17;;;:36;;9870:59;;;::::0;;-1:-1:-1;;;9870:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9870:59:0;;;;;;;;;;;;;::::1;;9948:17;::::0;::::1;::::0;9987:15:::1;::::0;9948:35:::1;::::0;9354:7:::1;9948:21;:35::i;:::-;:54;;9940:77;;;::::0;;-1:-1:-1;;;9940:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9940:77:0;;;;;;;;;;;;;::::1;;21560:37:::2;21510:29;21542:56:::0;;;:17:::2;:56;::::0;;;21632:19:::2;::::0;21542:56;21632:34;;-1:-1:-1;;;21632:34:0;;;;21542:56;;21510:29;-1:-1:-1;;;;;21632:19:0;;::::2;::::0;:32:::2;::::0;:34:::2;::::0;;::::2;::::0;;;;;;;:19;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;21632:34:0;;-1:-1:-1;21684:12:0::2;21679:429;21709:10;21702:4;:17;21679:429;;;21807:19;::::0;:34:::2;::::0;;-1:-1:-1;;;21807:34:0;;::::2;::::0;::::2;::::0;;;;;21746:18:::2;::::0;;;;;-1:-1:-1;;;;;21807:19:0;;::::2;::::0;:28:::2;::::0;:34;;;;;21746:18;;21807:34;;;;;;;;:19;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;21807:34:0::2;::::0;::::2;;::::0;::::2;::::0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;::::2;::::0;;;-1:-1:-1;;;21807:34:0;::::2;;;;;::::0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;;;21807:34:0;::::2;::::0;;::::2;::::0;-1:-1:-1;21807:34:0::2;;;;;::::0;::::2;;::::0;;-1:-1:-1;21807:34:0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;21807:34:0::2;::::0;;;;21891:8:::2;::::0;21745:96;;-1:-1:-1;21745:96:0;;-1:-1:-1;21807:34:0;;-1:-1:-1;;;;21883:16:0;::::2;::::0;::::2;::::0;:52:::2;;-1:-1:-1::0;21931:4:0::2;21920:15:::0;::::2;;;21883:52;:109;;;;-1:-1:-1::0;21987:4:0::2;::::0;-1:-1:-1;;;;;21956:36:0;;::::2;21987:4:::0;::::2;21956:36;;21883:109;21861:235;;;22032:10;-1:-1:-1::0;;;;;22032:18:0::2;;22059:5;-1:-1:-1::0;;22032:47:0::2;;;;;;;;;;;;;-1:-1:-1::0;;;;;22032:47:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;;21861:235:0::2;-1:-1:-1::0;;;21721:6:0::2;;21679:429;;;-1:-1:-1::0;;22119:20:0;;-1:-1:-1;;22119:20:0::2;::::0;;-1:-1:-1;;21390:757:0:o;35349:1191::-;35530:19;;:40;;;-1:-1:-1;;;35530:40:0;;;;;;;;;;35481:18;;;;-1:-1:-1;;;;;35530:19:0;;;;:28;;:40;;;;;35481:18;;35530:40;;;;;;;;:19;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35530:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35530:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35530:40:0;;;;;;-1:-1:-1;35530:40:0;;;;;;;;;;-1:-1:-1;35530:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35530:40:0;;;;-1:-1:-1;;;35591:32:0;;35612:10;35591:32;;;;;35480:90;;-1:-1:-1;35480:90:0;;-1:-1:-1;35627:13:0;;-1:-1:-1;;;;;35591:20:0;;;;;-1:-1:-1;35591:32:0;;;;;-1:-1:-1;35530:40:0;;-1:-1:-1;35591:32:0;;-1:-1:-1;35591:32:0;;;;;:20;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35591:32:0;:49;;35583:85;;;;;-1:-1:-1;;;35583:85:0;;;;;;;;;;;;-1:-1:-1;;;35583:85:0;;;;;;;;;;;;;;;35681:65;;;-1:-1:-1;;;35681:65:0;;35705:10;35681:65;;;;35725:4;35681:65;;;;;;;;;;;;-1:-1:-1;;;;;35681:23:0;;;;;:65;;;;;;;;;;;;;;-1:-1:-1;35681:23:0;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35763:37:0;;;-1:-1:-1;;;35763:37:0;;-1:-1:-1;;;;;35763:37:0;;;;;;;;;;;;;;;:11;;;;;;:37;;;;;35681:65;;35763:37;;;;;;;;-1:-1:-1;35763:11:0;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35763:37:0;35759:118;;35826:39;;;-1:-1:-1;;;35826:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35759:118;35887:21;35911;:19;:21::i;:::-;35887:45;;35968:14;35951:13;:31;;35943:76;;;;;-1:-1:-1;;;35943:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36040:15;36058:52;36093:16;:14;:16::i;:::-;36077:10;;36058:30;;:14;;:18;:30::i;:52::-;-1:-1:-1;;;;;36137:19:0;;;;;;:8;:19;;;;;;36040:70;;-1:-1:-1;36127:29:0;;36123:91;;;-1:-1:-1;;;;;;36183:19:0;;;;;;:8;:19;;;;;;36123:91;-1:-1:-1;;;;;36248:19:0;;;;;;:8;:19;;;;;;:32;;36272:7;36248:23;:32::i;:::-;-1:-1:-1;;;;;36226:19:0;;;;;;:8;:19;;;;;:54;36306:10;;:23;;36321:7;36306:14;:23::i;:::-;36293:10;:36;36370:1;36346:20;36356:9;36346;:20::i;:::-;:25;36342:139;;-1:-1:-1;;;;;36388:22:0;;36413:5;36388:22;;;:11;:22;;;;;:30;;-1:-1:-1;;36388:30:0;;;36449:13;;:20;;36388:30;36449:17;:20::i;:::-;36433:13;:36;36342:139;36491:4;;;:41;;;-1:-1:-1;;;36491:41:0;;36505:10;36491:41;;;;;;;;;;;;;;-1:-1:-1;;;;;36491:4:0;;;;:13;;:41;;;;;;;;;;;;;;:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;35349:1191:0:o;35038:303::-;35105:13;35121:16;35131:5;35121:9;:16::i;:::-;-1:-1:-1;;;;;35167:15:0;;35148:16;35167:15;;;:8;:15;;;;;;35105:32;;-1:-1:-1;35197:17:0;;;35193:140;;-1:-1:-1;;;;;35231:15:0;;;;;;:8;:15;;;;;:23;;;35284:12;;:37;;35249:5;;35284:26;;35301:8;35284:16;:26::i;:37::-;35269:12;:52;35193:140;35038:303;;;:::o;34941:91::-;35007:17;:15;:17::i;1031:149::-;1089:7;1117:5;;;1137:6;;;;1129:30;;;;;-1:-1:-1;;;1129:30:0;;;;;;;;;;;;-1:-1:-1;;;1129:30:0;;;;;;;;;;;;;;835:129;893:7;922:1;917;:6;;909:30;;;;;-1:-1:-1;;;909:30:0;;;;;;;;;;;;-1:-1:-1;;;909:30:0;;;;;;;;;;;;;;;-1:-1:-1;953:5:0;;;835:129::o;36596:818::-;36719:20;36743:27;:11;36759:10;36743:15;:27::i;:::-;36719:51;-1:-1:-1;36781:21:0;36805:30;:12;36719:51;36805:16;:30::i;:::-;36781:54;;36868:10;36852:13;:26;36848:85;;;-1:-1:-1;36911:10:0;36848:85;36947:16;;36943:286;;36981:22;37006:51;37051:5;37006:40;37023:22;;37006:12;:16;;:40;;;;:::i;:51::-;37093:18;;36981:76;;-1:-1:-1;37093:38:0;;36981:76;37093:22;:38::i;:::-;37072:18;:59;37167:8;;37151:66;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37151:66:0;;;;;;;;;;;;;36943:286;;37245:17;;37241:166;;37293:11;;:30;;37309:13;37293:15;:30::i;:::-;37279:11;:44;37360:8;;37343:52;;;;;;;;;;;;;;-1:-1:-1;;;;;37343:52:0;;;;;;;;;;;;37241:166;36596:818;;;;;;:::o;151:196::-;209:7;229:6;225:37;;-1:-1:-1;253:1:0;246:8;;225:37;280:5;;;284:1;280;:5;:1;300:5;;;;;:10;292:34;;;;;-1:-1:-1;;;292:34:0;;;;;;;;;;;;-1:-1:-1;;;292:34:0;;;;;;;;;;;;;;434:283;492:7;520:1;516;:5;508:29;;;;;-1:-1:-1;;;508:29:0;;;;;;;;;;;;-1:-1:-1;;;508:29:0;;;;;;;;;;;;;;;596:9;612:1;608;:5;;;;;;;434:283;-1:-1:-1;;;;434:283:0:o;42258:416::-;42359:26;;42437:13;;42433:234;;42512:10;;42487:36;;42488:18;:3;42496:9;42488:7;:18::i;42487:36::-;42465:58;-1:-1:-1;42558:25:0;42465:58;42581:1;42558:22;:25::i;:::-;42536:47;-1:-1:-1;42618:37:0;42536:47;42641:13;42618:22;:37::i;:::-;42596:59;;42433:234;42258:416;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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