Contract 0x024fdf9702c5ed031defeb380ca4d198435b305d

Contract Overview

Balance:
0 AVAX

AVAX Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x20a189f71c756c8dbf265bde571846320897bdfa1bee352090480722573b9d4bRedeem55548522021-10-12 20:06:3251 days 7 hrs ago0xac8bed5900d90af49040e5e89624f9090fb81a9e IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.004252925 25
0x2afa35d99993b4afc0660dd7384ed942fd7f2f1e99dd7201a595801544787106Repay Borrow55548002021-10-12 20:04:4351 days 7 hrs ago0xac8bed5900d90af49040e5e89624f9090fb81a9e IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.00805115 50
0x95c23ece3c919d3a24137085982e008a54652a28a4eb3718b6df15ced9098249Transfer48400812021-09-25 19:52:5568 days 7 hrs ago0xe6f32f17be3bf031b4b6150689c1f17ceca375c8 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0010086 25
0x5a4e6c15381a4bb3e6b2ef34659dbe6f9f63053ec18fb62d5ffeadfdf159f6fbRedeem Underlyin...47692332021-09-24 2:58:3970 days 26 mins ago0x3735773a5aa173c2d576a27185b233ca4c5510b5 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.00556325 25
0xe147e909ad1fcdad8fdf2842d0a499eb32dc056e38bcaf429b5f7ddaf9c043d5Repay Borrow47680732021-09-24 2:17:5670 days 1 hr ago0x01a4391500efaa6edd152711f1bb163c5d77f98c IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0097687 50
0xaf956774239e84ce242a67cc8c89e536bd486cfd0ae57b420f745e85d19218b9Redeem Underlyin...47680422021-09-24 2:16:4570 days 1 hr ago0x01a4391500efaa6edd152711f1bb163c5d77f98c IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.00832425 50
0x8e35eac80c2849b01887ef2a6b8c60a93383ec7aa0e7f86be6c7492066ee2df3Redeem Underlyin...47680382021-09-24 2:16:3770 days 1 hr ago0x01a4391500efaa6edd152711f1bb163c5d77f98c IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0102721 50
0x95c250cd0ca1f1a29c7988480be1344dfe64b5bab944e55be420a92c91bee313Repay Borrow47677812021-09-24 2:07:3370 days 1 hr ago0x01a4391500efaa6edd152711f1bb163c5d77f98c IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0097535 50
0x7192d867750a6f5cd3192cee98f0fefa7b5c80805aabd669d73374d5fa81e8beRedeem Underlyin...46593542021-09-21 15:32:1372 days 11 hrs ago0xd0e02c7378de8004de798218d9f5201e328dd78f IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.029128929028 83.750748345
0x8eff06128811f872187cfce8ac695d4a9a9da693a5ef694bd0afe76b7e90f717Redeem46593232021-09-21 15:31:2472 days 11 hrs ago0xd0e02c7378de8004de798218d9f5201e328dd78f IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.02605065 75
0x853d6341655f1e6add6eef7ef3cade59fe14b6053154643782afd99f99da6e4fRedeem Underlyin...46587632021-09-21 15:13:1472 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.02497275 150
0xdc2ae448f2de988db8c7dbb74606db66ffabdce498d224958b018d818029339eRedeem Underlyin...46587502021-09-21 15:12:4672 days 12 hrs ago0xf80633724f03dd47d708bde889a283233f2121c1 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0237897875 77.5
0xee2247ac7f961f7d039a48576cd6ba5e5d2587a5149102480226154452c4f712Repay Borrow46587432021-09-21 15:12:3272 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0266955 150
0x453ce3ab8484e9d3e59b53de62885152a1ae14ef61dee5e998459f98eaddc005Redeem Underlyin...46586992021-09-21 15:10:5972 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0308163 150
0xb8d5b6bbade1d3372d17700ea8e3e7d7f8d9b1db41f569ab31f7f186fdcb60d0Redeem Underlyin...46586842021-09-21 15:10:3872 days 12 hrs ago0xf80633724f03dd47d708bde889a283233f2121c1 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.017690154434 81.845057577
0x65fc0805df0f141b4e3953117a739671d0a0cbd1c938389c3e4fb3a79ba6577eRepay Borrow46586802021-09-21 15:10:2972 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.02967892767 166.763654946
0x29643d3baab41d3163fd09c03dbe7dc955523b08416cce7718bc04fa9ebb0696Redeem Underlyin...46585832021-09-21 15:08:0872 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0282513 150
0x48eaf1238596d90c70d4cd474b71ff3af9367c1a3ef2044d1e73ca64ed9d160cRedeem Underlyin...46585632021-09-21 15:07:2272 days 12 hrs ago0xf80633724f03dd47d708bde889a283233f2121c1 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.01675054 77.5
0x2edf61707ba7e1e81e3c9fc30743e8626629a1e4ed76d2c1e17d45086d09eb47Repay Borrow46585562021-09-21 15:07:0772 days 12 hrs ago0xae0a739c3724bb5cd2bdcf73764c87a5a6ec21a3 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.034792384182195.162413938
0x3ab1a11dc4a9f15d1d67a81716e0b7a74cd923ffee828ed14607623bff11d528Redeem Underlyin...46582052021-09-21 14:59:3772 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.038347048757 186.656325178
0x0caa6199ef5ff6486efca9b0988e358b6b351d254e544dfc2fa2a0aef2e01656Redeem Underlyin...46581592021-09-21 14:58:3472 days 12 hrs ago0xf80633724f03dd47d708bde889a283233f2121c1 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.019172886567 88.707510863
0x0f2ac46d0dbedc4032324b8a0fda514796895db7fe8d20ff1a88130f5d715f6dRepay Borrow46581512021-09-21 14:58:1972 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.036994894403 189.64932795
0xaa0312c8931cd483dc02c71c54dd114d2154ef0f6a3a5da624964eee8ac34454Redeem Underlyin...46573802021-09-21 14:41:2472 days 12 hrs ago0xf80633724f03dd47d708bde889a283233f2121c1 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.1205982450
0xddb6eaacaee8bed39096a0e9065198442fce5dffa3d8764f0151232cd6610289Redeem Underlyin...46573492021-09-21 14:40:5772 days 12 hrs ago0xd0e02c7378de8004de798218d9f5201e328dd78f IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.150309245437 431.9045025
0x6d7b74b5088f5c6d07d7f2a82916a0859a53653c0bdb85aa4900218ca7cbac56Redeem Underlyin...46573382021-09-21 14:40:5472 days 12 hrs ago0x0e33a29dd142c3f2c07e2f5d7694f1a2dbda0db2 IN  0x024fdf9702c5ed031defeb380ca4d198435b305d0 AVAX0.0847485 450
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7677eb0896f87fba6094b3e931479e3510f7344394bed9b595e289f2014dcaaf46278782021-09-20 23:14:0473 days 4 hrs ago 0x3f49d4228684de50fa09ebd53412db9efc4af685 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x7677eb0896f87fba6094b3e931479e3510f7344394bed9b595e289f2014dcaaf46278782021-09-20 23:14:0473 days 4 hrs ago 0xbc7f7f8927460bc333f8e29c7f3086e2d4c6e20f 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x35521b3e2eef1ebe2298e8d8a11271cf9901405deefcc0045e16496c759f3eee46278772021-09-20 23:14:0173 days 4 hrs ago 0xa9cc3cbe284ad508cf388c27b1ce2c84fb3ba723 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x4f73f87c9bb3cae3da1eaddaafbed8878e5625c9d43c3a7b06175dd81dbc8cd546278762021-09-20 23:13:5873 days 4 hrs ago 0xa478415fbe7da5b28982aaf37a80498175221827 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x4f73f87c9bb3cae3da1eaddaafbed8878e5625c9d43c3a7b06175dd81dbc8cd546278762021-09-20 23:13:5873 days 4 hrs ago 0x3ee31f2913774899c6acd8fb6d5474116b468e0a 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x3a84c636bbdb5195d6e8f8bea81b83ed98616e65eae8092349d379e292c934bb46278752021-09-20 23:13:5573 days 4 hrs ago 0xa49446e3d731fc2a9c3af12adef6e68ed65964a2 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x84f58aeba09166265578477012b500251384ca1322a7aae81bc144b233f8672e46278752021-09-20 23:13:5573 days 4 hrs ago 0xf88cad4d23335ab24bff7bb772cd968d5b8837b6 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x9def0934ab88b0750c9f6770f59ca05d904e2902b9dcbc1e40a010444447f7ea46278742021-09-20 23:13:5273 days 4 hrs ago 0x81d0a77a597aabf7e0087dab6c9600e884d44679 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x9def0934ab88b0750c9f6770f59ca05d904e2902b9dcbc1e40a010444447f7ea46278742021-09-20 23:13:5273 days 4 hrs ago 0x3fb70e36505e5c5f903cde54a9969d15cf67cdcb 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xc233716e688c67c5177497b8b4e12bfbd90519aa0f1c638607ba1800544271e646278732021-09-20 23:13:4973 days 4 hrs ago 0xf718cbbe9c4c40203a9c1b3d7aff403f0f58472c 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xc233716e688c67c5177497b8b4e12bfbd90519aa0f1c638607ba1800544271e646278732021-09-20 23:13:4973 days 4 hrs ago 0xdc7e3c94c58db6e2c428fedcbfe0c0a7354a0dc3 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xc233716e688c67c5177497b8b4e12bfbd90519aa0f1c638607ba1800544271e646278732021-09-20 23:13:4973 days 4 hrs ago 0xc3dd7f56c5ad688f07aa552bfb393d8d05eb8ff1 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x75f9f5044ff2acb8271f09e2aefbce91fbe7d3ca3867d034cea7215da56fafa646277612021-09-20 23:11:5173 days 4 hrs ago 0xfd1580619b687d487d102b1ad6c1ddabb1eab0c5 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x3485b75a0c82bf5fde0fdea07add1e67bfa0f358e5c4e509eeeea1cfe5c5d65546277552021-09-20 23:11:4873 days 4 hrs ago 0x10efc88d55cad9297e0d01e219f0c078bf9057cb 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x3485b75a0c82bf5fde0fdea07add1e67bfa0f358e5c4e509eeeea1cfe5c5d65546277552021-09-20 23:11:4873 days 4 hrs ago 0xa7814af85f4328003e60f1892f51ef3a9c6b1e3c 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x2797088063d40d30a22c4412a01b90c89bbadc76e047028cd5bbb53256e4d4bc46277532021-09-20 23:11:4573 days 4 hrs ago 0x749d6929315f4a3ae730523e6c6183f2c1a0aec1 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x7b4bbca58505ccc6533fb0b9273798caeaf669a92f254a15e1039d4893261da446277522021-09-20 23:11:4273 days 4 hrs ago 0x7bb9bc70f87cced0a6f8e35afd36a8dcc4e2edee 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x7b4bbca58505ccc6533fb0b9273798caeaf669a92f254a15e1039d4893261da446277522021-09-20 23:11:4273 days 4 hrs ago 0xd06ee6277a139f37b7af58f964ce0cee8b42ee64 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xb18a8b88fa75fbfc91f5178ec394899870900f066731ed9c0e3df83f7732e0a646277492021-09-20 23:11:3973 days 4 hrs ago 0xa0b055dc4aaf37c8358ab554d906e9c6084a1d0b 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xa6a808f52b3563994c13e4947b6dbd4e05484a0ebef731fe1f4adf3b7e25cca046277482021-09-20 23:11:3673 days 4 hrs ago 0xdcaaa333cef24ee67570cea6011866fa097a7e38 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xa6a808f52b3563994c13e4947b6dbd4e05484a0ebef731fe1f4adf3b7e25cca046277482021-09-20 23:11:3673 days 4 hrs ago 0x8feed9ee9225488b09e6aa06608a014f09db0721 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x2c897b049dc9f545ecff5deac6e25231603724ad7a13c7505f93764ff8fd545c46277472021-09-20 23:11:3373 days 4 hrs ago 0x772e78b36cc716f626ddab65d0199582ba1372fe 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xc52c51cc0c10f95394a4cb5a937cf521fe2136d1afbd2ef3918ac7bba10b956e46277462021-09-20 23:11:3073 days 4 hrs ago 0xbe4ebd99ca2f9989902479a1a25109f3c0c7eb33 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0xc52c51cc0c10f95394a4cb5a937cf521fe2136d1afbd2ef3918ac7bba10b956e46277462021-09-20 23:11:3073 days 4 hrs ago 0x494d4219c523cd3782ecb41d3534cb9864aed7db 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
0x0b56c88424ffb626c73955ec13c909f02ddfe53f8b17cf6187f606da53c5402046277432021-09-20 23:11:2773 days 4 hrs ago 0x6ed8410c29eca383ebe490d04fa3425445841203 0x024fdf9702c5ed031defeb380ca4d198435b305d0.05 AVAX
[ Download CSV Export 
Loading

Similar_Match_Source_Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x60655668622B81f2a48B2095f593a8B5690Aa1Bd

Contract Name:
CErc20Immutable

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2021-11-08
*/

pragma solidity >=0.8.0;


contract ExponentialNoError {
    uint constant expScale = 1e18;
    uint constant doubleScale = 1e36;
    uint constant halfExpScale = expScale/2;
    uint constant mantissaOne = expScale;

    struct Exp {
        uint mantissa;
    }

    struct Double {
        uint mantissa;
    }

    
    function truncate(Exp memory exp) pure internal returns (uint) {
        // Note: We are not using careful math here as we're performing a division that cannot fail
        return exp.mantissa / expScale;
    }

    
    function mul_ScalarTruncate(Exp memory a, uint scalar) pure internal returns (uint) {
        Exp memory product = mul_(a, scalar);
        return truncate(product);
    }

    
    function mul_ScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (uint) {
        Exp memory product = mul_(a, scalar);
        return add_(truncate(product), addend);
    }

    
    function lessThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa < right.mantissa;
    }

    
    function lessThanOrEqualExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa <= right.mantissa;
    }

    
    function greaterThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa > right.mantissa;
    }

    
    function isZeroExp(Exp memory value) pure internal returns (bool) {
        return value.mantissa == 0;
    }

    function safe224(uint n, string memory errorMessage) pure internal returns (uint224) {
        require(n < 2**224, errorMessage);
        return uint224(n);
    }

    function safe32(uint n, string memory errorMessage) pure internal returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function add_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: add_(a.mantissa, b.mantissa)});
    }

    function add_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: add_(a.mantissa, b.mantissa)});
    }

    function add_(uint a, uint b) pure internal returns (uint) {
        return add_(a, b, "addition overflow");
    }

    function add_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        uint c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: sub_(a.mantissa, b.mantissa)});
    }

    function sub_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: sub_(a.mantissa, b.mantissa)});
    }

    function sub_(uint a, uint b) pure internal returns (uint) {
        return sub_(a, b, "subtraction underflow");
    }

    function sub_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function mul_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: mul_(a.mantissa, b.mantissa) / expScale});
    }

    function mul_(Exp memory a, uint b) pure internal returns (Exp memory) {
        return Exp({mantissa: mul_(a.mantissa, b)});
    }

    function mul_(uint a, Exp memory b) pure internal returns (uint) {
        return mul_(a, b.mantissa) / expScale;
    }

    function mul_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: mul_(a.mantissa, b.mantissa) / doubleScale});
    }

    function mul_(Double memory a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: mul_(a.mantissa, b)});
    }

    function mul_(uint a, Double memory b) pure internal returns (uint) {
        return mul_(a, b.mantissa) / doubleScale;
    }

    function mul_(uint a, uint b) pure internal returns (uint) {
        return mul_(a, b, "multiplication overflow");
    }

    function mul_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        if (a == 0 || b == 0) {
            return 0;
        }
        uint c = a * b;
        require(c / a == b, errorMessage);
        return c;
    }

    function div_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
        return Exp({mantissa: div_(mul_(a.mantissa, expScale), b.mantissa)});
    }

    function div_(Exp memory a, uint b) pure internal returns (Exp memory) {
        return Exp({mantissa: div_(a.mantissa, b)});
    }

    function div_(uint a, Exp memory b) pure internal returns (uint) {
        return div_(mul_(a, expScale), b.mantissa);
    }

    function div_(Double memory a, Double memory b) pure internal returns (Double memory) {
        return Double({mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa)});
    }

    function div_(Double memory a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: div_(a.mantissa, b)});
    }

    function div_(uint a, Double memory b) pure internal returns (uint) {
        return div_(mul_(a, doubleScale), b.mantissa);
    }

    function div_(uint a, uint b) pure internal returns (uint) {
        return div_(a, b, "divide by zero");
    }

    function div_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function fraction(uint a, uint b) pure internal returns (Double memory) {
        return Double({mantissa: div_(mul_(a, doubleScale), b)});
    }
}





            
pragma solidity >=0.8.0;


contract CarefulMath {

    
    enum MathError {
        NO_ERROR,
        DIVISION_BY_ZERO,
        INTEGER_OVERFLOW,
        INTEGER_UNDERFLOW
    }

    
    function mulUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (a == 0) {
            return (MathError.NO_ERROR, 0);
        }

        uint c = a * b;

        if (c / a != b) {
            return (MathError.INTEGER_OVERFLOW, 0);
        } else {
            return (MathError.NO_ERROR, c);
        }
    }

    
    function divUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (b == 0) {
            return (MathError.DIVISION_BY_ZERO, 0);
        }

        return (MathError.NO_ERROR, a / b);
    }

    
    function subUInt(uint a, uint b) internal pure returns (MathError, uint) {
        if (b <= a) {
            return (MathError.NO_ERROR, a - b);
        } else {
            return (MathError.INTEGER_UNDERFLOW, 0);
        }
    }

    
    function addUInt(uint a, uint b) internal pure returns (MathError, uint) {
        uint c = a + b;

        if (c >= a) {
            return (MathError.NO_ERROR, c);
        } else {
            return (MathError.INTEGER_OVERFLOW, 0);
        }
    }

    
    function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) {
        (MathError err0, uint sum) = addUInt(a, b);

        if (err0 != MathError.NO_ERROR) {
            return (err0, 0);
        }

        return subUInt(sum, c);
    }
}




            
pragma solidity >=0.8.0;


interface EIP20NonStandardInterface {

    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address owner) external view returns (uint256 balance);

    ///
    /// !!!!!!!!!!!!!!
    /// !!! NOTICE !!! `transfer` does not return a value, in violation of the ERC-20 specification
    /// !!!!!!!!!!!!!!
    ///

    
    function transfer(address dst, uint256 amount) external;

    ///
    /// !!!!!!!!!!!!!!
    /// !!! NOTICE !!! `transferFrom` does not return a value, in violation of the ERC-20 specification
    /// !!!!!!!!!!!!!!
    ///

    
    function transferFrom(address src, address dst, uint256 amount) external;

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

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

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}





            
pragma solidity >=0.8.0;


abstract contract InterestRateModel {
    /// @notice Indicator that this is an InterestRateModel contract (for inspection)
    bool public constant isInterestRateModel = true;

    
    function getBorrowRate(uint cash, uint borrows, uint reserves) external virtual view returns (uint);

    
    function getSupplyRate(uint cash, uint borrows, uint reserves, uint reserveFactorMantissa) external virtual view returns (uint);

}





            
pragma solidity >=0.8.0;

abstract contract ComptrollerInterface {
    /// @notice Indicator that this is a Comptroller contract (for inspection)
    bool public constant isComptroller = true;

    

    function enterMarkets(address[] calldata cTokens) external virtual returns (uint[] memory);
    function exitMarket(address cToken) external virtual returns (uint);

    

    function mintAllowed(address cToken, address minter, uint mintAmount) external virtual returns (uint);
    function mintVerify(address cToken, address minter, uint mintAmount, uint mintTokens) external virtual;

    function redeemAllowed(address cToken, address redeemer, uint redeemTokens) external virtual returns (uint);
    function redeemVerify(address cToken, address redeemer, uint redeemAmount, uint redeemTokens) external virtual;

    function borrowAllowed(address cToken, address borrower, uint borrowAmount) external virtual returns (uint);
    function borrowVerify(address cToken, address borrower, uint borrowAmount) external virtual;

    function repayBorrowAllowed(
        address cToken,
        address payer,
        address borrower,
        uint repayAmount) external virtual returns (uint);
    function repayBorrowVerify(
        address cToken,
        address payer,
        address borrower,
        uint repayAmount,
        uint borrowerIndex) external virtual;

    function liquidateBorrowAllowed(
        address cTokenBorrowed,
        address cTokenCollateral,
        address liquidator,
        address borrower,
        uint repayAmount) external virtual returns (uint);
    function liquidateBorrowVerify(
        address cTokenBorrowed,
        address cTokenCollateral,
        address liquidator,
        address borrower,
        uint repayAmount,
        uint seizeTokens) external virtual;

    function seizeAllowed(
        address cTokenCollateral,
        address cTokenBorrowed,
        address liquidator,
        address borrower,
        uint seizeTokens) external virtual returns (uint);
    function seizeVerify(
        address cTokenCollateral,
        address cTokenBorrowed,
        address liquidator,
        address borrower,
        uint seizeTokens) external virtual;

    function transferAllowed(address cToken, address src, address dst, uint transferTokens) external virtual returns (uint);
    function transferVerify(address cToken, address src, address dst, uint transferTokens) external virtual;

    

    function liquidateCalculateSeizeTokens(
        address cTokenBorrowed,
        address cTokenCollateral,
        uint repayAmount) external virtual view returns (uint, uint);
    function getBlockNumber() public virtual view returns (uint);
}





            


pragma solidity ^0.8.0;

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


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




            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT

pragma solidity >=0.5.16 <0.9.0;

library BytesLib {
    function concatBytesSig(bytes4 signature, bytes memory data1, bytes memory data2) internal pure returns(bytes memory combined) {
        bytes memory tempBytes;
        assembly {
            tempBytes := mload(0x40)

            let length := mload(data1)
            mstore(tempBytes, length)

            let mc := add(tempBytes, 0x20)
            mstore(mc, signature)
            mc := add(mc, 4)
            let end := add(mc, length)

            for {
                let cc := add(data1, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            length := mload(data2)
            mstore(tempBytes, add(4, add(length, mload(tempBytes))))

            mc := end
            end := add(mc, length)

            for {
                let cc := add(data2, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            mstore(0x40, and(
              add(add(end, iszero(add(4, add(length, mload(data1))))), 31),
              not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }
}




            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
pragma solidity >=0.5.0;

interface IVeeProxyController {
    function deposit(address account, address token, uint256 amount, uint8 leverage) external payable;
}




            
pragma solidity >=0.8.0;


interface EIP20Interface {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address owner) external view returns (uint256 balance);

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

    
    function transferFrom(address src, address dst, uint256 amount) external returns (bool success);

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

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

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}





            
pragma solidity >=0.8.0;

////import "./CarefulMath.sol";
////import "./ExponentialNoError.sol";


contract Exponential is CarefulMath, ExponentialNoError {
    
    function getExp(uint num, uint denom) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint scaledNumerator) = mulUInt(num, expScale);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        (MathError err1, uint rational) = divUInt(scaledNumerator, denom);
        if (err1 != MathError.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: rational}));
    }

    
    function addExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        (MathError error, uint result) = addUInt(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    
    function subExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        (MathError error, uint result) = subUInt(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    
    function mulScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: scaledMantissa}));
    }

    
    function mulScalarTruncate(Exp memory a, uint scalar) pure internal returns (MathError, uint) {
        (MathError err, Exp memory product) = mulScalar(a, scalar);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return (MathError.NO_ERROR, truncate(product));
    }

    
    function mulScalarTruncateAddUInt(Exp memory a, uint scalar, uint addend) pure internal returns (MathError, uint) {
        (MathError err, Exp memory product) = mulScalar(a, scalar);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return addUInt(truncate(product), addend);
    }

    
    function divScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
        (MathError err0, uint descaledMantissa) = divUInt(a.mantissa, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (MathError.NO_ERROR, Exp({mantissa: descaledMantissa}));
    }

    
    function divScalarByExp(uint scalar, Exp memory divisor) pure internal returns (MathError, Exp memory) {
        
        (MathError err0, uint numerator) = mulUInt(expScale, scalar);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }
        return getExp(numerator, divisor.mantissa);
    }

    
    function divScalarByExpTruncate(uint scalar, Exp memory divisor) pure internal returns (MathError, uint) {
        (MathError err, Exp memory fraction) = divScalarByExp(scalar, divisor);
        if (err != MathError.NO_ERROR) {
            return (err, 0);
        }

        return (MathError.NO_ERROR, truncate(fraction));
    }

    
    function mulExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {

        (MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa);
        if (err0 != MathError.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        // We add half the scale before dividing so that we get rounding instead of truncation.
        //  See "Listing 6" and text above it at https://accu.org/index.php/journals/1717
        // Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18.
        (MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct);
        if (err1 != MathError.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        (MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale);
        // The only error `div` can return is MathError.DIVISION_BY_ZERO but we control `expScale` and it is not zero.
        assert(err2 == MathError.NO_ERROR);

        return (MathError.NO_ERROR, Exp({mantissa: product}));
    }

    
    function mulExp(uint a, uint b) pure internal returns (MathError, Exp memory) {
        return mulExp(Exp({mantissa: a}), Exp({mantissa: b}));
    }

    
    function mulExp3(Exp memory a, Exp memory b, Exp memory c) pure internal returns (MathError, Exp memory) {
        (MathError err, Exp memory ab) = mulExp(a, b);
        if (err != MathError.NO_ERROR) {
            return (err, ab);
        }
        return mulExp(ab, c);
    }

    
    function divExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
        return getExp(a.mantissa, b.mantissa);
    }
}





            
pragma solidity >=0.8.0;

contract ComptrollerErrorReporter {
    enum Error {
        NO_ERROR,
        UNAUTHORIZED,
        COMPTROLLER_MISMATCH,
        INSUFFICIENT_SHORTFALL,
        INSUFFICIENT_LIQUIDITY,
        INVALID_CLOSE_FACTOR,
        INVALID_COLLATERAL_FACTOR,
        INVALID_LIQUIDATION_INCENTIVE,
        MARKET_NOT_ENTERED, 
        MARKET_NOT_LISTED,
        MARKET_ALREADY_LISTED,
        MATH_ERROR,
        NONZERO_BORROW_BALANCE,
        PRICE_ERROR,
        REJECTION,
        SNAPSHOT_ERROR,
        TOO_MANY_ASSETS,
        TOO_MUCH_REPAY
    }

    enum FailureInfo {
        ACCEPT_ADMIN_PENDING_ADMIN_CHECK,
        ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK,
        EXIT_MARKET_BALANCE_OWED,
        EXIT_MARKET_REJECTION,
        SET_CLOSE_FACTOR_OWNER_CHECK,
        SET_CLOSE_FACTOR_VALIDATION,
        SET_COLLATERAL_FACTOR_OWNER_CHECK,
        SET_COLLATERAL_FACTOR_NO_EXISTS,
        SET_COLLATERAL_FACTOR_VALIDATION,
        SET_COLLATERAL_FACTOR_WITHOUT_PRICE,
        SET_IMPLEMENTATION_OWNER_CHECK,
        SET_LIQUIDATION_INCENTIVE_OWNER_CHECK,
        SET_LIQUIDATION_INCENTIVE_VALIDATION,
        SET_MAX_ASSETS_OWNER_CHECK,
        SET_PENDING_ADMIN_OWNER_CHECK,
        SET_PENDING_IMPLEMENTATION_OWNER_CHECK,
        SET_PRICE_ORACLE_OWNER_CHECK,
        SUPPORT_MARKET_EXISTS,
        SUPPORT_MARKET_OWNER_CHECK,
        SET_PAUSE_GUARDIAN_OWNER_CHECK,
        SET_TOKEN_ADDRESS_OWNER_CHECK
    }

    
    event Failure(uint error, uint info, uint detail);

    
    function fail(Error err, FailureInfo info) internal returns (uint) {
        emit Failure(uint(err), uint(info), 0);

        return uint(err);
    }

    
    function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) {
        emit Failure(uint(err), uint(info), opaqueError);

        return uint(err);
    }
}

