Contract Address Details

0x02956a7E11929d184541B0984A4d3662D2E65a69

Contract Name
AccountManage
Creator
0x523009–fcc29c at 0x870a45–0541b1
Balance
0 NMT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
12650739
Contract name:
AccountManage




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
200
EVM Version
default




Verified at
2025-02-07T06:05:03.082044Z

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0 ;

interface IConf {
    function p_settlement() external returns (uint256);
    function v_settlement() external returns (uint256);
    function accountManageExecutor() external returns (address);
    function accountUsdExecutor() external returns (address);
    function execDeductionExecutor() external returns (address);
    function Staking() external returns (address);
    function acts(address ) external view returns(bool);
}


abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    function _disableInitializers() internal {
        _initialized = true;
    }
}

contract Ownable is Initializable{
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init_unchained() internal initializer {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IFiatoSettle {
    function distribute(address receiver, uint256 amount, uint256 burn) external returns(bool);
    function distribute(address gpu_provider, uint256 gpu_nmt, address platform, uint256 platform_nmt, uint256 burn) external returns(bool);
}

contract AccountManage is Ownable{
    address public conf;
    uint256 public burnAmount;
    uint256 public num;
    mapping(uint256 => UserAccountMsg) public userAccountMsg;
    mapping(string => uint256) public userAccountById;
    mapping(address => uint256) public userAccountByAddr;
    mapping(address => bool) public authSta;
    uint256 public providerFeeSum;
    bytes32 public CONTRACT_DOMAIN;
    mapping(address => uint256) public nonce;
    mapping(address => mapping(uint256 => uint256)) public withdrawData;
    uint256 public signNum;
    bool private reentrancyLock;
    uint256 public quota;
    mapping(string => bool) public orderId;
    uint256 public useFeeSum;
    mapping(string => OrderMsg) public orderMsg;
    mapping(address => bool) whiteAddr;
    address public fiatoSettle;
    mapping(bytes32=>bool) digestSta;
    address public feeTo;
    mapping(string => OrderCnyMsg) public orderCnyMsg;
    uint256 public quotaCny;
    
    event WithdrawToken(address indexed _userAddr, uint256 _nonce, uint256 _amount);
    event UpdateAuthSta(address _addr, bool sta);
    event InitAccount(string userId, address userAddr);
    event UpdateAccount(string userId, address userAddr);
    event DeleteAccount(string userId, address userAddr);
    event TokenCharge(string userId, uint256 value, uint256 nmtbalance, address chargeAddr);
    event Withdraw(address userAddr, string userId, uint256 value, uint256 nmtbalance);
    event Freeze(string userId, uint256 value, uint256 balance, uint256 jobType);
    event ExecDebit(string userId, uint256 useValue, uint256 offsetValue, uint256 balance, uint256 jobType);
    event UpdateAccountUsd(string userId, string orderId, uint256 usd, uint256 usdBalance, bool _type);
    event ExecDeduction(string userId, string orderId, string _msg, uint256 nmt, uint256 nmtBalance, uint256 usd, uint256 usdBalance, uint256 overdraft, uint256 overdraftBalance);
    event ExecCnyDeduction(string userId, string orderId, string _msg, uint256 cny, uint256 cnyBalance, uint256 cnyOverdraft, uint256 cnyOverdraftBalance);
    event Refund(string userId, string deductionOrderId, string orderId, uint256 nmt, uint256 nmtBalance, uint256 usd, uint256 usdBalance, uint256 overdraft, uint256 overdraftBalance);
    event RefundCny(string userId, string deductionOrderId, string orderId, uint256 cny, uint256 cnyBalance, uint256 cnyOverdraft, uint256 cnyOverdraftBalance);
    event CaclAccountBalance(string userId, uint256 nmt, uint256 nmtBalance, uint256 usd, uint256 usdBalance, uint256 overdraft, uint256 overdraftBalance, uint256 price);
    event DistributeNmt(string id, address reciver, uint256 amount, uint256 feeAmount);
    event DistributeUsd(string id, address reciver, uint256 usdAmount, uint256 nmtAmount, uint256 feeUsdAmount, uint256 feeNmtAmount);
    event UpdateAccountCny(string userId, string orderId, uint256 cny, uint256 cnyBalance, bool _type);
    event CaclAccountCnyBalance(string userId, uint256 cny, uint256 cnyBalance, uint256 cnyOverdraft, uint256 cnyOverdraftBalance);
    event DistributeCny(string id, address reciver, uint256 usdAmount, uint256 nmtAmount, uint256 feeUsdAmount, uint256 feeNmtAmount);
    event DistributeAndBurnNmt(string paymentId, address gpu_provider, uint256 gpu_fee, address platform, uint256 platform_fee, uint256 burn);
    event DistributeAndBurnUsd(string paymentId, address gpu_provider, address platform, uint256[6] parm);
    event DistributeAndBurnCny(string paymentId, address gpu_provider, address platform, uint256[6] parm);
    
    
    struct UserAccountMsg {
        uint256 balance;
        uint256 freezed;
        string userId;
        address addr;
        uint256 usd;
        uint256 overdraft;
        uint256 cny;
        uint256 cnyOverdraft;
    }

    struct OrderMsg {
        uint256 nmtAmount;
        uint256 usd;
        uint256 overdraft;
        uint256 refundNmt;
        uint256 refundUsd;
        uint256 refundOverdraft;
        uint256 distributeNmt;
        uint256 distributeUsd;
    }
    
    struct OrderCnyMsg {
        uint256 cny;
        uint256 overdraft;
        uint256 refundCny;
        uint256 refundOverdraft;
        uint256 distributeCny;
    }
    
    struct Sig {
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    modifier notContract() {
        require((!_isContract(msg.sender)) && (msg.sender == tx.origin), "contract not allowed");
        _;
    }

    function _isContract(address addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }

    modifier nonReentrant() {
        require(!reentrancyLock);
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

    modifier onlyExecutor() {
        require(IConf(conf).accountManageExecutor() == msg.sender, "not accountManageExecutor");
        _;
    }

    modifier onlyAccountUsdExecutor() {
        require(IConf(conf).accountUsdExecutor() == msg.sender, "not accountUsdExecutor");
        _;
    }

    modifier onlyExecDeductionExecutor() {
        require(IConf(conf).execDeductionExecutor() == msg.sender, "not execDeductionExecutor");
        _;
    }

    modifier onlyAuth() {
        require(authSta[msg.sender], "no permission");
        _;
    }

    constructor(){_disableInitializers();}

    function init(address _conf)  external 
       initializer
    {
        __Ownable_init_unchained();
        __AccountManage_init_unchained(_conf);
    }

    function __AccountManage_init_unchained(address _conf) internal 
      initializer
    {
       require(_conf != address(0), "_conf error");
       conf = _conf;
       CONTRACT_DOMAIN = keccak256('Netmind AccountManage V1.0');
       signNum = 2;
    }
 
    function updateSignNum(uint256 _signNum) external onlyOwner{
        require(_signNum > 0, "signNum error");
        signNum = _signNum;
    }

    function updateAuthSta(address _addr, bool _sta) external onlyOwner{
        authSta[_addr] = _sta;
        emit UpdateAuthSta(_addr, _sta);
    }

    function updateQuota(uint256 _quota) external onlyOwner{
        quota = _quota;
    }
  
    function updateQuotaCny(uint256 _quotaCny) external onlyOwner{
        quotaCny = _quotaCny;
    }
  
    function setFiatoSettle(address _fiatoSettle) external onlyOwner{
        require(_fiatoSettle != address(0), "zero address");
        fiatoSettle = _fiatoSettle;
    }

    function setFeeTo(address _feeTo) public onlyOwner{
        feeTo = _feeTo;
    }

    function initUserId(string memory _userId, address _addr) external onlyExecutor{
        require(userAccountById[_userId] == 0, "Userid occupied");
        require(userAccountByAddr[_addr] == 0, "User address occupied");
        uint256 _num = ++num;
        UserAccountMsg storage _userAccountMsg = userAccountMsg[_num];
        _userAccountMsg.userId = _userId;
        userAccountById[_userId] = _num;
        if(_addr != address(0x00)){
            _userAccountMsg.addr = _addr;
            userAccountByAddr[_addr] = _num;
        }
        emit InitAccount(_userId, _addr);
    }

    function updateAccount(string memory _userId, address _addr) external onlyExecutor{
        uint256 _num = userAccountById[_userId];
        UserAccountMsg storage _userAccountMsg = userAccountMsg[_num];
        require(_num > 0, "not exist");
        userAccountByAddr[_userAccountMsg.addr] = 0;
        _userAccountMsg.addr = _addr;
        if(_addr != address(0x00)){
            require(userAccountByAddr[_addr] == 0, "address occupied");
            userAccountByAddr[_addr] = _num;
        }
        emit UpdateAccount(_userId, _addr);
    }
 
    function deleteAccount(string memory _userId) external onlyExecutor{
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId);
        userAccountByAddr[_userAccountMsg.addr] = 0;
        userAccountById[_userId] = 0;
         emit DeleteAccount(_userId, _userAccountMsg.addr);
    }
 
    function updateAccountUsd(string memory _userId, string memory _orderId, uint256 _usd, bool _type, uint256 _price) external onlyAccountUsdExecutor{
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId, _orderId);
        if(_type){
            _userAccountMsg.usd = _userAccountMsg.usd + _usd;
        }else {
            _userAccountMsg.usd = _userAccountMsg.usd - _usd;
        }
        emit UpdateAccountUsd(_userId, _orderId, _usd, _userAccountMsg.usd, _type);
        require(_caclAccountBalance(_userId, _price), "caclAccountBalance error");
    }
 
    function updateAccountCny(string memory _userId, string memory _orderId, uint256 _cny, bool _type) external onlyAccountUsdExecutor{
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId, _orderId);
        if(_type){
            _userAccountMsg.cny = _userAccountMsg.cny + _cny;
        }else {
            _userAccountMsg.cny = _userAccountMsg.cny - _cny;
        }
        emit UpdateAccountCny(_userId, _orderId, _cny, _userAccountMsg.cny, _type);
        uint256 cnyOverdraft = _userAccountMsg.cnyOverdraft;
        if(cnyOverdraft> 0){
            if(_userAccountMsg.cny >= cnyOverdraft){
                _userAccountMsg.cny = _userAccountMsg.cny - cnyOverdraft;
                _userAccountMsg.cnyOverdraft = 0;
                emit CaclAccountCnyBalance(_userId, cnyOverdraft, _userAccountMsg.cny, cnyOverdraft, 0);
            }else {
                _userAccountMsg.cnyOverdraft = cnyOverdraft - _userAccountMsg.cny;
                _userAccountMsg.cny = 0;
                emit CaclAccountCnyBalance(_userId, _userAccountMsg.cny, 0, _userAccountMsg.cny, _userAccountMsg.cnyOverdraft);
            }
        }
    }
 
    function caclAccountBalance(string memory _userId, uint256 _price) external onlyAccountUsdExecutor returns(bool){
        return _caclAccountBalance(_userId, _price);
    }

    function execDeduction(string memory _userId, string memory _orderId, uint256 _nmt, uint256 _usd, uint256 _overdraft, string memory _msg) external onlyExecDeductionExecutor{
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId, _orderId);
        _userAccountMsg.usd = _userAccountMsg.usd - _usd;
        _userAccountMsg.overdraft = _userAccountMsg.overdraft + _overdraft;
        require(_userAccountMsg.overdraft <= quota, "quota error");
        useFeeSum += _nmt;
        _userAccountMsg.balance = _userAccountMsg.balance - _nmt;
        orderMsg[_orderId] = OrderMsg(_nmt, _usd, _overdraft, 0, 0, 0, 0, 0);
        emit ExecDeduction(_userId, _orderId, _msg, _nmt, _userAccountMsg.balance, _usd, _userAccountMsg.usd, _overdraft, _userAccountMsg.overdraft);
    }

    function execCnyDeduction(string memory _userId, string memory _orderId, uint256 _cny, uint256 _cnyOverdraft, string memory _msg) external onlyExecDeductionExecutor{
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId, _orderId);
        _userAccountMsg.cny = _userAccountMsg.cny - _cny;
        _userAccountMsg.cnyOverdraft = _userAccountMsg.cnyOverdraft + _cnyOverdraft;
        require(_userAccountMsg.cnyOverdraft <= quotaCny, "quotaCny error");
        orderCnyMsg[_orderId] = OrderCnyMsg(_cny, _cnyOverdraft, 0, 0, 0);
        emit ExecCnyDeduction(_userId, _orderId, _msg, _cny, _userAccountMsg.cny, _cnyOverdraft, _userAccountMsg.cnyOverdraft);
    }
    
    function refund(string memory _userId, string memory _deductionOrderId, string memory _orderId, uint256 _nmt, uint256 _usd, uint256 _overdraft) external onlyExecDeductionExecutor{
        OrderMsg storage _orderMsg = orderMsg[_deductionOrderId];
        require(
            _orderMsg.nmtAmount >= _orderMsg.refundNmt + _nmt && 
            _orderMsg.usd + _orderMsg.overdraft + 500 >= _orderMsg.refundUsd + _usd + _orderMsg.refundOverdraft + _overdraft, 
            "orderIdMsg error"
        );
        _orderMsg.refundNmt += _nmt;
        _orderMsg.refundUsd += _usd;
        _orderMsg.refundOverdraft += _overdraft;
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId, _orderId);
        _userAccountMsg.usd = _userAccountMsg.usd + _usd;
        require(_userAccountMsg.overdraft >= _overdraft, "overdraft error");
        _userAccountMsg.overdraft = _userAccountMsg.overdraft - _overdraft;
        useFeeSum -= _nmt;
        _userAccountMsg.balance = _userAccountMsg.balance + _nmt;
        emit Refund(_userId, _deductionOrderId, _orderId, _nmt, _userAccountMsg.balance, _usd, _userAccountMsg.usd, _overdraft, _userAccountMsg.overdraft);
    }
   
    function refundCny(string memory _userId, string memory _deductionOrderId, string memory _orderId, uint256 _cny, uint256 _cnyOverdraft) external onlyExecDeductionExecutor{
        OrderCnyMsg storage _orderCnyMsg = orderCnyMsg[_deductionOrderId];
        require(
            _orderCnyMsg.cny + _orderCnyMsg.overdraft >= _orderCnyMsg.refundCny + _cny + _orderCnyMsg.refundOverdraft + _cnyOverdraft, 
            "orderIdMsg error"
        );
        _orderCnyMsg.refundCny+= _cny;
        _orderCnyMsg.refundOverdraft += _cnyOverdraft;
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId, _orderId);
        _userAccountMsg.cny = _userAccountMsg.cny + _cny;
        require(_userAccountMsg.cnyOverdraft >= _cnyOverdraft, "cnyOverdraft error");
        _userAccountMsg.cnyOverdraft = _userAccountMsg.cnyOverdraft - _cnyOverdraft;
        emit RefundCny(_userId, _deductionOrderId, _orderId, _cny, _userAccountMsg.cny, _cnyOverdraft, _userAccountMsg.cnyOverdraft);
    }
    
    function tokenCharge(string memory _userId) external payable{
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId);
        _userAccountMsg.balance = _userAccountMsg.balance + msg.value;
        emit TokenCharge(_userAccountMsg.userId, msg.value, _userAccountMsg.balance, msg.sender);
    }

    function withdraw(uint256 value) external nonReentrant(){
        address sender = msg.sender;
        uint256 _num = userAccountByAddr[sender];
        require(_num > 0, "The user id does not exist");
        UserAccountMsg storage _userAccountMsg = userAccountMsg[_num];
        require(address(this).balance >= value, "Insufficient balance");
        _userAccountMsg.balance = _userAccountMsg.balance - value;
        require(sender != address(0), "The address is 0");
        payable(sender).transfer(value);
        emit Withdraw(sender, _userAccountMsg.userId, value, _userAccountMsg.balance);
    }

    function freeze(string memory _userId, uint256 freezeValue, uint256 jobType) external onlyAuth returns(bool){
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId);
        _userAccountMsg.balance = _userAccountMsg.balance - freezeValue;
        _userAccountMsg.freezed = _userAccountMsg.freezed + freezeValue;
        emit Freeze(_userId, freezeValue, _userAccountMsg.balance, jobType);
        return true;
    }

    function execDebit(string memory _userId, uint256 useValue, uint256 offsetValue, uint256 jobType) external onlyAuth returns(bool){
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId);
        _userAccountMsg.freezed = _userAccountMsg.freezed - useValue - offsetValue;
        _userAccountMsg.balance = _userAccountMsg.balance + offsetValue;
        uint256 _settlement;
        if(jobType == 1){
            _settlement = IConf(conf).p_settlement();
        }else if(jobType == 2){
            _settlement = IConf(conf).v_settlement();
        }
        uint256 fee = _settlement * useValue / 10000 ;
        providerFeeSum = providerFeeSum + fee;
        fee = useValue - fee;
        payable(address(0x00)).transfer(fee);
        burnAmount = burnAmount + fee;
        emit ExecDebit(_userId, useValue, offsetValue, _userAccountMsg.balance, jobType);
        return true;
    }

    function distributeNmt(string memory paymentId, address gpu_provider, uint256 gpu_fee, uint256 platform_fee, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public notContract{
        bytes32 digest =  keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR(),
                keccak256(abi.encode(paymentId, gpu_provider, gpu_fee, platform_fee, expir)))
        );
        _orderNmtMsgUpdate(paymentId, gpu_fee + platform_fee);
        _verifyParm(digest, expir, vs, rs);
        if (gpu_fee > 0) payable(gpu_provider).transfer(gpu_fee);
        if (platform_fee > 0) payable(feeTo).transfer(platform_fee);
        emit DistributeNmt(paymentId, gpu_provider, gpu_fee, platform_fee);
    }

    function distributeAndBurnNmt(string memory paymentId, address gpu_provider, uint256 gpu_fee, address platform, uint256 platform_fee, uint256 burn, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public notContract{
        bytes32 digest =  keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR(),
                keccak256(abi.encode(paymentId, gpu_provider, gpu_fee, platform, platform_fee, burn, expir)))
        );
        _orderNmtMsgUpdate(paymentId, gpu_fee + platform_fee + burn);
        _verifyParm(digest, expir, vs, rs);
        if (gpu_fee > 0) payable(gpu_provider).transfer(gpu_fee);
        if (platform_fee > 0) payable(platform).transfer(platform_fee);
        if (burn > 0) payable(address(0)).transfer(burn);
        emit DistributeAndBurnNmt(paymentId, gpu_provider, gpu_fee, platform, platform_fee, burn);
    }

    function distributeUsd(string memory paymentId, address gpu_provider, uint256 gpu_fee, uint256 gpu_nmt, uint256 platform_fee, uint256 platform_nmt, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public notContract{
        _orderUsdMsgUpdate(paymentId, gpu_fee + platform_fee);
        _distribute(paymentId, gpu_provider, gpu_fee, gpu_nmt, platform_fee, platform_nmt, expir, vs, rs);
        emit DistributeUsd(paymentId, gpu_provider, gpu_fee, gpu_nmt, platform_fee, platform_nmt);
    }

    function distributeCny(string memory paymentId, address gpu_provider, uint256 gpu_fee, uint256 gpu_nmt, uint256 platform_fee, uint256 platform_nmt, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public notContract{
        _orderCnyMsgUpdate(paymentId, gpu_fee + platform_fee);
        _distribute(paymentId, gpu_provider, gpu_fee, gpu_nmt, platform_fee, platform_nmt, expir, vs, rs);
        emit DistributeCny(paymentId, gpu_provider, gpu_fee, gpu_nmt, platform_fee, platform_nmt);
    }

    function distributeAndBurnUsd(string memory paymentId, address gpu_provider, address platform, uint256[6] calldata parm, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public notContract{
        _orderUsdMsgUpdate(paymentId, parm[0] + parm[2] + parm[4]);
        _distributeAndBurn(paymentId, gpu_provider, platform, parm, expir, vs, rs);
        emit DistributeAndBurnUsd(paymentId, gpu_provider, platform, parm);
    }

    function distributeAndBurnCny(string memory paymentId, address gpu_provider,address platform, uint256[6] calldata parm, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public notContract{
        _orderCnyMsgUpdate(paymentId, parm[0] + parm[2] + parm[4]);
        _distributeAndBurn(paymentId, gpu_provider, platform, parm, expir, vs, rs);
        emit DistributeAndBurnCny(paymentId, gpu_provider, platform, parm);
    }

    function withdrawComputingFee(
        address addr,
        uint256[2] calldata uints,
        uint8[] calldata vs,
        bytes32[] calldata rssMetadata
    )
        external
        nonReentrant()
        notContract()
    {   
        require(providerFeeSum >= uints[0], "withdrawComputingFee error");
        transferToken(addr, uints, vs, rssMetadata);
        providerFeeSum = providerFeeSum - uints[0];
    }
    
    function queryUserMsgById(string memory _userId) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, address) {
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId);
        return (_userAccountMsg.balance, _userAccountMsg.usd, _userAccountMsg.overdraft, _userAccountMsg.cny, _userAccountMsg.cnyOverdraft, _userAccountMsg.freezed, _userAccountMsg.addr);
    }

    function queryUserMsgByAddr(address _addr) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, string memory) {
        uint256 _num = userAccountByAddr[_addr];
        require(_num > 0, "not exist");
        UserAccountMsg storage _userAccountMsg = userAccountMsg[_num];
        return (_userAccountMsg.balance, _userAccountMsg.usd, _userAccountMsg.overdraft, _userAccountMsg.cny, _userAccountMsg.cnyOverdraft, _userAccountMsg.freezed, _userAccountMsg.userId);
    }

    function DOMAIN_SEPARATOR() public view returns(bytes32){
        return keccak256(
            abi.encode(
                keccak256('EIP712Domain(uint256 chainId,address verifyingContract)'),
                block.chainid,
                address(this)
            )
        );
    }

    function _orderNmtMsgUpdate(string memory paymentId, uint256 amount) internal{
        require(orderId[paymentId], "paymentId error");
        OrderMsg storage _orderMsg = orderMsg[paymentId];
        require(_orderMsg.nmtAmount - _orderMsg.refundNmt - _orderMsg.distributeNmt >= amount, "distributeNmt out of range");
        _orderMsg.distributeNmt += amount;
    }

    function _orderUsdMsgUpdate(string memory paymentId, uint256 amount) internal{
        require(orderId[paymentId], "paymentId error");
        OrderMsg storage _orderMsg = orderMsg[paymentId];
        require(_orderMsg.usd + _orderMsg.overdraft - _orderMsg.refundUsd  - _orderMsg.distributeUsd >= amount, "distributeUsd out of range");
        _orderMsg.distributeUsd += amount;
    }

    function _orderCnyMsgUpdate(string memory paymentId, uint256 amount) internal{
        require(orderId[paymentId], "paymentId error");
        OrderCnyMsg storage _orderCnyMsg = orderCnyMsg[paymentId];
        require(_orderCnyMsg.cny  + _orderCnyMsg.overdraft- _orderCnyMsg.refundCny - _orderCnyMsg.distributeCny >= amount, "distributeCny out of range");
        _orderCnyMsg.distributeCny += amount;
    }

    function _distribute(string memory paymentId, address gpu_provider, uint256 gpu_fee, uint256 gpu_nmt, uint256 platform_fee, uint256 platform_nmt, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) internal{
        bytes32 digest = keccak256(
                abi.encodePacked(
                    '\x19\x01',
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(paymentId, gpu_provider, gpu_fee, gpu_nmt, platform_fee,platform_nmt, expir)))
            );
        _verifyParm(digest, expir, vs, rs);
        require(IFiatoSettle(fiatoSettle).distribute(gpu_provider, gpu_nmt, platform_nmt), "cleaner feild");
    }

    function _distributeAndBurn(string memory paymentId, address gpu_provider, address platform, uint256[6] calldata parm, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) internal{
        bytes32 digest = keccak256(
                abi.encodePacked(
                    '\x19\x01',
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(paymentId, gpu_provider, parm[0], parm[1], platform, parm[2],parm[3], parm[4], parm[5], expir)))
            );
        _verifyParm(digest, expir, vs, rs);
        require(IFiatoSettle(fiatoSettle).distribute(gpu_provider, parm[1], platform, parm[3], parm[5]), "cleaner feild");
    }

    function _verifyParm(bytes32 digest, uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) internal{
        require(block.timestamp <= expir, "sign expired");
        uint256 counter;
        uint256 len = vs.length;
        require(len*2 == rs.length, "length mismatch");
        require(!digestSta[digest], "digest error"); 
        digestSta[digest] = true;
        address[] memory signAddrs = new address[](len);
        for (uint256 i = 0; i < len; i++) {
            (bool result, address signAddr) = verifySign(digest, Sig(vs[i], rs[i*2], rs[i*2+1]));
            signAddrs[i] = signAddr;
            if (result){
                counter++;
            }
        }
        require(counter >= signNum, "lack of signature");
        require(areElementsUnique(signAddrs), "duplicate signature"); 
    }

    function _caclAccountBalance(string memory _userId, uint256 _price) internal returns(bool){
        UserAccountMsg storage _userAccountMsg = getUserAccountMsg(_userId);
        uint256 overdraft = _userAccountMsg.overdraft;
        if(overdraft> 0){
            if(_userAccountMsg.usd >= overdraft){
                _userAccountMsg.usd = _userAccountMsg.usd - overdraft;
                _userAccountMsg.overdraft = 0;
                emit CaclAccountBalance(_userId, 0, _userAccountMsg.balance, overdraft, _userAccountMsg.usd, overdraft, 0, _price);
                return true;
            }else {
                if(_userAccountMsg.usd > 0){
                    uint256 offsetAmount = overdraft - _userAccountMsg.usd;
                    uint256 offsetNmtAmount = offsetAmount * 1e24 / _price;
                    if(_userAccountMsg.balance == 0){
                        _userAccountMsg.overdraft = overdraft - _userAccountMsg.usd; 
                        emit CaclAccountBalance(_userId, 0, 0, 0, 0, _userAccountMsg.usd, _userAccountMsg.overdraft, _price);
                        _userAccountMsg.usd = 0;
                        return true;
                    }else {
                        if(offsetNmtAmount * 1e10 <= _userAccountMsg.balance){
                            _userAccountMsg.balance = _userAccountMsg.balance - offsetNmtAmount * 1e10;
                            _userAccountMsg.overdraft = 0;
                            useFeeSum += offsetNmtAmount* 1e10;
                            emit CaclAccountBalance(_userId, offsetNmtAmount* 1e10, _userAccountMsg.balance, _userAccountMsg.usd, 0, overdraft, 0, _price);
                            _userAccountMsg.usd = 0;
                            return true;
                        }else {
                            uint256 offsetOverdraft = offsetNmtAmount - _userAccountMsg.balance/1e10;
                            _userAccountMsg.overdraft = offsetOverdraft * _price / 1e24; 
                            _userAccountMsg.balance = _userAccountMsg.balance - (offsetNmtAmount - offsetOverdraft)*1e10;
                            useFeeSum += (offsetNmtAmount - offsetOverdraft)*1e10;
                            emit CaclAccountBalance(_userId, (offsetNmtAmount - offsetOverdraft)*1e10, _userAccountMsg.balance, _userAccountMsg.usd, 0, overdraft - _userAccountMsg.overdraft, _userAccountMsg.overdraft, _price);
                            _userAccountMsg.usd = 0;
                            return true;
                        }
                    }
                }else {
                    uint256 offsetNmtAmount = _userAccountMsg.overdraft * 1e24 / _price;
                    if(offsetNmtAmount * 1e10 <= _userAccountMsg.balance){
                        _userAccountMsg.balance = _userAccountMsg.balance - offsetNmtAmount * 1e10;
                        useFeeSum += offsetNmtAmount* 1e10;
                        emit CaclAccountBalance(_userId, offsetNmtAmount * 1e10, _userAccountMsg.balance, 0, 0, overdraft, 0,_price);
                        _userAccountMsg.overdraft = 0;
                        return true;
                    }else {
                        uint256 offsetOverdraft = offsetNmtAmount - _userAccountMsg.balance/1e10;
                        _userAccountMsg.overdraft = offsetOverdraft * _price / 1e24; 
                        _userAccountMsg.balance = _userAccountMsg.balance - (offsetNmtAmount - offsetOverdraft)*1e10;
                        useFeeSum += (offsetNmtAmount - offsetOverdraft)*1e10;
                        emit CaclAccountBalance(_userId, (offsetNmtAmount - offsetOverdraft)*1e10, _userAccountMsg.balance, 0, 0, overdraft-_userAccountMsg.overdraft, _userAccountMsg.overdraft,_price);
                        return true;
                    }
                }
            }
        }
        return true;
    }
    
    function areElementsUnique(address[] memory arr) internal pure returns (bool) {
        for(uint i = 0; i < arr.length - 1; i++) {
            for(uint j = i + 1; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    return false; 
                }
            }
        }
        return true; 
    }
      
    function transferToken(
        address addr,
        uint256[2] calldata uints,
        uint8[] calldata vs,
        bytes32[] calldata rssMetadata
    ) internal{
        require( block.timestamp<= uints[1], "exceeded limit");
        uint256 len = vs.length;
        uint256 counter;
        uint256 _nonce = nonce[addr]++;
        require(len*2 == rssMetadata.length, "length mismatch");
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR(),
                keccak256(abi.encode(addr, uints[0], uints[1], _nonce))
            )
        );
        address[] memory signAddrs = new address[](len);
        for (uint256 i = 0; i < len; i++) {
            (bool result, address signAddr) = verifySign(
                digest,
                Sig(vs[i], rssMetadata[i*2], rssMetadata[i*2+1])
            );
            signAddrs[i] = signAddr;
            if (result){
                counter++;
            }
        }
       
        require(
            counter >= signNum,
            "less than threshold"
        );
        require(areElementsUnique(signAddrs), "not unique");
        withdrawData[addr][_nonce] =  uints[0];
        payable(addr).transfer(uints[0]);
        emit WithdrawToken(addr, _nonce, uints[0]);
    }

    function getUserAccountMsg(string memory _userId, string memory _orderId) internal returns (UserAccountMsg storage)  {
        uint256 _num = userAccountById[_userId];
        UserAccountMsg storage _userAccountMsg = userAccountMsg[_num];
        require(_num > 0, "user not exist");
        require(!orderId[_orderId], "orderId error");
        orderId[_orderId] = true;
        return _userAccountMsg; 
    }

    function getUserAccountMsg(string memory _userId) internal view returns (UserAccountMsg storage)  {
        uint256 _num = userAccountById[_userId];
        UserAccountMsg storage _userAccountMsg = userAccountMsg[_num];
        require(_num > 0, "user not exist");
        return _userAccountMsg; 
    }

    function verifySign(bytes32 _digest,Sig memory _sig) internal view returns (bool, address)  {
        require(uint256(_sig.s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "invalid 's' value");
        require(uint8(_sig.v) == 27 || uint8(_sig.v) == 28, "invalid 'v' value");
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 hash = keccak256(abi.encodePacked(prefix, _digest));
        address signer = ecrecover(hash, _sig.v, _sig.r, _sig.s);
        require(signer != address(0), "0 address");
        bool isActs = IConf(conf).acts(signer); 
        return(isActs, signer); 
    }
}
        

