Contract 0x5602afcd78fd1c15101da60fbb22624217459ac0 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xafa7aa86a4d0cb224677a1150827c2027e7dc19b7f86b496ace1039b525395abToken Escrow147316402022-05-15 14:46:0349 days 18 hrs ago0x31b64eb15c6f5ab305ba0a73a653b8eb131393d8 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.017865241226.1
0x49caae5ea2ebeab5787ff231da4bf7eb08558277e69f5e907da091873358af3cToken Escrow147285952022-05-15 13:05:0349 days 20 hrs ago0x89d5771cc1224ec093f80ec17e26110c942a9c2d IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.01882353 27.5
0x5b70c6b6c63ad98610c4d322097b8f597529f6c5a35f5420dcb454a8a1a25d95Token Escrow147284342022-05-15 12:59:4249 days 20 hrs ago0x2286455f96d51125ea86a2f06a0970d068d91a34 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.01882353 27.5
0x6452bd3ea607dd2a90e11a98fa6f545e7eef1baaeb0665f8db0f5fdb108735a8Token Escrow146353682022-05-13 9:16:4952 days 12 mins ago0x9c38c9a4a62f871b78820cd664358066f625a96e IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.077726688478 113.553830401
0x86ddd72eded04c0b324c4d4af9e1fd78241a2377dab504976463f3a4167d587aToken Escrow145016652022-05-10 6:57:5755 days 2 hrs ago0x3bf145aa48f36c53351e4def6c4b38330400eb90 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.05768058907784.267732972
0x2c28da7f41a55c8777eb7c048dfb478b7d9ce5da7ec9f603ef43ce038f780b4cToken Escrow143677282022-05-07 1:30:1258 days 7 hrs ago0x36e7b71557a1e170c1a2c43cea537aadf634f8d9 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.02828237950450.236470785
0xebe2799b5d3eb6230e55d02ff6d6d2ab17f3d595d825c21f757f966181f9e42bToken Escrow143677202022-05-07 1:29:5258 days 7 hrs ago0x36e7b71557a1e170c1a2c43cea537aadf634f8d9 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.03404534056149.738113172
0x100350f28c18f9a2ab13b55d1dbe0f25b75c5bd7a4de5d23bbabf3a8d6a4f92eToken Escrow143518562022-05-06 16:27:0358 days 17 hrs ago0x4268b1f909b31d98f36236bd482d55503d4e0566 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.06232790835891.057175772
0x6920668b22eb33c092ec95bad5884ef4e9fdffacef07d080252bb78d07e5479bToken Escrow143514482022-05-06 16:13:0958 days 17 hrs ago0x6253ae3b7a5b26d7963775fa026c30b832035024 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.071203206704 104.023431544
0x8a6917840095fad65015ba39d9c2345d9571e403af9b5f2327b2c046f566b7f7Transfer Ownersh...143101472022-05-05 16:30:0059 days 16 hrs ago0x1955823bc4e46ff126228a1dbdf2dc90c2c8d801 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.002694990795 94.006934403
0xc38be74a43a959e60b7fa861ee2860f585f7ca66b16724964a340afd50b2be51Token Escrow143084802022-05-05 15:32:2459 days 17 hrs ago0x9915e6e6cc47fcf56083d5205b6c6bacadb33aa6 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.094262391298 134.893346373
0xb4ff0108d9c6631ede986c7cbca18c011d3ec49d342b0a359c58cba1f7488e56Auth From Contra...143069242022-05-05 14:39:2159 days 18 hrs ago0x1955823bc4e46ff126228a1dbdf2dc90c2c8d801 IN  0x5602afcd78fd1c15101da60fbb22624217459ac00 AVAX0.017559440352 111.014846825
0x0748f09d0a24b5002dd535c4c4fda722b965c718969bf7acefadbd571a0a9c630x60806040143067982022-05-05 14:34:5259 days 18 hrs ago0x1955823bc4e46ff126228a1dbdf2dc90c2c8d801 IN  Create: RecordStorage0 AVAX0.566080364396 100.372258067
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RecordStorage

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: RecordStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./RecordInterface.sol";
import "./UserStorage.sol";
import "./OrderStorage.sol";

abstract contract ReentrancyGuardRecord {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}

library CountersRecord {
    struct Counter {
        uint256 _value;
    }

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

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

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}

interface TokenTransfer {
    function transfer(address recipient, uint256 amount) external;

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

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

    function allowance(address _owner, address _spender)
        external
        view
        returns (uint256 remaining);
}

contract RecordStorage is Ownable, ReentrancyGuardRecord {
    using CountersRecord for CountersRecord.Counter;

    string constant P_COIN = "WAVAX";

    mapping(string => address) coinTypeMaping;
    uint256 merchantNeedCount = 0.1 * (10**18);
    uint256 witnessNeedCount = 1 * (10**18);
    uint256 congressNeedCount = 10 * (10**18);
    uint256 appealFee = 0.01 * (10**18);
    uint256 appealFeeFinal = 0.1 * (10**18);
    uint256 canWithdrawToTime = 28;
    uint256 subWitFee = 0.01 * (10**18);
    uint256 subWitCredit = 10;
    uint256 witnessHandleReward = 0.01 * (10**18);
    uint256 observerHandleReward = 0.1 * (10**18);
    uint256 witnessHandleCredit = 1;
    uint256 observerHandleCredit = 1;
    bool openTrade = false;
    uint256 tradeCredit = 1;
    uint256 subTCredit = 10;

    mapping(address => uint256) witnessFlag;
    mapping(address => uint256) congressFlag;

    function setWitnessFlag(address _addr, uint256 _flag) external onlyOwner {
        witnessFlag[_addr] = _flag;
        if (_flag == 1) {
            uint256 _amt = availableTotal[_addr][P_COIN];
            require(_amt >= witnessNeedCount, "coin not enough");
            _userStorage.updateUserRole(_addr, 1);
        } else {
            _userStorage.updateUserRole(_addr, 0);
        }
    }

    function getWitnessFlag(address _addr) public view returns (uint256) {
        return witnessFlag[_addr];
    }

    function setCongressFlag(address _addr, uint256 _flag) external onlyOwner {
        congressFlag[_addr] = _flag;
        if (_flag == 1) {
            uint256 _amt = availableTotal[_addr][P_COIN];
            require(_amt >= congressNeedCount, "coin not enough");
            _userStorage.updateUserRole(_addr, 2);
        } else {
            _userStorage.updateUserRole(_addr, 0);
        }
    }

    function getCongressFlag(address _addr) public view returns (uint256) {
        return congressFlag[_addr];
    }

    function setCoinTypeMapping(
        string calldata _coinType,
        address _coinTypeAddr
    ) external onlyOwner {
        coinTypeMaping[_coinType] = _coinTypeAddr;
    }

    function getCoinTypeMapping(string calldata _coinType)
        public
        view
        returns (address)
    {
        return coinTypeMaping[_coinType];
    }

    function setMerchantNeedCount(uint256 _count) external onlyOwner {
        merchantNeedCount = _count;
    }

    function getMerchantNeedCount() public view returns (uint256) {
        return merchantNeedCount;
    }

    function setWitnessNeedCount(uint256 _count) external onlyOwner {
        witnessNeedCount = _count;
    }

    function getWitnessNeedCount() public view returns (uint256) {
        return witnessNeedCount;
    }

    function setCongressNeedCount(uint256 _count) external onlyOwner {
        congressNeedCount = _count;
    }

    function getCongressNeedCount() public view returns (uint256) {
        return congressNeedCount;
    }

    function setAppealFee(uint256 _count) external onlyOwner {
        appealFee = _count;
    }

    function getAppealFee() public view returns (uint256) {
        return appealFee;
    }

    function setAppealFeeFinal(uint256 _count) external onlyOwner {
        appealFeeFinal = _count;
    }

    function getAppealFeeFinal() public view returns (uint256) {
        return appealFeeFinal;
    }

    function setCanWithdrawToTime(uint256 _days) external onlyOwner {
        canWithdrawToTime = _days;
    }

    function getCanWithdrawToTime() public view returns (uint256) {
        return canWithdrawToTime;
    }

    function setSubWitFee(uint256 _c) external onlyOwner {
        subWitFee = _c;
    }

    function getSubWitFee() public view returns (uint256) {
        return subWitFee;
    }

    function setSubWitCredit(uint256 _c) external onlyOwner {
        subWitCredit = _c;
    }

    function getSubWitCredit() public view returns (uint256) {
        return subWitCredit;
    }

    function setWitnessHandleReward(uint256 _c) external onlyOwner {
        witnessHandleReward = _c;
    }

    function getWitnessHandleReward() public view returns (uint256) {
        return witnessHandleReward;
    }

    function setObserverHandleReward(uint256 _c) external onlyOwner {
        observerHandleReward = _c;
    }

    function getObserverHandleReward() public view returns (uint256) {
        return observerHandleReward;
    }

    function setWitnessHandleCredit(uint256 _c) external onlyOwner {
        witnessHandleCredit = _c;
    }

    function getWitnessHandleCredit() public view returns (uint256) {
        return witnessHandleCredit;
    }

    function setObserverHandleCredit(uint256 _c) external onlyOwner {
        observerHandleCredit = _c;
    }

    function getObserverHandleCredit() public view returns (uint256) {
        return observerHandleCredit;
    }

    function setOpenTrade(bool _c) external onlyOwner {
        openTrade = _c;
    }

    function getOpenTrade() public view returns (bool) {
        return openTrade;
    }

    function setTradeCredit(uint256 _c) external onlyOwner {
        tradeCredit = _c;
    }

    function getTradeCredit() public view returns (uint256) {
        return tradeCredit;
    }

    function setSubTCredit(uint256 _c) external onlyOwner {
        subTCredit = _c;
    }

    function getSubTCredit() public view returns (uint256) {
        return subTCredit;
    }

    function punishPerson(
        address _from,
        address _to,
        uint256 _count
    ) external onlyOwner {
        require(_from != address(0) && _to != address(0));
        UserStorage.User memory _user = _userStorage.searchUser(_from);
        require(_user.userFlag == 1 || _user.userFlag == 2, "can't punish");

        uint256 _ava = availableTotal[_from][P_COIN];
        uint256 _toavailab = availableTotal[_to][P_COIN];
        if (_ava >= _count) {
            availableTotal[_from][P_COIN] = SafeMath.sub(_ava, _count);
            availableTotal[_to][P_COIN] = SafeMath.add(_toavailab, _count);
        } else {
            availableTotal[_from][P_COIN] = 0;

            uint256 _draing = withdrawingTotal[_from][P_COIN];
            if (SafeMath.add(_ava, _draing) >= _count) {
                withdrawingTotal[_from][P_COIN] = SafeMath.sub(
                    _draing,
                    SafeMath.sub(_count, _ava)
                );
                availableTotal[_to][P_COIN] = SafeMath.add(_toavailab, _count);
            } else {
                withdrawingTotal[_from][P_COIN] = 0;
                availableTotal[_to][P_COIN] = SafeMath.add(
                    _toavailab,
                    SafeMath.add(_ava, _draing)
                );
            }
        }
        chanRole(_from);
        chanRole(_to);
    }

    UserInterface private _userStorage;
    OrderInterface private _orderStorage;
    struct Record {
        uint256 recordNo;
        address userAddr;
        string tradeHash;
        string coinType;
        uint256 hostCount;
        uint256 hostStatus;
        uint256 hostType;
        uint256 hostDirection;
        uint256 hostTime;
        uint256 updateTime;
    }

    CountersRecord.Counter private _recordNoCounter;
    mapping(uint256 => Record) public records;
    mapping(uint256 => uint256) public recordIndex;

    Record[] public recordList;

    mapping(address => mapping(string => uint256)) public availableTotal;

    mapping(address => mapping(string => uint256)) public frozenTotal;

    mapping(address => mapping(string => uint256)) public unfrozenTotal;

    mapping(address => uint256) lastWithdrawTime;

    mapping(address => mapping(uint256 => uint256)) lastWithdrawAmount;

    mapping(address => mapping(string => uint256)) public withdrawingTotal;

    mapping(address => mapping(uint256 => uint256)) orderSubFrozenList;

    constructor(
        address _usdtAddress,
        address _usdcAddress,
        address _coinAddress
    ) {
        coinTypeMaping["USDT"] = _usdtAddress;
        coinTypeMaping["USDC"] = _usdcAddress;
        coinTypeMaping[P_COIN] = _coinAddress;
        _recordNoCounter.increment();
    }

    function getERC20Address(string memory _coinType)
        public
        view
        returns (TokenTransfer)
    {
        address _remoteAddr = coinTypeMaping[_coinType];
        require(_remoteAddr != address(0));

        TokenTransfer _tokenTransfer = TokenTransfer(_remoteAddr);
        return _tokenTransfer;
    }

    event RecordAdd(
        uint256 _recordNo,
        address _addr,
        string _tradeHash,
        string _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    );
    event RecordApplyUnfrozen(address _addr, uint256 _amt);
    event UnfrozenTotalTransfer(
        address _addr,
        string _coinType,
        uint256 _lastAmount
    );
    event RecordUpdate(
        address _addr,
        uint256 _recordNo,
        string _hash,
        uint256 _hostStatus
    );

    address _userAddr;
    address _restCAddr;
    address _orderCAddr;
    address _appealCAddr;

    modifier onlyAuthFromAddr() {
        require(_userAddr != address(0), "Invalid address call user");
        require(_restCAddr != address(0), "Invalid address call rest");
        require(_orderCAddr != address(0), "Invalid address call order");
        require(_appealCAddr != address(0), "Invalid address call appeal");
        _;
    }

    function authFromContract(
        address _fromUser,
        address _fromRest,
        address _fromOrder,
        address _fromAppeal
    ) external onlyOwner {
        _userAddr = _fromUser;
        _restCAddr = _fromRest;
        _orderCAddr = _fromOrder;
        _appealCAddr = _fromAppeal;
        _userStorage = UserInterface(_userAddr);
        _orderStorage = OrderInterface(_orderCAddr);
    }

    function _insert(
        address _addr,
        string memory _tradeHash,
        string memory _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    ) internal nonReentrant returns (uint256 recordNo) {
        require(_addr != address(0), "address null");
        require(bytes(_coinType).length != 0, "coinType null");
        require(_hostCount != uint256(0), "hostCount null");
        require(_hostType != uint256(0), "hostType null");
        require(_hostDirection != uint256(0), "hostDirection null");

        uint256 _recordNo = _recordNoCounter.current();
        require(records[_recordNo].recordNo == uint256(0), "order exist");

        Record memory _record = Record({
            recordNo: _recordNo,
            userAddr: _addr,
            tradeHash: _tradeHash,
            coinType: _coinType,
            hostCount: _hostCount,
            hostStatus: _hostStatus,
            hostType: _hostType,
            hostDirection: _hostDirection,
            hostTime: block.timestamp,
            updateTime: 0
        });

        records[_recordNo] = _record;

        recordList.push(_record);
        recordIndex[_recordNo] = recordList.length - 1;

        _recordNoCounter.increment();
        emit RecordAdd(
            _recordNo,
            _addr,
            _tradeHash,
            _coinType,
            _hostCount,
            _hostStatus,
            _hostType,
            _hostDirection
        );
        return _recordNo;
    }

    function tokenEscrow(string memory _coinType, uint256 _amt) external {
        require(_amt > 0, "invalid");
        require(
            availableTotal[msg.sender][_coinType] + _amt >
                availableTotal[msg.sender][_coinType],
            "Invalid transfer amount"
        );

        availableTotal[msg.sender][_coinType] = SafeMath.add(
            availableTotal[msg.sender][_coinType],
            _amt
        );

        uint256 _hostType = 1;
        if (
            keccak256(abi.encodePacked(_coinType)) ==
            keccak256(abi.encodePacked(P_COIN))
        ) {
            _hostType = 2;
            UserStorage.User memory _user = _userStorage.searchUser(msg.sender);

            _changeUserMorgageStats(
                msg.sender,
                availableTotal[msg.sender][_coinType]
            );

            if (
                _user.userFlag == 0 &&
                availableTotal[msg.sender][_coinType] >= merchantNeedCount
            ) {
                _userStorage.updateUserRole(msg.sender, 3);
            }
        }
        _insert(msg.sender, "", _coinType, _amt, 2, _hostType, 1);

        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        _tokenTransfer.transferFrom(msg.sender, address(this), _amt);
    }

    function addRecord(
        address _addr,
        string memory _tradeHash,
        string memory _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    ) public onlyAuthFromAddr {
        require(
            msg.sender == _restCAddr || msg.sender == _orderCAddr,
            "RedocrdStorage:Invalid from contract address"
        );

        frozenTotal[_addr][_coinType] = SafeMath.add(
            frozenTotal[_addr][_coinType],
            _hostCount
        );
        _insert(
            _addr,
            _tradeHash,
            _coinType,
            _hostCount,
            _hostStatus,
            _hostType,
            _hostDirection
        );
    }

    function addAvailableTotal(
        address _addr,
        string memory _coinType,
        uint256 _amt
    ) public onlyAuthFromAddr {
        require(
            msg.sender == _restCAddr || msg.sender == _orderCAddr,
            "Invalid address"
        );
        require(_amt > 0, "invalid");
        uint256 _aBalance = getErcBalance(_coinType, address(this));
        require(_aBalance >= _amt, "not enough");
        require(frozenTotal[_addr][_coinType] >= _amt, "insufficient");
        require(
            SafeMath.sub(frozenTotal[_addr][_coinType], _amt) <=
                frozenTotal[_addr][_coinType],
            "Invalid amount"
        );
        frozenTotal[_addr][_coinType] = SafeMath.sub(
            frozenTotal[_addr][_coinType],
            _amt
        );

        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        _tokenTransfer.transfer(_addr, _amt);
    }

    function getAvailableTotal(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        return availableTotal[_addr][_coinType];
    }

    function subFrozenTotal(uint256 _orderNo, address _addr)
        public
        onlyAuthFromAddr
    {
        require(
            msg.sender == _orderCAddr || msg.sender == _appealCAddr,
            "Invalid call"
        );
        OrderStorage.Order memory _order = _orderStorage.searchOrder(_orderNo);
        require(_order.orderNo != uint256(0), "not exist");
        address _seller = _order.orderDetail.sellerAddr;
        string memory _coinType = _order.orderDetail.coinType;

        uint256 _subAmount = orderSubFrozenList[_seller][_orderNo];
        require(_subAmount == 0);

        uint256 _frozen = frozenTotal[_seller][_coinType];
        uint256 _orderCount = _order.coinCount;
        require(_frozen >= _orderCount);
        require(SafeMath.sub(_frozen, _orderCount) <= _frozen);

        frozenTotal[_seller][_coinType] = SafeMath.sub(_frozen, _orderCount);
        orderSubFrozenList[_seller][_orderNo] = _orderCount;

        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        _tokenTransfer.transfer(_addr, _orderCount);
    }

    function subAvaAppeal(
        address _from,
        address _to,
        AppealStorage.Appeal memory _al,
        uint256 _amt,
        uint256 _t,
        uint256 _self
    ) public onlyAuthFromAddr {
        require(msg.sender == _appealCAddr, "Invalid call");

        uint256 _available = getAvailableTotal(_from, P_COIN);
        uint256 _need = 0;
        address _opt = _t == 1 ? _al.witness : _al.detail.observerAddr;
        if (_available >= _amt) {
            _need = _amt;
        } else {
            _need = _available;
        }

        if (
            (_t == 1 && _self == 0) ||
            (_t == 2 && _al.detail.finalAppealAddr != _from)
        ) {
            availableTotal[_from][P_COIN] = SafeMath.sub(
                availableTotal[_from][P_COIN],
                _need
            );
            availableTotal[_to][P_COIN] = SafeMath.add(
                availableTotal[_to][P_COIN],
                _need
            );
            _changeUserMorgageStats(_from, availableTotal[_from][P_COIN]);
            _changeUserMorgageStats(_to, availableTotal[_to][P_COIN]);
        }

        availableTotal[_opt][P_COIN] = SafeMath.add(
            availableTotal[_opt][P_COIN],
            _amt
        );
        _changeUserMorgageStats(_opt, availableTotal[_opt][P_COIN]);
        chanRole(_from);
        chanRole(_to);
        chanRole(_opt);

        UserStorage.User memory _user = _userStorage.searchUser(_opt);
        if (_t == 1) {
            _user.credit = _user.credit + witnessHandleCredit;
        } else if (_t == 2) {
            _user.credit = _user.credit + observerHandleCredit;
        }
        UserStorage.TradeStats memory _tradeStats = _user.tradeStats;
        _userStorage.updateTradeStats(_opt, _tradeStats, _user.credit);
    }

    function _changeUserMorgageStats(address _addr, uint256 _amt) internal {
        UserStorage.User memory _user = _userStorage.searchUser(_addr);
        UserStorage.MorgageStats memory _morgageStats = _user.morgageStats;
        _morgageStats.mortgage = _amt;
        _userStorage.updateMorgageStats(_addr, _morgageStats);
    }

    function subWitnessAvailable(address _addr) public onlyAuthFromAddr {
        require(msg.sender == _appealCAddr, "Invalid call");
        require(_addr != address(0), "address null");
        uint256 _availableTotal = availableTotal[_addr][P_COIN];
        uint256 _need = 0;
        uint256 subFromDraing = 0;
        if (_availableTotal >= subWitFee) {
            _need = subWitFee;
            availableTotal[_addr][P_COIN] = SafeMath.sub(
                _availableTotal,
                _need
            );
        } else {
            availableTotal[_addr][P_COIN] = 0;

            uint256 _draing = withdrawingTotal[_addr][P_COIN];
            if (SafeMath.add(_availableTotal, _draing) >= subWitFee) {
                _need = subWitFee;
                subFromDraing = SafeMath.sub(subWitFee, _availableTotal);
                withdrawingTotal[_addr][P_COIN] = SafeMath.sub(
                    _draing,
                    subFromDraing
                );
            } else {
                _need = SafeMath.add(_draing, _availableTotal);
                withdrawingTotal[_addr][P_COIN] = 0;
            }
        }
        chanRole(_addr);

        UserStorage.User memory _user = _userStorage.searchUser(_addr);
        _user.credit = _user.credit >= subWitCredit
            ? (_user.credit - subWitCredit)
            : 0;
        UserStorage.TradeStats memory _tradeStats = _user.tradeStats;
        _userStorage.updateTradeStats(_addr, _tradeStats, _user.credit);

        TokenTransfer _tokenTransfer = getERC20Address(P_COIN);
        _tokenTransfer.transfer(owner(), _need);
    }

    function getFrozenTotal(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        return frozenTotal[_addr][_coinType];
    }

    function applyUnfrozen(uint256 _amt) external returns (uint256) {
        require(_amt > 0);
        require(availableTotal[msg.sender][P_COIN] >= _amt, "Invalid amount");
        require(
            SafeMath.sub(availableTotal[msg.sender][P_COIN], _amt) <
                availableTotal[msg.sender][P_COIN],
            "Invalid amount 2"
        );

        lastWithdrawTime[msg.sender] = block.timestamp;
        lastWithdrawAmount[msg.sender][lastWithdrawTime[msg.sender]] = _amt;
        availableTotal[msg.sender][P_COIN] = SafeMath.sub(
            availableTotal[msg.sender][P_COIN],
            _amt
        );
        withdrawingTotal[msg.sender][P_COIN] = SafeMath.add(
            withdrawingTotal[msg.sender][P_COIN],
            _amt
        );

        chanRole(msg.sender);

        _insert(msg.sender, "", P_COIN, _amt, 3, 3, 2);

        emit RecordApplyUnfrozen(msg.sender, _amt);

        return getAvailableTotal(msg.sender, P_COIN);
    }

    function chanRole(address _addr) internal {
        uint256 _avail = availableTotal[_addr][P_COIN];

        UserStorage.User memory _user = _userStorage.searchUser(_addr);

        _changeUserMorgageStats(_addr, _avail);

        if (
            _user.userFlag == 2 &&
            _avail < congressNeedCount &&
            _avail >= merchantNeedCount
        ) {
            _userStorage.updateUserRole(_addr, 3);
        }

        if (
            _user.userFlag == 1 &&
            _avail < witnessNeedCount &&
            _avail >= merchantNeedCount
        ) {
            _userStorage.updateUserRole(_addr, 3);
        }

        if (_user.userFlag == 0 && _avail >= merchantNeedCount) {
            _userStorage.updateUserRole(_addr, 3);
        }

        if (_avail < merchantNeedCount) {
            _userStorage.updateUserRole(_addr, 0);
        }
    }

    function unApplyUnfrozen(address _addr) external onlyOwner {
        uint256 _drawing = withdrawingTotal[_addr][P_COIN];
        require(_drawing > 0, "sufficient");
        withdrawingTotal[_addr][P_COIN] = 0;
        availableTotal[_addr][P_COIN] = SafeMath.add(
            availableTotal[_addr][P_COIN],
            _drawing
        );
        chanRole(_addr);
    }

    function applyWithdraw(uint256 _recordNo) public {
        Record memory _record = records[_recordNo];

        require(_record.recordNo != uint256(0), "record not exist");
        require(_record.userAddr == msg.sender, "record user not exist");

        require(_record.hostStatus == 3, "status error");

        require(
            withdrawingTotal[msg.sender][P_COIN] >= _record.hostCount,
            "sufficient"
        );

        require(
            block.timestamp >= (_record.hostTime + canWithdrawToTime * 1 days),
            "can't withdraw"
        );

        withdrawingTotal[msg.sender][P_COIN] = SafeMath.sub(
            withdrawingTotal[msg.sender][P_COIN],
            _record.hostCount
        );
        unfrozenTotal[msg.sender][P_COIN] = SafeMath.add(
            unfrozenTotal[msg.sender][P_COIN],
            _record.hostCount
        );

        _record.hostStatus = 4;
        _record.updateTime = block.timestamp;
        records[_recordNo] = _record;
        recordList[recordIndex[_recordNo]] = _record;
        emit RecordUpdate(msg.sender, _recordNo, _record.tradeHash, 4);

        TokenTransfer _tokenTransfer = getERC20Address(P_COIN);
        _tokenTransfer.transfer(msg.sender, _record.hostCount);
    }

    function unfrozenTotalSearch(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        require(_addr != address(0), "user address is null");

        return unfrozenTotal[_addr][_coinType];
    }

    function getUnfrozenTotal(address _addr, string memory _coinType)
        external
        view
        returns (uint256)
    {
        return unfrozenTotal[_addr][_coinType];
    }

    function getWithdrawingTotal(address _addr, string memory _coinType)
        public
        view
        returns (uint256)
    {
        return withdrawingTotal[_addr][_coinType];
    }

    function getErcBalance(string memory _coinType, address _addr)
        public
        view
        returns (uint256)
    {
        TokenTransfer _tokenTransfer = getERC20Address(_coinType);
        return _tokenTransfer.balanceOf(_addr);
    }

    function _updateInfo(
        address _addr,
        uint256 _recordNo,
        string memory _hash,
        uint256 _hostStatus
    ) internal returns (bool) {
        Record storage _record = records[_recordNo];
        require(_record.userAddr == _addr);
        require(_hostStatus == 1 || _hostStatus == 2, "invalid status");

        if (_hostStatus != uint256(0)) {
            _record.hostStatus = _hostStatus;
        }
        if (bytes(_hash).length != 0) {
            _record.tradeHash = _hash;
        }

        _record.updateTime = block.timestamp;

        emit RecordUpdate(_addr, _recordNo, _hash, _hostStatus);
        return true;
    }

    function updateInfo(
        address _addr,
        uint256 _recordNo,
        string memory _hash,
        uint256 _hostStatus
    ) external returns (bool) {
        return _updateInfo(_addr, _recordNo, _hash, _hostStatus);
    }

    function searchRecord(uint256 _recordNo)
        external
        view
        returns (Record memory record)
    {
        return records[_recordNo];
    }

    function searchRecordList() external view returns (Record[] memory) {
        return recordList;
    }
}