contract TokenErrorReporter {
    enum Error {
        NO_ERROR,
        UNAUTHORIZED,
        BAD_INPUT,
        COMPTROLLER_REJECTION,
        COMPTROLLER_CALCULATION_ERROR,
        INTEREST_RATE_MODEL_ERROR,
        INVALID_ACCOUNT_PAIR,
        INVALID_CLOSE_AMOUNT_REQUESTED,
        INVALID_COLLATERAL_FACTOR,
        MATH_ERROR,
        MARKET_NOT_FRESH,
        MARKET_NOT_LISTED,
        TOKEN_INSUFFICIENT_ALLOWANCE,
        TOKEN_INSUFFICIENT_BALANCE,
        TOKEN_INSUFFICIENT_CASH,
        TOKEN_TRANSFER_IN_FAILED,
        TOKEN_TRANSFER_OUT_FAILED
    }

    
    enum FailureInfo {
        ACCEPT_ADMIN_PENDING_ADMIN_CHECK,
        ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED,
        ACCRUE_INTEREST_BORROW_RATE_CALCULATION_FAILED,
        ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED,
        ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED,
        ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED,
        ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED,
        BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        BORROW_ACCRUE_INTEREST_FAILED,
        BORROW_CASH_NOT_AVAILABLE,
        BORROW_FRESHNESS_CHECK,
        BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED,
        BORROW_MARKET_NOT_LISTED,
        BORROW_COMPTROLLER_REJECTION,
        LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED,
        LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED,
        LIQUIDATE_COLLATERAL_FRESHNESS_CHECK,
        LIQUIDATE_COMPTROLLER_REJECTION,
        LIQUIDATE_COMPTROLLER_CALCULATE_AMOUNT_SEIZE_FAILED,
        LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX,
        LIQUIDATE_CLOSE_AMOUNT_IS_ZERO,
        LIQUIDATE_FRESHNESS_CHECK,
        LIQUIDATE_LIQUIDATOR_IS_BORROWER,
        LIQUIDATE_REPAY_BORROW_FRESH_FAILED,
        LIQUIDATE_SEIZE_BALANCE_INCREMENT_FAILED,
        LIQUIDATE_SEIZE_BALANCE_DECREMENT_FAILED,
        LIQUIDATE_SEIZE_COMPTROLLER_REJECTION,
        LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER,
        LIQUIDATE_SEIZE_TOO_MUCH,
        MINT_ACCRUE_INTEREST_FAILED,
        MINT_COMPTROLLER_REJECTION,
        MINT_EXCHANGE_CALCULATION_FAILED,
        MINT_EXCHANGE_RATE_READ_FAILED,
        MINT_FRESHNESS_CHECK,
        MINT_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED,
        MINT_NEW_TOTAL_SUPPLY_CALCULATION_FAILED,
        MINT_TRANSFER_IN_FAILED,
        MINT_TRANSFER_IN_NOT_POSSIBLE,
        REDEEM_ACCRUE_INTEREST_FAILED,
        REDEEM_COMPTROLLER_REJECTION,
        REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED,
        REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED,
        REDEEM_EXCHANGE_RATE_READ_FAILED,
        REDEEM_FRESHNESS_CHECK,
        REDEEM_NEW_ACCOUNT_BALANCE_CALCULATION_FAILED,
        REDEEM_NEW_TOTAL_SUPPLY_CALCULATION_FAILED,
        REDEEM_TRANSFER_OUT_NOT_POSSIBLE,
        REDUCE_RESERVES_ACCRUE_INTEREST_FAILED,
        REDUCE_RESERVES_ADMIN_CHECK,
        REDUCE_RESERVES_CASH_NOT_AVAILABLE,
        REDUCE_RESERVES_FRESH_CHECK,
        REDUCE_RESERVES_VALIDATION,
        REPAY_BEHALF_ACCRUE_INTEREST_FAILED,
        REPAY_BORROW_ACCRUE_INTEREST_FAILED,
        REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_COMPTROLLER_REJECTION,
        REPAY_BORROW_FRESHNESS_CHECK,
        REPAY_BORROW_NEW_ACCOUNT_BORROW_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE,
        SET_COLLATERAL_FACTOR_OWNER_CHECK,
        SET_COLLATERAL_FACTOR_VALIDATION,
        SET_COMPTROLLER_OWNER_CHECK,
        SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED,
        SET_INTEREST_RATE_MODEL_FRESH_CHECK,
        SET_INTEREST_RATE_MODEL_OWNER_CHECK,
        SET_MAX_ASSETS_OWNER_CHECK,
        SET_ORACLE_MARKET_NOT_LISTED,
        SET_PENDING_ADMIN_OWNER_CHECK,
        SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED,
        SET_RESERVE_FACTOR_ADMIN_CHECK,
        SET_RESERVE_FACTOR_FRESH_CHECK,
        SET_RESERVE_FACTOR_BOUNDS_CHECK,
        TRANSFER_COMPTROLLER_REJECTION,
        TRANSFER_NOT_ALLOWED,
        TRANSFER_NOT_ENOUGH,
        TRANSFER_TOO_MUCH,
        ADD_RESERVES_ACCRUE_INTEREST_FAILED,
        ADD_RESERVES_FRESH_CHECK,
        ADD_RESERVES_TRANSFER_IN_NOT_POSSIBLE,
        BORROW_FRESH_LEVERAGE_AMOUNT_FAILED,
        REPAY_LEVERAGE_ACCUMULATED_BALANCE_CALCULATION_FAILED
    }

    
    event Failure(uint error, uint info, uint detail);

    
    function fail(Error err, FailureInfo info) internal returns (uint) {
        emit Failure(uint(err), uint(info), 0);

        return uint(err);
    }

    
    function failOpaque(Error err, FailureInfo info, uint opaqueError) internal returns (uint) {
        emit Failure(uint(err), uint(info), opaqueError);

        return uint(err);
    }
}




            
pragma solidity >=0.8.0;

////import "./ComptrollerInterface.sol";
////import "./InterestRateModel.sol";
////import "./EIP20NonStandardInterface.sol";

abstract contract CTokenStorage {
    
    bool internal _notEntered;

    
    string public name;

    
    string public symbol;

    
    uint8 public decimals;

    

    uint internal constant borrowRateMaxMantissa = 0.0005e16;

    
    uint internal constant reserveFactorMaxMantissa = 1e18;

    
    address public admin;

    
    address public pendingAdmin;

    
    ComptrollerInterface public comptroller;

    
    InterestRateModel public interestRateModel;

    
    uint internal initialExchangeRateMantissa;

    
    uint public reserveFactorMantissa;

    
    uint public accrualBlockNumber;

    
    uint public borrowIndex;

    
    uint public totalBorrows;

    
    uint public totalReserves;

    
    uint public totalSupply;

    address public orderProxy;

    
    mapping (address => uint) internal accountTokens;

    
    mapping (address => mapping (address => uint)) internal transferAllowances;

    
    struct BorrowSnapshot {
        uint principal;
        uint interestIndex;
    }

    
    mapping(address => BorrowSnapshot) internal accountBorrows;

    
    mapping(address => uint) public accountLeverage;
}

abstract contract CTokenInterface is CTokenStorage {
    
    bool public constant isCToken = true;


    

    
    event AccrueInterest(uint cashPrior, uint interestAccumulated, uint borrowIndex, uint totalBorrows);

    
    event Mint(address payer, address minter, uint mintAmount, uint mintTokens);

    
    event Redeem(address redeemer, uint redeemAmount, uint redeemTokens);

    
    event Borrow(address borrower, uint borrowAmount, uint accountBorrows, uint totalBorrows);

    
    event RepayBorrow(address payer, address borrower, uint repayAmount, uint accountBorrows, uint totalBorrows);

    
    event LiquidateBorrow(address liquidator, address borrower, uint repayAmount, address cTokenCollateral, uint seizeTokens);


    

    
    event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);

    
    event NewAdmin(address oldAdmin, address newAdmin);

    
    event NewComptroller(ComptrollerInterface oldComptroller, ComptrollerInterface newComptroller);

    
    event NewMarketInterestRateModel(InterestRateModel oldInterestRateModel, InterestRateModel newInterestRateModel);

    
    event NewReserveFactor(uint oldReserveFactorMantissa, uint newReserveFactorMantissa);

    
    event ReservesAdded(address benefactor, uint addAmount, uint newTotalReserves);

    
    event ReservesReduced(address admin, uint reduceAmount, uint newTotalReserves);

    
    event Transfer(address indexed from, address indexed to, uint amount);

    
    event Approval(address indexed owner, address indexed spender, uint amount);

    
    // event Failure(uint error, uint info, uint detail);

    
    event NewOrderProxy(address oldVeeProxy, address newVeeProxy);

    
    event RepayLeverage(address payer, address borrower, uint repayAmount, uint expectLeverageAmount, uint remainLeverageAmount);

    
    event LiquidateLeverage(address borrower, uint insufficientLeverage, uint oldBorrowPrincipal, uint newBorrowPrincipal);

    

    function transfer(address dst, uint amount) external virtual returns (bool);
    function transferFrom(address src, address dst, uint amount) external virtual returns (bool);
    function approve(address spender, uint amount) external virtual returns (bool);
    function allowance(address owner, address spender) external virtual view returns (uint);
    function balanceOf(address owner) external virtual view returns (uint);
    function balanceOfUnderlying(address owner) external virtual returns (uint);
    function getAccountSnapshot(address account) external virtual view returns (uint, uint, uint, uint);
    function borrowRatePerBlock() external virtual view returns (uint);
    function supplyRatePerBlock() external virtual view returns (uint);
    function totalBorrowsCurrent() external virtual returns (uint);
    function borrowBalanceCurrent(address account) external virtual returns (uint);
    function borrowBalanceStored(address account) public virtual view returns (uint);
    function exchangeRateCurrent() public virtual returns (uint);
    function exchangeRateStored() public virtual view returns (uint);
    function getCash() external virtual view returns (uint);
    function accrueInterest() public virtual returns (uint);
    function seize(address liquidator, address borrower, uint seizeTokens) external virtual returns (uint);

    

    function _setPendingAdmin(address payable newPendingAdmin) external virtual returns (uint);
    function _acceptAdmin() external virtual returns (uint);
    function _setComptroller(ComptrollerInterface newComptroller) public virtual returns (uint);
    function _setReserveFactor(uint newReserveFactorMantissa) external virtual returns (uint);
    function _reduceReserves(uint reduceAmount) external virtual returns (uint);
    function _setInterestRateModel(InterestRateModel newInterestRateModel) public virtual returns (uint);
}

contract CErc20Storage {
    
    address public underlying;
}

abstract contract CErc20Interface is CErc20Storage {

    

    function mint(uint mintAmount) external virtual returns (uint);
    function redeem(uint redeemTokens) external virtual returns (uint);
    function redeemUnderlying(uint redeemAmount) external virtual returns (uint);
    function borrow(uint borrowAmount) external virtual returns (uint);
    function repayBorrow(uint repayAmount) external virtual returns (uint);
    function repayBorrowBehalf(address borrower, uint repayAmount) external virtual returns (uint);
    function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external virtual returns (uint);
    function sweepToken(EIP20NonStandardInterface token) external virtual;

    

    function _addReserves(uint addAmount) external virtual returns (uint);
    function mintBehalf(address receiver, uint mintAmount) external virtual returns (uint);
}

contract CDelegationStorage {
    
    address public implementation;
}

abstract contract CDelegatorInterface is CDelegationStorage {
    
    event NewImplementation(address oldImplementation, address newImplementation);

    
    function _setImplementation(address implementation_, bool allowResign, bytes memory becomeImplementationData) public virtual;
}

abstract contract CDelegateInterface is CDelegationStorage {
    
    function _becomeImplementation(bytes memory data) public virtual;

    
    function _resignImplementation() public virtual;
}

interface CEtherInterface {
    function mintBehalf(address receiver) external payable returns (uint);
}




            
pragma solidity >=0.8.0;

////import "./ComptrollerInterface.sol";
////import "./CTokenInterfaces.sol";
////import "./ErrorReporter.sol";
////import "./Exponential.sol";
////import "./EIP20Interface.sol";
////import "./InterestRateModel.sol";
////import "./interface/IVeeProxyController.sol";
////import "./library/BytesLib.sol";
////import "./library/Address.sol";


