Contract
0x5602AFcD78fd1c15101DA60fBB22624217459aC0
3
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
RecordStorage
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// 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 = "WMOVR"; 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; } }
// 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("WMOVR"); _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("WMOVR"); _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; } }
// 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; } }
// 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); }
// 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; } }
// 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; } }
[{"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"}]
Contract Creation Code
608060405267016345785d8a00006003819055670de0b6b3a7640000600455678ac7230489e80000600555662386f26fc1000060068190556007829055601c6008556009819055600a808055600b91909155600c919091556001600d819055600e819055600f805460ff191690556010556011553480156200008057600080fd5b5060405162005fa638038062005fa6833981016040819052620000a3916200022c565b620000ae3362000193565b6001805560408051631554d11560e21b8152600260048083018290528351928390036024908101842080546001600160a01b038a81166001600160a01b031992831617909255635553444360e01b865292850184905285519485900390910184208054909216908716179055818301835260058252642ba6a7ab2960d91b60208301529151839291620001419162000276565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506200018a6016620001e360201b6200412e1760201c565b505050620002db565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8054620001f05761271081555b6001816000016000828254620002079190620002b4565b909155505050565b80516001600160a01b03811681146200022757600080fd5b919050565b6000806000606084860312156200024257600080fd5b6200024d846200020f565b92506200025d602085016200020f565b91506200026d604085016200020f565b90509250925092565b6000825160005b818110156200029957602081860181015185830152016200027d565b81811115620002a9576000828501525b509190910192915050565b60008219821115620002d657634e487b7160e01b600052601160045260246000fd5b500190565b615cbb80620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106103f15760003560e01c80636951babe11610215578063c1db216411610125578063eb004fba116100b8578063f38aea0111610087578063f38aea0114610920578063f86af85f14610933578063f99cbd1c14610946578063fa47c7fa14610959578063fb9bb65f1461096c57600080fd5b8063eb004fba146108ea578063ed786add146108f2578063ed8aca8314610905578063f2fde38b1461090d57600080fd5b8063cabeaa00116100f4578063cabeaa001461089e578063cfa8363f146108b1578063e723b280146108c4578063e84cc314146108d757600080fd5b8063c1db216414610866578063c51ecdb31461087b578063c605373e14610883578063c941455c1461089657600080fd5b80638da5cb5b116101a857806396f084b81161017757806396f084b8146107db5780639e8bbbec14610804578063a29c47ad14610817578063b91b08381461082a578063c1ab245a1461083d57600080fd5b80638da5cb5b146107915780638e0a3a89146107a257806393719f21146107b55780639634ff6a146107c857600080fd5b8063724bcbb3116101e4578063724bcbb3146107275780637318be661461072f57806376ae8abb1461074257806379110a471461077e57600080fd5b80636951babe146106ef5780636a8b6b651461070f5780636dc0ee5514610717578063715018a61461071f57600080fd5b8063349f22861161031057806353fc0585116102a35780635c7cee63116102725780635c7cee63146106ae5780635ff2efad146106b65780636537598e146106c157806366cf90df146106c957806367c92589146106dc57600080fd5b806353fc05851461068357806358e5ed9b14610696578063592d86ae1461069e5780635bb76910146106a657600080fd5b806347b71fae116102df57806347b71fae1461062a5780634e23ea971461063d5780634e2489281461065057806351727c061461066357600080fd5b8063349f2286146105b5578063364ad7a4146105c8578063436b2ab4146105db5780634542567f1461061757600080fd5b806327c34aed116103885780632ecf32bc116103575780632ecf32bc146105405780632eefdb3d1461055357806332f02e1d1461058f57806334461067146105a257600080fd5b806327c34aed146104ff5780632ad8d015146105075780632d9217691461051a5780632df59adb1461052d57600080fd5b8063139cf2ff116103c4578063139cf2ff1461048d57806319da83a8146104a05780631b725770146104c9578063276cd3a5146104dc57600080fd5b806302147ac9146103f65780630989fc371461040b5780630a45ffae1461045a5780630bc67f9b14610462575b600080fd5b610409610404366004614ba2565b61097f565b005b610447610419366004614d46565b601c602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b6040519081526020015b60405180910390f35b600354610447565b610475610470366004614d95565b610b42565b6040516001600160a01b039091168152602001610451565b61044761049b366004614d46565b610b80565b6104b36104ae366004614dc9565b610bbd565b6040516104519a99989796959493929190614e3e565b6104096104d7366004614eb4565b610d38565b6104ef6104ea366004614ee4565b61104d565b6040519015158152602001610451565b600e54610447565b610409610515366004615057565b611064565b610409610528366004614dc9565b611691565b61044761053b366004614d46565b6116c0565b61040961054e366004615196565b6116e6565b610447610561366004614d46565b601b602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61040961059d3660046151b8565b611723565b6104b36105b0366004614dc9565b611ab7565b6104476105c3366004614d46565b611ae9565b6104096105d6366004615210565b611b0f565b6104476105e9366004614d46565b601f602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b610409610625366004614dc9565b612032565b610447610638366004615251565b612061565b61040961064b366004615297565b6120e3565b61040961065e366004614dc9565b612298565b610447610671366004614dc9565b60186020526000908152604090205481565b610409610691366004614dc9565b6122c7565b600654610447565b600754610447565b600454610447565b601054610447565b600f5460ff166104ef565b600554610447565b6104476106d7366004614dc9565b6122f6565b6104096106ea366004614dc9565b612626565b6107026106fd366004614dc9565b612655565b60405161045191906153d3565b600b54610447565b600954610447565b610409612856565b600854610447565b61040961073d3660046153e6565b61288c565b610447610750366004614d46565b601a602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61040961078c366004614dc9565b612920565b6000546001600160a01b0316610475565b6104096107b036600461548a565b61294f565b6104096107c3366004614dc9565b6129c0565b6104096107d6366004614dc9565b6129ef565b6104476107e93660046154e0565b6001600160a01b031660009081526012602052604090205490565b610409610812366004614dc9565b612a1e565b6104096108253660046154e0565b612a4d565b610409610838366004614dc9565b612c1b565b61044761084b3660046154e0565b6001600160a01b031660009081526013602052604090205490565b61086e612c4a565b60405161045191906154fd565b600c54610447565b6104096108913660046154e0565b612e2a565b601154610447565b6104096108ac366004614ba2565b613382565b6104096108bf366004614dc9565b61349b565b6104096108d2366004614dc9565b6134ca565b6104096108e5366004614dc9565b6134f9565b600a54610447565b61047561090036600461555f565b613528565b600d54610447565b61040961091b3660046154e0565b61355d565b61044761092e366004614d46565b6135f8565b610409610941366004614dc9565b61366e565b6104096109543660046155a0565b613d3e565b610447610967366004614d46565b6140d9565b61040961097a366004614dc9565b6140ff565b6000546001600160a01b031633146109b25760405162461bcd60e51b81526004016109a9906155e4565b60405180910390fd5b6001600160a01b03821660009081526012602052604090208190556001811415610ad8576001600160a01b0382166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091610a1991615619565b9081526020016040518091039020549050600454811015610a6e5760405162461bcd60e51b815260206004820152600f60248201526e0c6ded2dc40dcdee840cadcdeeaced608b1b60448201526064016109a9565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600190600401615635565b600060405180830381600087803b158015610abb57600080fd5b505af1158015610acf573d6000803e3d6000fd5b50505050505050565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610b0b908590600090600401615635565b600060405180830381600087803b158015610b2557600080fd5b505af1158015610b39573d6000803e3d6000fd5b505050505b5050565b600080600283604051610b559190615619565b908152604051908190036020019020546001600160a01b0316905080610b7a57600080fd5b92915050565b6001600160a01b0382166000908152601c60205260408082209051610ba6908490615619565b908152602001604051809103902054905092915050565b60198181548110610bcd57600080fd5b60009182526020909120600a90910201805460018201546002830180549294506001600160a01b039091169291610c039061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f9061564e565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b505050505090806003018054610c919061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd9061564e565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b505050505090806004015490806005015490806006015490806007015490806008015490806009015490508a565b6021546001600160a01b0316610d605760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b0316610d885760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b0316610db05760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b0316610dd85760405162461bcd60e51b81526004016109a99061572e565b6023546001600160a01b0316331480610dfb57506024546001600160a01b031633145b610e175760405162461bcd60e51b81526004016109a990615765565b6015546040516362bb335f60e11b8152600481018490526000916001600160a01b03169063c57666be906024016000604051808303816000875af1158015610e63573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8b9190810190615894565b9050600081602001511415610ece5760405162461bcd60e51b81526020600482015260096024820152681b9bdd08195e1a5cdd60ba1b60448201526064016109a9565b6101208101516020808201516040928301516001600160a01b038216600090815283805284812088825290935292909120549091908015610f0e57600080fd5b6001600160a01b0383166000908152601b60205260408082209051610f34908590615619565b90815260405190819003602001902054606086015190915080821015610f5957600080fd5b81610f648383614157565b1115610f6f57600080fd5b610f798282614157565b6001600160a01b0386166000908152601b6020526040908190209051610fa0908790615619565b9081526040805160209281900383019020929092556001600160a01b03871660009081528180528281208b8252909152908120829055610fdf85610b42565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611010908b908690600401615635565b600060405180830381600087803b15801561102a57600080fd5b505af115801561103e573d6000803e3d6000fd5b50505050505050505050505050565b600061105b8585858561416a565b95945050505050565b6021546001600160a01b031661108c5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166110b45760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b03166110dc5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166111045760405162461bcd60e51b81526004016109a99061572e565b6024546001600160a01b0316331461112e5760405162461bcd60e51b81526004016109a990615765565b600061115787604051806040016040528060058152602001642ba6a7ab2960d91b8152506140d9565b9050600080846001146111735786610160015160e00151611179565b86606001515b905085831061118a5785915061118e565b8291505b84600114801561119c575083155b806111cd57508460021480156111cd5750886001600160a01b0316876101600151600001516001600160a01b031614155b1561140f5761123a601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516112259190615619565b90815260200160405180910390205483614157565b601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b81525060405161128a9190615619565b9081526040805160209281900383018120939093556001600160a01b038b166000908152601a8352819020838201825260058452642ba6a7ab2960d91b92840192909252516112f1926112dc91615619565b9081526020016040518091039020548361425c565b601a60008a6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113419190615619565b9081526020016040518091039020819055506113bb89601a60008c6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113a79190615619565b908152602001604051809103902054614268565b61140f88601a60008b6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113a79190615619565b611477601a6000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516114629190615619565b9081526020016040518091039020548761425c565b601a6000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516114c79190615619565b90815260200160405180910390208190555061152d81601a6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516113a79190615619565b6115368961435e565b61153f8861435e565b6115488161435e565b601454604051639bd7417f60e01b81526001600160a01b0383811660048301526000921690639bd7417f90602401600060405180830381865afa158015611593573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115bb9190810190615a53565b905085600114156115e257600d548160a001516115d89190615b59565b60a0820152611603565b856002141561160357600e548160a001516115fd9190615b59565b60a08201525b60e081015160145460a08301516040516316a1e96960e31b81526001600160a01b0386811660048301528451602483015260208501516044830152606482019290925291169063b50f4b4890608401600060405180830381600087803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505050505050505050505050505050565b6000546001600160a01b031633146116bb5760405162461bcd60e51b81526004016109a9906155e4565b600b55565b6001600160a01b0382166000908152601f60205260408082209051610ba6908490615619565b6000546001600160a01b031633146117105760405162461bcd60e51b81526004016109a9906155e4565b600f805460ff1916911515919091179055565b6021546001600160a01b031661174b5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166117735760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b031661179b5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166117c35760405162461bcd60e51b81526004016109a99061572e565b6022546001600160a01b03163314806117e657506023546001600160a01b031633145b6118245760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016109a9565b6000811161185e5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b60448201526064016109a9565b600061186a8330612061565b9050818110156118a95760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016109a9565b6001600160a01b0384166000908152601b60205260409081902090518391906118d3908690615619565b908152602001604051809103902054101561191f5760405162461bcd60e51b815260206004820152600c60248201526b1a5b9cdd59999a58da595b9d60a21b60448201526064016109a9565b6001600160a01b0384166000908152601b6020526040908190209051611946908590615619565b9081526020016040518091039020546119a0601b6000876001600160a01b03166001600160a01b031681526020019081526020016000208560405161198b9190615619565b90815260200160405180910390205484614157565b11156119df5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016109a9565b6001600160a01b0384166000908152601b6020526040908190209051611a0b9190611225908690615619565b6001600160a01b0385166000908152601b6020526040908190209051611a32908690615619565b908152604051908190036020019020556000611a4d84610b42565b60405163a9059cbb60e01b81529091506001600160a01b0382169063a9059cbb90611a7e9088908790600401615635565b600060405180830381600087803b158015611a9857600080fd5b505af1158015611aac573d6000803e3d6000fd5b505050505050505050565b60176020526000908152604090208054600182015460028301805492936001600160a01b0390921692610c039061564e565b6001600160a01b0382166000908152601b60205260408082209051610ba6908490615619565b6000546001600160a01b03163314611b395760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b03831615801590611b5957506001600160a01b03821615155b611b6257600080fd5b601454604051639bd7417f60e01b81526001600160a01b0385811660048301526000921690639bd7417f90602401600060405180830381865afa158015611bad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611bd59190810190615a53565b9050806080015160011480611bee575080608001516002145b611c295760405162461bcd60e51b815260206004820152600c60248201526b0c6c2dc4ee840e0eadcd2e6d60a31b60448201526064016109a9565b6001600160a01b0384166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091611c6c91615619565b90815260200160405180910390205490506000601a6000866001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611ccf9190615619565b9081526020016040518091039020549050838210611dc057611cf18285614157565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611d419190615619565b90815260405190819003602001902055611d5b818561425c565b601a6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611dab9190615619565b90815260405190819003602001902055612020565b6001600160a01b0386166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091611e0391615619565b9081526040805160209281900383018120939093556001600160a01b0389166000908152601f8352818120848301835260058552642ba6a7ab2960d91b9385019390935290519092611e5491615619565b908152602001604051809103902054905084611e70848361425c565b10611f5757611e8881611e838786614157565b614157565b601f6000896001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611ed89190615619565b90815260405190819003602001902055611ef2828661425c565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051611f429190615619565b9081526040519081900360200190205561201e565b6001600160a01b0387166000908152601f602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091611f9a91615619565b90815260405190819003602001902055611fbd82611fb8858461425c565b61425c565b601a6000886001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b81525060405161200d9190615619565b908152604051908190036020019020555b505b6120298661435e565b610b398561435e565b6000546001600160a01b0316331461205c5760405162461bcd60e51b81526004016109a9906155e4565b601055565b60008061206d84610b42565b6040516370a0823160e01b81526001600160a01b038581166004830152919250908216906370a0823190602401602060405180830381865afa1580156120b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120db9190615b71565b949350505050565b6021546001600160a01b031661210b5760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b03166121335760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b031661215b5760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b03166121835760405162461bcd60e51b81526004016109a99061572e565b6022546001600160a01b03163314806121a657506023546001600160a01b031633145b6122075760405162461bcd60e51b815260206004820152602c60248201527f5265646f63726453746f726167653a496e76616c69642066726f6d20636f6e7460448201526b72616374206164647265737360a01b60648201526084016109a9565b6001600160a01b0387166000908152601b60205260409081902090516122489190612233908890615619565b9081526020016040518091039020548561425c565b6001600160a01b0388166000908152601b602052604090819020905161226f908890615619565b9081526040519081900360200190205561228e8787878787878761460e565b5050505050505050565b6000546001600160a01b031633146122c25760405162461bcd60e51b81526004016109a9906155e4565b600c55565b6000546001600160a01b031633146122f15760405162461bcd60e51b81526004016109a9906155e4565b600955565b600080821161230457600080fd5b336000908152601a60209081526040918290208251808401845260058152642ba6a7ab2960d91b92810192909252915184929161234091615619565b908152602001604051809103902054101561238e5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016109a9565b336000908152601a60209081526040918290208251808401845260058152642ba6a7ab2960d91b9281019290925291516123c89190615619565b90815260408051918290036020908101832054336000908152601a8352839020848401845260058552642ba6a7ab2960d91b92850192909252915191926124139261198b9190615619565b106124535760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b6b7bab73a101960811b60448201526064016109a9565b336000818152601d602090815260408083204290819055601e83528184209084528252808320869055928252601a8152908290208251808401845260058152642ba6a7ab2960d91b9281019290925291516124b2929161122591615619565b336000908152601a60209081526040918290208251808401845260058152642ba6a7ab2960d91b9281019290925291516124ec9190615619565b908152604080516020928190038301812093909355336000908152601f8352819020838201825260058452642ba6a7ab2960d91b9284019290925251612535926112dc91615619565b336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b92810192909252915161256f9190615619565b908152604051908190036020019020556125883361435e565b6125c53360405180602001604052806000815250604051806040016040528060058152602001642ba6a7ab2960d91b81525085600380600261460e565b507f072538e3c57d574904a160b874c45b7e7fd3c8ed28ab3f872a942edfd852e6d733836040516125f7929190615635565b60405180910390a1610b7a33604051806040016040528060058152602001642ba6a7ab2960d91b8152506140d9565b6000546001600160a01b031633146126505760405162461bcd60e51b81526004016109a9906155e4565b600355565b6126b46040518061014001604052806000815260200160006001600160a01b0316815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000828152601760209081526040918290208251610140810184528154815260018201546001600160a01b03169281019290925260028101805492939192918401916126ff9061564e565b80601f016020809104026020016040519081016040528092919081815260200182805461272b9061564e565b80156127785780601f1061274d57610100808354040283529160200191612778565b820191906000526020600020905b81548152906001019060200180831161275b57829003601f168201915b505050505081526020016003820180546127919061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546127bd9061564e565b801561280a5780601f106127df5761010080835404028352916020019161280a565b820191906000526020600020905b8154815290600101906020018083116127ed57829003601f168201915b5050505050815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820154815250509050919050565b6000546001600160a01b031633146128805760405162461bcd60e51b81526004016109a9906155e4565b61288a6000614a94565b565b6000546001600160a01b031633146128b65760405162461bcd60e51b81526004016109a9906155e4565b602180546001600160a01b03199081166001600160a01b039687169081179092556022805482169587169590951790945560238054851693861693841790556024805485169290951691909117909355601480548316909317909255601580549091169091179055565b6000546001600160a01b0316331461294a5760405162461bcd60e51b81526004016109a9906155e4565b600655565b6000546001600160a01b031633146129795760405162461bcd60e51b81526004016109a9906155e4565b806002848460405161298c929190615b8a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055505050565b6000546001600160a01b031633146129ea5760405162461bcd60e51b81526004016109a9906155e4565b600455565b6000546001600160a01b03163314612a195760405162461bcd60e51b81526004016109a9906155e4565b600755565b6000546001600160a01b03163314612a485760405162461bcd60e51b81526004016109a9906155e4565b600555565b6000546001600160a01b03163314612a775760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b0381166000908152601f602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091612aba91615619565b908152602001604051809103902054905060008111612b085760405162461bcd60e51b815260206004820152600a6024820152691cdd59999a58da595b9d60b21b60448201526064016109a9565b6001600160a01b0382166000908152601f602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091612b4b91615619565b9081526040805160209281900383018120939093556001600160a01b0385166000908152601a8352819020838201825260058452642ba6a7ab2960d91b9284019290925251612bb292612b9d91615619565b9081526020016040518091039020548261425c565b601a6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051612c029190615619565b90815260405190819003602001902055610b3e8261435e565b6000546001600160a01b03163314612c455760405162461bcd60e51b81526004016109a9906155e4565b601155565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015612e215760008481526020908190206040805161014081018252600a86029092018054835260018101546001600160a01b03169383019390935260028301805492939291840191612cc29061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054612cee9061564e565b8015612d3b5780601f10612d1057610100808354040283529160200191612d3b565b820191906000526020600020905b815481529060010190602001808311612d1e57829003601f168201915b50505050508152602001600382018054612d549061564e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d809061564e565b8015612dcd5780601f10612da257610100808354040283529160200191612dcd565b820191906000526020600020905b815481529060010190602001808311612db057829003601f168201915b50505050508152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152505081526020019060010190612c6e565b50505050905090565b6021546001600160a01b0316612e525760405162461bcd60e51b81526004016109a990615689565b6022546001600160a01b0316612e7a5760405162461bcd60e51b81526004016109a9906156c0565b6023546001600160a01b0316612ea25760405162461bcd60e51b81526004016109a9906156f7565b6024546001600160a01b0316612eca5760405162461bcd60e51b81526004016109a99061572e565b6024546001600160a01b03163314612ef45760405162461bcd60e51b81526004016109a990615765565b6001600160a01b038116612f395760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016109a9565b6001600160a01b0381166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b9381019390935290519091612f7c91615619565b9081526020016040518091039020549050600080600954831061300d576009549150612fa88383614157565b601a6000866001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b815250604051612ff89190615619565b908152604051908190036020019020556131b5565b6001600160a01b0384166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b938101939093529051909161305091615619565b9081526040805160209281900383018120939093556001600160a01b0387166000908152601f8352818120848301835260058552642ba6a7ab2960d91b93850193909352905190926130a191615619565b90815260200160405180910390205490506009546130bf858361425c565b106131445760095492506130d38385614157565b91506130df8183614157565b601f6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b81525060405161312f9190615619565b908152604051908190036020019020556131b3565b61314e818561425c565b92506000601f6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060058152602001642ba6a7ab2960d91b8152506040516131a29190615619565b908152604051908190036020019020555b505b6131be8461435e565b601454604051639bd7417f60e01b81526001600160a01b0386811660048301526000921690639bd7417f90602401600060405180830381865afa158015613209573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132319190810190615a53565b9050600a548160a00151101561324857600061325a565b600a548160a0015161325a9190615b9a565b60a0820181905260e08201516014546040516316a1e96960e31b81526001600160a01b038981166004830152835160248301526020840151604483015260648201949094529192169063b50f4b4890608401600060405180830381600087803b1580156132c657600080fd5b505af11580156132da573d6000803e3d6000fd5b505050506000613306604051806040016040528060058152602001642ba6a7ab2960d91b815250610b42565b9050806001600160a01b031663a9059cbb6133296000546001600160a01b031690565b876040518363ffffffff1660e01b8152600401613347929190615635565b600060405180830381600087803b15801561336157600080fd5b505af1158015613375573d6000803e3d6000fd5b5050505050505050505050565b6000546001600160a01b031633146133ac5760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b03821660009081526013602052604090208190556001811415610ad8576001600160a01b0382166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b938101939093529051909161341391615619565b90815260200160405180910390205490506005548110156134685760405162461bcd60e51b815260206004820152600f60248201526e0c6ded2dc40dcdee840cadcdeeaced608b1b60448201526064016109a9565b60145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600290600401615635565b6000546001600160a01b031633146134c55760405162461bcd60e51b81526004016109a9906155e4565b600a55565b6000546001600160a01b031633146134f45760405162461bcd60e51b81526004016109a9906155e4565b600855565b6000546001600160a01b031633146135235760405162461bcd60e51b81526004016109a9906155e4565b600e55565b60006002838360405161353c929190615b8a565b908152604051908190036020019020546001600160a01b0316905092915050565b6000546001600160a01b031633146135875760405162461bcd60e51b81526004016109a9906155e4565b6001600160a01b0381166135ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a9565b6135f581614a94565b50565b60006001600160a01b0383166136475760405162461bcd60e51b81526020600482015260146024820152731d5cd95c881859191c995cdcc81a5cc81b9d5b1b60621b60448201526064016109a9565b6001600160a01b0383166000908152601c6020526040908190209051610ba6908490615619565b60008181526017602090815260408083208151610140810183528154815260018201546001600160a01b03169381019390935260028101805491928401916136b59061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546136e19061564e565b801561372e5780601f106137035761010080835404028352916020019161372e565b820191906000526020600020905b81548152906001019060200180831161371157829003601f168201915b505050505081526020016003820180546137479061564e565b80601f01602080910402602001604051908101604052809291908181526020018280546137739061564e565b80156137c05780601f10613795576101008083540402835291602001916137c0565b820191906000526020600020905b8154815290600101906020018083116137a357829003601f168201915b505050918352505060048201546020820152600582015460408201526006820154606082015260078201546080820152600882015460a082015260099091015460c090910152805190915061384a5760405162461bcd60e51b815260206004820152601060248201526f1c9958dbdc99081b9bdd08195e1a5cdd60821b60448201526064016109a9565b60208101516001600160a01b0316331461389e5760405162461bcd60e51b81526020600482015260156024820152741c9958dbdc99081d5cd95c881b9bdd08195e1a5cdd605a1b60448201526064016109a9565b8060a001516003146138e15760405162461bcd60e51b815260206004820152600c60248201526b39ba30ba3ab99032b93937b960a11b60448201526064016109a9565b6080810151336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b9281019290925291516139209190615619565b908152602001604051809103902054101561396a5760405162461bcd60e51b815260206004820152600a6024820152691cdd59999a58da595b9d60b21b60448201526064016109a9565b60085461397a9062015180615bb1565b81610100015161398a9190615b59565b4210156139ca5760405162461bcd60e51b815260206004820152600e60248201526d63616e277420776974686472617760901b60448201526064016109a9565b336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b928101929092529151613a219291613a0891615619565b9081526020016040518091039020548260800151614157565b336000908152601f60209081526040918290208251808401845260058152642ba6a7ab2960d91b928101929092529151613a5b9190615619565b908152604080516020928190038301812093909355336000908152601c8352819020838201825260058452642ba6a7ab2960d91b9284019290925251613abd92613aa491615619565b908152602001604051809103902054826080015161425c565b336000908152601c60209081526040918290208251808401845260058152642ba6a7ab2960d91b928101929092529151613af79190615619565b908152604080516020928190038301902092909255600460a08401524261012084015260008481526017825282902083518155838201516001820180546001600160a01b0319166001600160a01b03909216919091179055918301518051849392613b69926002850192910190614ae4565b5060608201518051613b85916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155600082815260186020526040902054601980548392908110613bea57613bea615bd0565b60009182526020918290208351600a9290920201908155828201516001820180546001600160a01b0319166001600160a01b03909216919091179055604083015180519192613c4192600285019290910190614ae4565b5060608201518051613c5d916003840191602090910190614ae4565b506080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015561012082015181600901559050507f184981d19cd827a29527d9fef87fd7973eb4f43f9833af36578f456bed5fa19a338383604001516004604051613cd99493929190615be6565b60405180910390a16000613d09604051806040016040528060058152602001642ba6a7ab2960d91b815250610b42565b608083015160405163a9059cbb60e01b81529192506001600160a01b0383169163a9059cbb91610aa191339190600401615635565b60008111613d785760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b60448201526064016109a9565b336000908152601a6020526040908190209051613d96908490615619565b90815260200160405180910390205481601a6000336001600160a01b03166001600160a01b0316815260200190815260200160002084604051613dd99190615619565b908152602001604051809103902054613df29190615b59565b11613e3f5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964207472616e7366657220616d6f756e7400000000000000000060448201526064016109a9565b336000908152601a6020526040908190209051613e629190612b9d908590615619565b336000908152601a6020526040908190209051613e80908590615619565b90815260408051918290036020908101832093909355818101815260058252642ba6a7ab2960d91b8284015251600192613ebb929101615619565b6040516020818303038152906040528051906020012083604051602001613ee29190615619565b6040516020818303038152906040528051906020012014156140475750601454604051639bd7417f60e01b81523360048201526002916000916001600160a01b0390911690639bd7417f90602401600060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613f759190810190615a53565b336000818152601a6020526040908190209051929350613f9a926113a7908890615619565b6080810151158015613fda5750600354336000908152601a6020526040908190209051613fc8908790615619565b90815260200160405180910390205410155b156140455760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590614012903390600390600401615635565b600060405180830381600087803b15801561402c57600080fd5b505af1158015614040573d6000803e3d6000fd5b505050505b505b61406733604051806020016040528060008152508585600286600161460e565b50600061407384610b42565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091506001600160a01b038216906323b872dd906064015b600060405180830381600087803b1580156140c557600080fd5b505af115801561228e573d6000803e3d6000fd5b6001600160a01b0382166000908152601a60205260408082209051610ba6908490615619565b6000546001600160a01b031633146141295760405162461bcd60e51b81526004016109a9906155e4565b600d55565b805461413a5761271081555b600181600001600082825461414f9190615b59565b909155505050565b60006141638284615b9a565b9392505050565b600083815260176020526040812060018101546001600160a01b0387811691161461419457600080fd5b82600114806141a35750826002145b6141e05760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69642073746174757360901b60448201526064016109a9565b82156141ee57600581018390555b83511561420c57835161420a9060028301906020870190614ae4565b505b4260098201556040517f184981d19cd827a29527d9fef87fd7973eb4f43f9833af36578f456bed5fa19a90614248908890889088908890615be6565b60405180910390a150600195945050505050565b60006141638284615b59565b601454604051639bd7417f60e01b81526001600160a01b0384811660048301526000921690639bd7417f90602401600060405180830381865afa1580156142b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142db9190810190615a53565b61010081015183815260145460408051630ee685c760e41b81526001600160a01b038881166004830152845160248301526020850151604483015291840151606482015260608401516084820152608084015160a482015260a084015160c482015260c084015160e4820152939450919291169063ee685c7090610104016140ab565b6001600160a01b0381166000908152601a602090815260408083208151808301835260058152642ba6a7ab2960d91b93810193909352905190916143a191615619565b90815260405190819003602001812054601454639bd7417f60e01b83526001600160a01b038581166004850152919350600092911690639bd7417f90602401600060405180830381865afa1580156143fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526144259190810190615a53565b90506144318383614268565b80608001516002148015614446575060055482105b801561445457506003548210155b156144bf5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba59061448c908690600390600401615635565b600060405180830381600087803b1580156144a657600080fd5b505af11580156144ba573d6000803e3d6000fd5b505050505b806080015160011480156144d4575060045482105b80156144e257506003548210155b1561454d5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba59061451a908690600390600401615635565b600060405180830381600087803b15801561453457600080fd5b505af1158015614548573d6000803e3d6000fd5b505050505b608081015115801561456157506003548210155b156145cc5760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590614599908690600390600401615635565b600060405180830381600087803b1580156145b357600080fd5b505af11580156145c7573d6000803e3d6000fd5b505050505b6003548210156146095760145460405163d691fba560e01b81526001600160a01b039091169063d691fba590610aa1908690600090600401615635565b505050565b6000600260015414156146635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a9565b60026001556001600160a01b0388166146ad5760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016109a9565b85516146eb5760405162461bcd60e51b815260206004820152600d60248201526c18dbda5b951e5c19481b9d5b1b609a1b60448201526064016109a9565b846147295760405162461bcd60e51b815260206004820152600e60248201526d1a1bdcdd10dbdd5b9d081b9d5b1b60921b60448201526064016109a9565b826147665760405162461bcd60e51b815260206004820152600d60248201526c1a1bdcdd151e5c19481b9d5b1b609a1b60448201526064016109a9565b816147a85760405162461bcd60e51b81526020600482015260126024820152711a1bdcdd111a5c9958dd1a5bdb881b9d5b1b60721b60448201526064016109a9565b60006147b360165490565b600081815260176020526040902054909150156148005760405162461bcd60e51b815260206004820152600b60248201526a1bdc99195c88195e1a5cdd60aa1b60448201526064016109a9565b60408051610140810182528281526001600160a01b038b811660208084019182528385018d8152606085018d9052608085018c905260a085018b905260c085018a905260e08501899052426101008601526000610120860181905287815260178352959095208451815591516001830180546001600160a01b03191691909416179092559251805192938493909261489f926002850192910190614ae4565b50606082015180516148bb916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120909101516009909101556019805460018101825560009190915281517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695600a9092029182019081556020808401517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9696840180546001600160a01b0319166001600160a01b039092169190911790556040840151805185946149b9937f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9697909101920190614ae4565b50606082015180516149d5916003840191602090910190614ae4565b506080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012090910151600990910155601954614a2590600190615b9a565b600083815260186020526040902055614a3e601661412e565b7f400817122268a69f3472a92a1ec2769f27f068026b377eaeb64f6cbe0bca7a51828b8b8b8b8b8b8b604051614a7b989796959493929190615c1e565b60405180910390a1506001805598975050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054614af09061564e565b90600052602060002090601f016020900481019282614b125760008555614b58565b82601f10614b2b57805160ff1916838001178555614b58565b82800160010185558215614b58579182015b82811115614b58578251825591602001919060010190614b3d565b50614b64929150614b68565b5090565b5b80821115614b645760008155600101614b69565b6001600160a01b03811681146135f557600080fd5b8035614b9d81614b7d565b919050565b60008060408385031215614bb557600080fd5b8235614bc081614b7d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60405161020081016001600160401b0381118282101715614c0757614c07614bce565b60405290565b60405161018081016001600160401b0381118282101715614c0757614c07614bce565b60405161010081016001600160401b0381118282101715614c0757614c07614bce565b60405161014081016001600160401b0381118282101715614c0757614c07614bce565b60405161012081016001600160401b0381118282101715614c0757614c07614bce565b604051601f8201601f191681016001600160401b0381118282101715614cc157614cc1614bce565b604052919050565b60006001600160401b03821115614ce257614ce2614bce565b50601f01601f191660200190565b600082601f830112614d0157600080fd5b8135614d14614d0f82614cc9565b614c99565b818152846020838601011115614d2957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215614d5957600080fd5b8235614d6481614b7d565b915060208301356001600160401b03811115614d7f57600080fd5b614d8b85828601614cf0565b9150509250929050565b600060208284031215614da757600080fd5b81356001600160401b03811115614dbd57600080fd5b6120db84828501614cf0565b600060208284031215614ddb57600080fd5b5035919050565b60005b83811015614dfd578181015183820152602001614de5565b83811115614e0c576000848401525b50505050565b60008151808452614e2a816020860160208601614de2565b601f01601f19169290920160200192915050565b8a81526001600160a01b038a16602082015261014060408201819052600090614e698382018c614e12565b90508281036060840152614e7d818b614e12565b6080840199909952505060a081019590955260c085019390935260e084019190915261010083015261012090910152949350505050565b60008060408385031215614ec757600080fd5b823591506020830135614ed981614b7d565b809150509250929050565b60008060008060808587031215614efa57600080fd5b8435614f0581614b7d565b93506020850135925060408501356001600160401b03811115614f2757600080fd5b614f3387828801614cf0565b949793965093946060013593505050565b60006102008284031215614f5757600080fd5b614f5f614be4565b9050614f6a82614b92565b81526020820135602082015260408201356001600160401b0380821115614f9057600080fd5b614f9c85838601614cf0565b6040840152606084013560608401526080840135915080821115614fbf57600080fd5b50614fcc84828501614cf0565b60808301525060a082013560a082015260c082013560c0820152614ff260e08301614b92565b60e0820152610100828101359082015261012080830135908201526101408083013590820152610160808301359082015261018080830135908201526101a080830135908201526101c080830135908201526101e09182013591810191909152919050565b60008060008060008060c0878903121561507057600080fd5b863561507b81614b7d565b9550602087013561508b81614b7d565b945060408701356001600160401b03808211156150a757600080fd5b90880190610180828b0312156150bc57600080fd5b6150c4614c0d565b6150cd83614b92565b815260208301356020820152604083013560408201526150ef60608401614b92565b606082015261510060808401614b92565b608082015261511160a08401614b92565b60a082015260c0838101359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401358381111561515f57600080fd5b61516b8d828701614f44565b828401525050809650505050606087013592506080870135915060a087013590509295509295509295565b6000602082840312156151a857600080fd5b8135801515811461416357600080fd5b6000806000606084860312156151cd57600080fd5b83356151d881614b7d565b925060208401356001600160401b038111156151f357600080fd5b6151ff86828701614cf0565b925050604084013590509250925092565b60008060006060848603121561522557600080fd5b833561523081614b7d565b9250602084013561524081614b7d565b929592945050506040919091013590565b6000806040838503121561526457600080fd5b82356001600160401b0381111561527a57600080fd5b61528685828601614cf0565b9250506020830135614ed981614b7d565b600080600080600080600060e0888a0312156152b257600080fd5b87356152bd81614b7d565b965060208801356001600160401b03808211156152d957600080fd5b6152e58b838c01614cf0565b975060408a01359150808211156152fb57600080fd5b506153088a828b01614cf0565b979a96995096976060810135975060808101359660a0820135965060c090910135945092505050565b600061014082518452602083015161535460208601826001600160a01b03169052565b50604083015181604086015261536c82860182614e12565b915050606083015184820360608601526153868282614e12565b9150506080830151608085015260a083015160a085015260c083015160c085015260e083015160e08501526101008084015181860152506101208084015181860152508091505092915050565b6020815260006141636020830184615331565b600080600080608085870312156153fc57600080fd5b843561540781614b7d565b9350602085013561541781614b7d565b9250604085013561542781614b7d565b9150606085013561543781614b7d565b939692955090935050565b60008083601f84011261545457600080fd5b5081356001600160401b0381111561546b57600080fd5b60208301915083602082850101111561548357600080fd5b9250929050565b60008060006040848603121561549f57600080fd5b83356001600160401b038111156154b557600080fd5b6154c186828701615442565b90945092505060208401356154d581614b7d565b809150509250925092565b6000602082840312156154f257600080fd5b813561416381614b7d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561555257603f19888603018452615540858351615331565b94509285019290850190600101615524565b5092979650505050505050565b6000806020838503121561557257600080fd5b82356001600160401b0381111561558857600080fd5b61559485828601615442565b90969095509350505050565b600080604083850312156155b357600080fd5b82356001600160401b038111156155c957600080fd5b6155d585828601614cf0565b95602094909401359450505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000825161562b818460208701614de2565b9190910192915050565b6001600160a01b03929092168252602082015260400190565b600181811c9082168061566257607f821691505b6020821081141561568357634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526019908201527f496e76616c696420616464726573732063616c6c207573657200000000000000604082015260600190565b60208082526019908201527f496e76616c696420616464726573732063616c6c207265737400000000000000604082015260600190565b6020808252601a908201527f496e76616c696420616464726573732063616c6c206f72646572000000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c2061707065616c0000000000604082015260600190565b6020808252600c908201526b125b9d985b1a590818d85b1b60a21b604082015260600190565b8051614b9d81614b7d565b600082601f8301126157a757600080fd5b81516157b5614d0f82614cc9565b8181528460208386010111156157ca57600080fd5b6120db826020830160208701614de2565b600061010082840312156157ee57600080fd5b6157f6614c30565b90506158018261578b565b815261580f6020830161578b565b602082015260408201516001600160401b038082111561582e57600080fd5b61583a85838601615796565b6040840152606084015160608401526080840151608084015260a084015160a084015260c084015191508082111561587157600080fd5b5061587e84828501615796565b60c08301525060e082015160e082015292915050565b6000602082840312156158a657600080fd5b81516001600160401b03808211156158bd57600080fd5b9083019061014082860312156158d257600080fd5b6158da614c53565b6158e38361578b565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c08301518281111561592957600080fd5b61593587828601615796565b60c08301525060e083015160e0820152610100808401518183015250610120808401518381111561596557600080fd5b615971888287016157db565b918301919091525095945050505050565b60006040828403121561599457600080fd5b604051604081018181106001600160401b03821117156159b6576159b6614bce565b604052825181526020928301519281019290925250919050565b600060e082840312156159e257600080fd5b60405160e081018181106001600160401b0382111715615a0457615a04614bce565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c08201525092915050565b600060208284031215615a6557600080fd5b81516001600160401b0380821115615a7c57600080fd5b908301906102008286031215615a9157600080fd5b615a99614c76565b615aa28361578b565b8152602083015182811115615ab657600080fd5b615ac287828601615796565b602083015250604083015182811115615ada57600080fd5b615ae687828601615796565b604083015250606083015160608201526080830151608082015260a083015160a082015260c083015160c0820152615b218660e08501615982565b60e0820152615b348661012085016159d0565b61010082015295945050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115615b6c57615b6c615b43565b500190565b600060208284031215615b8357600080fd5b5051919050565b8183823760009101908152919050565b600082821015615bac57615bac615b43565b500390565b6000816000190483118215151615615bcb57615bcb615b43565b500290565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152608060408201526000615c0d6080830185614e12565b905082606083015295945050505050565b8881526001600160a01b038816602082015261010060408201819052600090615c498382018a614e12565b90508281036060840152615c5d8189614e12565b9150508560808301528460a08301528360c08301528260e0830152999850505050505050505056fea2646970667358221220cac9189fe83a6c568dfe6bd2aa0cc53f5a8febb768e12bf3014bd22739ae029664736f6c634300080b0033000000000000000000000000b44a9b6905af7c801311e8f4e76932ee959c663c000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b44a9b6905af7c801311e8f4e76932ee959c663c000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
-----Decoded View---------------
Arg [0] : _usdtAddress (address): 0xb44a9b6905af7c801311e8f4e76932ee959c663c
Arg [1] : _usdcAddress (address): 0xe3f5a90f9cb311505cd691a46596599aa1a0ad7d
Arg [2] : _coinAddress (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b44a9b6905af7c801311e8f4e76932ee959c663c
Arg [1] : 000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d
Arg [2] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
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://cac9189fe83a6c568dfe6bd2aa0cc53f5a8febb768e12bf3014bd22739ae0296
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.