File 2 of 6: AppealStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

import "./RecordInterface.sol";
import "./UserStorage.sol";
contract AppealStorage {
    OrderInterface private _oSt;
    RecordInterface private _rSt;
    UserInterface private _uSt;
    address recAddr;
    struct Appeal {
        address user;
        uint256 appealNo;
        uint256 orderNo;
        address witness;
        address buyer;
        address seller;
        uint256 mortgage;
        uint256 status;
        uint256 appealTime;
        uint256 witTakeTime;
        uint256 obTakeTime;
        AppealDetail detail;
    }
    struct AppealDetail {
        address finalAppealAddr;
        uint256 updateTime;
        string witnessReason;
        uint256 witnessAppealStatus;
        string observerReason;
        uint256 witnessHandleTime;
        uint256 observerHandleTime;
        address observerAddr;
        uint256 witnessHandleReward;
        uint256 observerHandleReward;
        uint256 witnessHandleCredit;
        uint256 observerHandleCredit;
        uint256 witReward;
        uint256 witSub;
        uint256 witCreditR;
        uint256 witCreditS;
    }
    mapping(uint256 => Appeal) public appeals;
    mapping(uint256 => uint256) public appealIndex;
    Appeal[] public appealList;
    event addAppeal(uint256 _appealNo, uint256 _orderNo);
    constructor(
        address _r,
        address _o,
        address _u
    ) {
        _rSt = RecordInterface(_r);
        _oSt = OrderInterface(_o);
        _uSt = UserInterface(_u);
        recAddr = _r;
    }
    modifier onlyWit(uint256 _o) {
        Appeal memory _al = appeals[_o];
        require(_al.witness == msg.sender);
        require(_al.buyer != msg.sender && _al.seller != msg.sender);
        _;
    }
    modifier onlyOb(uint256 _o) {
        Appeal memory _al = appeals[_o];
        require(_al.detail.observerAddr == msg.sender);
        require(_al.buyer != msg.sender && _al.seller != msg.sender);
        _;
    }
    modifier onlyBOS(uint256 _o) {
        OrderStorage.Order memory _r = _oSt.searchOrder(_o);
        require(
            _r.orderDetail.sellerAddr == msg.sender ||
                _r.orderDetail.buyerAddr == msg.sender
        );
        _;
    }
    function _insert(uint256 _o, uint256 _count) internal {
        OrderStorage.Order memory _or = _oSt.searchOrder(_o);
        require(appeals[_o].appealNo == uint256(0));
        AppealDetail memory _detail = AppealDetail({
            finalAppealAddr: address(0),
            updateTime: uint256(0),
            witnessReason: "",
            observerReason: "",
            witnessAppealStatus: 0,
            witnessHandleTime: uint256(0),
            observerHandleTime: uint256(0),
            observerAddr: address(0),
            witnessHandleReward: 0,
            observerHandleReward: 0,
            witnessHandleCredit: 0,
            observerHandleCredit: 0,
            witReward: 0,
            witSub: 0,
            witCreditR: 0,
            witCreditS: 0
        });
        uint256 _appealNo = block.timestamp;
        Appeal memory _appeal = Appeal({
            user: msg.sender,
            appealNo: _appealNo,
            orderNo: _o,
            witness: address(0),
            buyer: _or.orderDetail.buyerAddr,
            seller: _or.orderDetail.sellerAddr,
            mortgage: _count,
            status: 1,
            appealTime: block.timestamp,
            witTakeTime: 0,
            obTakeTime: 0,
            detail: _detail
        });
        appeals[_o] = _appeal;
        appealList.push(_appeal);
        appealIndex[_o] = appealList.length - 1;
        chanT(_or.orderDetail.sellerAddr, _or.orderDetail.buyerAddr, 1, 0);
        emit addAppeal(_appealNo, _o);
    }
    function chanT(
        address _seller,
        address _buyer,
        uint256 _t,
        uint256 _r
    ) internal {
        uint256 _tc = _rSt.getTradeCredit();
        uint256 _rs = _rSt.getSubTCredit();
        UserStorage.User memory _user = _uSt.searchUser(_seller);
        UserStorage.TradeStats memory _tr = _user.tradeStats;
        UserStorage.User memory _user2 = _uSt.searchUser(_buyer);
        UserStorage.TradeStats memory _tr2 = _user2.tradeStats;
        uint256 _c2 = _user2.credit;
        uint256 _c = _user.credit;
        if (_t == 1) {
            _tr.tradeTotal = _tr.tradeTotal > 0 ? (_tr.tradeTotal - 1) : 0;
            _tr2.tradeTotal = _tr2.tradeTotal > 0 ? (_tr2.tradeTotal - 1) : 0;
            _c = (_c >= _tc) ? (_c - _tc) : 0;
            _c2 = (_c2 >= _tc) ? (_c2 - _tc) : 0;
        } else if (_t == 2) {
            _tr.tradeTotal += 1;
            _tr2.tradeTotal += 1;
            if (_r == 1) {
                _c += _tc;
                _c2 = (_c2 >= _rs) ? (_c2 - _rs) : 0;
            } else if (_r == 2) {
                _c2 += _tc;
                _c = (_c >= _rs) ? (_c - _rs) : 0;
            }
        }
        _uSt.updateTradeStats(_seller, _tr, _c);
        _uSt.updateTradeStats(_buyer, _tr2, _c2);
    }
    function applyAppeal(uint256 _o) external onlyBOS(_o) {
        uint256 _fee = _rSt.getAppealFee();
        _insert(_o, _fee);
        TokenTransfer _tokenTransfer = _rSt.getERC20Address("AIR");
        _tokenTransfer.transferFrom(msg.sender, recAddr, _fee);
    }
    function takeWit(uint256 _o) external {
        Appeal memory _al = appeals[_o];
        require(_al.buyer != msg.sender && _al.seller != msg.sender);
        require(_al.witness == address(0));
        require(_al.status == 1);
        bool _f = witOrOb(1);
        require(_f);
        _al.witness = msg.sender;
        _al.witTakeTime = block.timestamp;
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }
    function takeOb(uint256 _o) external {
        Appeal memory _al = appeals[_o];
        require(_al.buyer != msg.sender && _al.seller != msg.sender);
        require(_al.status == 4 || _al.status == 5);
        require(_al.detail.observerAddr == address(0));
        bool _f = witOrOb(2);
        require(_f);
        _al.detail.observerAddr = msg.sender;
        _al.obTakeTime = block.timestamp;
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }
    function changeHandler(uint256 _o, uint256 _type) external onlyBOS(_o) {
        Appeal memory _al = appeals[_o];
        if (_type == 1) {
            require(_al.status == 1);
            require(_al.witness != address(0));
            require(block.timestamp - _al.witTakeTime > 24 hours);
            _al.witness = address(0);
            _al.witTakeTime = 0;
        } else if (_type == 2) {
            require(_al.status == 4 || _al.status == 5);
            require(_al.detail.observerAddr != address(0));
            require(block.timestamp - _al.obTakeTime > 24 hours);
            _al.detail.observerAddr = address(0);
            _al.obTakeTime = 0;
        }
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }
    function witOrOb(uint256 _f) internal view returns (bool) {
        UserStorage.User memory _u = _uSt.searchUser(msg.sender);
        if (_u.userFlag == _f) {
            return true;
        }
        return false;
    }
    function applyFinal(uint256 _o) external onlyBOS(_o) {
        Appeal memory _al = appeals[_o];
        require(_al.status == 2 || _al.status == 3);
        require(block.timestamp - _al.detail.witnessHandleTime <= 24 hours);
        chanT(_al.seller, _al.buyer, 1, 0);
        uint256 _fee = _rSt.getAppealFeeFinal();
        TokenTransfer _tokenTransfer = _rSt.getERC20Address("AIR");
        _tokenTransfer.transferFrom(msg.sender, recAddr, _fee);
        if (_al.status == 2) {
            _al.status = 4;
        } else if (_al.status == 3) {
            _al.status = 5;
        }
        _al.detail.finalAppealAddr = msg.sender;
        _al.detail.updateTime = block.timestamp;
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
    }
    function witnessOpt(
        uint256 _o,
        string memory _r,
        uint256 _s
    ) external onlyWit(_o) {
        require(_s == 2 || _s == 3);
        Appeal memory _al = appeals[_o];
        require(_al.status == 1);
        uint256 _fee = _rSt.getAppealFee();
        uint256 _rcedit = _rSt.getWitnessHandleCredit();
        _al.status = _s;
        _al.detail.witnessAppealStatus = _s;
        _al.detail.witnessReason = _r;
        _al.detail.witnessHandleTime = block.timestamp;
        _al.detail.witnessHandleReward = _fee;
        _al.detail.witnessHandleCredit = _rcedit;
        _al.detail.witReward = _fee;
        _al.detail.witCreditR = _rcedit;
        _al.detail.updateTime = block.timestamp;
        appeals[_o] = _al;
        appealList[appealIndex[_o]] = _al;
        if (_s == 2) {
            if (_al.user == _al.buyer) {
                _rSt.subAvaAppeal(_al.seller, _al.buyer, _al, _fee, 1, 0);
                chanT(_al.seller, _al.buyer, 2, 2);
            } else if (_al.user == _al.seller) {
                _rSt.subAvaAppeal(_al.buyer, _al.seller, _al, _fee, 1, 0);
                chanT(_al.seller, _al.buyer, 2, 1);
            }
        }
        if (_s == 3) {
            if (_al.user == _al.buyer) {
                _rSt.subAvaAppeal(_al.buyer, _al.seller, _al, _fee, 1, 1);
                chanT(_al.seller, _al.buyer, 2, 1);
            } else if (_al.user == _al.seller) {
                _rSt.subAvaAppeal(_al.seller, _al.buyer, _al, _fee, 1, 1);
                chanT(_al.seller, _al.buyer, 2, 2);
            }
        }
    }
    function observerOpt(
        uint256 _o,
        string memory _r,
        uint256 _s
    ) external onlyOb(_o) {
        require(_s == 6 || _s == 7);
        Appeal memory _appeal = appeals[_o];
        require(_appeal.status == 4 || _appeal.status == 5);
        uint256 _fee = _rSt.getAppealFeeFinal();
        uint256 _rcedit = _rSt.getObserverHandleCredit();
        _appeal.status = _s;
        _appeal.detail.observerReason = _r;
        _appeal.detail.observerHandleTime = block.timestamp;
        _appeal.detail.observerHandleReward = _fee;
        _appeal.detail.observerHandleCredit = _rcedit;
        uint256 _subWC = _rSt.getSubWitCredit();
        uint256 _subWF = _rSt.getSubWitFee();
        if (_s == 6) {
            if (_appeal.user == _appeal.buyer) {
                _rSt.subAvaAppeal(
                    _appeal.seller,
                    _appeal.buyer,
                    _appeal,
                    _fee,
                    2,
                    0
                );
                chanT(_appeal.seller, _appeal.buyer, 2, 2);
                _rSt.subFrozenTotal(_o, _appeal.buyer);
            } else if (_appeal.user == _appeal.seller) {
                _rSt.subAvaAppeal(
                    _appeal.buyer,
                    _appeal.seller,
                    _appeal,
                    _fee,
                    2,
                    0
                );
                chanT(_appeal.seller, _appeal.buyer, 2, 1);
                _rSt.subFrozenTotal(_o, _appeal.seller);
            }
            if (_appeal.detail.witnessAppealStatus == 3) {
                _appeal.detail.witSub = _subWF;
                _appeal.detail.witCreditS = _subWC;
                if (_appeal.detail.witnessHandleCredit >= _subWC) {
                    _appeal.detail.witnessHandleCredit = SafeMath.sub(
                        _appeal.detail.witnessHandleCredit,
                        _subWC
                    );
                } else {
                    _appeal.detail.witnessHandleCredit = 0;
                }
                _rSt.subWitnessAvailable(_appeal.witness);
            }
        }
        if (_s == 7) {
            if (_appeal.user == _appeal.buyer) {
                _rSt.subAvaAppeal(
                    _appeal.buyer,
                    _appeal.seller,
                    _appeal,
                    _fee,
                    2,
                    1
                );
                chanT(_appeal.seller, _appeal.buyer, 2, 1);
                _rSt.subFrozenTotal(_o, _appeal.seller);
            } else if (_appeal.user == _appeal.seller) {
                _rSt.subAvaAppeal(
                    _appeal.seller,
                    _appeal.buyer,
                    _appeal,
                    _fee,
                    2,
                    1
                );
                chanT(_appeal.seller, _appeal.buyer, 2, 2);
                _rSt.subFrozenTotal(_o, _appeal.buyer);
            }
            if (_appeal.detail.witnessAppealStatus == 2) {
                _appeal.detail.witSub = _subWF;
                _appeal.detail.witCreditS = _subWC;
                if (_appeal.detail.witnessHandleCredit >= _subWC) {
                    _appeal.detail.witnessHandleCredit = SafeMath.sub(
                        _appeal.detail.witnessHandleCredit,
                        _subWC
                    );
                } else {
                    _appeal.detail.witnessHandleCredit = 0;
                }
                _rSt.subWitnessAvailable(_appeal.witness);
            }
        }
        _appeal.detail.updateTime = block.timestamp;
        appeals[_o] = _appeal;
        appealList[appealIndex[_o]] = _appeal;
    }
    function searchAppeal(uint256 _o)
        external
        view
        returns (Appeal memory appeal)
    {
        return appeals[_o];
    }
    function searchAppealList() external view returns (Appeal[] memory) {
        return appealList;
    }
}

File 3 of 6: OrderStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./RecordInterface.sol";
import "./RestStorage.sol";
import "./UserStorage.sol";
import "./RecordStorage.sol";
import "./AppealStorage.sol";
abstract contract ReentrancyGuardOrder {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}
library CountersOrder {
    struct Counter {
        uint256 _value;
    }
    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }
    function increment(Counter storage counter) internal {
        {
            if (counter._value == 0) {
                counter._value = 10000;
            }
            counter._value += 1;
        }
    }
    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}
contract OrderStorage is Ownable, ReentrancyGuardOrder {
    using CountersOrder for CountersOrder.Counter;
    RestStorage private _restStorage;
    RecordInterface private _recordStorage;
    UserInterface private _userStorage;
    AppealInterface private _appealS;
    address recordAddress;
    struct Order {
        address userAddr;
        uint256 orderNo;
        uint256 restNo;
        uint256 coinCount;
        uint256 orderAmount;
        uint256 payType;
        string currencyType;
        uint256 orderType;
        uint256 orderStatus;
        OrderDetail orderDetail;
    }
    struct OrderDetail {
        address buyerAddr;
        address sellerAddr;
        string coinType;
        uint256 price;
        uint256 tradeTime;
        uint256 updateTime;
        string tradeHash;
        uint256 tradeFee;
    }
    CountersOrder.Counter private _orderNoCounter;
    mapping(uint256 => Order) private orders;
    mapping(uint256 => uint256) private orderIndex;
    Order[] private orderList;
    mapping(address => mapping(uint256 => uint256)) orderFrozenTotal;
    uint256 cancelOrderTime = 30;
    function setCancelOrderTime(uint256 _count) public onlyOwner {
        cancelOrderTime = _count;
    }
    function getCancelOrderTime() public view returns (uint256) {
        return cancelOrderTime;
    }
    uint256 canWithdrawHours = 24;
    function setCanWithdrawHours(uint256 _count) public onlyOwner {
        canWithdrawHours = _count;
    }
    function getCanWithdrawHours() public view returns (uint256) {
        return canWithdrawHours;
    }
    event OrderAdd(
        uint256 _orderNo,
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _tradeFee,
        uint256 _orderAmount,
        uint256 _payType,
        uint256 _orderType,
        address _buyerAddr,
        address _sellerAddr
    );
    event OrderPaidMoney(uint256 _orderNo);
    event OrderConfirmCollect(uint256 _orderNo);
    event OrderCancel(uint256 _orderNo);
    event OrderUpdateStatus(uint256 _orderNo, uint256 _orderStatus);
    function authFromContract(
        address _recordAddr,
        address _restAddr,
        address _userAddr,
        address _appealAddr
    ) external onlyOwner {
        _recordStorage = RecordInterface(_recordAddr);
        _restStorage = RestStorage(_restAddr);
        _userStorage = UserInterface(_userAddr);
        recordAddress = _recordAddr;
        _appealS = AppealInterface(_appealAddr);
        _orderNoCounter.increment();
    }
    modifier onlyBuyer(uint256 _orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderDetail.buyerAddr == msg.sender,
            "only buyer"
        );
        _;
    }
    modifier onlySeller(uint256 _orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderDetail.sellerAddr == msg.sender,
            "only seller"
        );
        _;
    }
    modifier onlyBuyerOrSeller(uint256 _orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderDetail.sellerAddr == msg.sender ||
                orders[_orderNo].orderDetail.buyerAddr == msg.sender,
            "Only buyer or seller"
        );
        _;
    }
    function _checkParam(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _orderAmount,
        uint256 _payType
    ) internal pure {
        require(_restNo != uint256(0), "restNo null");
        require(_coinCount > 0, "coinCount null");
        require(_orderAmount > 0, "orderAmount null");
        require(_payType != uint256(0), "payType null");
    }
    function _insert(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _tradeFee,
        uint256 _orderAmount,
        uint256 _payType,
        uint256 _orderType,
        address _buyerAddr,
        address _sellerAddr
    ) internal nonReentrant returns (uint256 restNo) {
        _checkParam(_restNo, _coinCount, _orderAmount, _payType);
        RestStorage.Rest memory _rest = _restStorage.searchRest(_restNo);
        require(_rest.userAddr != address(0), "rest not exist");
        OrderDetail memory _orderDetail = OrderDetail({
            buyerAddr: _buyerAddr,
            sellerAddr: _sellerAddr,
            coinType: _rest.coinType,
            price: _rest.price,
            tradeTime: block.timestamp,
            updateTime: 0,
            tradeHash: "",
            tradeFee: _tradeFee
        });
        uint256 _orderNo = _orderNoCounter.current();
        require(orders[_orderNo].orderNo == uint256(0), "order exist");
        Order memory order = Order({
            userAddr: msg.sender,
            orderNo: _orderNo,
            restNo: _restNo,
            coinCount: _coinCount,
            orderAmount: _orderAmount,
            payType: _payType,
            currencyType: _rest.currencyType,
            orderType: _orderType,
            orderStatus: 1,
            orderDetail: _orderDetail
        });
        orders[_orderNo] = order;
        orderList.push(order);
        orderIndex[_orderNo] = orderList.length - 1;
        if (_orderType == 2) {
            orderFrozenTotal[msg.sender][_orderNo] = _coinCount;
        } else if (_orderType == 1) {
            orderFrozenTotal[_rest.userAddr][_orderNo] = _coinCount;
        }
        _orderNoCounter.increment();
        emit OrderAdd(
            _orderNo,
            _restNo,
            _coinCount,
            _tradeFee,
            _orderAmount,
            _payType,
            _orderType,
            _buyerAddr,
            _sellerAddr
        );
        return _orderNo;
    }
    function addBuyOrder(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _orderAmount,
        uint256 _payType
    ) external {
        RestStorage.Rest memory _rest = _restStorage.searchRest(_restNo);
        require(_rest.userAddr != msg.sender, "rest not exist");
        require(_rest.restType == 2, "sell rest not exist");
        require(_coinCount > 0 && _orderAmount > 0, "coin count error");
        require(_rest.restStatus == 1, "rest status error");
        UserStorage.User memory _currentUser = _userStorage.searchUser(
            msg.sender
        );
        require(
            _currentUser.userFlag != 1 && _currentUser.userFlag != 2,
            "invalid user"
        );
        uint256 _restFrozen = _restStorage.getRestFrozenTotal(
            _rest.userAddr,
            _restNo
        );
        require(_restFrozen >= _coinCount, "coin not enough");
        uint256 _amo = SafeMath.mul(_rest.price, _coinCount);
        require(
            _amo >= _rest.restDetail.limitAmountFrom &&
                _amo <= _rest.restDetail.limitAmountTo,
            "amount error"
        );
        require(
            _currentUser.credit >= _rest.restDetail.limitMinCredit,
            "credit error"
        );
        require(
            _currentUser.morgageStats.mortgage >=
                _rest.restDetail.limitMinMortgage,
            "mortgage error"
        );
        _restStorage.updateRestFinishCount(_restNo, _coinCount);
        _insert(
            _restNo,
            _coinCount,
            0,
            _orderAmount,
            _payType,
            1,
            msg.sender,
            _rest.userAddr
        );
    }
    function addSellOrder(
        uint256 _restNo,
        uint256 _coinCount,
        uint256 _tradeFee,
        uint256 _orderAmount,
        uint256 _payType
    ) external {
        RestStorage.Rest memory _rest = _restStorage.searchRest(_restNo);
        require(_rest.userAddr != msg.sender, "rest not exist");
        require(_rest.restType == 1, "buy rest not exist");
        require(_coinCount > 0, "coin count error");
        require(_orderAmount > 0, "orderAmount error");
        require(_rest.restStatus == 1, "rest status error");
        uint256 _amo = SafeMath.mul(_rest.price, _coinCount);
        require(
            _amo >= _rest.restDetail.limitAmountFrom &&
                _amo <= _rest.restDetail.limitAmountTo,
            "amount error"
        );
        UserStorage.User memory _currentUser = _userStorage.searchUser(
            msg.sender
        );
        require(
            _currentUser.userFlag != 1 && _currentUser.userFlag != 2,
            "invalid user"
        );
        require(
            _currentUser.credit >= _rest.restDetail.limitMinCredit,
            "credit error"
        );
        require(
            _currentUser.morgageStats.mortgage >=
                _rest.restDetail.limitMinMortgage,
            "mortgage error"
        );
        uint256 _needSub = SafeMath.add(_coinCount, _tradeFee);
        _restStorage.updateRestFinishCount(_restNo, _coinCount);
        _insert(
            _restNo,
            _coinCount,
            _tradeFee,
            _orderAmount,
            _payType,
            2,
            _rest.userAddr,
            msg.sender
        );
        TokenTransfer _tokenTransfer = _recordStorage.getERC20Address(
            _rest.coinType
        );
        _tokenTransfer.transferFrom(msg.sender, recordAddress, _needSub);
        _recordStorage.addRecord(
            msg.sender,
            "",
            _rest.coinType,
            _coinCount,
            2,
            1,
            2
        );
    }
    function setPaidMoney(uint256 _orderNo)
        external
        onlyBuyer(_orderNo)
        returns (bool)
    {
        _updateOrderStatus(_orderNo, 2);
        emit OrderPaidMoney(_orderNo);
        return true;
    }
    function confirmCollect(uint256 _orderNo) external onlySeller(_orderNo) {
        require(_orderNo != uint256(0), "orderNo null");
        Order memory _order = orders[_orderNo];
        require(_order.orderStatus == 2, "Invalid order status");
        require(
            _order.orderDetail.buyerAddr != address(0),
            "Invalid buyer address"
        );
        require(
            orderFrozenTotal[msg.sender][_orderNo] >= _order.coinCount,
            "coin not enough"
        );
        _updateOrderStatus(_orderNo, 3);
        orderFrozenTotal[msg.sender][_orderNo] = 0;
        uint256 _rc = _recordStorage.getTradeCredit();
        UserStorage.User memory _user = _userStorage.searchUser(msg.sender);
        uint256 _credit = _user.credit + _rc;
        UserStorage.TradeStats memory _tradeStats = _user.tradeStats;
        _tradeStats.tradeTotal += 1;
        _userStorage.updateTradeStats(msg.sender, _tradeStats, _credit);
        UserStorage.User memory _user2 = _userStorage.searchUser(
            _order.orderDetail.buyerAddr
        );
        uint256 _credit2 = _user2.credit + _rc;
        UserStorage.TradeStats memory _tradeStats2 = _user2.tradeStats;
        _tradeStats2.tradeTotal += 1;
        _userStorage.updateTradeStats(
            _order.orderDetail.buyerAddr,
            _tradeStats2,
            _credit2
        );
        _recordStorage.subFrozenTotal(_orderNo, _order.orderDetail.buyerAddr);
        emit OrderConfirmCollect(_orderNo);
    }
    function cancelOrder(uint256 _orderNo)
        external
        onlyBuyerOrSeller(_orderNo)
        returns (bool)
    {
        Order memory _order = orders[_orderNo];
        require(_order.orderNo != uint256(0), "current Order not exist");
        require(_order.orderStatus == 1, "Can't cancel order");
        if (_order.orderDetail.sellerAddr == msg.sender) {
            require(
                _order.orderDetail.tradeTime + cancelOrderTime * 1 minutes <
                    block.timestamp,
                "limit"
            );
        }
        RestStorage.Rest memory _rest = _restStorage.searchRest(_order.restNo);
        if (_rest.restStatus == 4 || _rest.restStatus == 5) {
            orderFrozenTotal[_order.orderDetail.sellerAddr][_orderNo] = 0;
            _recordStorage.addAvailableTotal(
                _order.orderDetail.sellerAddr,
                _order.orderDetail.coinType,
                _order.coinCount
            );
        } else {
            if (_order.orderType == 2) {
                orderFrozenTotal[_order.orderDetail.sellerAddr][_orderNo] = 0;
                _recordStorage.addAvailableTotal(
                    _order.orderDetail.sellerAddr,
                    _order.orderDetail.coinType,
                    _order.coinCount
                );
            }
            _restStorage.addRestRemainCount(_order.restNo, _order.coinCount);
        }
        _updateOrderStatus(_orderNo, 4);
        emit OrderCancel(_orderNo);
        return true;
    }
    function takeCoin(uint256 _o) external onlyBuyerOrSeller(_o) {
        AppealStorage.Appeal memory _appeal = _appealS.searchAppeal(_o);
        require(
            block.timestamp - _appeal.detail.witnessHandleTime >
                canWithdrawHours * 1 hours,
            "time error"
        );
        address _win;
        if (_appeal.user == _appeal.buyer) {
            if (_appeal.status == 2) {
                _win = _appeal.buyer;
            } else if (_appeal.status == 3) {
                _win = _appeal.seller;
            }
        } else {
            if (_appeal.status == 2) {
                _win = _appeal.seller;
            } else if (_appeal.status == 3) {
                _win = _appeal.buyer;
            }
        }
        require(_win == msg.sender, "opt error");
        _updateOrderStatus(_o, 5);
        orderFrozenTotal[_appeal.seller][_o] = 0;
        _recordStorage.subFrozenTotal(_o, msg.sender);
    }
    function _updateOrderStatus(uint256 _orderNo, uint256 _orderStatus)
        internal
        onlyBuyerOrSeller(_orderNo)
    {
        Order memory order = orders[_orderNo];
        require(order.orderNo != uint256(0), "current Order not exist");
        require(_orderStatus >= 1 && _orderStatus <= 5, "Invalid order status");
        if (_orderStatus == 2 && order.orderStatus != 1) {
            revert("Invalid order status 2");
        }
        if (_orderStatus == 3 && order.orderStatus != 2) {
            revert("Invalid order status 3");
        }
        if (_orderStatus == 4 && order.orderStatus != 1) {
            revert("Invalid order status 4");
        }
        if (
            _orderStatus == 5 &&
            order.orderStatus != 1 &&
            order.orderStatus != 2
        ) {
            revert("Invalid order status 5");
        }
        if (_orderStatus == 2) {
            require(
                order.orderDetail.buyerAddr == msg.sender,
                "only buyer call"
            );
        }
        if (_orderStatus == 3) {
            require(
                order.orderDetail.sellerAddr == msg.sender,
                "only seller call"
            );
        }
        order.orderStatus = _orderStatus;
        order.orderDetail.updateTime = block.timestamp;
        orders[_orderNo] = order;
        orderList[orderIndex[_orderNo]] = order;
        emit OrderUpdateStatus(_orderNo, _orderStatus);
    }
    function searchOrder(uint256 _orderNo)
        external
        view
        returns (Order memory order)
    {
        require(_orderNo != uint256(0), "orderNo null");
        require(
            orders[_orderNo].orderNo != uint256(0),
            "current Order not exist"
        );
        Order memory o = orders[_orderNo];
        return o;
    }
    function searchOrderList() external view returns (Order[] memory) {
        return orderList;
    }
    function searchListByRest(uint256 _restNo)
        external
        view
        returns (Order[] memory)
    {
        Order[] memory resultList = new Order[](orderList.length);
        for (uint256 i = 0; i < orderList.length; i++) {
            Order memory _order = orderList[i];
            if (_order.restNo == _restNo) {
                resultList[i] = _order;
            }
        }
        return resultList;
    }
}