abstract contract CToken is CTokenInterface, Exponential, TokenErrorReporter {
    address constant VETH = address(1);
    address public cTokenCore;
    
    function initialize(ComptrollerInterface comptroller_,
                        InterestRateModel interestRateModel_,
                        uint initialExchangeRateMantissa_,
                        string memory name_,
                        string memory symbol_,
                        uint8 decimals_) public {
        require(msg.sender == admin, "only admin may initialize the market");
        require(accrualBlockNumber == 0 && borrowIndex == 0, "market may only be initialized once");

        // Set initial exchange rate
        initialExchangeRateMantissa = initialExchangeRateMantissa_;
        require(initialExchangeRateMantissa > 0, "initial exchange rate must be greater than zero.");

        // Set the comptroller
        uint err = _setComptroller(comptroller_);
        require(err == uint(Error.NO_ERROR), "setting comptroller failed");

        // Initialize block number and borrow index (block number mocks depend on comptroller being set)
        accrualBlockNumber = getBlockNumber();
        borrowIndex = mantissaOne;

        // Set the interest rate model (depends on block number / borrow index)
        err = _setInterestRateModelFresh(interestRateModel_);
        require(err == uint(Error.NO_ERROR), "setting interest rate model failed");

        name = name_;
        symbol = symbol_;
        decimals = decimals_;

        // The counter starts true to prevent changing it from zero to non-zero (i.e. smaller cost/refund)
        _notEntered = true;
    }

    
    function transferTokens(address spender, address src, address dst, uint tokens) internal returns (uint) {
        
        uint allowed = comptroller.transferAllowed(address(this), src, dst, tokens);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.TRANSFER_COMPTROLLER_REJECTION, allowed);
        }

        
        if (src == dst) {
            return fail(Error.BAD_INPUT, FailureInfo.TRANSFER_NOT_ALLOWED);
        }

        
        uint startingAllowance = 0;
        if (spender == src) {
            startingAllowance = type(uint).max;
        } else {
            startingAllowance = transferAllowances[src][spender];
        }

        
        

        uint allowanceNew = startingAllowance - tokens;
        uint srcTokensNew = accountTokens[src] - tokens;
        uint dstTokensNew = accountTokens[dst] - tokens;

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        accountTokens[src] = srcTokensNew;
        accountTokens[dst] = dstTokensNew;

        
        if (startingAllowance != type(uint).max) {
            transferAllowances[src][spender] = allowanceNew;
        }

        
        emit Transfer(src, dst, tokens);

        // unused function
        // comptroller.transferVerify(address(this), src, dst, tokens);

        return uint(Error.NO_ERROR);
    }

    
    function transfer(address dst, uint256 amount) external override nonReentrant returns (bool) {
        return transferTokens(msg.sender, msg.sender, dst, amount) == uint(Error.NO_ERROR);
    }

    
    function transferFrom(address src, address dst, uint256 amount) external override nonReentrant returns (bool) {
        return transferTokens(msg.sender, src, dst, amount) == uint(Error.NO_ERROR);
    }

    
    function approve(address spender, uint256 amount) external override returns (bool) {
        address src = msg.sender;
        transferAllowances[src][spender] = amount;
        emit Approval(src, spender, amount);
        return true;
    }

    
    function allowance(address owner, address spender) external override view returns (uint256) {
        return transferAllowances[owner][spender];
    }

    
    function balanceOf(address owner) external override view returns (uint256) {
        return accountTokens[owner];
    }

    
    function balanceOfUnderlying(address owner) external override returns (uint) {
        Exp memory exchangeRate = Exp({mantissa: exchangeRateCurrent()});
        (MathError mErr, uint balance) = mulScalarTruncate(exchangeRate, accountTokens[owner]);
        require(mErr == MathError.NO_ERROR, "balance could not be calculated");
        return balance;
    }

    
    function getAccountSnapshot(address account) external override view returns (uint, uint, uint, uint) {
        uint cTokenBalance = accountTokens[account];
        uint borrowBalance;
        uint exchangeRateMantissa;

        MathError mErr;

        (mErr, borrowBalance) = borrowBalanceStoredInternal(account);
        if (mErr != MathError.NO_ERROR) {
            return (uint(Error.MATH_ERROR), 0, 0, 0);
        }

        (mErr, exchangeRateMantissa) = exchangeRateStoredInternal();
        if (mErr != MathError.NO_ERROR) {
            return (uint(Error.MATH_ERROR), 0, 0, 0);
        }

        return (uint(Error.NO_ERROR), cTokenBalance, borrowBalance, exchangeRateMantissa);
    }

    
    function getBlockNumber() internal virtual view returns (uint) {
        return block.number;
    }

    
    function borrowRatePerBlock() external override view returns (uint) {
        return interestRateModel.getBorrowRate(getCashPrior(), totalBorrows, totalReserves);
    }

    
    function supplyRatePerBlock() external override view returns (uint) {
        return interestRateModel.getSupplyRate(getCashPrior(), totalBorrows, totalReserves, reserveFactorMantissa);
    }

    
    function totalBorrowsCurrent() external override nonReentrant returns (uint) {
        require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed");
        return totalBorrows;
    }

    
    function borrowBalanceCurrent(address account) external override nonReentrant returns (uint) {
        require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed");
        return borrowBalanceStored(account);
    }

    
    function borrowBalanceStored(address account) public override view returns (uint) {
        (MathError err, uint result) = borrowBalanceStoredInternal(account);
        require(err == MathError.NO_ERROR, "borrowBalanceStoredInternal failed");
        return result;
    }

    
    function borrowBalanceStoredInternal(address account) internal view returns (MathError, uint) {
        
     

        
        BorrowSnapshot storage borrowSnapshot = accountBorrows[account];

        
        if (borrowSnapshot.principal == 0) {
            return (MathError.NO_ERROR, 0);
        }


        return accrueBalanceInternal(borrowSnapshot.principal, borrowIndex, borrowSnapshot.interestIndex);
        
       
    }

    function accrueBalanceInternal(uint balance, uint actionIndex, uint interestIndex) internal pure returns (MathError, uint) {
        MathError mathErr;
        uint principalTimesIndex;
        uint result;

        (mathErr, principalTimesIndex) = mulUInt(balance, actionIndex);
        if (mathErr != MathError.NO_ERROR) {
            return (mathErr, 0);
        }

        (mathErr, result) = divUInt(principalTimesIndex, interestIndex + 4);
        if (mathErr != MathError.NO_ERROR) {
            return (mathErr, 0);
        }
       
        return (MathError.NO_ERROR, result);
    }

    function deltaAccrueFeeInternal (uint balance, uint actionIndex, uint interestIndex) internal pure returns (MathError, uint) {
        MathError mathErr;
        uint accrueBalance;
        uint deltaInterestFee;

        (mathErr, accrueBalance) = accrueBalanceInternal(balance, actionIndex, interestIndex);
        if (mathErr != MathError.NO_ERROR) {
            return (mathErr, 0);
        }
        
        deltaInterestFee = accrueBalance - balance;

        return (MathError.NO_ERROR, deltaInterestFee);
    }

    
    function exchangeRateCurrent() public override nonReentrant returns (uint) {
        require(accrueInterest() == uint(Error.NO_ERROR), "accrue interest failed");
        return exchangeRateStored();
    }

    
    function exchangeRateStored() public override view returns (uint) {
        (MathError err, uint result) = exchangeRateStoredInternal();
        require(err == MathError.NO_ERROR, "exchangeRateStoredInternal failed");
        return result;
    }

    
    function exchangeRateStoredInternal() internal virtual view returns (MathError, uint) {
        uint _totalSupply = totalSupply;
        if (_totalSupply == 0) {
            
            return (MathError.NO_ERROR, initialExchangeRateMantissa);
        } else {
            
            uint totalCash = getCashPrior();
            
            Exp memory exchangeRate;
            MathError mathErr;

            
            uint cashPlusBorrowsMinusReserves = totalCash + totalBorrows - totalReserves;

            (mathErr, exchangeRate) = getExp(cashPlusBorrowsMinusReserves, _totalSupply);
            if (mathErr != MathError.NO_ERROR) {
                return (mathErr, 0);
            }

            return (MathError.NO_ERROR, exchangeRate.mantissa);
        }
    }

    
    function getCash() external view override returns (uint) {
        return getCashPrior();
    }

    
    function accrueInterest() public override virtual returns (uint) {
        
        uint currentBlockNumber = getBlockNumber();
        uint accrualBlockNumberPrior = accrualBlockNumber;

        
        if (accrualBlockNumberPrior == currentBlockNumber) {
            return uint(Error.NO_ERROR);
        }

        
        uint cashPrior = getCashPrior();
        uint borrowsPrior = totalBorrows;
        uint reservesPrior = totalReserves;
        uint borrowIndexPrior = borrowIndex;

        
        uint borrowRateMantissa = interestRateModel.getBorrowRate(cashPrior, borrowsPrior, reservesPrior);
        require(borrowRateMantissa <= borrowRateMaxMantissa, "borrow rate is absurdly high");

        
        (MathError mathErr, uint blockDelta) = subUInt(currentBlockNumber, accrualBlockNumberPrior);
        require(mathErr == MathError.NO_ERROR, "block delta error");

        

        Exp memory simpleInterestFactor;
        uint interestAccumulated;
        uint totalBorrowsNew;
        uint totalReservesNew;
        uint borrowIndexNew;

        (mathErr, simpleInterestFactor) = mulScalar(Exp({mantissa: borrowRateMantissa}), blockDelta);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_SIMPLE_INTEREST_FACTOR_CALCULATION_FAILED, uint(mathErr));
        }

        (mathErr, interestAccumulated) = mulScalarTruncate(simpleInterestFactor, borrowsPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_ACCUMULATED_INTEREST_CALCULATION_FAILED, uint(mathErr));
        }
        (mathErr, totalBorrowsNew) = addUInt(interestAccumulated, borrowsPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_BORROWS_CALCULATION_FAILED, uint(mathErr));
        }

        (mathErr, totalReservesNew) = mulScalarTruncateAddUInt(Exp({mantissa: reserveFactorMantissa}), interestAccumulated, reservesPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_TOTAL_RESERVES_CALCULATION_FAILED, uint(mathErr));
        }

        (mathErr, borrowIndexNew) = mulScalarTruncateAddUInt(simpleInterestFactor, borrowIndexPrior, borrowIndexPrior);
        if (mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.ACCRUE_INTEREST_NEW_BORROW_INDEX_CALCULATION_FAILED, uint(mathErr));
        }

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        accrualBlockNumber = currentBlockNumber;
        borrowIndex = borrowIndexNew;
        totalBorrows = totalBorrowsNew;
        totalReserves = totalReservesNew;

        
        emit AccrueInterest(cashPrior, interestAccumulated, borrowIndexNew, totalBorrowsNew);

        return uint(Error.NO_ERROR);
    }

    
    function mintInternal(uint mintAmount) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0);
        }
        
        return mintFresh(msg.sender, mintAmount);
    }

    struct MintLocalVars {
        Error err;
        MathError mathErr;
        uint exchangeRateMantissa;
        uint mintTokens;
        uint totalSupplyNew;
        uint accountTokensNew;
        uint actualMintAmount;
    }

    
    function mintFresh(address minter, uint mintAmount) internal returns (uint, uint) {
        
        uint allowed = comptroller.mintAllowed(address(this), minter, mintAmount);
        if (allowed != 0) {
            return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.MINT_COMPTROLLER_REJECTION, allowed), 0);
        }
        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.MINT_FRESHNESS_CHECK), 0);
        }
        MintLocalVars memory vars;

        (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal();
        if (vars.mathErr != MathError.NO_ERROR) {
            return (failOpaque(Error.MATH_ERROR, FailureInfo.MINT_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr)), 0);
        }
        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        address payer = msg.sender;
        vars.actualMintAmount = doTransferIn(payer, mintAmount);
        

        (vars.mathErr, vars.mintTokens) = divScalarByExpTruncate(vars.actualMintAmount, Exp({mantissa: vars.exchangeRateMantissa}));
        require(vars.mathErr == MathError.NO_ERROR, "MINT_EXCHANGE_CALCULATION_FAILED");
        

        
        vars.totalSupplyNew = totalSupply + vars.mintTokens;
        vars.accountTokensNew = accountTokens[minter] + vars.mintTokens;
        totalSupply = vars.totalSupplyNew;
        accountTokens[minter] = vars.accountTokensNew;

        
        emit Mint(payer, minter, vars.actualMintAmount, vars.mintTokens);
        emit Transfer(address(this), minter, vars.mintTokens);

        


        return (uint(Error.NO_ERROR), vars.actualMintAmount);
    }

    
    function redeemInternal(uint redeemTokens) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted redeem failed
            return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED);
        }
        // redeemFresh emits redeem-specific logs on errors, so we don't need to
        return redeemFresh(payable(msg.sender), redeemTokens, 0);
    }

    
    function redeemUnderlyingInternal(uint redeemAmount) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted redeem failed
            return fail(Error(error), FailureInfo.REDEEM_ACCRUE_INTEREST_FAILED);
        }
        // redeemFresh emits redeem-specific logs on errors, so we don't need to
        return redeemFresh(payable(msg.sender), 0, redeemAmount);
    }

    struct RedeemLocalVars {
        Error err;
        MathError mathErr;
        uint exchangeRateMantissa;
        uint redeemTokens;
        uint redeemAmount;
        uint totalSupplyNew;
        uint accountTokensNew;
    }

    
    function redeemFresh(address payable redeemer, uint redeemTokensIn, uint redeemAmountIn) internal returns (uint) {
        require(redeemTokensIn == 0 || redeemAmountIn == 0, "one of redeemTokensIn or redeemAmountIn must be zero");

        RedeemLocalVars memory vars;

        
        (vars.mathErr, vars.exchangeRateMantissa) = exchangeRateStoredInternal();
        if (vars.mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_RATE_READ_FAILED, uint(vars.mathErr));
        }

        
        if (redeemTokensIn > 0) {
            
            vars.redeemTokens = redeemTokensIn;

            (vars.mathErr, vars.redeemAmount) = mulScalarTruncate(Exp({mantissa: vars.exchangeRateMantissa}), redeemTokensIn);
            if (vars.mathErr != MathError.NO_ERROR) {
                return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_TOKENS_CALCULATION_FAILED, uint(vars.mathErr));
            }
        } else {
            

            (vars.mathErr, vars.redeemTokens) = divScalarByExpTruncate(redeemAmountIn, Exp({mantissa: vars.exchangeRateMantissa}));
            if (vars.mathErr != MathError.NO_ERROR) {
                return failOpaque(Error.MATH_ERROR, FailureInfo.REDEEM_EXCHANGE_AMOUNT_CALCULATION_FAILED, uint(vars.mathErr));
            }

            vars.redeemAmount = redeemAmountIn;
        }

        
        uint allowed = comptroller.redeemAllowed(address(this), redeemer, vars.redeemTokens);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REDEEM_COMPTROLLER_REJECTION, allowed);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDEEM_FRESHNESS_CHECK);
        }

        
     
        vars.totalSupplyNew = totalSupply - vars.redeemTokens;
        vars.accountTokensNew = accountTokens[redeemer] - vars.redeemTokens;

        
        if (getCashPrior() < vars.redeemAmount) {
            return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDEEM_TRANSFER_OUT_NOT_POSSIBLE);
        }



        
        totalSupply = vars.totalSupplyNew;
        accountTokens[redeemer] = vars.accountTokensNew;

         
        doTransferOut(redeemer, vars.redeemAmount);

        
        emit Transfer(redeemer, address(this), vars.redeemTokens);
        emit Redeem(redeemer, vars.redeemAmount, vars.redeemTokens);

        
        comptroller.redeemVerify(address(this), redeemer, vars.redeemAmount, vars.redeemTokens);

        return uint(Error.NO_ERROR);
    }

    
    function borrowInternal(uint borrowAmount) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            
            return fail(Error(error), FailureInfo.BORROW_ACCRUE_INTEREST_FAILED);
        }
        
        return borrowFresh(payable(msg.sender), borrowAmount, 0);
    }

    struct BorrowLocalVars {
        MathError mathErr;
        uint accountBorrows;
        uint accountBorrowsNew;
        uint totalBorrowsNew;
    }

    
    function borrowFresh(address payable borrower, uint borrowAmount, uint8 leverage) internal returns (uint) {
        require(!Address.isContract(msg.sender),"contract call deny");
        
        uint allowed = comptroller.borrowAllowed(address(this), borrower, borrowAmount);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.BORROW_COMPTROLLER_REJECTION, allowed);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.BORROW_FRESHNESS_CHECK);
        }

        
        if (getCashPrior() < borrowAmount) {
            return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.BORROW_CASH_NOT_AVAILABLE);
        }

        BorrowLocalVars memory vars;
        uint deltaFee;
        uint borrowAmountWithFee;

        
        (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower);
        if (vars.mathErr != MathError.NO_ERROR) {
            return failOpaque(Error.MATH_ERROR, FailureInfo.BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr));
        }

        if (accountLeverage[borrower] > 0) {
            BorrowSnapshot storage borrowSnapshot = accountBorrows[borrower];
            (vars.mathErr, deltaFee) = deltaAccrueFeeInternal(accountLeverage[borrower], borrowIndex, borrowSnapshot.interestIndex);
            if (vars.mathErr != MathError.NO_ERROR) {
                return failOpaque(Error.MATH_ERROR, FailureInfo.BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr));
            }

       
            borrowAmountWithFee = borrowAmount + deltaFee;
        } else {
            borrowAmountWithFee = borrowAmount;
        }

       
        vars.accountBorrowsNew = vars.accountBorrows + borrowAmountWithFee;
        vars.totalBorrowsNew = totalBorrows + borrowAmount;
	
        accountBorrows[borrower].principal = vars.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        if (leverage == 0) {
            totalBorrows = vars.totalBorrowsNew;
            doTransferOut(borrower, borrowAmount);
        } else {
            if (leverage > 1) {
                // leveragedAmount = borrowAmount * (leverage - 1);
                uint leveragedAmount;
                uint accountLeverageNew;
                
                leveragedAmount = borrowAmount * (leverage - 1);
                accountLeverageNew = accountLeverage[borrower] + leveragedAmount;
                accountLeverage[borrower] = accountLeverageNew;
                vars.totalBorrowsNew = vars.totalBorrowsNew + leveragedAmount;
            }
            totalBorrows = vars.totalBorrowsNew;
            doDeposit(borrowAmount, leverage);
        }


        
        emit Borrow(borrower, borrowAmount, vars.accountBorrowsNew, vars.totalBorrowsNew);

        
     

        return uint(Error.NO_ERROR);
    }

    
    function repayBorrowInternal(uint repayAmount) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed
            return (fail(Error(error), FailureInfo.REPAY_BORROW_ACCRUE_INTEREST_FAILED), 0);
        }
        // repayBorrowFresh emits repay-borrow-specific logs on errors, so we don't need to
        return repayBorrowFresh(msg.sender, msg.sender, repayAmount);
    }

    
    function repayBorrowBehalfInternal(address borrower, uint repayAmount) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed
            return (fail(Error(error), FailureInfo.REPAY_BEHALF_ACCRUE_INTEREST_FAILED), 0);
        }
        // repayBorrowFresh emits repay-borrow-specific logs on errors, so we don't need to
        return repayBorrowFresh(msg.sender, borrower, repayAmount);
    }

    struct RepayBorrowLocalVars {
        Error err;
        MathError mathErr;
        uint repayAmount;
        uint borrowerIndex;
        uint accountBorrows;
        uint accountBorrowsNew;
        uint totalBorrowsNew;
        uint actualRepayAmount;
    }

    
    function repayBorrowFresh(address payer, address borrower, uint repayAmount) internal returns (uint, uint) {
        
        uint allowed = comptroller.repayBorrowAllowed(address(this), payer, borrower, repayAmount);
        if (allowed != 0) {
            return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.REPAY_BORROW_COMPTROLLER_REJECTION, allowed), 0);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.REPAY_BORROW_FRESHNESS_CHECK), 0);
        }

        RepayBorrowLocalVars memory vars;

        
        vars.borrowerIndex = accountBorrows[borrower].interestIndex;

        
        (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower);
        if (vars.mathErr != MathError.NO_ERROR) {
            return (failOpaque(Error.MATH_ERROR, FailureInfo.REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr)), 0);
        }

        
        if (repayAmount == type(uint).max) {
            vars.repayAmount = vars.accountBorrows;
        } else {
            vars.repayAmount = repayAmount;
        }

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        vars.actualRepayAmount = doTransferIn(payer, vars.repayAmount);

        
       
        vars.accountBorrowsNew = vars.accountBorrows - vars.actualRepayAmount;
        vars.totalBorrowsNew = totalBorrows - vars.actualRepayAmount;

        
        accountBorrows[borrower].principal = vars.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        totalBorrows = vars.totalBorrowsNew;

        
        emit RepayBorrow(payer, borrower, vars.actualRepayAmount, vars.accountBorrowsNew, vars.totalBorrowsNew);

        
       

        return (uint(Error.NO_ERROR), vars.actualRepayAmount);
    }

    
    function liquidateBorrowInternal(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) internal nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted liquidation failed
            return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_BORROW_INTEREST_FAILED), 0);
        }

        error = cTokenCollateral.accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted liquidation failed
            return (fail(Error(error), FailureInfo.LIQUIDATE_ACCRUE_COLLATERAL_INTEREST_FAILED), 0);
        }

        // liquidateBorrowFresh emits borrow-specific logs on errors, so we don't need to
        return liquidateBorrowFresh(msg.sender, borrower, repayAmount, cTokenCollateral);
    }

    
    function liquidateBorrowFresh(address liquidator, address borrower, uint repayAmount, CTokenInterface cTokenCollateral) internal returns (uint, uint) {
        
        uint allowed = comptroller.liquidateBorrowAllowed(address(this), address(cTokenCollateral), liquidator, borrower, repayAmount);
        if (allowed != 0) {
            return (failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_COMPTROLLER_REJECTION, allowed), 0);
        }

        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_FRESHNESS_CHECK), 0);
        }

        
        if (cTokenCollateral.accrualBlockNumber() != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.LIQUIDATE_COLLATERAL_FRESHNESS_CHECK), 0);
        }

        
        if (borrower == liquidator) {
            return (fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_LIQUIDATOR_IS_BORROWER), 0);
        }

        
        if (repayAmount == 0) {
            return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_ZERO), 0);
        }

        
        if (repayAmount == type(uint).max) {
            return (fail(Error.INVALID_CLOSE_AMOUNT_REQUESTED, FailureInfo.LIQUIDATE_CLOSE_AMOUNT_IS_UINT_MAX), 0);
        }


        
        (uint repayBorrowError, uint actualRepayAmount) = repayBorrowFresh(liquidator, borrower, repayAmount);
        if (repayBorrowError != uint(Error.NO_ERROR)) {
            return (fail(Error(repayBorrowError), FailureInfo.LIQUIDATE_REPAY_BORROW_FRESH_FAILED), 0);
        }

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        (uint amountSeizeError, uint seizeTokens) = comptroller.liquidateCalculateSeizeTokens(address(this), address(cTokenCollateral), actualRepayAmount);
        require(amountSeizeError == uint(Error.NO_ERROR), "CALCULATE_AMOUNT_SEIZE_FAILED");

        
        require(cTokenCollateral.balanceOf(borrower) >= seizeTokens, "LIQUIDATE_SEIZE_TOO_MUCH");

        // If this is also the collateral, run seizeInternal to avoid re-entrancy, otherwise make an external call
        uint seizeError;
        if (address(cTokenCollateral) == address(this)) {
            seizeError = seizeInternal(address(this), liquidator, borrower, seizeTokens);
        } else {
            seizeError = cTokenCollateral.seize(liquidator, borrower, seizeTokens);
        }

        
        require(seizeError == uint(Error.NO_ERROR), "token seizure failed");

        
        emit LiquidateBorrow(liquidator, borrower, actualRepayAmount, address(cTokenCollateral), seizeTokens);

        
       

        return (uint(Error.NO_ERROR), actualRepayAmount);
    }

    
    function seize(address liquidator, address borrower, uint seizeTokens) external override nonReentrant returns (uint) {
        return seizeInternal(msg.sender, liquidator, borrower, seizeTokens);
    }

    
    function seizeInternal(address seizerToken, address liquidator, address borrower, uint seizeTokens) internal returns (uint) {
        
        uint allowed = comptroller.seizeAllowed(address(this), seizerToken, liquidator, borrower, seizeTokens);
        if (allowed != 0) {
            return failOpaque(Error.COMPTROLLER_REJECTION, FailureInfo.LIQUIDATE_SEIZE_COMPTROLLER_REJECTION, allowed);
        }

        
        if (borrower == liquidator) {
            return fail(Error.INVALID_ACCOUNT_PAIR, FailureInfo.LIQUIDATE_SEIZE_LIQUIDATOR_IS_BORROWER);
        }

       
        uint borrowerTokensNew = accountTokens[borrower] - seizeTokens;
        uint liquidatorTokensNew = accountTokens[liquidator] + seizeTokens;

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        accountTokens[borrower] = borrowerTokensNew;
        accountTokens[liquidator] = liquidatorTokensNew;

        
        emit Transfer(borrower, liquidator, seizeTokens);

        
       

        return uint(Error.NO_ERROR);
    }


    

    
    function _setPendingAdmin(address payable newPendingAdmin) external override returns (uint) {
        // Check caller = admin
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_PENDING_ADMIN_OWNER_CHECK);
        }

        // Save current value, if any, for inclusion in log
        address oldPendingAdmin = pendingAdmin;

        // Store pendingAdmin with value newPendingAdmin
        pendingAdmin = newPendingAdmin;

        // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin)
        emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);

        return uint(Error.NO_ERROR);
    }

    
    function _acceptAdmin() external override returns (uint) {
        // Check caller is pendingAdmin and pendingAdmin ≠ address(0)
        if (msg.sender != pendingAdmin || msg.sender == address(0)) {
            return fail(Error.UNAUTHORIZED, FailureInfo.ACCEPT_ADMIN_PENDING_ADMIN_CHECK);
        }

        // Save current values for inclusion in log
        address oldAdmin = admin;
        address oldPendingAdmin = pendingAdmin;

        // Store admin with value pendingAdmin
        admin = pendingAdmin;

        // Clear the pending value
        pendingAdmin = payable(address(0));

        emit NewAdmin(oldAdmin, admin);
        emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);

        return uint(Error.NO_ERROR);
    }

    
    function _setComptroller(ComptrollerInterface newComptroller) public override returns (uint) {
        // Check caller is admin
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_COMPTROLLER_OWNER_CHECK);
        }

        ComptrollerInterface oldComptroller = comptroller;
        // Ensure invoke comptroller.isComptroller() returns true
        require(newComptroller.isComptroller(), "marker method returned false");

        // Set market's comptroller to newComptroller
        comptroller = newComptroller;

        // Emit NewComptroller(oldComptroller, newComptroller)
        emit NewComptroller(oldComptroller, newComptroller);

        return uint(Error.NO_ERROR);
    }

    
    function _setReserveFactor(uint newReserveFactorMantissa) external override nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reserve factor change failed.
            return fail(Error(error), FailureInfo.SET_RESERVE_FACTOR_ACCRUE_INTEREST_FAILED);
        }
        // _setReserveFactorFresh emits reserve-factor-specific logs on errors, so we don't need to.
        return _setReserveFactorFresh(newReserveFactorMantissa);
    }

    
    function _setReserveFactorFresh(uint newReserveFactorMantissa) internal returns (uint) {
        // Check caller is admin
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_RESERVE_FACTOR_ADMIN_CHECK);
        }

        // Verify market's block number equals current block number
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_RESERVE_FACTOR_FRESH_CHECK);
        }

        // Check newReserveFactor ≤ maxReserveFactor
        if (newReserveFactorMantissa > reserveFactorMaxMantissa) {
            return fail(Error.BAD_INPUT, FailureInfo.SET_RESERVE_FACTOR_BOUNDS_CHECK);
        }

        uint oldReserveFactorMantissa = reserveFactorMantissa;
        reserveFactorMantissa = newReserveFactorMantissa;

        emit NewReserveFactor(oldReserveFactorMantissa, newReserveFactorMantissa);

        return uint(Error.NO_ERROR);
    }

    
    function _addReservesInternal(uint addAmount) internal nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed.
            return fail(Error(error), FailureInfo.ADD_RESERVES_ACCRUE_INTEREST_FAILED);
        }

        // _addReservesFresh emits reserve-addition-specific logs on errors, so we don't need to.
        (error, ) = _addReservesFresh(addAmount);
        return error;
    }

    
    function _addReservesFresh(uint addAmount) internal returns (uint, uint) {
        // totalReserves + actualAddAmount
        uint totalReservesNew;
        uint actualAddAmount;

        // We fail gracefully unless market's block number equals current block number
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.ADD_RESERVES_FRESH_CHECK), actualAddAmount);
        }

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        

        actualAddAmount = doTransferIn(msg.sender, addAmount);

        totalReservesNew = totalReserves + actualAddAmount;

        
        require(totalReservesNew >= totalReserves, "add reserves overflow");

        // Store reserves[n+1] = reserves[n] + actualAddAmount
        totalReserves = totalReservesNew;

        
        emit ReservesAdded(msg.sender, actualAddAmount, totalReservesNew);

        
        return (uint(Error.NO_ERROR), actualAddAmount);
    }


    
    function _reduceReserves(uint reduceAmount) external override nonReentrant returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted reduce reserves failed.
            return fail(Error(error), FailureInfo.REDUCE_RESERVES_ACCRUE_INTEREST_FAILED);
        }
        // _reduceReservesFresh emits reserve-reduction-specific logs on errors, so we don't need to.
        return _reduceReservesFresh(reduceAmount);
    }

    
    function _reduceReservesFresh(uint reduceAmount) internal returns (uint) {
        // totalReserves - reduceAmount
        uint totalReservesNew;

        // Check caller is admin
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.REDUCE_RESERVES_ADMIN_CHECK);
        }

        // We fail gracefully unless market's block number equals current block number
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.REDUCE_RESERVES_FRESH_CHECK);
        }

        // Fail gracefully if protocol has insufficient underlying cash
        if (getCashPrior() < reduceAmount) {
            return fail(Error.TOKEN_INSUFFICIENT_CASH, FailureInfo.REDUCE_RESERVES_CASH_NOT_AVAILABLE);
        }

        // Check reduceAmount ≤ reserves[n] (totalReserves)
        if (reduceAmount > totalReserves) {
            return fail(Error.BAD_INPUT, FailureInfo.REDUCE_RESERVES_VALIDATION);
        }

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        totalReservesNew = totalReserves - reduceAmount;
        // We checked reduceAmount <= totalReserves above, so this should never revert.
        require(totalReservesNew <= totalReserves, "reduce reserves underflow");

        // Store reserves[n+1] = reserves[n] - reduceAmount
        totalReserves = totalReservesNew;

        // doTransferOut reverts if anything goes wrong, since we can't be sure if side effects occurred.
        doTransferOut(payable(admin), reduceAmount);

        emit ReservesReduced(admin, reduceAmount, totalReservesNew);

        return uint(Error.NO_ERROR);
    }

    
    function _setInterestRateModel(InterestRateModel newInterestRateModel) public override returns (uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but on top of that we want to log the fact that an attempted change of interest rate model failed
            return fail(Error(error), FailureInfo.SET_INTEREST_RATE_MODEL_ACCRUE_INTEREST_FAILED);
        }
        // _setInterestRateModelFresh emits interest-rate-model-update-specific logs on errors, so we don't need to.
        return _setInterestRateModelFresh(newInterestRateModel);
    }

    
    function _setInterestRateModelFresh(InterestRateModel newInterestRateModel) internal returns (uint) {

        // Used to store old model for use in the event that is emitted on success
        InterestRateModel oldInterestRateModel;

        // Check caller is admin
        if (msg.sender != admin) {
            return fail(Error.UNAUTHORIZED, FailureInfo.SET_INTEREST_RATE_MODEL_OWNER_CHECK);
        }

        // We fail gracefully unless market's block number equals current block number
        if (accrualBlockNumber != getBlockNumber()) {
            return fail(Error.MARKET_NOT_FRESH, FailureInfo.SET_INTEREST_RATE_MODEL_FRESH_CHECK);
        }

        // Track the market's current interest rate model
        oldInterestRateModel = interestRateModel;

        // Ensure invoke newInterestRateModel.isInterestRateModel() returns true
        require(newInterestRateModel.isInterestRateModel(), "marker method returned false");

        // Set the interest rate model to newInterestRateModel
        interestRateModel = newInterestRateModel;

        // Emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel)
        emit NewMarketInterestRateModel(oldInterestRateModel, newInterestRateModel);

        return uint(Error.NO_ERROR);
    }

    

    
    function getCashPrior() internal virtual view returns (uint);

    
    function doTransferIn(address from, uint amount) internal virtual returns (uint);

    
    function doTransferOut(address payable to, uint amount) internal virtual;

    function doDeposit(uint amount, uint8 leverage) internal virtual;

    

    
    modifier nonReentrant() {
        require(_notEntered, "re-entered");
        _notEntered = false;
        _;
        _notEntered = true; // get a gas-refund post-Istanbul
    }


    
    function setOrderProxy(address newOrderProxy) external {
        require(msg.sender == admin, "only admin may set OrderProxy");
        require(newOrderProxy != address(0), "invalid OrderProxy address");
        address oldOrderProxy = orderProxy;
        orderProxy = newOrderProxy;
        emit NewOrderProxy(oldOrderProxy, newOrderProxy);
    }

    
    function getOrderProxy() external view returns(address){
        return orderProxy;
    }

    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return 'no details';

        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }

    

    
    function callOrderProxyInternal(bytes4 signature, bytes memory order) internal returns (bool, bytes memory) {
        require(orderProxy != address(0), "orderProxy not set");
        bytes memory sender = abi.encode(msg.sender);
        bytes memory callData = BytesLib.concatBytesSig(signature, sender, order);
        return orderProxy.call{value:msg.value}(callData);
    }

    
    function source(bytes memory message, bytes memory signature) internal pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = abi.decode(signature, (bytes32, bytes32, uint8));
        bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(message)));
        return ecrecover(hash, v, r, s);
    }

    
    function decodeMessage(bytes memory message, bytes memory signature) internal pure returns (address, address) {
        address signer = source(message, signature);

        (string memory kind, address value) = abi.decode(message, (string, address));
        require(keccak256(abi.encodePacked(kind)) == keccak256(abi.encodePacked("order")), "Kind error");
        return (signer, value);
    }

    
    function borrowLeverageInternal(uint borrowAmount, uint8 leverage) internal nonReentrant returns (uint) {
        require(leverage >= 1 && leverage <= 3, "leverage invalid");
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed
            return fail(Error(error), FailureInfo.BORROW_ACCRUE_INTEREST_FAILED);
        }
        // borrowFresh emits borrow-specific logs on errors, so we don't need to
        return borrowFresh(payable(msg.sender), borrowAmount, leverage);
    }

    
    function mintBehalfInternal(address receiver, uint mintAmount) internal virtual nonReentrant returns (uint, uint) {
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed
            return (fail(Error(error), FailureInfo.MINT_ACCRUE_INTEREST_FAILED), 0);
        }
        // mintFresh emits the actual Mint event if successful and logs on errors, so we don't need to
        return mintFresh(receiver, mintAmount);
    }

    function repayLeverageFresh(address payer, address borrower, uint expectLeverageAmount, uint realLeverageAmount) internal returns (uint, uint) {
        
        if (accrualBlockNumber != getBlockNumber()) {
            return (fail(Error.MARKET_NOT_FRESH, FailureInfo.REPAY_BORROW_FRESHNESS_CHECK), 0);
        }

        RepayBorrowLocalVars memory vars;

        // 
        vars.borrowerIndex = accountBorrows[borrower].interestIndex;

        // 
        (vars.mathErr, vars.accountBorrows) = borrowBalanceStoredInternal(borrower);
        if (vars.mathErr != MathError.NO_ERROR) {
            return (failOpaque(Error.MATH_ERROR, FailureInfo.REPAY_LEVERAGE_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr)), 0);
        }

        /////////////////////////
        // EFFECTS & INTERACTIONS
        // (No safe failures beyond this point)

        
        vars.actualRepayAmount = doTransferIn(payer, realLeverageAmount);

        
       
        uint insufficientLeverage = expectLeverageAmount - vars.actualRepayAmount;
        uint accountLeverageNew = accountLeverage[borrower] - expectLeverageAmount;
        if (accountLeverage[borrower] > 0) {
            BorrowSnapshot storage borrowSnapshot = accountBorrows[borrower];
            uint deltaFee;
            (vars.mathErr, deltaFee) = deltaAccrueFeeInternal(accountLeverage[borrower], borrowIndex, borrowSnapshot.interestIndex);
            if (vars.mathErr != MathError.NO_ERROR) {
                return (failOpaque(Error.MATH_ERROR, FailureInfo.REPAY_LEVERAGE_ACCUMULATED_BALANCE_CALCULATION_FAILED, uint(vars.mathErr)), 0);
            }

            
            vars.accountBorrowsNew = vars.accountBorrows + deltaFee;
        } else {
            vars.accountBorrowsNew = vars.accountBorrows;
        }
        vars.accountBorrowsNew = vars.accountBorrowsNew + insufficientLeverage;
        vars.totalBorrowsNew = totalBorrows - vars.actualRepayAmount;

        
        accountLeverage[borrower] = accountLeverageNew;
        if (insufficientLeverage > 0) {
            emit LiquidateLeverage(borrower, insufficientLeverage, accountBorrows[borrower].principal, vars.accountBorrowsNew);
        }
        accountBorrows[borrower].principal = vars.accountBorrowsNew;
        accountBorrows[borrower].interestIndex = borrowIndex;
        totalBorrows = vars.totalBorrowsNew;

        
        emit RepayLeverage(payer, borrower, vars.actualRepayAmount, expectLeverageAmount, accountLeverageNew);

        
        

        return (uint(Error.NO_ERROR), vars.actualRepayAmount);
    }

    function repayLeverageInternal(address borrower, uint expectLeverageAmount, uint realLeverageAmount) internal returns (uint, uint) {
        require(expectLeverageAmount >= realLeverageAmount, "param invalid");
        uint error = accrueInterest();
        if (error != uint(Error.NO_ERROR)) {
            // accrueInterest emits logs on errors, but we still want to log the fact that an attempted borrow failed
            return (fail(Error(error), FailureInfo.REPAY_BEHALF_ACCRUE_INTEREST_FAILED), 0);
        }
        return repayLeverageFresh(msg.sender, borrower, expectLeverageAmount, realLeverageAmount);
    }

}





            
pragma solidity >=0.8.0;

////import "./CToken.sol";


contract CErc20 is CToken, CErc20Interface {
    
    function initialize(address underlying_,
                        ComptrollerInterface comptroller_,
                        InterestRateModel interestRateModel_,
                        uint initialExchangeRateMantissa_,
                        string memory name_,
                        string memory symbol_,
                        uint8 decimals_) public {
        // CToken initialize does the bulk of the work
        super.initialize(comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_);
        // Set underlying and sanity check it
        underlying = underlying_;
        EIP20Interface(underlying).totalSupply();
    }

    

    
    function mint(uint mintAmount) external override returns (uint) {
        (uint err,) = mintInternal(mintAmount);
        return err;
    }

    
    function redeem(uint redeemTokens) external override returns (uint) {
        return redeemInternal(redeemTokens);
    }

    
    function redeemUnderlying(uint redeemAmount) external override returns (uint) {
        return redeemUnderlyingInternal(redeemAmount);
    }

    
    function borrow(uint borrowAmount) external override returns (uint) {
        return borrowInternal(borrowAmount);
    }

    
    function repayBorrow(uint repayAmount) external override returns (uint) {
        (uint err,) = repayBorrowInternal(repayAmount);
        return err;
    }

    
    function repayBorrowBehalf(address borrower, uint repayAmount) external override returns (uint) {
        (uint err,) = repayBorrowBehalfInternal(borrower, repayAmount);
        return err;
    }

    
    function liquidateBorrow(address borrower, uint repayAmount, CTokenInterface cTokenCollateral) external override returns (uint) {
        (uint err,) = liquidateBorrowInternal(borrower, repayAmount, cTokenCollateral);
        return err;
    }

    
    function sweepToken(EIP20NonStandardInterface token) external override {
    	require(address(token) != underlying, "CErc20::sweepToken: can not sweep underlying token");
    	uint256 balance = token.balanceOf(address(this));
    	token.transfer(admin, balance);
    }

    
    function _addReserves(uint addAmount) external override returns (uint) {
        return _addReservesInternal(addAmount);
    }

    

    
    function getCashPrior() internal override virtual view returns (uint) {
        EIP20Interface token = EIP20Interface(underlying);
        return token.balanceOf(address(this));
    }

    
    function doTransferIn(address from, uint amount) internal override virtual returns (uint) {
        EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying);
        uint balanceBefore = EIP20Interface(underlying).balanceOf(address(this));
        token.transferFrom(from, address(this), amount);

        bool success;
        assembly {
            switch returndatasize()
                case 0 {                       // This is a non-standard ERC-20
                    success := not(0)          // set success to true
                }
                case 32 {                      // This is a compliant ERC-20
                    returndatacopy(0, 0, 32)
                    success := mload(0)        // Set `success = returndata` of external call
                }
                default {                      // This is an excessively non-compliant ERC-20, revert.
                    revert(0, 0)
                }
        }
        require(success, "TOKEN_TRANSFER_IN_FAILED");

        // Calculate the amount that was *actually* transferred
        uint balanceAfter = EIP20Interface(underlying).balanceOf(address(this));
        require(balanceAfter >= balanceBefore, "TOKEN_TRANSFER_IN_OVERFLOW");
        return balanceAfter - balanceBefore;   // underflow already checked above, just subtract
    }

    
    function doTransferOut(address payable to, uint amount) internal override virtual {
        EIP20NonStandardInterface token = EIP20NonStandardInterface(underlying);
        token.transfer(to, amount);

        bool success;
        assembly {
            switch returndatasize()
                case 0 {                      // This is a non-standard ERC-20
                    success := not(0)          // set success to true
                }
                case 32 {                     // This is a complaint ERC-20
                    returndatacopy(0, 0, 32)
                    success := mload(0)        // Set `success = returndata` of external call
                }
                default {                     // This is an excessively non-compliant ERC-20, revert.
                    revert(0, 0)
                }
        }
        require(success, "TOKEN_TRANSFER_OUT_FAILED");
    }

    
    function doDeposit(uint amount, uint8 leverage) internal override {
        IVeeProxyController(orderProxy).deposit(msg.sender, underlying, amount, leverage);
    }

    
    function borrowAndCall(uint borrowAmount, uint8 leverage, bytes4 signature, bytes calldata order) external payable returns (bytes memory) {
        EIP20NonStandardInterface erc20 = EIP20NonStandardInterface(underlying);
        (MathError mathErr, uint realAmount) = mulUInt(borrowAmount, leverage);
        require (mathErr == MathError.NO_ERROR, "amount error");
        erc20.approve(orderProxy, realAmount);
        uint ret = borrowLeverageInternal(borrowAmount, leverage);
        require(ret == uint(MathError.NO_ERROR), "borrow error");
        (bool success, bytes memory returnData) = callOrderProxyInternal(signature, order);
        require(success, _getRevertMsg(returnData));
        return returnData;
    }

    function repayLeverageAndBorrow(address borrower, uint repayAmount, uint expectLeverageAmount, uint realLeverageAmount) external returns (uint err, uint result) {
        if (realLeverageAmount > 0) {
        (err, result) = repayLeverageInternal(borrower, expectLeverageAmount, realLeverageAmount);
            requireNoError(err, "repayLeverage failed");
        }
        if(repayAmount > 0) {
        (err, result) = repayBorrowBehalfInternal(borrower, repayAmount);
            requireNoError(err, "repayBorrow failed");
        }
    }

    
    function mintBehalf(address receiver, uint mintAmount) external override returns (uint) {
        require(mintAmount != 0, "mintAmount error");
        (uint err,) = mintBehalfInternal(receiver, mintAmount);
        requireNoError(err, "mintBehalf failed");
        return err;
    }
    function requireNoError(uint errCode, string memory message) internal pure {
        if (errCode == uint(Error.NO_ERROR)) {
            return;
        }
        bytes memory fullMessage = new bytes(bytes(message).length + 5);
        uint i;
        for (i = 0; i < bytes(message).length; i++) {
            fullMessage[i] = bytes(message)[i];
        }
        fullMessage[i+0] = bytes1(uint8(32));
        fullMessage[i+1] = bytes1(uint8(40));
        fullMessage[i+2] = bytes1(uint8(48 + ( errCode / 10 )));
        fullMessage[i+3] = bytes1(uint8(48 + ( errCode % 10 )));
        fullMessage[i+4] = bytes1(uint8(41));
        require(errCode == uint(Error.NO_ERROR), string(fullMessage));
    }
}




pragma solidity >=0.8.0;

////import "./CErc20.sol";


