774.1k txs
770.7k calls
constructor
constructor(address _pair, address _tokenA, address _tokenB, string _receiptName, string _receiptSymbol)
functions
accountPortfolio
viewfunction accountPortfolio(address user) view returns (uint256 receiptBal, uint256 lpBal, uint256 receiptAllowance, uint256 lpAllowance, uint256 maxWithdrawable, uint256 canReceiveNow)
allowancesReport
viewfunction allowancesReport(address user, address spender) view returns (uint256 receiptAllowance, uint256 lpAllowance)
analyzeReceiptHoldersSimple
viewfunction analyzeReceiptHoldersSimple(address[] users) view returns (address[] userAddrs, uint256[] receiptBals, uint256[] lpBals, bool[] hasReceipt, uint256 activeUsers, uint256 totalReceiptHeld)
assetsByReceipts
viewfunction assetsByReceipts(uint256 receiptAmount) view returns (uint256)
backingDelta
viewfunction backingDelta() view returns (int256 delta)
batchAccountPortfolio
viewfunction batchAccountPortfolio(address[] users) view returns (uint256[] receiptBals, uint256[] lpBals, uint256[] receiptAllowances, uint256[] lpAllowances, uint256[] maxWithdrawables)
batchRoleMembership
viewfunction batchRoleMembership(address[] accounts) view returns (bool[] admins, bool[] pausers, bool[] releasers, bool[] caps, bool[] skimmers)
bufferedReceipts
viewfunction bufferedReceipts() view returns (uint256)
CAP_ROLE
viewfunction CAP_ROLE() view returns (bytes32)
checkSolvencyInvariant
viewfunction checkSolvencyInvariant(uint256 safetyMarginBps) view returns (bool ok, uint256 assets, uint256 supply)
computeBackingRatios
viewfunction computeBackingRatios() view returns (uint256 ratio1e9, uint256 ratio1e18, uint256 ratio1e27)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
depositCap
viewfunction depositCap() view returns (uint256)
encodeCalldataRelease
purefunction encodeCalldataRelease(address to, uint256 amount) pure returns (bytes data)
encodeCalldataReleaseBatch
purefunction encodeCalldataReleaseBatch(address[] to, uint256[] amounts) pure returns (bytes data)
encodeCalldataWithdraw
purefunction encodeCalldataWithdraw(uint256 amount, address to) pure returns (bytes data)
excessLP
viewfunction excessLP() view returns (uint256)
getBackingRatio
viewfunction getBackingRatio() view returns (uint256)
getCurrentStakeLimit
viewfunction getCurrentStakeLimit() view returns (bool isStakingPaused, uint256 currentStakeLimit, bool isFinal)
getDetailedAccounting
viewfunction getDetailedAccounting() view returns (uint256 assets, uint256 supply, uint256 escrow, uint256 excess, bool canSkim, uint256 cap, uint256 minP, bool capWouldBindNext)
getFiveTuple
viewfunction getFiveTuple() view returns (uint256 assets, uint256 supply, uint256 escrow, uint256 cap, uint256 minP)
getLimits
viewfunction getLimits() view returns (uint256 cap, uint256 used, uint256 headroom, uint256 minP)
getPauseAndSafetyDigest
viewfunction getPauseAndSafetyDigest() view returns (bool pausedNow, uint256 assets, uint256 supply, uint256 escrow, uint256 skimmable)
getPoolOverview
viewfunction getPoolOverview() view returns (address _pair, address _tokenA, address _tokenB, address _lpToken, address _receipt, uint256 assets, uint256 supply, uint256 escrowReceipts, uint256 backingRatio1e18, bool pausedNow)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getTotalPooledLP
viewfunction getTotalPooledLP() view returns (uint256)
getTotalReceipts
viewfunction getTotalReceipts() view returns (uint256)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
healthCheckMinBacking
viewfunction healthCheckMinBacking(uint256 minRatio1e18) view returns (bool healthy, uint256 ratio)
isSolvent
viewfunction isSolvent() view returns (bool)
lpToken
viewfunction lpToken() view returns (address)
lpTokenMetadata
viewfunction lpTokenMetadata() view returns (string name_, string symbol_, uint8 decimals_)
MAX_BATCH
viewfunction MAX_BATCH() view returns (uint256)
maxSkimmableLPAudit
viewfunction maxSkimmableLPAudit(uint256 hypotheticalWithdraw) view returns (uint256 nowSkim, uint256 postSkim)
minPledge
viewfunction minPledge() view returns (uint256)
pair
viewfunction pair() view returns (address)
paused
viewfunction paused() view returns (bool)
PAUSER_ROLE
viewfunction PAUSER_ROLE() view returns (bytes32)
previewPledgeDetailed
viewfunction previewPledgeDetailed(uint256 lpIn) view returns (bool ok, uint256 newAssets, uint256 newSupply, uint256 newEscrow, uint256 cap)
previewReleaseDetailed
viewfunction previewReleaseDetailed(uint256 receiptsOut) view returns (bool ok, uint256 newEscrow, uint256 supply, uint256 assets)
previewWithdrawDetailed
viewfunction previewWithdrawDetailed(address user, uint256 receiptsBurn) view returns (bool canWithdraw, uint256 newAssets, uint256 newSupply, uint256 backingRatio1e18)
receipt
viewfunction receipt() view returns (address)
receiptRate1e18
viewfunction receiptRate1e18() view returns (uint256)
receiptsByAssets
viewfunction receiptsByAssets(uint256 assetsAmount) view returns (uint256)
receiptTokenMetadata
viewfunction receiptTokenMetadata() view returns (string name_, string symbol_, uint8 decimals_, uint256 totalSupply_)
RELEASER_ROLE
viewfunction RELEASER_ROLE() view returns (bytes32)
releaseShortfall
viewfunction releaseShortfall(uint256 desired) view returns (bool ok, uint256 shortfall, uint256 available)
roleMembership
viewfunction roleMembership(address account) view returns (bool isAdmin, bool isPauser, bool isReleaser, bool isCap, bool isSkimmer)
simulateSequenceDetailed
viewfunction simulateSequenceDetailed(uint8[] ops, uint256[] amounts) view returns (uint256 finalAssets, uint256 finalSupply, uint256 finalEscrow, uint256 firstErrorIdx)
SKIMMER_ROLE
viewfunction SKIMMER_ROLE() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
tokenA
viewfunction tokenA() view returns (address)
tokenB
viewfunction tokenB() view returns (address)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalReceiptSupply
viewfunction totalReceiptSupply() view returns (uint256)
verifyPairComposition
viewfunction verifyPairComposition() view returns (bool ok, address t0, address t1)
emitBackingReport
nonpayablefunction emitBackingReport()
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
pause
nonpayablefunction pause()
pledge
nonpayablefunction pledge(uint256 amount)
pledgeWithPermit
nonpayablefunction pledgeWithPermit(uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
releaseToUser
nonpayablefunction releaseToUser(address to, uint256 amount)
releaseToUsers
nonpayablefunction releaseToUsers(address[] to, uint256[] amounts)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
rescueERC20
nonpayablefunction rescueERC20(address token, address to, uint256 amount)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setDepositCap
nonpayablefunction setDepositCap(uint256 cap)
setMinPledge
nonpayablefunction setMinPledge(uint256 minAmount)
skimExcessLP
nonpayablefunction skimExcessLP(address to)
unpause
nonpayablefunction unpause()
withdraw
nonpayablefunction withdraw(uint256 amount, address to)
withdraw
nonpayablefunction withdraw(uint256 amount)
events
BackingReport
event BackingReport(uint256 assets, uint256 supply, uint256 escrow, uint256 ratio1e18, uint256 timestamp)
DepositCapUpdated
event DepositCapUpdated(uint256 newCap)
MinPledgeUpdated
event MinPledgeUpdated(uint256 newMin)
Paused
event Paused(address account)
Pledged
event Pledged(address indexed user, uint256 amount)
Released
event Released(address indexed to, uint256 amount)
ReleasedBatch
event ReleasedBatch(uint256 items, uint256 totalAmount)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SkimmedExcess
event SkimmedExcess(address indexed to, uint256 amount)
Unpaused
event Unpaused(address account)
Withdrawn
event Withdrawn(address indexed from, address indexed to, uint256 amount)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
EnforcedPause
error EnforcedPause()
ExpectedPause
error ExpectedPause()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x61012060405234801561001157600080fd5b5060405161713138038061713183398101604081905261003091610760565b60016002556001600160a01b0385166100805760405162461bcd60e51b815260206004820152600d60248201526c1c185a5c881c995c5d5a5c9959609a1b60448201526064015b60405180910390fd5b6001600160a01b0384166100c85760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b90481c995c5d5a5c9959608a1b6044820152606401610077565b6001600160a01b0383166101105760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b90881c995c5d5a5c9959608a1b6044820152606401610077565b6000856001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610150573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017491906107fc565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101da91906107fc565b9050856001600160a01b0316826001600160a01b031614801561020e5750846001600160a01b0316816001600160a01b0316145b806102465750846001600160a01b0316826001600160a01b03161480156102465750856001600160a01b0316816001600160a01b0316145b6102835760405162461bcd60e51b815260206004820152600e60248201526d0e8ded6cadc40dad2e6dac2e8c6d60931b6044820152606401610077565b73ca143ce32fe78f1f7019d7d551a6402fc5350c736001600160a01b0316876001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030391906107fc565b6001600160a01b0316146103595760405162461bcd60e51b815260206004820152601360248201527f6e6f742070616e63616b6520666163746f7279000000000000000000000000006044820152606401610077565b60405163e6a4390560e01b81526001600160a01b0380881660048301528616602482015260009073ca143ce32fe78f1f7019d7d551a6402fc5350c739063e6a4390590604401602060405180830381865afa1580156103bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e091906107fc565b9050876001600160a01b0316816001600160a01b0316146104385760405162461bcd60e51b81526020600482015260126024820152713737ba1031b0b737b734b1b0b6103830b4b960711b6044820152606401610077565b6001600160a01b0380891660a081905288821660c05290871660e05260808190526040805163313ce56760e01b815290516012929163313ce5679160048083019260209291908290030181865afa9250505080156104b3575060408051601f3d908101601f191682019092526104b09181019061081e565b60015b156104bb5790505b858582306040516104cb90610674565b6104d8949392919061086d565b604051809103906000f0801580156104f4573d6000803e3d6000fd5b506001600160a01b03166101005261050d6000336105c8565b506105387f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336105c8565b506105637f88f3509f0e42391f2d94ebfb2a37cbd0782b1b8f73715330017f4663290b8117336105c8565b5061058e7f2865fb6486f1182ff260a98800c07add86e3bf298ef0eac98fcd12371e94abc9336105c8565b506105b97f8c669765ecd90a6bccbce037d8ef49acd067779f7f145bf4b6a484a79bada329336105c8565b505050505050505050506108b7565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1661066a576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556106223390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161066e565b5060005b92915050565b61169180615aa083390190565b80516001600160a01b038116811461069857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156106ce5781810151838201526020016106b6565b50506000910152565b600082601f8301126106e857600080fd5b81516001600160401b038111156107015761070161069d565b604051601f8201601f19908116603f011681016001600160401b038111828210171561072f5761072f61069d565b60405281815283820160200185101561074757600080fd5b6107588260208301602087016106b3565b949350505050565b600080600080600060a0868803121561077857600080fd5b61078186610681565b945061078f60208701610681565b935061079d60408701610681565b60608701519093506001600160401b038111156107b957600080fd5b6107c5888289016106d7565b608088015190935090506001600160401b038111156107e357600080fd5b6107ef888289016106d7565b9150509295509295909350565b60006020828403121561080e57600080fd5b61081782610681565b9392505050565b60006020828403121561083057600080fd5b815160ff8116811461081757600080fd5b600081518084526108598160208601602086016106b3565b601f01601f19169290920160200192915050565b6080815260006108806080830187610841565b82810360208401526108928187610841565b60ff95909516604084015250506001600160a01b039190911660609091015292915050565b60805160a05160c05160e05161010051614ffa610aa660003960008181610bd401528181610df801528181610eb601528181610fbe0152818161100d0152818161126401528181611436015281816115d70152818161172d015281816117df01528181611921015281816119fa01528181611a8101528181611b0801528181611b8a01528181611d20015281816120b30152818161221001528181612340015281816123b7015281816125ab015281816127e101528181612a8b01528181612cfa01528181612e510152818161317b015281816132440152818161370d0152818161393a01528181613a5c01528181613b7901528181613cb301528181613dbf0152818161416701526145bc01526000818161081b01528181610f7c01528181611f330152611f6f0152600081816105a301528181610f5b01528181611ef70152611fab015260008181610a4f01528181610f3a01528181611def0152611e7301526000818161084201528181610c8601528181610f9d015281816112f401528181611874015281816128b901528181612a1801528181612da401528181612efe0152818161381c015281816139c701528181613af101528181613e8801528181613f0f01528181613f96015281816141d00152818161441b0152818161449d01526144e70152614ffa6000f3fe608060405234801561001057600080fd5b50600436106104275760003560e01c80637db1d0451161022b578063b2d8630811610130578063df26b956116100b8578063e63ab1e911610087578063e63ab1e914610bf6578063f4e330cd14610c0b578063f7601a5314610c13578063ffa3209914610c2a578063ffbf773514610c3257600080fd5b8063df26b95614610ba1578063df4d8da614610bb4578063e1ab2e6b14610bbc578063e1e6b89814610bcf57600080fd5b8063d547741f116100ff578063d547741f14610b0f578063dae0fbaa14610b22578063dbd5edc714610b35578063dc5fb7b014610b3e578063dded05ce14610b7e57600080fd5b8063b2d8630814610aac578063ca8adc6614610ad0578063d16dbd8d14610ae3578063d324eed714610aeb57600080fd5b80639b4b1786116101b3578063a7edf14511610182578063a7edf14514610a05578063a8aa1b3114610a4a578063ac28af2414610a71578063b2118a8d14610a86578063b2cbe43414610a9957600080fd5b80639b4b1786146109b15780639e943b9b146109ba578063a1cf34cf146109cd578063a217fddf146109fd57600080fd5b80638a5c1105116101fa5780638a5c1105146109435780638b1eb19e1461095857806391d1485414610982578063950bff9f14610995578063983c8d601461099e57600080fd5b80637db1d045146108e157806382c95f9c146109135780638456cb5914610928578063866512031461093057600080fd5b806336568abe116103315780635c975abb116102b9578063609c4c6c11610288578063609c4c6c146108645780636f776fea1461088b5780636f89e4091461089e5780637326c9c0146108c65780637339988f146108d957600080fd5b80635c975abb146108035780635ce239501461080e5780635f64b55b146108165780635fcbd2851461083d57600080fd5b806340c474b21161030057806340c474b21461074f57806347d3a908146107675780634f2d2abf1461077a57806352ddc7561461078d57806359dfa6e1146107d457600080fd5b806336568abe146107195780633b1deeda1461072c5780633b588351146107345780633f4ba83a1461074757600080fd5b80630fc63d10116103b45780632f2ff15d116103835780632f2ff15d1461061b57806330f85fb01461062e57806331098f071461066357806333ad14ef1461069357806335154aed146106f157600080fd5b80630fc63d101461059e578063248a9ca3146105dd57806329ceb388146106005780632e1a7d4d1461060857600080fd5b80630260754d116103fb5780630260754d146104ed5780630478460f1461050057806304bce9e61461050857806307ac98171461057157806308da92a21461059657600080fd5b8062f714ce1461042c578063010106931461044157806301e1d114146104b457806301ffc9a7146104ca575b600080fd5b61043f61043a36600461477c565b610c45565b005b61049e61044f36600461477c565b604051602481018390526001600160a01b038216604482015260609060640160408051601f198184030181529190526020810180516001600160e01b0316627b8a6760e11b1790529392505050565b6040516104ab91906147fc565b60405180910390f35b6104bc610c6e565b6040519081526020016104ab565b6104dd6104d836600461480f565b610cff565b60405190151581526020016104ab565b61043f6104fb366004614839565b610d36565b6104bc610f2e565b610510610f38565b604080516001600160a01b039b8c168152998b1660208b0152978a1697890197909752948816606088015296909216608086015260a085015260c084015260e0830193909352610100820192909252901515610120820152610140016104ab565b61058461057f3660046148b0565b6110ca565b6040516104ab96959493929190614961565b61043f6113fd565b6105c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016104ab565b6104bc6105eb3660046149f7565b60009081526020819052604090206001015490565b6104bc611528565b61043f6106163660046149f7565b61157a565b61043f61062936600461477c565b6115a2565b61064161063c366004614839565b6115cd565b60408051941515855260208501939093529183015260608201526080016104ab565b61066b6116fb565b604080519586526020860194909452928401919091526060830152608082015260a0016104ab565b61049e6106a1366004614839565b6040516001600160a01b03831660248201526044810182905260609060640160408051601f198184030181529190526020810180516001600160e01b0316630260754d60e01b1790529392505050565b6107046106ff366004614a10565b6117b3565b604080519283526020830191909152016104ab565b61043f61072736600461477c565b6118ea565b6104bc61191d565b61043f6107423660046149f7565b61197d565b61043f6119d2565b6107576119f2565b6040516104ab9493929190614a3e565b6107046107753660046149f7565b611c12565b61049e610788366004614a7a565b611c9e565b610795611cea565b6040805198895260208901979097529587019490945260608601929092521515608085015260a084015260c0830152151560e0820152610100016104ab565b6107dc611de8565b6040805193151584526001600160a01b0392831660208501529116908201526060016104ab565b60015460ff166104dd565b6104dd611fe6565b6105c57f000000000000000000000000000000000000000000000000000000000000000081565b6105c57f000000000000000000000000000000000000000000000000000000000000000081565b61086c611fff565b60408051931515845260208401929092521515908201526060016104ab565b6106416108993660046149f7565b612078565b6108a6612145565b6040805194855260208501939093529183015260608201526080016104ab565b61043f6108d43660046149f7565b612186565b6104bc612328565b6108e9612377565b6040805195151586526020860194909452928401919091526060830152608082015260a0016104ab565b6104bc600080516020614f6583398151915281565b61043f61244d565b61043f61093e3660046149f7565b61246d565b6104bc600080516020614f8583398151915281565b61096b6109663660046149f7565b6124ba565b6040805192151583526020830191909152016104ab565b6104dd61099036600461477c565b612515565b6104bc61010081565b6108a66109ac366004614a7a565b61253e565b6104bc60045481565b61043f6109c8366004614ae9565b61276e565b6109e06109db3660046149f7565b612930565b6040805193151584526020840192909252908201526060016104ab565b6104bc600081565b610a18610a13366004614ae9565b612988565b60408051951515865293151560208601529115159284019290925290151560608301521515608082015260a0016104ab565b6105c57f000000000000000000000000000000000000000000000000000000000000000081565b6104bc600080516020614fa583398151915281565b61043f610a94366004614b06565b612a0b565b6104bc610aa73660046149f7565b612b15565b610abf610aba3660046148b0565b612b46565b6040516104ab959493929190614b47565b61043f610ade366004614a7a565b612fbb565b6104bc61337e565b610afe610af93660046148b0565b6133af565b6040516104ab959493929190614bb4565b61043f610b1d36600461477c565b61365e565b61043f610b30366004614c24565b613683565b6104bc60035481565b610b51610b4c366004614ae9565b61390e565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016104ab565b610b86613bf7565b604080519384526020840192909252908201526060016104ab565b6109e0610baf3660046149f7565b613c8f565b6104bc613d4b565b6108e9610bca3660046149f7565b613d7f565b6105c57f000000000000000000000000000000000000000000000000000000000000000081565b6104bc600080516020614f4583398151915281565b6104bc613e77565b610c1b613e81565b6040516104ab93929190614c6d565b6104bc61401b565b6104bc610c403660046149f7565b614062565b610c4d614090565b610c556140b8565b610c603382846140de565b610c6a6001600255565b5050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024015b602060405180830381865afa158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190614ca6565b905090565b60006001600160e01b03198216637965db0b60e01b1480610d3057506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020614fa5833981519152610d4e8161424b565b610d56614090565b610d5e6140b8565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152600a602482015269746f206973207a65726f60b01b60448201526064015b60405180910390fd5b60008211610de15760405162461bcd60e51b81526020600482015260086024820152670616d6f756e743d360c41b6044820152606401610d9d565b6040516370a0823160e01b815230600482015282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6b9190614ca6565b1015610eb15760405162461bcd60e51b8152602060048201526015602482015274696e73756666696369656e7420726563656970747360581b6044820152606401610d9d565b610edc7f00000000000000000000000000000000000000000000000000000000000000008484614255565b826001600160a01b03167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e83604051610f1791815260200190565b60405180910390a2610f296001600255565b505050565b6000610cfa61191d565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600080808080610feb610c6e565b9450610ff561191d565b6040516370a0823160e01b81523060048201529094507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110809190614ca6565b925083156110aa578361109b86670de0b6b3a7640000614cd5565b6110a59190614cec565b6110ae565b6000195b91506110bc60015460ff1690565b905090919293949596979899565b606080808060008086806001600160401b038111156110eb576110eb614d0e565b604051908082528060200260200182016040528015611114578160200160208202803683370190505b509650806001600160401b0381111561112f5761112f614d0e565b604051908082528060200260200182016040528015611158578160200160208202803683370190505b509550806001600160401b0381111561117357611173614d0e565b60405190808252806020026020018201604052801561119c578160200160208202803683370190505b509450806001600160401b038111156111b7576111b7614d0e565b6040519080825280602002602001820160405280156111e0578160200160208202803683370190505b509350600092506000915060005b818110156113f15760008a8a8381811061120a5761120a614d24565b905060200201602081019061121f9190614ae9565b90508089838151811061123457611234614d24565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b815282821660048201526000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156112ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cf9190614ca6565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f9190614ca6565b9050818a858151811061137457611374614d24565b6020026020010181815250508089858151811061139357611393614d24565b602090810291909101015281156113e35760018885815181106113b8576113b8614d24565b91151560209283029190910190910152866113d281614d3a565b97506113e090508287614d53565b95505b5050508060010190506111ee565b50509295509295509295565b6000611407610c6e565b9050600061141361191d565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561147d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a19190614ca6565b9050600082156114cd57826114be85670de0b6b3a7640000614cd5565b6114c89190614cec565b6114d1565b6000195b6040805186815260208101869052908101849052606081018290524260808201529091507ffe27d6c9da6cf54f070206307831a6ab8113396d0edda189be7fd854103097619060a00160405180910390a150505050565b600080611533610c6e565b9050600061153f61191d565b90508015611569578061155a83670de0b6b3a7640000614cd5565b6115649190614cec565b611573565b670de0b6b3a76400005b9250505090565b611582614090565b61158a6140b8565b6115953333836140de565b61159f6001600255565b50565b6000828152602081905260409020600101546115bd8161424b565b6115c783836142b4565b50505050565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231886040518263ffffffff1660e01b815260040161163091906001600160a01b0391909116815260200190565b602060405180830381865afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190614ca6565b90508581101594506000611683610c6e565b9050600061168f61191d565b9050878281111561169d5750815b818111156116a85750805b6116b28184614d66565b96506116be8183614d66565b955085156116e857856116d988670de0b6b3a7640000614cd5565b6116e39190614cec565b6116ec565b6000195b94505050505092959194509250565b600080600080600061170b610c6e565b945061171561191d565b6040516370a0823160e01b81523060048201529094507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561177c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a09190614ca6565b9250600354915060045490509091929394565b604051636eb1769f60e11b81526001600160a01b038381166004830152828116602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063dd62ed3e90604401602060405180830381865afa158015611826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184a9190614ca6565b604051636eb1769f60e11b81526001600160a01b03868116600483015285811660248301529193507f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e90604401602060405180830381865afa1580156118bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e19190614ca6565b90509250929050565b6001600160a01b03811633146119135760405163334bd91960e11b815260040160405180910390fd5b610f298282614346565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd6573d6000803e3d6000fd5b600080516020614f658339815191526119958161424b565b60048290556040518281527f56cb567ac0a659efb6e387bbc92beb2d0c1eb43aedd77ce86f8e4335180586c3906020015b60405180910390a15050565b600080516020614f458339815191526119ea8161424b565b61159f6143b1565b6060806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015611a7757506040513d6000823e601f3d908101601f19168201604052611a749190810190614d79565b60015b15611a7f5793505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015611afe57506040513d6000823e601f3d908101601f19168201604052611afb9190810190614d79565b60015b15611b065792505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b80575060408051601f3d908101601f19168201909252611b7d91810190614e2b565b60015b15611b885791505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0a9190614ca6565b905090919293565b6000806000611c1f610c6e565b90506000611c2b61191d565b9050808211611c3b576000611c45565b611c458183614d66565b93508482811115611c535750815b81811115611c5e5750805b6000611c6a8285614d66565b90506000611c788385614d66565b9050808211611c88576000611c92565b611c928183614d66565b95505050505050915091565b606084848484604051602401611cb79493929190614e48565b60408051601f198184030181529190526020810180516001600160e01b03166365456e3360e11b17905295945050505050565b600080600080600080600080611cfe610c6e565b9750611d0861191d565b6040516370a0823160e01b81523060048201529097507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d939190614ca6565b9550868811611da3576000611dad565b611dad8789614d66565b94506000851193506003549250600454915060008311611dce576000611ddc565b82611dda896001614d53565b115b90509091929394959697565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614ec6565b91507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ecf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef39190614ec6565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148015611f6757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b80611fdf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148015611fdf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b9250909192565b6000611ff061191d565b611ff8610c6e565b1015905090565b600080600061201060015460ff1690565b1561202657505060035460019260009250901590565b6003546000612033610c6e565b90508160000361204f5750600094600019945060019350915050565b81811015945084612069576120648183614d66565b61206c565b60005b94956000945092505050565b600080600080612086610c6e565b905061209061191d565b6040516370a0823160e01b81523060048201529092506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156120fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211e9190614ca6565b868110159550905084612131578061213b565b61213b8682614d66565b9350509193509193565b60035460008080612154610c6e565b92508315806121635750838310155b612176576121718385614d66565b612179565b60005b9150600454905090919293565b61218e614090565b6121966140b8565b600081116121b65760405162461bcd60e51b8152600401610d9d90614ee3565b60045415612203576004548110156122035760405162461bcd60e51b815260206004820152601060248201526f62656c6f77206d696e20706c6564676560801b6044820152606401610d9d565b600354156122df576000817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561226c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122909190614ca6565b61229a9190614d53565b90506003548111156122dd5760405162461bcd60e51b815260206004820152600c60248201526b18d85c08195e18d95959195960a21b6044820152606401610d9d565b505b6122e93382614403565b60405181815233907f2726ce6e3b7987cbbb10c5a55b44725526c540fbba590cfc20afab691fa45edf9060200160405180910390a261159f6001600255565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401610cb9565b600080600080600061238b60015460ff1690565b9450612395610c6e565b935061239f61191d565b6040516370a0823160e01b81523060048201529093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242a9190614ca6565b915082841161243a576000612444565b6124448385614d66565b90509091929394565b600080516020614f458339815191526124658161424b565b61159f614626565b600080516020614f658339815191526124858161424b565b60038290556040518281527f333b26cca69716ad4680ddb07663f5bfb4f06045671f336af9a83690a3ae00f9906020016119c6565b60008060006124c7610c6e565b905060006124d361191d565b9050806000036124ec5750600194600019945092505050565b806124ff83670de0b6b3a7640000614cd5565b6125099190614cec565b94851015959350505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008080808685146125815760405162461bcd60e51b815260206004820152600c60248201526b0d8cadc40dad2e6dac2e8c6d60a31b6044820152606401610d9d565b612589610c6e565b935061259361191d565b6040516370a0823160e01b81523060048201529093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261e9190614ca6565b91506000905060005b8781101561276257600089898381811061264357612643614d24565b90506020020160208101906126589190614f0b565b9050600088888481811061266e5761266e614d24565b9050602002013590508160ff166001036126e057600060035411801561269e575060035461269c8289614d53565b115b156126b7576126ae836001614d53565b93505050612762565b6126c18188614d53565b96506126cd8187614d53565b95506126d98186614d53565b9450612758565b8160ff1660020361270857808510156126fe576126ae836001614d53565b6126d98186614d66565b8160ff1660030361274d578087108061272057508086105b15612730576126ae836001614d53565b61273a8188614d66565b96506127468187614d66565b9550612758565b6126ae836001614d53565b5050600101612627565b50945094509450949050565b600080516020614f858339815191526127868161424b565b61278e614090565b6001600160a01b0382166127d15760405162461bcd60e51b815260206004820152600a602482015269696e76616c696420746f60b01b6044820152606401610d9d565b60006127db610c6e565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561283d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128619190614ca6565b905080821161289e5760405162461bcd60e51b81526020600482015260096024820152686e6f2065786365737360b81b6044820152606401610d9d565b60006128aa8284614d66565b90506128e06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683614255565b846001600160a01b03167fcfb6f0b0a60885869c87f33c427ba89020bccffc0519bf1126889dcc343fe2748260405161291b91815260200190565b60405180910390a2505050610c6a6001600255565b600080600061293d610c6e565b915061294761191d565b90508060000361295a5760019250612981565b61296684612710614d53565b6129709082614cd5565b61297c83612710614cd5565b101592505b9193909250565b6000808080806129988187612515565b94506129b2600080516020614f4583398151915287612515565b93506129cc600080516020614fa583398151915287612515565b92506129e6600080516020614f6583398151915287612515565b9150612a00600080516020614f8583398151915287612515565b905091939590929450565b6000612a168161424b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603612a895760405162461bcd60e51b815260206004820152600f60248201526e06e6f20726573637565206f66204c5608c1b6044820152606401610d9d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603612b015760405162461bcd60e51b81526020600482015260146024820152731b9bc81c995cd8dd59481bd9881c9958d95a5c1d60621b6044820152606401610d9d565b6115c76001600160a01b0385168484614255565b600080612b20611528565b9050670de0b6b3a7640000612b358285614cd5565b612b3f9190614cec565b9392505050565b60608080808085806001600160401b03811115612b6557612b65614d0e565b604051908082528060200260200182016040528015612b8e578160200160208202803683370190505b509550806001600160401b03811115612ba957612ba9614d0e565b604051908082528060200260200182016040528015612bd2578160200160208202803683370190505b509450806001600160401b03811115612bed57612bed614d0e565b604051908082528060200260200182016040528015612c16578160200160208202803683370190505b509350806001600160401b03811115612c3157612c31614d0e565b604051908082528060200260200182016040528015612c5a578160200160208202803683370190505b509250806001600160401b03811115612c7557612c75614d0e565b604051908082528060200260200182016040528015612c9e578160200160208202803683370190505b50915060005b81811015612faf576000898983818110612cc057612cc0614d24565b9050602002016020810190612cd59190614ae9565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d659190614ca6565b905080898481518110612d7a57612d7a614d24565b60209081029190910101526040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e0f9190614ca6565b888481518110612e2157612e21614d24565b6020908102919091010152604051636eb1769f60e11b81526001600160a01b0383811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063dd62ed3e90604401602060405180830381865afa158015612e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebc9190614ca6565b878481518110612ece57612ece614d24565b6020908102919091010152604051636eb1769f60e11b81526001600160a01b0383811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063dd62ed3e90604401602060405180830381865afa158015612f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f699190614ca6565b868481518110612f7b57612f7b614d24565b60200260200101818152505080858481518110612f9a57612f9a614d24565b60209081029190910101525050600101612ca4565b50509295509295909350565b600080516020614fa5833981519152612fd38161424b565b612fdb614090565b612fe36140b8565b838281146130225760405162461bcd60e51b815260206004820152600c60248201526b0d8cadc40dad2e6dac2e8c6d60a31b6044820152606401610d9d565b60008111801561303457506101008111155b6130715760405162461bcd60e51b815260206004820152600e60248201526d6261642062617463682073697a6560901b6044820152606401610d9d565b6000805b8281101561316357600088888381811061309157613091614d24565b90506020020160208101906130a69190614ae9565b6001600160a01b0316036130e55760405162461bcd60e51b8152600401610d9d906020808252600490820152630746f3d360e41b604082015260600190565b60008686838181106130f9576130f9614d24565b90506020020135116131355760405162461bcd60e51b81526020600482015260056024820152640616d743d360dc1b6044820152606401610d9d565b85858281811061314757613147614d24565b90506020020135826131599190614d53565b9150600101613075565b506040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee9190614ca6565b10156132345760405162461bcd60e51b8152602060048201526015602482015274696e73756666696369656e7420726563656970747360581b6044820152606401610d9d565b60005b82811015613331576132a87f000000000000000000000000000000000000000000000000000000000000000089898481811061327557613275614d24565b905060200201602081019061328a9190614ae9565b88888581811061329c5761329c614d24565b90506020020135614255565b8787828181106132ba576132ba614d24565b90506020020160208101906132cf9190614ae9565b6001600160a01b03167fb21fb52d5749b80f3182f8c6992236b5e5576681880914484d7f4c9b062e619e87878481811061330b5761330b614d24565b9050602002013560405161332191815260200190565b60405180910390a2600101613237565b5060408051838152602081018390527f8dc71e1af2f7ce4f01f977cec146ec805dafbbfba92b62f8c6da8cd437be1a75910160405180910390a150506133776001600255565b5050505050565b600080613389610c6e565b9050600061339561191d565b90508082116133a5576000611573565b6115738183614d66565b60608080808085806001600160401b038111156133ce576133ce614d0e565b6040519080825280602002602001820160405280156133f7578160200160208202803683370190505b509550806001600160401b0381111561341257613412614d0e565b60405190808252806020026020018201604052801561343b578160200160208202803683370190505b509450806001600160401b0381111561345657613456614d0e565b60405190808252806020026020018201604052801561347f578160200160208202803683370190505b509350806001600160401b0381111561349a5761349a614d0e565b6040519080825280602002602001820160405280156134c3578160200160208202803683370190505b509250806001600160401b038111156134de576134de614d0e565b604051908082528060200260200182016040528015613507578160200160208202803683370190505b50915060005b81811015612faf57600089898381811061352957613529614d24565b905060200201602081019061353e9190614ae9565b905061354b600082612515565b88838151811061355d5761355d614d24565b91151560209283029190910190910152613585600080516020614f4583398151915282612515565b87838151811061359757613597614d24565b911515602092830291909101909101526135bf600080516020614fa583398151915282612515565b8683815181106135d1576135d1614d24565b911515602092830291909101909101526135f9600080516020614f6583398151915282612515565b85838151811061360b5761360b614d24565b91151560209283029190910190910152613633600080516020614f8583398151915282612515565b84838151811061364557613645614d24565b911515602092830291909101909101525060010161350d565b6000828152602081905260409020600101546136798161424b565b6115c78383614346565b61368b614090565b6136936140b8565b600085116136b35760405162461bcd60e51b8152600401610d9d90614ee3565b60045415613700576004548510156137005760405162461bcd60e51b815260206004820152601060248201526f62656c6f77206d696e20706c6564676560801b6044820152606401610d9d565b600354156137dc576000857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378d9190614ca6565b6137979190614d53565b90506003548111156137da5760405162461bcd60e51b815260206004820152600c60248201526b18d85c08195e18d95959195960a21b6044820152606401610d9d565b505b60405163d505accf60e01b8152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d505accf9060e401600060405180830381600087803b15801561386857600080fd5b505af1925050508015613879575060015b6138c55760405162461bcd60e51b815260206004820152601860248201527f4c5020746f6b656e20686173206e6f207065726d6974282900000000000000006044820152606401610d9d565b6138cf3386614403565b60405185815233907f2726ce6e3b7987cbbb10c5a55b44725526c540fbba590cfc20afab691fa45edf9060200160405180910390a26133776001600255565b6040516370a0823160e01b81526001600160a01b038281166004830152600091829182918291829182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a59190614ca6565b6040516370a0823160e01b81526001600160a01b0389811660048301529197507f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a349190614ca6565b604051636eb1769f60e11b81526001600160a01b0389811660048301523060248301529196507f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e90604401602060405180830381865afa158015613aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac99190614ca6565b604051636eb1769f60e11b81526001600160a01b0389811660048301523060248301529195507f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e90604401602060405180830381865afa158015613b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5e9190614ca6565b6040516370a0823160e01b81523060048201529093508692507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec9190614ca6565b905091939550919395565b600080600080613c05610c6e565b90506000613c1161191d565b905080600003613c2b575060001994859450849350915050565b80613c3a83633b9aca00614cd5565b613c449190614cec565b945080613c5983670de0b6b3a7640000614cd5565b613c639190614cec565b935080613c7c836b033b2e3c9fd0803ce8000000614cd5565b613c869190614cec565b92505050909192565b6040516370a0823160e01b8152306004820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d1e9190614ca6565b9050838110613d34576001925060009150612981565b60009250613d428185614d66565b91509193909250565b600080613d56610c6e565b90506000613d6261191d565b9050808210156133a557613d768282614d66565b61156490614f28565b600080600080600080613d90610c6e565b90506000613d9c61191d565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2a9190614ca6565b9050613e368984614d53565b9650613e428983614d53565b9550613e4e8982614d53565b9450600354935083600014613e665783871115613e69565b60015b975050505091939590929450565b6000610cfa610c6e565b60608060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015613f0557506040513d6000823e601f3d908101601f19168201604052613f029190810190614d79565b60015b15613f0d5792505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015613f8c57506040513d6000823e601f3d908101601f19168201604052613f899190810190614d79565b60015b15613f945791505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561400e575060408051601f3d908101601f1916820190925261400b91810190614e2b565b60015b156140165790505b909192565b60008061402661191d565b905080156140585780614037610c6e565b61404990670de0b6b3a7640000614cd5565b6140539190614cec565b61405c565b6000195b91505090565b60008061406d611528565b9050801561407b578061407e565b60015b612b3584670de0b6b3a7640000614cd5565b60028054036140b257604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b60015460ff16156140dc5760405163d93c066560e01b815260040160405180910390fd5b565b600081116140fe5760405162461bcd60e51b8152600401610d9d90614ee3565b6001600160a01b0382166141415760405162461bcd60e51b815260206004820152600a602482015269696e76616c696420746f60b01b6044820152606401610d9d565b604051632770a7eb60e21b81526001600160a01b038481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b1580156141ab57600080fd5b505af11580156141bf573d6000803e3d6000fd5b506141f99250506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690508383614255565b816001600160a01b0316836001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb8360405161423e91815260200190565b60405180910390a3505050565b61159f8133614661565b6040516001600160a01b03838116602483015260448201839052610f2991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061469a565b60006142c08383612515565b61433e576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556142f63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610d30565b506000610d30565b60006143528383612515565b1561433e576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610d30565b6143b961470b565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561446a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061448e9190614ca6565b90506144c56001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684308561472e565b6040516370a0823160e01b815230600482015260009082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561452e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145529190614ca6565b61455c9190614d66565b90508281146145a05760405162461bcd60e51b815260206004820152601060248201526f4c5020746f6b656e206e6f7420313a3160801b6044820152606401610d9d565b6040516340c10f1960e01b8152306004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561460857600080fd5b505af115801561461c573d6000803e3d6000fd5b5050505050505050565b61462e6140b8565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336143e6565b61466b8282612515565b610c6a5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610d9d565b600080602060008451602086016000885af1806146bd576040513d6000823e3d81fd5b50506000513d915081156146d55780600114156146e2565b6001600160a01b0384163b155b156115c757604051635274afe760e01b81526001600160a01b0385166004820152602401610d9d565b60015460ff166140dc57604051638dfc202b60e01b815260040160405180910390fd5b6040516001600160a01b0384811660248301528381166044830152606482018390526115c79186918216906323b872dd90608401614282565b6001600160a01b038116811461159f57600080fd5b6000806040838503121561478f57600080fd5b8235915060208301356147a181614767565b809150509250929050565b60005b838110156147c75781810151838201526020016147af565b50506000910152565b600081518084526147e88160208601602086016147ac565b601f01601f19169290920160200192915050565b602081526000612b3f60208301846147d0565b60006020828403121561482157600080fd5b81356001600160e01b031981168114612b3f57600080fd5b6000806040838503121561484c57600080fd5b823561485781614767565b946020939093013593505050565b60008083601f84011261487757600080fd5b5081356001600160401b0381111561488e57600080fd5b6020830191508360208260051b85010111156148a957600080fd5b9250929050565b600080602083850312156148c357600080fd5b82356001600160401b038111156148d957600080fd5b6148e585828601614865565b90969095509350505050565b600081518084526020840193506020830160005b82811015614923578151865260209586019590910190600101614905565b5093949350505050565b600081518084526020840193506020830160005b828110156149235781511515865260209586019590910190600101614941565b60c08082528751908201819052600090602089019060e0840190835b818110156149a45783516001600160a01b031683526020938401939092019160010161497d565b505083810360208501526149b8818a6148f1565b91505082810360408401526149cd81886148f1565b905082810360608401526149e1818761492d565b6080840195909552505060a00152949350505050565b600060208284031215614a0957600080fd5b5035919050565b60008060408385031215614a2357600080fd5b8235614a2e81614767565b915060208301356147a181614767565b608081526000614a5160808301876147d0565b8281036020840152614a6381876147d0565b60ff95909516604084015250506060015292915050565b60008060008060408587031215614a9057600080fd5b84356001600160401b03811115614aa657600080fd5b614ab287828801614865565b90955093505060208501356001600160401b03811115614ad157600080fd5b614add87828801614865565b95989497509550505050565b600060208284031215614afb57600080fd5b8135612b3f81614767565b600080600060608486031215614b1b57600080fd5b8335614b2681614767565b92506020840135614b3681614767565b929592945050506040919091013590565b60a081526000614b5a60a08301886148f1565b8281036020840152614b6c81886148f1565b90508281036040840152614b8081876148f1565b90508281036060840152614b9481866148f1565b90508281036080840152614ba881856148f1565b98975050505050505050565b60a081526000614bc760a083018861492d565b8281036020840152614bd9818861492d565b90508281036040840152614bed818761492d565b90508281036060840152614c01818661492d565b90508281036080840152614ba8818561492d565b60ff8116811461159f57600080fd5b600080600080600060a08688031215614c3c57600080fd5b85359450602086013593506040860135614c5581614c15565b94979396509394606081013594506080013592915050565b606081526000614c8060608301866147d0565b8281036020840152614c9281866147d0565b91505060ff83166040830152949350505050565b600060208284031215614cb857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610d3057610d30614cbf565b600082614d0957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060018201614d4c57614d4c614cbf565b5060010190565b80820180821115610d3057610d30614cbf565b81810381811115610d3057610d30614cbf565b600060208284031215614d8b57600080fd5b81516001600160401b03811115614da157600080fd5b8201601f81018413614db257600080fd5b80516001600160401b03811115614dcb57614dcb614d0e565b604051601f8201601f19908116603f011681016001600160401b0381118282101715614df957614df9614d0e565b604052818152828201602001861015614e1157600080fd5b614e228260208301602086016147ac565b95945050505050565b600060208284031215614e3d57600080fd5b8151612b3f81614c15565b6040808252810184905260008560608301825b87811015614e8b578235614e6e81614767565b6001600160a01b0316825260209283019290910190600101614e5b565b5083810360208501528481526001600160fb1b03851115614eab57600080fd5b8460051b915081866020830137016020019695505050505050565b600060208284031215614ed857600080fd5b8151612b3f81614767565b6020808252600e908201526d1a5b9d985b1a5908185b5bdd5b9d60921b604082015260600190565b600060208284031215614f1d57600080fd5b8135612b3f81614c15565b6000600160ff1b8201614f3d57614f3d614cbf565b506000039056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a2865fb6486f1182ff260a98800c07add86e3bf298ef0eac98fcd12371e94abc98c669765ecd90a6bccbce037d8ef49acd067779f7f145bf4b6a484a79bada32988f3509f0e42391f2d94ebfb2a37cbd0782b1b8f73715330017f4663290b8117a2646970667358221220d7cfdd78ce2fc3c7b1520fdc7d4a11496d160107d15e22ad980e7d801f8a009164736f6c634300081c003361018060405234801561001157600080fd5b50604051611691380380611691833981016040819052610030916102c5565b6040805180820190915260018152603160f81b6020820152849081908186600361005a83826103ef565b50600461006782826103ef565b5061007791508390506005610191565b61012052610086816006610191565b61014052815160208084019190912060e052815190820120610100524660a05261011360e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506001600160a01b0381166101625760405162461bcd60e51b815260206004820152600760248201526606f776e65723d360cc1b60448201526064015b60405180910390fd5b600880546001600160a01b0319166001600160a01b039290921691909117905560ff1661016052506105049050565b60006020835110156101ad576101a6836101c4565b90506101be565b816101b884826103ef565b5060ff90505b92915050565b600080829050601f815111156101ef578260405163305a27a960e01b815260040161015991906104ad565b80516101fa826104e0565b179392505050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561023357818101518382015260200161021b565b50506000910152565b600082601f83011261024d57600080fd5b81516001600160401b0381111561026657610266610202565b604051601f8201601f19908116603f011681016001600160401b038111828210171561029457610294610202565b6040528181528382016020018510156102ac57600080fd5b6102bd826020830160208701610218565b949350505050565b600080600080608085870312156102db57600080fd5b84516001600160401b038111156102f157600080fd5b6102fd8782880161023c565b602087015190955090506001600160401b0381111561031b57600080fd5b6103278782880161023c565b935050604085015160ff8116811461033e57600080fd5b60608601519092506001600160a01b038116811461035b57600080fd5b939692955090935050565b600181811c9082168061037a57607f821691505b60208210810361039a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156103ea57806000526020600020601f840160051c810160208510156103c75750805b601f840160051c820191505b818110156103e757600081556001016103d3565b50505b505050565b81516001600160401b0381111561040857610408610202565b61041c816104168454610366565b846103a0565b6020601f82116001811461045057600083156104385750848201515b600019600385901b1c1916600184901b1784556103e7565b600084815260208120601f198516915b828110156104805787850151825560209485019460019092019101610460565b508482101561049e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152600082518060208401526104cc816040850160208701610218565b601f01601f19169190910160400192915050565b8051602080830151919081101561039a5760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051611128610569600039600061017d015260006108f5015260006108c80152600061083a015260006108120152600061076d01526000610797015260006107c101526111286000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80637ecebe00116100a25780639dc29fac116100715780639dc29fac1461024e578063a9059cbb14610261578063d505accf14610274578063dd62ed3e14610287578063f2fde38b146102c057600080fd5b80637ecebe00146101ed57806384b0196e146102005780638da5cb5b1461021b57806395d89b411461024657600080fd5b8063313ce567116100de578063313ce567146101765780633644e515146101a757806340c10f19146101af57806370a08231146101c457600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610163575b600080fd5b6101186102d3565b6040516101259190610e8b565b60405180910390f35b61014161013c366004610ec1565b610365565b6040519015158152602001610125565b6002545b604051908152602001610125565b610141610171366004610eeb565b61037f565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610125565b6101556103a3565b6101c26101bd366004610ec1565b6103b2565b005b6101556101d2366004610f28565b6001600160a01b031660009081526020819052604090205490565b6101556101fb366004610f28565b6103eb565b610208610409565b6040516101259796959493929190610f43565b60085461022e906001600160a01b031681565b6040516001600160a01b039091168152602001610125565b61011861044f565b6101c261025c366004610ec1565b61045e565b61014161026f366004610ec1565b610493565b6101c2610282366004610fdb565b6104a1565b61015561029536600461104e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101c26102ce366004610f28565b6105e0565b6060600380546102e290611081565b80601f016020809104026020016040519081016040528092919081815260200182805461030e90611081565b801561035b5780601f106103305761010080835404028352916020019161035b565b820191906000526020600020905b81548152906001019060200180831161033e57829003601f168201915b5050505050905090565b600033610373818585610670565b60019150505b92915050565b60003361038d858285610682565b610398858585610701565b506001949350505050565b60006103ad610760565b905090565b6008546001600160a01b031633146103dd576040516330cd747160e01b815260040160405180910390fd5b6103e7828261088b565b5050565b6001600160a01b038116600090815260076020526040812054610379565b60006060806000806000606061041d6108c1565b6104256108ee565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6060600480546102e290611081565b6008546001600160a01b03163314610489576040516330cd747160e01b815260040160405180910390fd5b6103e7828261091b565b600033610373818585610701565b834211156104ca5760405163313c898160e11b8152600481018590526024015b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886105178c6001600160a01b0316600090815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061057282610951565b905060006105828287878761097e565b9050896001600160a01b0316816001600160a01b0316146105c9576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016104c1565b6105d48a8a8a610670565b50505050505050505050565b6008546001600160a01b0316331461060b576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b03811661064e5760405162461bcd60e51b815260206004820152600a60248201526906e65774f776e65723d360b41b60448201526064016104c1565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61067d83838360016109ac565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198110156106fb57818110156106ec57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016104c1565b6106fb848484840360006109ac565b50505050565b6001600160a01b03831661072b57604051634b637e8f60e11b8152600060048201526024016104c1565b6001600160a01b0382166107555760405163ec442f0560e01b8152600060048201526024016104c1565b61067d838383610a81565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156107b957507f000000000000000000000000000000000000000000000000000000000000000046145b156107e357507f000000000000000000000000000000000000000000000000000000000000000090565b6103ad604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b6001600160a01b0382166108b55760405163ec442f0560e01b8152600060048201526024016104c1565b6103e760008383610a81565b60606103ad7f00000000000000000000000000000000000000000000000000000000000000006005610bab565b60606103ad7f00000000000000000000000000000000000000000000000000000000000000006006610bab565b6001600160a01b03821661094557604051634b637e8f60e11b8152600060048201526024016104c1565b6103e782600083610a81565b600061037961095e610760565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060008061099088888888610c56565b9250925092506109a08282610d25565b50909695505050505050565b6001600160a01b0384166109d65760405163e602df0560e01b8152600060048201526024016104c1565b6001600160a01b038316610a0057604051634a1406b160e11b8152600060048201526024016104c1565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156106fb57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a7391815260200190565b60405180910390a350505050565b6001600160a01b038316610aac578060026000828254610aa191906110bb565b90915550610b1e9050565b6001600160a01b03831660009081526020819052604090205481811015610aff5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016104c1565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610b3a57600280548290039055610b59565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610b9e91815260200190565b60405180910390a3505050565b606060ff8314610bc557610bbe83610dde565b9050610379565b818054610bd190611081565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfd90611081565b8015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b50505050509050610379565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610c915750600091506003905082610d1b565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610ce5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d1157506000925060019150829050610d1b565b9250600091508190505b9450945094915050565b6000826003811115610d3957610d396110dc565b03610d42575050565b6001826003811115610d5657610d566110dc565b03610d745760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610d8857610d886110dc565b03610da95760405163fce698f760e01b8152600481018290526024016104c1565b6003826003811115610dbd57610dbd6110dc565b036103e7576040516335e2f38360e21b8152600481018290526024016104c1565b60606000610deb83610e1d565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600060ff8216601f81111561037957604051632cd44ac360e21b815260040160405180910390fd5b6000815180845260005b81811015610e6b57602081850181015186830182015201610e4f565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000610e9e6020830184610e45565b9392505050565b80356001600160a01b0381168114610ebc57600080fd5b919050565b60008060408385031215610ed457600080fd5b610edd83610ea5565b946020939093013593505050565b600080600060608486031215610f0057600080fd5b610f0984610ea5565b9250610f1760208501610ea5565b929592945050506040919091013590565b600060208284031215610f3a57600080fd5b610e9e82610ea5565b60ff60f81b8816815260e060208201526000610f6260e0830189610e45565b8281036040840152610f748189610e45565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b81811015610fca578351835260209384019390920191600101610fac565b50909b9a5050505050505050505050565b600080600080600080600060e0888a031215610ff657600080fd5b610fff88610ea5565b965061100d60208901610ea5565b95506040880135945060608801359350608088013560ff8116811461103157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561106157600080fd5b61106a83610ea5565b915061107860208401610ea5565b90509250929050565b600181811c9082168061109557607f821691505b6020821081036110b557634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561037957634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212206da999af0275001de83e676bdd3e2ac4c62c788da7810027ac3726223b9edce064736f6c634300081c00330000000000000000000000007e80da73058f5b55f0ca8a64ee525446e7cf768f00000000000000000000000097aa6203d304d3fb4b297fe6aa02cd1e0737d78a000000000000000000000000a293eead99409522eb26dab2f96e168cad0455e200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000104146584149446546695374616b696e6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4146582d53544b2d4c5000000000000000000000000000000000000000000000