File 4 of 6: RecordInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./RestStorage.sol";
import "./OrderStorage.sol";
import "./UserStorage.sol";
import "./RecordStorage.sol";
import "./AppealStorage.sol";
interface RecordInterface {
    function getErcBalance(string memory _coinType, address _addr)
        external
        returns (uint256);
    function getAvailableTotal(address _addr, string memory _coinType)
        external
        returns (uint256);
    function getFrozenTotal(address _addr, string memory _coinType)
        external
        returns (uint256);
    function addAvailableTotal(
        address _addr,
        string memory _coinType,
        uint256 remainHoldCoin
    ) external;
    function subAvaAppeal(
        address _from,
        address _to,
        AppealStorage.Appeal memory _al,
        uint256 _amt,
        uint256 _type,
        uint256 _self
    ) external;
    function subWitnessAvailable(address _addr) external;
    function getERC20Address(string memory _coinType)
        external
        returns (TokenTransfer);
    function subFrozenTotal(uint256 _orderNo, address _addr) external;
    function addRecord(
        address _addr,
        string memory _tradeHash,
        string memory _coinType,
        uint256 _hostCount,
        uint256 _hostStatus,
        uint256 _hostType,
        uint256 _hostDirection
    ) external;
    function getAppealFee() external view returns (uint256);
    function getAppealFeeFinal() external view returns (uint256);
    function getWitnessHandleReward() external view returns (uint256);
    function getObserverHandleReward() external view returns (uint256);
    function getWitnessHandleCredit() external view returns (uint256);
    function getObserverHandleCredit() external view returns (uint256);
    function getSubWitCredit() external view returns (uint256);
    function getOpenTrade() external view returns (bool);
    function getTradeCredit() external view returns (uint256);
    function getSubTCredit() external view returns (uint256);
    function getSubWitFee() external view returns (uint256);
}
interface RestInterface {
    function searchRest(uint256 _restNo)
        external
        returns (RestStorage.Rest memory rest);
    function getRestFrozenTotal(address _addr, uint256 _restNo)
        external
        returns (uint256);
    function updateRestFinishCount(uint256 _restNo, uint256 _coinCount)
        external
        returns (uint256);
    function addRestRemainCount(uint256 _restNo, uint256 _remainCount)
        external
        returns (uint256);
}
interface OrderInterface {
    function searchOrder(uint256 _orderNo)
        external
        returns (OrderStorage.Order memory order);
}
interface UserInterface {
    function searchUser(address _addr)
        external
        view
        returns (UserStorage.User memory user);
    function searchWitnessList(uint256 _userFlag)
        external
        returns (UserStorage.User[] memory userList);
    function updateTradeStats(
        address _addr,
        UserStorage.TradeStats memory _tradeStats,
        uint256 _credit
    ) external;
    function updateMorgageStats(
        address _addr,
        UserStorage.MorgageStats memory _morgageStats
    ) external;
    function updateUserRole(address _addr, uint256 _userFlag) external;
}
interface AppealInterface {
    function searchAppeal(uint256 _o)
        external
        view
        returns (AppealStorage.Appeal memory appeal);
}

File 5 of 6: RestStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./RecordInterface.sol";
import "./UserStorage.sol";
import "./RecordStorage.sol";
abstract contract ReentrancyGuardRest {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}
library CountersRest {
    struct Counter {
        uint256 _value; 
    }
    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }
    function increment(Counter storage counter) internal {
        {
            if (counter._value == 0) {
				counter._value = 10000;
			}
            counter._value += 1;
        }
    }
    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}
contract RestStorage is Ownable,ReentrancyGuardRest {
    using CountersRest for CountersRest.Counter;
    RecordInterface private _recordStorage;
    UserInterface private _userStorage;
    address recordAddress;
    struct Rest {
        address userAddr; 
        uint restNo; 
        uint restType; 
        string coinType; 
        string currencyType; 
        uint restCount; 
        uint price; 
        uint[] payType; 
        uint restStatus; 
        RestDetail restDetail; 
    }
    struct RestDetail {
        uint finishCount; 
        uint remainderCount; 
        uint limitAmountFrom; 
        uint limitAmountTo; 
        uint limitMinCredit; 
        uint limitMinMortgage; 
        string restRemark; 
        uint restTime; 
        uint updateTime; 
        uint restFee;
        string restHash;
    }
    CountersRest.Counter private _restNoCounter;
    mapping (uint => Rest) private rests;
    mapping (uint => uint) private restIndex;
    Rest[] private restList; 
	mapping(address=>mapping(uint=>uint)) restFrozenTotal;
    event RestAdd(uint _restNo, uint _restType, string  _coinType, string  _currencyType, uint _restCount, uint _price, uint[] _payType,RestDetail _restDetail);
    event RestUpdate(uint _restNo, string _coinType, string _currencyType, uint _restCount, uint _price,uint[] _payType, RestDetail _restDetail);
	address _orderCAddr;
	modifier onlyAuthFromAddr() {
        require(_orderCAddr == msg.sender, 'Invalid contract address');
		_;
	}
	function authFromContract(address _recordAddr, address _userAddr, address _orderAddr) external onlyOwner {
		_orderCAddr = _orderAddr;
        _recordStorage = RecordInterface(_recordAddr);
        _userStorage = UserInterface(_userAddr);
        recordAddress = _recordAddr;
        _restNoCounter.increment();
	}
    modifier onlyRestOwner(uint _restNo) {
		require(rests[_restNo].userAddr == msg.sender, "rest address not exist");
        _;
    }
     function _checkParam(uint _restType, string memory _coinType, string memory _currencyType, 
                        uint _restCount, uint _price, uint[] memory _payType) pure internal {
        require(_restType != uint(0), "RestStorage: restType null is not allowed");
        require(bytes(_coinType).length != 0, "RestStorage: coinType null is not allowed");
        require(bytes(_currencyType).length != 0, "RestStorage: currencyType null is not allowed");
        require(_restCount != uint(0), "RestStorage: restCount null is not allowed");
        require(_price != uint(0), "RestStorage: price null is not allowed");
        require(_payType.length != 0, "RestStorage: payType null is not allowed");
	}
    function _insert(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount, uint _price, uint[] memory _payType, RestDetail memory _restDetail) internal nonReentrant returns(uint){
		_checkParam(_restType, _coinType, _currencyType, _restCount, _price, _payType);
		uint _restNo = _restNoCounter.current();
        require(rests[_restNo].restNo == uint(0), "rest exist");
		_restDetail.finishCount = 0;
		_restDetail.remainderCount = _restCount;
		_restDetail.restTime = block.timestamp;
		_restDetail.updateTime = 0;
        if(_restDetail.limitAmountTo > SafeMath.mul(_restCount, _price) || _restDetail.limitAmountTo == 0) {
            _restDetail.limitAmountTo = SafeMath.mul(_restCount, _price);
        }
 		Rest memory r = Rest({userAddr: msg.sender, restNo: _restNo, restType:_restType,
         coinType:_coinType, currencyType:_currencyType,
        restCount:_restCount, price:_price,
        payType:_payType, restStatus:1, restDetail: _restDetail});
        rests[_restNo] = r;
		restList.push(r);
		restIndex[_restNo] = restList.length-1;
        _restNoCounter.increment();
		emit RestAdd(_restNo, _restType, _coinType, _currencyType, _restCount, _price, _payType, _restDetail);
		return _restNo;
	}
    function _updateInfo(uint _restNo, string memory _coinType, string memory _currencyType, 
    uint _addCount, uint _price, uint[] memory _payType, RestDetail memory _restDetail) internal {
		require(_restNo != uint(0), 'Invalid restNo');
		Rest memory r = rests[_restNo];
		r.restStatus = 1;
		if(bytes(_coinType).length != 0){
			r.coinType = _coinType;
		}
		if(bytes(_currencyType).length != 0){
			r.currencyType = _currencyType;
		}
		if(_price != uint(0)){
			r.price = _price;
		}
        if(_addCount != uint(0)){
			r.restCount += _addCount;
            r.restDetail.remainderCount += _addCount;
            r.restDetail.limitAmountTo = SafeMath.mul(r.restDetail.remainderCount, r.price);
		}
        if(_payType.length != 0){
			r.payType = _payType;
		}
        if(_restDetail.limitAmountFrom != uint(0)){
            if(_restDetail.limitAmountFrom > r.restDetail.limitAmountTo) {
                _restDetail.limitAmountFrom = r.restDetail.limitAmountTo;
            }
            r.restDetail.limitAmountFrom = _restDetail.limitAmountFrom;
		}
        if(_restDetail.limitMinCredit != uint(0)){
			r.restDetail.limitMinCredit = _restDetail.limitMinCredit;
		}
        if(_restDetail.limitMinMortgage != uint(0)){
			r.restDetail.limitMinMortgage = _restDetail.limitMinMortgage;
		}
        if(bytes(_restDetail.restRemark).length != 0){
			r.restDetail.restRemark = _restDetail.restRemark;
		}
		if(_restDetail.restFee != uint(0)){
			r.restDetail.restFee = _restDetail.restFee;
		}
        r.restDetail.updateTime = block.timestamp;
		rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
        emit RestUpdate(_restNo, _coinType, _currencyType, r.restCount, _price, _payType, _restDetail);
	}
	function addBuyRest(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount, uint _price, uint[] memory _payType,RestDetail memory _restDetail) external {
        require(_restType == 1, "must buy rest" );
        UserStorage.User memory _user = _userStorage.searchUser(msg.sender);
        bool _openTrade = _recordStorage.getOpenTrade();
        require(_openTrade || _user.userFlag == 3, "invalid user" );
        _insert(_restType, _coinType, _currencyType, _restCount, _price, _payType, _restDetail);
	}
	function _addSell(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount, uint _restFee, uint _price, uint[] memory _payType,RestDetail memory _restDetail) internal {
	    require(_restType == 2, "must sell rest" );
        require(_restCount > 0, "restCount error");
        UserStorage.User memory _user = _userStorage.searchUser(msg.sender);
        bool _openTrade = _recordStorage.getOpenTrade();
        require(_openTrade || _user.userFlag == 3, "invalid user" );
        _recordStorage.addRecord(msg.sender, '', _coinType, _restCount, 2, 1, 2);
        uint _needSub = SafeMath.add(_restCount, _restFee);
        TokenTransfer _tokenTransfer = _recordStorage.getERC20Address(_coinType);
		_tokenTransfer.transferFrom(msg.sender, recordAddress, _needSub);
        uint _newRestNo = _insert(_restType, _coinType, _currencyType, _restCount, _price, _payType, _restDetail);
        restFrozenTotal[msg.sender][_newRestNo] = _restCount;
	}
	function addSellRest(uint _restType, string memory _coinType, string memory _currencyType, 
    uint _restCount,uint _restFee, uint _price, uint[] memory _payType,RestDetail memory _restDetail) external {
        _addSell(_restType, _coinType, _currencyType, _restCount,_restFee,_price, _payType, _restDetail);
	}
	function getRestFrozenTotal(address _addr, uint _restNo) public view returns(uint) {
	    return restFrozenTotal[_addr][_restNo];
	}
	function cancelBuyRest(uint _restNo) external onlyRestOwner(_restNo) {
        require(rests[_restNo].restStatus == 1, "can't change this rest");
        require(rests[_restNo].restType == 1, "Invalid rest type");
        require(rests[_restNo].restDetail.finishCount < rests[_restNo].restCount, "this rest has finished");
        Rest memory r = rests[_restNo];
        r.restStatus = 4;
        r.restDetail.updateTime = block.timestamp;
        rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
    }
    function _cancelSell(uint _restNo) onlyRestOwner(_restNo) internal {
        require(rests[_restNo].restStatus == 1, "can't cancel this rest");
        require(rests[_restNo].restType == 2, "Invalid rest type");
        require(rests[_restNo].restDetail.finishCount < rests[_restNo].restCount, "this rest has finished");
        require(restFrozenTotal[msg.sender][_restNo] > 0, "rest has finished");
        uint _frozenTotal = _recordStorage.getFrozenTotal(msg.sender, rests[_restNo].coinType);
        require(_frozenTotal >= restFrozenTotal[msg.sender][_restNo], "can't cancel this rest");
        uint remainHoldCoin = restFrozenTotal[msg.sender][_restNo];
        Rest memory r = rests[_restNo];
        r.restStatus = 4;
        if (remainHoldCoin < rests[_restNo].restCount) {
            r.restStatus = 5;
        }
        r.restDetail.remainderCount = 0;
        r.restDetail.updateTime = block.timestamp;
        rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
        restFrozenTotal[msg.sender][_restNo] = 0;
        _recordStorage.addAvailableTotal(msg.sender, rests[_restNo].coinType, remainHoldCoin);
    }
    function cancelSellRest(uint _restNo) external{
        _cancelSell(_restNo);
    }
    function startOrStop(uint _restNo, uint _restStatus) external onlyRestOwner(_restNo){
        require(_restStatus == 1 || _restStatus == 3, "Invalid rest status");
        Rest memory r = rests[_restNo];
        require(r.restStatus == 1 || r.restStatus == 3, "Invalid rest status,opt error");
        r.restStatus = _restStatus;
        r.restDetail.updateTime = block.timestamp;
        rests[_restNo] = r;
        restList[restIndex[_restNo]] = r;
    }
	function updateInfo(uint _restNo, string memory _coinType, string memory _currencyType, 
    uint _addCount, uint _restFee, uint _price,uint[] memory _payType, RestDetail memory _restDetail) external onlyRestOwner(_restNo){
		require(_restNo != uint(0), 'Invalid restNo');
		Rest memory _rest = rests[_restNo];
		require(_rest.restNo != uint(0), 'rest not exist');
		if (_rest.restType == 2) {
            _recordStorage.addRecord(msg.sender, '', _coinType, _addCount, 2, 1, 2);
            uint _needSub = SafeMath.add(_addCount, _restFee);
            TokenTransfer _tokenTransfer = _recordStorage.getERC20Address(_coinType);
            _tokenTransfer.transferFrom(msg.sender, recordAddress, _needSub);
            restFrozenTotal[msg.sender][_restNo] += _addCount;
		}
        _updateInfo(_restNo, _coinType, _currencyType, _addCount, _price, _payType, _restDetail);
	}
    function updateRestFinishCount(uint _restNo, uint _finishCount) onlyAuthFromAddr external {
        Rest memory _rest = rests[_restNo];
        require(_rest.restDetail.remainderCount >= _finishCount, "RestStorage:finish count error");
        if (_rest.restType == 2) {
            restFrozenTotal[_rest.userAddr][_restNo] = SafeMath.sub(restFrozenTotal[_rest.userAddr][_restNo], _finishCount);
        }
        _rest.restDetail.finishCount = SafeMath.add(_rest.restDetail.finishCount, _finishCount);
        _rest.restDetail.remainderCount = SafeMath.sub(_rest.restDetail.remainderCount, _finishCount);
        _rest.restDetail.limitAmountTo = SafeMath.mul(_rest.price, _rest.restDetail.remainderCount);
        if (_rest.restDetail.remainderCount == 0) {
            _rest.restStatus = 2;
        }
        _rest.restDetail.updateTime = block.timestamp;
		rests[_restNo] = _rest;
        restList[restIndex[_restNo]] = _rest;
    }
    function addRestRemainCount(uint _restNo, uint _remainCount) onlyAuthFromAddr public {
        Rest memory _rest = rests[_restNo];
        require(_remainCount > 0 && _rest.restDetail.finishCount >= _remainCount, "count error");
        if (_rest.restType == 2) {
            restFrozenTotal[_rest.userAddr][_restNo] = SafeMath.add(restFrozenTotal[_rest.userAddr][_restNo], _remainCount);
        }
        _rest.restDetail.finishCount = SafeMath.sub(_rest.restDetail.finishCount, _remainCount);
        _rest.restDetail.remainderCount = SafeMath.add(_rest.restDetail.remainderCount, _remainCount);
        _rest.restDetail.limitAmountTo = SafeMath.mul(_rest.price, _rest.restDetail.remainderCount);
        _rest.restDetail.limitAmountFrom = _rest.restDetail.limitAmountFrom > _rest.restDetail.limitAmountTo ? _rest.restDetail.limitAmountTo : _rest.restDetail.limitAmountFrom;
        _rest.restStatus = 1;
        _rest.restDetail.updateTime = block.timestamp;
		rests[_restNo] = _rest;
        restList[restIndex[_restNo]] = _rest;
    }
	function searchRest(uint _restNo) external view returns(Rest memory rest) {
	    require(_restNo != uint(0), "restNo null is not allowed");
		Rest memory r = rests[_restNo];
		return r;
	}
	function searchRestList() external view returns(Rest[] memory) {
        return restList;
	}
}