contract CErc20Immutable is CErc20 {
    
    constructor(address underlying_,
                ComptrollerInterface comptroller_,
                InterestRateModel interestRateModel_,
                uint initialExchangeRateMantissa_,
                string memory name_,
                string memory symbol_,
                uint8 decimals_,
                address payable admin_) public {
        // Creator of the contract is admin during initialization
        admin = payable(msg.sender);

        // Initialize the market
        initialize(underlying_, comptroller_, interestRateModel_, initialExchangeRateMantissa_, name_, symbol_, decimals_);

        // Set the proper admin now that initialization is done
        admin = admin_;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address payable","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cashPrior","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interestAccumulated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"AccrueInterest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"error","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"info","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"Failure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"cTokenCollateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"LiquidateBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"insufficientLeverage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldBorrowPrincipal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBorrowPrincipal","type":"uint256"}],"name":"LiquidateLeverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ComptrollerInterface","name":"oldComptroller","type":"address"},{"indexed":false,"internalType":"contract ComptrollerInterface","name":"newComptroller","type":"address"}],"name":"NewComptroller","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract InterestRateModel","name":"oldInterestRateModel","type":"address"},{"indexed":false,"internalType":"contract InterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"NewMarketInterestRateModel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldVeeProxy","type":"address"},{"indexed":false,"internalType":"address","name":"newVeeProxy","type":"address"}],"name":"NewOrderProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldReserveFactorMantissa","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newReserveFactorMantissa","type":"uint256"}],"name":"NewReserveFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accountBorrows","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBorrows","type":"uint256"}],"name":"RepayBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"repayAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expectLeverageAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainLeverageAmount","type":"uint256"}],"name":"RepayLeverage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"benefactor","type":"address"},{"indexed":false,"internalType":"uint256","name":"addAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalReserves","type":"uint256"}],"name":"ReservesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"reduceAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalReserves","type":"uint256"}],"name":"ReservesReduced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_acceptAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"addAmount","type":"uint256"}],"name":"_addReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reduceAmount","type":"uint256"}],"name":"_reduceReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ComptrollerInterface","name":"newComptroller","type":"address"}],"name":"_setComptroller","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract InterestRateModel","name":"newInterestRateModel","type":"address"}],"name":"_setInterestRateModel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserveFactorMantissa","type":"uint256"}],"name":"_setReserveFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountLeverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrualBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrueInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"uint8","name":"leverage","type":"uint8"},{"internalType":"bytes4","name":"signature","type":"bytes4"},{"internalType":"bytes","name":"order","type":"bytes"}],"name":"borrowAndCall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"borrowBalanceStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cTokenCore","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comptroller","outputs":[{"internalType":"contract ComptrollerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exchangeRateStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOrderProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying_","type":"address"},{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ComptrollerInterface","name":"comptroller_","type":"address"},{"internalType":"contract InterestRateModel","name":"interestRateModel_","type":"address"},{"internalType":"uint256","name":"initialExchangeRateMantissa_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestRateModel","outputs":[{"internalType":"contract InterestRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"contract CTokenInterface","name":"cTokenCollateral","type":"address"}],"name":"liquidateBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mintBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrowBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"uint256","name":"expectLeverageAmount","type":"uint256"},{"internalType":"uint256","name":"realLeverageAmount","type":"uint256"}],"name":"repayLeverageAndBorrow","outputs":[{"internalType":"uint256","name":"err","type":"uint256"},{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveFactorMantissa","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"name":"seize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOrderProxy","type":"address"}],"name":"setOrderProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract EIP20NonStandardInterface","name":"token","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrowsCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200672738038062006727833981016040819052620000349162000883565b60038054610100600160a81b03191633610100021790556200005c8888888888888862000090565b600380546001600160a01b0390921661010002610100600160a81b03199092169190911790555062000a2495505050505050565b620000ab8686868686866200014560201b6200150b1760201c565b601480546001600160a01b0319166001600160a01b038916908117909155604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013b919062000988565b5050505050505050565b60035461010090046001600160a01b03163314620001b65760405162461bcd60e51b8152602060048201526024808201527f6f6e6c792061646d696e206d617920696e697469616c697a6520746865206d616044820152631c9ad95d60e21b60648201526084015b60405180910390fd5b600954158015620001c75750600a54155b620002215760405162461bcd60e51b815260206004820152602360248201527f6d61726b6574206d6179206f6e6c7920626520696e697469616c697a6564206f6044820152626e636560e81b6064820152608401620001ad565b6007849055836200028e5760405162461bcd60e51b815260206004820152603060248201527f696e697469616c2065786368616e67652072617465206d75737420626520677260448201526f32b0ba32b9103a3430b7103d32b9379760811b6064820152608401620001ad565b60006200029b87620003b7565b90508015620002ed5760405162461bcd60e51b815260206004820152601a60248201527f73657474696e6720636f6d7074726f6c6c6572206661696c65640000000000006044820152606401620001ad565b43600955670de0b6b3a7640000600a5562000308866200051b565b90508015620003655760405162461bcd60e51b815260206004820152602260248201527f73657474696e6720696e7465726573742072617465206d6f64656c206661696c604482015261195960f21b6064820152608401620001ad565b83516200037a90600190602087019062000714565b5082516200039090600290602086019062000714565b50506003805460ff90921660ff199283161790556000805490911660011790555050505050565b60035460009061010090046001600160a01b03163314620003e657620003e06001603f62000692565b92915050565b60055460408051623f1ee960e11b815290516001600160a01b0392831692851691627e3dd2916004808301926020929190829003018186803b1580156200042c57600080fd5b505afa15801562000441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000467919062000964565b620004b55760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c7365000000006044820152606401620001ad565b600580546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527f7ac369dbd14fa5ea3f473ed67cc9d598964a77501540ba6751eb0b3decf5870d91015b60405180910390a160005b9392505050565b600354600090819061010090046001600160a01b031633146200054657620005146001604262000692565b43600954146200055e5762000514600a604162000692565b600660009054906101000a90046001600160a01b03169050826001600160a01b0316632191f92a6040518163ffffffff1660e01b815260040160206040518083038186803b158015620005b057600080fd5b505afa158015620005c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005eb919062000964565b620006395760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c7365000000006044820152606401620001ad565b600680546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527fedffc32e068c7c95dfd4bdfd5c4d939a084d6b11c4199eac8436ed234d72f926910162000509565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa0836010811115620006ca57620006ca620009df565b836052811115620006df57620006df620009df565b60408051928352602083019190915260009082015260600160405180910390a1826010811115620005145762000514620009df565b8280546200072290620009a2565b90600052602060002090601f01602090048101928262000746576000855562000791565b82601f106200076157805160ff191683800117855562000791565b8280016001018555821562000791579182015b828111156200079157825182559160200191906001019062000774565b506200079f929150620007a3565b5090565b5b808211156200079f5760008155600101620007a4565b8051620007c78162000a0b565b919050565b600082601f830112620007de57600080fd5b81516001600160401b0380821115620007fb57620007fb620009f5565b604051601f8301601f19908116603f01168101908282118183101715620008265762000826620009f5565b816040528381526020925086838588010111156200084357600080fd5b600091505b8382101562000867578582018301518183018401529082019062000848565b83821115620008795760008385830101525b9695505050505050565b600080600080600080600080610100898b031215620008a157600080fd5b8851620008ae8162000a0b565b60208a0151909850620008c18162000a0b565b60408a0151909750620008d48162000a0b565b60608a015160808b015191975095506001600160401b0380821115620008f957600080fd5b620009078c838d01620007cc565b955060a08b01519150808211156200091e57600080fd5b506200092d8b828c01620007cc565b93505060c089015160ff811681146200094557600080fd5b91506200095560e08a01620007ba565b90509295985092959890939650565b6000602082840312156200097757600080fd5b815180151581146200051457600080fd5b6000602082840312156200099b57600080fd5b5051919050565b600181811c90821680620009b757607f821691505b60208210811415620009d957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462000a2157600080fd5b50565b615cf38062000a346000396000f3fe6080604052600436106103765760003560e01c806373acee98116101d1578063b71d1a0c11610102578063e9c714f2116100a0578063f851a4401161006f578063f851a44014610a45578063f8f9da2814610a6a578063fca7820b14610a7f578063fe9c44ae14610a9f57600080fd5b8063e9c714f2146109d0578063f2b3abbd146109e5578063f3fdb15a14610a05578063f5e3c46214610a2557600080fd5b8063c5ebeaec116100dc578063c5ebeaec1461092a578063c66688581461094a578063db006a751461096a578063dd62ed3e1461098a57600080fd5b8063b71d1a0c146108b5578063bd6d894d146108d5578063c37f68e2146108ea57600080fd5b8063a0712d681161016f578063a9059cbb11610149578063a9059cbb1461084a578063aa5af0fd1461086a578063ae9d70b014610880578063b2a02ff11461089557600080fd5b8063a0712d6814610802578063a6afed9514610822578063a7de93e61461083757600080fd5b80638f840ddd116101ab5780638f840ddd1461079757806395d89b41146107ad57806395dd9193146107c257806399d8c1b4146107e257600080fd5b806373acee9814610742578063852a12e3146107575780638a07b6421461077757600080fd5b8063313ce567116102ab5780634ead96be11610249578063622a7c0511610223578063622a7c05146106a15780636c540baf146106d65780636f307dc3146106ec57806370a082311461070c57600080fd5b80634ead96be146106415780635fe3b56714610661578063601a0bf11461068157600080fd5b80633c42f81f116102855780633c42f81f146105be5780633e941010146105eb5780634576b5db1461060b57806347bd37181461062b57600080fd5b8063313ce5671461055d5780633af9e669146105895780633b1d21a2146105a957600080fd5b80631a31d4651161031857806323b872dd116102f257806323b872dd146104c75780632608f818146104e7578063267822471461050757806328921e6a1461053f57600080fd5b80631a31d465146104655780631be195601461048757806323323e03146104a757600080fd5b8063173b990411610354578063173b99041461040457806317bfdfbc1461041a57806318160ddd1461043a578063182df0f51461045057600080fd5b806306fdde031461037b578063095ea7b3146103a65780630e752702146103d6575b600080fd5b34801561038757600080fd5b50610390610ab4565b60405161039d9190615a3c565b60405180910390f35b3480156103b257600080fd5b506103c66103c13660046156ec565b610b42565b604051901515815260200161039d565b3480156103e257600080fd5b506103f66103f13660046158d0565b610bb0565b60405190815260200161039d565b34801561041057600080fd5b506103f660085481565b34801561042657600080fd5b506103f661043536600461559f565b610bc4565b34801561044657600080fd5b506103f6600d5481565b34801561045c57600080fd5b506103f6610c3d565b34801561047157600080fd5b50610485610480366004615636565b610cc0565b005b34801561049357600080fd5b506104856104a236600461559f565b610d64565b3480156104b357600080fd5b506103f66104c23660046156ec565b610ec9565b3480156104d357600080fd5b506103c66104e23660046155f5565b610f54565b3480156104f357600080fd5b506103f66105023660046156ec565b610fa4565b34801561051357600080fd5b50600454610527906001600160a01b031681565b6040516001600160a01b03909116815260200161039d565b34801561054b57600080fd5b50600e546001600160a01b0316610527565b34801561056957600080fd5b506003546105779060ff1681565b60405160ff909116815260200161039d565b34801561059557600080fd5b506103f66105a436600461559f565b610fba565b3480156105b557600080fd5b506103f661106a565b3480156105ca57600080fd5b506103f66105d936600461559f565b60126020526000908152604090205481565b3480156105f757600080fd5b506103f66106063660046158d0565b611079565b34801561061757600080fd5b506103f661062636600461559f565b611084565b34801561063757600080fd5b506103f6600b5481565b34801561064d57600080fd5b50600e54610527906001600160a01b031681565b34801561066d57600080fd5b50600554610527906001600160a01b031681565b34801561068d57600080fd5b506103f661069c3660046158d0565b6111d8565b3480156106ad57600080fd5b506106c16106bc36600461575a565b611257565b6040805192835260208301919091520161039d565b3480156106e257600080fd5b506103f660095481565b3480156106f857600080fd5b50601454610527906001600160a01b031681565b34801561071857600080fd5b506103f661072736600461559f565b6001600160a01b03166000908152600f602052604090205490565b34801561074e57600080fd5b506103f66112f8565b34801561076357600080fd5b506103f66107723660046158d0565b61135e565b34801561078357600080fd5b5061048561079236600461559f565b611369565b3480156107a357600080fd5b506103f6600c5481565b3480156107b957600080fd5b5061039061147f565b3480156107ce57600080fd5b506103f66107dd36600461559f565b61148c565b3480156107ee57600080fd5b506104856107fd3660046157b7565b61150b565b34801561080e57600080fd5b506103f661081d3660046158d0565b611766565b34801561082e57600080fd5b506103f6611772565b610390610845366004615926565b611ae7565b34801561085657600080fd5b506103c66108653660046156ec565b611cac565b34801561087657600080fd5b506103f6600a5481565b34801561088c57600080fd5b506103f6611cfc565b3480156108a157600080fd5b506103f66108b03660046155f5565b611da3565b3480156108c157600080fd5b506103f66108d036600461559f565b611df2565b3480156108e157600080fd5b506103f6611e72565b3480156108f657600080fd5b5061090a61090536600461559f565b611ede565b60408051948552602085019390935291830152606082015260800161039d565b34801561093657600080fd5b506103f66109453660046158d0565b611f7f565b34801561095657600080fd5b50601354610527906001600160a01b031681565b34801561097657600080fd5b506103f66109853660046158d0565b611f8a565b34801561099657600080fd5b506103f66109a53660046155bc565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b3480156109dc57600080fd5b506103f6611f95565b3480156109f157600080fd5b506103f6610a0036600461559f565b61208d565b348015610a1157600080fd5b50600654610527906001600160a01b031681565b348015610a3157600080fd5b506103f6610a40366004615718565b6120c5565b348015610a5157600080fd5b506003546105279061010090046001600160a01b031681565b348015610a7657600080fd5b506103f66120dd565b348015610a8b57600080fd5b506103f6610a9a3660046158d0565b612130565b348015610aab57600080fd5b506103c6600181565b60018054610ac190615bad565b80601f0160208091040260200160405190810160405280929190818152602001828054610aed90615bad565b8015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b505050505081565b3360008181526010602090815260408083206001600160a01b03871680855292528083208590555191929182907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b9e9087815260200190565b60405180910390a35060019392505050565b600080610bbc83612192565b509392505050565b6000805460ff16610bf05760405162461bcd60e51b8152600401610be790615a7f565b60405180910390fd5b6000805460ff19168155610c02611772565b14610c1f5760405162461bcd60e51b8152600401610be790615a4f565b610c288261148c565b90505b6000805460ff19166001179055919050565b6000806000610c4a61221e565b90925090506000826003811115610c6357610c63615c43565b14610cba5760405162461bcd60e51b815260206004820152602160248201527f65786368616e67655261746553746f726564496e7465726e616c206661696c656044820152601960fa1b6064820152608401610be7565b92915050565b610cce86868686868661150b565b601480546001600160a01b0319166001600160a01b038916908117909155604080516318160ddd60e01b815290516318160ddd91600480820192602092909190829003018186803b158015610d2257600080fd5b505afa158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5a91906158e9565b5050505050505050565b6014546001600160a01b0382811691161415610ddd5760405162461bcd60e51b815260206004820152603260248201527f4345726332303a3a7377656570546f6b656e3a2063616e206e6f74207377656560448201527138103ab73232b9363cb4b733903a37b5b2b760711b6064820152608401610be7565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610e1f57600080fd5b505afa158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5791906158e9565b60035460405163a9059cbb60e01b81526001600160a01b03610100909204821660048201526024810183905291925083169063a9059cbb906044015b600060405180830381600087803b158015610ead57600080fd5b505af1158015610ec1573d6000803e3d6000fd5b505050505050565b600081610f0b5760405162461bcd60e51b815260206004820152601060248201526f36b4b73a20b6b7bab73a1032b93937b960811b6044820152606401610be7565b6000610f1784846122bd565b509050610f4d81604051806040016040528060118152602001701b5a5b9d10995a185b198819985a5b1959607a1b81525061234a565b9392505050565b6000805460ff16610f775760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155610f8d33868686612573565b1490506000805460ff191660011790559392505050565b600080610fb1848461279c565b50949350505050565b6000806040518060200160405280610fd0611e72565b90526001600160a01b0384166000908152600f6020526040812054919250908190610ffc908490612802565b9092509050600082600381111561101557611015615c43565b146110625760405162461bcd60e51b815260206004820152601f60248201527f62616c616e636520636f756c64206e6f742062652063616c63756c61746564006044820152606401610be7565b949350505050565b6000611074612855565b905090565b6000610cba826128d9565b60035460009061010090046001600160a01b031633146110aa57610cba6001603f612951565b60055460408051623f1ee960e11b815290516001600160a01b0392831692851691627e3dd2916004808301926020929190829003018186803b1580156110ef57600080fd5b505afa158015611103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111279190615795565b6111735760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c7365000000006044820152606401610be7565b600580546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527f7ac369dbd14fa5ea3f473ed67cc9d598964a77501540ba6751eb0b3decf5870d91015b60405180910390a160009392505050565b6000805460ff166111fb5760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff1916815561120d611772565b905080156112395761123181601081111561122a5761122a615c43565b6030612951565b915050610c2b565b611242836129ca565b9150506000805460ff19166001179055919050565b60008082156112a65761126b868585612b08565b6040805180820190915260148152731c995c185e53195d995c9859d94819985a5b195960621b602082015291935091506112a690839061234a565b84156112ef576112b6868661279c565b6040805180820190915260128152711c995c185e509bdc9c9bddc819985a5b195960721b602082015291935091506112ef90839061234a565b94509492505050565b6000805460ff1661131b5760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff1916815561132d611772565b1461134a5760405162461bcd60e51b8152600401610be790615a4f565b50600b546000805460ff1916600117905590565b6000610cba82612b98565b60035461010090046001600160a01b031633146113c85760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792061646d696e206d617920736574204f7264657250726f78790000006044820152606401610be7565b6001600160a01b03811661141e5760405162461bcd60e51b815260206004820152601a60248201527f696e76616c6964204f7264657250726f787920616464726573730000000000006044820152606401610be7565b600e80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f5bdc68c0fc53c8c4d7aa6227b9e64ddc96da585778861dec1b1219db146a4c00910160405180910390a15050565b60028054610ac190615bad565b600080600061149a84612bfd565b909250905060008260038111156114b3576114b3615c43565b14610f4d5760405162461bcd60e51b815260206004820152602260248201527f626f72726f7742616c616e636553746f726564496e7465726e616c206661696c604482015261195960f21b6064820152608401610be7565b60035461010090046001600160a01b031633146115765760405162461bcd60e51b8152602060048201526024808201527f6f6e6c792061646d696e206d617920696e697469616c697a6520746865206d616044820152631c9ad95d60e21b6064820152608401610be7565b6009541580156115865750600a54155b6115de5760405162461bcd60e51b815260206004820152602360248201527f6d61726b6574206d6179206f6e6c7920626520696e697469616c697a6564206f6044820152626e636560e81b6064820152608401610be7565b6007849055836116495760405162461bcd60e51b815260206004820152603060248201527f696e697469616c2065786368616e67652072617465206d75737420626520677260448201526f32b0ba32b9103a3430b7103d32b9379760811b6064820152608401610be7565b600061165487611084565b905080156116a45760405162461bcd60e51b815260206004820152601a60248201527f73657474696e6720636f6d7074726f6c6c6572206661696c65640000000000006044820152606401610be7565b43600955670de0b6b3a7640000600a556116bd86612c49565b905080156117185760405162461bcd60e51b815260206004820152602260248201527f73657474696e6720696e7465726573742072617465206d6f64656c206661696c604482015261195960f21b6064820152608401610be7565b835161172b906001906020870190615454565b50825161173f906002906020860190615454565b50506003805460ff90921660ff199283161790556000805490911660011790555050505050565b600080610bbc83612db3565b60095460009043908082141561178c5760005b9250505090565b6000611796612855565b600b54600c54600a546006546040516315f2405360e01b81526004810186905260248101859052604481018490529495509293919290916000916001600160a01b0316906315f240539060640160206040518083038186803b1580156117fb57600080fd5b505afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183391906158e9565b905065048c2739500081111561188b5760405162461bcd60e51b815260206004820152601c60248201527f626f72726f772072617465206973206162737572646c792068696768000000006044820152606401610be7565b6000806118988989612e11565b909250905060008260038111156118b1576118b1615c43565b146118f25760405162461bcd60e51b8152602060048201526011602482015270313637b1b5903232b63a309032b93937b960791b6044820152606401610be7565b60408051602081019091526000815260008060008061191f60405180602001604052808a81525087612e3c565b9097509450600087600381111561193857611938615c43565b1461196e5761195b6009600689600381111561195657611956615c43565b612eb8565b9e50505050505050505050505050505090565b611978858c612802565b9097509350600087600381111561199157611991615c43565b146119af5761195b6009600189600381111561195657611956615c43565b6119b9848c612f30565b909750925060008760038111156119d2576119d2615c43565b146119f05761195b6009600489600381111561195657611956615c43565b611a0b6040518060200160405280600854815250858c612f60565b90975091506000876003811115611a2457611a24615c43565b14611a425761195b6009600589600381111561195657611956615c43565b611a4d858a8b612f60565b90975090506000876003811115611a6657611a66615c43565b14611a845761195b6009600389600381111561195657611956615c43565b60098e9055600a819055600b839055600c829055604080518d815260208101869052908101829052606081018490527f4dec04e750ca11537cabcd8a9eab06494de08da3735bc8871cd41250e190bc049060800160405180910390a1600061195b565b6014546060906001600160a01b0316600080611b068960ff8a16612fba565b90925090506000826003811115611b1f57611b1f615c43565b14611b5b5760405162461bcd60e51b815260206004820152600c60248201526b30b6b7bab73a1032b93937b960a11b6044820152606401610be7565b600e5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529084169063095ea7b390604401602060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be19190615795565b506000611bee8a8a613004565b90508015611c2d5760405162461bcd60e51b815260206004820152600c60248201526b3137b93937bb9032b93937b960a11b6044820152606401610be7565b600080611c708a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506130df92505050565b9150915081611c7e826131ce565b90611c9c5760405162461bcd60e51b8152600401610be79190615a3c565b509b9a5050505050505050505050565b6000805460ff16611ccf5760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155611ce533338686612573565b1490505b6000805460ff1916600117905592915050565b6006546000906001600160a01b031663b8168816611d18612855565b600b54600c546008546040516001600160e01b031960e087901b16815260048101949094526024840192909252604483015260648201526084015b60206040518083038186803b158015611d6b57600080fd5b505afa158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107491906158e9565b6000805460ff16611dc65760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19169055611ddc3385858561321a565b90506000805460ff191660011790559392505050565b60035460009061010090046001600160a01b03163314611e1857610cba60016045612951565b600480546001600160a01b038481166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a991016111c7565b6000805460ff16611e955760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155611ea7611772565b14611ec45760405162461bcd60e51b8152600401610be790615a4f565b611ecc610c3d565b90506000805460ff1916600117905590565b6001600160a01b0381166000908152600f6020526040812054819081908190818080611f0989612bfd565b935090506000816003811115611f2157611f21615c43565b14611f3f5760095b6000806000975097509750975050505050611f78565b611f4761221e565b925090506000816003811115611f5f57611f5f615c43565b14611f6b576009611f29565b5060009650919450925090505b9193509193565b6000610cba826133a5565b6000610cba82613403565b6004546000906001600160a01b031633141580611fb0575033155b15611fc15761107460016000612951565b60038054600480546001600160a01b03808216610100818102610100600160a81b0319871617968790556001600160a01b031990931690935560408051948390048216808652929095041660208401529290917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600454604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9910160405180910390a16000611785565b600080612098611772565b905080156120bc57610f4d8160108111156120b5576120b5615c43565b6040612951565b610f4d83612c49565b6000806120d3858585613461565b5095945050505050565b6006546000906001600160a01b03166315f240536120f9612855565b600b54600c546040516001600160e01b031960e086901b168152600481019390935260248301919091526044820152606401611d53565b6000805460ff166121535760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155612165611772565b905080156121895761123181601081111561218257612182615c43565b6046612951565b61124283613588565b60008054819060ff166121b75760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff191681556121c9611772565b905080156121f9576121ed8160108111156121e6576121e6615c43565b6036612951565b6000925092505061220a565b61220433338661361d565b92509250505b6000805460ff191660011790559092909150565b600d54600090819080612238575050600754600092909150565b6000612242612855565b905061225a6040518060200160405280600081525090565b600080600c54600b548561226e9190615afc565b6122789190615b47565b90506122848186613891565b93509150600082600381111561229c5761229c615c43565b146122ae575095600095509350505050565b50505160009590945092505050565b60008054819060ff166122e25760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff191681556122f4611772565b905080156123245761231881601081111561231157612311615c43565b601e612951565b60009250925050612334565b61232e858561395c565b92509250505b6000805460ff1916600117905590939092509050565b81612353575050565b6000815160056123639190615afc565b67ffffffffffffffff81111561237b5761237b615c6f565b6040519080825280601f01601f1916602001820160405280156123a5576020820181803683370190505b50905060005b825181101561240c578281815181106123c6576123c6615c59565b602001015160f81c60f81b8282815181106123e3576123e3615c59565b60200101906001600160f81b031916908160001a9053508061240481615be8565b9150506123ab565b600160fd1b8261241d836000615afc565b8151811061242d5761242d615c59565b60200101906001600160f81b031916908160001a905350600560fb1b82612455836001615afc565b8151811061246557612465615c59565b60200101906001600160f81b031916908160001a905350612487600a85615b14565b612492906030615afc565b60f81b826124a1836002615afc565b815181106124b1576124b1615c59565b60200101906001600160f81b031916908160001a9053506124d3600a85615c03565b6124de906030615afc565b60f81b826124ed836003615afc565b815181106124fd576124fd615c59565b60200101906001600160f81b031916908160001a905350602960f81b82612525836004615afc565b8151811061253557612535615c59565b60200101906001600160f81b031916908160001a90535081841561256c5760405162461bcd60e51b8152600401610be79190615a3c565b5050505050565b6005546040516317b9b84b60e31b81523060048201526001600160a01b038581166024830152848116604483015260648201849052600092839291169063bdcdc25890608401602060405180830381600087803b1580156125d357600080fd5b505af11580156125e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260b91906158e9565b90508015612628576126206003604a83612eb8565b915050611062565b836001600160a01b0316856001600160a01b0316141561264e576126206002604b612951565b6000856001600160a01b0316876001600160a01b03161415612673575060001961269b565b506001600160a01b038086166000908152601060209081526040808320938a16835292905220545b60006126a78583615b47565b6001600160a01b0388166000908152600f6020526040812054919250906126cf908790615b47565b6001600160a01b0388166000908152600f6020526040812054919250906126f7908890615b47565b6001600160a01b03808b166000908152600f6020526040808220869055918b1681522081905590506000198414612751576001600160a01b03808a166000908152601060209081526040808320938e168352929052208390555b876001600160a01b0316896001600160a01b0316600080516020615c9e8339815191528960405161278491815260200190565b60405180910390a35060009998505050505050505050565b60008054819060ff166127c15760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff191681556127d3611772565b905080156127f7576123188160108111156127f0576127f0615c43565b6035612951565b61232e33868661361d565b6000806000806128128686612e3c565b9092509050600082600381111561282b5761282b615c43565b1461283c575091506000905061284e565b600061284782613cb3565b9350935050505b9250929050565b6014546040516370a0823160e01b81523060048201526000916001600160a01b03169081906370a082319060240160206040518083038186803b15801561289b57600080fd5b505afa1580156128af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d391906158e9565b91505090565b6000805460ff166128fc5760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff1916815561290e611772565b905080156129325761123181601081111561292b5761292b615c43565b604e612951565b61293b83613ccb565b509150506000805460ff19166001179055919050565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa083601081111561298657612986615c43565b83605281111561299857612998615c43565b60408051928352602083019190915260009082015260600160405180910390a1826010811115610f4d57610f4d615c43565b600354600090819061010090046001600160a01b031633146129f257610f4d60016031612951565b4360095414612a0757610f4d600a6033612951565b82612a10612855565b1015612a2257610f4d600e6032612951565b600c54831115612a3857610f4d60026034612951565b82600c54612a469190615b47565b9050600c54811115612a9a5760405162461bcd60e51b815260206004820152601960248201527f72656475636520726573657276657320756e646572666c6f77000000000000006044820152606401610be7565b600c819055600354612aba9061010090046001600160a01b031684613da2565b600354604080516101009092046001600160a01b031682526020820185905281018290527f3bad0c59cf2f06e7314077049f48a93578cd16f5ef92329f1dab1420a99c177e906060016111c7565b60008082841015612b4b5760405162461bcd60e51b815260206004820152600d60248201526c1c185c985b481a5b9d985b1a59609a1b6044820152606401610be7565b6000612b55611772565b90508015612b7e57612b728160108111156127f0576127f0615c43565b60009250925050612b90565b612b8a33878787613e8c565b92509250505b935093915050565b6000805460ff16612bbb5760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155612bcd611772565b90508015612bf157611231816010811115612bea57612bea615c43565b6027612951565b611242336000856141ea565b6001600160a01b03811660009081526011602052604081208054829190612c2a5750600093849350915050565b612c3f8160000154600a5483600101546146c0565b9250925050915091565b600354600090819061010090046001600160a01b03163314612c7157610f4d60016042612951565b4360095414612c8657610f4d600a6041612951565b600660009054906101000a90046001600160a01b03169050826001600160a01b0316632191f92a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cd757600080fd5b505afa158015612ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0f9190615795565b612d5b5760405162461bcd60e51b815260206004820152601c60248201527f6d61726b6572206d6574686f642072657475726e65642066616c7365000000006044820152606401610be7565b600680546001600160a01b0319166001600160a01b0385811691821790925560408051928416835260208301919091527fedffc32e068c7c95dfd4bdfd5c4d939a084d6b11c4199eac8436ed234d72f92691016111c7565b60008054819060ff16612dd85760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155612dea611772565b90508015612e07576121ed81601081111561231157612311615c43565b612204338561395c565b600080838311612e30576000612e278486615b47565b9150915061284e565b5060039050600061284e565b6000612e546040518060200160405280600081525090565b600080612e65866000015186612fba565b90925090506000826003811115612e7e57612e7e615c43565b14612e9d5750604080516020810190915260008152909250905061284e565b60408051602081019091529081526000969095509350505050565b60007f45b96fe442630264581b197e84bbada861235052c5a1aadfff9ea4e40a969aa0846010811115612eed57612eed615c43565b846052811115612eff57612eff615c43565b604080519283526020830191909152810184905260600160405180910390a183601081111561106257611062615c43565b60008080612f3e8486615afc565b9050848110612f525760009250905061284e565b60026000925092505061284e565b600080600080612f708787612e3c565b90925090506000826003811115612f8957612f89615c43565b14612f9a5750915060009050612b90565b612fac612fa682613cb3565b86612f30565b935093505050935093915050565b60008083612fcd5750600090508061284e565b6000612fd98486615b28565b905083612fe68683615b14565b14612ff95760026000925092505061284e565b60009250905061284e565b6000805460ff166130275760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19169055600160ff831610801590613049575060038260ff1611155b6130885760405162461bcd60e51b815260206004820152601060248201526f1b195d995c9859d9481a5b9d985b1a5960821b6044820152606401610be7565b6000613092611772565b905080156130be576130b68160108111156130af576130af615c43565b6008612951565b915050611ce9565b6130c933858561474f565b9150506000805460ff1916600117905592915050565b600e546000906060906001600160a01b03166131325760405162461bcd60e51b81526020600482015260126024820152711bdc99195c941c9bde1e481b9bdd081cd95d60721b6044820152606401610be7565b60408051336020820152600091016040516020818303038152906040529050600061315e868387614b50565b600e546040519192506001600160a01b031690349061317e9084906159fc565b60006040518083038185875af1925050503d80600081146131bb576040519150601f19603f3d011682016040523d82523d6000602084013e6131c0565b606091505b509350935050509250929050565b606060448251101561320057505060408051808201909152600a8152696e6f2064657461696c7360b01b602082015290565b60048201915081806020019051810190610cba9190615859565b60055460405163d02f735160e01b81523060048201526001600160a01b0386811660248301528581166044830152848116606483015260848201849052600092839291169063d02f73519060a401602060405180830381600087803b15801561328257600080fd5b505af1158015613296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ba91906158e9565b905080156132cf576126206003601b83612eb8565b846001600160a01b0316846001600160a01b031614156132f5576126206006601c612951565b6001600160a01b0384166000908152600f6020526040812054613319908590615b47565b6001600160a01b0387166000908152600f602052604081205491925090613341908690615afc565b6001600160a01b038088166000818152600f6020526040808220879055928b168082529083902084905591519293509091600080516020615c9e8339815191529061338f9089815260200190565b60405180910390a3600098975050505050505050565b6000805460ff166133c85760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff191681556133da611772565b905080156133f7576112318160108111156130af576130af615c43565b6112423384600061474f565b6000805460ff166134265760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155613438611772565b9050801561345557611231816010811115612bea57612bea615c43565b611242338460006141ea565b60008054819060ff166134865760405162461bcd60e51b8152600401610be790615a7f565b6000805460ff19168155613498611772565b905080156134c8576134bc8160108111156134b5576134b5615c43565b600f612951565b60009250925050613571565b836001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561350357600080fd5b505af1158015613517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353b91906158e9565b9050801561355f576134bc81601081111561355857613558615c43565b6010612951565b61356b33878787614bdc565b92509250505b6000805460ff191660011790559094909350915050565b60035460009061010090046001600160a01b031633146135ae57610cba60016047612951565b43600954146135c357610cba600a6048612951565b670de0b6b3a76400008211156135df57610cba60026049612951565b600880549083905560408051828152602081018590527faaa68312e2ea9d50e16af5068410ab56e1a1fd06037b1a35664812c30f82146091016111c7565b600554604051631200453160e11b81523060048201526001600160a01b03858116602483015284811660448301526064820184905260009283928392909116906324008a6290608401602060405180830381600087803b15801561368057600080fd5b505af1158015613694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b891906158e9565b905080156136cd57612b726003603883612eb8565b43600954146136e257612b72600a6039612951565b6136ea6154d8565b6001600160a01b038616600090815260116020526040902060010154606082015261371486612bfd565b608083018190526020830182600381111561373157613731615c43565b600381111561374257613742615c43565b905250600090508160200151600381111561375f5761375f615c43565b1461378e57613781600960378360200151600381111561195657611956615c43565b6000935093505050612b90565b6000198514156137a757608081015160408201526137af565b604081018590525b6137bd8782604001516150be565b60e0820181905260808201516137d39190615b47565b60a082015260e0810151600b546137ea9190615b47565b60c0820190815260a080830180516001600160a01b038a8116600081815260116020908152604091829020948555600a546001909501949094559551600b81905560e088015194518751938f1684529383019190915294810192909252606082015260808101929092527f1a2a22cb034d26d1854bdc6666a5b91fe25efbbb5dcad3b0355478d6f5c362a1910160405180910390a160e00151600097909650945050505050565b60006138a96040518060200160405280600081525090565b6000806138be86670de0b6b3a7640000612fba565b909250905060008260038111156138d7576138d7615c43565b146138f65750604080516020810190915260008152909250905061284e565b6000806139038388615302565b9092509050600082600381111561391c5761391c615c43565b1461393f578160405180602001604052806000815250955095505050505061284e565b604080516020810190915290815260009890975095505050505050565b600554604051634ef4c3e160e01b8152600091829182916001600160a01b031690634ef4c3e19061399590309089908990600401615a18565b602060405180830381600087803b1580156139af57600080fd5b505af11580156139c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e791906158e9565b90508015613a08576139fc6003601f83612eb8565b6000925092505061284e565b4360095414613a1d576139fc600a6022612951565b613a5e6040805160e0810190915280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b613a6661221e565b6040830181905260208301826003811115613a8357613a83615c43565b6003811115613a9457613a94615c43565b9052506000905081602001516003811115613ab157613ab1615c43565b14613ae057613ad3600960218360200151600381111561195657611956615c43565b600093509350505061284e565b33613aeb81876150be565b60c0830181905260408051602081018252908401518152613b0c919061532d565b6060840181905260208401826003811115613b2957613b29615c43565b6003811115613b3a57613b3a615c43565b9052506000905082602001516003811115613b5757613b57615c43565b14613ba45760405162461bcd60e51b815260206004820181905260248201527f4d494e545f45584348414e47455f43414c43554c4154494f4e5f4641494c45446044820152606401610be7565b8160600151600d54613bb69190615afc565b608083015260608201516001600160a01b0388166000908152600f6020526040902054613be39190615afc565b60a08301819052608080840151600d556001600160a01b038981166000818152600f60209081526040918290209590955560c08701516060808901518351958916865296850193909352908301528101929092527f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee910160405180910390a1866001600160a01b0316306001600160a01b0316600080516020615c9e8339815191528460600151604051613c9991815260200190565b60405180910390a35060c001516000969095509350505050565b8051600090610cba90670de0b6b3a764000090615b14565b60008080804360095414613cef57613ce5600a604f612951565b9590945092505050565b613cf933866150be565b905080600c54613d099190615afc565b9150600c54821015613d555760405162461bcd60e51b8152602060048201526015602482015274616464207265736572766573206f766572666c6f7760581b6044820152606401610be7565b600c82905560408051338152602081018390529081018390527fa91e67c5ea634cd43a12c5a482724b03de01e85ca68702a53d0c2f45cb7c1dc59060600160405180910390a16000613ce5565b60145460405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905290911690819063a9059cbb90604401600060405180830381600087803b158015613df257600080fd5b505af1158015613e06573d6000803e3d6000fd5b5050505060003d60008114613e225760208114613e2c57600080fd5b6000199150613e38565b60206000803e60005191505b5080613e865760405162461bcd60e51b815260206004820152601960248201527f544f4b454e5f5452414e534645525f4f55545f4641494c4544000000000000006044820152606401610be7565b50505050565b6000804360095414613eaf57613ea4600a6039612951565b6000915091506112ef565b613eb76154d8565b6001600160a01b0386166000908152601160205260409020600101546060820152613ee186612bfd565b6080830181905260208301826003811115613efe57613efe615c43565b6003811115613f0f57613f0f615c43565b9052506000905081602001516003811115613f2c57613f2c615c43565b14613f5a57613f4e600960528360200151600381111561195657611956615c43565b600092509250506112ef565b613f6487856150be565b60e08201819052600090613f789087615b47565b6001600160a01b03881660009081526012602052604081205491925090613fa0908890615b47565b6001600160a01b03891660009081526012602052604090205490915015614090576001600160a01b03881660009081526011602090815260408083206012909252822054600a546001830154929392613ffa92919061533d565b8660200181935082600381111561401357614013615c43565b600381111561402457614024615c43565b905250600090508560200151600381111561404157614041615c43565b1461407357614063600960528760200151600381111561195657611956615c43565b60009650965050505050506112ef565b8085608001516140839190615afc565b60a08601525061409b9050565b608083015160a08401525b818360a001516140ab9190615afc565b60a084015260e0830151600b546140c29190615b47565b60c08401526001600160a01b0388166000908152601260205260409020819055811561414a576001600160a01b0388166000818152601160209081526040918290205460a08701518351948552918401869052838301526060830152517fca6a04e1c3e238bc2a1b301e665c0177601c7a7febed4b4fc9151dad656816ba9181900360800190a15b60a0838101516001600160a01b038a8116600081815260116020908152604091829020948555600a5460019095019490945560c0880151600b5560e08801518151938f1684529383019190915281019190915260608101899052608081018390527f2a9c212ff2c87629e08944d61beea2f32d055a69369363b2d6050d841c67e10a910160405180910390a1505060e00151600097909650945050505050565b60008215806141f7575081155b6142605760405162461bcd60e51b815260206004820152603460248201527f6f6e65206f662072656465656d546f6b656e73496e206f722072656465656d416044820152736d6f756e74496e206d757374206265207a65726f60601b6064820152608401610be7565b6142a16040805160e0810190915280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6142a961221e565b60408301819052602083018260038111156142c6576142c6615c43565b60038111156142d7576142d7615c43565b90525060009050816020015160038111156142f4576142f4615c43565b1461431e576143166009602b8360200151600381111561195657611956615c43565b915050610f4d565b83156143b75760608101849052604080516020810182529082015181526143459085612802565b608083018190526020830182600381111561436257614362615c43565b600381111561437357614373615c43565b905250600090508160200151600381111561439057614390615c43565b146143b257614316600960298360200151600381111561195657611956615c43565b614448565b6143d3836040518060200160405280846040015181525061532d565b60608301819052602083018260038111156143f0576143f0615c43565b600381111561440157614401615c43565b905250600090508160200151600381111561441e5761441e615c43565b14614440576143166009602a8360200151600381111561195657611956615c43565b608081018390525b600554606082015160405163eabe7d9160e01b81526000926001600160a01b03169163eabe7d91916144819130918b9190600401615a18565b602060405180830381600087803b15801561449b57600080fd5b505af11580156144af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d391906158e9565b905080156144f1576144e86003602883612eb8565b92505050610f4d565b4360095414614506576144e8600a602c612951565b8160600151600d546145189190615b47565b60a083015260608201516001600160a01b0387166000908152600f60205260409020546145459190615b47565b60c08301526080820151614557612855565b1015614569576144e8600e602f612951565b60a0820151600d5560c08201516001600160a01b0387166000908152600f6020526040902055608082015161459f908790613da2565b306001600160a01b0316866001600160a01b0316600080516020615c9e83398151915284606001516040516145d691815260200190565b60405180910390a36080820151606080840151604080516001600160a01b038b16815260208101949094528301527fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929910160405180910390a1600554608083015160608401516040516351dff98960e01b81523060048201526001600160a01b038a81166024830152604482019390935260648101919091529116906351dff98990608401600060405180830381600087803b15801561469557600080fd5b505af11580156146a9573d6000803e3d6000fd5b50600092506146b6915050565b9695505050505050565b60008060008060006146d28888612fba565b909350915060008360038111156146eb576146eb615c43565b146146ff5782600094509450505050612b90565b6147138261470e886004615afc565b615302565b9093509050600083600381111561472c5761472c615c43565b146147405782600094509450505050612b90565b60009890975095505050505050565b6000333b156147955760405162461bcd60e51b8152602060048201526012602482015271636f6e74726163742063616c6c2064656e7960701b6044820152606401610be7565b60055460405163368f515360e21b81526000916001600160a01b03169063da3d454c906147ca90309089908990600401615a18565b602060405180830381600087803b1580156147e457600080fd5b505af11580156147f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481c91906158e9565b90508015614831576143166003600e83612eb8565b436009541461484557614316600a80612951565b8361484e612855565b101561486057614316600e6009612951565b61488c604080516080810190915280600081526020016000815260200160008152602001600081525090565b60008061489888612bfd565b60208501819052848260038111156148b2576148b2615c43565b60038111156148c3576148c3615c43565b90525060009050835160038111156148dd576148dd615c43565b1461490a576148ff600960078560000151600381111561195657611956615c43565b945050505050610f4d565b6001600160a01b038816600090815260126020526040902054156149e0576001600160a01b0388166000908152601160209081526040808320601290925290912054600a54600183015461495f92919061533d565b9350838582600381111561497557614975615c43565b600381111561498657614986615c43565b90525060009050845160038111156149a0576149a0615c43565b146149ce576149c2600960078660000151600381111561195657611956615c43565b95505050505050610f4d565b6149d88389615afc565b9150506149e3565b50855b8083602001516149f39190615afc565b6040840152600b54614a06908890615afc565b60608401526040808401516001600160a01b038a166000908152601160205291909120908155600a5460019091015560ff8616614a54576060830151600b55614a4f8888613da2565b614aea565b60018660ff161115614ad857600080614a6e600189615b5e565b614a7b9060ff168a615b28565b6001600160a01b038b16600090815260126020526040902054909250614aa2908390615afc565b6001600160a01b038b1660009081526012602052604090208190556060860151909150614ad0908390615afc565b606086015250505b6060830151600b55614aea8787615397565b60408084015160608086015183516001600160a01b038d168152602081018c9052938401929092528201527f13ed6866d4e1ee6da46f845c46d7e54120883d75c5ea9a2dacc1c4ca8984ab809060800160405180910390a1600098975050505050505050565b6060806040519050835180825260208201868152600481019050818101602087015b81831015614b8a578051835260209283019201614b72565b50855184518101600401855292509050808201602086015b81831015614bba578051835260209283019201614ba2565b50955160049201919091011594909401601f01601f1916604052949350505050565b600554604051632fe3f38f60e11b81523060048201526001600160a01b03838116602483015286811660448301528581166064830152608482018590526000928392839290911690635fc7e71e9060a401602060405180830381600087803b158015614c4757600080fd5b505af1158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f91906158e9565b90508015614c9457613f4e6003601283612eb8565b4360095414614ca957613f4e600a6016612951565b43846001600160a01b0316636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015614ce357600080fd5b505afa158015614cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d1b91906158e9565b14614d2c57613f4e600a6011612951565b866001600160a01b0316866001600160a01b03161415614d5257613f4e60066017612951565b84614d6357613f4e60076015612951565b600019851415614d7957613f4e60076014612951565b600080614d8789898961361d565b90925090508115614dbc57614dae826010811115614da757614da7615c43565b6018612951565b6000945094505050506112ef565b60055460405163c488847b60e01b815260009182916001600160a01b039091169063c488847b90614df59030908c908890600401615a18565b604080518083038186803b158015614e0c57600080fd5b505afa158015614e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e449190615902565b90925090508115614e975760405162461bcd60e51b815260206004820152601d60248201527f43414c43554c4154455f414d4f554e545f5345495a455f4641494c45440000006044820152606401610be7565b6040516370a0823160e01b81526001600160a01b038b811660048301528291908a16906370a082319060240160206040518083038186803b158015614edb57600080fd5b505afa158015614eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f1391906158e9565b1015614f615760405162461bcd60e51b815260206004820152601860248201527f4c49515549444154455f5345495a455f544f4f5f4d55434800000000000000006044820152606401610be7565b60006001600160a01b038916301415614f8757614f80308d8d8561321a565b905061500c565b60405163b2a02ff160e01b81526001600160a01b038a169063b2a02ff190614fb7908f908f908790600401615a18565b602060405180830381600087803b158015614fd157600080fd5b505af1158015614fe5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061500991906158e9565b90505b80156150515760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b881cd95a5e9d5c994819985a5b195960621b6044820152606401610be7565b604080516001600160a01b038e811682528d811660208301528183018790528b1660608201526080810184905290517f298637f684da70674f26509b10f07ec2fbc77a335ab1e7d6215a4b2484d8bb529181900360a00190a160009c939b50929950505050505050505050565b6014546040516370a0823160e01b81523060048201526000916001600160a01b031690829082906370a082319060240160206040518083038186803b15801561510657600080fd5b505afa15801561511a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061513e91906158e9565b6040516323b872dd60e01b81529091506001600160a01b038316906323b872dd9061517190889030908990600401615a18565b600060405180830381600087803b15801561518b57600080fd5b505af115801561519f573d6000803e3d6000fd5b5050505060003d600081146151bb57602081146151c557600080fd5b60001991506151d1565b60206000803e60005191505b508061521f5760405162461bcd60e51b815260206004820152601860248201527f544f4b454e5f5452414e534645525f494e5f4641494c454400000000000000006044820152606401610be7565b6014546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561526357600080fd5b505afa158015615277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061529b91906158e9565b9050828110156152ed5760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e5f5452414e534645525f494e5f4f564552464c4f570000000000006044820152606401610be7565b6152f78382615b47565b979650505050505050565b60008082615316575060019050600061284e565b60006153228486615b14565b915091509250929050565b60008060008061281286866153e1565b60008060008060006153508888886146c0565b9093509150600083600381111561536957615369615c43565b1461537d5782600094509450505050612b90565b6153878883615b47565b6000999098509650505050505050565b600e54601454604051630fec7ec360e31b81523360048201526001600160a01b0391821660248201526044810185905260ff84166064820152911690637f63f61890608401610e93565b60006153f96040518060200160405280600081525090565b60008061540e670de0b6b3a764000087612fba565b9092509050600082600381111561542757615427615c43565b146154465750604080516020810190915260008152909250905061284e565b612847818660000151613891565b82805461546090615bad565b90600052602060002090601f01602090048101928261548257600085556154c8565b82601f1061549b57805160ff19168380011785556154c8565b828001600101855582156154c8579182015b828111156154c85782518255916020019190600101906154ad565b506154d492915061551e565b5090565b6040805161010081019091528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156154d4576000815560010161551f565b600082601f83011261554457600080fd5b813561555761555282615ad4565b615aa3565b81815284602083860101111561556c57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff8116811461559a57600080fd5b919050565b6000602082840312156155b157600080fd5b8135610f4d81615c85565b600080604083850312156155cf57600080fd5b82356155da81615c85565b915060208301356155ea81615c85565b809150509250929050565b60008060006060848603121561560a57600080fd5b833561561581615c85565b9250602084013561562581615c85565b929592945050506040919091013590565b600080600080600080600060e0888a03121561565157600080fd5b873561565c81615c85565b9650602088013561566c81615c85565b9550604088013561567c81615c85565b945060608801359350608088013567ffffffffffffffff808211156156a057600080fd5b6156ac8b838c01615533565b945060a08a01359150808211156156c257600080fd5b506156cf8a828b01615533565b9250506156de60c08901615589565b905092959891949750929550565b600080604083850312156156ff57600080fd5b823561570a81615c85565b946020939093013593505050565b60008060006060848603121561572d57600080fd5b833561573881615c85565b925060208401359150604084013561574f81615c85565b809150509250925092565b6000806000806080858703121561577057600080fd5b843561577b81615c85565b966020860135965060408601359560600135945092505050565b6000602082840312156157a757600080fd5b81518015158114610f4d57600080fd5b60008060008060008060c087890312156157d057600080fd5b86356157db81615c85565b955060208701356157eb81615c85565b945060408701359350606087013567ffffffffffffffff8082111561580f57600080fd5b61581b8a838b01615533565b9450608089013591508082111561583157600080fd5b5061583e89828a01615533565b92505061584d60a08801615589565b90509295509295509295565b60006020828403121561586b57600080fd5b815167ffffffffffffffff81111561588257600080fd5b8201601f8101841361589357600080fd5b80516158a161555282615ad4565b8181528560208385010111156158b657600080fd5b6158c7826020830160208601615b81565b95945050505050565b6000602082840312156158e257600080fd5b5035919050565b6000602082840312156158fb57600080fd5b5051919050565b6000806040838503121561591557600080fd5b505080516020909101519092909150565b60008060008060006080868803121561593e57600080fd5b8535945061594e60208701615589565b935060408601356001600160e01b03198116811461596b57600080fd5b9250606086013567ffffffffffffffff8082111561598857600080fd5b818801915088601f83011261599c57600080fd5b8135818111156159ab57600080fd5b8960208285010111156159bd57600080fd5b9699959850939650602001949392505050565b600081518084526159e8816020860160208601615b81565b601f01601f19169290920160200192915050565b60008251615a0e818460208701615b81565b9190910192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602081526000610f4d60208301846159d0565b6020808252601690820152751858d8dc9d59481a5b9d195c995cdd0819985a5b195960521b604082015260600190565b6020808252600a90820152691c994b595b9d195c995960b21b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715615acc57615acc615c6f565b604052919050565b600067ffffffffffffffff821115615aee57615aee615c6f565b50601f01601f191660200190565b60008219821115615b0f57615b0f615c17565b500190565b600082615b2357615b23615c2d565b500490565b6000816000190483118215151615615b4257615b42615c17565b500290565b600082821015615b5957615b59615c17565b500390565b600060ff821660ff841680821015615b7857615b78615c17565b90039392505050565b60005b83811015615b9c578181015183820152602001615b84565b83811115613e865750506000910152565b600181811c90821680615bc157607f821691505b60208210811415615be257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615bfc57615bfc615c17565b5060010190565b600082615c1257615c12615c2d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114615c9a57600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122026f64977c23d1b0b96e743d7a02d46ad92540ee82b8a5104f6adc2cb21bb04eb64736f6c6343000806003300000000000000000000000050b7545627a5162f82a992c33b87adc75187b21800000000000000000000000043aad7d8bc661dfa70120865239529ed92faa0540000000000000000000000007155b9944e3bfac1c7a0f31ae797b906d6bf6e6f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000800000000000000000000000082fccafc520a051d2b22d376858487a58ab9f862000000000000000000000000000000000000000000000000000000000000000b577261707065642042544300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087665574254432e65000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

90284:769:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27085:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37915:246;;;;;;;;;;-1:-1:-1;37915:246:0;;;;;:::i;:::-;;:::i;:::-;;;16620:14:1;;16613:22;16595:41;;16583:2;16568:18;37915:246:0;16550:92:1;84128:158:0;;;;;;;;;;-1:-1:-1;84128:158:0;;;;;:::i;:::-;;:::i;:::-;;;30485:25:1;;;30473:2;30458:18;84128:158:0;30440:76:1;27575:33:0;;;;;;;;;;;;;;;;40300:233;;;;;;;;;;-1:-1:-1;40300:233:0;;;;;:::i;:::-;;:::i;27785:23::-;;;;;;;;;;;;;;;;42677:250;;;;;;;;;;;;;:::i;82840:682::-;;;;;;;;;;-1:-1:-1;82840:682:0;;;;;:::i;:::-;;:::i;:::-;;84772:272;;;;;;;;;;-1:-1:-1;84772:272:0;;;;;:::i;:::-;;:::i;89203:288::-;;;;;;;;;;-1:-1:-1;89203:288:0;;;;;:::i;:::-;;:::i;37697:204::-;;;;;;;;;;-1:-1:-1;37697:204:0;;;;;:::i;:::-;;:::i;84300:198::-;;;;;;;;;;-1:-1:-1;84300:198:0;;;;;:::i;:::-;;:::i;27366:27::-;;;;;;;;;;-1:-1:-1;27366:27:0;;;;-1:-1:-1;;;;;27366:27:0;;;;;;-1:-1:-1;;;;;9460:32:1;;;9442:51;;9430:2;9415:18;27366:27:0;9397:102:1;76426:91:0;;;;;;;;;;-1:-1:-1;76499:10:0;;-1:-1:-1;;;;;76499:10:0;76426:91;;27153:21;;;;;;;;;;-1:-1:-1;27153:21:0;;;;;;;;;;;31998:4:1;31986:17;;;31968:36;;31956:2;31941:18;27153:21:0;31923:87:1;38476:363:0;;;;;;;;;;-1:-1:-1;38476:363:0;;;;;:::i;:::-;;:::i;43753:97::-;;;;;;;;;;;;;:::i;28180:47::-;;;;;;;;;;-1:-1:-1;28180:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;85058:128;;;;;;;;;;-1:-1:-1;85058:128:0;;;;;:::i;:::-;;:::i;67129:744::-;;;;;;;;;;-1:-1:-1;67129:744:0;;;;;:::i;:::-;;:::i;27706:24::-;;;;;;;;;;;;;;;;27817:25;;;;;;;;;;-1:-1:-1;27817:25:0;;;;-1:-1:-1;;;;;27817:25:0;;;27408:39;;;;;;;;;;-1:-1:-1;27408:39:0;;;;-1:-1:-1;;;;;27408:39:0;;;71193:580;;;;;;;;;;-1:-1:-1;71193:580:0;;;;;:::i;:::-;;:::i;88639:550::-;;;;;;;;;;-1:-1:-1;88639:550:0;;;;;:::i;:::-;;:::i;:::-;;;;30695:25:1;;;30751:2;30736:18;;30729:34;;;;30668:18;88639:550:0;30650:119:1;27623:30:0;;;;;;;;;;;;;;;;32255:25;;;;;;;;;;-1:-1:-1;32255:25:0;;;;-1:-1:-1;;;;;32255:25:0;;;38341:121;;;;;;;;;;-1:-1:-1;38341:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;38434:20:0;38407:7;38434:20;;;:13;:20;;;;;;;38341:121;40085:201;;;;;;;;;;;;;:::i;83836:142::-;;;;;;;;;;-1:-1:-1;83836:142:0;;;;;:::i;:::-;;:::i;76059:353::-;;;;;;;;;;-1:-1:-1;76059:353:0;;;;;:::i;:::-;;:::i;27745:25::-;;;;;;;;;;;;;;;;27118:20;;;;;;;;;;;;;:::i;40547:275::-;;;;;;;;;;-1:-1:-1;40547:275:0;;;;;:::i;:::-;;:::i;34476:1529::-;;;;;;;;;;-1:-1:-1;34476:1529:0;;;;;:::i;:::-;;:::i;83544:142::-;;;;;;;;;;-1:-1:-1;83544:142:0;;;;;:::i;:::-;;:::i;43864:3047::-;;;;;;;;;;;;;:::i;87898:733::-;;;;;;:::i;:::-;;:::i;37489:194::-;;;;;;;;;;-1:-1:-1;37489:194:0;;;;;:::i;:::-;;:::i;27668:23::-;;;;;;;;;;;;;;;;39878:193;;;;;;;;;;;;;:::i;64322:203::-;;;;;;;;;;-1:-1:-1;64322:203:0;;;;;:::i;:::-;;:::i;65685:656::-;;;;;;;;;;-1:-1:-1;65685:656:0;;;;;:::i;:::-;;:::i;42456:207::-;;;;;;;;;;;;;:::i;38853:712::-;;;;;;;;;;-1:-1:-1;38853:712:0;;;;;:::i;:::-;;:::i;:::-;;;;31661:25:1;;;31717:2;31702:18;;31695:34;;;;31745:18;;;31738:34;31803:2;31788:18;;31781:34;31648:3;31633:19;38853:712:0;31615:206:1;83992:122:0;;;;;;;;;;-1:-1:-1;83992:122:0;;;;;:::i;:::-;;:::i;34438:25::-;;;;;;;;;;-1:-1:-1;34438:25:0;;;;-1:-1:-1;;;;;34438:25:0;;;83700:122;;;;;;;;;;-1:-1:-1;83700:122:0;;;;;:::i;:::-;;:::i;38175:152::-;;;;;;;;;;-1:-1:-1;38175:152:0;;;;;:::i;:::-;-1:-1:-1;;;;;38285:25:0;;;38258:7;38285:25;;;:18;:25;;;;;;;;:34;;;;;;;;;;;;;38175:152;66355:760;;;;;;;;;;;;;:::i;73546:642::-;;;;;;;;;;-1:-1:-1;73546:642:0;;;;;:::i;:::-;;:::i;27462:42::-;;;;;;;;;;-1:-1:-1;27462:42:0;;;;-1:-1:-1;;;;;27462:42:0;;;84512:246;;;;;;;;;;-1:-1:-1;84512:246:0;;;;;:::i;:::-;;:::i;27331:20::-;;;;;;;;;;-1:-1:-1;27331:20:0;;;;;;;-1:-1:-1;;;;;27331:20:0;;;39694:170;;;;;;;;;;;;;:::i;67887:616::-;;;;;;;;;;-1:-1:-1;67887:616:0;;;;;:::i;:::-;;:::i;28299:36::-;;;;;;;;;;;;28331:4;28299:36;;27085:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37915:246::-;38023:10;37992:4;38044:23;;;:18;:23;;;;;;;;-1:-1:-1;;;;;38044:32:0;;;;;;;;;;:41;;;38101:30;37992:4;;38023:10;;;38101:30;;;;38079:6;30485:25:1;;30473:2;30458:18;;30440:76;38101:30:0;;;;;;;;-1:-1:-1;38149:4:0;;37915:246;-1:-1:-1;;;37915:246:0:o;84128:158::-;84194:4;84212:8;84225:32;84245:11;84225:19;:32::i;:::-;-1:-1:-1;84211:46:0;84128:158;-1:-1:-1;;;84128:158:0:o;40300:233::-;40387:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;;;;;;;;;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;40412:16:::1;:14;:16::i;:::-;:40;40404:75;;;;-1:-1:-1::0;;;40404:75:0::1;;;;;;;:::i;:::-;40497:28;40517:7;40497:19;:28::i;:::-;40490:35;;75971:1;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;40300:233;;-1:-1:-1;40300:233:0:o;42677:250::-;42737:4;42755:13;42770:11;42785:28;:26;:28::i;:::-;42754:59;;-1:-1:-1;42754:59:0;-1:-1:-1;42839:18:0;42832:3;:25;;;;;;;;:::i;:::-;;42824:71;;;;-1:-1:-1;;;42824:71:0;;28658:2:1;42824:71:0;;;28640:21:1;28697:2;28677:18;;;28670:30;28736:34;28716:18;;;28709:62;-1:-1:-1;;;28787:18:1;;;28780:31;28828:19;;42824:71:0;28630:223:1;42824:71:0;42913:6;42677:250;-1:-1:-1;;42677:250:0:o;82840:682::-;83274:107;83291:12;83305:18;83325:28;83355:5;83362:7;83371:9;83274:16;:107::i;:::-;83439:10;:24;;-1:-1:-1;;;;;;83439:24:0;-1:-1:-1;;;;;83439:24:0;;;;;;;;83474:40;;;-1:-1:-1;;;83474:40:0;;;;:38;;:40;;;;;;;;;;;;;;;83439:24;83474:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;82840:682;;;;;;;:::o;84772:272::-;84877:10;;-1:-1:-1;;;;;84859:28:0;;;84877:10;;84859:28;;84851:91;;;;-1:-1:-1;;;84851:91:0;;21459:2:1;84851:91:0;;;21441:21:1;21498:2;21478:18;;;21471:30;21537:34;21517:18;;;21510:62;-1:-1:-1;;;21588:18:1;;;21581:48;21646:19;;84851:91:0;21431:240:1;84851:91:0;84968:30;;-1:-1:-1;;;84968:30:0;;84992:4;84968:30;;;9442:51:1;84950:15:0;;-1:-1:-1;;;;;84968:15:0;;;;;9415:18:1;;84968:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85021:5;;85006:30;;-1:-1:-1;;;85006:30:0;;-1:-1:-1;;;;;85021:5:0;;;;;;85006:30;;;9686:51:1;9753:18;;;9746:34;;;;;-1:-1:-1;85006:14:0;;;;;9659:18:1;;85006:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84843:201;84772:272;:::o;89203:288::-;89285:4;89310:15;89302:44;;;;-1:-1:-1;;;89302:44:0;;22236:2:1;89302:44:0;;;22218:21:1;22275:2;22255:18;;;22248:30;-1:-1:-1;;;22294:18:1;;;22287:46;22350:18;;89302:44:0;22208:166:1;89302:44:0;89358:8;89371:40;89390:8;89400:10;89371:18;:40::i;:::-;89357:54;;;89422:40;89437:3;89422:40;;;;;;;;;;;;;-1:-1:-1;;;89422:40:0;;;:14;:40::i;:::-;89480:3;89203:288;-1:-1:-1;;;89203:288:0:o;37697:204::-;37801:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;37825:44:::1;37840:10;37852:3;37857;37862:6;37825:14;:44::i;:::-;:68;37818:75;;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;37697:204;;-1:-1:-1;;;37697:204:0:o;84300:198::-;84390:4;84408:8;84421:48;84447:8;84457:11;84421:25;:48::i;:::-;-1:-1:-1;84407:62:0;84300:198;-1:-1:-1;;;;84300:198:0:o;38476:363::-;38547:4;38564:23;38590:38;;;;;;;;38605:21;:19;:21::i;:::-;38590:38;;-1:-1:-1;;;;;38704:20:0;;38640:14;38704:20;;;:13;:20;;;;;;38564:64;;-1:-1:-1;38640:14:0;;;38672:53;;38564:64;;38672:17;:53::i;:::-;38639:86;;-1:-1:-1;38639:86:0;-1:-1:-1;38752:18:0;38744:4;:26;;;;;;;;:::i;:::-;;38736:70;;;;-1:-1:-1;;;38736:70:0;;20348:2:1;38736:70:0;;;20330:21:1;20387:2;20367:18;;;20360:30;20426:33;20406:18;;;20399:61;20477:18;;38736:70:0;20320:181:1;38736:70:0;38824:7;38476:363;-1:-1:-1;;;;38476:363:0:o;43753:97::-;43804:4;43828:14;:12;:14::i;:::-;43821:21;;43753:97;:::o;85058:128::-;85123:4;85147:31;85168:9;85147:20;:31::i;67129:744::-;67285:5;;67216:4;;67285:5;;;-1:-1:-1;;;;;67285:5:0;67271:10;:19;67267:124;;67314:65;67319:18;67339:39;67314:4;:65::i;67267:124::-;67441:11;;67538:30;;;-1:-1:-1;;;67538:30:0;;;;-1:-1:-1;;;;;67441:11:0;;;;67538:28;;;;;:30;;;;;;;;;;;;;;:28;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67530:71;;;;-1:-1:-1;;;67530:71:0;;25863:2:1;67530:71:0;;;25845:21:1;25902:2;25882:18;;;25875:30;25941;25921:18;;;25914:58;25989:18;;67530:71:0;25835:178:1;67530:71:0;67669:11;:28;;-1:-1:-1;;;;;;67669:28:0;-1:-1:-1;;;;;67669:28:0;;;;;;;;;67779:46;;;10809:15:1;;;10791:34;;10856:2;10841:18;;10834:43;;;;67779:46:0;;10726:18:1;67779:46:0;;;;;;;;67850:14;67838:27;67129:744;-1:-1:-1;;;67129:744:0:o;71193:580::-;71277:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;71307:16:::1;:14;:16::i;:::-;71294:29:::0;-1:-1:-1;71338:29:0;;71334:277:::1;;71529:70;71540:5;71534:12;;;;;;;;:::i;:::-;71548:50;71529:4;:70::i;:::-;71522:77;;;;;71334:277;71731:34;71752:12;71731:20;:34::i;:::-;71724:41;;;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;71193:580;;-1:-1:-1;71193:580:0:o;88639:550::-;88777:8;;88815:22;;88811:198;;88866:73;88888:8;88898:20;88920:18;88866:21;:73::i;:::-;88954:43;;;;;;;;;;;;-1:-1:-1;;;88954:43:0;;;;88850:89;;-1:-1:-1;88850:89:0;-1:-1:-1;88954:43:0;;88850:89;;88954:14;:43::i;:::-;89022:15;;89019:163;;89066:48;89092:8;89102:11;89066:25;:48::i;:::-;89129:41;;;;;;;;;;;;-1:-1:-1;;;89129:41:0;;;;89050:64;;-1:-1:-1;89050:64:0;-1:-1:-1;89129:41:0;;89050:64;;89129:14;:41::i;:::-;88639:550;;;;;;;:::o;40085:201::-;40156:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;40181:16:::1;:14;:16::i;:::-;:40;40173:75;;;;-1:-1:-1::0;;;40173:75:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;40266:12:0::1;::::0;75983:11;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;40085:201;:::o;83836:142::-;83908:4;83932:38;83957:12;83932:24;:38::i;76059:353::-;76147:5;;;;;-1:-1:-1;;;;;76147:5:0;76133:10;:19;76125:61;;;;-1:-1:-1;;;76125:61:0;;21878:2:1;76125:61:0;;;21860:21:1;21917:2;21897:18;;;21890:30;21956:31;21936:18;;;21929:59;22005:18;;76125:61:0;21850:179:1;76125:61:0;-1:-1:-1;;;;;76205:27:0;;76197:66;;;;-1:-1:-1;;;76197:66:0;;24410:2:1;76197:66:0;;;24392:21:1;24449:2;24429:18;;;24422:30;24488:28;24468:18;;;24461:56;24534:18;;76197:66:0;24382:176:1;76197:66:0;76298:10;;;-1:-1:-1;;;;;76319:26:0;;;-1:-1:-1;;;;;;76319:26:0;;;;;;;76361:43;;;76298:10;;;;10791:34:1;;;10856:2;10841:18;;10834:43;;;;76361::0;;10726:18:1;76361:43:0;;;;;;;76114:298;76059:353;:::o;27118:20::-;;;;;;;:::i;40547:275::-;40623:4;40641:13;40656:11;40671:36;40699:7;40671:27;:36::i;:::-;40640:67;;-1:-1:-1;40640:67:0;-1:-1:-1;40733:18:0;40726:3;:25;;;;;;;;:::i;:::-;;40718:72;;;;-1:-1:-1;;;40718:72:0;;18836:2:1;40718:72:0;;;18818:21:1;18875:2;18855:18;;;18848:30;18914:34;18894:18;;;18887:62;-1:-1:-1;;;18965:18:1;;;18958:32;19007:19;;40718:72:0;18808:224:1;34476:1529:0;34830:5;;;;;-1:-1:-1;;;;;34830:5:0;34816:10;:19;34808:68;;;;-1:-1:-1;;;34808:68:0;;19590:2:1;34808:68:0;;;19572:21:1;19629:2;19609:18;;;19602:30;19668:34;19648:18;;;19641:62;-1:-1:-1;;;19719:18:1;;;19712:34;19763:19;;34808:68:0;19562:226:1;34808:68:0;34895:18;;:23;:43;;;;-1:-1:-1;34922:11:0;;:16;34895:43;34887:91;;;;-1:-1:-1;;;34887:91:0;;21055:2:1;34887:91:0;;;21037:21:1;21094:2;21074:18;;;21067:30;21133:34;21113:18;;;21106:62;-1:-1:-1;;;21184:18:1;;;21177:33;21227:19;;34887:91:0;21027:225:1;34887:91:0;35029:27;:58;;;35106:31;35098:92;;;;-1:-1:-1;;;35098:92:0;;23993:2:1;35098:92:0;;;23975:21:1;24032:2;24012:18;;;24005:30;24071:34;24051:18;;;24044:62;-1:-1:-1;;;24122:18:1;;;24115:46;24178:19;;35098:92:0;23965:238:1;35098:92:0;35235:8;35246:29;35262:12;35246:15;:29::i;:::-;35235:40;-1:-1:-1;35294:27:0;;35286:66;;;;-1:-1:-1;;;35286:66:0;;27950:2:1;35286:66:0;;;27932:21:1;27989:2;27969:18;;;27962:30;28028:28;28008:18;;;28001:56;28074:18;;35286:66:0;27922:176:1;35286:66:0;39660:12;35471:18;:37;90:4;35519:11;:25;35644:46;35671:18;35644:26;:46::i;:::-;35638:52;-1:-1:-1;35709:27:0;;35701:74;;;;-1:-1:-1;;;35701:74:0;;25106:2:1;35701:74:0;;;25088:21:1;25145:2;25125:18;;;25118:30;25184:34;25164:18;;;25157:62;-1:-1:-1;;;25235:18:1;;;25228:32;25277:19;;35701:74:0;25078:224:1;35701:74:0;35788:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;35811:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;;35838:8:0;:20;;;;;;-1:-1:-1;;35838:20:0;;;;;;:8;35979:18;;;;;35838:20;35979:18;;;-1:-1:-1;;;;;34476:1529:0:o;83544:142::-;83602:4;83620:8;83633:24;83646:10;83633:12;:24::i;43864:3047::-;44034:18;;43923:4;;39660:12;;44079:45;;;44075:105;;;44153:14;44148:20;44141:27;;;;43864:3047;:::o;44075:105::-;44202:14;44219;:12;:14::i;:::-;44264:12;;44308:13;;44356:11;;44416:17;;:71;;-1:-1:-1;;;44416:71:0;;;;;30984:25:1;;;31025:18;;;31018:34;;;31068:18;;;31061:34;;;44202:31:0;;-1:-1:-1;44264:12:0;;44308:13;;44356:11;;44244:17;;-1:-1:-1;;;;;44416:17:0;;:31;;30957:18:1;;44416:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44390:97;;27238:9;44506:18;:43;;44498:84;;;;-1:-1:-1;;;44498:84:0;;27593:2:1;44498:84:0;;;27575:21:1;27632:2;27612:18;;;27605:30;27671;27651:18;;;27644:58;27719:18;;44498:84:0;27565:178:1;44498:84:0;44606:17;44625:15;44644:52;44652:18;44672:23;44644:7;:52::i;:::-;44605:91;;-1:-1:-1;44605:91:0;-1:-1:-1;44726:18:0;44715:7;:29;;;;;;;;:::i;:::-;;44707:59;;;;-1:-1:-1;;;44707:59:0;;26561:2:1;44707:59:0;;;26543:21:1;26600:2;26580:18;;;26573:30;-1:-1:-1;;;26619:18:1;;;26612:47;26676:18;;44707:59:0;26533:167:1;44707:59:0;-1:-1:-1;;;;;;;;;;;;44833:24:0;44868:20;44899:21;44931:19;44997:58;45007:35;;;;;;;;45022:18;45007:35;;;45044:10;44997:9;:58::i;:::-;44963:92;;-1:-1:-1;44963:92:0;-1:-1:-1;45081:18:0;45070:7;:29;;;;;;;;:::i;:::-;;45066:183;;45123:114;45134:16;45152:69;45228:7;45223:13;;;;;;;;:::i;:::-;45123:10;:114::i;:::-;45116:121;;;;;;;;;;;;;;;;43864:3047;:::o;45066:183::-;45294:53;45312:20;45334:12;45294:17;:53::i;:::-;45261:86;;-1:-1:-1;45261:86:0;-1:-1:-1;45373:18:0;45362:7;:29;;;;;;;;:::i;:::-;;45358:181;;45415:112;45426:16;45444:67;45518:7;45513:13;;;;;;;;:::i;45358:181::-;45578:42;45586:19;45607:12;45578:7;:42::i;:::-;45549:71;;-1:-1:-1;45549:71:0;-1:-1:-1;45646:18:0;45635:7;:29;;;;;;;;:::i;:::-;;45631:178;;45688:109;45699:16;45717:64;45788:7;45783:13;;;;;;;;:::i;45631:178::-;45851:100;45876:38;;;;;;;;45891:21;;45876:38;;;45916:19;45937:13;45851:24;:100::i;:::-;45821:130;;-1:-1:-1;45821:130:0;-1:-1:-1;45977:18:0;45966:7;:29;;;;;;;;:::i;:::-;;45962:179;;46019:110;46030:16;46048:65;46120:7;46115:13;;;;;;;;:::i;45962:179::-;46181:82;46206:20;46228:16;46246;46181:24;:82::i;:::-;46153:110;;-1:-1:-1;46153:110:0;-1:-1:-1;46289:18:0;46278:7;:29;;;;;;;;:::i;:::-;;46274:177;;46331:108;46342:16;46360:63;46430:7;46425:13;;;;;;;;:::i;46274:177::-;46594:18;:39;;;46644:11;:28;;;46683:12;:30;;;46724:13;:32;;;46784:79;;;31661:25:1;;;31717:2;31702:18;;31695:34;;;31745:18;;;31738:34;;;31803:2;31788:18;;31781:34;;;46784:79:0;;31648:3:1;31633:19;46784:79:0;;;;;;;46888:14;46883:20;;87898:733;88107:10;;88022:12;;-1:-1:-1;;;;;88107:10:0;88047:31;;88168;88176:12;88168:31;;;:7;:31::i;:::-;88129:70;;-1:-1:-1;88129:70:0;-1:-1:-1;88230:18:0;88219:7;:29;;;;;;;;:::i;:::-;;88210:55;;;;-1:-1:-1;;;88210:55:0;;26220:2:1;88210:55:0;;;26202:21:1;26259:2;26239:18;;;26232:30;-1:-1:-1;;;26278:18:1;;;26271:42;26330:18;;88210:55:0;26192:162:1;88210:55:0;88290:10;;88276:37;;-1:-1:-1;;;88276:37:0;;-1:-1:-1;;;;;88290:10:0;;;88276:37;;;9686:51:1;9753:18;;;9746:34;;;88276:13:0;;;;;;9659:18:1;;88276:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;88324:8;88335:46;88358:12;88372:8;88335:22;:46::i;:::-;88324:57;-1:-1:-1;88400:31:0;;88392:56;;;;-1:-1:-1;;;88392:56:0;;24765:2:1;88392:56:0;;;24747:21:1;24804:2;24784:18;;;24777:30;-1:-1:-1;;;24823:18:1;;;24816:42;24875:18;;88392:56:0;24737:162:1;88392:56:0;88460:12;88474:23;88501:40;88524:9;88535:5;;88501:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88501:22:0;;-1:-1:-1;;;88501:40:0:i;:::-;88459:82;;;;88560:7;88569:25;88583:10;88569:13;:25::i;:::-;88552:43;;;;;-1:-1:-1;;;88552:43:0;;;;;;;;:::i;:::-;-1:-1:-1;88613:10:0;87898:733;-1:-1:-1;;;;;;;;;;;87898:733:0:o;37489:194::-;37576:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;37600:51:::1;37615:10;37627;37639:3;37644:6;37600:14;:51::i;:::-;:75;37593:82;;75971:1;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;37489:194;;-1:-1:-1;;37489:194:0:o;39878:193::-;39964:17;;39940:4;;-1:-1:-1;;;;;39964:17:0;:31;39996:14;:12;:14::i;:::-;40012:12;;40026:13;;40041:21;;39964:99;;-1:-1:-1;;;;;;39964:99:0;;;;;;;;;;31661:25:1;;;;31702:18;;;31695:34;;;;31745:18;;;31738:34;31788:18;;;31781:34;31633:19;;39964:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64322:203::-;64433:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;64457:60:::1;64471:10;64483::::0;64495:8;64505:11;64457:13:::1;:60::i;:::-;64450:67;;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;64322:203;;-1:-1:-1;;;64322:203:0:o;65685:656::-;65839:5;;65771:4;;65839:5;;;-1:-1:-1;;;;;65839:5:0;65825:10;:19;65821:126;;65868:67;65873:18;65893:41;65868:4;:67::i;65821:126::-;66046:12;;;-1:-1:-1;;;;;66129:30:0;;;-1:-1:-1;;;;;;66129:30:0;;;;;;;66244:49;;;66046:12;;;;10791:34:1;;;10856:2;10841:18;;10834:43;;;;66244:49:0;;10726:18:1;66244:49:0;10708:175:1;42456:207:0;42525:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;42550:16:::1;:14;:16::i;:::-;:40;42542:75;;;;-1:-1:-1::0;;;42542:75:0::1;;;;;;;:::i;:::-;42635:20;:18;:20::i;:::-;42628:27;;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;42456:207;:::o;38853:712::-;-1:-1:-1;;;;;38986:22:0;;38930:4;38986:22;;;:13;:22;;;;;;38930:4;;;;;;;;;39137:36;39000:7;39137:27;:36::i;:::-;39113:60;-1:-1:-1;39113:60:0;-1:-1:-1;39196:18:0;39188:4;:26;;;;;;;;:::i;:::-;;39184:99;;39244:16;39239:22;39263:1;39266;39269;39231:40;;;;;;;;;;;;;;39184:99;39326:28;:26;:28::i;:::-;39295:59;-1:-1:-1;39295:59:0;-1:-1:-1;39377:18:0;39369:4;:26;;;;;;;;:::i;:::-;;39365:99;;39425:16;39420:22;;39365:99;-1:-1:-1;39489:14:0;;-1:-1:-1;39506:13:0;;-1:-1:-1;39521:13:0;-1:-1:-1;39521:13:0;-1:-1:-1;38853:712:0;;;;;;:::o;83992:122::-;84054:4;84078:28;84093:12;84078:14;:28::i;83700:122::-;83762:4;83786:28;83801:12;83786:14;:28::i;66355:760::-;66514:12;;66406:4;;-1:-1:-1;;;;;66514:12:0;66500:10;:26;;;:54;;-1:-1:-1;66530:10:0;:24;66500:54;66496:164;;;66578:70;66583:18;66603:44;66578:4;:70::i;66496:164::-;66744:5;;;66786:12;;;-1:-1:-1;;;;;66786:12:0;;;66744:5;66859:20;;;-1:-1:-1;;;;;;66859:20:0;;;;;;;-1:-1:-1;;;;;;66928:34:0;;;;;;66980:25;;;66744:5;;;;;;10791:34:1;;;66999:5:0;;;;;10856:2:1;10841:18;;10834:43;66744:5:0;66786:12;;66980:25;;10726:18:1;66980:25:0;;;;;;;67054:12;;67021:46;;;-1:-1:-1;;;;;10809:15:1;;;10791:34;;67054:12:0;;;10856:2:1;10841:18;;10834:43;67021:46:0;;10726:18:1;67021:46:0;;;;;;;67092:14;67087:20;;73546:642;73642:4;73659:10;73672:16;:14;:16::i;:::-;73659:29;-1:-1:-1;73703:29:0;;73699:298;;73907:78;73918:5;73912:12;;;;;;;;:::i;:::-;73926:58;73907:4;:78::i;73699:298::-;74132:48;74159:20;74132:26;:48::i;84512:246::-;84634:4;84652:8;84665:64;84689:8;84699:11;84712:16;84665:23;:64::i;:::-;-1:-1:-1;84651:78:0;84512:246;-1:-1:-1;;;;;84512:246:0:o;39694:170::-;39780:17;;39756:4;;-1:-1:-1;;;;;39780:17:0;:31;39812:14;:12;:14::i;:::-;39828:12;;39842:13;;39780:76;;-1:-1:-1;;;;;;39780:76:0;;;;;;;;;;30984:25:1;;;;31025:18;;;31018:34;;;;31068:18;;;31061:34;30957:18;;39780:76:0;30939:162:1;67887:616:0;67985:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;68015:16:::1;:14;:16::i;:::-;68002:29:::0;-1:-1:-1;68046:29:0;;68042:286:::1;;68243:73;68254:5;68248:12;;;;;;;;:::i;:::-;68262:53;68243:4;:73::i;68042:286::-;68447:48;68470:24;68447:22;:48::i;57001:572::-:0;57079:4;75904:11;;57079:4;;75904:11;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;57115:16:::1;:14;:16::i;:::-;57102:29:::0;-1:-1:-1;57146:29:0;;57142:260:::1;;57319:67;57330:5;57324:12;;;;;;;;:::i;:::-;57338:47;57319:4;:67::i;:::-;57388:1;57311:79;;;;;;;57142:260;57512:53;57529:10;57541;57553:11;57512:16;:53::i;:::-;57505:60;;;;;75971:1;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;57001:572;;;;-1:-1:-1;57001:572:0:o;42941:798::-;43058:11;;43010:9;;;;43084:17;43080:652;;-1:-1:-1;;43160:27:0;;43140:18;;43160:27;;-1:-1:-1;42941:798:0:o;43080:652::-;43235:14;43252;:12;:14::i;:::-;43235:31;;43295:23;-1:-1:-1;;;;;;;;;;;;;;43295:23:0;43333:17;43381:33;43444:13;;43429:12;;43417:9;:24;;;;:::i;:::-;:40;;;;:::i;:::-;43381:76;;43500:50;43507:28;43537:12;43500:6;:50::i;:::-;43474:76;-1:-1:-1;43474:76:0;-1:-1:-1;43580:18:0;43569:7;:29;;;;;;;;:::i;:::-;;43565:89;;-1:-1:-1;43627:7:0;43636:1;;-1:-1:-1;42941:798:0;-1:-1:-1;;;;42941:798:0:o;43565:89::-;-1:-1:-1;;43698:21:0;43678:18;;43698:21;;-1:-1:-1;42941:798:0;-1:-1:-1;;;42941:798:0:o;78845:577::-;78947:4;75904:11;;78947:4;;75904:11;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;78983:16:::1;:14;:16::i;:::-;78970:29:::0;-1:-1:-1;79014:29:0;;79010:252:::1;;79187:59;79198:5;79192:12;;;;;;;;:::i;:::-;79206:39;79187:4;:59::i;:::-;79248:1;79179:71;;;;;;;79010:252;79383:31;79393:8;79403:10;79383:9;:31::i;:::-;79376:38;;;;;75971:1;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;78845:577;;;;-1:-1:-1;78845:577:0;-1:-1:-1;78845:577:0:o;89497:714::-;89587:31;89583:70;;89497:714;;:::o;89583:70::-;89663:24;89706:7;89700:21;89724:1;89700:25;;;;:::i;:::-;89690:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89690:36:0;;89663:63;;89737:6;89754:105;89776:7;89770:21;89766:1;:25;89754:105;;;89836:7;89845:1;89830:17;;;;;;;;:::i;:::-;;;;;;;;;89813:11;89825:1;89813:14;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;89813:34:0;;;;;;;;-1:-1:-1;89793:3:0;;;;:::i;:::-;;;;89754:105;;;-1:-1:-1;;;89869:11:0;89881:3;:1;89883;89881:3;:::i;:::-;89869:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;89869:36:0;;;;;;;;-1:-1:-1;;;;89916:11:0;89928:3;:1;89930;89928:3;:::i;:::-;89916:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;89916:36:0;;;;;;;;-1:-1:-1;90002:12:0;90012:2;90002:7;:12;:::i;:::-;89995:21;;:2;:21;:::i;:::-;89982:36;;89963:11;89975:3;:1;89977;89975:3;:::i;:::-;89963:16;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;89963:55:0;;;;;;;;-1:-1:-1;90068:12:0;90078:2;90068:7;:12;:::i;:::-;90061:21;;:2;:21;:::i;:::-;90048:36;;90029:11;90041:3;:1;90043;90041:3;:::i;:::-;90029:16;;;;;;;;:::i;:::-;;;;:55;-1:-1:-1;;;;;90029:55:0;;;;;;;;-1:-1:-1;;;;90095:11:0;90107:3;:1;90109;90107:3;:::i;:::-;90095:16;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;90095:36:0;;;;;;;;-1:-1:-1;90190:11:0;90150:31;;90142:61;;;;-1:-1:-1;;;90142:61:0;;;;;;;;:::i;:::-;;89572:639;;89497:714;;:::o;36019:1456::-;36159:11;;:60;;-1:-1:-1;;;36159:60:0;;36195:4;36159:60;;;12864:34:1;-1:-1:-1;;;;;12934:15:1;;;12914:18;;;12907:43;12986:15;;;12966:18;;;12959:43;13018:18;;;13011:34;;;36117:4:0;;;;36159:11;;;:27;;12798:19:1;;36159:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36144:75;-1:-1:-1;36234:12:0;;36230:144;;36270:92;36281:27;36310:42;36354:7;36270:10;:92::i;:::-;36263:99;;;;;36230:144;36407:3;-1:-1:-1;;;;;36400:10:0;:3;-1:-1:-1;;;;;36400:10:0;;36396:105;;;36434:55;36439:15;36456:32;36434:4;:55::i;36396:105::-;36523:22;36575:3;-1:-1:-1;;;;;36564:14:0;:7;-1:-1:-1;;;;;36564:14:0;;36560:166;;;-1:-1:-1;;;36560:166:0;;;-1:-1:-1;;;;;;36682:23:0;;;;;;;:18;:23;;;;;;;;:32;;;;;;;;;;36560:166;36760:17;36780:26;36800:6;36780:17;:26;:::i;:::-;-1:-1:-1;;;;;36837:18:0;;36817:17;36837:18;;;:13;:18;;;;;;36760:46;;-1:-1:-1;36817:17:0;36837:27;;36858:6;;36837:27;:::i;:::-;-1:-1:-1;;;;;36895:18:0;;36875:17;36895:18;;;:13;:18;;;;;;36817:47;;-1:-1:-1;36875:17:0;36895:27;;36916:6;;36895:27;:::i;:::-;-1:-1:-1;;;;;37056:18:0;;;;;;;:13;:18;;;;;;:33;;;37100:18;;;;;;:33;;;36875:47;-1:-1:-1;;;37160:35:0;;37156:115;;-1:-1:-1;;;;;37212:23:0;;;;;;;:18;:23;;;;;;;;:32;;;;;;;;;:47;;;37156:115;37312:3;-1:-1:-1;;;;;37298:26:0;37307:3;-1:-1:-1;;;;;37298:26:0;-1:-1:-1;;;;;;;;;;;37317:6:0;37298:26;;;;30485:25:1;;30473:2;30458:18;;30440:76;37298:26:0;;;;;;;;-1:-1:-1;37452:14:0;;36019:1456;-1:-1:-1;;;;;;;;;36019:1456:0:o;57587:594::-;57689:4;75904:11;;57689:4;;75904:11;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;57725:16:::1;:14;:16::i;:::-;57712:29:::0;-1:-1:-1;57756:29:0;;57752:260:::1;;57929:67;57940:5;57934:12;;;;;;;;:::i;:::-;57948:47;57929:4;:67::i;57752:260::-;58122:51;58139:10;58151:8;58161:11;58122:16;:51::i;16469:313::-:0;16546:9;16557:4;16575:13;16590:18;16612:20;16622:1;16625:6;16612:9;:20::i;:::-;16574:58;;-1:-1:-1;16574:58:0;-1:-1:-1;16654:18:0;16647:3;:25;;;;;;;;:::i;:::-;;16643:73;;-1:-1:-1;16697:3:0;-1:-1:-1;16702:1:0;;-1:-1:-1;16689:15:0;;16643:73;16736:18;16756:17;16765:7;16756:8;:17::i;:::-;16728:46;;;;;;16469:313;;;;;;:::o;85208:186::-;85327:10;;85356:30;;-1:-1:-1;;;85356:30:0;;85380:4;85356:30;;;9442:51:1;85272:4:0;;-1:-1:-1;;;;;85327:10:0;;;;85356:15;;9415:18:1;;85356:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85349:37;;;85208:186;:::o;69504:590::-;69581:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;69611:16:::1;:14;:16::i;:::-;69598:29:::0;-1:-1:-1;69642:29:0;;69638:274:::1;;69833:67;69844:5;69838:12;;;;;;;;:::i;:::-;69852:47;69833:4;:67::i;69638:274::-;70035:28;70053:9;70035:17;:28::i;:::-;-1:-1:-1::0;70023:40:0;-1:-1:-1;;75983:11:0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;69504:590;;-1:-1:-1;69504:590:0:o;26461:153::-;26522:4;26544:33;26557:3;26552:9;;;;;;;;:::i;:::-;26568:4;26563:10;;;;;;;;:::i;:::-;26544:33;;;30984:25:1;;;31040:2;31025:18;;31018:34;;;;26575:1:0;31068:18:1;;;31061:34;30972:2;30957:18;26544:33:0;;;;;;;26602:3;26597:9;;;;;;;;:::i;71787:1745::-;71998:5;;71854:4;;;;71998:5;;;-1:-1:-1;;;;;71998:5:0;71984:10;:19;71980:124;;72027:65;72032:18;72052:39;72027:4;:65::i;71980:124::-;39660:12;72208:18;;:38;72204:147;;72270:69;72275:22;72299:39;72270:4;:69::i;72204:147::-;72457:12;72440:14;:12;:14::i;:::-;:29;72436:152;;;72493:83;72498:29;72529:46;72493:4;:83::i;72436:152::-;72682:13;;72667:12;:28;72663:129;;;72719:61;72724:15;72741:38;72719:4;:61::i;72663:129::-;72960:12;72944:13;;:28;;;;:::i;:::-;72925:47;;73100:13;;73080:16;:33;;73072:71;;;;-1:-1:-1;;;73072:71:0;;25509:2:1;73072:71:0;;;25491:21:1;25548:2;25528:18;;;25521:30;25587:27;25567:18;;;25560:55;25632:18;;73072:71:0;25481:175:1;73072:71:0;73217:13;:32;;;73391:5;;73369:43;;73391:5;;;-1:-1:-1;;;;;73391:5:0;73399:12;73369:13;:43::i;:::-;73446:5;;73430:54;;;73446:5;;;;-1:-1:-1;;;;;73446:5:0;10001:51:1;;10083:2;10068:18;;10061:34;;;10111:18;;10104:34;;;73430:54:0;;9989:2:1;9974:18;73430:54:0;9956:188:1;82065:628:0;82184:4;82190;82239:18;82215:20;:42;;82207:68;;;;-1:-1:-1;;;82207:68:0;;18494:2:1;82207:68:0;;;18476:21:1;18533:2;18513:18;;;18506:30;-1:-1:-1;;;18552:18:1;;;18545:43;18605:18;;82207:68:0;18466:163:1;82207:68:0;82286:10;82299:16;:14;:16::i;:::-;82286:29;-1:-1:-1;82330:29:0;;82326:260;;82503:67;82514:5;82508:12;;;;;;;;:::i;82503:67::-;82572:1;82495:79;;;;;;;82326:260;82603:82;82622:10;82634:8;82644:20;82666:18;82603;:82::i;:::-;82596:89;;;;;82065:628;;;;;;;:::o;49856:546::-;49940:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;49970:16:::1;:14;:16::i;:::-;49957:29:::0;-1:-1:-1;50001:29:0;;49997:249:::1;;50173:61;50184:5;50178:12;;;;;;;;:::i;:::-;50192:41;50173:4;:61::i;49997:249::-;50345:49;50365:10;50378:1;50381:12;50345:11;:49::i;40836:450::-:0;-1:-1:-1;;;;;41010:23:0;;40913:9;41010:23;;;:14;:23;;;;;41060:24;;40913:9;;41010:23;41056:92;;-1:-1:-1;41114:18:0;;;;-1:-1:-1;40836:450:0;-1:-1:-1;;40836:450:0:o;41056:92::-;41169:90;41191:14;:24;;;41217:11;;41230:14;:28;;;41169:21;:90::i;:::-;41162:97;;;;;40836:450;;;:::o;74202:1299::-;74502:5;;74296:4;;;;74502:5;;;-1:-1:-1;;;;;74502:5:0;74488:10;:19;74484:132;;74531:73;74536:18;74556:47;74531:4;:73::i;74484:132::-;39660:12;74720:18;;:38;74716:155;;74782:77;74787:22;74811:47;74782:4;:77::i;74716:155::-;74965:17;;;;;;;;;-1:-1:-1;;;;;74965:17:0;74942:40;;75085:20;-1:-1:-1;;;;;75085:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75077:83;;;;-1:-1:-1;;;75077:83:0;;25863:2:1;75077:83:0;;;25845:21:1;25902:2;25882:18;;;25875:30;25941;25921:18;;;25914:58;25989:18;;75077:83:0;25835:178:1;75077:83:0;75237:17;:40;;-1:-1:-1;;;;;;75237:40:0;-1:-1:-1;;;;;75237:40:0;;;;;;;;;75383:70;;;10809:15:1;;;10791:34;;10856:2;10841:18;;10834:43;;;;75383:70:0;;10726:18:1;75383:70:0;10708:175:1;46925:348:0;46995:4;75904:11;;46995:4;;75904:11;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;47031:16:::1;:14;:16::i;:::-;47018:29:::0;-1:-1:-1;47062:29:0;;47058:147:::1;;47130:59;47141:5;47135:12;;;;;;;;:::i;47058:147::-;47232:33;47242:10;47254;47232:9;:33::i;6636:236::-:0;6692:9;6703:4;6729:1;6724;:6;6720:145;;6755:18;6775:5;6779:1;6775;:5;:::i;:::-;6747:34;;;;;;6720:145;-1:-1:-1;6822:27:0;;-1:-1:-1;6851:1:0;6814:39;;16102:353;16171:9;16182:10;-1:-1:-1;;;;;;;;;;;;;;16182:10:0;16206:14;16222:19;16245:27;16253:1;:10;;;16265:6;16245:7;:27::i;:::-;16205:67;;-1:-1:-1;16205:67:0;-1:-1:-1;16295:18:0;16287:4;:26;;;;;;;;:::i;:::-;;16283:92;;-1:-1:-1;16344:18:0;;;;;;;;;-1:-1:-1;16344:18:0;;16338:4;;-1:-1:-1;16344:18:0;-1:-1:-1;16330:33:0;;16283:92;16415:31;;;;;;;;;;;;-1:-1:-1;;16415:31:0;;-1:-1:-1;16102:353:0;-1:-1:-1;;;;16102:353:0:o;26628:187::-;26713:4;26735:43;26748:3;26743:9;;;;;;;;:::i;:::-;26759:4;26754:10;;;;;;;;:::i;:::-;26735:43;;;30984:25:1;;;31040:2;31025:18;;31018:34;;;;31068:18;;31061:34;;;30972:2;30957:18;26735:43:0;;;;;;;26803:3;26798:9;;;;;;;;:::i;6886:258::-;6942:9;;;6979:5;6983:1;6979;:5;:::i;:::-;6970:14;;7006:1;7001;:6;6997:140;;7032:18;;-1:-1:-1;7052:1:0;-1:-1:-1;7024:30:0;;6997:140;7095:26;7123:1;7087:38;;;;;;;16796:328;16893:9;16904:4;16922:13;16937:18;16959:20;16969:1;16972:6;16959:9;:20::i;:::-;16921:58;;-1:-1:-1;16921:58:0;-1:-1:-1;17001:18:0;16994:3;:25;;;;;;;;:::i;:::-;;16990:73;;-1:-1:-1;17044:3:0;-1:-1:-1;17049:1:0;;-1:-1:-1;17036:15:0;;16990:73;17082:34;17090:17;17099:7;17090:8;:17::i;:::-;17109:6;17082:7;:34::i;:::-;17075:41;;;;;;16796:328;;;;;;:::o;6050:343::-;6106:9;;6138:6;6134:69;;-1:-1:-1;6169:18:0;;-1:-1:-1;6169:18:0;6161:30;;6134:69;6215:6;6224:5;6228:1;6224;:5;:::i;:::-;6215:14;-1:-1:-1;6255:1:0;6246:5;6250:1;6215:14;6246:5;:::i;:::-;:10;6242:144;;6281:26;6309:1;6273:38;;;;;;;6242:144;6352:18;;-1:-1:-1;6372:1:0;-1:-1:-1;6344:30:0;;78194:637;78292:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;;;78317:13;::::1;;::::0;::::1;::::0;:30:::1;;;78346:1;78334:8;:13;;;;78317:30;78309:59;;;::::0;-1:-1:-1;;;78309:59:0;;23648:2:1;78309:59:0::1;::::0;::::1;23630:21:1::0;23687:2;23667:18;;;23660:30;-1:-1:-1;;;23706:18:1;;;23699:46;23762:18;;78309:59:0::1;23620:166:1::0;78309:59:0::1;78379:10;78392:16;:14;:16::i;:::-;78379:29:::0;-1:-1:-1;78423:29:0;;78419:249:::1;;78595:61;78606:5;78600:12;;;;;;;;:::i;:::-;78614:41;78595:4;:61::i;:::-;78588:68;;;;;78419:249;78767:56;78787:10;78800:12;78814:8;78767:11;:56::i;:::-;78760:63;;;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;78194:637;;-1:-1:-1;;78194:637:0:o;77024:381::-;77151:10;;77112:4;;77118:12;;-1:-1:-1;;;;;77151:10:0;77143:55;;;;-1:-1:-1;;;77143:55:0;;26907:2:1;77143:55:0;;;26889:21:1;26946:2;26926:18;;;26919:30;-1:-1:-1;;;26965:18:1;;;26958:48;27023:18;;77143:55:0;26879:168:1;77143:55:0;77231:22;;;77242:10;77231:22;;;9442:51:1;77209:19:0;;9415:18:1;77231:22:0;;;;;;;;;;;;77209:44;;77264:21;77288:49;77312:9;77323:6;77331:5;77288:23;:49::i;:::-;77355:10;;:42;;77264:73;;-1:-1:-1;;;;;;77355:10:0;;77377:9;;77355:42;;77264:73;;77355:42;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77348:49;;;;;;77024:381;;;;;:::o;76525:477::-;76597:13;76760:2;76739:11;:18;:23;76735:48;;;-1:-1:-1;;76764:19:0;;;;;;;;;;;;-1:-1:-1;;;76764:19:0;;;;;76525:477::o;76735:48::-;76887:4;76874:11;76870:22;76855:37;;76931:11;76920:33;;;;;;;;;;;;:::i;64539:1122::-;64699:11;;:87;;-1:-1:-1;;;64699:87:0;;64732:4;64699:87;;;12350:34:1;-1:-1:-1;;;;;12420:15:1;;;12400:18;;;12393:43;12472:15;;;12452:18;;;12445:43;12524:15;;;12504:18;;;12497:43;12556:19;;;12549:35;;;64657:4:0;;;;64699:11;;;:24;;12284:19:1;;64699:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64684:102;-1:-1:-1;64801:12:0;;64797:151;;64837:99;64848:27;64877:49;64928:7;64837:10;:99::i;64797:151::-;64986:10;-1:-1:-1;;;;;64974:22:0;:8;-1:-1:-1;;;;;64974:22:0;;64970:146;;;65020:84;65025:26;65053:50;65020:4;:84::i;64970:146::-;-1:-1:-1;;;;;65162:23:0;;65137:22;65162:23;;;:13;:23;;;;;;:37;;65188:11;;65162:37;:::i;:::-;-1:-1:-1;;;;;65237:25:0;;65210:24;65237:25;;;:13;:25;;;;;;65137:62;;-1:-1:-1;65210:24:0;65237:39;;65265:11;;65237:39;:::i;:::-;-1:-1:-1;;;;;65420:23:0;;;;;;;:13;:23;;;;;;:43;;;65474:25;;;;;;;;;;:47;;;65549:43;;65210:66;;-1:-1:-1;65474:25:0;;-1:-1:-1;;;;;;;;;;;65549:43:0;;;65580:11;30485:25:1;;30473:2;30458:18;;30440:76;65549:43:0;;;;;;;;65638:14;65626:27;64539:1122;-1:-1:-1;;;;;;;;64539:1122:0:o;53335:359::-;53409:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;53439:16:::1;:14;:16::i;:::-;53426:29:::0;-1:-1:-1;53470:29:0;;53466:144:::1;;53537:61;53548:5;53542:12;;;;;;;;:::i;53466:144::-;53637:49;53657:10;53670:12;53684:1;53637:11;:49::i;49306:536::-:0;49380:4;75904:11;;;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;49410:16:::1;:14;:16::i;:::-;49397:29:::0;-1:-1:-1;49441:29:0;;49437:249:::1;;49613:61;49624:5;49618:12;;;;;;;;:::i;49437:249::-;49785:49;49805:10;49818:12;49832:1;49785:11;:49::i;60442:994::-:0;60576:4;75904:11;;60576:4;;75904:11;;75896:34;;;;-1:-1:-1;;;75896:34:0;;;;;;;:::i;:::-;75955:5;75941:19;;-1:-1:-1;;75941:19:0;;;60612:16:::1;:14;:16::i;:::-;60599:29:::0;-1:-1:-1;60643:29:0;;60639:269:::1;;60821:71;60832:5;60826:12;;;;;;;;:::i;:::-;60840:51;60821:4;:71::i;:::-;60894:1;60813:83;;;;;;;60639:269;60928:16;-1:-1:-1::0;;;;;60928:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60920:41:::0;-1:-1:-1;60976:29:0;;60972:273:::1;;61154:75;61165:5;61159:12;;;;;;;;:::i;:::-;61173:55;61154:4;:75::i;60972:273::-;61355:73;61376:10;61388:8;61398:11;61411:16;61355:20;:73::i;:::-;61348:80;;;;;75971:1;75983:11:::0;:18;;-1:-1:-1;;75983:18:0;75997:4;75983:18;;;60442:994;;;;-1:-1:-1;60442:994:0;-1:-1:-1;;60442:994:0:o;68517:973::-;68667:5;;68598:4;;68667:5;;;-1:-1:-1;;;;;68667:5:0;68653:10;:19;68649:127;;68696:68;68701:18;68721:42;68696:4;:68::i;68649:127::-;39660:12;68861:18;;:38;68857:150;;68923:72;68928:22;68952:42;68923:4;:72::i;68857:150::-;27312:4;69079:24;:51;69075:157;;;69154:66;69159:15;69176:43;69154:4;:66::i;69075:157::-;69276:21;;;69308:48;;;;69374:68;;;30695:25:1;;;30751:2;30736:18;;30729:34;;;69374:68:0;;30668:18:1;69374:68:0;30650:119:1;58470:1958:0;58613:11;;:75;;-1:-1:-1;;;58613:75:0;;58652:4;58613:75;;;12864:34:1;-1:-1:-1;;;;;12934:15:1;;;12914:18;;;12907:43;12986:15;;;12966:18;;;12959:43;13018:18;;;13011:34;;;58565:4:0;;;;;;58613:11;;;;:30;;12798:19:1;;58613:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58598:90;-1:-1:-1;58703:12:0;;58699:153;;58740:96;58751:27;58780:46;58828:7;58740:10;:96::i;58699:153::-;39660:12;58878:18;;:38;58874:153;;58941:70;58946:22;58970:40;58941:4;:70::i;58874:153::-;59039:32;;:::i;:::-;-1:-1:-1;;;;;59115:24:0;;;;;;:14;:24;;;;;:38;;;59094:18;;;:59;59214:37;59130:8;59214:27;:37::i;:::-;59191:19;;;59176:75;;;59177:12;;;59176:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;59282:18:0;;-1:-1:-1;59266:4:0;:12;;;:34;;;;;;;;:::i;:::-;;59262:192;;59325:113;59336:16;59354:63;59424:4;:12;;;59419:18;;;;;;;;:::i;59325:113::-;59440:1;59317:125;;;;;;;;59262:192;-1:-1:-1;;59480:11:0;:29;59476:163;;;59545:19;;;;59526:16;;;:38;59476:163;;;59597:16;;;:30;;;59476:163;59807:37;59820:5;59827:4;:16;;;59807:12;:37::i;:::-;59782:22;;;:62;;;59901:19;;;;:44;;59782:62;59901:44;:::i;:::-;59876:22;;;:69;59994:22;;;;59979:12;;:37;;59994:22;59979:37;:::i;:::-;59956:20;;;:60;;;60076:22;;;;;;-1:-1:-1;;;;;60039:24:0;;;;;;;:14;:24;;;;;;;;;:59;;;60150:11;;60109:38;;;;:52;;;;60187:20;;60172:12;:35;;;60264:22;;;;60288;;60235:98;;14736:15:1;;;14718:34;;14768:18;;;14761:43;;;;14820:18;;;14813:34;;;;14878:2;14863:18;;14856:34;14921:3;14906:19;;14899:35;;;;60235:98:0;;14652:19:1;60235:98:0;;;;;;;60397:22;;;60380:14;;60397:22;;-1:-1:-1;58470:1958:0;-1:-1:-1;;;;;58470:1958:0:o;15095:515::-;15156:9;15167:10;-1:-1:-1;;;;;;;;;;;;;;15167:10:0;15191:14;15207:20;15231:22;15239:3;90:4;15231:7;:22::i;:::-;15190:63;;-1:-1:-1;15190:63:0;-1:-1:-1;15276:18:0;15268:4;:26;;;;;;;;:::i;:::-;;15264:92;;-1:-1:-1;15325:18:0;;;;;;;;;-1:-1:-1;15325:18:0;;15319:4;;-1:-1:-1;15325:18:0;-1:-1:-1;15311:33:0;;15264:92;15369:14;15385:13;15402:31;15410:15;15427:5;15402:7;:31::i;:::-;15368:65;;-1:-1:-1;15368:65:0;-1:-1:-1;15456:18:0;15448:4;:26;;;;;;;;:::i;:::-;;15444:92;;15499:4;15505:18;;;;;;;;15520:1;15505:18;;;15491:33;;;;;;;;;;15444:92;15576:25;;;;;;;;;;;;-1:-1:-1;;15576:25:0;;-1:-1:-1;15095:515:0;-1:-1:-1;;;;;;15095:515:0:o;47528:1764::-;47646:11;;:58;;-1:-1:-1;;;47646:58:0;;47598:4;;;;;;-1:-1:-1;;;;;47646:11:0;;:23;;:58;;47678:4;;47685:6;;47693:10;;47646:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47631:73;-1:-1:-1;47719:12:0;;47715:145;;47756:88;47767:27;47796:38;47836:7;47756:10;:88::i;:::-;47846:1;47748:100;;;;;;;47715:145;39660:12;47884:18;;:38;47880:145;;47947:62;47952:22;47976:32;47947:4;:62::i;47880:145::-;48035:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48035:25:0;48117:28;:26;:28::i;:::-;48088:25;;;48073:72;;;48074:12;;;48073:72;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;48176:18:0;;-1:-1:-1;48160:4:0;:12;;;:34;;;;;;;;:::i;:::-;;48156:171;;48219:92;48230:16;48248:42;48297:4;:12;;;48292:18;;;;;;;;:::i;48219:92::-;48313:1;48211:104;;;;;;;;48156:171;48484:10;48529:31;48484:10;48549;48529:12;:31::i;:::-;48505:21;;;:55;;;48663:42;;;;;;;;48678:25;;;;48663:42;;48617:89;;48505:55;48617:22;:89::i;:::-;48598:15;;;48583:123;;;48584:12;;;48583:123;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;48741:18:0;;-1:-1:-1;48725:4:0;:12;;;:34;;;;;;;;:::i;:::-;;48717:79;;;;-1:-1:-1;;;48717:79:0;;29060:2:1;48717:79:0;;;29042:21:1;;;29079:18;;;29072:30;29138:34;29118:18;;;29111:62;29190:18;;48717:79:0;29032:182:1;48717:79:0;48865:4;:15;;;48851:11;;:29;;;;:::i;:::-;48829:19;;;:51;48939:15;;;;-1:-1:-1;;;;;48915:21:0;;;;;;:13;:21;;;;;;:39;;48939:15;48915:39;:::i;:::-;48891:21;;;:63;;;48979:19;;;;;48965:11;:33;-1:-1:-1;;;;;49009:21:0;;;;;;;:13;:21;;;;;;;;;:45;;;;49102:21;;;;49125:15;;;;;49082:59;;11888:15:1;;;11870:34;;11920:18;;;11913:43;;;;11972:18;;;11965:34;12015:18;;12008:34;;;;49082:59:0;;11804:19:1;49082:59:0;;;;;;;49181:6;-1:-1:-1;;;;;49157:48:0;49174:4;-1:-1:-1;;;;;49157:48:0;-1:-1:-1;;;;;;;;;;;49189:4:0;:15;;;49157:48;;;;30485:25:1;;30473:2;30458:18;;30440:76;49157:48:0;;;;;;;;-1:-1:-1;49262:21:0;;;49245:14;;49262:21;;-1:-1:-1;47528:1764:0;-1:-1:-1;;;;47528:1764:0:o;342:213::-;524:12;;399:4;;524:23;;90:4;;524:23;:::i;70108:1069::-;70169:4;;;;39660:12;70393:18;;:38;70389:163;;70456:66;70461:22;70485:36;70456:4;:66::i;:::-;70448:92;70524:15;;-1:-1:-1;70108:1069:0;-1:-1:-1;;;70108:1069:0:o;70389:163::-;70715:35;70728:10;70740:9;70715:12;:35::i;:::-;70697:53;;70798:15;70782:13;;:31;;;;:::i;:::-;70763:50;;70864:13;;70844:16;:33;;70836:67;;;;-1:-1:-1;;;70836:67:0;;30191:2:1;70836:67:0;;;30173:21:1;30230:2;30210:18;;;30203:30;-1:-1:-1;;;30249:18:1;;;30242:51;30310:18;;70836:67:0;30163:171:1;70836:67:0;70980:13;:32;;;71040:60;;;71054:10;10001:51:1;;10083:2;10068:18;;10061:34;;;10111:18;;;10104:34;;;71040:60:0;;9989:2:1;9974:18;71040:60:0;;;;;;;71136:14;71131:20;;86783:921;86936:10;;86958:26;;-1:-1:-1;;;86958:26:0;;-1:-1:-1;;;;;9704:32:1;;;86958:26:0;;;9686:51:1;9753:18;;;9746:34;;;86936:10:0;;;;;;86958:14;;9659:18:1;;86958:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86997:12;87051:16;87090:1;87085:152;;;;87260:2;87255:219;;;;87609:1;87606;87599:12;87085:152;-1:-1:-1;;87180:6:0;-1:-1:-1;87085:152:0;;87255:219;87357:2;87354:1;87351;87336:24;87399:1;87393:8;87382:19;;87044:586;;87659:7;87651:45;;;;-1:-1:-1;;;87651:45:0;;22936:2:1;87651:45:0;;;22918:21:1;22975:2;22955:18;;;22948:30;23014:27;22994:18;;;22987:55;23059:18;;87651:45:0;22908:175:1;87651:45:0;86865:839;;86783:921;;:::o;79430:2627::-;79561:4;;39660:12;79598:18;;:38;79594:153;;79661:70;79666:22;79690:40;79661:4;:70::i;:::-;79733:1;79653:82;;;;;;79594:153;79759:32;;:::i;:::-;-1:-1:-1;;;;;79838:24:0;;;;;;:14;:24;;;;;:38;;;79817:18;;;:59;79940:37;79853:8;79940:27;:37::i;:::-;79917:19;;;79902:75;;;79903:12;;;79902:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;80008:18:0;;-1:-1:-1;79992:4:0;:12;;;:34;;;;;;;;:::i;:::-;;79988:194;;80051:115;80062:16;80080:65;80152:4;:12;;;80147:18;;;;;;;;:::i;80051:115::-;80168:1;80043:127;;;;;;;79988:194;80350:39;80363:5;80370:18;80350:12;:39::i;:::-;80325:22;;;:64;;;80421:25;;80449:45;;:20;:45;:::i;:::-;-1:-1:-1;;;;;80531:25:0;;80505:23;80531:25;;;:15;:25;;;;;;80421:73;;-1:-1:-1;80505:23:0;80531:48;;80559:20;;80531:48;:::i;:::-;-1:-1:-1;;;;;80594:25:0;;80622:1;80594:25;;;:15;:25;;;;;;80505:74;;-1:-1:-1;80594:29:0;80590:667;;-1:-1:-1;;;;;80680:24:0;;80640:37;80680:24;;;:14;:24;;;;;;;;80797:15;:25;;;;;;80824:11;;80837:28;;;;80680:24;;80640:37;80774:92;;80797:25;80824:11;80774:22;:92::i;:::-;80748:4;:12;;80747:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;80901:18:0;;-1:-1:-1;80885:4:0;:12;;;:34;;;;;;;;:::i;:::-;;80881:202;;80948:115;80959:16;80977:65;81049:4;:12;;;81044:18;;;;;;;;:::i;80948:115::-;81065:1;80940:127;;;;;;;;;;;80881:202;81160:8;81138:4;:19;;;:30;;;;:::i;:::-;81113:22;;;:55;-1:-1:-1;80590:667:0;;-1:-1:-1;80590:667:0;;81226:19;;;;81201:22;;;:44;80590:667;81317:20;81292:4;:22;;;:45;;;;:::i;:::-;81267:22;;;:70;81386:22;;;;81371:12;;:37;;81386:22;81371:37;:::i;:::-;81348:20;;;:60;-1:-1:-1;;;;;81431:25:0;;;;;;:15;:25;;;;;:46;;;81492:24;;81488:171;;-1:-1:-1;;;;;81588:24:0;;;;;;:14;:24;;;;;;;;;:34;81624:22;;;;81538:109;;10388:51:1;;;10455:18;;;10448:34;;;10498:18;;;10491:34;10556:2;10541:18;;10534:34;81538:109:0;;;;;;10375:3:1;81538:109:0;;;81488:171;81706:22;;;;;-1:-1:-1;;;;;81669:24:0;;;;;;;:14;:24;;;;;;;;;:59;;;81780:11;;81739:38;;;;:52;;;;81817:20;;;;81802:12;:35;81896:22;;;;81865:96;;14736:15:1;;;14718:34;;14768:18;;;14761:43;;;;14820:18;;14813:34;;;;14878:2;14863:18;;14856:34;;;14921:3;14906:19;;14899:35;;;81865:96:0;;14652:19:1;81865:96:0;;;;;;;-1:-1:-1;;82026:22:0;;;82009:14;;82026:22;;-1:-1:-1;79430:2627:0;-1:-1:-1;;;;;79430:2627:0:o;50657:2664::-;50764:4;50789:19;;;:42;;-1:-1:-1;50812:19:0;;50789:42;50781:107;;;;-1:-1:-1;;;50781:107:0;;29421:2:1;50781:107:0;;;29403:21:1;29460:2;29440:18;;;29433:30;29499:34;29479:18;;;29472:62;-1:-1:-1;;;29550:18:1;;;29543:50;29610:19;;50781:107:0;29393:242:1;50781:107:0;50901:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50901:27:0;50995:28;:26;:28::i;:::-;50966:25;;;50951:72;;;50952:12;;;50951:72;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;51054:18:0;;-1:-1:-1;51038:4:0;:12;;;:34;;;;;;;;:::i;:::-;;51034:168;;51096:94;51107:16;51125:44;51176:4;:12;;;51171:18;;;;;;;;:::i;51096:94::-;51089:101;;;;;51034:168;51228:18;;51224:845;;51277:17;;;:34;;;51382:42;;;;;;;;51397:25;;;;51382:42;;51364:77;;51297:14;51364:17;:77::i;:::-;51343:17;;;51328:113;;;51329:12;;;51328:113;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;51476:18:0;;-1:-1:-1;51460:4:0;:12;;;:34;;;;;;;;:::i;:::-;;51456:185;;51522:103;51533:16;51551:53;51611:4;:12;;;51606:18;;;;;;;;:::i;51456:185::-;51224:845;;;51725:82;51748:14;51764:42;;;;;;;;51779:4;:25;;;51764:42;;;51725:22;:82::i;:::-;51704:17;;;51689:118;;;51690:12;;;51689:118;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;51842:18:0;;-1:-1:-1;51826:4:0;:12;;;:34;;;;;;;;:::i;:::-;;51822:185;;51888:103;51899:16;51917:53;51977:4;:12;;;51972:18;;;;;;;;:::i;51822:185::-;52023:17;;;:34;;;51224:845;52106:11;;52157:17;;;;52106:69;;-1:-1:-1;;;52106:69:0;;52091:12;;-1:-1:-1;;;;;52106:11:0;;:25;;:69;;52140:4;;52147:8;;52157:17;52106:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52091:84;-1:-1:-1;52190:12:0;;52186:142;;52226:90;52237:27;52266:40;52308:7;52226:10;:90::i;:::-;52219:97;;;;;;52186:142;39660:12;52354:18;;:38;52350:142;;52416:64;52421:22;52445:34;52416:4;:64::i;52350:142::-;52557:4;:17;;;52543:11;;:31;;;;:::i;:::-;52521:19;;;:53;52635:17;;;;-1:-1:-1;;;;;52609:23:0;;;;;;:13;:23;;;;;;:43;;52635:17;52609:43;:::i;:::-;52585:21;;;:67;52696:17;;;;52679:14;:12;:14::i;:::-;:34;52675:155;;;52737:81;52742:29;52773:44;52737:4;:81::i;52675:155::-;52870:19;;;;52856:11;:33;52926:21;;;;-1:-1:-1;;;;;52900:23:0;;;;;;:13;:23;;;;;:47;52995:17;;;;52971:42;;52914:8;;52971:13;:42::i;:::-;53068:4;-1:-1:-1;;;;;53041:52:0;53050:8;-1:-1:-1;;;;;53041:52:0;-1:-1:-1;;;;;;;;;;;53075:4:0;:17;;;53041:52;;;;30485:25:1;;30473:2;30458:18;;30440:76;53041:52:0;;;;;;;;53126:17;;;;53145;;;;;53109:54;;;-1:-1:-1;;;;;10019:32:1;;10001:51;;10083:2;10068:18;;10061:34;;;;10111:18;;10104:34;53109:54:0;;9974:18:1;53109:54:0;;;;;;;53186:11;;53236:17;;;;53255;;;;53186:87;;-1:-1:-1;;;53186:87:0;;53219:4;53186:87;;;11870:34:1;-1:-1:-1;;;;;11940:15:1;;;11920:18;;;11913:43;11972:18;;;11965:34;;;;12015:18;;;12008:34;;;;53186:11:0;;;:24;;11804:19:1;;53186:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53298:14:0;;-1:-1:-1;53293:20:0;;-1:-1:-1;;53293:20:0;;53286:27;50657:2664;-1:-1:-1;;;;;;50657:2664:0:o;41294:608::-;41400:9;41411:4;41428:17;41456:24;41491:11;41548:29;41556:7;41565:11;41548:7;:29::i;:::-;41515:62;;-1:-1:-1;41515:62:0;-1:-1:-1;41603:18:0;41592:7;:29;;;;;;;;:::i;:::-;;41588:81;;41646:7;41655:1;41638:19;;;;;;;;;41588:81;41701:47;41709:19;41730:17;:13;41746:1;41730:17;:::i;:::-;41701:7;:47::i;:::-;41681:67;;-1:-1:-1;41681:67:0;-1:-1:-1;41774:18:0;41763:7;:29;;;;;;;;:::i;:::-;;41759:81;;41817:7;41826:1;41809:19;;;;;;;;;41759:81;41867:18;;41887:6;;-1:-1:-1;41294:608:0;-1:-1:-1;;;;;;41294:608:0:o;53869:3118::-;53969:4;54014:10;12111:20;12150:8;53986:61;;;;-1:-1:-1;;;53986:61:0;;20708:2:1;53986:61:0;;;20690:21:1;20747:2;20727:18;;;20720:30;-1:-1:-1;;;20766:18:1;;;20759:48;20824:18;;53986:61:0;20680:168:1;53986:61:0;54083:11;;:64;;-1:-1:-1;;;54083:64:0;;54068:12;;-1:-1:-1;;;;;54083:11:0;;:25;;:64;;54117:4;;54124:8;;54134:12;;54083:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54068:79;-1:-1:-1;54162:12:0;;54158:142;;54198:90;54209:27;54238:40;54280:7;54198:10;:90::i;54158:142::-;39660:12;54326:18;;:38;54322:142;;54388:64;54393:22;54417:34;54388:4;:64::i;54322:142::-;54507:12;54490:14;:12;:14::i;:::-;:29;54486:143;;;54543:74;54548:29;54579:37;54543:4;:74::i;54486:143::-;54641:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54641:27:0;54679:13;54703:24;54788:37;54816:8;54788:27;:37::i;:::-;54765:19;;;54750:75;;;54751:4;54750:75;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;54856:18:0;;-1:-1:-1;54840:12:0;;:34;;;;;;;;:::i;:::-;;54836:181;;54898:107;54909:16;54927:57;54991:4;:12;;;54986:18;;;;;;;;:::i;54898:107::-;54891:114;;;;;;;;54836:181;-1:-1:-1;;;;;55033:25:0;;55061:1;55033:25;;;:15;:25;;;;;;:29;55029:601;;-1:-1:-1;;;;;55119:24:0;;55079:37;55119:24;;;:14;:24;;;;;;;;55208:15;:25;;;;;;;55235:11;;55248:28;;;;55185:92;;55208:25;55235:11;55185:22;:92::i;:::-;55158:119;-1:-1:-1;55158:119:0;55159:4;55158:119;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;55312:18:0;;-1:-1:-1;55296:12:0;;:34;;;;;;;;:::i;:::-;;55292:189;;55358:107;55369:16;55387:57;55451:4;:12;;;55446:18;;;;;;;;:::i;55358:107::-;55351:114;;;;;;;;;55292:189;55528:23;55543:8;55528:12;:23;:::i;:::-;55506:45;;55064:499;55029:601;;;-1:-1:-1;55606:12:0;55029:601;55698:19;55676:4;:19;;;:41;;;;:::i;:::-;55651:22;;;:66;55751:12;;:27;;55766:12;;55751:27;:::i;:::-;55728:20;;;:50;55829:22;;;;;-1:-1:-1;;;;;55792:24:0;;;;;;:14;:24;;;;;;:59;;;55903:11;;55862:38;;;;:52;56060:13;;;56056:759;;56105:20;;;;56090:12;:35;56140:37;56154:8;56164:12;56140:13;:37::i;:::-;56056:759;;;56225:1;56214:8;:12;;;56210:496;;;56316:20;;56449:12;56460:1;56449:8;:12;:::i;:::-;56433:29;;;;:12;:29;:::i;:::-;-1:-1:-1;;;;;56502:25:0;;;;;;:15;:25;;;;;;56415:47;;-1:-1:-1;56502:43:0;;56415:47;;56502:43;:::i;:::-;-1:-1:-1;;;;;56564:25:0;;;;;;:15;:25;;;;;:46;;;56652:20;;;;56481:64;;-1:-1:-1;56652:38:0;;56675:15;;56652:38;:::i;:::-;56629:20;;;:61;-1:-1:-1;;56210:496:0;56735:20;;;;56720:12;:35;56770:33;56780:12;56794:8;56770:9;:33::i;:::-;56875:22;;;;;56899:20;;;;;56844:76;;-1:-1:-1;;;;;10406:32:1;;10388:51;;10470:2;10455:18;;10448:34;;;10498:18;;;10491:34;;;;10541:18;;10534:34;56844:76:0;;10375:3:1;10360:19;56844:76:0;;;;;;;56964:14;56952:27;53869:3118;-1:-1:-1;;;;;;;;53869:3118:0:o;12317:1333::-;12421:21;12455:22;12531:4;12525:11;12512:24;;12572:5;12566:12;12610:6;12599:9;12592:25;12658:4;12647:9;12643:20;12688:9;12684:2;12677:21;12726:1;12722:2;12718:10;12712:16;;12761:6;12757:2;12753:15;12828:4;12821:5;12817:16;12784:223;12856:3;12852:2;12849:11;12784:223;;;12982:9;;12971:21;;12894:4;12886:13;;;;12923;12784:223;;;-1:-1:-1;13033:12:0;;13096:16;;13084:29;;13081:1;13077:37;13059:56;;13033:12;-1:-1:-1;13137:3:0;-1:-1:-1;13161:15:0;;;13236:4;13225:16;;13192:223;13264:3;13260:2;13257:11;13192:223;;;13390:9;;13379:21;;13302:4;13294:13;;;;13331;13192:223;;;-1:-1:-1;13503:12:0;;13488:1;13491:25;;13484:33;;;;13477:41;13468:51;;;;13545:2;13464:60;-1:-1:-1;;13444:158:0;13438:4;13431:172;13633:9;12317:1333;-1:-1:-1;;;;12317:1333:0:o;61450:2858::-;61636:11;;:111;;-1:-1:-1;;;61636:111:0;;61679:4;61636:111;;;12350:34:1;-1:-1:-1;;;;;12420:15:1;;;12400:18;;;12393:43;12472:15;;;12452:18;;;12445:43;12524:15;;;12504:18;;;12497:43;12556:19;;;12549:35;;;61588:4:0;;;;;;61636:11;;;;:34;;12284:19:1;;61636:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61621:126;-1:-1:-1;61762:12:0;;61758:150;;61799:93;61810:27;61839:43;61884:7;61799:10;:93::i;61758:150::-;39660:12;61934:18;;:38;61930:150;;61997:67;62002:22;62026:37;61997:4;:67::i;61930:150::-;39660:12;62106:16;-1:-1:-1;;;;;62106:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;62102:180;;62188:78;62193:22;62217:48;62188:4;:78::i;62102:180::-;62320:10;-1:-1:-1;;;;;62308:22:0;:8;-1:-1:-1;;;;;62308:22:0;;62304:145;;;62355:78;62360:26;62388:44;62355:4;:78::i;62304:145::-;62475:16;62471:147;;62516:86;62521:36;62559:42;62516:4;:86::i;62471:147::-;-1:-1:-1;;62644:11:0;:29;62640:164;;;62698:90;62703:36;62741:46;62698:4;:90::i;62640:164::-;62829:21;62852:22;62878:51;62895:10;62907:8;62917:11;62878:16;:51::i;:::-;62828:101;;-1:-1:-1;62828:101:0;-1:-1:-1;62944:40:0;;62940:163;;63009:78;63020:16;63014:23;;;;;;;;:::i;:::-;63039:47;63009:4;:78::i;:::-;63089:1;63001:90;;;;;;;;;62940:163;63290:11;;:102;;-1:-1:-1;;;63290:102:0;;63247:21;;;;-1:-1:-1;;;;;63290:11:0;;;;:41;;:102;;63340:4;;63355:16;;63374:17;;63290:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63246:146;;-1:-1:-1;63246:146:0;-1:-1:-1;63411:40:0;;63403:82;;;;-1:-1:-1;;;63403:82:0;;23290:2:1;63403:82:0;;;23272:21:1;23329:2;23309:18;;;23302:30;23368:31;23348:18;;;23341:59;23417:18;;63403:82:0;23262:179:1;63403:82:0;63516:36;;-1:-1:-1;;;63516:36:0;;-1:-1:-1;;;;;9460:32:1;;;63516:36:0;;;9442:51:1;63556:11:0;;63516:26;;;;;;9415:18:1;;63516:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;63508:88;;;;-1:-1:-1;;;63508:88:0;;28305:2:1;63508:88:0;;;28287:21:1;28344:2;28324:18;;;28317:30;28383:26;28363:18;;;28356:54;28427:18;;63508:88:0;28277:174:1;63508:88:0;63725:15;-1:-1:-1;;;;;63755:42:0;;63792:4;63755:42;63751:254;;;63827:63;63849:4;63856:10;63868:8;63878:11;63827:13;:63::i;:::-;63814:76;;63751:254;;;63936:57;;-1:-1:-1;;;63936:57:0;;-1:-1:-1;;;;;63936:22:0;;;;;:57;;63959:10;;63971:8;;63981:11;;63936:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63923:70;;63751:254;64035:34;;64027:67;;;;-1:-1:-1;;;64027:67:0;;29842:2:1;64027:67:0;;;29824:21:1;29881:2;29861:18;;;29854:30;-1:-1:-1;;;29900:18:1;;;29893:50;29960:18;;64027:67:0;29814:170:1;64027:67:0;64122:96;;;-1:-1:-1;;;;;13751:15:1;;;13733:34;;13803:15;;;13798:2;13783:18;;13776:43;13835:18;;;13828:34;;;13898:15;;13893:2;13878:18;;13871:43;13945:3;13930:19;;13923:35;;;64122:96:0;;;;;;;13682:3:1;64122:96:0;;;64265:14;64252:48;64282:17;;-1:-1:-1;61450:2858:0;;-1:-1:-1;;;;;;;;;;61450:2858:0:o;85408:1361::-;85569:10;;85612:51;;-1:-1:-1;;;85612:51:0;;85657:4;85612:51;;;9442::1;85492:4:0;;-1:-1:-1;;;;;85569:10:0;;85492:4;;85569:10;;85612:36;;9415:18:1;;85612:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85674:47;;-1:-1:-1;;;85674:47:0;;85591:72;;-1:-1:-1;;;;;;85674:18:0;;;;;:47;;85693:4;;85707;;85714:6;;85674:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85734:12;85788:16;85827:1;85822:153;;;;85998:2;85993:220;;;;86349:1;86346;86339:12;85822:153;-1:-1:-1;;85918:6:0;-1:-1:-1;85822:153:0;;85993:220;86096:2;86093:1;86090;86075:24;86138:1;86132:8;86121:19;;85781:589;;86399:7;86391:44;;;;-1:-1:-1;;;86391:44:0;;19995:2:1;86391:44:0;;;19977:21:1;20034:2;20014:18;;;20007:30;20073:26;20053:18;;;20046:54;20117:18;;86391:44:0;19967:174:1;86391:44:0;86548:10;;86533:51;;-1:-1:-1;;;86533:51:0;;86578:4;86533:51;;;9442::1;86513:17:0;;-1:-1:-1;;;;;86548:10:0;;86533:36;;9415:18:1;;86533:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;86513:71;;86619:13;86603:12;:29;;86595:68;;;;-1:-1:-1;;;86595:68:0;;22581:2:1;86595:68:0;;;22563:21:1;22620:2;22600:18;;;22593:30;22659:28;22639:18;;;22632:56;22705:18;;86595:68:0;22553:176:1;86595:68:0;86681:28;86696:13;86681:12;:28;:::i;:::-;86674:35;85408:1361;-1:-1:-1;;;;;;;85408:1361:0:o;6407:215::-;6463:9;;6495:6;6491:77;;-1:-1:-1;6526:26:0;;-1:-1:-1;6554:1:0;6518:38;;6491:77;6588:18;6608:5;6612:1;6608;:5;:::i;:::-;6580:34;;;;6407:215;;;;;:::o;17870:337::-;17958:9;17969:4;17987:13;18002:19;18025:31;18040:6;18048:7;18025:14;:31::i;41910:532::-;42018:9;42029:4;42046:17;42074:18;42103:21;42164:58;42186:7;42195:11;42208:13;42164:21;:58::i;:::-;42137:85;;-1:-1:-1;42137:85:0;-1:-1:-1;42248:18:0;42237:7;:29;;;;;;;;:::i;:::-;;42233:81;;42291:7;42300:1;42283:19;;;;;;;;;42233:81;42353:23;42369:7;42353:13;:23;:::i;:::-;42397:18;;42334:42;;-1:-1:-1;41910:532:0;-1:-1:-1;;;;;;;41910:532:0:o;87718:166::-;87815:10;;87847;;87795:81;;-1:-1:-1;;;87795:81:0;;87835:10;87795:81;;;15210:34:1;-1:-1:-1;;;;;87847:10:0;;;15260:18:1;;;15253:43;15312:18;;;15305:34;;;15387:4;15375:17;;15355:18;;;15348:45;87815:10:0;;;87795:39;;15144:19:1;;87795:81:0;15126:273:1;17509:347:0;17589:9;17600:10;-1:-1:-1;;;;;;;;;;;;;;17600:10:0;17634:14;17650;17668:25;90:4;17686:6;17668:7;:25::i;:::-;17633:60;;-1:-1:-1;17633:60:0;-1:-1:-1;17716:18:0;17708:4;:26;;;;;;;;:::i;:::-;;17704:92;;-1:-1:-1;17765:18:0;;;;;;;;;-1:-1:-1;17765:18:0;;17759:4;;-1:-1:-1;17765:18:0;-1:-1:-1;17751:33:0;;17704:92;17813:35;17820:9;17831:7;:16;;;17813:6;:35::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:464:1;57:5;110:3;103:4;95:6;91:17;87:27;77:2;;128:1;125;118:12;77:2;164:6;151:20;195:49;211:32;240:2;211:32;:::i;:::-;195:49;:::i;:::-;269:2;260:7;253:19;315:3;308:4;303:2;295:6;291:15;287:26;284:35;281:2;;;332:1;329;322:12;281:2;397;390:4;382:6;378:17;371:4;362:7;358:18;345:55;445:1;420:16;;;438:4;416:27;409:38;;;;424:7;67:411;-1:-1:-1;;;67:411:1:o;483:156::-;549:20;;609:4;598:16;;588:27;;578:2;;629:1;626;619:12;578:2;530:109;;;:::o;644:247::-;703:6;756:2;744:9;735:7;731:23;727:32;724:2;;;772:1;769;762:12;724:2;811:9;798:23;830:31;855:5;830:31;:::i;1156:388::-;1224:6;1232;1285:2;1273:9;1264:7;1260:23;1256:32;1253:2;;;1301:1;1298;1291:12;1253:2;1340:9;1327:23;1359:31;1384:5;1359:31;:::i;:::-;1409:5;-1:-1:-1;1466:2:1;1451:18;;1438:32;1479:33;1438:32;1479:33;:::i;:::-;1531:7;1521:17;;;1243:301;;;;;:::o;1549:456::-;1626:6;1634;1642;1695:2;1683:9;1674:7;1670:23;1666:32;1663:2;;;1711:1;1708;1701:12;1663:2;1750:9;1737:23;1769:31;1794:5;1769:31;:::i;:::-;1819:5;-1:-1:-1;1876:2:1;1861:18;;1848:32;1889:33;1848:32;1889:33;:::i;:::-;1653:352;;1941:7;;-1:-1:-1;;;1995:2:1;1980:18;;;;1967:32;;1653:352::o;2010:1157::-;2196:6;2204;2212;2220;2228;2236;2244;2297:3;2285:9;2276:7;2272:23;2268:33;2265:2;;;2314:1;2311;2304:12;2265:2;2353:9;2340:23;2372:31;2397:5;2372:31;:::i;:::-;2422:5;-1:-1:-1;2479:2:1;2464:18;;2451:32;2492:33;2451:32;2492:33;:::i;:::-;2544:7;-1:-1:-1;2603:2:1;2588:18;;2575:32;2616:33;2575:32;2616:33;:::i;:::-;2668:7;-1:-1:-1;2722:2:1;2707:18;;2694:32;;-1:-1:-1;2777:3:1;2762:19;;2749:33;2801:18;2831:14;;;2828:2;;;2858:1;2855;2848:12;2828:2;2881:50;2923:7;2914:6;2903:9;2899:22;2881:50;:::i;:::-;2871:60;;2984:3;2973:9;2969:19;2956:33;2940:49;;3014:2;3004:8;3001:16;2998:2;;;3030:1;3027;3020:12;2998:2;;3053:52;3097:7;3086:8;3075:9;3071:24;3053:52;:::i;:::-;3043:62;;;3124:37;3156:3;3145:9;3141:19;3124:37;:::i;:::-;3114:47;;2255:912;;;;;;;;;;:::o;3172:315::-;3240:6;3248;3301:2;3289:9;3280:7;3276:23;3272:32;3269:2;;;3317:1;3314;3307:12;3269:2;3356:9;3343:23;3375:31;3400:5;3375:31;:::i;:::-;3425:5;3477:2;3462:18;;;;3449:32;;-1:-1:-1;;;3259:228:1:o;3492:480::-;3593:6;3601;3609;3662:2;3650:9;3641:7;3637:23;3633:32;3630:2;;;3678:1;3675;3668:12;3630:2;3717:9;3704:23;3736:31;3761:5;3736:31;:::i;:::-;3786:5;-1:-1:-1;3838:2:1;3823:18;;3810:32;;-1:-1:-1;3894:2:1;3879:18;;3866:32;3907:33;3866:32;3907:33;:::i;:::-;3959:7;3949:17;;;3620:352;;;;;:::o;3977:452::-;4063:6;4071;4079;4087;4140:3;4128:9;4119:7;4115:23;4111:33;4108:2;;;4157:1;4154;4147:12;4108:2;4196:9;4183:23;4215:31;4240:5;4215:31;:::i;:::-;4265:5;4317:2;4302:18;;4289:32;;-1:-1:-1;4368:2:1;4353:18;;4340:32;;4419:2;4404:18;4391:32;;-1:-1:-1;4098:331:1;-1:-1:-1;;;4098:331:1:o;4434:277::-;4501:6;4554:2;4542:9;4533:7;4529:23;4525:32;4522:2;;;4570:1;4567;4560:12;4522:2;4602:9;4596:16;4655:5;4648:13;4641:21;4634:5;4631:32;4621:2;;4677:1;4674;4667:12;4997:1015;5174:6;5182;5190;5198;5206;5214;5267:3;5255:9;5246:7;5242:23;5238:33;5235:2;;;5284:1;5281;5274:12;5235:2;5323:9;5310:23;5342:31;5367:5;5342:31;:::i;:::-;5392:5;-1:-1:-1;5449:2:1;5434:18;;5421:32;5462:33;5421:32;5462:33;:::i;:::-;5514:7;-1:-1:-1;5568:2:1;5553:18;;5540:32;;-1:-1:-1;5623:2:1;5608:18;;5595:32;5646:18;5676:14;;;5673:2;;;5703:1;5700;5693:12;5673:2;5726:50;5768:7;5759:6;5748:9;5744:22;5726:50;:::i;:::-;5716:60;;5829:3;5818:9;5814:19;5801:33;5785:49;;5859:2;5849:8;5846:16;5843:2;;;5875:1;5872;5865:12;5843:2;;5898:52;5942:7;5931:8;5920:9;5916:24;5898:52;:::i;:::-;5888:62;;;5969:37;6001:3;5990:9;5986:19;5969:37;:::i;:::-;5959:47;;5225:787;;;;;;;;:::o;6581:636::-;6661:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:2;;;6730:1;6727;6720:12;6682:2;6763:9;6757:16;6796:18;6788:6;6785:30;6782:2;;;6828:1;6825;6818:12;6782:2;6851:22;;6904:4;6896:13;;6892:27;-1:-1:-1;6882:2:1;;6933:1;6930;6923:12;6882:2;6962;6956:9;6987:49;7003:32;7032:2;7003:32;:::i;6987:49::-;7059:2;7052:5;7045:17;7099:7;7094:2;7089;7085;7081:11;7077:20;7074:33;7071:2;;;7120:1;7117;7110:12;7071:2;7133:54;7184:2;7179;7172:5;7168:14;7163:2;7159;7155:11;7133:54;:::i;:::-;7206:5;6672:545;-1:-1:-1;;;;;6672:545:1:o;7222:180::-;7281:6;7334:2;7322:9;7313:7;7309:23;7305:32;7302:2;;;7350:1;7347;7340:12;7302:2;-1:-1:-1;7373:23:1;;7292:110;-1:-1:-1;7292:110:1:o;7407:184::-;7477:6;7530:2;7518:9;7509:7;7505:23;7501:32;7498:2;;;7546:1;7543;7536:12;7498:2;-1:-1:-1;7569:16:1;;7488:103;-1:-1:-1;7488:103:1:o;7596:245::-;7675:6;7683;7736:2;7724:9;7715:7;7711:23;7707:32;7704:2;;;7752:1;7749;7742:12;7704:2;-1:-1:-1;;7775:16:1;;7831:2;7816:18;;;7810:25;7775:16;;7810:25;;-1:-1:-1;7694:147:1:o;7846:904::-;7940:6;7948;7956;7964;7972;8025:3;8013:9;8004:7;8000:23;7996:33;7993:2;;;8042:1;8039;8032:12;7993:2;8078:9;8065:23;8055:33;;8107:36;8139:2;8128:9;8124:18;8107:36;:::i;:::-;8097:46;-1:-1:-1;8193:2:1;8178:18;;8165:32;-1:-1:-1;;;;;;8226:32:1;;8216:43;;8206:2;;8273:1;8270;8263:12;8206:2;8296:5;-1:-1:-1;8352:2:1;8337:18;;8324:32;8375:18;8405:14;;;8402:2;;;8432:1;8429;8422:12;8402:2;8470:6;8459:9;8455:22;8445:32;;8515:7;8508:4;8504:2;8500:13;8496:27;8486:2;;8537:1;8534;8527:12;8486:2;8577;8564:16;8603:2;8595:6;8592:14;8589:2;;;8619:1;8616;8609:12;8589:2;8664:7;8659:2;8650:6;8646:2;8642:15;8638:24;8635:37;8632:2;;;8685:1;8682;8675:12;8632:2;7983:767;;;;-1:-1:-1;7983:767:1;;-1:-1:-1;8716:2:1;8708:11;;8738:6;7983:767;-1:-1:-1;;;7983:767:1:o;8755:257::-;8796:3;8834:5;8828:12;8861:6;8856:3;8849:19;8877:63;8933:6;8926:4;8921:3;8917:14;8910:4;8903:5;8899:16;8877:63;:::i;:::-;8994:2;8973:15;-1:-1:-1;;8969:29:1;8960:39;;;;9001:4;8956:50;;8804:208;-1:-1:-1;;8804:208:1:o;9017:274::-;9146:3;9184:6;9178:13;9200:53;9246:6;9241:3;9234:4;9226:6;9222:17;9200:53;:::i;:::-;9269:16;;;;;9154:137;-1:-1:-1;;9154:137:1:o;11205:383::-;-1:-1:-1;;;;;11471:15:1;;;11453:34;;11523:15;;;;11518:2;11503:18;;11496:43;11570:2;11555:18;;11548:34;;;;11403:2;11388:18;;11370:218::o;16647:217::-;16794:2;16783:9;16776:21;16757:4;16814:44;16854:2;16843:9;16839:18;16831:6;16814:44;:::i;19037:346::-;19239:2;19221:21;;;19278:2;19258:18;;;19251:30;-1:-1:-1;;;19312:2:1;19297:18;;19290:52;19374:2;19359:18;;19211:172::o;27052:334::-;27254:2;27236:21;;;27293:2;27273:18;;;27266:30;-1:-1:-1;;;27327:2:1;27312:18;;27305:40;27377:2;27362:18;;27226:160::o;32015:275::-;32086:2;32080:9;32151:2;32132:13;;-1:-1:-1;;32128:27:1;32116:40;;32186:18;32171:34;;32207:22;;;32168:62;32165:2;;;32233:18;;:::i;:::-;32269:2;32262:22;32060:230;;-1:-1:-1;32060:230:1:o;32295:187::-;32344:4;32377:18;32369:6;32366:30;32363:2;;;32399:18;;:::i;:::-;-1:-1:-1;32465:2:1;32444:15;-1:-1:-1;;32440:29:1;32471:4;32436:40;;32353:129::o;32487:128::-;32527:3;32558:1;32554:6;32551:1;32548:13;32545:2;;;32564:18;;:::i;:::-;-1:-1:-1;32600:9:1;;32535:80::o;32620:120::-;32660:1;32686;32676:2;;32691:18;;:::i;:::-;-1:-1:-1;32725:9:1;;32666:74::o;32745:168::-;32785:7;32851:1;32847;32843:6;32839:14;32836:1;32833:21;32828:1;32821:9;32814:17;32810:45;32807:2;;;32858:18;;:::i;:::-;-1:-1:-1;32898:9:1;;32797:116::o;32918:125::-;32958:4;32986:1;32983;32980:8;32977:2;;;32991:18;;:::i;:::-;-1:-1:-1;33028:9:1;;32967:76::o;33048:195::-;33086:4;33123;33120:1;33116:12;33155:4;33152:1;33148:12;33180:3;33175;33172:12;33169:2;;;33187:18;;:::i;:::-;33224:13;;;33095:148;-1:-1:-1;;;33095:148:1:o;33248:258::-;33320:1;33330:113;33344:6;33341:1;33338:13;33330:113;;;33420:11;;;33414:18;33401:11;;;33394:39;33366:2;33359:10;33330:113;;;33461:6;33458:1;33455:13;33452:2;;;-1:-1:-1;;33496:1:1;33478:16;;33471:27;33301:205::o;33511:380::-;33590:1;33586:12;;;;33633;;;33654:2;;33708:4;33700:6;33696:17;33686:27;;33654:2;33761;33753:6;33750:14;33730:18;33727:38;33724:2;;;33807:10;33802:3;33798:20;33795:1;33788:31;33842:4;33839:1;33832:15;33870:4;33867:1;33860:15;33724:2;;33566:325;;;:::o;33896:135::-;33935:3;-1:-1:-1;;33956:17:1;;33953:2;;;33976:18;;:::i;:::-;-1:-1:-1;34023:1:1;34012:13;;33943:88::o;34036:112::-;34068:1;34094;34084:2;;34099:18;;:::i;:::-;-1:-1:-1;34133:9:1;;34074:74::o;34153:127::-;34214:10;34209:3;34205:20;34202:1;34195:31;34245:4;34242:1;34235:15;34269:4;34266:1;34259:15;34285:127;34346:10;34341:3;34337:20;34334:1;34327:31;34377:4;34374:1;34367:15;34401:4;34398:1;34391:15;34417:127;34478:10;34473:3;34469:20;34466:1;34459:31;34509:4;34506:1;34499:15;34533:4;34530:1;34523:15;34549:127;34610:10;34605:3;34601:20;34598:1;34591:31;34641:4;34638:1;34631:15;34665:4;34662:1;34655:15;34681:127;34742:10;34737:3;34733:20;34730:1;34723:31;34773:4;34770:1;34763:15;34797:4;34794:1;34787:15;34813:131;-1:-1:-1;;;;;34888:31:1;;34878:42;;34868:2;;34934:1;34931;34924:12;34868:2;34858:86;:::o

Swarm Source

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