0 txs
1.03m calls
constructor
constructor()
functions
_msgSender
viewfunction _msgSender() view returns (address)
checkNoPendingTrigger
viewfunction checkNoPendingTrigger(address trader, uint16 pairIndex, uint8 index, uint8 orderType) view returns (bool)
checkNoPendingTriggers
viewfunction checkNoPendingTriggers(address trader, uint16 pairIndex, uint8 index) view returns (bool)
delegations
viewfunction delegations(address delegator) view returns (address)
isDone
viewfunction isDone() view returns (bool)
isPaused
viewfunction isPaused() view returns (bool)
marketOrdersTimeout
viewfunction marketOrdersTimeout() view returns (uint16)
maxAllowedCollateral
viewfunction maxAllowedCollateral() view returns (uint256)
registry
viewfunction registry() view returns (address)
triggerTimeout
viewfunction triggerTimeout() view returns (uint16)
cancelOpenLimitOrder
nonpayablefunction cancelOpenLimitOrder(uint16 pairIndex, uint8 index)
closeTradeMarket
nonpayablefunction closeTradeMarket(uint16 pairIndex, uint8 index, uint16 closePercentage)
closeTradeMarketTimeout
nonpayablefunction closeTradeMarketTimeout(uint256 _order, bool retry)
delegatedAction
nonpayablefunction delegatedAction(address trader, bytes call_data) returns (bytes)
done
nonpayablefunction done()
executeAutomationOrder
nonpayablefunction executeAutomationOrder(uint8 orderType, address trader, uint16 pairIndex, uint8 index, uint256 priceTimestamp) returns (uint8)
initialize
nonpayablefunction initialize(address _registry, uint256 _maxAllowedCollateral, uint16 _marketOrdersTimeout, uint16 _triggerTimeout)
openTrade
nonpayablefunction openTrade(tuple t, uint8 orderType, uint256 slippageP)
openTradeMarketTimeout
nonpayablefunction openTradeMarketTimeout(uint256 _order)
pause
nonpayablefunction pause()
removeCollateral
nonpayablefunction removeCollateral(uint16 pairIndex, uint8 index, uint256 removeAmount)
removeDelegate
nonpayablefunction removeDelegate()
setDelegate
nonpayablefunction setDelegate(address delegate)
setMarketOrdersTimeout
nonpayablefunction setMarketOrdersTimeout(uint256 value)
setMaxAllowedCollateral
nonpayablefunction setMaxAllowedCollateral(uint256 value)
setTriggerTimeout
nonpayablefunction setTriggerTimeout(uint256 value)
topUpCollateral
nonpayablefunction topUpCollateral(uint16 pairIndex, uint8 index, uint256 topUpAmount)
updateOpenLimitOrder
nonpayablefunction updateOpenLimitOrder(uint16 pairIndex, uint8 index, uint192 price, uint192 tp, uint192 sl)
updateSl
nonpayablefunction updateSl(uint16 pairIndex, uint8 index, uint192 newSl)
updateTp
nonpayablefunction updateTp(uint16 pairIndex, uint8 index, uint192 newTp)
events
AutomationCloseOrderInitiated
event AutomationCloseOrderInitiated(uint256 indexed orderId, uint256 indexed tradeId, address indexed trader, uint16 pairIndex, uint8)
AutomationOpenOrderInitiated
event AutomationOpenOrderInitiated(uint256 indexed orderId, address indexed trader, uint16 indexed pairIndex, uint8 index)
DelegateAdded
event DelegateAdded(address indexed delegator, address indexed delegate)
DelegateRemoved
event DelegateRemoved(address indexed delegator, address indexed delegate)
Done
event Done(bool done)
Initialized
event Initialized(uint64 version)
MarketCloseFailed
event MarketCloseFailed(uint256 indexed tradeId, address indexed trader, uint16 indexed pairIndex)
MarketCloseOrderInitiated
event MarketCloseOrderInitiated(uint256 indexed orderId, uint256 indexed tradeId, address indexed trader, uint16 pairIndex)
MarketCloseOrderInitiatedV2
event MarketCloseOrderInitiatedV2(uint256 indexed orderId, uint256 indexed tradeId, address indexed trader, uint16 pairIndex, uint16 closePercentage)
MarketCloseTimeoutExecuted
event MarketCloseTimeoutExecuted(uint256 indexed orderId, uint256 indexed tradeId, (uint256 block, uint192 wantedPrice, uint32 slippageP, (uint256 collateral, uint192 openPrice, uint192 tp, uint192 sl, address trader, uint32 leverage, uint16 pairIndex, uint8 index, bool buy) trade) order)
MarketCloseTimeoutExecutedV2
event MarketCloseTimeoutExecutedV2(uint256 indexed orderId, uint256 indexed tradeId, (uint256 block, uint192 wantedPrice, uint32 slippageP, (uint256 collateral, uint192 openPrice, uint192 tp, uint192 sl, address trader, uint32 leverage, uint16 pairIndex, uint8 index, bool buy) trade, uint16 percentage) order)
MarketOpenOrderInitiated
event MarketOpenOrderInitiated(uint256 indexed orderId, address indexed trader, uint16 indexed pairIndex)
MarketOpenTimeoutExecuted
event MarketOpenTimeoutExecuted(uint256 indexed orderId, (uint256 block, uint192 wantedPrice, uint32 slippageP, (uint256 collateral, uint192 openPrice, uint192 tp, uint192 sl, address trader, uint32 leverage, uint16 pairIndex, uint8 index, bool buy) trade) order)
MarketOpenTimeoutExecutedV2
event MarketOpenTimeoutExecutedV2(uint256 indexed orderId, (uint256 block, uint192 wantedPrice, uint32 slippageP, (uint256 collateral, uint192 openPrice, uint192 tp, uint192 sl, address trader, uint32 leverage, uint16 pairIndex, uint8 index, bool buy) trade, uint16 percentage) order)
MarketOrdersTimeoutUpdated
event MarketOrdersTimeoutUpdated(uint16 value)
MaxAllowedCollateralUpdated
event MaxAllowedCollateralUpdated(uint256 value)
OpenLimitCanceled
event OpenLimitCanceled(address indexed trader, uint16 indexed pairIndex, uint8 index)
OpenLimitPlaced
event OpenLimitPlaced(address indexed trader, uint16 indexed pairIndex, uint8 index)
OpenLimitUpdated
event OpenLimitUpdated(address indexed trader, uint16 indexed pairIndex, uint8 index, uint192 newPrice, uint192 newTp, uint192 newSl)
OracleFeeCharged
event OracleFeeCharged(uint256 indexed tradeId, address indexed trader, uint16 pairIndex, uint256 amount)
OracleFeeChargedLimitCancelled
event OracleFeeChargedLimitCancelled(address indexed trader, uint16 pairIndex, uint256 amount)
OracleFeeRefunded
event OracleFeeRefunded(uint256 indexed tradeId, address indexed trader, uint16 pairIndex, uint256 amount)
Paused
event Paused(bool paused)
RemoveCollateralInitiated
event RemoveCollateralInitiated(uint256 indexed tradeId, uint256 indexed orderId, address indexed trader, uint16 pairIndex, uint256 removeAmount)
RemoveCollateralRejected
event RemoveCollateralRejected(uint256 indexed tradeId, uint256 indexed orderId, address indexed trader, uint16 pairIndex, uint256 removeAmount, string reason)
SlUpdated
event SlUpdated(uint256 indexed tradeId, address indexed trader, uint16 indexed pairIndex, uint8 index, uint192 newSl)
TopUpCollateralExecuted
event TopUpCollateralExecuted(uint256 indexed tradeId, address indexed trader, uint16 indexed pairIndex, uint256 topUpAmount, uint32 newLeverage)
TpUpdated
event TpUpdated(uint256 indexed tradeId, address indexed trader, uint16 indexed pairIndex, uint8 index, uint192 newTp)
TriggerTimeoutUpdated
event TriggerTimeoutUpdated(uint16 value)
errors
AboveMaxAllowedCollateral
error AboveMaxAllowedCollateral()
AlreadyMarketClosed
error AlreadyMarketClosed(address trader, uint16 pairIndex, uint8 index)
BelowMinLevPos
error BelowMinLevPos()
DelegatedActionFailed
error DelegatedActionFailed()
ExposureLimits
error ExposureLimits()
InvalidInitialization
error InvalidInitialization()
IsContract
error IsContract(address a)
IsDone
error IsDone()
IsPaused
error IsPaused()
MathOverflowedMulDiv
error MathOverflowedMulDiv()
MaxPendingMarketOrdersReached
error MaxPendingMarketOrdersReached(address trader)
MaxTradesPerPairReached
error MaxTradesPerPairReached(address trader, uint16 pairIndex)
NoDelegate
error NoDelegate(address a)
NoLimitFound
error NoLimitFound(address trader, uint16 pairIndex, uint8 index)
NotCloseMarketTimeoutOrder
error NotCloseMarketTimeoutOrder(uint256 orderId)
NotDelegate
error NotDelegate(address trader, address caller)
NotGov
error NotGov(address a)
NotInitializing
error NotInitializing()
NotManager
error NotManager(address a)
NotOpenMarketTimeoutOrder
error NotOpenMarketTimeoutOrder(uint256 orderId)
NoTradeFound
error NoTradeFound(address trader, uint16 pairIndex, uint8 index)
NoTradeToTimeoutFound
error NoTradeToTimeoutFound(uint256 orderId)
NotTradesUpKeep
error NotTradesUpKeep(address a)
NotYourOrder
error NotYourOrder(uint256 orderId, address trader)
NullAddr
error NullAddr()
PairNotListed
error PairNotListed(uint16 index)
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
TriggerPending
error TriggerPending(address sender, uint16 pairIndex, uint8 index)
WaitTimeout
error WaitTimeout(uint256 orderId)
WrongLeverage
error WrongLeverage(uint32 leverage)
WrongParams
error WrongParams()
WrongSL
error WrongSL()
WrongTP
error WrongTP()
creation bytecode
0x60808060405234620000bd577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16620000ae57506001600160401b036002600160401b03198282160162000068575b604051615fda9081620000c38239f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a138808062000058565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806301a69331146101f75780630a21b1a1146101f25780630f373369146101ed578063119df25f146101e8578063177d154f146101e357806336fb8b15146101de5780633f21ea62146101d9578063410c0b7c146101d45780634f9a9e64146101cf57806356ac637e146101ca5780637b103999146101c55780638456cb59146101c0578063876d3abd146101bb5780638f062227146101b65780639a10cc32146101b1578063ae8421e1146101ac578063b187bd26146101a7578063b42a5bee146101a2578063b81bfa051461019d578063be9267be14610198578063bf1cc95114610193578063bf815d2e1461018e578063bffe348614610189578063c444e74614610184578063ca5eb5e11461017f578063d119af051461017a578063d550034c14610175578063e2441c0414610170578063f0ed38591461016b5763fc8b26981461016657600080fd5b61443b565b614417565b614048565b614024565b613493565b613403565b613010565b612fd1565b612fb3565b612f73565b612baf565b612b54565b612a06565b6129e1565b61296f565b612900565b612891565b612582565b6124f1565b6124c8565b611db8565b611a19565b6119e6565b6113aa565b61130b565b6112b2565b611285565b610a8f565b6103ac565b610266565b60043590600682101561020b57565b600080fd5b6001600160a01b0381160361020b57565b61ffff81160361020b57565b60ff81160361020b57565b634e487b7160e01b600052602160045260246000fd5b9190602083019260078210156102615752565b610238565b3461020b5760a036600319011261020b5761027f6101fc565b60243561028b81610210565b6044359161029883610221565b6064356102a48161022d565b6002546102c1906001600160a01b03165b6001600160a01b031690565b604051630d2020dd60e01b81526b074726164657355704b6565760a41b600482015290602090829060249082905afa90811561037b5760009161034c575b506001600160a01b031633036103305761032c936103209360843593614460565b6040519182918261024e565b0390f35b60405163432b6c8360e01b8152336004820152602490fd5b0390fd5b61036e915060203d602011610374575b61036681836144ac565b8101906144da565b386102ff565b503d61035c565b614509565b606090600319011261020b5760043561039881610221565b906024356103a58161022d565b9060443590565b3461020b576103ba36610380565b90916103c4615b6f565b81906103ce615016565b6002549094906103e6906001600160a01b03166102b5565b60408051630d2020dd60e01b80825290949260049160209182888061040c8782016144ef565b0381845afa97881561037b57600098610a70575b5084519182526001600160a01b039788169190839082908180610444898201614d81565b03915afa801561037b578891600091610a53575b5016918585516309ef0c9160e31b81528c818061047d8c6101209687958c85016146f2565b0381875afa91821561037b57600092610a26575b505060a081019a6104ae8c63ffffffff9182915163ffffffff1690565b1615610a095781156109f9576080830180519092906001600160a01b031660c08501936104fe6104fa6104e3875161ffff1690565b9360e08901946104f4865160ff1690565b91615aa3565b1590565b6109b557505061010084019489818c8b61054661051b8b51151590565b9451948593849363daf84c9f60e01b8552840190929160209061ffff60408401951683521515910152565b03818c5afa801561037b57828d8c61056d8f94889061059097600091610998575b50614daf565b9351948592839263e958d48960e01b8452830191909161ffff6020820193169052565b03818d5afa91821561037b57600092610969575b5011610959576105dc8f6105d4906105ce6105c58951925163ffffffff1690565b63ffffffff1690565b90615c99565b928651614daf565b926106026105fd6105f5866105f087614dc1565b614e2f565b612710900490565b615cbe565b9261061e61060f82614dc1565b61061887614dd9565b90614e3e565b610902575b509d9e9d60035484116108f2578e516106419063ffffffff166105c5565b9083169081109182159261086a575b50506108475763ffffffff168c528252833b1561020b578b6000858f6106888b519485938493633aa10bfd60e21b85528d8501614e97565b038183895af1801561037b57610834575b50833b1561020b5760006106bf928851809481926311729ded60e31b83528a8301614f3a565b038183885af190811561037b576106e9926106e292610821575b505161ffff1690565b9151151590565b833b1561020b57610732938b6000809489519788958694859363acfd174160e01b85528c8501606091949360019361ffff60808401971683526020830152151560408201520152565b03925af1801561037b5760e09386938c92610808575b5061076586519889958694859463543071318a1b865285016146f2565b03915afa90811561037b577fb8b06ffba533648c51873664083df052298f05b366a088e0c11b3c45b483f7c8946107b26107d49361ffff966000916107d9575b5051975163ffffffff1690565b9151948594169816968390929163ffffffff6020916040840195845216910152565b0390a4005b6107fb915060e03d60e011610801575b6107f381836144ac565b81019061480d565b386107a5565b503d6107e9565b8061081561081b92614494565b8061127a565b38610748565b8061081561082e92614494565b386106d9565b8061081561084192614494565b38610699565b88516335fe85c560e01b815263ffffffff90911681890190815281906020010390fd5b9091506108a2818c8c61087f895161ffff1690565b91519384928392635cdfa17560e01b8452830191909161ffff6020820193169052565b03818d5afa90811561037b5761ffff926000926108c5575b505016113880610650565b6108e49250803d106108eb575b6108dc81836144ac565b810190614e82565b38806108ba565b503d6108d2565b8a516380a71fc560e01b81528a90fd5b92819f509e9f9e61092a92945061091b61092191614e48565b93614df0565b90831690614e2f565b918451831160001461094957610941855184614e75565b9d9e38610623565b8951635863f78960e01b81528990fd5b895163236276f160e11b81528990fd5b61098a919250833d8511610991575b61098281836144ac565b810190614746565b90386105a4565b503d610978565b6109af9150863d88116109915761098281836144ac565b38610567565b5184918a91610348918d916109e3906109db906001600160a01b03165b965161ffff1690565b915160ff1690565b915163dd9397bb60e01b815294859485016146f2565b8751635863f78960e01b81528790fd5b8d876103488c8c8c519485946317e08e9760e01b865285016146f2565b610a459250803d10610a4c575b610a3d81836144ac565b8101906146dd565b3880610491565b503d610a33565b610a6a9150843d86116103745761036681836144ac565b38610458565b610a88919850833d85116103745761036681836144ac565b9638610420565b3461020b57606036600319011261020b5760048035610aad81610221565b602435610ab98161022d565b60443592610ac684610221565b610ace615b6f565b6002548490610ae5906001600160a01b03166102b5565b94604093845192630d2020dd60e01b94858552602090818680610b098482016144ef565b03818d5afa95861561037b5760009661125b575b508751878152996001600160a01b03968716979083908c908180610b42878201614d81565b03915afa9a8b1561037b5760009b61123c575b5061ffff610b61615016565b96169a612710808d1161122c57868c8c610b9c9d9e9f15611222575b516309ef0c9160e31b81529c610120928e92839291908d8a85016146f2565b03818d5afa9a8b1561037b5760009b6111ff575b5060a08b0163ffffffff610bc8825163ffffffff1690565b16156111e2578c5163f7b3c6fd60e01b81526001600160a01b038a1686820190815287908290819003602001818f5afa90811561037b57878f8e9089936000956111c3575b5051638049fde760e01b815292839182905afa801561037b5760ff91600091611196575b5016111561117157610c486104fa8f8a908c615aa3565b61115457908793929160e08f8f8c8f91610c758b91519e8f958694859463543071318a1b865285016146f2565b03915afa98891561037b57600099611133575b5060c08901516110f8578d8f88908f610cbb8f918d610cb5610cae6105f5935192614f60565b61ffff1690565b90614e06565b9561ffff8d1614159586958697611066575b505050505050611056578c8a928f8893610ef2575b5050600254919250610cfe916001600160a01b031690506102b5565b8c5192835282908180610d1288820161472f565b03915afa801561037b57610d6485918e8e8c95600093610ed0575b505163119608d160e11b815261ffff9091168782019081526001602082015242604082015290948593849260009291849160600190565b0393165af1998a1561037b578b928d9260009c610ea5575b5090610de2610deb9392610dd8610d9861010080950151151590565b946000610da3614515565b8181528b810182905298890152600060608901526001600160a01b038d166080890152600060a089015261ffff1660c0880152565b60ff1660e0860152565b83019015159052565b6000610df5614535565b8181529384015260008a840152606083015261ffff83166080830152863b1561020b57610e3c96600092838a938c519a8b958694859363e9f5cb9360e01b85528401614fdc565b03925af191821561037b577f955808f2a23e3a3fcfd1b56a9d3f3c2a9d90efb4701e855f40f3d4c416299960956107d493610e92575b5051965161ffff9889168152971660208801529116949081906040820190565b80610815610e9f92614494565b38610e72565b610deb9392919c50610ec6610de291883d8a116109915761098281836144ac565b9c91929350610d7c565b6000919350610eeb90863d88116103745761036681836144ac565b9290610d2d565b915163baceb00960e01b815261ffff90921687830190815291938492839003602001918391165afa801561037b576001600160401b0391600091611029575b5016893b1561020b578060008b808f8389610f608f935197889687958694633aa10bfd60e21b86528501614e97565b03925af1801561037b57611016575b50893b1561020b578b51635211337360e11b81526000818c818381610f9b888c83019190602083019252565b03925af1801561037b578a8f938f938c91610ff6917f180816fdaede3b97c34fb408fbf4568bc800ae0e67bb519f458a64f1f01e746095611003575b508c51955161ffff909716875260208701529116939081906040820190565b0390a387848c388f610ce2565b8061081561101092614494565b38610fd7565b8061081561102392614494565b38610f6f565b6110499150863d881161104f575b61104181836144ac565b810190614f74565b38610f31565b503d611037565b8c5163eca695e160e01b81528590fd5b6110af95965061108b91610cb56105c5611084935163ffffffff1690565b6064900490565b94518080958194636cefb4f960e11b83528d830191909161ffff6020820193169052565b039188165afa801561037b576001600160401b03916000916110db575b5016118d8f88908d3880610ccd565b6110f29150893d8b1161104f5761104181836144ac565b386110cc565b5088856103488f8f61111d60e061111460c084015161ffff1690565b92015160ff1690565b915163f77a806960e01b815294859485016146f2565b61114d91995060e03d60e011610801576107f381836144ac565b9738610c88565b50508a5163dd9397bb60e01b815280610348888f8b8489016146f2565b8c51632e09753160e11b81526001600160a01b038a1681870190815281906020010390fd5b6111b69150893d8b116111bc575b6111ae81836144ac565b810190614f4b565b38610c31565b503d6111a4565b6111db919550833d85116109915761098281836144ac565b9338610c0d565b50508a516317e08e9760e01b815280610348888f8b8489016146f2565b61121b919b506101203d61012011610a4c57610a3d81836144ac565b9938610bb0565b9297508792610b7d565b8a51635863f78960e01b81528490fd5b611254919b50833d85116103745761036681836144ac565b9938610b55565b611273919650823d84116103745761036681836144ac565b9438610b1d565b600091031261020b57565b3461020b57600036600319011261020b5760206112a0615016565b6040516001600160a01b039091168152f35b3461020b57608036600319011261020b576004356112cf81610210565b602435906112dc82610221565b6044356112e88161022d565b60643590600682101561020b5760209361130193615537565b6040519015158152f35b3461020b5760008060031936011261139d57338152602081905260408120546001600160a01b03908116156113855733600081815260208190526040902080546001600160a01b0319811690915591909116907fe8514dd4be968431135580c26314ec35afafc8178268603f99625584960d9c168380a380f35b604051632a91785960e01b8152336004820152602490fd5b80fd5b8015150361020b57565b3461020b57604036600319011261020b576113c66024356113a0565b6113ce615b6f565b6113d6615016565b6002546113eb906001600160a01b03166102b5565b60206040518092630d2020dd60e01b8252818061140a600482016144ef565b03915afa90811561037b576000916119c7575b5060405163b66e6b0560e01b81526004803590820152906101a080836024816001600160a01b0386165afa90811561037b57600093849385918693879561198b575b50506080830180516001600160a01b03161561197157516001600160a01b039081169088168103611946575063ffffffff6114a160a085015163ffffffff1690565b1661192d5785158015611905575b6118eb576001600160a01b0381163b1561020b57604051630195728b60e71b8152600480359082015260006024820181905281604481836001600160a01b0387165af1801561037b576118d8575b5061153560e061151260c086015161ffff1690565b8582015160ff169060405193849283926354307131861b84528d600485016146f2565b03816001600160a01b0386165afa90811561037b576000916118b9575b50519660006024356117fa575b15806117ea575b6115e7575b50506115a0906115936115b095611580614535565b9788526001600160c01b03166020880152565b63ffffffff166040860152565b606084015261ffff166080830152565b7f694566ffb8cbb40c48fcc198a6f284b3e21b4c79a0032ef9801bfa078781dd8d604051806115e26004359482615653565b0390a3005b6002549195909291611601906001600160a01b03166102b5565b60206040518092630d2020dd60e01b8252818061162060048201614d81565b03915afa90811561037b57611667916020916000916117cd575b5060c087015160405163baceb00960e01b815261ffff909116600482015292839190829081906024820190565b03916001600160a01b03165afa801561037b576001600160401b03916000916117ae575b5016906001600160a01b0387163b1561020b5760405163d0ae735360e01b815260048101839052600081602481836001600160a01b038d165af1801561037b5761179b575b506001600160a01b0387163b1561020b57604051633aa10bfd60e21b815296600090889081838161170f888b6001600160a01b03871660048501614e97565b03926001600160a01b03165af193841561037b57897fe23578987dc81cc630ca3edac7702ccf6951f6a27a1ad5eebfd82bed6bb15567611593946115b09a6115a098611788575b5060c08901516040805161ffff909216825260208201929092526001600160a01b039490941693a3955081925061156b565b8061081561179592614494565b38611756565b806108156117a892614494565b386116d0565b6117c7915060203d60201161104f5761104181836144ac565b3861168b565b6117e49150823d84116103745761036681836144ac565b3861163a565b5061271061ffff86161415611566565b5060008061180d60c087015161ffff1690565b8761185e61181f60e08a015160ff1690565b604051630f37336960e01b6020820190815261ffff958616602483015260ff9290921660448201529290931660648084019190915282526084826144ac565b5190305af461186b615614565b508061155f5761ffff61188360c087015161ffff1690565b166001600160a01b0383168a7fbd5738e36e4344b2090b101a9f2e7dcaf9f330207499752fa8d53bac83e8a733600080a461155f565b6118d2915060e03d60e011610801576107f381836144ac565b38611552565b806108156118e592614494565b386114fd565b604051633e0b186960e01b81526004803590820152602490fd5b5061190e615cee565b611927611921610cae60045461ffff1690565b88614daf565b116114af565b60405162c7fe4d60e81b81526004803590820152602490fd5b604051632d644fb160e11b815260048035908201526001600160a01b03919091166024820152604490fd5b6040516377d4f2df60e11b81526004803590820152602490fd5b935093509450506119b19250803d106119c0575b6119a981836144ac565b8101906155cb565b9193949293909192388061145f565b503d61199f565b6119e0915060203d6020116103745761036681836144ac565b3861141d565b3461020b57600036600319011261020b57602061ffff60045416604051908152f35b6001600160c01b0381160361020b57565b3461020b5760a036600319011261020b576004803590611a3882610221565b60243590611a458261022d565b60443592611a5284611a08565b60643590611a5f82611a08565b608435611a6b81611a08565b611a73615b6f565b6001600160c01b03868116939091908415611da757611a90615016565b600254909890611aa8906001600160a01b03166102b5565b966040978851978891630d2020dd60e01b835260209283918180611acd8882016144ef565b03915afa96871561037b578c99600098611d80575b50908291611b14938d8d8c60018060a01b03809d169e8f925198899485938493633d3aa41760e01b85528d85016146f2565b03915afa801561037b578e94600091611d53575b5015611d3757611b55858e8d8f8e9051809581948293634037cc4760e11b84526101809c8d9885016146f2565b03915afa94851561037b57600095611d08575b5050808716828115159182611ce1575b5050611cd1578716908115159182611caa575b5050611c9a57611b9f6104fa8c8a8f61502c565b611c7d576001600160c01b038416908201526001600160c01b038416818a01526001600160c01b0385166060820152873b1561020b57611bf697600092838b51809b819582946321900f2f60e11b84528301615761565b03925af193841561037b577f98ea8314653e032ef95264476f2ddc4b25ce0b46a0922eb44c1b9a2b36d22e599761ffff976115e296611c6a575b505160ff90991689526001600160c01b0391821660208a015291811660408901529091166060870152919092169416929081906080820190565b80610815611c7792614494565b38611c30565b8b836103488d8b8e5194859463dd9397bb60e01b865285016146f2565b8951630107f7af60e31b81528390fd5b909150611cbb610160850151151590565b15611cca5710155b3880611b8b565b1115611cc3565b8b51631483772360e31b81528590fd5b909150611cf2610160870151151590565b15611d015711155b8238611b78565b1015611cfa565b611d28929550803d10611d30575b611d2081836144ac565b81019061566f565b923880611b68565b503d611d16565b508a51630a35ee4760e41b8152806103488e8c87848a016146f2565b611d739150843d8611611d79575b611d6b81836144ac565b81019061471a565b38611b28565b503d611d61565b8392919850611d9e90611b14943d85116103745761036681836144ac565b97909192611ae2565b604051635863f78960e01b81528690fd5b3461020b57611dc636610380565b90611dcf615b6f565b81611dd8615016565b600254909190611df0906001600160a01b03166102b5565b91604093845195630d2020dd60e01b908188526020600492818a80611e168782016144ef565b03818b5afa998a1561037b5760009a6124a9575b5088518181526001600160a01b039a8b16939091838380611e4c898201614d81565b03818d5afa91821561037b57611e8e878f8f908f97918d978d9360009161248c575b5016975193849283926309ef0c9160e31b8452610120998a9685016146f2565b03818a5afa93841561037b5760009461246d575b505060a083019263ffffffff80611ebd865163ffffffff1690565b161561244e5782158015612443575b612433576080820180519095906001600160a01b03169260c0810193611f0b6104fa611efa875161ffff1690565b9260e08501936104f4855160ff1690565b61240f5750908f9291611f35611f2d82516105ce6105c5865163ffffffff1690565b968251614e75565b95611f5f611f4c6105fd6105f58a6105f086614dc1565b97610618611f5984614dc1565b91614dd9565b6123b6575b5050611f7b9d9e9d6105c58a925163ffffffff1690565b928b83871694851195861596612331575b50505050505061230e575083908b51998a9182528180611fad8a820161472f565b03915afa801561037b578c84918d9a6000916122f1575b508c5163119608d160e11b815261ffff90921688830190815260046020820152426040820152919d8e9283919082906060010392165a90600091f19a8b1561037b5760009b6122d2575b50612017614554565b8981526001600160a01b038816848201529061ffff8d16828c015260ff87166060830152843b1561020b578a5163051f701d60e31b815282518782019081526020808501516001600160a01b03169082015260408085015161ffff169082015260609384015160ff1693810193909352608083018d9052916000908390819060a001038183895af191821561037b576120bd926122bf575b50516001600160a01b031690565b833b1561020b57895163466f142160e11b81526001600160a01b0390911685820190815261ffff8d16602082015260ff871660408201526005606082015260009082908190608001038183885af1801561037b576121439284928e926122ac575b508b51808095819463baceb00960e01b83528a830191909161ffff6020820193169052565b03915afa90811561037b576001600160401b039260009261228f575b50501690803b1561020b578751633aa10bfd60e21b81526000818061218886868b8a8501614e97565b038183865af1801561037b5761227c575b50803b1561020b578751635211337360e11b81528381019283529160009083908190602001038183855af1801561037b5760e0938b938792612269575b506121f38a519687958694859463543071318a1b865285016146f2565b03915afa93841561037b577f1c0cf118aab947f20d864c6e401e5387f90a7cdcb5288a28adfe00c51622ed0e946107d49260009161224a575b5051955161ffff909816885260208801529116949081906040820190565b612263915060e03d60e011610801576107f381836144ac565b3861222c565b8061081561227692614494565b386121d6565b8061081561228992614494565b38612199565b6122a59250803d1061104f5761104181836144ac565b388061215f565b806108156122b992614494565b3861211e565b806108156122cc92614494565b386120af565b6122ea919b50833d85116109915761098281836144ac565b993861200e565b6123089150833d85116103745761036681836144ac565b38611fc4565b8b516335fe85c560e01b815263ffffffff90911681880190815281906020010390fd5b61236794959650612344905161ffff1690565b91519384928392630bdf25df60e01b8452830191909161ffff6020820193169052565b03818a5afa90811561037b57600091612389575b5016103880878f8b83611f8c565b6123a99150883d8a116123af575b6123a181836144ac565b81019061582b565b3861237b565b503d612397565b919f9e509192506123d3906123ca90614df0565b83861690614e2f565b90805182106000146123fe578f9291899151906123ef91614e75565b9d9e9050611f7b6105c5611f64565b508e51635863f78960e01b81528a90fd5b90508f91508a93945061034892506109e36109db6109d2895160018060a01b031690565b8d51635863f78960e01b81528990fd5b508151831015611ecc565b8f898f8c8e9361034892519485946317e08e9760e01b865285016146f2565b612484929450803d10610a4c57610a3d81836144ac565b913880611ea2565b6124a391508b3d8d116103745761036681836144ac565b38611e6e565b6124c1919a50823d84116103745761036681836144ac565b9838611e2a565b3461020b57600036600319011261020b576002546040516001600160a01b039091168152602090f35b3461020b5760008060031936011261139d5760025460405163481c6a7560e01b81526001600160a01b03916020908290600490829086165afa90811561037b578391612563575b5016330361254b57612548615840565b80f35b604051632a19e83360e01b8152336004820152602490fd5b61257c915060203d6020116103745761036681836144ac565b38612538565b3461020b57602036600319011261020b5760048035906125a0615b6f565b6125a8615016565b6002546125bd906001600160a01b03166102b5565b6040602081518093630d2020dd60e01b825281806125dc8982016144ef565b03915afa91821561037b57600092612870575b50805163b66e6b0560e01b81528481018681526101a09591946001600160a01b03949092908516918790879081906020010381855afa92831561037b5760009586978799889661283e575b505060808501805182166001600160a01b03161561282357516001600160a01b031690808316908216036127f7575063ffffffff61267f60a086015163ffffffff1690565b16156127dc57851515806127bb575b6127a057823b1561020b578451630195728b60e71b81528281018a81526001602082015260009082908190604001038183885af1801561037b5761278d575b50835192803b1561020b5780600080946126fa895197889687958694633aa10bfd60e21b86528501614e97565b03925af195861561037b576127536127759661275f937f9c127206e31d97e5fa689ebad18a4faad9c6e4b77e94cbd5f82e87400d360ad79961277a575b50612740614535565b9687526001600160c01b03166020870152565b63ffffffff1684840152565b6060830152600060808301525191829182615653565b0390a2005b8061081561278792614494565b38612737565b8061081561279a92614494565b386126cd565b8451633e0b186960e01b81528083018a815281906020010390fd5b506127c4615cee565b6127d6611921610cae855461ffff1690565b1161268e565b8451631add091560e01b81528083018a815281906020010390fd5b8551632d644fb160e11b81528084018b81526001600160a01b0390921660208301529081906040010390fd5b86516377d4f2df60e11b81528085018c815281906020010390fd5b929750929750935061285d929750803d106119c0576119a981836144ac565b509792969195909695969793388061263a565b61288a91925060203d6020116103745761036681836144ac565b90386125ef565b3461020b57600036600319011261020b57602060ff60045460281c166040519015158152f35b6020808252825181830181905290939260005b8281106128ec57505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016128ca565b3461020b57604036600319011261020b5760043561291d81610210565b6024356001600160401b0380821161020b573660238301121561020b57816004013590811161020b57366024828401011161020b5761032c9260246129639301906158a2565b604051918291826128b7565b3461020b57600036600319011261020b57612988615d63565b7fc3a6f986261de9467c2838c6df8ef74f9107855159205600c0bc7a14cdfd3888602060045465ff000000000060ff8260281c161560281b169065ff00000000001916178060045560ff6040519160281c1615158152a1005b3461020b57600036600319011261020b57602060045460ff60405191831c1615158152f35b3461020b57608036600319011261020b57600435612a2381610210565b60443590612a3082610221565b606435612a3c81610221565b600080516020615f8583398151915254926001600160401b0360ff8560401c1615941680159081612b4c575b6001149081612b42575b159081612b39575b50612b2757600080516020615f85833981519152805467ffffffffffffffff19166001179055612ab39284612b02575b60243590615967565b612ab957005b600080516020615f85833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b600080516020615f85833981519152805460ff60401b1916600160401b179055612aaa565b60405163f92ee8a960e01b8152600490fd5b90501538612a7a565b303b159150612a72565b859150612a68565b3461020b57602036600319011261020b57612b6d615d63565b612b78600435615e7f565b005b606090600319011261020b57600435612b9281610221565b90602435612b9f8161022d565b90604435612bac81611a08565b90565b3461020b57612bbd36612b7a565b91612bc6615b6f565b612bce615016565b600254909390612be6906001600160a01b03166102b5565b604092835192630d2020dd60e01b84526020846004948180612c098882016144ef565b03915afa93841561037b57600094612f52575b506001600160a01b0393841692612c376104fa88858b61517c565b612f355785516309ef0c9160e31b815261012090818180612c5c8c898f8985016146f2565b0381895afa91821561037b57600092612f18575b505060a0810163ffffffff80612c8a835163ffffffff1690565b1615612efd578594939291612cb8918c8c8c51809581926329f4050b60e11b835260e09b8c958b85016146f2565b03818c5afa92831561037b57600093612ebd575b50612d2191612d15916020860194612d00612cf5612cf0885160018060c01b031690565b615a08565b935163ffffffff1690565b8083168284161115612eb657505b1690615a52565b6001600160c01b031690565b6001600160c01b0385168015159390929084612e48575b50505050612e3a57843b1561020b57876000858b612d69868c51958694859463d8f1f38960e01b8652898601615a6a565b0381838a5af195861561037b578a859387938c99612e27575b50612da08b51998a9586948594635430713160e01b865285016146f2565b03915afa94851561037b577f9b366191a0c4e7c25058a6d889cd01c574bcea6e4e9adae8b3d1137feee2e30a9561ffff956107d494600092612e0a575b505051965160ff90981688526001600160c01b039091166020880152919092169516939081906040820190565b612e209250803d10610801576107f381836144ac565b3880612ddd565b80610815612e3492614494565b38612d82565b8651631483772360e31b8152fd5b6101000151929350909115612e7f5751612e749190612e6f906001600160c01b0316612d15565b614daf565b105b38808080612d38565b51612e92906001600160c01b0316612d15565b9081811015612eac57612ea491614e75565b905b10612e76565b5050600090612ea6565b9050612d0e565b612d1591935091612ee6612d2193893d8b11612ef6575b612ede81836144ac565b8101906159ab565b5050505091505093915091612ccc565b503d612ed4565b88516317e08e9760e01b8152806103488c898f848a016146f2565b612f2e9250803d10610a4c57610a3d81836144ac565b3880612c70565b87906103488885895194859463dd9397bb60e01b865285016146f2565b612f6c91945060203d6020116103745761036681836144ac565b9238612c1c565b3461020b57606036600319011261020b576020611301600435612f9581610210565b602435612fa181610221565b60443591612fae8361022d565b615aa3565b3461020b57600036600319011261020b576020600354604051908152f35b3461020b57602036600319011261020b576020600435612ff081610210565b60018060a01b038091166000526000825260406000205416604051908152f35b3461020b5760408060031936011261020b5760049081359061303182610221565b6024359161303e8361022d565b613046615b6f565b61304e615016565b600254909190613066906001600160a01b03166102b5565b9483519384630d2020dd60e01b97888252602091829181806130898882016144ef565b03915afa95861561037b576000966133e4575b508151633d3aa41760e01b81526001600160a01b0396871691908181806130c78c8a8c8b85016146f2565b0381865afa90811561037b576000916133c7575b50156133ac576130ef6104fa89878961502c565b613391578251634037cc4760e11b81529798610180988981806131168e8b8d8c85016146f2565b0381875afa998a1561037b5760009a613372575b5050823b1561020b5783516304d8c22960e01b8152600081806131518e8b8d8c85016146f2565b038183885af1801561037b5761335f575b50600254829061317a906001600160a01b03166102b5565b85519283528290818061318e8a8201614d81565b03915afa90811561037b57600091613342575b50818451809263baceb00960e01b8252818b816131cb8c8c830191909161ffff6020820193169052565b0392165afa90811561037b576001600160401b0392600092613325575b505016965187811160001461331e578761320191614e75565b813b1561020b57600061322891845180938192633aa10bfd60e21b83528a878a8501614e97565b038183865af1801561037b5761330b575b505b803b1561020b578151635211337360e11b8152928301878152600091849182908490829060200103925af195861561037b577e583880eb0c4f71add4ccec8c11dbaf78d0562ffd31a56741007f63010a9ffe7faf0078fc6c9ab6530300cd0b84ca36d3044534d9373536a0d877062d8e6f92049661ffff966115e2956132e09a6132f8575b50845161ffff881681526020810194909452169788929081906040820190565b0390a25160ff90961686529116939081906020820190565b8061081561330592614494565b386132c0565b8061081561331892614494565b38613239565b965061323b565b61333b9250803d1061104f5761104181836144ac565b38806131e8565b6133599150823d84116103745761036681836144ac565b386131a1565b8061081561336c92614494565b38613162565b613389929a50803d10611d3057611d2081836144ac565b97388061312a565b825163dd9397bb60e01b8152806103488a888a848a016146f2565b8251630a35ee4760e41b8152806103488a888a848a016146f2565b6133de9150823d8411611d7957611d6b81836144ac565b386130db565b816133fc9297503d88116103745761036681836144ac565b943861309c565b3461020b57602036600319011261020b5760043561342081610210565b6001600160a01b031680156134775733600081815260208190526040812080546001600160a01b0319168417905591907f12dade473695d73bd34e031c850d5e815fa17a42b1b5ba13ff72de2497c5e3098380a380f35b6040516379e8589360e11b8152600490fd5b6003111561020b57565b3461020b57610160366003190181811261020b5761012080911261020b57610124356134be81613489565b610144356134ca615b6f565b6134d2615c78565b6134e660c4356134e181610221565b615b90565b6134ee615016565b9381158015614018575b8015614000575b613fee57600254613518906001600160a01b03166102b5565b60408051630d2020dd60e01b8082529095919360049392602092838980613540898201614d81565b0381885afa98891561037b57600099613fcf575b5086518181526001600160a01b03998a16958590829081806135778c82016144ef565b03915afa801561037b578a91600091613fb2575b5016976135d1858d61359b615b1a565b8b516379b0468960e11b81526001600160a01b039092168b830190815261ffff9091166020820152909283918291604090910190565b03818d5afa801561037b57868a8f938d90600094613f91575b5061362e93948c6135f9615b1a565b935163e71f8f4b60e01b81526001600160a01b0390921690820190815261ffff90931660208401529384928391829160400190565b03915afa801561037b578a8f92613659613698958f928c9560ff91600091613f7a575b501690614e5d565b938c613663615b1a565b935163c55ef9b160e01b81526001600160a01b0390921690820190815261ffff90931660208401529485928391829160400190565b03915afa91821561037b576136b99260ff91600091613f5d57501690614e5d565b8851637b2ecedf60e11b815286818a818e5afa91821561037b5760ff928f92600091613f40575b5063ffffffff93169083161015613f0557895163f7b3c6fd60e01b81526001600160a01b039190911689820190815287908290819003602001818e5afa90811561037b57600091613ee8575b508951638049fde760e01b815287818b818f5afa801561037b5760ff91600091613ecb575b50161115613ea65780613762615b4a565b1615908115613e2a575b8115613db2575b50613d83578635956003548711613d73576137cf8661379f6110846137996105c5615b4a565b8b614e06565b926137a8615b1a565b8c51636cefb4f960e11b815261ffff909116818d0190815290938492918391829160200190565b03915afa801561037b576001600160401b0391600091613d56575b501611613d46576001600160c01b0380613802615b32565b16151580613cfe575b613cee5761381a612d15615b3e565b15159081613ca3575b50613c9357883b1561020b578560008a808f838c6138548f5197889687958694633aa10bfd60e21b86528501614e97565b03925af1801561037b57613c80575b5061386d8361574a565b8215613a525750506138b69883613882615b1a565b8851630f1d5a9760e31b81526001600160a01b038e1689820190815261ffff90921660208301529b8c918291604090910190565b03818b5afa998a1561037b5760009a613a33575b506138d3615cee565b6138dc90615cbe565b6138e4615b26565b906138ed615b32565b6138f5615b3e565b6138fd615b4a565b91613906615b1a565b9461390f615b56565b99613918614573565b9b8c526001600160c01b03909116908b01526001600160c01b0316898c01526001600160c01b031660608901526001600160a01b038e16608089015263ffffffff1660a088015263ffffffff811660c088015263ffffffff1660e087015261ffff1661010086015284019061398c91615b63565b60ff881661014084015290151590820152833b1561020b576139c5936000928385518097819582946339514f4b60e21b84528301615761565b03925af1801561037b577fc5bd5ba70b0fccae9ac4984c1b7e09d0eb00930a72e0712688fc62b4ae70ebc59361ffff936115e292613a20575b50613a07615b1a565b9251938493169616948291909160ff6020820193169052565b80610815613a2d92614494565b386139fe565b613a4b919a50843d86116111bc576111ae81836144ac565b98386138ca565b92509798505081613a716102b56002989594985460018060a01b031690565b865198895288908180613a8589820161472f565b03915afa801561037b57613add87918a99600091613c63575b50613aa7615b1a565b600089519c8d8095819463119608d160e11b835242908d84016040909392919361ffff6060820195168152600060208201520152565b0393165af197881561037b57600098613c44575b50613afa615b26565b90613b0490615cbe565b90613b0d615b32565b613b15615b3e565b613b1d615b4a565b613b25615b1a565b91613b2e615b56565b93613b37614515565b97885260008c8901526001600160c01b03168a8801526001600160c01b031660608701526001600160a01b038d16608087015263ffffffff1660a086015261ffff1660c0850152600060e08501521515610100840152613b95614535565b600081526001600160c01b039091169681019690965263ffffffff1685850152606085015260006080850152803b1561020b57613beb93600087938195519687958694859363e9f5cb9360e01b85528401614ffe565b03925af1801561037b57613c31575b5061ffff613c06615b1a565b169216907ffb4a26aa34682aa753cb2aa37ef1bc38eee1af6719db3a8cfe892c50406ea0e0600080a4005b80610815613c3e92614494565b38613bfa565b613c5c919850863d88116109915761098281836144ac565b9638613af1565b613c7a9150833d85116103745761036681836144ac565b38613a9e565b80610815613c8d92614494565b38613863565b8751630107f7af60e31b81528790fd5b9050613cad615b56565b15613cd157613cba615b3e565b90613cc6612d15615b26565b911610155b38613823565b613cd9615b3e565b90613ce5612d15615b26565b91161115613ccb565b8851631483772360e31b81528890fd5b50613d07615b56565b15613d2957613d14615b32565b81613d20612d15615b26565b9116111561380b565b613d31615b32565b81613d3d612d15615b26565b9116101561380b565b875163eca695e160e01b81528790fd5b613d6d9150883d8a1161104f5761104181836144ac565b386137ea565b88516380a71fc560e01b81528890fd5b8787610348613d90615b4a565b92516335fe85c560e01b815263ffffffff909316918301918252829160200190565b9050613dbc615b4a565b90613ded87613dc9615b1a565b8b8d519384928392630bdf25df60e01b8452830191909161ffff6020820193169052565b03818c5afa801561037b578291600091613e0d575b501691161138613773565b613e249150893d8b116123af576123a181836144ac565b38613e02565b9050613e34615b4a565b613e6487613e40615b1a565b8b8d519384928392635cdfa17560e01b8452830191909161ffff6020820193169052565b03818c5afa90811561037b57839161ffff91600091613e89575b50169116109061376c565b613ea091508a3d8c116108eb576108dc81836144ac565b38613e7e565b8851632e09753160e11b81526001600160a01b038e16818a0190815281906020010390fd5b613ee29150893d8b116111bc576111ae81836144ac565b38613751565b613eff9150873d89116109915761098281836144ac565b3861372c565b886103488b613f12615b1a565b905163e6f47fab60e01b81526001600160a01b0390941692840192835261ffff166020830152829160400190565b613f579150893d8b116111bc576111ae81836144ac565b386136e0565b613f749150893d8b116111bc576111ae81836144ac565b38613651565b613f749150873d89116111bc576111ae81836144ac565b61362e9450613fac90843d86116123af576123a181836144ac565b936135ea565b613fc99150863d88116103745761036681836144ac565b3861358b565b613fe7919950843d86116103745761036681836144ac565b9738613554565b604051635863f78960e01b8152600490fd5b506001600160c01b03614011615b26565b16156134ff565b506127108210156134f8565b3461020b57602036600319011261020b5761403d615d63565b612b78600435615e48565b3461020b5761405636612b7a565b61405e615b6f565b600254614073906001600160a01b03166102b5565b6040918251630d2020dd60e01b928382526020906004908284806140988582016144ef565b0381845afa95861561037b5789946000976143f8575b506001600160a01b03968716936140d16104fa8b6140ca615016565b9d8e61523c565b6143dd57908592916140fc8c8c8c51809381926309ef0c9160e31b8352610120998a958c85016146f2565b03818a5afa94851561037b576000956143be575b505060a084019163ffffffff61412a845163ffffffff1690565b16156143a15781908b51948591825281806141578a8201906863616c6c6261636b7360b81b602083019252565b03915afa92831561037b5789938291600091614384575b50868c5180968193636c4dd9ef60e01b8352165afa92831561037b5760009361434f575b506141d2916141cc6105c56141c1612d159488019660ff6141b9895160018060c01b031690565b911690615a2c565b925163ffffffff1690565b90615a52565b6001600160c01b0387168015159390929190846142f8575b505050506142ea57813b1561020b5785516352c2c59d60e11b815260008180614218888c898f898601615a6a565b038183875af192831561037b578960e09386938b966142d7575b5061424f8a519687958694859463543071318a1b865285016146f2565b03915afa92831561037b577f2a0cf479e0dd902b509864ced4798e3fe7cd156160ced3e2b995f7e4fc658e6a9461ffff946107d4936000916142b8575b5051965160ff90981688526001600160c01b039091166020880152919092169516939081906040820190565b6142d1915060e03d60e011610801576107f381836144ac565b3861428c565b806108156142e492614494565b38614232565b8551630107f7af60e31b8152fd5b61010001519293509091156143305790516143259190614320906001600160c01b0316612d15565b614e75565b115b388080806141ea565b90516143499190612e6f906001600160c01b0316612d15565b10614327565b819350916141cc6105c56141c16143786141d296612d15963d8a116111bc576111ae81836144ac565b96945050505091614192565b61439b9150823d84116103745761036681836144ac565b3861416e565b8c866103488e8b8f519485946317e08e9760e01b865285016146f2565b6143d5929550803d10610a4c57610a3d81836144ac565b923880614110565b885163dd9397bb60e01b8152806103488c898f848a016146f2565b614410919750843d86116103745761036681836144ac565b95386140ae565b3461020b57602036600319011261020b57614430615d63565b612b78600435615dda565b3461020b57600036600319011261020b57602061ffff60045460101c16604051908152f35b90612bac94939291614470615b6f565b61447983615b90565b6148bb565b634e487b7160e01b600052604160045260246000fd5b6001600160401b0381116144a757604052565b61447e565b90601f801991011681019081106001600160401b038211176144a757604052565b51906144d882610210565b565b9081602091031261020b5751612bac81610210565b6d74726164696e6753746f7261676560901b815260200190565b6040513d6000823e3d90fd5b6040519061012082018281106001600160401b038211176144a757604052565b6040519060a082018281106001600160401b038211176144a757604052565b60405190608082018281106001600160401b038211176144a757604052565b6040519061018082018281106001600160401b038211176144a757604052565b6040519061012082018281106001600160401b038211176144a757604052816101006000918281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201520152565b6006111561026157565b51906144d882611a08565b63ffffffff81160361020b57565b51906144d8826145fe565b51906144d882610221565b51906144d88261022d565b51906144d8826113a0565b91908261012091031261020b5761464d614515565b918051835261465e602082016145f3565b602084015261466f604082016145f3565b6040840152614680606082016145f3565b6060840152614691608082016144cd565b60808401526146a260a0820161460c565b60a08401526146b360c08201614617565b60c08401526146c460e08201614622565b60e08401526146d761010080920161462d565b90830152565b906101208282031261020b57612bac91614638565b6001600160a01b03909116815261ffff909116602082015260ff909116604082015260600190565b9081602091031261020b5751612bac816113a0565b6a383934b1b2a937baba32b960a91b815260200190565b9081602091031261020b575190565b939291909361ffff606082019516815260058210156102615760409160208201520152565b60068210156102615752565b9060068210156102615752565b81516001600160a01b0316815260208083015161ffff169082015260408083015160ff169082015260609182015160a08201949392608092916147d891830190614786565b0152565b60ff6144d89461ffff606094989795608085019960018060a01b031685521660208401521660408201520190614786565b908160e091031261020b576040519060e082018281106001600160401b038211176144a7576148989160c09160405280518452602081015160208501526040810151614858816145fe565b6040850152606081015161486b816145fe565b606085015261487c6080820161460c565b608085015261488d60a0820161460c565b60a08501520161462d565b60c082015290565b9160206144d892949361ffff60408201961681520190614786565b600254919492916148d4906001600160a01b03166102b5565b90604090815194630d2020dd60e01b908187526020966004918882806148fb8682016144ef565b03818a5afa96871561037b578b92600098614d62575b506001600160a01b0397881694614926614593565b50614930876145e9565b8b8b8b60038a149687600014614c4f5761495c8c519485938493633d3aa41760e01b85528c85016146f2565b03818a5afa90811561037b57600091614c32575b5015614c205761498f6104fa888f8f908e9061498a615c78565b615537565b614c0e578a908851928391825281806149a989820161472f565b03915afa91821561037b576149f4928b92600091614bf1575b506149cc886145e9565b8415614bea5760025b60008b8d8c519788968795869363119608d160e11b85528d8501614755565b0393165af198891561037b578b9160009a614bc5575b5088614a3591614a2a614a1b614554565b6001600160a01b039095168552565b83019061ffff169052565b60ff8a1681870152614a4a856060830161477a565b833b1561020b57600089614a719288519384928392633842b7f360e01b8452888401614793565b038183885af1801561037b57614bb2575b50823b1561020b57886000888c614aac888a51958694859463466f142160e11b86528a86016147dc565b038183885af1801561037b57614b9f575b50614ac7846145e9565b15614b11575050905160ff90951685525061ffff9091169316917f3cd9ed48c68d147bd6b2b5f1a2b4d1e35a97350e6638f3dc33c25cc9ddec22d49080602081015b0390a4600690565b9460e0918985999497614b38849c97519687958694859463543071318a1b865285016146f2565b03915afa93841561037b577ff030e9b57a795e81643655654d5c84ed0f2838ad8c91768b1280b1e41425ec1094614b0992600091614b80575b505196519384931697836148a0565b614b99915060e03d60e011610801576107f381836144ac565b38614b71565b80610815614bac92614494565b38614abd565b80610815614bbf92614494565b38614a82565b819a50614be28a91614a35938d3d106109915761098281836144ac565b9a9150614a0a565b60036149d5565b614c089150833d85116103745761036681836144ac565b386149c2565b50505050505050505050505050600090565b50505050505050505050505050600290565b614c4991508c8d3d10611d7957611d6b81836144ac565b38614970565b9092614c7492508b51809381926309ef0c9160e31b83526101209687958d85016146f2565b03818b5afa91821561037b57600092614d45575b505063ffffffff614ca060a083015163ffffffff1690565b1615614d3257614caf886145e9565b6001881480614d1d575b614d0c57614cc6886145e9565b87159081614cf7575b50614ce55761498f6104fa888f8f908e90615537565b50505050505050505050505050600590565b8901516001600160c01b031615905038614ccf565b505050505097505050505050505090565b5060608101516001600160c01b031615614cb9565b5050505050505050505050505050600390565b614d5b9250803d10610a4c57610a3d81836144ac565b3880614c88565b614d7a9198508a3d8c116103745761036681836144ac565b9638614911565b6b706169727353746f7261676560a01b815260200190565b634e487b7160e01b600052601160045260246000fd5b91908201809211614dbc57565b614d99565b90620f424091828102928184041490151715614dbc57565b9061271091828102928184041490151715614dbc57565b90606482029180830460641490151715614dbc57565b81810292918115918404141715614dbc57565b634e487b7160e01b600052601260045260246000fd5b8115614e39570490565b614e19565b8115614e39570690565b90600163ffffffff80931601918211614dbc57565b91909163ffffffff80809416911601918211614dbc57565b91908203918211614dbc57565b9081602091031261020b5751612bac81610221565b6001600160a01b03918216815291166020820152604081019190915260600190565b805182526020808201516001600160c01b0390811691840191909152604080830151821690840152606080830151909116908301526080808201516001600160a01b03169083015260a08082015163ffffffff169083015260c08082015161ffff169083015260e08082015160ff1690830152610100908101511515910152565b610120810192916144d89190614eb9565b9081602091031261020b5751612bac8161022d565b9061ffff80921661271003918211614dbc57565b9081602091031261020b57516001600160401b038116810361020b5790565b61ffff6080610180928051855260018060c01b03602082015116602086015263ffffffff6040820151166040860152614fd460608201516060870190614eb9565b015116910152565b6101c0906000929493614ff4826101e0810197614f93565b6101a08201520152565b6101c0906001929493614ff4826101e0810197614f93565b6001546001600160a01b031680612bac57503390565b60025491929091615045906001600160a01b03166102b5565b604051630d2020dd60e01b815260209490929185908490818061506a600482016144ef565b03915afa90811561037b576150cd94869460009361515d575b506040516320281d7960e21b81526001600160a01b03909116600482015261ffff909116602482015260ff9092166044830152600360648301529092839190829081906084820190565b03916001600160a01b03165afa91821561037b57600092615140575b505080159081159081615107575b505061510257600090565b600190565b90915081615118575b5038806150f7565b6151259150614320615cee565b6004546151389060101c61ffff16610cae565b111538615110565b6151569250803d106109915761098281836144ac565b38806150e9565b615175919350853d87116103745761036681836144ac565b9138615083565b60025491929091615195906001600160a01b03166102b5565b604051630d2020dd60e01b81526020949092918590849081806151ba600482016144ef565b03915afa90811561037b576150cd94869460009361521d575b506040516320281d7960e21b81526001600160a01b03909116600482015261ffff909116602482015260ff9092166044830152600060648301529092839190829081906084820190565b615235919350853d87116103745761036681836144ac565b91386151d3565b60025491929091615255906001600160a01b03166102b5565b604051630d2020dd60e01b815260209490929185908490818061527a600482016144ef565b03915afa90811561037b576150cd9486946000936152dd575b506040516320281d7960e21b81526001600160a01b03909116600482015261ffff909116602482015260ff9092166044830152600160648301529092839190829081906084820190565b6152f5919350853d87116103745761036681836144ac565b9138615293565b60025491929091615315906001600160a01b03166102b5565b604051630d2020dd60e01b815260209490929185908490818061533a600482016144ef565b03915afa90811561037b576150cd94869460009361539d575b506040516320281d7960e21b81526001600160a01b03909116600482015261ffff909116602482015260ff9092166044830152600260648301529092839190829081906084820190565b6153b5919350853d87116103745761036681836144ac565b9138615353565b600254919290916153d5906001600160a01b03166102b5565b604051630d2020dd60e01b81526020949092918590849081806153fa600482016144ef565b03915afa90811561037b576150cd948694600093615458575b50604051958694859384936320281d7960e21b85526004850160ff606092959461ffff600495608085019860018060a01b031685521660208401521660408201520152565b615470919350853d87116103745761036681836144ac565b9138615413565b60025491929091615490906001600160a01b03166102b5565b604051630d2020dd60e01b81526020949092918590849081806154b5600482016144ef565b03915afa90811561037b576150cd948694600093615518575b506040516320281d7960e21b81526001600160a01b03909116600482015261ffff909116602482015260ff9092166044830152600560648301529092839190829081906084820190565b615530919350853d87116103745761036681836144ac565b91386154ce565b6002549193929091615551906001600160a01b03166102b5565b604051630d2020dd60e01b8152602095909391869085908180615576600482016144ef565b03915afa91821561037b5786946000936155ac575b506150cd604051968795869485946320281d7960e21b8652600486016147dc565b6155c4919350853d87116103745761036681836144ac565b913861558b565b91906101a08382031261020b5782519260208101516155e981611a08565b9261018061560860408401516155fe816145fe565b9460608501614638565b920151612bac81610221565b3d1561564e573d906001600160401b0382116144a75760405191615642601f8201601f1916602001846144ac565b82523d6000602084013e565b606090565b6101a0810192916144d89190614f93565b51906144d882613489565b908161018091031261020b57615683614573565b9080518252615694602082016145f3565b60208301526156a5604082016145f3565b60408301526156b6606082016145f3565b60608301526156c7608082016144cd565b60808301526156d860a0820161460c565b60a08301526156e960c0820161460c565b60c08301526156fa60e0820161460c565b60e083015261010061570d818301614617565b9083015261012061571f818301615664565b90830152610140615731818301614622565b9083015261574361016080920161462d565b9082015290565b6003111561026157565b9060038210156102615752565b815181526020808301516001600160c01b031690820152610180810192916144d891906040818101516001600160c01b0316908301526060818101516001600160c01b0316908301526080818101516001600160a01b03169083015260a08181015163ffffffff169083015260c08181015163ffffffff169083015260e08181015163ffffffff16908301526101008181015161ffff169083015261580f6101208083015190840190615754565b6101408181015160ff1690830152610160908101511515910152565b9081602091031261020b5751612bac816145fe565b7f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2602060045464ff0000000060ff82841c1615831b169064ff000000001916178060045560ff60405191831c1615158152a1565b908092918237016000815290565b6001600160a01b038181166000908152602081905260409020543391160361593e57600180546001600160a01b0319166001600160a01b0390921691909117905560009182916158f760405180938193615894565b0390305af4615904615614565b901561591d57600180546001600160a01b031916905590565b80511561592c57602081519101fd5b604051632df2c3c560e11b8152600490fd5b60405163502b946d60e01b81526001600160a01b03919091166004820152336024820152604490fd5b909291906001600160a01b03168015613fee576144d8936159a59160018060a01b031960025416176002556159a061ffff809516615dda565b615e48565b16615e7f565b908160e091031261020b5780519160208201519160408101516159cd816145fe565b9160608201516159dc816145fe565b9160808101516159eb816145fe565b9160c060a08301516159fc816145fe565b920151612bac816113a0565b6001600160c01b0390811661038481810290921692918184041490151715614dbc57565b6001600160c01b03918216908216818102909216929180159084049091141715614dbc57565b6001600160c01b0391821691908215614e3957160490565b6001600160a01b03909116815261ffff91909116602082015260ff90911660408201526001600160c01b03909116606082015260800190565b9190615ab082828561517c565b9283615b07575b83615af4575b83615ae1575b83615acf575b50505090565b615ad99350615477565b388080615ac9565b9250615aee8282856153bc565b92615ac3565b9250615b018282856152fc565b92615abd565b9250615b1482828561523c565b92615ab7565b60c435612bac81610221565b602435612bac81611a08565b604435612bac81611a08565b606435612bac81611a08565b60a435612bac816145fe565b61010435612bac816113a0565b60038210156102615752565b60ff60045460281c16615b7e57565b60405163084986e760e01b8152600490fd5b600254615ba5906001600160a01b03166102b5565b604051630d2020dd60e01b8152602091829082908180615bc760048201614d81565b03915afa90811561037b57600091615c5b575b5060405163320de1bd60e11b815261ffff84166004820152908290829060249082906001600160a01b03165afa91821561037b57600092615c3e575b505015615c205750565b6040516365c3dbb160e11b815261ffff919091166004820152602490fd5b615c549250803d10611d7957611d6b81836144ac565b3880615c16565b615c729150823d84116103745761036681836144ac565b38615bda565b60ff60045460201c16615c8757565b604051631309a56360e01b8152600490fd5b90606490615ca78184615edd565b9209615cb05790565b60018101809111614dbc5790565b63ffffffff90818111615ccf571690565b604490604051906306dfcc6560e41b8252602060048301526024820152fd5b61a4b146148015615d57575b8015615d4b575b615d09574390565b60405163a3b1b31d60e01b815260208160048160645afa90811561037b57600091615d32575090565b612bac915060203d6020116109915761098281836144ac565b5062066eee4614615d01565b5062066eed4614615cfa565b6002546040516312d43a5160e01b81526001600160a01b03916020908290600490829086165afa90811561037b57600091615dbb575b50163303615da357565b60405163093650d560e01b8152336004820152602490fd5b615dd4915060203d6020116103745761036681836144ac565b38615d99565b80158015615e3d575b613fee576020615e137fdd556fee81cf6944e242027e8ff6720bda1e5affad547357ca8432462f4774d492615f56565b63ffff00006004549160101b169063ffff00001916178060045561ffff6040519160101c168152a1565b5061ffff8111615de3565b8015613fee576020817fd0c89dcfa86f41bdd4a097393efdb1ecf04642dd0c11f7c4a55a193a0839e4f292600355604051908152a1565b80158015615ed2575b613fee57602061ffff615ebb7f47516ce78787067febcd937da9fd9f838590230927f22070ca4b3b37189a534293615f56565b168061ffff196004541617600455604051908152a1565b5061ffff8111615e88565b8082029060001983820990828083109203918083039214615f4c578160641115615f3a577f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29936064910990828211900360fe1b910360021c170290565b60405163227bc15360e01b8152600490fd5b5050606491500490565b61ffff90818111615f65571690565b604490604051906306dfcc6560e41b8252601060048301526024820152fdfef0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220cba3a258a9cc576ce0856ac88c3cde08460e7d7874ca938cfd67ae67c39556fe64736f6c63430008180033