File 6 of 6: UserStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract UserStorage is Ownable {
    struct User {
        address userAddr; 
        string avatar; 
        string email;  
        uint isOnline; 
        uint userFlag; 
        uint256 credit; 
        uint regTime; 
        TradeStats tradeStats; 
        MorgageStats morgageStats; 
    }
    struct TradeStats {
        uint256 tradeTotal;
        uint256 restTotal; 
    }
    struct MorgageStats {
        uint256 mortgage; 
        uint256 freezeMortgage; 
        uint256 relieveMortgage; 
        uint256 inviteUserCount; 
        uint256 inviteUserReward; 
        uint applyRelieveTime; 
        uint handleRelieveTime; 
    }
    mapping (address => User) public users;
    mapping (address => uint256) public userIndex;
    User[] public userList; 
    event addUser(address _userAddr);
    event updateUser(string _avatar, string _email, uint _isOnline);
	address _restCAddr;
	address _orderCAddr;
	address _recordCAddr;
	address _appealCAddr;
	modifier onlyAuthFromAddr() {
		require(_restCAddr != address(0), 'Invalid address call rest');
		require(_orderCAddr != address(0), 'Invalid address call order');
		require(_recordCAddr != address(0), 'Invalid address call record');
		require(_appealCAddr != address(0), 'Invalid address call appeal');
		_;
	}
	function authFromContract(address _fromRest, address _fromOrder, address _fromRecord, address _fromAppeal) external onlyOwner {
		_restCAddr = _fromRest;
		_orderCAddr = _fromOrder;
		_recordCAddr = _fromRecord;
		_appealCAddr = _fromAppeal;
	}
    modifier onlyMemberOf() {
        require(users[msg.sender].userAddr != address(0), 'has no permission');
        _;
    }
    function _insert(address _addr) internal {
		require(_addr != address(0), "UserStorage: addr null is not allowed");
		require(users[_addr].userAddr == address(0), "UserStorage: current User exist");
		TradeStats memory tradeStats = TradeStats({tradeTotal:0, restTotal:0});
        MorgageStats memory morgageStats = MorgageStats({mortgage:0, freezeMortgage:0, relieveMortgage: 0, inviteUserCount:0, inviteUserReward:0, applyRelieveTime:0, handleRelieveTime:0});
 		User memory u = User({userAddr:_addr, avatar: '', email:'',
        isOnline:1, userFlag:0, credit:0, regTime:block.timestamp,tradeStats:tradeStats, morgageStats:morgageStats});
        users[_addr] = u;
		userList.push(u);
		userIndex[_addr] = userList.length -1;
		emit addUser(_addr);
	}
	function _updateInfo(address _addr, string memory _avatar, string memory _email, uint _isOnline) internal {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory u = users[_addr];
		if(bytes(_avatar).length != 0){
			u.avatar = _avatar;
		}
		if(bytes(_email).length != 0){
			u.email = _email;
		}
		if(_isOnline != uint(0)){
			u.isOnline = _isOnline;
		}
		users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
	function _updateTradeStats(address _addr, TradeStats memory _tradeStats, uint _credit) internal {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory u = users[_addr];
		u.credit = _credit;
		u.tradeStats.tradeTotal = _tradeStats.tradeTotal;
		u.tradeStats.restTotal = _tradeStats.restTotal;
		users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
	function _updateMorgageStats(address _addr, MorgageStats memory _morgageStats) internal {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory u = users[_addr];
		u.morgageStats.mortgage = _morgageStats.mortgage;
		u.morgageStats.freezeMortgage = _morgageStats.freezeMortgage;
		u.morgageStats.relieveMortgage = _morgageStats.relieveMortgage;
		u.morgageStats.inviteUserCount = _morgageStats.inviteUserCount;
		u.morgageStats.inviteUserReward = _morgageStats.inviteUserReward;
		u.morgageStats.applyRelieveTime = _morgageStats.applyRelieveTime;
		u.morgageStats.handleRelieveTime = _morgageStats.handleRelieveTime;
		users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
    function _search(address _addr) internal view returns(User memory user) {
		require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		User memory a = users[_addr];
		return a;
	}
	function register() external {
		require(!isMemberOf(), 'has registed');
		_insert(msg.sender);
	}
    function isMemberOf() public view returns (bool) {
        return (users[msg.sender].userAddr != address(0));
    }
	function updateInfo(string memory _avatar, string memory _email, uint _isOnline) onlyMemberOf external {
		_updateInfo(msg.sender, _avatar, _email, _isOnline);
		emit updateUser(_avatar, _email, _isOnline);
	}
	function updateTradeStats(address _addr, TradeStats memory _tradeStats, uint _credit) onlyAuthFromAddr public {
	    require(msg.sender == _restCAddr || msg.sender == _orderCAddr || msg.sender == _appealCAddr || msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
		_updateTradeStats(_addr, _tradeStats, _credit);
	}
	function updateMorgageStats(address _addr, MorgageStats memory _morgageStats) onlyAuthFromAddr public {
		require(msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
		_updateMorgageStats(_addr, _morgageStats);
	}
	function updateUserRole(address _addr, uint _userFlag) onlyAuthFromAddr public {
	    require(msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
	    require(_addr != address(0), "UserStorage: _addr null is not allowed");
		require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
		require(_userFlag<=3, 'UserStorage: Invalid userFlag 3');
		User memory u = users[_addr];
		u.userFlag = _userFlag;
	    users[_addr] = u;
		userList[userIndex[_addr]] = u;
	}
	function searchUser(address _addr) external view returns(User memory user) {
		return _search(_addr);
	}
	function searchUserList() external view returns(User[] memory) {
		return userList;
	}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_usdtAddress","type":"address"},{"internalType":"address","name":"_usdcAddress","type":"address"},{"internalType":"address","name":"_coinAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_recordNo","type":"uint256"},{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"string","name":"_tradeHash","type":"string"},{"indexed":false,"internalType":"string","name":"_coinType","type":"string"},{"indexed":false,"internalType":"uint256","name":"_hostCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_hostStatus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_hostType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_hostDirection","type":"uint256"}],"name":"RecordAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"RecordApplyUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_recordNo","type":"uint256"},{"indexed":false,"internalType":"string","name":"_hash","type":"string"},{"indexed":false,"internalType":"uint256","name":"_hostStatus","type":"uint256"}],"name":"RecordUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"string","name":"_coinType","type":"string"},{"indexed":false,"internalType":"uint256","name":"_lastAmount","type":"uint256"}],"name":"UnfrozenTotalTransfer","type":"event"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"addAvailableTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_tradeHash","type":"string"},{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"uint256","name":"_hostCount","type":"uint256"},{"internalType":"uint256","name":"_hostStatus","type":"uint256"},{"internalType":"uint256","name":"_hostType","type":"uint256"},{"internalType":"uint256","name":"_hostDirection","type":"uint256"}],"name":"addRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"applyUnfrozen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_recordNo","type":"uint256"}],"name":"applyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fromUser","type":"address"},{"internalType":"address","name":"_fromRest","type":"address"},{"internalType":"address","name":"_fromOrder","type":"address"},{"internalType":"address","name":"_fromAppeal","type":"address"}],"name":"authFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"availableTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"frozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAppealFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAppealFeeFinal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getAvailableTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCanWithdrawToTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"}],"name":"getCoinTypeMapping","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getCongressFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCongressNeedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"}],"name":"getERC20Address","outputs":[{"internalType":"contract TokenTransfer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"address","name":"_addr","type":"address"}],"name":"getErcBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getFrozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerchantNeedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getObserverHandleCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getObserverHandleReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOpenTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubTCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubWitCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubWitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTradeCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getUnfrozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"getWithdrawingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getWitnessFlag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWitnessHandleCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWitnessHandleReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWitnessNeedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"punishPerson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recordIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recordList","outputs":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"records","outputs":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_recordNo","type":"uint256"}],"name":"searchRecord","outputs":[{"components":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"internalType":"struct RecordStorage.Record","name":"record","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"searchRecordList","outputs":[{"components":[{"internalType":"uint256","name":"recordNo","type":"uint256"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"string","name":"tradeHash","type":"string"},{"internalType":"string","name":"coinType","type":"string"},{"internalType":"uint256","name":"hostCount","type":"uint256"},{"internalType":"uint256","name":"hostStatus","type":"uint256"},{"internalType":"uint256","name":"hostType","type":"uint256"},{"internalType":"uint256","name":"hostDirection","type":"uint256"},{"internalType":"uint256","name":"hostTime","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"internalType":"struct RecordStorage.Record[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setAppealFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setAppealFeeFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"setCanWithdrawToTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"address","name":"_coinTypeAddr","type":"address"}],"name":"setCoinTypeMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_flag","type":"uint256"}],"name":"setCongressFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setCongressNeedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMerchantNeedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setObserverHandleCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setObserverHandleReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_c","type":"bool"}],"name":"setOpenTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSubTCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSubWitCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSubWitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setTradeCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_flag","type":"uint256"}],"name":"setWitnessFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setWitnessHandleCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setWitnessHandleReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setWitnessNeedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"appealNo","type":"uint256"},{"internalType":"uint256","name":"orderNo","type":"uint256"},{"internalType":"address","name":"witness","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"mortgage","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"appealTime","type":"uint256"},{"internalType":"uint256","name":"witTakeTime","type":"uint256"},{"internalType":"uint256","name":"obTakeTime","type":"uint256"},{"components":[{"internalType":"address","name":"finalAppealAddr","type":"address"},{"internalType":"uint256","name":"updateTime","type":"uint256"},{"internalType":"string","name":"witnessReason","type":"string"},{"internalType":"uint256","name":"witnessAppealStatus","type":"uint256"},{"internalType":"string","name":"observerReason","type":"string"},{"internalType":"uint256","name":"witnessHandleTime","type":"uint256"},{"internalType":"uint256","name":"observerHandleTime","type":"uint256"},{"internalType":"address","name":"observerAddr","type":"address"},{"internalType":"uint256","name":"witnessHandleReward","type":"uint256"},{"internalType":"uint256","name":"observerHandleReward","type":"uint256"},{"internalType":"uint256","name":"witnessHandleCredit","type":"uint256"},{"internalType":"uint256","name":"observerHandleCredit","type":"uint256"},{"internalType":"uint256","name":"witReward","type":"uint256"},{"internalType":"uint256","name":"witSub","type":"uint256"},{"internalType":"uint256","name":"witCreditR","type":"uint256"},{"internalType":"uint256","name":"witCreditS","type":"uint256"}],"internalType":"struct AppealStorage.AppealDetail","name":"detail","type":"tuple"}],"internalType":"struct AppealStorage.Appeal","name":"_al","type":"tuple"},{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"uint256","name":"_t","type":"uint256"},{"internalType":"uint256","name":"_self","type":"uint256"}],"name":"subAvaAppeal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderNo","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"}],"name":"subFrozenTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"subWitnessAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_coinType","type":"string"},{"internalType":"uint256","name":"_amt","type":"uint256"}],"name":"tokenEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"unApplyUnfrozen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"unfrozenTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_coinType","type":"string"}],"name":"unfrozenTotalSearch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_recordNo","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_hostStatus","type":"uint256"}],"name":"updateInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"withdrawingTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405267016345785d8a00006003819055670de0b6b3a7640000600455678ac7230489e80000600555662386f26fc1000060068190556007829055601c6008556009819055600a808055600b91909155600c919091556001600d819055600e819055600f805460ff191690556010556011553480156200008057600080fd5b5060405162005fa638038062005fa6833981016040819052620000a3916200022c565b620000ae3362000193565b6001805560408051631554d11560e21b8152600260048083018290528351928390036024908101842080546001600160a01b038a81166001600160a01b031992831617909255635553444360e01b865292850184905285519485900390910184208054909216908716179055818301835260058252640ae82ac82b60db1b60208301529151839291620001419162000276565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506200018a6016620001e360201b6200412e1760201c565b505050620002db565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8054620001f05761271081555b6001816000016000828254620002079190620002b4565b909155505050565b80516001600160a01b03811681146200022757600080fd5b919050565b6000806000606084860312156200024257600080fd5b6200024d846200020f565b92506200025d602085016200020f565b91506200026d604085016200020f565b90509250925092565b6000825160005b818110156200029957602081860181015185830152016200027d565b81811115620002a9576000828501525b509190910192915050565b60008219821115620002d657634e487b7160e01b600052601160045260246000fd5b500190565b615cbb80620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106103f15760003560e01c80636951babe11610215578063c1db216411610125578063eb004fba116100b8578063f38aea0111610087578063f38aea0114610920578063f86af85f14610933578063f99cbd1c14610946578063fa47c7fa14610959578063fb9bb65f1461096c57600080fd5b8063eb004fba146108ea578063ed786add146108f2578063ed8aca8314610905578063f2fde38b1461090d57600080fd5b8063cabeaa00116100f4578063cabeaa001461089e578063cfa8363f146108b1578063e723b280146108c4578063e84cc314146108d757600080fd5b8063c1db216414610866578063c51ecdb31461087b578063c605373e14610883578063c941455c1461089657600080fd5b80638da5cb5b116101a857806396f084b81161017757806396f084b8146107db5780639e8bbbec14610804578063a29c47ad14610817578063b91b08381461082a578063c1ab245a1461083d57600080fd5b80638da5cb5b146107915780638e0a3a89146107a257806393719f21146107b55780639634ff6a146107c857600080fd5b8063724bcbb3116101e4578063724bcbb3146107275780637318be661461072f57806376ae8abb1461074257806379110a471461077e57600080fd5b80636951babe146106ef5780636a8b6b651461070f5780636dc0ee5514610717578063715018a61461071f57600080fd5b8063349f22861161031057806353fc0585116102a35780635c7cee63116102725780635c7cee63146106ae5780635ff2efad146106b65780636537598e146106c157806366cf90df146106c957806367c92589146106dc57600080fd5b806353fc05851461068357806358e5ed9b14610696578063592d86ae1461069e5780635bb76910146106a657600080fd5b806347b71fae116102df57806347b71fae1461062a5780634e23ea971461063d5780634e2489281461065057806351727c061461066357600080fd5b8063349f2286146105b5578063364ad7a4146105c8578063436b2ab4146105db5780634542567f1461061757600080fd5b806327c34aed116103885780632ecf32bc116103575780632ecf32bc146105405780632eefdb3d1461055357806332f02e1d1461058f57806334461067146105a257600080fd5b806327c34aed146104ff5780632ad8d015146105075780632d9217691461051a5780632df59adb1461052d57600080fd5b8063139cf2ff116103c4578063139cf2ff1461048d57806319da83a8146104a05780631b725770146104c9578063276cd3a5146104dc57600080fd5b806302147ac9146103f65780630989fc371461040b5780630a45ffae1461045a5780630bc67f9b14610462575b600080fd5b610409610404366004614ba2565b61097f565b005b610447610419366004614d46565b601c602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b6040519081526020015b60405180910390f35b600354610447565b610475610470366004614d95565b610b42565b6040516001600160a01b039091168152602001610451565b61044761049b366004614d46565b610b80565b6104b36104ae366004614dc9565b610bbd565b6040516104519a99989796959493929190614e3e565b6104096104d7366004614eb4565b610d38565b6104ef6104ea366004614ee4565b61104d565b6040519015158152602001610451565b600e54610447565b610409610515366004615057565b611064565b610409610528366004614dc9565b611691565b61044761053b366004614d46565b6116c0565b61040961054e366004615196565b6116e6565b610447610561366004614d46565b601b602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61040961059d3660046151b8565b611723565b6104b36105b0366004614dc9565b611ab7565b6104476105c3366004614d46565b611ae9565b6104096105d6366004615210565b611b0f565b6104476105e9366004614d46565b601f602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b610409610625366004614dc9565b612032565b610447610638366004615251565b612061565b61040961064b366004615297565b6120e3565b61040961065e366004614dc9565b612298565b610447610671366004614dc9565b60186020526000908152604090205481565b610409610691366004614dc9565b6122c7565b600654610447565b600754610447565b600454610447565b601054610447565b600f5460ff166104ef565b600554610447565b6104476106d7366004614dc9565b6122f6565b6104096106ea366004614dc9565b612626565b6107026106fd366004614dc9565b612655565b60405161045191906153d3565b600b54610447565b600954610447565b610409612856565b600854610447565b61040961073d3660046153e6565b61288c565b610447610750366004614d46565b601a602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61040961078c366004614dc9565b612920565b6000546001600160a01b0316610475565b6104096107b036600461548a565b61294f565b6104096107c3366004614dc9565b6129c0565b6104096107d6366004614dc9565b6129ef565b6104476107e93660046154e0565b6001600160a01b031660009081526012602052604090205490565b610409610812366004614dc9565b612a1e565b6104096108253660046154e0565b612a4d565b610409610838366004614dc9565b612c1b565b61044761084b3660046154e0565b6001600160a01b031660009081526013602052604090205490565b61086e612c4a565b60405161045191906154fd565b600c54610447565b6104096108913660046154e0565b612e2a565b601154610447565b6104096108ac366004614ba2565b613382565b6104096108bf366004614dc9565b61349b565b6104096108d2366004614dc9565b6134ca565b6104096108e5366004614dc9565b6134f9565b600a54610447565b61047561090036600461555f565b613528565b600d54610447565b61040961091b3660046154e0565b61355d565b61044761092e366004614d46565b6135f8565b610409610941366004614dc9565b61366e565b6104096109543660046155a0565b613d3e565b610447610967366004614d46565b6140d9565b61040961097a366004614dc9565b6140ff565b6000546001600160a01b031633146109b25760405162461bcd60e51b81526004016109a9906155e4565b60405180910390fd5b6001600160a01b03821660009081526012602052604090208190556001811415610ad8576001600160a01b0382166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091610a1991615619565b9081526020016040518091039020549050600454811015610a6e5760405162461bcd60e51b815260206004820152600f60248201526e0c6ded2dc40dcdee840cadcdeeaced608b1b60448201526064016109a9565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600190600401615635565b600060405180830381600087803b158015610abb57600080fd5b505af1158015610acf573d6000803e3d6000fd5b50505050505050565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610b0b908590600090600401615635565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050505b5050565b600080600283604051610b559190615619565b908152604051908190036020019020546001600160a01b0316905080610b7a57600080fd5b92915050565b6001600160a01b0382166000908152601c60205260408082209051610ba6908490615619565b908152602001604051809103902054905092915050565b60198181548110610bcd57600080fd5b60009182526020909120600a90910201805460018201546002830180549294506001600160a01b039091169291610c039061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f9061564e565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b505050505090806003018054610c919061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd9061564e565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b505050505090806004015490806005015490806006015490806007015490806008015490806009015490508a565b6021546001600160a01b0316610d605760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b0316610d885760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b0316610db05760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b0316610dd85760405162461bcd60e51b81526004016109a99061572e565b6023546001600160a01b0316331480610dfb57506024546001600160a01b031633145b610e175760405162461bcd60e51b81526004016109a990615765565b6015546040516362bb335f60e11b8152600481018490526000916001600160a01b03169063c57666be906024016000604051808303816000875af1158015610e63573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8b9190810190615894565b9050600081602001511415610ece5760405162461bcd60e51b81526020600482015260096024820152681b9bdd08195e1a5cdd60ba1b60448201526064016109a9565b6101208101516020808201516040928301516001600160a01b038216600090815283805284812088825290935292909120549091908015610f0e57600080fd5b6001600160a01b0383166000908152601b60205260408082209051610f34908590615619565b90815260405190819003602001902054606086015190915080821015610f5957600080fd5b81610f648383614157565b1115610f6f57600080fd5b610f798282614157565b6001600160a01b0386166000908152601b6020526040908190209051610fa0908790615619565b9081526040805160209281900383019020929092556001600160a01b03871660009081528180528281208b8252909152908120829055610fdf85610b42565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611010908b908690600401615635565b600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b50505050505050505050505050565b600061105b8585858561416a565b95945050505050565b6021546001600160a01b031661108c5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166110b45760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b03166110dc5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166111045760405162461bcd60e51b81526004016109a99061572e565b6024546001600160a01b0316331461112e5760405162461bcd60e51b81526004016109a990615765565b600061115787604051806040016040528060058152602001640ae82ac82b60db1b8152506140d9565b9050600080846001146111735786610160015160e00151611179565b86606001515b905085831061118a5785915061118e565b8291505b84600114801561119c575083155b806111cd57508460021480156111cd5750886001600160a01b0316876101600151600001516001600160a01b031614155b1561140f5761123a601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516112259190615619565b90815260200160405180910390205483614157565b601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b81525060405161128a9190615619565b9081526040805160209281900383018120939093556001600160a01b038b166000908152601a8352819020838201825260058452640ae82ac82b60db1b92840192909252516112f1926112dc91615619565b9081526020016040518091039020548361425c565b601a60008a6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516113419190615619565b9081526020016040518091039020819055506113bb89601a60008c6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516113a79190615619565b908152602001604051809103902054614268565b61140f88601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516113a79190615619565b611477601a6000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516114629190615619565b9081526020016040518091039020548761425c565b601a6000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516114c79190615619565b90815260200160405180910390208190555061152d81601a6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516113a79190615619565b6115368961435e565b61153f8861435e565b6115488161435e565b601454604051639bd7417f60e01b81526001600160a01b0383811660048301526000921690639bd7417f90602401600060405180830381865afa158015611593573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115bb9190810190615a53565b905085600114156115e257600d548160a001516115d89190615b59565b60a0820152611603565b856002141561160357600e548160a001516115fd9190615b59565b60a08201525b60e081015160145460a08301516040516316a1e96960e31b81526001600160a01b0386811660048301528451602483015260208501516044830152606482019290925291169063b50f4b4890608401600060405180830381600087803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505050505050505050505050505050565b6000546001600160a01b031633146116bb5760405162461bcd60e51b81526004016109a9906155e4565b600b55565b6001600160a01b0382166000908152601f60205260408082209051610ba6908490615619565b6000546001600160a01b031633146117105760405162461bcd60e51b81526004016109a9906155e4565b600f805460ff1916911515919091179055565b6021546001600160a01b031661174b5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166117735760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b031661179b5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166117c35760405162461bcd60e51b81526004016109a99061572e565b6022546001600160a01b03163314806117e657506023546001600160a01b031633145b6118245760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016109a9565b6000811161185e5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b60448201526064016109a9565b600061186a8330612061565b9050818110156118a95760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016109a9565b6001600160a01b0384166000908152601b60205260409081902090518391906118d3908690615619565b908152602001604051809103902054101561191f5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9cdd59999a58da595b9d60a21b60448201526064016109a9565b6001600160a01b0384166000908152601b6020526040908190209051611946908590615619565b9081526020016040518091039020546119a0601b6000876001600160a01b03166001600160a01b031681526020019081526020016000208560405161198b9190615619565b90815260200160405180910390205484614157565b11156119df5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016109a9565b6001600160a01b0384166000908152601b6020526040908190209051611a0b9190611225908690615619565b6001600160a01b0385166000908152601b6020526040908190209051611a32908690615619565b908152604051908190036020019020556000611a4d84610b42565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611a7e9088908790600401615635565b600060405180830381600087803b158015611a9857600080fd5b505af1158015611aac573d6000803e3d6000fd5b505050505050505050565b60176020526000908152604090208054600182015460028301805492936001600160a01b0390921692610c039061564e565b6001600160a01b0382166000908152601b60205260408082209051610ba6908490615619565b6000546001600160a01b03163314611b395760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b03831615801590611b5957506001600160a01b03821615155b611b6257600080fd5b601454604051639bd7417f60e01b81526001600160a01b0385811660048301526000921690639bd7417f90602401600060405180830381865afa158015611bad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611bd59190810190615a53565b9050806080015160011480611bee575080608001516002145b611c295760405162461bcd60e51b815260206004820152600c60248201526b0c6c2dc4ee840e0eadcd2e6d60a31b60448201526064016109a9565b6001600160a01b0384166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091611c6c91615619565b90815260200160405180910390205490506000601a6000866001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051611ccf9190615619565b9081526020016040518091039020549050838210611dc057611cf18285614157565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051611d419190615619565b90815260405190819003602001902055611d5b818561425c565b601a6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051611dab9190615619565b90815260405190819003602001902055612020565b6001600160a01b0386166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091611e0391615619565b9081526040805160209281900383018120939093556001600160a01b0389166000908152601f8352818120848301835260058552640ae82ac82b60db1b9385019390935290519092611e5491615619565b908152602001604051809103902054905084611e70848361425c565b10611f5757611e8881611e838786614157565b614157565b601f6000896001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051611ed89190615619565b90815260405190819003602001902055611ef2828661425c565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051611f429190615619565b9081526040519081900360200190205561201e565b6001600160a01b0387166000908152601f602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091611f9a91615619565b90815260405190819003602001902055611fbd82611fb8858461425c565b61425c565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b81525060405161200d9190615619565b908152604051908190036020019020555b505b6120298661435e565b610b398561435e565b6000546001600160a01b0316331461205c5760405162461bcd60e51b81526004016109a9906155e4565b601055565b60008061206d84610b42565b6040516370a0823160e01b81526001600160a01b038581166004830152919250908216906370a0823190602401602060405180830381865afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190615b71565b949350505050565b6021546001600160a01b031661210b5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166121335760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b031661215b5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166121835760405162461bcd60e51b81526004016109a99061572e565b6022546001600160a01b03163314806121a657506023546001600160a01b031633145b6122075760405162461bcd60e51b815260206004820152602c60248201527f5265646f63726453746f726167653a496e76616c69642066726f6d20636f6e7460448201526b72616374206164647265737360a01b60648201526084016109a9565b6001600160a01b0387166000908152601b60205260409081902090516122489190612233908890615619565b9081526020016040518091039020548561425c565b6001600160a01b0388166000908152601b602052604090819020905161226f908890615619565b9081526040519081900360200190205561228e8787878787878761460e565b5050505050505050565b6000546001600160a01b031633146122c25760405162461bcd60e51b81526004016109a9906155e4565b600c55565b6000546001600160a01b031633146122f15760405162461bcd60e51b81526004016109a9906155e4565b600955565b600080821161230457600080fd5b336000908152601a60209081526040918290208251808401845260058152640ae82ac82b60db1b92810192909252915184929161234091615619565b908152602001604051809103902054101561238e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016109a9565b336000908152601a60209081526040918290208251808401845260058152640ae82ac82b60db1b9281019290925291516123c89190615619565b90815260408051918290036020908101832054336000908152601a8352839020848401845260058552640ae82ac82b60db1b92850192909252915191926124139261198b9190615619565b106124535760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b6b7bab73a101960811b60448201526064016109a9565b336000818152601d602090815260408083204290819055601e83528184209084528252808320869055928252601a8152908290208251808401845260058152640ae82ac82b60db1b9281019290925291516124b2929161122591615619565b336000908152601a60209081526040918290208251808401845260058152640ae82ac82b60db1b9281019290925291516124ec9190615619565b908152604080516020928190038301812093909355336000908152601f8352819020838201825260058452640ae82ac82b60db1b9284019290925251612535926112dc91615619565b336000908152601f60209081526040918290208251808401845260058152640ae82ac82b60db1b92810192909252915161256f9190615619565b908152604051908190036020019020556125883361435e565b6125c53360405180602001604052806000815250604051806040016040528060058152602001640ae82ac82b60db1b81525085600380600261460e565b507f072538e3c57d574904a160b874c45b7e7fd3c8ed28ab3f872a942edfd852e6d733836040516125f7929190615635565b60405180910390a1610b7a33604051806040016040528060058152602001640ae82ac82b60db1b8152506140d9565b6000546001600160a01b031633146126505760405162461bcd60e51b81526004016109a9906155e4565b600355565b6126b46040518061014001604052806000815260200160006001600160a01b0316815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000828152601760209081526040918290208251610140810184528154815260018201546001600160a01b03169281019290925260028101805492939192918401916126ff9061564e565b80601f016020809104026020016040519081016040528092919081815260200182805461272b9061564e565b80156127785780601f1061274d57610100808354040283529160200191612778565b820191906000526020600020905b81548152906001019060200180831161275b57829003601f168201915b505050505081526020016003820180546127919061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546127bd9061564e565b801561280a5780601f106127df5761010080835404028352916020019161280a565b820191906000526020600020905b8154815290600101906020018083116127ed57829003601f168201915b5050505050815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820154815250509050919050565b6000546001600160a01b031633146128805760405162461bcd60e51b81526004016109a9906155e4565b61288a6000614a94565b565b6000546001600160a01b031633146128b65760405162461bcd60e51b81526004016109a9906155e4565b602180546001600160a01b03199081166001600160a01b039687169081179092556022805482169587169590951790945560238054851693861693841790556024805485169290951691909117909355601480548316909317909255601580549091169091179055565b6000546001600160a01b0316331461294a5760405162461bcd60e51b81526004016109a9906155e4565b600655565b6000546001600160a01b031633146129795760405162461bcd60e51b81526004016109a9906155e4565b806002848460405161298c929190615b8a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055505050565b6000546001600160a01b031633146129ea5760405162461bcd60e51b81526004016109a9906155e4565b600455565b6000546001600160a01b03163314612a195760405162461bcd60e51b81526004016109a9906155e4565b600755565b6000546001600160a01b03163314612a485760405162461bcd60e51b81526004016109a9906155e4565b600555565b6000546001600160a01b03163314612a775760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b0381166000908152601f602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091612aba91615619565b908152602001604051809103902054905060008111612b085760405162461bcd60e51b815260206004820152600a6024820152691cdd59999a58da595b9d60b21b60448201526064016109a9565b6001600160a01b0382166000908152601f602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091612b4b91615619565b9081526040805160209281900383018120939093556001600160a01b0385166000908152601a8352819020838201825260058452640ae82ac82b60db1b9284019290925251612bb292612b9d91615619565b9081526020016040518091039020548261425c565b601a6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051612c029190615619565b90815260405190819003602001902055610b3e8261435e565b6000546001600160a01b03163314612c455760405162461bcd60e51b81526004016109a9906155e4565b601155565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015612e215760008481526020908190206040805161014081018252600a86029092018054835260018101546001600160a01b03169383019390935260028301805492939291840191612cc29061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054612cee9061564e565b8015612d3b5780601f10612d1057610100808354040283529160200191612d3b565b820191906000526020600020905b815481529060010190602001808311612d1e57829003601f168201915b50505050508152602001600382018054612d549061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d809061564e565b8015612dcd5780601f10612da257610100808354040283529160200191612dcd565b820191906000526020600020905b815481529060010190602001808311612db057829003601f168201915b50505050508152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152505081526020019060010190612c6e565b50505050905090565b6021546001600160a01b0316612e525760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b0316612e7a5760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b0316612ea25760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b0316612eca5760405162461bcd60e51b81526004016109a99061572e565b6024546001600160a01b03163314612ef45760405162461bcd60e51b81526004016109a990615765565b6001600160a01b038116612f395760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016109a9565b6001600160a01b0381166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b9381019390935290519091612f7c91615619565b9081526020016040518091039020549050600080600954831061300d576009549150612fa88383614157565b601a6000866001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b815250604051612ff89190615619565b908152604051908190036020019020556131b5565b6001600160a01b0384166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b938101939093529051909161305091615619565b9081526040805160209281900383018120939093556001600160a01b0387166000908152601f8352818120848301835260058552640ae82ac82b60db1b93850193909352905190926130a191615619565b90815260200160405180910390205490506009546130bf858361425c565b106131445760095492506130d38385614157565b91506130df8183614157565b601f6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b81525060405161312f9190615619565b908152604051908190036020019020556131b3565b61314e818561425c565b92506000601f6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001640ae82ac82b60db1b8152506040516131a29190615619565b908152604051908190036020019020555b505b6131be8461435e565b601454604051639bd7417f60e01b81526001600160a01b0386811660048301526000921690639bd7417f90602401600060405180830381865afa158015613209573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132319190810190615a53565b9050600a548160a00151101561324857600061325a565b600a548160a0015161325a9190615b9a565b60a0820181905260e08201516014546040516316a1e96960e31b81526001600160a01b038981166004830152835160248301526020840151604483015260648201949094529192169063b50f4b4890608401600060405180830381600087803b1580156132c657600080fd5b505af11580156132da573d6000803e3d6000fd5b505050506000613306604051806040016040528060058152602001640ae82ac82b60db1b815250610b42565b9050806001600160a01b031663a9059cbb6133296000546001600160a01b031690565b876040518363ffffffff1660e01b8152600401613347929190615635565b600060405180830381600087803b15801561336157600080fd5b505af1158015613375573d6000803e3d6000fd5b5050505050505050505050565b6000546001600160a01b031633146133ac5760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b03821660009081526013602052604090208190556001811415610ad8576001600160a01b0382166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b938101939093529051909161341391615619565b90815260200160405180910390205490506005548110156134685760405162461bcd60e51b815260206004820152600f60248201526e0c6ded2dc40dcdee840cadcdeeaced608b1b60448201526064016109a9565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600290600401615635565b6000546001600160a01b031633146134c55760405162461bcd60e51b81526004016109a9906155e4565b600a55565b6000546001600160a01b031633146134f45760405162461bcd60e51b81526004016109a9906155e4565b600855565b6000546001600160a01b031633146135235760405162461bcd60e51b81526004016109a9906155e4565b600e55565b60006002838360405161353c929190615b8a565b908152604051908190036020019020546001600160a01b0316905092915050565b6000546001600160a01b031633146135875760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b0381166135ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a9565b6135f581614a94565b50565b60006001600160a01b0383166136475760405162461bcd60e51b81526020600482015260146024820152731d5cd95c881859191c995cdcc81a5cc81b9d5b1b60621b60448201526064016109a9565b6001600160a01b0383166000908152601c6020526040908190209051610ba6908490615619565b60008181526017602090815260408083208151610140810183528154815260018201546001600160a01b03169381019390935260028101805491928401916136b59061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546136e19061564e565b801561372e5780601f106137035761010080835404028352916020019161372e565b820191906000526020600020905b81548152906001019060200180831161371157829003601f168201915b505050505081526020016003820180546137479061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546137739061564e565b80156137c05780601f10613795576101008083540402835291602001916137c0565b820191906000526020600020905b8154815290600101906020018083116137a357829003601f168201915b505050918352505060048201546020820152600582015460408201526006820154606082015260078201546080820152600882015460a082015260099091015460c090910152805190915061384a5760405162461bcd60e51b815260206004820152601060248201526f1c9958dbdc99081b9bdd08195e1a5cdd60821b60448201526064016109a9565b60208101516001600160a01b0316331461389e5760405162461bcd60e51b81526020600482015260156024820152741c9958dbdc99081d5cd95c881b9bdd08195e1a5cdd605a1b60448201526064016109a9565b8060a001516003146138e15760405162461bcd60e51b815260206004820152600c60248201526b39ba30ba3ab99032b93937b960a11b60448201526064016109a9565b6080810151336000908152601f60209081526040918290208251808401845260058152640ae82ac82b60db1b9281019290925291516139209190615619565b908152602001604051809103902054101561396a5760405162461bcd60e51b815260206004820152600a6024820152691cdd59999a58da595b9d60b21b60448201526064016109a9565b60085461397a9062015180615bb1565b81610100015161398a9190615b59565b4210156139ca5760405162461bcd60e51b815260206004820152600e60248201526d63616e277420776974686472617760901b60448201526064016109a9565b336000908152601f60209081526040918290208251808401845260058152640ae82ac82b60db1b928101929092529151613a219291613a0891615619565b9081526020016040518091039020548260800151614157565b336000908152601f60209081526040918290208251808401845260058152640ae82ac82b60db1b928101929092529151613a5b9190615619565b908152604080516020928190038301812093909355336000908152601c8352819020838201825260058452640ae82ac82b60db1b9284019290925251613abd92613aa491615619565b908152602001604051809103902054826080015161425c565b336000908152601c60209081526040918290208251808401845260058152640ae82ac82b60db1b928101929092529151613af79190615619565b908152604080516020928190038301902092909255600460a08401524261012084015260008481526017825282902083518155838201516001820180546001600160a01b0319166001600160a01b03909216919091179055918301518051849392613b69926002850192910190614ae4565b5060608201518051613b85916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155600082815260186020526040902054601980548392908110613bea57613bea615bd0565b60009182526020918290208351600a9290920201908155828201516001820180546001600160a01b0319166001600160a01b03909216919091179055604083015180519192613c4192600285019290910190614ae4565b5060608201518051613c5d916003840191602090910190614ae4565b506080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015561012082015181600901559050507f184981d19cd827a29527d9fef87fd7973eb4f43f9833af36578f456bed5fa19a338383604001516004604051613cd99493929190615be6565b60405180910390a16000613d09604051806040016040528060058152602001640ae82ac82b60db1b815250610b42565b608083015160405163a9059cbb60e01b81529192506001600160a01b0383169163a9059cbb91610aa191339190600401615635565b60008111613d785760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b60448201526064016109a9565b336000908152601a6020526040908190209051613d96908490615619565b90815260200160405180910390205481601a6000336001600160a01b03166001600160a01b0316815260200190815260200160002084604051613dd99190615619565b908152602001604051809103902054613df29190615b59565b11613e3f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964207472616e7366657220616d6f756e7400000000000000000060448201526064016109a9565b336000908152601a6020526040908190209051613e629190612b9d908590615619565b336000908152601a6020526040908190209051613e80908590615619565b90815260408051918290036020908101832093909355818101815260058252640ae82ac82b60db1b8284015251600192613ebb929101615619565b6040516020818303038152906040528051906020012083604051602001613ee29190615619565b6040516020818303038152906040528051906020012014156140475750601454604051639bd7417f60e01b81523360048201526002916000916001600160a01b0390911690639bd7417f90602401600060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f759190810190615a53565b336000818152601a6020526040908190209051929350613f9a926113a7908890615619565b6080810151158015613fda5750600354336000908152601a6020526040908190209051613fc8908790615619565b90815260200160405180910390205410155b156140455760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590614012903390600390600401615635565b600060405180830381600087803b15801561402c57600080fd5b505af1158015614040573d6000803e3d6000fd5b505050505b505b61406733604051806020016040528060008152508585600286600161460e565b50600061407384610b42565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091506001600160a01b038216906323b872dd906064015b600060405180830381600087803b1580156140c557600080fd5b505af115801561228e573d6000803e3d6000fd5b6001600160a01b0382166000908152601a60205260408082209051610ba6908490615619565b6000546001600160a01b031633146141295760405162461bcd60e51b81526004016109a9906155e4565b600d55565b805461413a5761271081555b600181600001600082825461414f9190615b59565b909155505050565b60006141638284615b9a565b9392505050565b600083815260176020526040812060018101546001600160a01b0387811691161461419457600080fd5b82600114806141a35750826002145b6141e05760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642073746174757360901b60448201526064016109a9565b82156141ee57600581018390555b83511561420c57835161420a9060028301906020870190614ae4565b505b4260098201556040517f184981d19cd827a29527d9fef87fd7973eb4f43f9833af36578f456bed5fa19a90614248908890889088908890615be6565b60405180910390a150600195945050505050565b60006141638284615b59565b601454604051639bd7417f60e01b81526001600160a01b0384811660048301526000921690639bd7417f90602401600060405180830381865afa1580156142b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142db9190810190615a53565b61010081015183815260145460408051630ee685c760e41b81526001600160a01b038881166004830152845160248301526020850151604483015291840151606482015260608401516084820152608084015160a482015260a084015160c482015260c084015160e4820152939450919291169063ee685c7090610104016140ab565b6001600160a01b0381166000908152601a602090815260408083208151808301835260058152640ae82ac82b60db1b93810193909352905190916143a191615619565b90815260405190819003602001812054601454639bd7417f60e01b83526001600160a01b038581166004850152919350600092911690639bd7417f90602401600060405180830381865afa1580156143fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144259190810190615a53565b90506144318383614268565b80608001516002148015614446575060055482105b801561445457506003548210155b156144bf5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba59061448c908690600390600401615635565b600060405180830381600087803b1580156144a657600080fd5b505af11580156144ba573d6000803e3d6000fd5b505050505b806080015160011480156144d4575060045482105b80156144e257506003548210155b1561454d5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba59061451a908690600390600401615635565b600060405180830381600087803b15801561453457600080fd5b505af1158015614548573d6000803e3d6000fd5b505050505b608081015115801561456157506003548210155b156145cc5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590614599908690600390600401615635565b600060405180830381600087803b1580156145b357600080fd5b505af11580156145c7573d6000803e3d6000fd5b505050505b6003548210156146095760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600090600401615635565b505050565b6000600260015414156146635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a9565b60026001556001600160a01b0388166146ad5760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016109a9565b85516146eb5760405162461bcd60e51b815260206004820152600d60248201526c18dbda5b951e5c19481b9d5b1b609a1b60448201526064016109a9565b846147295760405162461bcd60e51b815260206004820152600e60248201526d1a1bdcdd10dbdd5b9d081b9d5b1b60921b60448201526064016109a9565b826147665760405162461bcd60e51b815260206004820152600d60248201526c1a1bdcdd151e5c19481b9d5b1b609a1b60448201526064016109a9565b816147a85760405162461bcd60e51b81526020600482015260126024820152711a1bdcdd111a5c9958dd1a5bdb881b9d5b1b60721b60448201526064016109a9565b60006147b360165490565b600081815260176020526040902054909150156148005760405162461bcd60e51b815260206004820152600b60248201526a1bdc99195c88195e1a5cdd60aa1b60448201526064016109a9565b60408051610140810182528281526001600160a01b038b811660208084019182528385018d8152606085018d9052608085018c905260a085018b905260c085018a905260e08501899052426101008601526000610120860181905287815260178352959095208451815591516001830180546001600160a01b03191691909416179092559251805192938493909261489f926002850192910190614ae4565b50606082015180516148bb916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120909101516009909101556019805460018101825560009190915281517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695600a9092029182019081556020808401517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9696840180546001600160a01b0319166001600160a01b039092169190911790556040840151805185946149b9937f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9697909101920190614ae4565b50606082015180516149d5916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155601954614a2590600190615b9a565b600083815260186020526040902055614a3e601661412e565b7f400817122268a69f3472a92a1ec2769f27f068026b377eaeb64f6cbe0bca7a51828b8b8b8b8b8b8b604051614a7b989796959493929190615c1e565b60405180910390a1506001805598975050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054614af09061564e565b90600052602060002090601f016020900481019282614b125760008555614b58565b82601f10614b2b57805160ff1916838001178555614b58565b82800160010185558215614b58579182015b82811115614b58578251825591602001919060010190614b3d565b50614b64929150614b68565b5090565b5b80821115614b645760008155600101614b69565b6001600160a01b03811681146135f557600080fd5b8035614b9d81614b7d565b919050565b60008060408385031215614bb557600080fd5b8235614bc081614b7d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161020081016001600160401b0381118282101715614c0757614c07614bce565b60405290565b60405161018081016001600160401b0381118282101715614c0757614c07614bce565b60405161010081016001600160401b0381118282101715614c0757614c07614bce565b60405161014081016001600160401b0381118282101715614c0757614c07614bce565b60405161012081016001600160401b0381118282101715614c0757614c07614bce565b604051601f8201601f191681016001600160401b0381118282101715614cc157614cc1614bce565b604052919050565b60006001600160401b03821115614ce257614ce2614bce565b50601f01601f191660200190565b600082601f830112614d0157600080fd5b8135614d14614d0f82614cc9565b614c99565b818152846020838601011115614d2957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614d5957600080fd5b8235614d6481614b7d565b915060208301356001600160401b03811115614d7f57600080fd5b614d8b85828601614cf0565b9150509250929050565b600060208284031215614da757600080fd5b81356001600160401b03811115614dbd57600080fd5b6120db84828501614cf0565b600060208284031215614ddb57600080fd5b5035919050565b60005b83811015614dfd578181015183820152602001614de5565b83811115614e0c576000848401525b50505050565b60008151808452614e2a816020860160208601614de2565b601f01601f19169290920160200192915050565b8a81526001600160a01b038a16602082015261014060408201819052600090614e698382018c614e12565b90508281036060840152614e7d818b614e12565b6080840199909952505060a081019590955260c085019390935260e084019190915261010083015261012090910152949350505050565b60008060408385031215614ec757600080fd5b823591506020830135614ed981614b7d565b809150509250929050565b60008060008060808587031215614efa57600080fd5b8435614f0581614b7d565b93506020850135925060408501356001600160401b03811115614f2757600080fd5b614f3387828801614cf0565b949793965093946060013593505050565b60006102008284031215614f5757600080fd5b614f5f614be4565b9050614f6a82614b92565b81526020820135602082015260408201356001600160401b0380821115614f9057600080fd5b614f9c85838601614cf0565b6040840152606084013560608401526080840135915080821115614fbf57600080fd5b50614fcc84828501614cf0565b60808301525060a082013560a082015260c082013560c0820152614ff260e08301614b92565b60e0820152610100828101359082015261012080830135908201526101408083013590820152610160808301359082015261018080830135908201526101a080830135908201526101c080830135908201526101e09182013591810191909152919050565b60008060008060008060c0878903121561507057600080fd5b863561507b81614b7d565b9550602087013561508b81614b7d565b945060408701356001600160401b03808211156150a757600080fd5b90880190610180828b0312156150bc57600080fd5b6150c4614c0d565b6150cd83614b92565b815260208301356020820152604083013560408201526150ef60608401614b92565b606082015261510060808401614b92565b608082015261511160a08401614b92565b60a082015260c0838101359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401358381111561515f57600080fd5b61516b8d828701614f44565b828401525050809650505050606087013592506080870135915060a087013590509295509295509295565b6000602082840312156151a857600080fd5b8135801515811461416357600080fd5b6000806000606084860312156151cd57600080fd5b83356151d881614b7d565b925060208401356001600160401b038111156151f357600080fd5b6151ff86828701614cf0565b925050604084013590509250925092565b60008060006060848603121561522557600080fd5b833561523081614b7d565b9250602084013561524081614b7d565b929592945050506040919091013590565b6000806040838503121561526457600080fd5b82356001600160401b0381111561527a57600080fd5b61528685828601614cf0565b9250506020830135614ed981614b7d565b600080600080600080600060e0888a0312156152b257600080fd5b87356152bd81614b7d565b965060208801356001600160401b03808211156152d957600080fd5b6152e58b838c01614cf0565b975060408a01359150808211156152fb57600080fd5b506153088a828b01614cf0565b979a96995096976060810135975060808101359660a0820135965060c090910135945092505050565b600061014082518452602083015161535460208601826001600160a01b03169052565b50604083015181604086015261536c82860182614e12565b915050606083015184820360608601526153868282614e12565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152508091505092915050565b6020815260006141636020830184615331565b600080600080608085870312156153fc57600080fd5b843561540781614b7d565b9350602085013561541781614b7d565b9250604085013561542781614b7d565b9150606085013561543781614b7d565b939692955090935050565b60008083601f84011261545457600080fd5b5081356001600160401b0381111561546b57600080fd5b60208301915083602082850101111561548357600080fd5b9250929050565b60008060006040848603121561549f57600080fd5b83356001600160401b038111156154b557600080fd5b6154c186828701615442565b90945092505060208401356154d581614b7d565b809150509250925092565b6000602082840312156154f257600080fd5b813561416381614b7d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561555257603f19888603018452615540858351615331565b94509285019290850190600101615524565b5092979650505050505050565b6000806020838503121561557257600080fd5b82356001600160401b0381111561558857600080fd5b61559485828601615442565b90969095509350505050565b600080604083850312156155b357600080fd5b82356001600160401b038111156155c957600080fd5b6155d585828601614cf0565b95602094909401359450505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000825161562b818460208701614de2565b9190910192915050565b6001600160a01b03929092168252602082015260400190565b600181811c9082168061566257607f821691505b6020821081141561568357634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526019908201527f496e76616c696420616464726573732063616c6c207573657200000000000000604082015260600190565b60208082526019908201527f496e76616c696420616464726573732063616c6c207265737400000000000000604082015260600190565b6020808252601a908201527f496e76616c696420616464726573732063616c6c206f72646572000000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c2061707065616c0000000000604082015260600190565b6020808252600c908201526b125b9d985b1a590818d85b1b60a21b604082015260600190565b8051614b9d81614b7d565b600082601f8301126157a757600080fd5b81516157b5614d0f82614cc9565b8181528460208386010111156157ca57600080fd5b6120db826020830160208701614de2565b600061010082840312156157ee57600080fd5b6157f6614c30565b90506158018261578b565b815261580f6020830161578b565b602082015260408201516001600160401b038082111561582e57600080fd5b61583a85838601615796565b6040840152606084015160608401526080840151608084015260a084015160a084015260c084015191508082111561587157600080fd5b5061587e84828501615796565b60c08301525060e082015160e082015292915050565b6000602082840312156158a657600080fd5b81516001600160401b03808211156158bd57600080fd5b9083019061014082860312156158d257600080fd5b6158da614c53565b6158e38361578b565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c08301518281111561592957600080fd5b61593587828601615796565b60c08301525060e083015160e0820152610100808401518183015250610120808401518381111561596557600080fd5b615971888287016157db565b918301919091525095945050505050565b60006040828403121561599457600080fd5b604051604081018181106001600160401b03821117156159b6576159b6614bce565b604052825181526020928301519281019290925250919050565b600060e082840312156159e257600080fd5b60405160e081018181106001600160401b0382111715615a0457615a04614bce565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c08201525092915050565b600060208284031215615a6557600080fd5b81516001600160401b0380821115615a7c57600080fd5b908301906102008286031215615a9157600080fd5b615a99614c76565b615aa28361578b565b8152602083015182811115615ab657600080fd5b615ac287828601615796565b602083015250604083015182811115615ada57600080fd5b615ae687828601615796565b604083015250606083015160608201526080830151608082015260a083015160a082015260c083015160c0820152615b218660e08501615982565b60e0820152615b348661012085016159d0565b61010082015295945050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115615b6c57615b6c615b43565b500190565b600060208284031215615b8357600080fd5b5051919050565b8183823760009101908152919050565b600082821015615bac57615bac615b43565b500390565b6000816000190483118215151615615bcb57615bcb615b43565b500290565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152608060408201526000615c0d6080830185614e12565b905082606083015295945050505050565b8881526001600160a01b038816602082015261010060408201819052600090615c498382018a614e12565b90508281036060840152615c5d8189614e12565b9150508560808301528460a08301528360c08301528260e0830152999850505050505050505056fea2646970667358221220f134a9852eea00e34b2dcf0c1b9d09d80a4fb91f429b9612ec76a643080f197264736f6c634300080b00330000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7

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

