descent-js
Version:
A Typescript library for interacting with the Descent Protocol
1,078 lines • 1.05 MB
JSON
{
"abi": [
{
"inputs": [
{
"internalType": "contract Currency",
"name": "_currencyToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_baseRate",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AccessControlBadConfirmation",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "neededRole",
"type": "bytes32"
}
],
"name": "AccessControlUnauthorizedAccount",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "AddressInsufficientBalance",
"type": "error"
},
{
"inputs": [],
"name": "BadCollateralRatio",
"type": "error"
},
{
"inputs": [],
"name": "CollateralAlreadyExists",
"type": "error"
},
{
"inputs": [],
"name": "CollateralDoesNotExist",
"type": "error"
},
{
"inputs": [],
"name": "CollateralRatioNotImproved",
"type": "error"
},
{
"inputs": [],
"name": "EthTransferFailed",
"type": "error"
},
{
"inputs": [],
"name": "FailedInnerCall",
"type": "error"
},
{
"inputs": [],
"name": "NotEnoughCollateralToPay",
"type": "error"
},
{
"inputs": [],
"name": "NotOwnerOrReliedUpon",
"type": "error"
},
{
"inputs": [],
"name": "NotPaused",
"type": "error"
},
{
"inputs": [],
"name": "Paused",
"type": "error"
},
{
"inputs": [],
"name": "PositionIsSafe",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "SafeERC20FailedOperation",
"type": "error"
},
{
"inputs": [],
"name": "TotalUserCollateralBelowFloor",
"type": "error"
},
{
"inputs": [],
"name": "UnrecognizedParam",
"type": "error"
},
{
"inputs": [],
"name": "ZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "ZeroCollateral",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "CollateralDeposited",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "collateralAddress",
"type": "address"
}
],
"name": "CollateralTypeAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "CollateralWithdrawn",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "CurrencyBurned",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "CurrencyMinted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "FeesPaid",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "liquidator",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "currencyAmountPaid",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "collateralAmountCovered",
"type": "uint256"
}
],
"name": "Liquidated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"inputs": [],
"name": "CURRENCY_TOKEN",
"outputs": [
{
"internalType": "contract Currency",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "accruedFees",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "baseRateInfo",
"outputs": [
{
"internalType": "uint256",
"name": "rate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "accumulatedRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTime",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "burnCurrency",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "",
"type": "address"
}
],
"name": "collateralMapping",
"outputs": [
{
"internalType": "uint256",
"name": "totalDepositedCollateral",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrowedAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "liquidationThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "liquidationBonus",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "rate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "accumulatedRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTime",
"type": "uint256"
}
],
"internalType": "struct IVault.RateInfo",
"name": "rateInfo",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "paidFees",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "debtCeiling",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "collateralFloorPerPosition",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "additionalCollateralPrecision",
"type": "uint256"
},
{
"internalType": "bool",
"name": "exists",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_rate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_liquidationThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_liquidationBonus",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_debtCeiling",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_collateralFloorPerPosition",
"type": "uint256"
}
],
"name": "createCollateralType",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "debt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_reliedUpon",
"type": "address"
}
],
"name": "deny",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "depositCollateral",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256",
"name": "_currencyAmountToPay",
"type": "uint256"
}
],
"name": "liquidate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "mintCurrency",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paidFees",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_tokenAddress",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
}
],
"name": "recoverToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_relyUpon",
"type": "address"
}
],
"name": "rely",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "relyMapping",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "callerConfirmation",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "status",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_baseRate",
"type": "uint256"
}
],
"name": "updateBaseRate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "enum IVault.ModifiableParameters",
"name": "_param",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "_data",
"type": "uint256"
}
],
"name": "updateCollateralData",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_rate",
"type": "uint256"
}
],
"name": "updateCollateralRate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_feedContract",
"type": "address"
}
],
"name": "updateFeedContract",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_collateralAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "_price",
"type": "uint256"
}
],
"name": "updatePrice",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_stabilityModule",
"type": "address"
}
],
"name": "updateStabilityModule",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "vaultMapping",
"outputs": [
{
"internalType": "uint256",
"name": "depositedCollateral",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowedAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "accruedFees",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastTotalAccumulatedRate",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawCollateral",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_collateralToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "withdrawFees",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": {
"object": "0x60a06040523480156200001157600080fd5b506040516200352f3803806200352f833981016040819052620000349162000111565b60026001556200004660003362000062565b506001600160a01b03909116608052426004556002556200014d565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000107576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620000be3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200010b565b5060005b92915050565b600080604083850312156200012557600080fd5b82516001600160a01b03811681146200013d57600080fd5b6020939093015192949293505050565b6080516133956200019a6000396000818161060a015281816118d401528181611c6c01528181611d03015281816122b30152818161241c015281816125640152612b7201526133956000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c8063645ba4251161012a578063ad3b1b47116100bd578063da3b77031161008c578063e72531c811610071578063e72531c814610605578063f970c3b714610651578063feaea5861461066457600080fd5b8063da3b770314610592578063e2c7283f146105a557600080fd5b8063ad3b1b4714610462578063b80a0a7714610475578063c665471f1461047e578063d547741f1461057f57600080fd5b806391d14854116100f957806391d14854146103f05780639c52a7f114610434578063a217fddf14610447578063aab3f8681461044f57600080fd5b8063645ba425146103b957806365fae35e146103cc578063682c2058146103df5780638456cb59146103e857600080fd5b806336568abe116101bd57806349a66ca31161018c57806357b35a781161017157806357b35a78146103655780635820ba63146103785780635881fc331461038b57600080fd5b806349a66ca31461033f5780634fa739191461035257600080fd5b806336568abe146102fe5780633f4ba83a146103115780634522fa8514610319578063457972de1461032c57600080fd5b8063200d2ed2116101f9578063200d2ed2146102ac578063248a9ca3146102b55780632f2ff15d146102d8578063330283aa146102eb57600080fd5b806301ffc9a71461022b5780630408ccd6146102535780630dca59c11461026857806313f60c9a1461027f575b600080fd5b61023e610239366004612ed0565b610677565b60405190151581526020015b60405180910390f35b610266610261366004612f34565b610710565b005b61027160055481565b60405190815260200161024a565b60025460035460045461029192919083565b6040805193845260208401929092529082015260600161024a565b61027160015481565b6102716102c3366004612f51565b60009081526020819052604090206001015490565b6102666102e6366004612f6a565b610785565b6102666102f9366004612f51565b6107b0565b61026661030c366004612f6a565b610831565b61026661088a565b610266610327366004612f34565b6108d9565b61026661033a366004612f9a565b610949565b61026661034d366004612fc6565b610a41565b610266610360366004613017565b610c85565b610266610373366004613058565b610e12565b610266610386366004612fc6565b610fae565b61023e61039936600461308c565b600a60209081526000928352604080842090915290825290205460ff1681565b6102666103c73660046130ba565b611184565b6102666103da366004612f34565b611378565b61027160065481565b61026661140f565b61023e6103fe366004612f6a565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610266610442366004612f34565b61145c565b610271600081565b61026661045d366004612fc6565b6114f0565b610266610470366004612f9a565b611780565b61027160075481565b61050c61048c366004612f34565b60086020818152600092835260409283902080546001820154600283015460038401548751606081018952600486015481526005860154968101969096526006850154978601979097526007840154958401546009850154600a860154600b870154600c9097015495999498939794969495939492939192909160ff168b565b604080519b8c526020808d019b909b528b81019990995260608b0197909752855160808b01529785015160a08a0152939095015160c088015260e087019190915261010086015261012085019290925261014084019190915261016083019190915215156101808201526101a00161024a565b61026661058d366004612f6a565b61195e565b6102666105a0366004612f9a565b611983565b6105e56105b336600461308c565b600960209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161024a565b61062c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024a565b61026661065f366004613017565b611a9b565b61026661067236600461308c565b611c24565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061070a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600180540361074b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061075681611f83565b6107807fa05d8775623c9cb9a7c26c4d686f58ed0f717cdbd1543265197fc098bd63969683611f90565b505050565b6000828152602081905260409020600101546107a081611f83565b6107aa8383611f90565b50505050565b60018054036107eb576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107f681611f83565b6002546004546108069042613135565b6108109190613148565b6003805460009061082290849061315f565b90915550504260045550600255565b73ffffffffffffffffffffffffffffffffffffffff81163314610880576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610780828261208c565b6002600154036108c6576040517f6cd6020100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108d181611f83565b506002600155565b6001805403610914576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061091f81611f83565b6107807fd30e44b6367b3271655a8fdafcfc17a83191efab29a626ed0c76e1f42d65e33283611f90565b6001805403610984576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd30e44b6367b3271655a8fdafcfc17a83191efab29a626ed0c76e1f42d65e3326109ae81611f83565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020600c0154839060ff16610a12576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505073ffffffffffffffffffffffffffffffffffffffff90911660009081526008602081905260409091200155565b6001805403610a7c576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260409020600c0154849060ff16610ae0576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff81163314801590610b38575073ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832033845290915290205460ff16155b15610b6f576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600960209081526040808320948a16835293815283822092825260089052919091208154600a8201541115610bed576040517f8464610300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600182015415610c0657610c018183612147565b610c15565b610c0f816121a7565b60038301555b8673ffffffffffffffffffffffffffffffffffffffff167f2794e993350ecd3e426a1d6ba9554613ee597988342e95658e5e97a12156585286604051610c5d91815260200190565b60405180910390a2610c718183888861221a565b610c7b81836122e2565b5050505050505050565b6001805403610cc0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020600c0154839060ff16610d24576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff81163314801590610d7c575073ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832033845290915290205460ff16155b15610db3576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808616600081815260096020908152604080832094891683529381528382209282526008905291909120610dfc8183612147565b610e09818388898961232d565b50505050505050565b6001805403610e4d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e5881611f83565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260409020600c0154849060ff16610ebc576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812090856003811115610ef457610ef4613172565b03610f055760098101849055610fa6565b6001856003811115610f1957610f19613172565b03610f2a57600a8101849055610fa6565b6002856003811115610f3e57610f3e613172565b03610f4f5760038101849055610fa6565b6003856003811115610f6357610f63613172565b03610f745760028101849055610fa6565b6040517f9d2ff48000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6001805403610fe9576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260409020600c0154849060ff1661104d576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff811633148015906110a5575073ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832033845290915290205460ff16155b156110dc576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600960209081526040808320948a16835293815283822092825260089052919091206111258183612147565b6040805173ffffffffffffffffffffffffffffffffffffffff8881168252602082018890528916917f45892a46e6cef329bb642da6d69846d324db43d19008edc141ed82382eda1bee910160405180910390a2610c71888888886125e8565b60018054036111bf576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111ca81611f83565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600860205260409020600c81015460ff161561122e576040517fbf508dc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004808201889055426006830155600282018790556003820186905560098201859055600a8201849055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff8b169263313ce567928082019260209290918290030181865afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e591906131a1565b6112f39060ff166012613135565b600b820155600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405173ffffffffffffffffffffffffffffffffffffffff891681527f8abd6b05a86c62b0ddaec80e50ab0326ee89a599589d4b4126cf8f94ff3d0a879060200160405180910390a15050505050505050565b60018054036113b3576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600180540361144a576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061145581611f83565b5060018055565b6001805403611497576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600180540361152b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260409020600c0154849060ff1661158f576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8086166000818152600960209081526040808320948916835293815283822092825260089052919091206115d88183612147565b60006115e48284612677565b905081600201548111611623576040517f819a066c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8503611661578260020154836001015461165e919061315f565b94505b600061166d83876126e3565b9050600061167d6012600a6132e4565b611688906001613148565b60038501546116979084613148565b6116a191906132f0565b905060006116af828461315f565b86549091508111156116bf575084545b60408051338152602081018a905290810182905273ffffffffffffffffffffffffffffffffffffffff8b16907f1f0c6615429d1cdae0dfa233abf91d3b31cdbdd82c8081389832a61e1072f1ea9060600160405180910390a26117248b8b8b846125e8565b61173185878c338c61232d565b61173b8587612677565b8411611773576040517f07af690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b60018054036117bb576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa05d8775623c9cb9a7c26c4d686f58ed0f717cdbd1543265197fc098bd6396966117e581611f83565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020600c0154839060ff16611849576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081206007018054859290611881908490613135565b92505081905550826007600082825461189a9190613135565b90915550506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044015b6020604051808303816000875af1158015611933573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611957919061332b565b5050505050565b60008281526020819052604090206001015461197981611f83565b6107aa838361208c565b60018054036119be576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119c981611f83565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020600c0154839060ff16611a2d576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040902060048101546006820154611a669042613135565b611a709190613148565b600582018054600090611a8490849061315f565b909155505042600682015560040192909255505050565b6001805403611ad6576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020600c0154839060ff16611b3a576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff81163314801590611b92575073ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832033845290915290205460ff16155b15611bc9576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fd7243f6f8212d5188fd054141cf6ea89cfc0d91facb8c3afe2f88a135848014284604051611c1191815260200190565b60405180910390a261195785858561273b565b6001805403611c5f576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c6a81611f83565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e17576007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9185919084906370a0823190602401602060405180830381865afa158015611d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d79919061334d565b611d839190613135565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015611df3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa919061332b565b73ffffffffffffffffffffffffffffffffffffffff8316611ecc5760008273ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611e8c576040519150601f19603f3d011682016040523d82523d6000602084013e611e91565b606091505b50509050806107aa576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600081815260086020526040908190205490517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015285926107aa9284928792906370a0823190602401602060405180830381865afa158015611f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f74919061334d565b611f7e9190613135565b612906565b611f8d8133612987565b50565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff166120845760008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556120223390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161070a565b50600061070a565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16156120845760008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161070a565b6000806121548484612a12565b915091508083600301819055508160000361216f5750505050565b81836002016000828254612183919061315f565b92505081905550816006600082825461219c919061315f565b909155505050505050565b600681015460009081906121bb9042613135565b60048401546121ca9190613148565b60058401546121d9919061315f565b6004549091506000906121ec9042613135565b6002546121f99190613148565b600354612206919061315f565b9050612212818361315f565b949350505050565b8083600101600082825461222e919061315f565b9250508190555080846001016000828254612249919061315f565b925050819055508060056000828254612262919061315f565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401611914565b81600201546122f18383612677565b1115612329576040517f963c7ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b8360010154811161248f578084600101600082825461234c9190613135565b92505081905550808560010160008282546123679190613135565b9250508190555080600560008282546123809190613135565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8416907fcb55e9f35638c4fdb4390d3a385ac1d72a8f72e4dcf0eb1f3c79d144b1023f859060200160405180910390a26040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac906044016020604051808303816000875af1158015612465573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612489919061332b565b50611957565b6001808501805460009182905591870180548392906124af908490613135565b9250508190555080600560008282546124c89190613135565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8516907fcb55e9f35638c4fdb4390d3a385ac1d72a8f72e4dcf0eb1f3c79d144b1023f859060200160405180910390a26040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac906044016020604051808303816000875af11580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d1919061332b565b50610fa6868686866125e38688613135565b612a6f565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526009602090815260408083209387168352929052908120805483929061262c908490613135565b909155505073ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081208054839290612666908490613135565b909155506107aa9050848383612906565b6000808260020154836001015461268e919061315f565b9050806000036126a257600091505061070a565b60006126ae8585612bdf565b90506126da6126bf6012600a6132e4565b6126ca906001613148565b6126d49084613148565b82612c30565b95945050505050565b6000806127246126f56012600a6132e4565b612700906001613148565b61270a9085613148565b64e8d4a51000866008015461271f9190613148565b612c30565b90506122128185600b0154600a61271f91906132e4565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa1580156127a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cc919061334d565b90506127da84843085612c77565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090829073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa158015612849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286d919061334d565b6128779190613135565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526009602090815260408083209389168352929052908120805492935083929091906128c090849061315f565b909155505073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812080548392906128fa90849061315f565b90915550505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261078091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612cbd565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16612329576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044015b60405180910390fd5b6000806000612a20856121a7565b90506000612a306012600a6132e4565b612a3b906001613148565b60018601546003870154612a4f9085613135565b612a599190613148565b612a6391906132f0565b96919550909350505050565b80846002016000828254612a839190613135565b925050819055508060066000828254612a9c9190613135565b9250508190555080856007016000828254612ab7919061315f565b925050819055508060076000828254612ad0919061315f565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8416907f6a41f86b2a18fe00e10a9bd078e790ae82c2627a6f940166bddc2db475194a5f9060200160405180910390a26040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af1158015612bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa6919061332b565b600080612bee6012600a6132e4565b612bf9906001613148565b64e8d4a510008560080154612c12878760000154612d53565b612c1c9190613148565b612c269190613148565b61221291906132f0565b600081600003612c3f57600080fd5b82600003612c4f5750600061070a565b81612c5b600185613135565b612c6591906132f0565b612c7090600161315f565b9392505050565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526107aa9186918216906323b872dd90608401612940565b6000612cdf73ffffffffffffffffffffffffffffffffffffffff841683612d70565b90508051600014158015612d04575080806020019051810190612d02919061332b565b155b15610780576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401612a09565b600082600b0154600a612d6691906132e4565b612c709083613148565b6060612c7083836000846000808573ffffffffffffffffffffffffffffffffffffffff168486604051612da39190613366565b60006040518083038185875af1925050503d8060008114612de0576040519150601f19603f3d011682016040523d82523d6000602084013e612de5565b606091505b5091509150612df5868383612dff565b9695505050505050565b606082612e1457612e0f82612e8e565b612c70565b8151158015612e38575073ffffffffffffffffffffffffffffffffffffffff84163b155b15612e87576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401612a09565b5080612c70565b805115612e9e5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060208284031215612ee257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612c7057600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611f8d57600080fd5b600060208284031215612f4657600080fd5b8135612c7081612f12565b600060208284031215612f6357600080fd5b5035919050565b60008060408385031215612f7d57600080fd5b823591506020830135612f8f81612f12565b809150509250929050565b60008060408385031215612fad57600080fd5b8235612fb881612f12565b946020939093013593505050565b60008060008060808587031215612fdc57600080fd5b8435612fe781612f12565b93506020850135612ff781612f12565b9250604085013561300781612f12565b9396929550929360600135925050565b60008060006060848603121561302c57600080fd5b833561303781612f12565b9250602084013561304781612f12565b929592945050506040919091013590565b60008060006060848603121561306d57600080fd5b833561307881612f12565b925060208401356004811061304757600080fd5b6000806040838503121561309f57600080fd5b82356130aa81612f12565b91506020830135612f8f81612f12565b60008060008060008060c087890312156130d357600080fd5b86356130de81612f12565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561070a5761070a613106565b808202811582820484141761070a5761070a613106565b8082018082111561070a5761070a613106565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000602082840312156131b357600080fd5b815160ff81168114612c7057600080fd5b600181815b8085111561321d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561320357613203613106565b8085161561321057918102915b93841c93908002906131c9565b509250929050565b6000826132345750600161070a565b816132415750600061070a565b816001811461325757600281146132615761327d565b600191505061070a565b60ff84111561327257613272613106565b50506001821b61070a565b5060208310610133831016604e8410600b84101617156132a0575081810a61070a565b6132aa83836131c4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156132dc576132dc613106565b029392505050565b6000612c708