Contract ABI

[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"CONTRACT_DOMAIN","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"authSta","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnAmount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"caclAccountBalance","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"uint256","name":"_price","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"conf","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteAccount","inputs":[{"type":"string","name":"_userId","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"distributeAndBurnCny","inputs":[{"type":"string","name":"paymentId","internalType":"string"},{"type":"address","name":"gpu_provider","internalType":"address"},{"type":"address","name":"platform","internalType":"address"},{"type":"uint256[6]","name":"parm","internalType":"uint256[6]"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"distributeAndBurnNmt","inputs":[{"type":"string","name":"paymentId","internalType":"string"},{"type":"address","name":"gpu_provider","internalType":"address"},{"type":"uint256","name":"gpu_fee","internalType":"uint256"},{"type":"address","name":"platform","internalType":"address"},{"type":"uint256","name":"platform_fee","internalType":"uint256"},{"type":"uint256","name":"burn","internalType":"uint256"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"distributeAndBurnUsd","inputs":[{"type":"string","name":"paymentId","internalType":"string"},{"type":"address","name":"gpu_provider","internalType":"address"},{"type":"address","name":"platform","internalType":"address"},{"type":"uint256[6]","name":"parm","internalType":"uint256[6]"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"distributeCny","inputs":[{"type":"string","name":"paymentId","internalType":"string"},{"type":"address","name":"gpu_provider","internalType":"address"},{"type":"uint256","name":"gpu_fee","internalType":"uint256"},{"type":"uint256","name":"gpu_nmt","internalType":"uint256"},{"type":"uint256","name":"platform_fee","internalType":"uint256"},{"type":"uint256","name":"platform_nmt","internalType":"uint256"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"distributeNmt","inputs":[{"type":"string","name":"paymentId","internalType":"string"},{"type":"address","name":"gpu_provider","internalType":"address"},{"type":"uint256","name":"gpu_fee","internalType":"uint256"},{"type":"uint256","name":"platform_fee","internalType":"uint256"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"distributeUsd","inputs":[{"type":"string","name":"paymentId","internalType":"string"},{"type":"address","name":"gpu_provider","internalType":"address"},{"type":"uint256","name":"gpu_fee","internalType":"uint256"},{"type":"uint256","name":"gpu_nmt","internalType":"uint256"},{"type":"uint256","name":"platform_fee","internalType":"uint256"},{"type":"uint256","name":"platform_nmt","internalType":"uint256"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execCnyDeduction","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"string","name":"_orderId","internalType":"string"},{"type":"uint256","name":"_cny","internalType":"uint256"},{"type":"uint256","name":"_cnyOverdraft","internalType":"uint256"},{"type":"string","name":"_msg","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"execDebit","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"uint256","name":"useValue","internalType":"uint256"},{"type":"uint256","name":"offsetValue","internalType":"uint256"},{"type":"uint256","name":"jobType","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execDeduction","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"string","name":"_orderId","internalType":"string"},{"type":"uint256","name":"_nmt","internalType":"uint256"},{"type":"uint256","name":"_usd","internalType":"uint256"},{"type":"uint256","name":"_overdraft","internalType":"uint256"},{"type":"string","name":"_msg","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeTo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"fiatoSettle","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"freeze","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"uint256","name":"freezeValue","internalType":"uint256"},{"type":"uint256","name":"jobType","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[{"type":"address","name":"_conf","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initUserId","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonce","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"num","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"cny","internalType":"uint256"},{"type":"uint256","name":"overdraft","internalType":"uint256"},{"type":"uint256","name":"refundCny","internalType":"uint256"},{"type":"uint256","name":"refundOverdraft","internalType":"uint256"},{"type":"uint256","name":"distributeCny","internalType":"uint256"}],"name":"orderCnyMsg","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"orderId","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"nmtAmount","internalType":"uint256"},{"type":"uint256","name":"usd","internalType":"uint256"},{"type":"uint256","name":"overdraft","internalType":"uint256"},{"type":"uint256","name":"refundNmt","internalType":"uint256"},{"type":"uint256","name":"refundUsd","internalType":"uint256"},{"type":"uint256","name":"refundOverdraft","internalType":"uint256"},{"type":"uint256","name":"distributeNmt","internalType":"uint256"},{"type":"uint256","name":"distributeUsd","internalType":"uint256"}],"name":"orderMsg","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"providerFeeSum","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"string","name":"","internalType":"string"}],"name":"queryUserMsgByAddr","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}],"name":"queryUserMsgById","inputs":[{"type":"string","name":"_userId","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quota","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quotaCny","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"refund","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"string","name":"_deductionOrderId","internalType":"string"},{"type":"string","name":"_orderId","internalType":"string"},{"type":"uint256","name":"_nmt","internalType":"uint256"},{"type":"uint256","name":"_usd","internalType":"uint256"},{"type":"uint256","name":"_overdraft","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"refundCny","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"string","name":"_deductionOrderId","internalType":"string"},{"type":"string","name":"_orderId","internalType":"string"},{"type":"uint256","name":"_cny","internalType":"uint256"},{"type":"uint256","name":"_cnyOverdraft","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeTo","inputs":[{"type":"address","name":"_feeTo","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFiatoSettle","inputs":[{"type":"address","name":"_fiatoSettle","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"signNum","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"tokenCharge","inputs":[{"type":"string","name":"_userId","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAccount","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAccountCny","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"string","name":"_orderId","internalType":"string"},{"type":"uint256","name":"_cny","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAccountUsd","inputs":[{"type":"string","name":"_userId","internalType":"string"},{"type":"string","name":"_orderId","internalType":"string"},{"type":"uint256","name":"_usd","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"},{"type":"uint256","name":"_price","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAuthSta","inputs":[{"type":"address","name":"_addr","internalType":"address"},{"type":"bool","name":"_sta","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateQuota","inputs":[{"type":"uint256","name":"_quota","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateQuotaCny","inputs":[{"type":"uint256","name":"_quotaCny","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSignNum","inputs":[{"type":"uint256","name":"_signNum","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"useFeeSum","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userAccountByAddr","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userAccountById","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"freezed","internalType":"uint256"},{"type":"string","name":"userId","internalType":"string"},{"type":"address","name":"addr","internalType":"address"},{"type":"uint256","name":"usd","internalType":"uint256"},{"type":"uint256","name":"overdraft","internalType":"uint256"},{"type":"uint256","name":"cny","internalType":"uint256"},{"type":"uint256","name":"cnyOverdraft","internalType":"uint256"}],"name":"userAccountMsg","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawComputingFee","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"uint256[2]","name":"uints","internalType":"uint256[2]"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rssMetadata","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawData","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"event","name":"CaclAccountBalance","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"uint256","name":"nmt","indexed":false},{"type":"uint256","name":"nmtBalance","indexed":false},{"type":"uint256","name":"usd","indexed":false},{"type":"uint256","name":"usdBalance","indexed":false},{"type":"uint256","name":"overdraft","indexed":false},{"type":"uint256","name":"overdraftBalance","indexed":false},{"type":"uint256","name":"price","indexed":false}],"anonymous":false},{"type":"event","name":"CaclAccountCnyBalance","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"uint256","name":"cny","indexed":false},{"type":"uint256","name":"cnyBalance","indexed":false},{"type":"uint256","name":"cnyOverdraft","indexed":false},{"type":"uint256","name":"cnyOverdraftBalance","indexed":false}],"anonymous":false},{"type":"event","name":"DeleteAccount","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"address","name":"userAddr","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeAndBurnCny","inputs":[{"type":"string","name":"paymentId","indexed":false},{"type":"address","name":"gpu_provider","indexed":false},{"type":"address","name":"platform","indexed":false},{"type":"uint256[6]","name":"parm","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeAndBurnNmt","inputs":[{"type":"string","name":"paymentId","indexed":false},{"type":"address","name":"gpu_provider","indexed":false},{"type":"uint256","name":"gpu_fee","indexed":false},{"type":"address","name":"platform","indexed":false},{"type":"uint256","name":"platform_fee","indexed":false},{"type":"uint256","name":"burn","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeAndBurnUsd","inputs":[{"type":"string","name":"paymentId","indexed":false},{"type":"address","name":"gpu_provider","indexed":false},{"type":"address","name":"platform","indexed":false},{"type":"uint256[6]","name":"parm","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeCny","inputs":[{"type":"string","name":"id","indexed":false},{"type":"address","name":"reciver","indexed":false},{"type":"uint256","name":"usdAmount","indexed":false},{"type":"uint256","name":"nmtAmount","indexed":false},{"type":"uint256","name":"feeUsdAmount","indexed":false},{"type":"uint256","name":"feeNmtAmount","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeNmt","inputs":[{"type":"string","name":"id","indexed":false},{"type":"address","name":"reciver","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"uint256","name":"feeAmount","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeUsd","inputs":[{"type":"string","name":"id","indexed":false},{"type":"address","name":"reciver","indexed":false},{"type":"uint256","name":"usdAmount","indexed":false},{"type":"uint256","name":"nmtAmount","indexed":false},{"type":"uint256","name":"feeUsdAmount","indexed":false},{"type":"uint256","name":"feeNmtAmount","indexed":false}],"anonymous":false},{"type":"event","name":"ExecCnyDeduction","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"string","name":"orderId","indexed":false},{"type":"string","name":"_msg","indexed":false},{"type":"uint256","name":"cny","indexed":false},{"type":"uint256","name":"cnyBalance","indexed":false},{"type":"uint256","name":"cnyOverdraft","indexed":false},{"type":"uint256","name":"cnyOverdraftBalance","indexed":false}],"anonymous":false},{"type":"event","name":"ExecDebit","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"uint256","name":"useValue","indexed":false},{"type":"uint256","name":"offsetValue","indexed":false},{"type":"uint256","name":"balance","indexed":false},{"type":"uint256","name":"jobType","indexed":false}],"anonymous":false},{"type":"event","name":"ExecDeduction","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"string","name":"orderId","indexed":false},{"type":"string","name":"_msg","indexed":false},{"type":"uint256","name":"nmt","indexed":false},{"type":"uint256","name":"nmtBalance","indexed":false},{"type":"uint256","name":"usd","indexed":false},{"type":"uint256","name":"usdBalance","indexed":false},{"type":"uint256","name":"overdraft","indexed":false},{"type":"uint256","name":"overdraftBalance","indexed":false}],"anonymous":false},{"type":"event","name":"Freeze","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"uint256","name":"value","indexed":false},{"type":"uint256","name":"balance","indexed":false},{"type":"uint256","name":"jobType","indexed":false}],"anonymous":false},{"type":"event","name":"InitAccount","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"address","name":"userAddr","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"Refund","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"string","name":"deductionOrderId","indexed":false},{"type":"string","name":"orderId","indexed":false},{"type":"uint256","name":"nmt","indexed":false},{"type":"uint256","name":"nmtBalance","indexed":false},{"type":"uint256","name":"usd","indexed":false},{"type":"uint256","name":"usdBalance","indexed":false},{"type":"uint256","name":"overdraft","indexed":false},{"type":"uint256","name":"overdraftBalance","indexed":false}],"anonymous":false},{"type":"event","name":"RefundCny","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"string","name":"deductionOrderId","indexed":false},{"type":"string","name":"orderId","indexed":false},{"type":"uint256","name":"cny","indexed":false},{"type":"uint256","name":"cnyBalance","indexed":false},{"type":"uint256","name":"cnyOverdraft","indexed":false},{"type":"uint256","name":"cnyOverdraftBalance","indexed":false}],"anonymous":false},{"type":"event","name":"TokenCharge","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"uint256","name":"value","indexed":false},{"type":"uint256","name":"nmtbalance","indexed":false},{"type":"address","name":"chargeAddr","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateAccount","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"address","name":"userAddr","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateAccountCny","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"string","name":"orderId","indexed":false},{"type":"uint256","name":"cny","indexed":false},{"type":"uint256","name":"cnyBalance","indexed":false},{"type":"bool","name":"_type","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateAccountUsd","inputs":[{"type":"string","name":"userId","indexed":false},{"type":"string","name":"orderId","indexed":false},{"type":"uint256","name":"usd","indexed":false},{"type":"uint256","name":"usdBalance","indexed":false},{"type":"bool","name":"_type","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateAuthSta","inputs":[{"type":"address","name":"_addr","indexed":false},{"type":"bool","name":"sta","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"userAddr","indexed":false},{"type":"string","name":"userId","indexed":false},{"type":"uint256","name":"value","indexed":false},{"type":"uint256","name":"nmtbalance","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawToken","inputs":[{"type":"address","name":"_userAddr","indexed":true},{"type":"uint256","name":"_nonce","indexed":false},{"type":"uint256","name":"_amount","indexed":false}],"anonymous":false}]
            

Deployed ByteCode

0x6080604052600436106103505760003560e01c80636fa62a86116101c6578063a0f801df116100f7578063d967fd0011610095578063ee2182371161006f578063ee21823714610b45578063f2fde38b14610b65578063f46901ed14610b85578063fb19548814610ba557600080fd5b8063d967fd0014610ae5578063dbaf57d514610b05578063dff949e514610b2557600080fd5b8063b9eb375b116100d1578063b9eb375b14610a6f578063bce8bc0314610a8f578063cebe09c914610aaf578063d5e363f914610ac557600080fd5b8063a0f801df146109ff578063a9b59cc014610a1f578063b882cc7a14610a3f57600080fd5b80638d13b6aa116101645780638f32d59b1161013e5780638f32d59b146109535780638f5a18381461097a578063969418cd14610990578063986c4e4c146109c457600080fd5b80638d13b6aa146108ef5780638da5cb5b1461090f5780638e0325201461093357600080fd5b806378675359116101a0578063786753591461088357806387ece834146108a3578063888b5ef2146108b95780638b2707b7146108cf57600080fd5b80636fa62a861461081157806370ae92d214610841578063715018a61461086e57600080fd5b80633644e515116102a05780634e70b1dc1161023e5780635aecf92c116102185780635aecf92c146106725780635b8a532e1461069257806368fe5bfc146106f05780636bb0103e1461076d57600080fd5b80634e70b1dc1461061c57806351745ce81461063257806359bb0e541461065257600080fd5b80633c579db81161027a5780633c579db81461059857806341107b64146105d0578063486a7e6b146105f05780634cbfdbcf1461060657600080fd5b80633644e515146105385780633967bed11461054d5780633b0c63501461056057600080fd5b806326e4f0401161030d5780632f4c98e0116102e75780632f4c98e0146104a557806333bcb75a146104c557806334dae077146104f857806335be12a21461051857600080fd5b806326e4f040146104455780632d756abe146104655780632e1a7d4d1461048557600080fd5b8063017e7e58146103555780630b87e9291461039257806317792729146103cd57806319ab453c146103ed5780631fecc18c1461040f5780632314c70b14610425575b600080fd5b34801561036157600080fd5b50601554610375906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039e57600080fd5b506103bf6103ad36600461485b565b60066020526000908152604090205481565b604051908152602001610389565b3480156103d957600080fd5b50600154610375906001600160a01b031681565b3480156103f957600080fd5b5061040d61040836600461485b565b610bc5565b005b34801561041b57600080fd5b506103bf60085481565b34801561043157600080fd5b5061040d61044036600461491a565b610c4c565b34801561045157600080fd5b5061040d6104603660046149b5565b610e2d565b34801561047157600080fd5b5061040d610480366004614a9c565b611073565b34801561049157600080fd5b5061040d6104a0366004614b63565b6111eb565b3480156104b157600080fd5b5061040d6104c0366004614b7c565b61139b565b3480156104d157600080fd5b506104e56104e036600461485b565b611554565b6040516103899796959493929190614cad565b34801561050457600080fd5b5061040d610513366004614cf1565b61168d565b34801561052457600080fd5b5061040d610533366004614b63565b61172b565b34801561054457600080fd5b506103bf611766565b61040d61055b366004614d7a565b6117bf565b34801561056c57600080fd5b506103bf61057b366004614d7a565b805160208183018101805160058252928201919093012091525481565b3480156105a457600080fd5b506103bf6105b3366004614db6565b600b60209081526000928352604080842090915290825290205481565b3480156105dc57600080fd5b5061040d6105eb366004614b63565b611820565b3480156105fc57600080fd5b506103bf60025481565b34801561061257600080fd5b506103bf60175481565b34801561062857600080fd5b506103bf60035481565b34801561063e57600080fd5b5061040d61064d366004614de2565b61185b565b34801561065e57600080fd5b5061040d61066d366004614e7b565b611a85565b34801561067e57600080fd5b5061040d61068d366004614b63565b611d34565b34801561069e57600080fd5b506106b26106ad366004614d7a565b611daf565b604080519788526020880196909652948601939093526060850191909152608084015260a08301526001600160a01b031660c082015260e001610389565b3480156106fc57600080fd5b5061074561070b366004614d7a565b8051602081830181018051601682529282019190930120915280546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610389565b34801561077957600080fd5b506107d6610788366004614d7a565b80516020818301810180516011825292820191909301209152805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909188565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610389565b34801561081d57600080fd5b5061083161082c366004614f1e565b611e05565b6040519015158152602001610389565b34801561084d57600080fd5b506103bf61085c36600461485b565b600a6020526000908152604090205481565b34801561087a57600080fd5b5061040d611ecf565b34801561088f57600080fd5b5061040d61089e366004614f7c565b611f56565b3480156108af57600080fd5b506103bf60095481565b3480156108c557600080fd5b506103bf600c5481565b3480156108db57600080fd5b5061040d6108ea366004615045565b612000565b3480156108fb57600080fd5b5061040d61090a36600461507e565b612092565b34801561091b57600080fd5b506000546201000090046001600160a01b0316610375565b34801561093f57600080fd5b50601354610375906001600160a01b031681565b34801561095f57600080fd5b506108316000546201000090046001600160a01b0316331490565b34801561098657600080fd5b506103bf60105481565b34801561099c57600080fd5b506109b06109ab366004614b63565b612281565b6040516103899897969594939291906150c4565b3480156109d057600080fd5b506108316109df366004614d7a565b8051602081830181018051600f8252928201919093012091525460ff1681565b348015610a0b57600080fd5b5061040d610a1a366004614f7c565b612355565b348015610a2b57600080fd5b5061040d610a3a36600461485b565b6123e7565b348015610a4b57600080fd5b50610831610a5a36600461485b565b60076020526000908152604090205460ff1681565b348015610a7b57600080fd5b5061040d610a8a366004615119565b612484565b348015610a9b57600080fd5b5061040d610aaa3660046151b0565b612558565b348015610abb57600080fd5b506103bf600e5481565b348015610ad157600080fd5b5061040d610ae0366004614d7a565b61274a565b348015610af157600080fd5b5061040d610b0036600461522f565b61286e565b348015610b1157600080fd5b50610831610b203660046152b6565b6129e0565b348015610b3157600080fd5b50610831610b40366004615309565b612c41565b348015610b5157600080fd5b5061040d610b6036600461507e565b612cff565b348015610b7157600080fd5b5061040d610b8036600461485b565b612f1b565b348015610b9157600080fd5b5061040d610ba036600461485b565b612f5d565b348015610bb157600080fd5b5061040d610bc0366004614cf1565b612fb5565b600054610100900460ff1680610bde575060005460ff16155b610c035760405162461bcd60e51b8152600401610bfa9061534d565b60405180910390fd5b600054610100900460ff16158015610c25576000805461ffff19166101011790555b610c2d613039565b610c36826130ee565b8015610c48576000805461ff00191690555b5050565b60015460408051630e6a4c5360e41b8152905133926001600160a01b03169163e6a4c53091600480830192602092919082900301816000875af1158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb919061539b565b6001600160a01b031614610ce15760405162461bcd60e51b8152600401610bfa906153b8565b6000610ced86866131e2565b9050838160060154610cff9190615405565b60068201556007810154610d14908490615418565b600782018190556017541015610d5d5760405162461bcd60e51b815260206004820152600e60248201526d38bab7ba30a1b73c9032b93937b960911b6044820152606401610bfa565b6040518060a0016040528085815260200184815260200160008152602001600081526020016000815250601686604051610d97919061542b565b908152602001604051809103902060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050507fd38c2b5d2e20ad5c553692a960df4fa0467acceb0631d1f472549c4f396689da868684878560060154888760070154604051610e1d9796959493929190615447565b60405180910390a1505050505050565b60015460408051630e6a4c5360e41b8152905133926001600160a01b03169163e6a4c53091600480830192602092919082900301816000875af1158015610e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9c919061539b565b6001600160a01b031614610ec25760405162461bcd60e51b8152600401610bfa906153b8565b6000610ece87876131e2565b9050838160040154610ee09190615405565b60048201556005810154610ef5908490615418565b60058201819055600e541015610f3b5760405162461bcd60e51b815260206004820152600b60248201526a38bab7ba309032b93937b960a91b6044820152606401610bfa565b8460106000828254610f4d9190615418565b90915550508054610f5f908690615405565b8160000181905550604051806101000160405280868152602001858152602001848152602001600081526020016000815260200160008152602001600081526020016000815250601187604051610fb6919061542b565b9081526020016040518091039020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701559050507f7e59423cbda230350a3dbb62766b40b5c9446ae9f627ea3390a89cf87d6a3e588787848885600001548987600401548a8960050154604051611062999897969594939291906154a7565b60405180910390a150505050505050565b333b15801561108157503332145b61109d5760405162461bcd60e51b8152600401610bfa90615518565b60006110a7611766565b8a8a8a8a8a6040516020016110c0959493929190615546565b604051602081830303815290604052805190602001206040516020016110e7929190615586565b6040516020818303038152906040528051906020012090506111148a888a61110f9190615418565b6132ef565b6111228187878787876133e0565b8715611160576040516001600160a01b038a169089156108fc02908a906000818181858888f1935050505015801561115e573d6000803e3d6000fd5b505b86156111a2576015546040516001600160a01b039091169088156108fc029089906000818181858888f193505050501580156111a0573d6000803e3d6000fd5b505b7fd3d0f5182029f42dd5f12b790d81228f004422c4b148e798edd8f2a4567556728a8a8a8a6040516111d794939291906155a1565b60405180910390a150505050505050505050565b600d5460ff16156111fb57600080fd5b600d805460ff1916600117905533600081815260066020526040902054806112655760405162461bcd60e51b815260206004820152601a60248201527f546865207573657220696420646f6573206e6f742065786973740000000000006044820152606401610bfa565b6000818152600460205260409020478411156112ba5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610bfa565b80546112c7908590615405565b81556001600160a01b0383166113125760405162461bcd60e51b815260206004820152601060248201526f0546865206164647265737320697320360841b6044820152606401610bfa565b6040516001600160a01b0384169085156108fc029086906000818181858888f19350505050158015611348573d6000803e3d6000fd5b5080546040517fcab96aa5dae2c7c5f897bf248f4f8531bb6fe7d29c7fac163391926e0bef8313916113839186916002860191899190615690565b60405180910390a15050600d805460ff191690555050565b333b1580156113a957503332145b6113c55760405162461bcd60e51b8152600401610bfa90615518565b60006113cf611766565b8c8c8c8c8c8c8c6040516020016113ec97969594939291906156c7565b60405160208183030381529060405280519060200120604051602001611413929190615586565b6040516020818303038152906040528051906020012090506114468c888a8d61143c9190615418565b61110f9190615418565b6114548187878787876133e0565b8915611492576040516001600160a01b038c16908b156108fc02908c906000818181858888f19350505050158015611490573d6000803e3d6000fd5b505b87156114d0576040516001600160a01b038a169089156108fc02908a906000818181858888f193505050501580156114ce573d6000803e3d6000fd5b505b86156115055760405160009088156108fc0290899083818181858288f19350505050158015611503573d6000803e3d6000fd5b505b7f6bd708ad98d5776bcec5458db0feb3aeb598d43d9691bddd87a95db944bb9b608c8c8c8c8c8c60405161153e96959493929190615715565b60405180910390a1505050505050505050505050565b6001600160a01b03811660009081526006602052604081205481908190819081908190606090806115b35760405162461bcd60e51b81526020600482015260096024820152681b9bdd08195e1a5cdd60ba1b6044820152606401610bfa565b6000818152600460208190526040909120805491810154600582015460068301546007840154600185015460028601805496979681906115f2906155d9565b80601f016020809104026020016040519081016040528092919081815260200182805461161e906155d9565b801561166b5780601f106116405761010080835404028352916020019161166b565b820191906000526020600020905b81548152906001019060200180831161164e57829003601f168201915b5050505050905098509850985098509850985098505050919395979092949650565b333b15801561169b57503332145b6116b75760405162461bcd60e51b8152600401610bfa90615518565b6116ca8b6116c5898c615418565b6136c1565b6116dd8b8b8b8b8b8b8b8b8b8b8b6137b7565b7f8ace22fc7f02827e54c29dddfd318383a3219009b37f7414a86b2f76dd00fb468b8b8b8b8b8b6040516117169695949392919061575b565b60405180910390a15050505050505050505050565b6117456000546201000090046001600160a01b0316331490565b6117615760405162461bcd60e51b8152600401610bfa906157a0565b601755565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b60006117ca826138f3565b80549091506117da903490615418565b8082556040517fa0091cfdb404baae9acab2176e13ace745a23fcd6a8f066371214ec58a66cdbb91611814916002850191349133906157d5565b60405180910390a15050565b61183a6000546201000090046001600160a01b0316331490565b6118565760405162461bcd60e51b8152600401610bfa906157a0565b600e55565b60015460408051630e6a4c5360e41b8152905133926001600160a01b03169163e6a4c53091600480830192602092919082900301816000875af11580156118a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ca919061539b565b6001600160a01b0316146118f05760405162461bcd60e51b8152600401610bfa906153b8565b6000601685604051611902919061542b565b908152602001604051809103902090508181600301548483600201546119289190615418565b6119329190615418565b61193c9190615418565b6001820154825461194d9190615418565b101561198e5760405162461bcd60e51b815260206004820152601060248201526f37b93232b924b226b9b39032b93937b960811b6044820152606401610bfa565b828160020160008282546119a29190615418565b92505081905550818160030160008282546119bd9190615418565b90915550600090506119cf87866131e2565b90508381600601546119e19190615418565b60068201556007810154831115611a2f5760405162461bcd60e51b815260206004820152601260248201527131b73ca7bb32b9323930b33a1032b93937b960711b6044820152606401610bfa565b828160070154611a3f9190615405565b6007820181905560068201546040517f96c12bec5cff7b77f4606e78cb16441360177055687012e5a345e0093385b39b92611062928b928b928b928b9290918b91615447565b60015460408051630e6a4c5360e41b8152905133926001600160a01b03169163e6a4c53091600480830192602092919082900301816000875af1158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af4919061539b565b6001600160a01b031614611b1a5760405162461bcd60e51b8152600401610bfa906153b8565b6000601186604051611b2c919061542b565b90815260200160405180910390209050838160030154611b4c9190615418565b815410801590611ba45750818160050154848360040154611b6d9190615418565b611b779190615418565b611b819190615418565b81600201548260010154611b959190615418565b611ba1906101f4615418565b10155b611be35760405162461bcd60e51b815260206004820152601060248201526f37b93232b924b226b9b39032b93937b960811b6044820152606401610bfa565b83816003016000828254611bf79190615418565b9250508190555082816004016000828254611c129190615418565b9250508190555081816005016000828254611c2d9190615418565b9091555060009050611c3f88876131e2565b9050838160040154611c519190615418565b60048201556005810154831115611c9c5760405162461bcd60e51b815260206004820152600f60248201526e37bb32b9323930b33a1032b93937b960891b6044820152606401610bfa565b828160050154611cac9190615405565b81600501819055508460106000828254611cc69190615405565b90915550508054611cd8908690615418565b808255600482015460058301546040517f4337d97fec34714a81485167076ee69797cd8577e0cca1765258f1aa1ffdbabf93611d22938d938d938d938d9390928d928d91906154a7565b60405180910390a15050505050505050565b611d4e6000546201000090046001600160a01b0316331490565b611d6a5760405162461bcd60e51b8152600401610bfa906157a0565b60008111611daa5760405162461bcd60e51b815260206004820152600d60248201526c39b4b3b7273ab69032b93937b960991b6044820152606401610bfa565b600c55565b600080600080600080600080611dc4896138f3565b805460048201546005830154600684015460078501546001860154600390960154949f939e50919c509a5098509196506001600160a01b0316945092505050565b3360009081526007602052604081205460ff16611e545760405162461bcd60e51b815260206004820152600d60248201526c3737903832b936b4b9b9b4b7b760991b6044820152606401610bfa565b6000611e5f856138f3565b8054909150611e6f908590615405565b81556001810154611e81908590615418565b600182015580546040517f8fa421265eb4149fe2245ffe0556705bb9626effabb0893e49213c0a40a43c6e91611ebc9188918891889061580d565b60405180910390a1506001949350505050565b611ee96000546201000090046001600160a01b0316331490565b611f055760405162461bcd60e51b8152600401610bfa906157a0565b60008054604051620100009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805462010000600160b01b0319169055565b333b158015611f6457503332145b611f805760405162461bcd60e51b8152600401610bfa90615518565b611fa7896080880135611f9860408a01358a35615418565b611fa29190615418565b61396c565b611fb8898989898989898989613a62565b7feee89856e8cf9b1a198a8ae3f02bb2cbe633ccd7b6f3da47f2ded08a38f9c69489898989604051611fed9493929190615852565b60405180910390a1505050505050505050565b61201a6000546201000090046001600160a01b0316331490565b6120365760405162461bcd60e51b8152600401610bfa906157a0565b6001600160a01b038216600081815260076020908152604091829020805460ff19168515159081179091558251938452908301527f945cbf6b9a5a0862a44011389abeaf9c598d46cde5b9e8fea9e79e4cb53bd28b9101611814565b60015460408051637801792560e01b8152905133926001600160a01b031691637801792591600480830192602092919082900301816000875af11580156120dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612101919061539b565b6001600160a01b0316146121275760405162461bcd60e51b8152600401610bfa90615892565b6000600583604051612139919061542b565b908152604080516020928190038301902054600081815260049093529120909150816121935760405162461bcd60e51b81526020600482015260096024820152681b9bdd08195e1a5cdd60ba1b6044820152606401610bfa565b6003810180546001600160a01b0390811660009081526006602052604081205581546001600160a01b03191690851690811790915515612242576001600160a01b038316600090815260066020526040902054156122265760405162461bcd60e51b815260206004820152601060248201526f1859191c995cdcc81bd8d8dd5c1a595960821b6044820152606401610bfa565b6001600160a01b03831660009081526006602052604090208290555b7f1dfd42627c669db457e1c86157451b3a02ae21206f5d5c1cdf0a92595cea848684846040516122739291906158c9565b60405180910390a150505050565b600460205260009081526040902080546001820154600283018054929391926122a9906155d9565b80601f01602080910402602001604051908101604052809291908181526020018280546122d5906155d9565b80156123225780601f106122f757610100808354040283529160200191612322565b820191906000526020600020905b81548152906001019060200180831161230557829003601f168201915b505050600384015460048501546005860154600687015460079097015495966001600160a01b0390931695919450925088565b333b15801561236357503332145b61237f5760405162461bcd60e51b8152600401610bfa90615518565b6123a189608088013561239760408a01358a35615418565b6116c59190615418565b6123b2898989898989898989613a62565b7f7ff03290fed88dc6912d4fffa4ba03e7234a69c9579a91e6104fb15796bc977c89898989604051611fed9493929190615852565b6124016000546201000090046001600160a01b0316331490565b61241d5760405162461bcd60e51b8152600401610bfa906157a0565b6001600160a01b0381166124625760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610bfa565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600d5460ff161561249457600080fd5b600d805460ff191660011790556124ab333b151590565b1580156124b757503332145b6124d35760405162461bcd60e51b8152600401610bfa90615518565b600854853511156125265760405162461bcd60e51b815260206004820152601a60248201527f7769746864726177436f6d707574696e67466565206572726f720000000000006044820152606401610bfa565b612534868686868686613be4565b60085461254390863590615405565b6008555050600d805460ff1916905550505050565b6001546040805163304c747160e21b8152905133926001600160a01b03169163c131d1c491600480830192602092919082900301816000875af11580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c7919061539b565b6001600160a01b0316146125ed5760405162461bcd60e51b8152600401610bfa906158f3565b60006125f985856131e2565b9050811561261b578281600601546126119190615418565b6006820155612631565b82816006015461262b9190615405565b60068201555b7f53248da0c2c44783eb66d5fdc9985eefa6c970573188eaf99e5bb7e633f5516785858584600601548660405161266c959493929190615923565b60405180910390a16007810154801561274257808260060154106126ec5780826006015461269a9190615405565b600683018190556000600784018190556040517ff08c68f7ca141cba39cb75cf1761ba6db6ce5333121e8ec39e24fe2ae139e495926126df928a928692918391615968565b60405180910390a1612742565b60068201546126fb9082615405565b600783018190556000600684018190556040517ff08c68f7ca141cba39cb75cf1761ba6db6ce5333121e8ec39e24fe2ae139e49592610e1d928a9290918291829190615968565b505050505050565b60015460408051637801792560e01b8152905133926001600160a01b031691637801792591600480830192602092919082900301816000875af1158015612795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b9919061539b565b6001600160a01b0316146127df5760405162461bcd60e51b8152600401610bfa90615892565b60006127ea826138f3565b60038101546001600160a01b0316600090815260066020526040808220829055519192509060059061281d90859061542b565b9081526040519081900360200181209190915560038201547f13239b3c5af383cc4c8f01fd1a3215e11c1e8cec8dffa41c683a2e6856724582916118149185916001600160a01b03909116906158c9565b6001546040805163304c747160e21b8152905133926001600160a01b03169163c131d1c491600480830192602092919082900301816000875af11580156128b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dd919061539b565b6001600160a01b0316146129035760405162461bcd60e51b8152600401610bfa906158f3565b600061290f86866131e2565b90508215612931578381600401546129279190615418565b6004820155612947565b8381600401546129419190615405565b60048201555b7fdd68e04770b30ad0236e8d18d217dfc1610e28b7e54d25a434877ad809497ec9868686846004015487604051612982959493929190615923565b60405180910390a16129948683613f70565b6127425760405162461bcd60e51b815260206004820152601860248201527f6361636c4163636f756e7442616c616e6365206572726f7200000000000000006044820152606401610bfa565b3360009081526007602052604081205460ff16612a2f5760405162461bcd60e51b815260206004820152600d60248201526c3737903832b936b4b9b9b4b7b760991b6044820152606401610bfa565b6000612a3a866138f3565b905083858260010154612a4d9190615405565b612a579190615405565b60018201558054612a69908590615418565b815560006001849003612af657600160009054906101000a90046001600160a01b03166001600160a01b03166389a941196040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef919061599f565b9050612b7a565b83600203612b7a57600160009054906101000a90046001600160a01b03166001600160a01b031663caa67b756040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b77919061599f565b90505b6000612710612b8988846159b8565b612b9391906159d7565b905080600854612ba39190615418565b600855612bb08188615405565b60405190915060009082156108fc0290839083818181858288f19350505050158015612be0573d6000803e3d6000fd5b5080600254612bef9190615418565b60025582546040517f9e2df4772c834f0440dc43dbfabdeda17875d9e3d9190b25ce3f78a8f5c7755791612c2b918b918b918b91908b90615968565b60405180910390a1506001979650505050505050565b6000336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b031663c131d1c46040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc6919061539b565b6001600160a01b031614612cec5760405162461bcd60e51b8152600401610bfa906158f3565b612cf68383613f70565b90505b92915050565b60015460408051637801792560e01b8152905133926001600160a01b031691637801792591600480830192602092919082900301816000875af1158015612d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6e919061539b565b6001600160a01b031614612d945760405162461bcd60e51b8152600401610bfa90615892565b600582604051612da4919061542b565b908152602001604051809103902054600014612df45760405162461bcd60e51b815260206004820152600f60248201526e155cd95c9a59081bd8d8dd5c1a5959608a1b6044820152606401610bfa565b6001600160a01b03811660009081526006602052604090205415612e525760405162461bcd60e51b8152602060048201526015602482015274155cd95c881859191c995cdcc81bd8d8dd5c1a5959605a1b6044820152606401610bfa565b6000600360008154612e63906159f9565b9182905550600081815260046020526040902090915060028101612e878582615a5d565b5081600585604051612e99919061542b565b908152604051908190036020019020556001600160a01b03831615612eea576003810180546001600160a01b0319166001600160a01b03851690811790915560009081526006602052604090208290555b7f51fa2232dd80636222c8b549cc29480b68d567ac9302674623638d358627883b84846040516122739291906158c9565b612f356000546201000090046001600160a01b0316331490565b612f515760405162461bcd60e51b8152600401610bfa906157a0565b612f5a81614447565b50565b612f776000546201000090046001600160a01b0316331490565b612f935760405162461bcd60e51b8152600401610bfa906157a0565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b333b158015612fc357503332145b612fdf5760405162461bcd60e51b8152600401610bfa90615518565b612fed8b611fa2898c615418565b6130008b8b8b8b8b8b8b8b8b8b8b6137b7565b7fec1d64d1d0b356d22b0f38335772fa4e28f98611ec69e3265265ca181bdd20778b8b8b8b8b8b6040516117169695949392919061575b565b600054610100900460ff1680613052575060005460ff16155b61306e5760405162461bcd60e51b8152600401610bfa9061534d565b600054610100900460ff16158015613090576000805461ffff19166101011790555b6000805462010000600160b01b03191633620100008102919091178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612f5a576000805461ff001916905550565b600054610100900460ff1680613107575060005460ff16155b6131235760405162461bcd60e51b8152600401610bfa9061534d565b600054610100900460ff16158015613145576000805461ffff19166101011790555b6001600160a01b0382166131895760405162461bcd60e51b815260206004820152600b60248201526a2fb1b7b7331032b93937b960a91b6044820152606401610bfa565b600180546001600160a01b0319166001600160a01b0384161790557f76cdbb1e26a0f9a66549279b0a47c72e049aba857a11dd27ebde32047ed6d16e6009556002600c558015610c48576000805461ff00191690555050565b6000806005846040516131f5919061542b565b908152604080516020928190038301902054600081815260049093529120909150816132545760405162461bcd60e51b815260206004820152600e60248201526d1d5cd95c881b9bdd08195e1a5cdd60921b6044820152606401610bfa565b600f84604051613264919061542b565b9081526040519081900360200190205460ff16156132b45760405162461bcd60e51b815260206004820152600d60248201526c37b93232b924b21032b93937b960991b6044820152606401610bfa565b6001600f856040516132c6919061542b565b908152604051908190036020019020805491151560ff1990921691909117905591505092915050565b600f826040516132ff919061542b565b9081526040519081900360200190205460ff1661332e5760405162461bcd60e51b8152600401610bfa90615b1c565b6000601183604051613340919061542b565b908152602001604051809103902090508181600601548260030154836000015461336a9190615405565b6133749190615405565b10156133c25760405162461bcd60e51b815260206004820152601a60248201527f646973747269627574654e6d74206f7574206f662072616e67650000000000006044820152606401610bfa565b818160060160008282546133d69190615418565b9091555050505050565b8442111561341f5760405162461bcd60e51b815260206004820152600c60248201526b1cda59db88195e1c1a5c995960a21b6044820152606401610bfa565b6000838261342e8260026159b8565b1461346d5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bfa565b60008881526014602052604090205460ff16156134bb5760405162461bcd60e51b815260206004820152600c60248201526b3234b3b2b9ba1032b93937b960a11b6044820152606401610bfa565b6000888152601460205260408120805460ff19166001179055816001600160401b038111156134ec576134ec614878565b604051908082528060200260200182016040528015613515578160200160208202803683370190505b50905060005b82811015613624576000806135c48c60405180606001604052808d8d888181106135475761354761583c565b905060200201602081019061355c9190615b45565b60ff1681526020018b8b6135718960026159b8565b8181106135805761358061583c565b9050602002013581526020018b8b88600261359b91906159b8565b6135a6906001615418565b8181106135b5576135b561583c565b90506020020135815250614515565b91509150808484815181106135db576135db61583c565b60200260200101906001600160a01b031690816001600160a01b031681525050811561360f578561360b816159f9565b9650505b5050808061361c906159f9565b91505061351b565b50600c5483101561366b5760405162461bcd60e51b81526020600482015260116024820152706c61636b206f66207369676e617475726560781b6044820152606401610bfa565b61367481614781565b6136b65760405162461bcd60e51b81526020600482015260136024820152726475706c6963617465207369676e617475726560681b6044820152606401610bfa565b505050505050505050565b600f826040516136d1919061542b565b9081526040519081900360200190205460ff166137005760405162461bcd60e51b8152600401610bfa90615b1c565b6000601183604051613712919061542b565b908152602001604051809103902090508181600701548260040154836002015484600101546137419190615418565b61374b9190615405565b6137559190615405565b10156137a35760405162461bcd60e51b815260206004820152601a60248201527f64697374726962757465557364206f7574206f662072616e67650000000000006044820152606401610bfa565b818160070160008282546133d69190615418565b60006137c1611766565b8c8c8c8c8c8c8c6040516020016137de9796959493929190615b68565b60405160208183030381529060405280519060200120604051602001613805929190615586565b60405160208183030381529060405280519060200120905061382b8187878787876133e0565b601354604051637164952960e11b81526001600160a01b038d81166004830152602482018c9052604482018a90529091169063e2c92a52906064016020604051808303816000875af1158015613885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a99190615bb5565b6138e55760405162461bcd60e51b815260206004820152600d60248201526c18db19585b995c8819995a5b19609a1b6044820152606401610bfa565b505050505050505050505050565b600080600583604051613906919061542b565b908152604080516020928190038301902054600081815260049093529120909150816139655760405162461bcd60e51b815260206004820152600e60248201526d1d5cd95c881b9bdd08195e1a5cdd60921b6044820152606401610bfa565b9392505050565b600f8260405161397c919061542b565b9081526040519081900360200190205460ff166139ab5760405162461bcd60e51b8152600401610bfa90615b1c565b60006016836040516139bd919061542b565b908152602001604051809103902090508181600401548260020154836001015484600001546139ec9190615418565b6139f69190615405565b613a009190615405565b1015613a4e5760405162461bcd60e51b815260206004820152601a60248201527f64697374726962757465436e79206f7574206f662072616e67650000000000006044820152606401610bfa565b818160040160008282546133d69190615418565b6000613a6c611766565b8a8a89600060200201358a600160200201358c8c600260200201358d600360200201358e600460200201358f600560200201358f604051602001613ab99a99989796959493929190615bd2565b60405160208183030381529060405280519060200120604051602001613ae0929190615586565b604051602081830303815290604052805190602001209050613b068187878787876133e0565b601354604051633524350160e01b81526001600160a01b038b8116600483015260208a013560248301528a8116604483015260608a0135606483015260a08a013560848301529091169063352435019060a4016020604051808303816000875af1158015613b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9c9190615bb5565b613bd85760405162461bcd60e51b815260206004820152600d60248201526c18db19585b995c8819995a5b19609a1b6044820152606401610bfa565b50505050505050505050565b6020850135421115613c295760405162461bcd60e51b815260206004820152600e60248201526d195e18d959591959081b1a5b5a5d60921b6044820152606401610bfa565b6001600160a01b0386166000908152600a60205260408120805485929182919082613c53836159f9565b90915550905083613c658460026159b8565b14613ca45760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bfa565b6000613cae611766565b604080516001600160a01b038d166020808301919091528c35828401528c810135606083015260808083018790528351808403909101815260a083019093528251920191909120613d02929160c001615586565b6040516020818303038152906040528051906020012090506000846001600160401b03811115613d3457613d34614878565b604051908082528060200260200182016040528015613d5d578160200160208202803683370190505b50905060005b85811015613e4357600080613de38560405180606001604052808f8f88818110613d8f57613d8f61583c565b9050602002016020810190613da49190615b45565b60ff1681526020018d8d613db98960026159b8565b818110613dc857613dc861583c565b9050602002013581526020018d8d88600261359b91906159b8565b9150915080848481518110613dfa57613dfa61583c565b60200260200101906001600160a01b031690816001600160a01b0316815250508115613e2e5786613e2a816159f9565b9750505b50508080613e3b906159f9565b915050613d63565b50600c54841015613e8c5760405162461bcd60e51b81526020600482015260136024820152721b195cdcc81d1a185b881d1a1c995cda1bdb19606a1b6044820152606401610bfa565b613e9581614781565b613ece5760405162461bcd60e51b815260206004820152600a6024820152696e6f7420756e6971756560b01b6044820152606401610bfa565b6001600160a01b038b166000818152600b602090815260408083208784529091528082208d3590819055905181156108fc0292818181858888f19350505050158015613f1e573d6000803e3d6000fd5b50604080518481528b3560208201526001600160a01b038d16917f7575c9e41ba6d91ef21e39bd62b5b9df62fc9b0401379fdf9fe1fa372f41e7c1910160405180910390a25050505050505050505050565b600080613f7c846138f3565b6005810154909150801561443c5780826004015410613ff457808260040154613fa59190615405565b600483018190556000600584018190558354604051600080516020615ca783398151915293613fe1938a93909290918791829085908d90615c39565b60405180910390a1600192505050612cf9565b60048201541561425a5760008260040154826140109190615405565b90506000856140298369d3c21bcecceda10000006159b8565b61403391906159d7565b84549091506000036140a357600484015461404e9084615405565b600585018190556004850154604051600080516020615ca783398151915292614084928b92600092839283928392908f90615c39565b60405180910390a1600084600401819055506001945050505050612cf9565b83546140b4826402540be4006159b8565b11614142576140c8816402540be4006159b8565b84546140d49190615405565b8455600060058501556140ec816402540be4006159b8565b601060008282546140fd9190615418565b90915550600080516020615ca7833981519152905087614122836402540be4006159b8565b8654600488015460405161408494939291906000908a9082908f90615c39565b8354600090614157906402540be400906159d7565b6141619083615405565b905069d3c21bcecceda100000061417888836159b8565b61418291906159d7565b60058601556141918183615405565b6141a0906402540be4006159b8565b85546141ac9190615405565b85556141b88183615405565b6141c7906402540be4006159b8565b601060008282546141d89190615418565b90915550600080516020615ca78339815191529050886141f88385615405565b614207906402540be4006159b8565b8754600489015460058a0154600090614220908b615405565b8b600501548e60405161423a989796959493929190615c39565b60405180910390a160008560040181905550600195505050505050612cf9565b600084836005015469d3c21bcecceda100000061427791906159b8565b61428191906159d7565b8354909150614295826402540be4006159b8565b11614332576142a9816402540be4006159b8565b83546142b59190615405565b83556142c6816402540be4006159b8565b601060008282546142d79190615418565b90915550600080516020615ca78339815191529050866142fc836402540be4006159b8565b8554604051614318939291906000908190899082908e90615c39565b60405180910390a150506000600590910155506001612cf9565b8254600090614347906402540be400906159d7565b6143519083615405565b905069d3c21bcecceda100000061436887836159b8565b61437291906159d7565b60058501556143818183615405565b614390906402540be4006159b8565b845461439c9190615405565b84556143a88183615405565b6143b7906402540be4006159b8565b601060008282546143c89190615418565b90915550600080516020615ca78339815191529050876143e88385615405565b6143f7906402540be4006159b8565b86546005880154600090819061440d908a615405565b8a600501548d604051614427989796959493929190615c39565b60405180910390a16001945050505050612cf9565b506001949350505050565b6001600160a01b0381166144ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bfa565b600080546040516001600160a01b03808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0836040015160001c11156145835760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964202773272076616c756560781b6044820152606401610bfa565b826000015160ff16601b14806145a05750826000015160ff16601c145b6145e05760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964202776272076616c756560781b6044820152606401610bfa565b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818660405160200161462f929190615c84565b604051602081830303815290604052805190602001209050600060018287600001518860200151896040015160405160008152602001604052604051614691949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156146b3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147025760405162461bcd60e51b815260206004820152600960248201526830206164647265737360b81b6044820152606401610bfa565b600154604051639916328d60e01b81526001600160a01b0383811660048301526000921690639916328d90602401602060405180830381865afa15801561474d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147719190615bb5565b95509093505050505b9250929050565b6000805b600183516147939190615405565b81101561482d5760006147a7826001615418565b90505b835181101561481a578381815181106147c5576147c561583c565b60200260200101516001600160a01b03168483815181106147e8576147e861583c565b60200260200101516001600160a01b031603614808575060009392505050565b80614812816159f9565b9150506147aa565b5080614825816159f9565b915050614785565b50600192915050565b6001600160a01b0381168114612f5a57600080fd5b803561485681614836565b919050565b60006020828403121561486d57600080fd5b813561396581614836565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261489f57600080fd5b81356001600160401b03808211156148b9576148b9614878565b604051601f8301601f19908116603f011681019082821181831017156148e1576148e1614878565b816040528381528660208588010111156148fa57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561493257600080fd5b85356001600160401b038082111561494957600080fd5b61495589838a0161488e565b9650602088013591508082111561496b57600080fd5b61497789838a0161488e565b95506040880135945060608801359350608088013591508082111561499b57600080fd5b506149a88882890161488e565b9150509295509295909350565b60008060008060008060c087890312156149ce57600080fd5b86356001600160401b03808211156149e557600080fd5b6149f18a838b0161488e565b97506020890135915080821115614a0757600080fd5b614a138a838b0161488e565b965060408901359550606089013594506080890135935060a0890135915080821115614a3e57600080fd5b50614a4b89828a0161488e565b9150509295509295509295565b60008083601f840112614a6a57600080fd5b5081356001600160401b03811115614a8157600080fd5b6020830191508360208260051b850101111561477a57600080fd5b600080600080600080600080600060e08a8c031215614aba57600080fd5b89356001600160401b0380821115614ad157600080fd5b614add8d838e0161488e565b9a5060208c01359150614aef82614836565b90985060408b0135975060608b0135965060808b0135955060a08b01359080821115614b1a57600080fd5b614b268d838e01614a58565b909650945060c08c0135915080821115614b3f57600080fd5b50614b4c8c828d01614a58565b915080935050809150509295985092959850929598565b600060208284031215614b7557600080fd5b5035919050565b60008060008060008060008060008060006101208c8e031215614b9e57600080fd5b6001600160401b03808d351115614bb457600080fd5b614bc18e8e358f0161488e565b9b50614bcf60208e0161484b565b9a5060408d01359950614be460608e0161484b565b985060808d0135975060a08d0135965060c08d013595508060e08e01351115614c0c57600080fd5b614c1c8e60e08f01358f01614a58565b90955093506101008d0135811015614c3357600080fd5b50614c458d6101008e01358e01614a58565b81935080925050509295989b509295989b9093969950565b60005b83811015614c78578181015183820152602001614c60565b50506000910152565b60008151808452614c99816020860160208601614c5d565b601f01601f19169290920160200192915050565b8781528660208201528560408201528460608201528360808201528260a082015260e060c08201526000614ce460e0830184614c81565b9998505050505050505050565b60008060008060008060008060008060006101208c8e031215614d1357600080fd5b6001600160401b03808d351115614d2957600080fd5b614d368e8e358f0161488e565b9b50614d4460208e0161484b565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d013595508060e08e01351115614c0c57600080fd5b600060208284031215614d8c57600080fd5b81356001600160401b03811115614da257600080fd5b614dae8482850161488e565b949350505050565b60008060408385031215614dc957600080fd5b8235614dd481614836565b946020939093013593505050565b600080600080600060a08688031215614dfa57600080fd5b85356001600160401b0380821115614e1157600080fd5b614e1d89838a0161488e565b96506020880135915080821115614e3357600080fd5b614e3f89838a0161488e565b95506040880135915080821115614e5557600080fd5b50614e628882890161488e565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215614e9457600080fd5b86356001600160401b0380821115614eab57600080fd5b614eb78a838b0161488e565b97506020890135915080821115614ecd57600080fd5b614ed98a838b0161488e565b96506040890135915080821115614eef57600080fd5b50614efc89828a0161488e565b945050606087013592506080870135915060a087013590509295509295509295565b600080600060608486031215614f3357600080fd5b83356001600160401b03811115614f4957600080fd5b614f558682870161488e565b9660208601359650604090950135949350505050565b8060c08101831015612cf957600080fd5b60008060008060008060008060006101808a8c031215614f9b57600080fd5b89356001600160401b0380821115614fb257600080fd5b614fbe8d838e0161488e565b9a5060208c01359150614fd082614836565b90985060408b013590614fe282614836565b819850614ff28d60608e01614f6b565b97506101208c013596506101408c013591508082111561501157600080fd5b61501d8d838e01614a58565b90965094506101608c0135915080821115614b3f57600080fd5b8015158114612f5a57600080fd5b6000806040838503121561505857600080fd5b823561506381614836565b9150602083013561507381615037565b809150509250929050565b6000806040838503121561509157600080fd5b82356001600160401b038111156150a757600080fd5b6150b38582860161488e565b925050602083013561507381614836565b60006101008a83528960208401528060408401526150e48184018a614c81565b6001600160a01b039890981660608401525050608081019490945260a084019290925260c083015260e0909101529392505050565b60008060008060008060a0878903121561513257600080fd5b863561513d81614836565b9550606087018881111561515057600080fd5b602088019550356001600160401b038082111561516c57600080fd5b6151788a838b01614a58565b9096509450608089013591508082111561519157600080fd5b5061519e89828a01614a58565b979a9699509497509295939492505050565b600080600080608085870312156151c657600080fd5b84356001600160401b03808211156151dd57600080fd5b6151e98883890161488e565b955060208701359150808211156151ff57600080fd5b5061520c8782880161488e565b93505060408501359150606085013561522481615037565b939692955090935050565b600080600080600060a0868803121561524757600080fd5b85356001600160401b038082111561525e57600080fd5b61526a89838a0161488e565b9650602088013591508082111561528057600080fd5b5061528d8882890161488e565b9450506040860135925060608601356152a581615037565b949793965091946080013592915050565b600080600080608085870312156152cc57600080fd5b84356001600160401b038111156152e257600080fd5b6152ee8782880161488e565b97602087013597506040870135966060013595509350505050565b6000806040838503121561531c57600080fd5b82356001600160401b0381111561533257600080fd5b61533e8582860161488e565b95602094909401359450505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156153ad57600080fd5b815161396581614836565b60208082526019908201527f6e6f742065786563446564756374696f6e4578656375746f7200000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115612cf957612cf96153ef565b80820180821115612cf957612cf96153ef565b6000825161543d818460208701614c5d565b9190910192915050565b60e08152600061545a60e083018a614c81565b828103602084015261546c818a614c81565b905082810360408401526154808189614c81565b9150508560608301528460808301528360a08301528260c083015298975050505050505050565b60006101208083526154bb8184018d614c81565b905082810360208401526154cf818c614c81565b905082810360408401526154e3818b614c81565b60608401999099525050608081019590955260a085019390935260c084019190915260e0830152610100909101529392505050565b60208082526014908201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b604082015260600190565b60a08152600061555960a0830188614c81565b6001600160a01b039690961660208301525060408101939093526060830191909152608090910152919050565b61190160f01b81526002810192909252602282015260420190565b6080815260006155b46080830187614c81565b6001600160a01b03959095166020830152506040810192909252606090910152919050565b600181811c908216806155ed57607f821691505b60208210810361560d57634e487b7160e01b600052602260045260246000fd5b50919050565b60008154615620816155d9565b80855260206001838116801561563d576001811461565757615685565b60ff1985168884015283151560051b880183019550615685565b866000528260002060005b8581101561567d5781548a8201860152908301908401615662565b890184019650505b505050505092915050565b6001600160a01b03851681526080602082018190526000906156b490830186615613565b6040830194909452506060015292915050565b60e0815260006156da60e083018a614c81565b6001600160a01b039889166020840152604083019790975250939095166060840152608083019190915260a082015260c00191909152919050565b60c08152600061572860c0830189614c81565b6001600160a01b039788166020840152604083019690965250929094166060830152608082015260a00191909152919050565b60c08152600061576e60c0830189614c81565b6001600160a01b039790971660208301525060408101949094526060840192909252608083015260a090910152919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6080815260006157e86080830187615613565b60208301959095525060408101929092526001600160a01b0316606090910152919050565b6080815260006158206080830187614c81565b6020830195909552506040810192909252606090910152919050565b634e487b7160e01b600052603260045260246000fd5b600061012080835261586681840188614c81565b6001600160a01b03878116602086015286166040850152915060c0905083606084013795945050505050565b60208082526019908201527f6e6f74206163636f756e744d616e6167654578656375746f7200000000000000604082015260600190565b6040815260006158dc6040830185614c81565b905060018060a01b03831660208301529392505050565b6020808252601690820152753737ba1030b1b1b7bab73a2ab9b222bc32b1baba37b960511b604082015260600190565b60a08152600061593660a0830188614c81565b82810360208401526159488188614c81565b604084019690965250506060810192909252151560809091015292915050565b60a08152600061597b60a0830188614c81565b90508560208301528460408301528360608301528260808301529695505050505050565b6000602082840312156159b157600080fd5b5051919050565b60008160001904831182151516156159d2576159d26153ef565b500290565b6000826159f457634e487b7160e01b600052601260045260246000fd5b500490565b600060018201615a0b57615a0b6153ef565b5060010190565b601f821115615a5857600081815260208120601f850160051c81016020861015615a395750805b601f850160051c820191505b8181101561274257828155600101615a45565b505050565b81516001600160401b03811115615a7657615a76614878565b615a8a81615a8484546155d9565b84615a12565b602080601f831160018114615abf5760008415615aa75750858301515b600019600386901b1c1916600185901b178555612742565b600085815260208120601f198616915b82811015615aee57888601518255948401946001909101908401615acf565b5085821015615b0c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252600f908201526e3830bcb6b2b73a24b21032b93937b960891b604082015260600190565b600060208284031215615b5757600080fd5b813560ff8116811461396557600080fd5b60e081526000615b7b60e083018a614c81565b6001600160a01b039890981660208301525060408101959095526060850193909352608084019190915260a083015260c090910152919050565b600060208284031215615bc757600080fd5b815161396581615037565b6000610140808352615be68184018e614c81565b6001600160a01b039c8d166020850152604084019b909b525050606081019790975294909716608086015260a085019290925260c084015260e08301526101008201939093526101200191909152919050565b6000610100808352615c4d8184018c614c81565b602084019a909a52505060408101969096526060860194909452608085019290925260a084015260c083015260e090910152919050565b60008351615c96818460208801614c5d565b919091019182525060200191905056fe88153c5c94cfa3019231252a884806d142eb3539a58a8f3d01e66d55820525c3a26469706673582212209df275efdee6b052ee5c99e167edd2da587ac4983a9c75e1f1eccd65a24d4d2564736f6c63430008100033