0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7

-----Decoded View---------------
Arg [0] : _usdtAddress (address): 0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7
Arg [1] : _usdcAddress (address): 0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [2] : _coinAddress (address): 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7
Arg [1] : 000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [2] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7


Deployed ByteCode Sourcemap

1602:25026:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2495:395;;;;;;:::i;:::-;;:::i;:::-;;9075:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3590:25:6;;;3578:2;3563:18;9075:67:3;;;;;;;;4001:103;4080:17;;4001:103;;9723:321;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4139:32:6;;;4121:51;;4109:2;4094:18;9723:321:3;3953:225:6;24835:181:3;;;;;;:::i;:::-;;:::i;8895:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;16129:1069::-;;;;;;:::i;:::-;;:::i;26125:231::-;;;;;;:::i;:::-;;:::i;:::-;;;7097:14:6;;7090:22;7072:41;;7060:2;7045:18;26125:231:3;6932:187:6;6338:109:3;6420:20;;6338:109;;17204:1783;;;;;;:::i;:::-;;:::i;5553:104::-;;;;;;:::i;:::-;;:::i;25022:185::-;;;;;;:::i;:::-;;:::i;6453:81::-;;;;;;:::i;:::-;;:::i;9003:65::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15032:904;;;;;;:::i;:::-;;:::i;8795:41::-;;;;;;:::i;:::-;;:::i;20937:175::-;;;;;;:::i;:::-;;:::i;7008:1350::-;;;;;;:::i;:::-;;:::i;9273:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6630:88;;;;;;:::i;:::-;;:::i;25213:243::-;;;;;;:::i;:::-;;:::i;14285:741::-;;;;;;:::i;:::-;;:::i;5776:106::-;;;;;;:::i;:::-;;:::i;8842:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;5175:84;;;;;;:::i;:::-;;:::i;4650:87::-;4721:9;;4650:87;;4851:97;4927:14;;4851:97;;4222:101;4300:16;;4222:101;;6724:91;6797:11;;6724:91;;6540:84;6608:9;;;;6540:84;;4443:103;4522:17;;4443:103;;21118:961;;;;;;:::i;:::-;;:::i;3887:108::-;;;;;;:::i;:::-;;:::i;26362:156::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5663:107::-;5744:19;;5663:107;;5265:87;5336:9;;5265:87;;1973:101:5;;;:::i;5066:103:3:-;5145:17;;5066:103;;11049:404;;;;;;:::i;:::-;;:::i;8928:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4552:92;;;;;;:::i;:::-;;:::i;1341:85:5:-;1387:7;1413:6;-1:-1:-1;;;;;1413:6:5;1341:85;;3536:177:3;;;;;;:::i;:::-;;:::i;4110:106::-;;;;;;:::i;:::-;;:::i;4743:102::-;;;;;;:::i;:::-;;:::i;2896:111::-;;;;;;:::i;:::-;-1:-1:-1;;;;;2982:18:3;2956:7;2982:18;;;:11;:18;;;;;;;2896:111;4329:108;;;;;;:::i;:::-;;:::i;22957:370::-;;;;;;:::i;:::-;;:::i;6821:86::-;;;;;;:::i;:::-;;:::i;3417:113::-;;;;;;:::i;:::-;-1:-1:-1;;;;;3504:19:3;3478:7;3504:19;;;:12;:19;;;;;;;3417:113;26524:102;;;:::i;:::-;;;;;;;:::i;5888:109::-;5970:20;;5888:109;;19327:1604;;;;;;:::i;:::-;;:::i;6913:89::-;6985:10;;6913:89;;3013:398;;;;;;:::i;:::-;;:::i;5358:90::-;;;;;;:::i;:::-;;:::i;4954:106::-;;;;;;:::i;:::-;;:::i;6226:::-;;;;;;:::i;:::-;;:::i;5454:93::-;5528:12;;5454:93;;3719:162;;;;;;:::i;:::-;;:::i;6113:107::-;6194:19;;6113:107;;2223:232:5;;;;;;:::i;:::-;;:::i;24584:245:3:-;;;;;;:::i;:::-;;:::i;23333:1245::-;;;;;;:::i;:::-;;:::i;13004:1275::-;;;;;;:::i;:::-;;:::i;15942:181::-;;;;;;:::i;:::-;;:::i;6003:104::-;;;;;;:::i;:::-;;:::i;2495:395::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;2578:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;:26;;;2627:1:::1;2618:10:::0;::::1;2614:270;;;-1:-1:-1::0;;;;;2659:21:3;::::1;2644:12;2659:21:::0;;;:14:::1;:21;::::0;;;;;;;2681:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;2681:6:3;;::::1;::::0;;;;2659:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;2644:44;;2718:16;;2710:4;:24;;2702:52;;;::::0;-1:-1:-1;;;2702:52:3;;19132:2:6;2702:52:3::1;::::0;::::1;19114:21:6::0;19171:2;19151:18;;;19144:30;-1:-1:-1;;;19190:18:6;;;19183:45;19245:18;;2702:52:3::1;18930:339:6::0;2702:52:3::1;2768:12;::::0;:37:::1;::::0;-1:-1:-1;;;2768:37:3;;-1:-1:-1;;;;;2768:12:3;;::::1;::::0;:27:::1;::::0;:37:::1;::::0;2796:5;;2768:12;;:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2630:186;2495:395:::0;;:::o;2614:270::-:1;2836:12;::::0;:37:::1;::::0;-1:-1:-1;;;2836:37:3;;-1:-1:-1;;;;;2836:12:3;;::::1;::::0;:27:::1;::::0;:37:::1;::::0;2864:5;;2836:12:::1;::::0;:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2614:270;2495:395:::0;;:::o;9723:321::-;9818:13;9847:19;9869:14;9884:9;9869:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;9869:25:3;;-1:-1:-1;9912:25:3;9904:34;;;;;;9994:11;9723:321;-1:-1:-1;;9723:321:3:o;24835:181::-;-1:-1:-1;;;;;24978:20:3;;24948:7;24978:20;;;:13;:20;;;;;;:31;;;;24999:9;;24978:31;:::i;:::-;;;;;;;;;;;;;;24971:38;;24835:181;;;;:::o;8895:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8895:26:3;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16129:1069::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;16275:11:::1;::::0;-1:-1:-1;;;;;16275:11:3::1;16261:10;:25;::::0;:55:::1;;-1:-1:-1::0;16304:12:3::1;::::0;-1:-1:-1;;;;;16304:12:3::1;16290:10;:26;16261:55;16240:114;;;;-1:-1:-1::0;;;16240:114:3::1;;;;;;;:::i;:::-;16399:13;::::0;:35:::1;::::0;-1:-1:-1;;;16399:35:3;;::::1;::::0;::::1;3590:25:6::0;;;16364:32:3::1;::::0;-1:-1:-1;;;;;16399:13:3::1;::::0;:25:::1;::::0;3563:18:6;;16399:35:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;16399:35:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;16364:70;;16478:1;16452:6;:14;;;:28;;16444:50;;;::::0;-1:-1:-1;;;16444:50:3;;25051:2:6;16444:50:3::1;::::0;::::1;25033:21:6::0;25090:1;25070:18;;;25063:29;-1:-1:-1;;;25108:18:6;;;25101:39;25157:18;;16444:50:3::1;24849:332:6::0;16444:50:3::1;16522:18;::::0;::::1;::::0;:29:::1;::::0;;::::1;::::0;16587:27:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;16646:27:3;::::1;16504:15;16646:27:::0;;;;;;;;;:37;;;;;;;;;;;16522:29;;16587:27;16701:15;;16693:24:::1;;;::::0;::::1;;-1:-1:-1::0;;;;;16746:20:3;::::1;16728:15;16746:20:::0;;;:11:::1;:20;::::0;;;;;:31;;::::1;::::0;16767:9;;16746:31:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;16809:16:::1;::::0;::::1;::::0;16746:31;;-1:-1:-1;16843:22:3;;::::1;;16835:31;;;::::0;::::1;;16922:7;16884:34;16897:7;16906:11;16884:12;:34::i;:::-;:45;;16876:54;;;::::0;::::1;;16975:34;16988:7;16997:11;16975:12;:34::i;:::-;-1:-1:-1::0;;;;;16941:20:3;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;:31;;::::1;::::0;16962:9;;16941:31:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:68;;;;-1:-1:-1;;;;;17019:27:3;::::1;;::::0;;;;;;;;;:37;;;;;;;;;:51;;;17112:26:::1;17128:9:::0;17112:15:::1;:26::i;:::-;17148:43;::::0;-1:-1:-1;;;17148:43:3;;17081:57;;-1:-1:-1;;;;;;17148:23:3;::::1;::::0;::::1;::::0;:43:::1;::::0;17172:5;;17179:11;;17148:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16230:968;;;;;;;16129:1069:::0;;:::o;26125:231::-;26277:4;26300:49;26312:5;26319:9;26330:5;26337:11;26300;:49::i;:::-;26293:56;26125:231;-1:-1:-1;;;;;26125:231:3:o;17204:1783::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;17438:12:::1;::::0;-1:-1:-1;;;;;17438:12:3::1;17424:10;:26;17416:51;;;;-1:-1:-1::0;;;17416:51:3::1;;;;;;;:::i;:::-;17478:18;17499:32;17517:5;17524:6;;;;;;;;;;;;;-1:-1:-1::0;;;17524:6:3::1;;::::0;17499:17:::1;:32::i;:::-;17478:53;;17541:13;17568:12:::0;17583:2:::1;17589:1;17583:7;:47;;17607:3;:10;;;:23;;;17583:47;;;17593:3;:11;;;17583:47;17568:62;;17658:4;17644:10;:18;17640:110;;17686:4;17678:12;;17640:110;;;17729:10;17721:18;;17640:110;17778:2;17784:1;17778:7;:21;;;;-1:-1:-1::0;17789:10:3;;17778:21:::1;17777:87;;;;17817:2;17823:1;17817:7;:46;;;;;17858:5;-1:-1:-1::0;;;;;17828:35:3::1;:3;:10;;;:26;;;-1:-1:-1::0;;;;;17828:35:3::1;;;17817:46;17760:552;;;17921:96;17951:14;:21;17966:5;-1:-1:-1::0;;;;;17951:21:3::1;-1:-1:-1::0;;;;;17951:21:3::1;;;;;;;;;;;;17973:6;;;;;;;;;;;;;-1:-1:-1::0;;;17973:6:3::1;;::::0;17951:29:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;17998:5;17921:12;:96::i;:::-;17889:14;:21;17904:5;-1:-1:-1::0;;;;;17889:21:3::1;-1:-1:-1::0;;;;;17889:21:3::1;;;;;;;;;;;;17911:6;;;;;;;;;;;;;-1:-1:-1::0;;;17911:6:3::1;;::::0;17889:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:128;;;;-1:-1:-1;;;;;18091:19:3;::::1;;::::0;;;:14:::1;:19:::0;;;;;18111:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;18111:6:3;;::::1;::::0;;;;18091:27;18061:94:::1;::::0;18091:27:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;18136:5;18061:12;:94::i;:::-;18031:14;:19;18046:3;-1:-1:-1::0;;;;;18031:19:3::1;-1:-1:-1::0;;;;;18031:19:3::1;;;;;;;;;;;;18051:6;;;;;;;;;;;;;-1:-1:-1::0;;;18051:6:3::1;;::::0;18031:27:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:124;;;;18169:61;18193:5;18200:14;:21;18215:5;-1:-1:-1::0;;;;;18200:21:3::1;-1:-1:-1::0;;;;;18200:21:3::1;;;;;;;;;;;;18222:6;;;;;;;;;;;;;-1:-1:-1::0;;;18222:6:3::1;;::::0;18200:29:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;18169:23;:61::i;:::-;18244:57;18268:3;18273:14;:19;18288:3;-1:-1:-1::0;;;;;18273:19:3::1;-1:-1:-1::0;;;;;18273:19:3::1;;;;;;;;;;;;18293:6;;;;;;;;;;;;;-1:-1:-1::0;;;18293:6:3::1;;::::0;18273:27:::1;;;;;;:::i;18244:57::-;18353:82;18379:14;:20;18394:4;-1:-1:-1::0;;;;;18379:20:3::1;-1:-1:-1::0;;;;;18379:20:3::1;;;;;;;;;;;;18400:6;;;;;;;;;;;;;-1:-1:-1::0;;;18400:6:3::1;;::::0;18379:28:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;18421:4;18353:12;:82::i;:::-;18322:14;:20;18337:4;-1:-1:-1::0;;;;;18322:20:3::1;-1:-1:-1::0;;;;;18322:20:3::1;;;;;;;;;;;;18343:6;;;;;;;;;;;;;-1:-1:-1::0;;;18343:6:3::1;;::::0;18322:28:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:113;;;;18445:59;18469:4;18475:14;:20;18490:4;-1:-1:-1::0;;;;;18475:20:3::1;-1:-1:-1::0;;;;;18475:20:3::1;;;;;;;;;;;;18496:6;;;;;;;;;;;;;-1:-1:-1::0;;;18496:6:3::1;;::::0;18475:28:::1;;;;;;:::i;18445:59::-;18514:15;18523:5;18514:8;:15::i;:::-;18539:13;18548:3;18539:8;:13::i;:::-;18562:14;18571:4;18562:8;:14::i;:::-;18619:12;::::0;:29:::1;::::0;-1:-1:-1;;;18619:29:3;;-1:-1:-1;;;;;4139:32:6;;;18619:29:3::1;::::0;::::1;4121:51:6::0;18587:29:3::1;::::0;18619:12:::1;::::0;:23:::1;::::0;4094:18:6;;18619:29:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;18619:29:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;18587:61;;18662:2;18668:1;18662:7;18658:181;;;18715:19;;18700:5;:12;;;:34;;;;:::i;:::-;18685:12;::::0;::::1;:49:::0;18658:181:::1;;;18755:2;18761:1;18755:7;18751:88;;;18808:20;;18793:5;:12;;;:35;;;;:::i;:::-;18778:12;::::0;::::1;:50:::0;18751:88:::1;18892:16;::::0;::::1;::::0;18918:12:::1;::::0;18967::::1;::::0;::::1;::::0;18918:62:::1;::::0;-1:-1:-1;;;18918:62:3;;-1:-1:-1;;;;;28551:32:6;;;18918:62:3::1;::::0;::::1;28533:51:6::0;28620:13;;28600:18;;;28593:41;28615:2;28676:15;;28670:22;28650:18;;;28643:50;28709:18;;;28702:34;;;;18918:12:3;::::1;::::0;:29:::1;::::0;28505:19:6;;18918:62:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17406:1581;;;;;17204:1783:::0;;;;;;:::o;5553:104::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5626:19:3::1;:24:::0;5553:104::o;25022:185::-;-1:-1:-1;;;;;25166:23:3;;25136:7;25166:23;;;:16;:23;;;;;;:34;;;;25190:9;;25166:34;:::i;6453:81::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6513:9:3::1;:14:::0;;-1:-1:-1;;6513:14:3::1;::::0;::::1;;::::0;;;::::1;::::0;;6453:81::o;15032:904::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;15212:10:::1;::::0;-1:-1:-1;;;;;15212:10:3::1;15198;:24;::::0;:53:::1;;-1:-1:-1::0;15240:11:3::1;::::0;-1:-1:-1;;;;;15240:11:3::1;15226:10;:25;15198:53;15177:115;;;::::0;-1:-1:-1;;;15177:115:3;;28949:2:6;15177:115:3::1;::::0;::::1;28931:21:6::0;28988:2;28968:18;;;28961:30;-1:-1:-1;;;29007:18:6;;;29000:45;29062:18;;15177:115:3::1;28747:339:6::0;15177:115:3::1;15317:1;15310:4;:8;15302:28;;;::::0;-1:-1:-1;;;15302:28:3;;29293:2:6;15302:28:3::1;::::0;::::1;29275:21:6::0;29332:1;29312:18;;;29305:29;-1:-1:-1;;;29350:18:6;;;29343:37;29397:18;;15302:28:3::1;29091:330:6::0;15302:28:3::1;15340:17;15360:39;15374:9;15393:4;15360:13;:39::i;:::-;15340:59;;15430:4;15417:9;:17;;15409:40;;;::::0;-1:-1:-1;;;15409:40:3;;29628:2:6;15409:40:3::1;::::0;::::1;29610:21:6::0;29667:2;29647:18;;;29640:30;-1:-1:-1;;;29686:18:6;;;29679:40;29736:18;;15409:40:3::1;29426:334:6::0;15409:40:3::1;-1:-1:-1::0;;;;;15467:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;15500:4;;15467:18;:29:::1;::::0;15486:9;;15467:29:::1;:::i;:::-;;;;;;;;;;;;;;:37;;15459:62;;;::::0;-1:-1:-1;;;15459:62:3;;29967:2:6;15459:62:3::1;::::0;::::1;29949:21:6::0;30006:2;29986:18;;;29979:30;-1:-1:-1;;;30025:18:6;;;30018:42;30077:18;;15459:62:3::1;29765:336:6::0;15459:62:3::1;-1:-1:-1::0;;;;;15621:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;::::1;::::0;15640:9;;15621:29:::1;:::i;:::-;;;;;;;;;;;;;;15552:49;15565:11;:18;15577:5;-1:-1:-1::0;;;;;15565:18:3::1;-1:-1:-1::0;;;;;15565:18:3::1;;;;;;;;;;;;15584:9;15565:29;;;;;;:::i;:::-;;;;;;;;;;;;;;15596:4;15552:12;:49::i;:::-;:98;;15531:159;;;::::0;-1:-1:-1;;;15531:159:3;;30308:2:6;15531:159:3::1;::::0;::::1;30290:21:6::0;30347:2;30327:18;;;30320:30;-1:-1:-1;;;30366:18:6;;;30359:44;30420:18;;15531:159:3::1;30106:338:6::0;15531:159:3::1;-1:-1:-1::0;;;;;15758:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;15732:83:::1;::::0;15758:18;:29:::1;::::0;15777:9;;15758:29:::1;:::i;15732:83::-;-1:-1:-1::0;;;;;15700:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;::::1;::::0;15719:9;;15700:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:115;15826:28:::1;15857:26;15873:9:::0;15857:15:::1;:26::i;:::-;15893:36;::::0;-1:-1:-1;;;15893:36:3;;15826:57;;-1:-1:-1;;;;;;15893:23:3;::::1;::::0;::::1;::::0;:36:::1;::::0;15917:5;;15924:4;;15893:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15167:769;;15032:904:::0;;;:::o;8795:41::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8795:41:3;;;;;;;:::i;20937:175::-;-1:-1:-1;;;;;21076:18:3;;21046:7;21076:18;;;:11;:18;;;;;;:29;;;;21095:9;;21076:29;:::i;7008:1350::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;7141:19:3;::::1;::::0;;::::1;::::0;:40:::1;;-1:-1:-1::0;;;;;;7164:17:3;::::1;::::0;::::1;7141:40;7133:49;;;::::0;::::1;;7224:12;::::0;:30:::1;::::0;-1:-1:-1;;;7224:30:3;;-1:-1:-1;;;;;4139:32:6;;;7224:30:3::1;::::0;::::1;4121:51:6::0;7192:29:3::1;::::0;7224:12:::1;::::0;:23:::1;::::0;4094:18:6;;7224:30:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;7224:30:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;7192:62;;7272:5;:14;;;7290:1;7272:19;:42;;;;7295:5;:14;;;7313:1;7295:19;7272:42;7264:67;;;::::0;-1:-1:-1;;;7264:67:3;;30651:2:6;7264:67:3::1;::::0;::::1;30633:21:6::0;30690:2;30670:18;;;30663:30;-1:-1:-1;;;30709:18:6;;;30702:42;30761:18;;7264:67:3::1;30449:336:6::0;7264:67:3::1;-1:-1:-1::0;;;;;7357:21:3;::::1;7342:12;7357:21:::0;;;:14:::1;:21;::::0;;;;;;;7379:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;7379:6:3;;::::1;::::0;;;;7357:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;7342:44;;7396:18;7417:14;:19;7432:3;-1:-1:-1::0;;;;;7417:19:3::1;-1:-1:-1::0;;;;;7417:19:3::1;;;;;;;;;;;;7437:6;;;;;;;;;;;;;-1:-1:-1::0;;;7437:6:3::1;;::::0;7417:27:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;7396:48;;7466:6;7458:4;:14;7454:850;;7520:26;7533:4;7539:6;7520:12;:26::i;:::-;7488:14;:21;7503:5;-1:-1:-1::0;;;;;7488:21:3::1;-1:-1:-1::0;;;;;7488:21:3::1;;;;;;;;;;;;7510:6;;;;;;;;;;;;;-1:-1:-1::0;;;7510:6:3::1;;::::0;7488:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:58;7590:32:::1;7603:10:::0;7615:6;7590:12:::1;:32::i;:::-;7560:14;:19;7575:3;-1:-1:-1::0;;;;;7560:19:3::1;-1:-1:-1::0;;;;;7560:19:3::1;;;;;;;;;;;;7580:6;;;;;;;;;;;;;-1:-1:-1::0;;;7580:6:3::1;;::::0;7560:27:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:62;7454:850:::1;;;-1:-1:-1::0;;;;;7653:21:3;::::1;7685:1;7653:21:::0;;;:14:::1;:21;::::0;;;;;;;7675:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;7675:6:3;;::::1;::::0;;;;7653:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:33;;;;-1:-1:-1;;;;;7719:23:3;::::1;7701:15;7719:23:::0;;;:16:::1;:23:::0;;;;;7743:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;7743:6:3;;::::1;::::0;;;;7719:31;;7701:15;;7719:31:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;7701:49;;7799:6;7768:27;7781:4;7787:7;7768:12;:27::i;:::-;:37;7764:530;;7859:107;7893:7;7922:26;7935:6;7943:4;7922:12;:26::i;:::-;7859:12;:107::i;:::-;7825:16;:23;7842:5;-1:-1:-1::0;;;;;7825:23:3::1;-1:-1:-1::0;;;;;7825:23:3::1;;;;;;;;;;;;7849:6;;;;;;;;;;;;;-1:-1:-1::0;;;7849:6:3::1;;::::0;7825:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:141;8014:32:::1;8027:10:::0;8039:6;8014:12:::1;:32::i;:::-;7984:14;:19;7999:3;-1:-1:-1::0;;;;;7984:19:3::1;-1:-1:-1::0;;;;;7984:19:3::1;;;;;;;;;;;;8004:6;;;;;;;;;;;;;-1:-1:-1::0;;;8004:6:3::1;;::::0;7984:27:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:62;7764:530:::1;;;-1:-1:-1::0;;;;;8085:23:3;::::1;8119:1;8085:23:::0;;;:16:::1;:23;::::0;;;;;;;8109:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;8109:6:3;;::::1;::::0;;;;8085:31;;:23;;:31:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;8168:111:::1;8202:10:::0;8234:27:::1;8247:4:::0;8253:7;8234:12:::1;:27::i;:::-;8168:12;:111::i;:::-;8138:14;:19;8153:3;-1:-1:-1::0;;;;;8138:19:3::1;-1:-1:-1::0;;;;;8138:19:3::1;;;;;;;;;;;;8158:6;;;;;;;;;;;;;-1:-1:-1::0;;;8158:6:3::1;;::::0;8138:27:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:141;7764:530:::1;7639:665;7454:850;8313:15;8322:5;8313:8;:15::i;:::-;8338:13;8347:3;8338:8;:13::i;6630:88::-:0;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6695:11:3::1;:16:::0;6630:88::o;25213:243::-;25321:7;25344:28;25375:26;25391:9;25375:15;:26::i;:::-;25418:31;;-1:-1:-1;;;25418:31:3;;-1:-1:-1;;;;;4139:32:6;;;25418:31:3;;;4121:51:6;25344:57:3;;-1:-1:-1;25418:24:3;;;;;;4094:18:6;;25418:31:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25411:38;25213:243;-1:-1:-1;;;;25213:243:3:o;14285:741::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;14585:10:::1;::::0;-1:-1:-1;;;;;14585:10:3::1;14571;:24;::::0;:53:::1;;-1:-1:-1::0;14613:11:3::1;::::0;-1:-1:-1;;;;;14613:11:3::1;14599:10;:25;14571:53;14550:144;;;::::0;-1:-1:-1;;;14550:144:3;;31181:2:6;14550:144:3::1;::::0;::::1;31163:21:6::0;31220:2;31200:18;;;31193:30;31259:34;31239:18;;;31232:62;-1:-1:-1;;;31310:18:6;;;31303:42;31362:19;;14550:144:3::1;30979:408:6::0;14550:144:3::1;-1:-1:-1::0;;;;;14763:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;14737:89:::1;::::0;14763:18;:29:::1;::::0;14782:9;;14763:29:::1;:::i;:::-;;;;;;;;;;;;;;14806:10;14737:12;:89::i;:::-;-1:-1:-1::0;;;;;14705:18:3;::::1;;::::0;;;:11:::1;:18;::::0;;;;;;:29;;::::1;::::0;14724:9;;14705:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:121;14836:183:::1;14857:5:::0;14876:10;14900:9;14923:10;14947:11;14972:9;14995:14;14836:7:::1;:183::i;:::-;;14285:741:::0;;;;;;;:::o;5776:106::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5850:20:3::1;:25:::0;5776:106::o;5175:84::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5238:9:3::1;:14:::0;5175:84::o;21118:961::-;21173:7;21207:1;21200:4;:8;21192:17;;;;;;21242:10;21227:26;;;;:14;:26;;;;;;;;;21254:6;;;;;;;;;;-1:-1:-1;;;21254:6:3;;;;;;;21227:34;;21265:4;;21227:26;:34;;;:::i;:::-;;;;;;;;;;;;;;:42;;21219:69;;;;-1:-1:-1;;;21219:69:3;;30308:2:6;21219:69:3;;;30290:21:6;30347:2;30327:18;;;30320:30;-1:-1:-1;;;30366:18:6;;;30359:44;30420:18;;21219:69:3;30106:338:6;21219:69:3;21407:10;21392:26;;;;:14;:26;;;;;;;;;21419:6;;;;;;;;;;-1:-1:-1;;;21419:6:3;;;;;;;21392:34;;;;21419:6;21392:34;:::i;:::-;;;;;;;;;;;;;;;;;;21347:10;21332:26;;;;:14;:26;;;;;21359:6;;;;;;;;-1:-1:-1;;;21359:6:3;;;;;;;21332:34;;21392;;21319:54;;21332:34;;21392;21332;:::i;21319:54::-;:107;21298:170;;;;-1:-1:-1;;;21298:170:3;;31594:2:6;21298:170:3;;;31576:21:6;31633:2;31613:18;;;31606:30;-1:-1:-1;;;31652:18:6;;;31645:46;31708:18;;21298:170:3;31392:340:6;21298:170:3;21496:10;21479:28;;;;:16;:28;;;;;;;;21510:15;21479:46;;;;21535:18;:30;;;;;:60;;;;;;;;:67;;;21675:26;;;:14;:26;;;;;;21702:6;;;;;;;;;;-1:-1:-1;;;21702:6:3;;;;;;;21675:34;;21649:88;;21675:26;:34;;;:::i;21649:88::-;21627:10;21612:26;;;;:14;:26;;;;;;;;;21639:6;;;;;;;;;;-1:-1:-1;;;21639:6:3;;;;;;;21612:34;;;;21639:6;21612:34;:::i;:::-;;;;;;;;;;;;;;;;:125;;;;21829:10;21812:28;;;;:16;:28;;;;;21841:6;;;;;;;;-1:-1:-1;;;21841:6:3;;;;;;;21812:36;21786:90;;21812:36;;;:::i;21786:90::-;21764:10;21747:28;;;;:16;:28;;;;;;;;;21776:6;;;;;;;;;;-1:-1:-1;;;21776:6:3;;;;;;;21747:36;;;;21776:6;21747:36;:::i;:::-;;;;;;;;;;;;;;:129;21887:20;21896:10;21887:8;:20::i;:::-;21918:46;21926:10;21918:46;;;;;;;;;;;;21942:6;;;;;;;;;;;;;-1:-1:-1;;;21942:6:3;;;21950:4;21956:1;21959;21962;21918:7;:46::i;:::-;;21980:37;22000:10;22012:4;21980:37;;;;;;;:::i;:::-;;;;;;;;22035;22053:10;22065:6;;;;;;;;;;;;;-1:-1:-1;;;22065:6:3;;;22035:17;:37::i;3887:108::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;3962:17:3::1;:26:::0;3887:108::o;26362:156::-;26450:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26450:20:3;26493:18;;;;:7;:18;;;;;;;;;26486:25;;;;;;;;;;;;;;;-1:-1:-1;;;;;26486:25:3;;;;;;;;;;;;;;;26493:18;;26486:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26362:156;;;:::o;1973:101:5:-;1387:7;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;2037:30:::1;2064:1;2037:18;:30::i;:::-;1973:101::o:0;11049:404:3:-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;11221:9:3::1;:21:::0;;-1:-1:-1;;;;;;11221:21:3;;::::1;-1:-1:-1::0;;;;;11221:21:3;;::::1;::::0;;::::1;::::0;;;11252:10:::1;:22:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;11284:11:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;11318:12:::1;:26:::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;11354:12:::1;:39:::0;;;::::1;::::0;;::::1;::::0;;;11403:13:::1;:43:::0;;;;::::1;::::0;;::::1;::::0;;11049:404::o;4552:92::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4619:9:3::1;:18:::0;4552:92::o;3536:177::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;3693:13:3::1;3665:14;3680:9;;3665:25;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;-1:-1:-1;;;;;3665:41:3;;;::::1;-1:-1:-1::0;;;;;;3665:41:3;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;3536:177:3:o;4110:106::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4184:16:3::1;:25:::0;4110:106::o;4743:102::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4815:14:3::1;:23:::0;4743:102::o;4329:108::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;4404:17:3::1;:26:::0;4329:108::o;22957:370::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;23045:23:3;::::1;23026:16;23045:23:::0;;;:16:::1;:23;::::0;;;;;;;23069:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;23069:6:3;;::::1;::::0;;;;23045:31;;:23;;:31:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;23026:50;;23105:1;23094:8;:12;23086:35;;;::::0;-1:-1:-1;;;23086:35:3;;32217:2:6;23086:35:3::1;::::0;::::1;32199:21:6::0;32256:2;32236:18;;;32229:30;-1:-1:-1;;;32275:18:6;;;32268:40;32325:18;;23086:35:3::1;32015:334:6::0;23086:35:3::1;-1:-1:-1::0;;;;;23131:23:3;::::1;23165:1;23131:23:::0;;;:16:::1;:23;::::0;;;;;;;23155:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;23155:6:3;;::::1;::::0;;;;23131:31;;:23;;:31:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:35;;;;-1:-1:-1;;;;;23234:21:3;::::1;;::::0;;;:14:::1;:21:::0;;;;;23256:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;23256:6:3;;::::1;::::0;;;;23234:29;23208:87:::1;::::0;23234:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;23277:8;23208:12;:87::i;:::-;23176:14;:21;23191:5;-1:-1:-1::0;;;;;23176:21:3::1;-1:-1:-1::0;;;;;23176:21:3::1;;;;;;;;;;;;23198:6;;;;;;;;;;;;;-1:-1:-1::0;;;23198:6:3::1;;::::0;23176:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:119;23305:15:::1;23314:5:::0;23305:8:::1;:15::i;6821:86::-:0;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6885:10:3::1;:15:::0;6821:86::o;26524:102::-;26575:15;26609:10;26602:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26602:17:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26524:102;:::o;19327:1604::-;10750:9;;-1:-1:-1;;;;;10750:9:3;10742:61;;;;-1:-1:-1;;;10742:61:3;;;;;;;:::i;:::-;10821:10;;-1:-1:-1;;;;;10821:10:3;10813:62;;;;-1:-1:-1;;;10813:62:3;;;;;;;:::i;:::-;10893:11;;-1:-1:-1;;;;;10893:11:3;10885:64;;;;-1:-1:-1;;;10885:64:3;;;;;;;:::i;:::-;10967:12;;-1:-1:-1;;;;;10967:12:3;10959:66;;;;-1:-1:-1;;;10959:66:3;;;;;;;:::i;:::-;19427:12:::1;::::0;-1:-1:-1;;;;;19427:12:3::1;19413:10;:26;19405:51;;;;-1:-1:-1::0;;;19405:51:3::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19474:19:3;::::1;19466:44;;;::::0;-1:-1:-1;;;19466:44:3;;32556:2:6;19466:44:3::1;::::0;::::1;32538:21:6::0;32595:2;32575:18;;;32568:30;-1:-1:-1;;;32614:18:6;;;32607:42;32666:18;;19466:44:3::1;32354:336:6::0;19466:44:3::1;-1:-1:-1::0;;;;;19546:21:3;::::1;19520:23;19546:21:::0;;;:14:::1;:21;::::0;;;;;;;19568:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;19568:6:3;;::::1;::::0;;;;19546:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;19520:55;;19585:13;19612:21:::0;19670:9:::1;;19651:15;:28;19647:810;;19703:9;;19695:17;;19758:82;19788:15;19821:5;19758:12;:82::i;:::-;19726:14;:21;19741:5;-1:-1:-1::0;;;;;19726:21:3::1;-1:-1:-1::0;;;;;19726:21:3::1;;;;;;;;;;;;19748:6;;;;;;;;;;;;;-1:-1:-1::0;;;19748:6:3::1;;::::0;19726:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:114;19647:810:::1;;;-1:-1:-1::0;;;;;19871:21:3;::::1;19903:1;19871:21:::0;;;:14:::1;:21;::::0;;;;;;;19893:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;19893:6:3;;::::1;::::0;;;;19871:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:33;;;;-1:-1:-1;;;;;19937:23:3;::::1;19919:15;19937:23:::0;;;:16:::1;:23:::0;;;;;19961:6;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;19961:6:3;;::::1;::::0;;;;19937:31;;19919:15;;19937:31:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;19919:49;;20028:9;;19986:38;19999:15;20016:7;19986:12;:38::i;:::-;:51;19982:465;;20065:9;::::0;;-1:-1:-1;20108:40:3::1;20065:9:::0;20132:15;20108:12:::1;:40::i;:::-;20092:56;;20200:94;20234:7;20263:13;20200:12;:94::i;:::-;20166:16;:23;20183:5;-1:-1:-1::0;;;;;20166:23:3::1;-1:-1:-1::0;;;;;20166:23:3::1;;;;;;;;;;;;20190:6;;;;;;;;;;;;;-1:-1:-1::0;;;20190:6:3::1;;::::0;20166:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:128;19982:465:::1;;;20341:38;20354:7;20363:15;20341:12;:38::i;:::-;20333:46;;20431:1;20397:16;:23;20414:5;-1:-1:-1::0;;;;;20397:23:3::1;-1:-1:-1::0;;;;;20397:23:3::1;;;;;;;;;;;;20421:6;;;;;;;;;;;;;-1:-1:-1::0;;;20421:6:3::1;;::::0;20397:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;19982:465:::1;19857:600;19647:810;20466:15;20475:5;20466:8;:15::i;:::-;20524:12;::::0;:30:::1;::::0;-1:-1:-1;;;20524:30:3;;-1:-1:-1;;;;;4139:32:6;;;20524:30:3::1;::::0;::::1;4121:51:6::0;20492:29:3::1;::::0;20524:12:::1;::::0;:23:::1;::::0;4094:18:6;;20524:30:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;20524:30:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;20492:62;;20595:12;;20579:5;:12;;;:28;;:88;;20666:1;20579:88;;;20638:12;;20623:5;:12;;;:27;;;;:::i;:::-;20564:12;::::0;::::1;:103:::0;;;20721:16:::1;::::0;::::1;::::0;20747:12:::1;::::0;:63:::1;::::0;-1:-1:-1;;;20747:63:3;;-1:-1:-1;;;;;28551:32:6;;;20747:63:3::1;::::0;::::1;28533:51:6::0;28620:13;;28600:18;;;28593:41;28615:2;28676:15;;28670:22;28650:18;;;28643:50;28709:18;;;28702:34;;;;20721:16:3;;20747:12:::1;::::0;:29:::1;::::0;28505:19:6;;20747:63:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20821:28;20852:23;20868:6;;;;;;;;;;;;;-1:-1:-1::0;;;20868:6:3::1;;::::0;20852:15:::1;:23::i;:::-;20821:54;;20885:14;-1:-1:-1::0;;;;;20885:23:3::1;;20909:7;1387::5::0;1413:6;-1:-1:-1;;;;;1413:6:5;;1341:85;20909:7:3::1;20918:5;20885:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19395:1536;;;;;;19327:1604:::0;:::o;3013:398::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;3097:19:3;::::1;;::::0;;;:12:::1;:19;::::0;;;;:27;;;3147:1:::1;3138:10:::0;::::1;3134:271;;;-1:-1:-1::0;;;;;3179:21:3;::::1;3164:12;3179:21:::0;;;:14:::1;:21;::::0;;;;;;;3201:6;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;3201:6:3;;::::1;::::0;;;;3179:29;;:21;;:29:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;3164:44;;3238:17;;3230:4;:25;;3222:53;;;::::0;-1:-1:-1;;;3222:53:3;;19132:2:6;3222:53:3::1;::::0;::::1;19114:21:6::0;19171:2;19151:18;;;19144:30;-1:-1:-1;;;19190:18:6;;;19183:45;19245:18;;3222:53:3::1;18930:339:6::0;3222:53:3::1;3289:12;::::0;:37:::1;::::0;-1:-1:-1;;;3289:37:3;;-1:-1:-1;;;;;3289:12:3;;::::1;::::0;:27:::1;::::0;:37:::1;::::0;3317:5;;3324:1:::1;::::0;3289:37:::1;;;:::i;5358:90::-:0;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5424:12:3::1;:17:::0;5358:90::o;4954:106::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;5028:17:3::1;:25:::0;4954:106::o;6226:::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6300:20:3::1;:25:::0;6226:106::o;3719:162::-;3819:7;3849:14;3864:9;;3849:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;3849:25:3;;-1:-1:-1;3719:162:3;;;;:::o;2223:232:5:-;1387:7;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;2324:22:5;::::1;2303:107;;;::::0;-1:-1:-1;;;2303:107:5;;33314:2:6;2303:107:5::1;::::0;::::1;33296:21:6::0;33353:2;33333:18;;;33326:30;33392:34;33372:18;;;33365:62;-1:-1:-1;;;33443:18:6;;;33436:36;33489:19;;2303:107:5::1;33112:402:6::0;2303:107:5::1;2420:28;2439:8;2420:18;:28::i;:::-;2223:232:::0;:::o;24584:245:3:-;24698:7;-1:-1:-1;;;;;24729:19:3;;24721:52;;;;-1:-1:-1;;;24721:52:3;;33721:2:6;24721:52:3;;;33703:21:6;33760:2;33740:18;;;33733:30;-1:-1:-1;;;33779:18:6;;;33772:50;33839:18;;24721:52:3;33519:344:6;24721:52:3;-1:-1:-1;;;;;24791:20:3;;;;;;:13;:20;;;;;;;:31;;;;24812:9;;24791:31;:::i;23333:1245::-;23392:21;23416:18;;;:7;:18;;;;;;;;23392:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;23392:42:3;;;;;;;;;;;;;23416:18;;23392:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23392:42:3;;;-1:-1:-1;;23392:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23453:16;;23392:42;;-1:-1:-1;23445:59:3;;;;-1:-1:-1;;;23445:59:3;;34070:2:6;23445:59:3;;;34052:21:6;34109:2;34089:18;;;34082:30;-1:-1:-1;;;34128:18:6;;;34121:46;34184:18;;23445:59:3;33868:340:6;23445:59:3;23522:16;;;;-1:-1:-1;;;;;23522:30:3;23542:10;23522:30;23514:64;;;;-1:-1:-1;;;23514:64:3;;34415:2:6;23514:64:3;;;34397:21:6;34454:2;34434:18;;;34427:30;-1:-1:-1;;;34473:18:6;;;34466:51;34534:18;;23514:64:3;34213:345:6;23514:64:3;23597:7;:18;;;23619:1;23597:23;23589:48;;;;-1:-1:-1;;;23589:48:3;;34765:2:6;23589:48:3;;;34747:21:6;34804:2;34784:18;;;34777:30;-1:-1:-1;;;34823:18:6;;;34816:42;34875:18;;23589:48:3;34563:336:6;23589:48:3;23709:17;;;;23686:10;23669:28;;;;:16;:28;;;;;;;;;23698:6;;;;;;;;;;-1:-1:-1;;;23698:6:3;;;;;;;23669:36;;;;23698:6;23669:36;:::i;:::-;;;;;;;;;;;;;;:57;;23648:114;;;;-1:-1:-1;;;23648:114:3;;32217:2:6;23648:114:3;;;32199:21:6;32256:2;32236:18;;;32229:30;-1:-1:-1;;;32275:18:6;;;32268:40;32325:18;;23648:114:3;32015:334:6;23648:114:3;23833:17;;:26;;23853:6;23833:26;:::i;:::-;23814:7;:16;;;:45;;;;:::i;:::-;23794:15;:66;;23773:127;;;;-1:-1:-1;;;23773:127:3;;35279:2:6;23773:127:3;;;35261:21:6;35318:2;35298:18;;;35291:30;-1:-1:-1;;;35337:18:6;;;35330:44;35391:18;;23773:127:3;35077:338:6;23773:127:3;23993:10;23976:28;;;;:16;:28;;;;;;;;;24005:6;;;;;;;;;;-1:-1:-1;;;24005:6:3;;;;;;;23976:36;;23950:103;;23976:28;:36;;;:::i;:::-;;;;;;;;;;;;;;24026:7;:17;;;23950:12;:103::i;:::-;23928:10;23911:28;;;;:16;:28;;;;;;;;;23940:6;;;;;;;;;;-1:-1:-1;;;23940:6:3;;;;;;;23911:36;;;;23940:6;23911:36;:::i;:::-;;;;;;;;;;;;;;;;:142;;;;24139:10;24125:25;;;;:13;:25;;;;;24151:6;;;;;;;;-1:-1:-1;;;24151:6:3;;;;;;;24125:33;24099:100;;24125:33;;;:::i;:::-;;;;;;;;;;;;;;24172:7;:17;;;24099:12;:100::i;:::-;24077:10;24063:25;;;;:13;:25;;;;;;;;;24089:6;;;;;;;;;;-1:-1:-1;;;24089:6:3;;;;;;;24063:33;;;;24089:6;24063:33;:::i;:::-;;;;;;;;;;;;;;;;:136;;;;24231:1;24210:18;;;:22;24263:15;24242:18;;;:36;-1:-1:-1;24288:18:3;;;:7;:18;;;;;:28;;;;;;;;;;;;;-1:-1:-1;;;;;;24288:28:3;-1:-1:-1;;;;;24288:28:3;;;;;;;;;;;;;;;24210:18;;24288;:28;;;;;;;;;;:::i;:::-;-1:-1:-1;24288:28:3;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24288:28:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24337:22:3;;;:11;:22;;;;;;24326:10;:34;;24363:7;;24337:22;24326:34;;;;;;:::i;:::-;;;;;;;;;;:44;;:34;;;;;;:44;;;;;;;;;;;;-1:-1:-1;;;;;;24326:44:3;-1:-1:-1;;;;;24326:44:3;;;;;;;;;;;;;;;:34;;:44;;;;;;;;;;;:::i;:::-;-1:-1:-1;24326:44:3;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24385:57;24398:10;24410:9;24421:7;:17;;;24440:1;24385:57;;;;;;;;;:::i;:::-;;;;;;;;24453:28;24484:23;24500:6;;;;;;;;;;;;;-1:-1:-1;;;24500:6:3;;;24484:15;:23::i;:::-;24553:17;;;;24517:54;;-1:-1:-1;;;24517:54:3;;24453;;-1:-1:-1;;;;;;24517:23:3;;;;;:54;;24541:10;;24553:17;24517:54;;;:::i;13004:1275::-;13098:1;13091:4;:8;13083:28;;;;-1:-1:-1;;;13083:28:3;;29293:2:6;13083:28:3;;;29275:21:6;29332:1;29312:18;;;29305:29;-1:-1:-1;;;29350:18:6;;;29343:37;29397:18;;13083:28:3;29091:330:6;13083:28:3;13220:10;13205:26;;;;:14;:26;;;;;;;:37;;;;13232:9;;13205:37;:::i;:::-;;;;;;;;;;;;;;13182:4;13142:14;:26;13157:10;-1:-1:-1;;;;;13142:26:3;-1:-1:-1;;;;;13142:26:3;;;;;;;;;;;;13169:9;13142:37;;;;;;:::i;:::-;;;;;;;;;;;;;;:44;;;;:::i;:::-;:100;13121:170;;;;-1:-1:-1;;;13121:170:3;;36228:2:6;13121:170:3;;;36210:21:6;36267:2;36247:18;;;36240:30;36306:25;36286:18;;;36279:53;36349:18;;13121:170:3;36026:347:6;13121:170:3;13383:10;13368:26;;;;:14;:26;;;;;;;:37;;13342:91;;13368:26;:37;;13395:9;;13368:37;:::i;13342:91::-;13317:10;13302:26;;;;:14;:26;;;;;;;:37;;;;13329:9;;13302:37;:::i;:::-;;;;;;;;;;;;;;;;;:131;;;;13573:6;;;;;;;;-1:-1:-1;;;13573:6:3;;;;13556:24;13464:1;;13556:24;;13302:37;13556:24;;:::i;:::-;;;;;;;;;;;;;13546:35;;;;;;13519:9;13502:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;13492:38;;;;;;:89;13475:593;;;-1:-1:-1;13665:12:3;;:35;;-1:-1:-1;;;13665:35:3;;13689:10;13665:35;;;4121:51:6;13618:1:3;;13633:29;;-1:-1:-1;;;;;13665:12:3;;;;:23;;4094:18:6;;13665:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13665:35:3;;;;;;;;;;;;:::i;:::-;13756:10;13784:26;;;;:14;:26;;;;;;;:37;;13633:67;;-1:-1:-1;13715:120:3;;13784:37;;13811:9;;13784:37;:::i;13715:120::-;13871:14;;;;:19;:97;;;;-1:-1:-1;13951:17:3;;13925:10;13910:26;;;;:14;:26;;;;;;;:37;;;;13937:9;;13910:37;:::i;:::-;;;;;;;;;;;;;;:58;;13871:97;13850:208;;;14001:12;;:42;;-1:-1:-1;;;14001:42:3;;-1:-1:-1;;;;;14001:12:3;;;;:27;;:42;;14029:10;;14041:1;;14001:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13850:208;13592:476;13475:593;14077:57;14085:10;14077:57;;;;;;;;;;;;14101:9;14112:4;14118:1;14121:9;14132:1;14077:7;:57::i;:::-;;14145:28;14176:26;14192:9;14176:15;:26::i;:::-;14212:60;;-1:-1:-1;;;14212:60:3;;14240:10;14212:60;;;36905:34:6;14260:4:3;36955:18:6;;;36948:43;37007:18;;;37000:34;;;14145:57:3;;-1:-1:-1;;;;;;14212:27:3;;;;;36840:18:6;;14212:60:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15942:181;-1:-1:-1;;;;;16084:21:3;;16054:7;16084:21;;;:14;:21;;;;;;:32;;;;16106:9;;16084:32;:::i;6003:104::-;1387:7:5;1413:6;-1:-1:-1;;;;;1413:6:5;168:10;1553:23;1545:68;;;;-1:-1:-1;;;1545:68:5;;;;;;;:::i;:::-;6076:19:3::1;:24:::0;6003:104::o;754:206::-;835:14;;831:80;;891:5;874:22;;831:80;942:1;924:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;754:206:3:o;2838:96:0:-;2896:7;2922:5;2926:1;2922;:5;:::i;:::-;2915:12;2838:96;-1:-1:-1;;;2838:96:0:o;25462:657:3:-;25615:4;25656:18;;;:7;:18;;;;;25692:16;;;;-1:-1:-1;;;;;25692:25:3;;;:16;;:25;25684:34;;;;;;25736:11;25751:1;25736:16;:36;;;;25756:11;25771:1;25756:16;25736:36;25728:63;;;;-1:-1:-1;;;25728:63:3;;37247:2:6;25728:63:3;;;37229:21:6;37286:2;37266:18;;;37259:30;-1:-1:-1;;;37305:18:6;;;37298:44;37359:18;;25728:63:3;37045:338:6;25728:63:3;25806:25;;25802:88;;25847:18;;;:32;;;25802:88;25903:19;;:24;25899:80;;25943:25;;;;:17;;;;:25;;;;;:::i;:::-;;25899:80;26010:15;25989:18;;;:36;26041:50;;;;;;26054:5;;26061:9;;26072:5;;26079:11;;26041:50;:::i;:::-;;;;;;;;-1:-1:-1;26108:4:3;;25462:657;-1:-1:-1;;;;;25462:657:3:o;2471:96:0:-;2529:7;2555:5;2559:1;2555;:5;:::i;18993:328:3:-;19106:12;;:30;;-1:-1:-1;;;19106:30:3;;-1:-1:-1;;;;;4139:32:6;;;19106:30:3;;;4121:51:6;19074:29:3;;19106:12;;:23;;4094:18:6;;19106:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19106:30:3;;;;;;;;;;;;:::i;:::-;19194:18;;;;19222:29;;;19261:12;;:53;;;-1:-1:-1;;;19261:53:3;;-1:-1:-1;;;;;38107:32:6;;;19261:53:3;;;38089:51:6;38176:13;;38156:18;;;38149:41;38171:2;38232:15;;38226:22;38206:18;;;38199:50;38291:15;;;38285:22;38265:18;;;38258:50;38280:2;38351:15;;38345:22;38324:19;;;38317:51;38339:3;38411:16;;38405:23;38384:19;;;38377:52;38127:3;38472:16;;38466:23;38445:19;;;38438:52;38460:3;38533:16;;38527:23;38506:19;;;38499:52;19194:18:3;;-1:-1:-1;19194:18:3;;19261:12;;;:31;;38061:19:6;;19261:53:3;37854:703:6;22085:866:3;-1:-1:-1;;;;;22154:21:3;;22137:14;22154:21;;;:14;:21;;;;;;;;22176:6;;;;;;;;;;-1:-1:-1;;;22176:6:3;;;;;;;22154:29;;:21;;:29;;;:::i;:::-;;;;;;;;;;;;;;;22226:12;;-1:-1:-1;;;22226:30:3;;-1:-1:-1;;;;;4139:32:6;;;22226:30:3;;;4121:51:6;22154:29:3;;-1:-1:-1;;;22226:12:3;;;:23;;4094:18:6;;22226:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22226:30:3;;;;;;;;;;;;:::i;:::-;22194:62;;22267:38;22291:5;22298:6;22267:23;:38::i;:::-;22333:5;:14;;;22351:1;22333:19;:61;;;;;22377:17;;22368:6;:26;22333:61;:104;;;;;22420:17;;22410:6;:27;;22333:104;22316:194;;;22462:12;;:37;;-1:-1:-1;;;22462:37:3;;-1:-1:-1;;;;;22462:12:3;;;;:27;;:37;;22490:5;;22497:1;;22462:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22316:194;22537:5;:14;;;22555:1;22537:19;:60;;;;;22581:16;;22572:6;:25;22537:60;:103;;;;;22623:17;;22613:6;:27;;22537:103;22520:193;;;22665:12;;:37;;-1:-1:-1;;;22665:37:3;;-1:-1:-1;;;;;22665:12:3;;;;:27;;:37;;22693:5;;22700:1;;22665:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22520:193;22727:14;;;;:19;:50;;;;;22760:17;;22750:6;:27;;22727:50;22723:118;;;22793:12;;:37;;-1:-1:-1;;;22793:37:3;;-1:-1:-1;;;;;22793:12:3;;;;:27;;:37;;22821:5;;22828:1;;22793:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22723:118;22864:17;;22855:6;:26;22851:94;;;22897:12;;:37;;-1:-1:-1;;;22897:37:3;;-1:-1:-1;;;;;22897:12:3;;;;:27;;:37;;22925:5;;22897:12;;:37;;;:::i;22851:94::-;22127:824;;22085:866;:::o;11459:1539::-;11719:16;276:1;415:7;;:19;;407:63;;;;-1:-1:-1;;;407:63:3;;38764:2:6;407:63:3;;;38746:21:6;38803:2;38783:18;;;38776:30;38842:33;38822:18;;;38815:61;38893:18;;407:63:3;38562:355:6;407:63:3;276:1;481:7;:18;-1:-1:-1;;;;;11755:19:3;::::1;11747:44;;;::::0;-1:-1:-1;;;11747:44:3;;32556:2:6;11747:44:3::1;::::0;::::1;32538:21:6::0;32595:2;32575:18;;;32568:30;-1:-1:-1;;;32614:18:6;;;32607:42;32666:18;;11747:44:3::1;32354:336:6::0;11747:44:3::1;11809:23:::0;;11801:54:::1;;;::::0;-1:-1:-1;;;11801:54:3;;39124:2:6;11801:54:3::1;::::0;::::1;39106:21:6::0;39163:2;39143:18;;;39136:30;-1:-1:-1;;;39182:18:6;;;39175:43;39235:18;;11801:54:3::1;38922:337:6::0;11801:54:3::1;11873:24:::0;11865:51:::1;;;::::0;-1:-1:-1;;;11865:51:3;;39466:2:6;11865:51:3::1;::::0;::::1;39448:21:6::0;39505:2;39485:18;;;39478:30;-1:-1:-1;;;39524:18:6;;;39517:44;39578:18;;11865:51:3::1;39264:338:6::0;11865:51:3::1;11934:23:::0;11926:49:::1;;;::::0;-1:-1:-1;;;11926:49:3;;39809:2:6;11926:49:3::1;::::0;::::1;39791:21:6::0;39848:2;39828:18;;;39821:30;-1:-1:-1;;;39867:18:6;;;39860:43;39920:18;;11926:49:3::1;39607:337:6::0;11926:49:3::1;11993:28:::0;11985:59:::1;;;::::0;-1:-1:-1;;;11985:59:3;;40151:2:6;11985:59:3::1;::::0;::::1;40133:21:6::0;40190:2;40170:18;;;40163:30;-1:-1:-1;;;40209:18:6;;;40202:48;40267:18;;11985:59:3::1;39949:342:6::0;11985:59:3::1;12055:17;12075:26;:16;727:14:::0;;636:112;12075:26:::1;12158:1;12119:18:::0;;;:7:::1;:18;::::0;;;;:27;12055:46;;-1:-1:-1;12119:41:3;12111:65:::1;;;::::0;-1:-1:-1;;;12111:65:3;;40498:2:6;12111:65:3::1;::::0;::::1;40480:21:6::0;40537:2;40517:18;;;40510:30;-1:-1:-1;;;40556:18:6;;;40549:41;40607:18;;12111:65:3::1;40296:335:6::0;12111:65:3::1;12211:362;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;12211:362:3;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12520:15:::1;12211:362:::0;;;;-1:-1:-1;12211:362:3;;;;;;12584:18;;;:7:::1;:18:::0;;;;;;:28;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;12584:28:3::1;::::0;;;::::1;;::::0;;;;;;;12211:362;;;;12584:18;;:28:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12584:28:3::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12584:28:3::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;12623:10:::1;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;12623:24:3;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;;12623:24:3::1;-1:-1:-1::0;;;;;12623:24:3;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12623:24:3::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;12623:24:3::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;12682:10:::1;:17:::0;:21:::1;::::0;12702:1:::1;::::0;12682:21:::1;:::i;:::-;12657:22;::::0;;;:11:::1;:22;::::0;;;;:46;12714:28:::1;:16;:26;:28::i;:::-;12757:208;12780:9;12803:5;12822:10;12846:9;12869:10;12893:11;12918:9;12941:14;12757:208;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;233:1:3;522:22;;12982:9;11459:1539;-1:-1:-1;;;;;;;;11459:1539:3:o;2609:187:5:-;2682:16;2701:6;;-1:-1:-1;;;;;2717:17:5;;;-1:-1:-1;;;;;;2717:17:5;;;;;;2749:40;;2701:6;;;;;;;2749:40;;2682:16;2749:40;2672:124;2609:187;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:6;-1:-1:-1;;;;;89:31:6;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:6:o;609:127::-;670:10;665:3;661:20;658:1;651:31;701:4;698:1;691:15;725:4;722:1;715:15;741:255;813:2;807:9;855:6;843:19;;-1:-1:-1;;;;;877:34:6;;913:22;;;874:62;871:88;;;939:18;;:::i;:::-;975:2;968:22;741:255;:::o;1001:::-;1073:2;1067:9;1115:6;1103:19;;-1:-1:-1;;;;;1137:34:6;;1173:22;;;1134:62;1131:88;;;1199:18;;:::i;1261:255::-;1333:2;1327:9;1375:6;1363:19;;-1:-1:-1;;;;;1397:34:6;;1433:22;;;1394:62;1391:88;;;1459:18;;:::i;1521:255::-;1593:2;1587:9;1635:6;1623:19;;-1:-1:-1;;;;;1657:34:6;;1693:22;;;1654:62;1651:88;;;1719:18;;:::i;1781:255::-;1853:2;1847:9;1895:6;1883:19;;-1:-1:-1;;;;;1917:34:6;;1953:22;;;1914:62;1911:88;;;1979:18;;:::i;2041:275::-;2112:2;2106:9;2177:2;2158:13;;-1:-1:-1;;2154:27:6;2142:40;;-1:-1:-1;;;;;2197:34:6;;2233:22;;;2194:62;2191:88;;;2259:18;;:::i;:::-;2295:2;2288:22;2041:275;;-1:-1:-1;2041:275:6:o;2321:187::-;2370:4;-1:-1:-1;;;;;2395:6:6;2392:30;2389:56;;;2425:18;;:::i;:::-;-1:-1:-1;2491:2:6;2470:15;-1:-1:-1;;2466:29:6;2497:4;2462:40;;2321:187::o;2513:464::-;2556:5;2609:3;2602:4;2594:6;2590:17;2586:27;2576:55;;2627:1;2624;2617:12;2576:55;2663:6;2650:20;2694:49;2710:32;2739:2;2710:32;:::i;:::-;2694:49;:::i;:::-;2768:2;2759:7;2752:19;2814:3;2807:4;2802:2;2794:6;2790:15;2786:26;2783:35;2780:55;;;2831:1;2828;2821:12;2780:55;2896:2;2889:4;2881:6;2877:17;2870:4;2861:7;2857:18;2844:55;2944:1;2919:16;;;2937:4;2915:27;2908:38;;;;2923:7;2513:464;-1:-1:-1;;;2513:464:6:o;2982:457::-;3060:6;3068;3121:2;3109:9;3100:7;3096:23;3092:32;3089:52;;;3137:1;3134;3127:12;3089:52;3176:9;3163:23;3195:31;3220:5;3195:31;:::i;:::-;3245:5;-1:-1:-1;3301:2:6;3286:18;;3273:32;-1:-1:-1;;;;;3317:30:6;;3314:50;;;3360:1;3357;3350:12;3314:50;3383;3425:7;3416:6;3405:9;3401:22;3383:50;:::i;:::-;3373:60;;;2982:457;;;;;:::o;3626:322::-;3695:6;3748:2;3736:9;3727:7;3723:23;3719:32;3716:52;;;3764:1;3761;3754:12;3716:52;3804:9;3791:23;-1:-1:-1;;;;;3829:6:6;3826:30;3823:50;;;3869:1;3866;3859:12;3823:50;3892;3934:7;3925:6;3914:9;3910:22;3892:50;:::i;4183:180::-;4242:6;4295:2;4283:9;4274:7;4270:23;4266:32;4263:52;;;4311:1;4308;4301:12;4263:52;-1:-1:-1;4334:23:6;;4183:180;-1:-1:-1;4183:180:6:o;4477:258::-;4549:1;4559:113;4573:6;4570:1;4567:13;4559:113;;;4649:11;;;4643:18;4630:11;;;4623:39;4595:2;4588:10;4559:113;;;4690:6;4687:1;4684:13;4681:48;;;4725:1;4716:6;4711:3;4707:16;4700:27;4681:48;;4477:258;;;:::o;4740:::-;4782:3;4820:5;4814:12;4847:6;4842:3;4835:19;4863:63;4919:6;4912:4;4907:3;4903:14;4896:4;4889:5;4885:16;4863:63;:::i;:::-;4980:2;4959:15;-1:-1:-1;;4955:29:6;4946:39;;;;4987:4;4942:50;;4740:258;-1:-1:-1;;4740:258:6:o;5003:1005::-;5428:25;;;-1:-1:-1;;;;;5489:32:6;;5484:2;5469:18;;5462:60;5416:3;5553:2;5538:18;;5531:30;;;5387:4;;5584:45;5610:18;;;5602:6;5584:45;:::i;:::-;5570:59;;5677:9;5669:6;5665:22;5660:2;5649:9;5645:18;5638:50;5705:33;5731:6;5723;5705:33;:::i;:::-;5769:3;5754:19;;5747:35;;;;-1:-1:-1;;5813:3:6;5798:19;;5791:35;;;;5857:3;5842:19;;5835:35;;;;5901:3;5886:19;;5879:35;;;;5945:3;5930:19;;5923:35;5989:3;5974:19;;;5967:35;5697:41;5003:1005;-1:-1:-1;;;;5003:1005:6:o;6013:315::-;6081:6;6089;6142:2;6130:9;6121:7;6117:23;6113:32;6110:52;;;6158:1;6155;6148:12;6110:52;6194:9;6181:23;6171:33;;6254:2;6243:9;6239:18;6226:32;6267:31;6292:5;6267:31;:::i;:::-;6317:5;6307:15;;;6013:315;;;;;:::o;6333:594::-;6429:6;6437;6445;6453;6506:3;6494:9;6485:7;6481:23;6477:33;6474:53;;;6523:1;6520;6513:12;6474:53;6562:9;6549:23;6581:31;6606:5;6581:31;:::i;:::-;6631:5;-1:-1:-1;6683:2:6;6668:18;;6655:32;;-1:-1:-1;6738:2:6;6723:18;;6710:32;-1:-1:-1;;;;;6754:30:6;;6751:50;;;6797:1;6794;6787:12;6751:50;6820;6862:7;6853:6;6842:9;6838:22;6820:50;:::i;:::-;6333:594;;;;-1:-1:-1;6810:60:6;;6917:2;6902:18;6889:32;;-1:-1:-1;;;6333:594:6:o;7124:1662::-;7183:5;7231:6;7219:9;7214:3;7210:19;7206:32;7203:52;;;7251:1;7248;7241:12;7203:52;7273:22;;:::i;:::-;7264:31;;7318:29;7337:9;7318:29;:::i;:::-;7311:5;7304:44;7408:2;7397:9;7393:18;7380:32;7375:2;7368:5;7364:14;7357:56;7464:2;7453:9;7449:18;7436:32;-1:-1:-1;;;;;7528:2:6;7520:6;7517:14;7514:34;;;7544:1;7541;7534:12;7514:34;7580:46;7622:3;7613:6;7602:9;7598:22;7580:46;:::i;:::-;7575:2;7568:5;7564:14;7557:70;7687:2;7676:9;7672:18;7659:32;7654:2;7647:5;7643:14;7636:56;7745:3;7734:9;7730:19;7717:33;7701:49;;7775:2;7765:8;7762:16;7759:36;;;7791:1;7788;7781:12;7759:36;;7828:48;7872:3;7861:8;7850:9;7846:24;7828:48;:::i;:::-;7822:3;7815:5;7811:15;7804:73;;7938:3;7927:9;7923:19;7910:33;7904:3;7897:5;7893:15;7886:58;8005:3;7994:9;7990:19;7977:33;7971:3;7964:5;7960:15;7953:58;8044:39;8078:3;8067:9;8063:19;8044:39;:::i;:::-;8038:3;8027:15;;8020:64;8103:3;8151:18;;;8138:32;8122:14;;;8115:56;8190:3;8238:18;;;8225:32;8209:14;;;8202:56;8277:3;8325:18;;;8312:32;8296:14;;;8289:56;8364:3;8412:18;;;8399:32;8383:14;;;8376:56;8451:3;8499:18;;;8486:32;8470:14;;;8463:56;8538:3;8586:18;;;8573:32;8557:14;;;8550:56;8625:3;8673:18;;;8660:32;8644:14;;;8637:56;8712:3;8760:18;;;8747:32;8731:14;;;8724:56;;;;8031:5;7124:1662;-1:-1:-1;7124:1662:6:o;8791:1891::-;8918:6;8926;8934;8942;8950;8958;9011:3;8999:9;8990:7;8986:23;8982:33;8979:53;;;9028:1;9025;9018:12;8979:53;9067:9;9054:23;9086:31;9111:5;9086:31;:::i;:::-;9136:5;-1:-1:-1;9193:2:6;9178:18;;9165:32;9206:33;9165:32;9206:33;:::i;:::-;9258:7;-1:-1:-1;9316:2:6;9301:18;;9288:32;-1:-1:-1;;;;;9369:14:6;;;9366:34;;;9396:1;9393;9386:12;9366:34;9419:22;;;;9475:6;9457:16;;;9453:29;9450:49;;;9495:1;9492;9485:12;9450:49;9523:22;;:::i;:::-;9570;9589:2;9570:22;:::i;:::-;9561:7;9554:39;9648:2;9644;9640:11;9627:25;9622:2;9613:7;9609:16;9602:51;9708:2;9704;9700:11;9687:25;9682:2;9673:7;9669:16;9662:51;9747:31;9774:2;9770;9766:11;9747:31;:::i;:::-;9742:2;9733:7;9729:16;9722:57;9814:32;9841:3;9837:2;9833:12;9814:32;:::i;:::-;9808:3;9799:7;9795:17;9788:59;9882:32;9909:3;9905:2;9901:12;9882:32;:::i;:::-;9876:3;9863:17;;9856:59;9971:3;9963:12;;;9950:26;9931:17;;;9924:53;10033:3;10025:12;;;10012:26;9993:17;;;9986:53;10058:3;10108:11;;;10095:25;10077:16;;;10070:51;10140:3;10190:11;;;10177:25;10159:16;;;10152:51;10222:3;10272:11;;;10259:25;10241:16;;;10234:51;10304:3;10345:11;;;10332:25;10369:16;;;10366:36;;;10398:1;10395;10388:12;10366:36;10436:58;10486:7;10475:8;10471:2;10467:17;10436:58;:::i;:::-;10431:2;10422:7;10418:16;10411:84;;;10514:7;10504:17;;;;;10568:2;10557:9;10553:18;10540:32;10530:42;;10619:3;10608:9;10604:19;10591:33;10581:43;;10671:3;10660:9;10656:19;10643:33;10633:43;;8791:1891;;;;;;;;:::o;10687:273::-;10743:6;10796:2;10784:9;10775:7;10771:23;10767:32;10764:52;;;10812:1;10809;10802:12;10764:52;10851:9;10838:23;10904:5;10897:13;10890:21;10883:5;10880:32;10870:60;;10926:1;10923;10916:12;10965:525;11052:6;11060;11068;11121:2;11109:9;11100:7;11096:23;11092:32;11089:52;;;11137:1;11134;11127:12;11089:52;11176:9;11163:23;11195:31;11220:5;11195:31;:::i;:::-;11245:5;-1:-1:-1;11301:2:6;11286:18;;11273:32;-1:-1:-1;;;;;11317:30:6;;11314:50;;;11360:1;11357;11350:12;11314:50;11383;11425:7;11416:6;11405:9;11401:22;11383:50;:::i;:::-;11373:60;;;11480:2;11469:9;11465:18;11452:32;11442:42;;10965:525;;;;;:::o;11495:456::-;11572:6;11580;11588;11641:2;11629:9;11620:7;11616:23;11612:32;11609:52;;;11657:1;11654;11647:12;11609:52;11696:9;11683:23;11715:31;11740:5;11715:31;:::i;:::-;11765:5;-1:-1:-1;11822:2:6;11807:18;;11794:32;11835:33;11794:32;11835:33;:::i;:::-;11495:456;;11887:7;;-1:-1:-1;;;11941:2:6;11926:18;;;;11913:32;;11495:456::o;11956:457::-;12034:6;12042;12095:2;12083:9;12074:7;12070:23;12066:32;12063:52;;;12111:1;12108;12101:12;12063:52;12151:9;12138:23;-1:-1:-1;;;;;12176:6:6;12173:30;12170:50;;;12216:1;12213;12206:12;12170:50;12239;12281:7;12272:6;12261:9;12257:22;12239:50;:::i;:::-;12229:60;;;12339:2;12328:9;12324:18;12311:32;12352:31;12377:5;12352:31;:::i;12418:954::-;12551:6;12559;12567;12575;12583;12591;12599;12652:3;12640:9;12631:7;12627:23;12623:33;12620:53;;;12669:1;12666;12659:12;12620:53;12708:9;12695:23;12727:31;12752:5;12727:31;:::i;:::-;12777:5;-1:-1:-1;12833:2:6;12818:18;;12805:32;-1:-1:-1;;;;;12886:14:6;;;12883:34;;;12913:1;12910;12903:12;12883:34;12936:50;12978:7;12969:6;12958:9;12954:22;12936:50;:::i;:::-;12926:60;;13039:2;13028:9;13024:18;13011:32;12995:48;;13068:2;13058:8;13055:16;13052:36;;;13084:1;13081;13074:12;13052:36;;13107:52;13151:7;13140:8;13129:9;13125:24;13107:52;:::i;:::-;12418:954;;;;-1:-1:-1;13097:62:6;;13206:2;13191:18;;13178:32;;-1:-1:-1;13257:3:6;13242:19;;13229:33;;13309:3;13294:19;;13281:33;;-1:-1:-1;13361:3:6;13346:19;;;13333:33;;-1:-1:-1;12418:954:6;-1:-1:-1;;;12418:954:6:o;13377:952::-;13426:3;13454:6;13487:5;13481:12;13476:3;13469:25;13540:4;13533:5;13529:16;13523:23;13555:48;13597:4;13592:3;13588:14;13574:12;-1:-1:-1;;;;;4434:31:6;4422:44;;4368:104;13555:48;;13651:4;13644:5;13640:16;13634:23;13689:2;13682:4;13677:3;13673:14;13666:26;13713:47;13756:2;13751:3;13747:12;13731:14;13713:47;:::i;:::-;13701:59;;;13808:4;13801:5;13797:16;13791:23;13856:3;13850:4;13846:14;13839:4;13834:3;13830:14;13823:38;13884:39;13918:4;13902:14;13884:39;:::i;:::-;13870:53;;;13972:4;13965:5;13961:16;13955:23;13948:4;13943:3;13939:14;13932:47;14028:4;14021:5;14017:16;14011:23;14004:4;13999:3;13995:14;13988:47;14084:4;14077:5;14073:16;14067:23;14060:4;14055:3;14051:14;14044:47;14140:4;14133:5;14129:16;14123:23;14116:4;14111:3;14107:14;14100:47;14166:6;14219:2;14212:5;14208:14;14202:21;14197:2;14192:3;14188:12;14181:43;;14243:6;14296:2;14289:5;14285:14;14279:21;14274:2;14269:3;14265:12;14258:43;;14317:6;14310:13;;;13377:952;;;;:::o;14334:255::-;14511:2;14500:9;14493:21;14474:4;14531:52;14579:2;14568:9;14564:18;14556:6;14531:52;:::i;14594:671::-;14680:6;14688;14696;14704;14757:3;14745:9;14736:7;14732:23;14728:33;14725:53;;;14774:1;14771;14764:12;14725:53;14813:9;14800:23;14832:31;14857:5;14832:31;:::i;:::-;14882:5;-1:-1:-1;14939:2:6;14924:18;;14911:32;14952:33;14911:32;14952:33;:::i;:::-;15004:7;-1:-1:-1;15063:2:6;15048:18;;15035:32;15076:33;15035:32;15076:33;:::i;:::-;15128:7;-1:-1:-1;15187:2:6;15172:18;;15159:32;15200:33;15159:32;15200:33;:::i;:::-;14594:671;;;;-1:-1:-1;14594:671:6;;-1:-1:-1;;14594:671:6:o;15478:348::-;15530:8;15540:6;15594:3;15587:4;15579:6;15575:17;15571:27;15561:55;;15612:1;15609;15602:12;15561:55;-1:-1:-1;15635:20:6;;-1:-1:-1;;;;;15667:30:6;;15664:50;;;15710:1;15707;15700:12;15664:50;15747:4;15739:6;15735:17;15723:29;;15799:3;15792:4;15783:6;15775;15771:19;15767:30;15764:39;15761:59;;;15816:1;15813;15806:12;15761:59;15478:348;;;;;:::o;15831:546::-;15911:6;15919;15927;15980:2;15968:9;15959:7;15955:23;15951:32;15948:52;;;15996:1;15993;15986:12;15948:52;16036:9;16023:23;-1:-1:-1;;;;;16061:6:6;16058:30;16055:50;;;16101:1;16098;16091:12;16055:50;16140:59;16191:7;16182:6;16171:9;16167:22;16140:59;:::i;:::-;16218:8;;-1:-1:-1;16114:85:6;-1:-1:-1;;16303:2:6;16288:18;;16275:32;16316:31;16275:32;16316:31;:::i;:::-;16366:5;16356:15;;;15831:546;;;;;:::o;16382:247::-;16441:6;16494:2;16482:9;16473:7;16469:23;16465:32;16462:52;;;16510:1;16507;16500:12;16462:52;16549:9;16536:23;16568:31;16593:5;16568:31;:::i;16634:838::-;16824:4;16853:2;16893;16882:9;16878:18;16923:2;16912:9;16905:21;16946:6;16981;16975:13;17012:6;17004;16997:22;17050:2;17039:9;17035:18;17028:25;;17112:2;17102:6;17099:1;17095:14;17084:9;17080:30;17076:39;17062:53;;17150:2;17142:6;17138:15;17171:1;17181:262;17195:6;17192:1;17189:13;17181:262;;;17288:2;17284:7;17272:9;17264:6;17260:22;17256:36;17251:3;17244:49;17316:47;17356:6;17347;17341:13;17316:47;:::i;:::-;17306:57;-1:-1:-1;17421:12:6;;;;17386:15;;;;17217:1;17210:9;17181:262;;;-1:-1:-1;17460:6:6;;16634:838;-1:-1:-1;;;;;;;16634:838:6:o;17477:411::-;17548:6;17556;17609:2;17597:9;17588:7;17584:23;17580:32;17577:52;;;17625:1;17622;17615:12;17577:52;17665:9;17652:23;-1:-1:-1;;;;;17690:6:6;17687:30;17684:50;;;17730:1;17727;17720:12;17684:50;17769:59;17820:7;17811:6;17800:9;17796:22;17769:59;:::i;:::-;17847:8;;17743:85;;-1:-1:-1;17477:411:6;-1:-1:-1;;;;17477:411:6:o;17893:390::-;17971:6;17979;18032:2;18020:9;18011:7;18007:23;18003:32;18000:52;;;18048:1;18045;18038:12;18000:52;18088:9;18075:23;-1:-1:-1;;;;;18113:6:6;18110:30;18107:50;;;18153:1;18150;18143:12;18107:50;18176;18218:7;18209:6;18198:9;18194:22;18176:50;:::i;:::-;18166:60;18273:2;18258:18;;;;18245:32;;-1:-1:-1;;;;17893:390:6:o;18288:356::-;18490:2;18472:21;;;18509:18;;;18502:30;18568:34;18563:2;18548:18;;18541:62;18635:2;18620:18;;18288:356::o;18649:276::-;18780:3;18818:6;18812:13;18834:53;18880:6;18875:3;18868:4;18860:6;18856:17;18834:53;:::i;:::-;18903:16;;;;;18649:276;-1:-1:-1;;18649:276:6:o;19274:282::-;-1:-1:-1;;;;;19474:32:6;;;;19456:51;;19538:2;19523:18;;19516:34;19444:2;19429:18;;19274:282::o;19848:380::-;19927:1;19923:12;;;;19970;;;19991:61;;20045:4;20037:6;20033:17;20023:27;;19991:61;20098:2;20090:6;20087:14;20067:18;20064:38;20061:161;;;20144:10;20139:3;20135:20;20132:1;20125:31;20179:4;20176:1;20169:15;20207:4;20204:1;20197:15;20061:161;;19848:380;;;:::o;20233:349::-;20435:2;20417:21;;;20474:2;20454:18;;;20447:30;20513:27;20508:2;20493:18;;20486:55;20573:2;20558:18;;20233:349::o;20587:::-;20789:2;20771:21;;;20828:2;20808:18;;;20801:30;20867:27;20862:2;20847:18;;20840:55;20927:2;20912:18;;20587:349::o;20941:350::-;21143:2;21125:21;;;21182:2;21162:18;;;21155:30;21221:28;21216:2;21201:18;;21194:56;21282:2;21267:18;;20941:350::o;21296:351::-;21498:2;21480:21;;;21537:2;21517:18;;;21510:30;21576:29;21571:2;21556:18;;21549:57;21638:2;21623:18;;21296:351::o;21652:336::-;21854:2;21836:21;;;21893:2;21873:18;;;21866:30;-1:-1:-1;;;21927:2:6;21912:18;;21905:42;21979:2;21964:18;;21652:336::o;21993:138::-;22072:13;;22094:31;22072:13;22094:31;:::i;22136:430::-;22190:5;22243:3;22236:4;22228:6;22224:17;22220:27;22210:55;;22261:1;22258;22251:12;22210:55;22290:6;22284:13;22321:49;22337:32;22366:2;22337:32;:::i;22321:49::-;22395:2;22386:7;22379:19;22441:3;22434:4;22429:2;22421:6;22417:15;22413:26;22410:35;22407:55;;;22458:1;22455;22448:12;22407:55;22471:64;22532:2;22525:4;22516:7;22512:18;22505:4;22497:6;22493:17;22471:64;:::i;22571:978::-;22640:5;22688:6;22676:9;22671:3;22667:19;22663:32;22660:52;;;22708:1;22705;22698:12;22660:52;22730:22;;:::i;:::-;22721:31;;22775:40;22805:9;22775:40;:::i;:::-;22768:5;22761:55;22848:49;22893:2;22882:9;22878:18;22848:49;:::i;:::-;22843:2;22836:5;22832:14;22825:73;22942:2;22931:9;22927:18;22921:25;-1:-1:-1;;;;;23006:2:6;22998:6;22995:14;22992:34;;;23022:1;23019;23012:12;22992:34;23058:57;23111:3;23102:6;23091:9;23087:22;23058:57;:::i;:::-;23053:2;23046:5;23042:14;23035:81;23169:2;23158:9;23154:18;23148:25;23143:2;23136:5;23132:14;23125:49;23228:3;23217:9;23213:19;23207:26;23201:3;23194:5;23190:15;23183:51;23288:3;23277:9;23273:19;23267:26;23261:3;23254:5;23250:15;23243:51;23340:3;23329:9;23325:19;23319:26;23303:42;;23370:2;23360:8;23357:16;23354:36;;;23386:1;23383;23376:12;23354:36;;23423:59;23478:3;23467:8;23456:9;23452:24;23423:59;:::i;:::-;23417:3;23410:5;23406:15;23399:84;;23537:3;23526:9;23522:19;23516:26;23510:3;23503:5;23499:15;23492:51;22571:978;;;;:::o;23554:1290::-;23647:6;23700:2;23688:9;23679:7;23675:23;23671:32;23668:52;;;23716:1;23713;23706:12;23668:52;23749:9;23743:16;-1:-1:-1;;;;;23819:2:6;23811:6;23808:14;23805:34;;;23835:1;23832;23825:12;23805:34;23858:22;;;;23914:6;23896:16;;;23892:29;23889:49;;;23934:1;23931;23924:12;23889:49;23960:22;;:::i;:::-;24005:33;24035:2;24005:33;:::i;:::-;23998:5;23991:48;24085:2;24081;24077:11;24071:18;24066:2;24059:5;24055:14;24048:42;24136:2;24132;24128:11;24122:18;24117:2;24110:5;24106:14;24099:42;24187:2;24183;24179:11;24173:18;24168:2;24161:5;24157:14;24150:42;24239:3;24235:2;24231:12;24225:19;24219:3;24212:5;24208:15;24201:44;24292:3;24288:2;24284:12;24278:19;24272:3;24265:5;24261:15;24254:44;24337:3;24333:2;24329:12;24323:19;24367:2;24357:8;24354:16;24351:36;;;24383:1;24380;24373:12;24351:36;24420:56;24468:7;24457:8;24453:2;24449:17;24420:56;:::i;:::-;24414:3;24407:5;24403:15;24396:81;;24524:3;24520:2;24516:12;24510:19;24504:3;24497:5;24493:15;24486:44;24549:3;24598:2;24594;24590:11;24584:18;24579:2;24572:5;24568:14;24561:42;;24622:3;24664:2;24660;24656:11;24650:18;24693:2;24683:8;24680:16;24677:36;;;24709:1;24706;24699:12;24677:36;24745:68;24805:7;24794:8;24790:2;24786:17;24745:68;:::i;:::-;24729:14;;;24722:92;;;;-1:-1:-1;24733:5:6;23554:1290;-1:-1:-1;;;;;23554:1290:6:o;25465:476::-;25533:5;25581:4;25569:9;25564:3;25560:19;25556:30;25553:50;;;25599:1;25596;25589:12;25553:50;25632:4;25626:11;25676:4;25668:6;25664:17;25747:6;25735:10;25732:22;-1:-1:-1;;;;;25699:10:6;25696:34;25693:62;25690:88;;;25758:18;;:::i;:::-;25794:4;25787:24;25859:16;;25844:32;;25930:2;25915:18;;;25909:25;25892:15;;;25885:50;;;;-1:-1:-1;25829:6:6;25465:476;-1:-1:-1;25465:476:6:o;25946:775::-;26016:5;26064:4;26052:9;26047:3;26043:19;26039:30;26036:50;;;26082:1;26079;26072:12;26036:50;26115:2;26109:9;26157:4;26149:6;26145:17;26228:6;26216:10;26213:22;-1:-1:-1;;;;;26180:10:6;26177:34;26174:62;26171:88;;;26239:18;;:::i;:::-;26279:10;26275:2;26268:22;;26308:6;26299:15;;26344:9;26338:16;26330:6;26323:32;26409:2;26398:9;26394:18;26388:25;26383:2;26375:6;26371:15;26364:50;26468:2;26457:9;26453:18;26447:25;26442:2;26434:6;26430:15;26423:50;26527:2;26516:9;26512:18;26506:25;26501:2;26493:6;26489:15;26482:50;26587:3;26576:9;26572:19;26566:26;26560:3;26552:6;26548:16;26541:52;26648:3;26637:9;26633:19;26627:26;26621:3;26613:6;26609:16;26602:52;26709:3;26698:9;26694:19;26688:26;26682:3;26674:6;26670:16;26663:52;;25946:775;;;;:::o;26726:1278::-;26818:6;26871:2;26859:9;26850:7;26846:23;26842:32;26839:52;;;26887:1;26884;26877:12;26839:52;26920:9;26914:16;-1:-1:-1;;;;;26990:2:6;26982:6;26979:14;26976:34;;;27006:1;27003;26996:12;26976:34;27029:22;;;;27085:6;27067:16;;;27063:29;27060:49;;;27105:1;27102;27095:12;27060:49;27131:22;;:::i;:::-;27176:33;27206:2;27176:33;:::i;:::-;27169:5;27162:48;27249:2;27245;27241:11;27235:18;27278:2;27268:8;27265:16;27262:36;;;27294:1;27291;27284:12;27262:36;27330:56;27378:7;27367:8;27363:2;27359:17;27330:56;:::i;:::-;27325:2;27318:5;27314:14;27307:80;;27426:2;27422;27418:11;27412:18;27455:2;27445:8;27442:16;27439:36;;;27471:1;27468;27461:12;27439:36;27507:56;27555:7;27544:8;27540:2;27536:17;27507:56;:::i;:::-;27502:2;27495:5;27491:14;27484:80;;27610:2;27606;27602:11;27596:18;27591:2;27584:5;27580:14;27573:42;27662:3;27658:2;27654:12;27648:19;27642:3;27635:5;27631:15;27624:44;27715:3;27711:2;27707:12;27701:19;27695:3;27688:5;27684:15;27677:44;27768:3;27764:2;27760:12;27754:19;27748:3;27741:5;27737:15;27730:44;27807:62;27861:7;27855:3;27851:2;27847:12;27807:62;:::i;:::-;27801:3;27794:5;27790:15;27783:87;27906:67;27965:7;27956:6;27952:2;27948:15;27906:67;:::i;:::-;27897:6;27886:18;;27879:95;27890:5;26726:1278;-1:-1:-1;;;;;26726:1278:6:o;28009:127::-;28070:10;28065:3;28061:20;28058:1;28051:31;28101:4;28098:1;28091:15;28125:4;28122:1;28115:15;28141:128;28181:3;28212:1;28208:6;28205:1;28202:13;28199:39;;;28218:18;;:::i;:::-;-1:-1:-1;28254:9:6;;28141:128::o;30790:184::-;30860:6;30913:2;30901:9;30892:7;30888:23;30884:32;30881:52;;;30929:1;30926;30919:12;30881:52;-1:-1:-1;30952:16:6;;30790:184;-1:-1:-1;30790:184:6:o;31737:273::-;31922:6;31914;31909:3;31896:33;31878:3;31948:16;;31973:13;;;31948:16;31737:273;-1:-1:-1;31737:273:6:o;32695:125::-;32735:4;32763:1;32760;32757:8;32754:34;;;32768:18;;:::i;:::-;-1:-1:-1;32805:9:6;;32695:125::o;34904:168::-;34944:7;35010:1;35006;35002:6;34998:14;34995:1;34992:21;34987:1;34980:9;34973:17;34969:45;34966:71;;;35017:18;;:::i;:::-;-1:-1:-1;35057:9:6;;34904:168::o;35420:127::-;35481:10;35476:3;35472:20;35469:1;35462:31;35512:4;35509:1;35502:15;35536:4;35533:1;35526:15;35552:469;35822:1;35818;35813:3;35809:11;35805:19;35797:6;35793:32;35782:9;35775:51;35862:6;35857:2;35846:9;35842:18;35835:34;35905:3;35900:2;35889:9;35885:18;35878:31;35756:4;35926:46;35967:3;35956:9;35952:19;35944:6;35926:46;:::i;:::-;35918:54;;36008:6;36003:2;35992:9;35988:18;35981:34;35552:469;;;;;;;:::o;40636:861::-;41005:25;;;-1:-1:-1;;;;;41066:32:6;;41061:2;41046:18;;41039:60;40993:3;41130:2;41115:18;;41108:30;;;40964:4;;41161:45;41187:18;;;41179:6;41161:45;:::i;:::-;41147:59;;41254:9;41246:6;41242:22;41237:2;41226:9;41222:18;41215:50;41282:33;41308:6;41300;41282:33;:::i;:::-;41274:41;;;41352:6;41346:3;41335:9;41331:19;41324:35;41396:6;41390:3;41379:9;41375:19;41368:35;41440:6;41434:3;41423:9;41419:19;41412:35;41484:6;41478:3;41467:9;41463:19;41456:35;40636:861;;;;;;;;;;;:::o

Swarm Source

ipfs://f134a9852eea00e34b2dcf0c1b9d09d80a4fb91f429b9612ec76a643080f1972
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.