42 txs
388 calls
constructor
constructor(address poolManager_, address permit2_, address feeRecipient_)
functions
adminSafe
viewfunction adminSafe() view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
deferredExecutions
viewfunction deferredExecutions(bytes32, bytes32) view returns (int24 fromTick, int24 toTick)
deferredPayments
viewfunction deferredPayments(bytes32) view returns (address currency, uint256 amount, address to, uint256 nonce, uint8 reason)
feeRecipient
viewfunction feeRecipient() view returns (address)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
maximumExecutionCount
viewfunction maximumExecutionCount() view returns (uint256)
ordersAtTick
viewfunction ordersAtTick(bytes32 poolId, int24 tick) view returns (uint32)
pendingOrder
viewfunction pendingOrder(bytes32 poolId, uint32 orderId) view returns (tuple)
pendingOrders
viewfunction pendingOrders(bytes32, uint32) view returns (address owner, bool zeroForOne, int24 tickLower, int24 tickUpper, uint256 liquidity, bool enablePartialFill)
poolManager
viewfunction poolManager() view returns (address)
poolWhitelist
viewfunction poolWhitelist(bytes32) view returns (bool)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
cancelOrder
nonpayablefunction cancelOrder(tuple params)
createOrder
nonpayablefunction createOrder(tuple params) returns (uint32 orderId)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
movePoolTick
nonpayablefunction movePoolTick(tuple poolKey, int24 fromTick, int24 toTick, uint160 sqrtPriceX96)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address account)
rescueToken
nonpayablefunction rescueToken(address token, address to, uint256 amount)
resolveDeferredExecution
nonpayablefunction resolveDeferredExecution(tuple poolKey, bytes32 hashId)
resolveDeferredPayment
nonpayablefunction resolveDeferredPayment(bytes32 hashId)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setAdminSafe
nonpayablefunction setAdminSafe(address adminSafe_)
setFeeRecipient
nonpayablefunction setFeeRecipient(address feeRecipient_)
setMaximumExecutionCount
nonpayablefunction setMaximumExecutionCount(uint256 maximumExecutionCount_)
setMinimumLiteralAmount
nonpayablefunction setMinimumLiteralAmount(address token, uint256 minimumLiteralAmount_)
setPoolWhitelist
nonpayablefunction setPoolWhitelist(bytes32 poolId, bool whitelisted)
unlockCallback
nonpayablefunction unlockCallback(bytes data) returns (bytes)
events
AdminSafeUpdated
event AdminSafeUpdated(address indexed adminSafe)
DeferredExecutionResolved
event DeferredExecutionResolved(bytes32 indexed poolId, bytes32 indexed hashId, int24 fromTick, int24 toTick)
DeferredPaymentResolved
event DeferredPaymentResolved(address indexed token, address indexed to, uint256 amount)
ExecutionDeferred
event ExecutionDeferred(bytes32 indexed poolId, bytes32 indexed hashId)
FeeRecipientUpdated
event FeeRecipientUpdated(address indexed feeRecipient)
MaximumExecutionCountUpdated
event MaximumExecutionCountUpdated(uint256 maximumExecutionCount)
MinimumLiteralAmountUpdated
event MinimumLiteralAmountUpdated(address indexed token, uint256 minimumLiteralAmount)
OrderCancelled
event OrderCancelled(bytes32 indexed poolId, uint32 indexed orderId, uint128 remainingAmount, uint128 tradedAmount)
OrderCreated
event OrderCreated(bytes32 indexed poolId, uint32 indexed orderId, address indexed owner, int24 tickLower, int24 tickUpper, uint128 amount, bool zeroForOne, bool enablePartialFill, uint256 liquidity)
OrderFilled
event OrderFilled(bytes32 indexed poolId, uint32 indexed orderId, uint128 tradedAmount)
OrderIdCollisionDetected
event OrderIdCollisionDetected(bytes32 indexed poolId, uint32 indexed orderId)
OrderPartiallyFilled
event OrderPartiallyFilled(bytes32 indexed poolId, uint32 indexed orderId, uint128 remainingAmount, uint128 tradedAmount, int24 tickLower, int24 tickUpper, uint256 liquidity)
PaymentDeferred
event PaymentDeferred(bytes32 indexed hashId, uint8 reason)
PoolWhitelistUpdated
event PoolWhitelistUpdated(bytes32 indexed poolId, bool whitelisted)
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)
TokenRescued
event TokenRescued(address indexed token, address indexed to, uint256 amount)
errors
InsufficientOrderAmount
error InsufficientOrderAmount(uint128 amountIn, uint8 decimals, uint256 minimumLiteralAmount)
InvalidRecipient
error InvalidRecipient(address recipient)
InvalidTickRange
error InvalidTickRange(int24 tickLower, int24 tickUpper)
InvalidTickSpacing
error InvalidTickSpacing()
InvalidTickThreshold
error InvalidTickThreshold(int24 currentTick, int24 tickThreshold, bool zeroForOne)
MinimumAmountInsufficient
error MinimumAmountInsufficient(uint128 minimumAmount, uint128 amountReceived)
NotPoolManager
error NotPoolManager()
OrderBookAlreadyInitialized
error OrderBookAlreadyInitialized()
OrderBookNotInitialized
error OrderBookNotInitialized()
OrderIdCollision
error OrderIdCollision(uint32 orderId)
PoolNotSupported
error PoolNotSupported(bytes32 poolId)
PoolNotWhitelisted
error PoolNotWhitelisted(bytes32 poolId)
Unauthorized
error Unauthorized()
creation bytecode
0x60c0346101e057601f6161d138819003918201601f19168301916001600160401b038311848410176101e4578084926060946040528339810103126101e057610047816101f8565b61005f6040610058602085016101f8565b93016101f8565b6001600160a01b03918216608052600180546001600160a01b03191691831691821790556064600255911660a052335f9081525f805160206161b1833981519152602052604090205460ff1615610190575b600780546001600160a01b0319169190911790555f8052600860205260017f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c755604051615fa4908161020d82396080518181816104e90152818161069d01528181610ba70152818161179b0152818161181e015281816123f90152818161401c015281816141ed0152818161447e0152818161456401528181614e0d01528181614ef301528181614fdb015281816154f30152818161569f01528181615a4a01528181615c3901528181615cb80152615dda015260a05181615c6a0152f35b335f8181525f805160206161b183398151915260205260408120805460ff1916600117905581907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a46100b1565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101e05756fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146101e4578063170f988c146101df578063248a9ca3146101da5780632f2ff15d146101d557806336568abe146101d057806337706f60146101cb57806341ec0034146101c657806346904840146101c15780634b86e1e0146101bc5780634b8c9c2d146101b757806360309698146101b257806368cf8cd2146101ad57806369221b3c146101a85780638378c6c3146101a357806391d148541461019e57806391dd7346146101995780639439cd5c14610194578063a031be981461018f578063a20326f41461018a578063a217fddf14610185578063a3e4962014610180578063affc69c21461017b578063bd9c781114610176578063c456718014610171578063d547741f1461016c578063d88bdb2414610167578063dc4c90d314610162578063e5711e8b1461015d5763e74b981b14610158575f80fd5b611a0e565b6117ca565b611786565b61172d565b6116ed565b61167e565b6115fd565b6114c0565b6113dd565b6113b9565b61131a565b6112dd565b611204565b61119b565b611112565b6110c6565b6110a9565b610a59565b610929565b6108f6565b61088c565b610864565b61053f565b61044f565b6103a6565b6102e3565b6102a0565b61023e565b3461023a57602036600319011261023a5760043563ffffffff60e01b811680910361023a57602090637965db0b60e01b8114908115610229575b506040519015158152f35b6301ffc9a760e01b1490505f61021e565b5f80fd5b3461023a57604036600319011261023a57600435602435905f52600360205260405f20905f5260205261029c600160405f2001546040519181839260181c60020b9060020b83909291602090604083019460020b835260020b910152565b0390f35b3461023a57602036600319011261023a5760206102ca6004355f525f602052600160405f20015490565b604051908152f35b6001600160a01b0381160361023a57565b3461023a57604036600319011261023a57602435600435610303826102d2565b61032061031b825f525f602052600160405f20015490565b61286f565b5f818152602081815260408083206001600160a01b038616845290915290205460ff161561034a57005b5f818152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4005b3461023a57604036600319011261023a576004356024356103c6816102d2565b336001600160a01b038216036103e1576103df916128b0565b005b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b60a090600319011261023a57600490565b3461023a5760c036600319011261023a576104e45f6104ad6104ca6104ad6104bb6104793661043e565b60a4356104846126bd565b61049761048f611b39565b923690611c01565b8252602082015260405192839160208301611cb3565b03601f198101835282611b18565b60405192839160208301611cdb565b604051809381926348c8949160e01b835260048301611187565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561053a5761051f57005b6103df903d805f833e6105328183611b18565b810190611d9b565b611dc0565b3461023a5761010036600319011261023a5761056461055d36611b93565b60a0902090565b61059b61059661057c835f52600960205260405f2090565b610584611dcb565b63ffffffff165f5260205260405f2090565b611dd7565b80516001600160a01b03166001600160a01b031633141580610813575b610805576105f861069860408301935f6104ad61067e6104ad61066f6106146105e28b5160020b90565b8a6106056106006080606084019d8e5160020b90565b930151612934565b611e49565b9061060e611dcb565b9261294d565b61066061061f611e5e565b8b516001600160a01b031690610633611b4a565b9361063d36611b93565b855260208501526040840152606083018890526001600160a01b03166080830152565b60405192839160208301611eab565b60405192839160208301611cf3565b604051809481926348c8949160e01b835260048301611187565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561053a576106ef61071791610725945f916107eb575b5060208082518301019101611f35565b6107096106fa611f44565b610702611f5a565b908361299e565b610711611dcb565b83612a28565b5f52600a60205260405f2090565b9161073360a0820151151590565b156107bf576103df9361077c60206107829301916107518351151590565b156107b6575161076d9060020b5b610767611f86565b90611fc5565b610775611dcb565b9086612bdd565b51151590565b1561079a575160020b5b610794611dcb565b91612bdd565b516107b19060020b5b6107ab611f86565b90611ffe565b61078c565b5160020b61076d565b5061078c906107e46107d56103df955160020b90565b6107dd611dcb565b9085612bdd565b5160020b90565b6107ff91503d805f833e6105328183611b18565b5f6106df565b6282b42960e81b5f5260045ffd5b50335f9081527fe555f853ba8728819a094ad27e06454c0a2d2192b2276d77413b0e389312a4216020526040902061085590610851905b5460ff1690565b1590565b6105b8565b5f91031261023a57565b3461023a575f36600319011261023a576001546040516001600160a01b039091168152602090f35b3461023a57602036600319011261023a576004356108a9816102d2565b6108b1612783565b600780546001600160a01b0319166001600160a01b039290921691821790557f5a275cea7e02c6683d991e34fb5c883e6963879116f8a569f088f2fb534cc7205f80a2005b3461023a575f36600319011261023a576007546040516001600160a01b039091168152602090f35b8060020b0361023a57565b3461023a5761010036600319011261023a576109443661043e565b60a4356109508161091e565b60c43561095c8161091e565b60e43591610969836102d2565b335f9081527f6dff3f1634aec5bf9d1724ed8cd85d39565971737d20dfcf0d18fbfd5d19975b602052604090205460ff16156109a8576103df9361201b565b610a55610a20610a3d6109ba336152f0565b6104ad6109e67f97840563fab186a4cdf534c631e34229d5c187820156c4ae8e378cfb923e086061538a565b610a1a604051958694610a1a6020870160179076020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81520190565b90614724565b7001034b99036b4b9b9b4b733903937b6329607d1b815260110190565b60405162461bcd60e51b815291829160048301611187565b0390fd5b3461023a5761014036600319011261023a57610a7761055d36611b93565b610a8f61085161084a835f52600b60205260405f2090565b61109757610aec610851610ab0610aa4612101565b6001600160a01b031690565b6001600160a01b03165f9081527f6dff3f1634aec5bf9d1724ed8cd85d39565971737d20dfcf0d18fbfd5d19975b602052604090205460ff1690565b61108557610af861210d565b1561107557610b66610b08612133565b6001600160a01b0316610b19611f70565b6001600160a01b0382165f90815260086020526040902054611059575f805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c75b54916137a9565b610b90610b71611f92565b610b79611f9e565b610b81611f86565b90610b8a61211a565b92613881565b610b9861210d565b1561104c57610ba5611f9e565b7f000000000000000000000000000000000000000000000000000000000000000091610c03610bdf610bd961055d36611b93565b85613931565b5050905083610bec611f92565b610bf4611f9e565b90610bfd61210d565b936139e0565b610c0b61210d565b1561101957610c4e610c3c610c26610c21611f92565b613a65565b610c31610c21611f9e565b610c48610c3c611f70565b6001600160801b031690565b91613dbf565b905b610c62815f52600a60205260405f2090565b600381015460020b15611003575b610c7981613e71565b9360018060a01b03610cba610cad87610c9a875f52600960205260405f2090565b9063ffffffff165f5260205260405f2090565b546001600160a01b031690565b16610fb8575f610d4881976104ad610d2c6104ad61066f610cf58c610cdd611f92565b8d610cef610ce9611f9e565b91612934565b9161294d565b610cfd611e5e565b610d05611b4a565b91610d0f36611b93565b835260208301526040820152336060820152306080820152610660565b604051998a809481936348c8949160e01b835260048301611187565b03926001600160a01b03165af190811561053a5761029c968692610fa0575b50610e71610d7361210d565b610dd1610d7e611f92565b610dc1610d89611f9e565b610db7610d9461211a565b93610dad610da0611b59565b3381529715156020890152565b60020b6040870152565b60020b6060850152565b60808301899052151560a0830152565b610de784610c9a885f52600960205260405f2090565b8151815460208401516040850151606086015160c01b62ffffff60c01b1660a89190911b62ffffff60a81b1691151560a090811b60ff60a01b166001600160a01b039095166001600160d81b031990941693909317939093171791909117825560808301516001830155909101516002909101805460ff191660ff92151592909216919091179055565b610e7961211a565b15610f925750610ec091610e8b61210d565b15610f8157610ea582610e9f61075f611f92565b83613f2d565b610ead61210d565b15610f7657610eba611f9e565b90613f2d565b610ec8611f92565b907f74f8e0ba1adbb8ae3c9e08072b5e9b575339d75b49105934a24a857950927fd3610ef2611f9e565b93610efb611f70565b610f5c610f0661210d565b92610f0f61211a565b604051948594339a63ffffffff8d169a87926001600160801b039060a095929897969360c086019960020b865260020b602086015216604084015215156060830152151560808201520152565b0390a460405163ffffffff90911681529081906020820190565b610eba6107a3611f9e565b610ea582610f8d611f92565b610e9f565b610f9b92613f2d565b610ec0565b610fb3903d805f833e6105328183611b18565b610d67565b6110008563ffffffff8116857fbba01bc4875b2e5246e911bdbc79525eaf9c46a888bc28e6a6f5b5ad91780eb55f80a3635735784560e11b5f5263ffffffff16600452602490565b5ffd5b61101461100e611f86565b82613e0c565b610c70565b611046610c3c61102a610c21611f92565b611035610c21611f9e565b611040610c3c611f70565b91613d85565b90610c50565b611054611f92565b610ba5565b6001600160a01b0382165f908152600860205260409020610b5f565b610b66611080612127565b610b08565b63fa49a33560e01b5f5260045260245ffd5b630af4276960e31b5f5260045260245ffd5b3461023a575f36600319011261023a576020600254604051908152f35b3461023a57602036600319011261023a577fd302bc3a3ea88de31e97a94f9eaa33c8d7c745f7c58bcbb725c9407c13f128f66020600435611105612783565b80600255604051908152a1005b3461023a57604036600319011261023a57602060ff611157602435600435611139826102d2565b5f525f845260405f209060018060a01b03165f5260205260405f2090565b54166040519015158152f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b906020611198928181520190611163565b90565b3461023a57602036600319011261023a576004356001600160401b03811161023a573660238201121561023a578060040135906001600160401b03821161023a57366024838301011161023a5761029c9160246111f892016123f7565b60405191829182611187565b3461023a57604036600319011261023a57600435611221816102d2565b335f9081527fee57cd81e84075558e8fcc182a1f4393f91fc97f963a136e66b7f949a62f319f6020526040902054602435919060ff161561129f5760207f8b52239d7db2435e7e661523c25a1f745cfc0898194e2a54869e7e7f9189fb0a9160018060a01b031692835f52600882528060405f2055604051908152a2005b610a55610a20610a3d6112b1336152f0565b6104ad6109e67f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961538a565b3461023a57602036600319011261023a576004355f52600b602052602060ff60405f2054166040519015158152f35b63ffffffff81160361023a57565b3461023a57604036600319011261023a5761135b60243560043561133d8261130c565b5f52600960205260405f209063ffffffff165f5260205260405f2090565b80546001820154600292830154604080516001600160a01b038516815260ff60a086811c82161515602084015260a887901c880b9383019390935260c095861c90960b60608201526080810193909352931615159281019290925290f35b3461023a575f36600319011261023a5760206040515f8152f35b8015150361023a57565b3461023a57604036600319011261023a576004356024356113fd816113d3565b335f9081527fb5ba3787543ad6c173598159348a4a928021a98f804854cb89ce97f5d3e2c45e602052604090205460ff16156114825760207f6dbde3213369408004348ab9fca02d2bfa8948ac1583862446b5a7df096fc63b91835f52600b82526114778160405f209060ff801983541691151516179055565b6040519015158152a2005b610a55610a20610a3d611494336152f0565b6104ad6109e67f2a3dab589bcc9747970dd85ac3f222668741ae51f2a1bbb8f8355be28dd8a86861538a565b3461023a57604036600319011261023a5761029c6115306024356004356114e68261130c565b5f60a06040516114f581611a8c565b82815282602082015282604082015282606082015282608082015201525f52600960205260405f209063ffffffff165f5260205260405f2090565b6115a761159e60026040519361154585611a8c565b80546001600160a01b038116865260a081901c60ff161515602087015260a881901c830b60020b604087015261158c906115829060c01c60020b90565b60020b6060870152565b60018101546080860152015460ff1690565b151560a0830152565b6040519182918291909160a08060c0830194600180831b038151168452602081015115156020850152604081015160020b6040850152606081015160020b60608501526080810151608085015201511515910152565b3461023a57604036600319011261023a57602063ffffffff6116446024356004356116278261091e565b5f52600a8452600160405f20019060020b5f5260205260405f2090565b5416604051908152f35b634e487b7160e01b5f52602160045260245ffd5b6002111561166c57565b61164e565b90600282101561166c5752565b3461023a57602036600319011261023a576004355f52600460205260a060405f206116eb600180841b0382541691600181015490600180861b0360028201541660ff6004600384015493015416926040519586526020860152604085015260608401526080830190611671565bf35b3461023a57604036600319011261023a576103df602435600435611710826102d2565b61172861031b825f525f602052600160405f20015490565b6128b0565b3461023a57602036600319011261023a576104e45f6104ad6104ca816117776004356117576126bd565b61175f611b68565b81905260408051602081019290925290928391820190565b60405192839160208301611d0a565b3461023a575f36600319011261023a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461023a57606036600319011261023a576004356117e7816102d2565b6024356117f3816102d2565b6044356117fe6127f9565b6001600160a01b0382169283156119f2576001600160a01b0390811692907f000000000000000000000000000000000000000000000000000000000000000016611848610aa48581565b604051627eeac760e11b81523060048201526024810182905290602082604481865afa90811561053a57611897925f926119bd575b50611890905f52600560205260405f2090565b54906126b0565b806118e4575b5050816118cf7f4143f7b5cb6ea007914c32b8a3e64cebc051d7f493fa0755454da1e47701e125936118df9386614693565b6040519081529081906020820190565b0390a3005b61195e5f94926104ad6119426104ad6119338996611900611b39565b6001600160a01b038d16808252602091820192835260408051928301919091529151918101919091529182906060820190565b60405192839160208301611d22565b6040519687809481936348c8949160e01b835260048301611187565b03925af192831561053a57816118df936118cf927f4143f7b5cb6ea007914c32b8a3e64cebc051d7f493fa0755454da1e47701e125966119a3575b509350935061189d565b6119b6903d805f833e6105328183611b18565b505f611999565b6118909192506119e49060203d6020116119eb575b6119dc8183611b18565b810190611f35565b919061187d565b503d6119d2565b630bc2c5df60e11b5f526001600160a01b03831660045260245ffd5b3461023a57602036600319011261023a57600435611a2b816102d2565b611a33612783565b600180546001600160a01b0319166001600160a01b039290921691821790557f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc25f80a2005b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b03821117611aa757604052565b611a78565b60a081019081106001600160401b03821117611aa757604052565b604081019081106001600160401b03821117611aa757604052565b608081019081106001600160401b03821117611aa757604052565b606081019081106001600160401b03821117611aa757604052565b90601f801991011681019081106001600160401b03821117611aa757604052565b60405190611b48604083611b18565b565b60405190611b4860a083611b18565b60405190611b4860c083611b18565b60405190611b48602083611b18565b60405190611b48606083611b18565b62ffffff81160361023a57565b60a090600319011261023a5760405190611bac82611aac565b81600435611bb9816102d2565b8152602435611bc7816102d2565b6020820152604435611bd881611b86565b6040820152606435611be98161091e565b6060820152608060843591611bfd836102d2565b0152565b91908260a091031261023a57604051611c1981611aac565b60808082948035611c29816102d2565b84526020810135611c39816102d2565b60208501526040810135611c4c81611b86565b60408501526060810135611c5f8161091e565b6060850152013591611bfd836102d2565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b91909160a0602060c0830194611cca848251611c70565b0151910152565b6004111561166c57565b90604061119892600181528160208201520190611163565b906040611198925f81528160208201520190611163565b90604061119892600281528160208201520190611163565b90604061119892600381528160208201520190611163565b6001600160401b038111611aa757601f01601f191660200190565b81601f8201121561023a57805190611d6c82611d3a565b92611d7a6040519485611b18565b8284526020838301011161023a57815f9260208093018386015e8301015290565b9060208282031261023a5781516001600160401b03811161023a576111989201611d55565b6040513d5f823e3d90fd5b60a4356111988161130c565b90611b48604051611de781611a8c565b83546001600160a01b038116825260a081811c60ff161515602084015260a882901c600290810b604085015260c09290921c820b60608401529194859291611e2e9161158c565b1515910152565b634e487b7160e01b5f52601160045260245ffd5b600160ff1b8114611e59575f0390565b611e35565b60405190611e6d602083611b18565b5f808352366020840137565b90611e8382611d3a565b611e906040519182611b18565b8281528092611ea1601f1991611d3a565b0190602036910137565b60208152611ebd602082018351611c70565b611ef3602083015160c083019060608091805160020b8452602081015160020b6020850152604081015160408501520151910152565b610180611f106040840151826101408501526101a0840190611163565b60608401516001600160a01b0390811661016085015260809094015190931691015290565b9081602091031261023a575190565b60c4356001600160801b038116810361023a5790565b60e4356001600160801b038116810361023a5790565b60a4356001600160801b038116810361023a5790565b6064356111988161091e565b60c4356111988161091e565b60e4356111988161091e565b60020b60010190627fffff8213627fffff19831217611e5957565b9060020b9060020b0190627fffff198212627fffff831317611e5957565b60020b5f190190627fffff198212627fffff831317611e5957565b600291820b910b0390627fffff198212627fffff831317611e5957565b60a06120273683611c01565b2093845f52600b60205261204361085160405f2060ff90541690565b6120e057612063848461205e885f52600a60205260405f2090565b612f5d565b61206c81613110565b60025410156120d3579061208585939260025490613417565b9390928584516120b4575b505050505080516120a2575b50505050565b6120ab9361363f565b5f80808061209c565b6120c9946120c484933690611c01565b61314a565b5f80848185612090565b80955093929093516120e7575b5050505050565b6120f7946120c484933690611c01565b5f808080806120e0565b608435611198816102d2565b61010435611198816113d3565b61012435611198816113d3565b602435611198816102d2565b600435611198816102d2565b919060408382031261023a578235600481101561023a57926020810135906001600160401b03821161023a570181601f8201121561023a5780359061218382611d3a565b926121916040519485611b18565b8284526020838301011161023a57815f926020809301838601378301015290565b5190611b48826102d2565b9081604091031261023a576020604051916121d783611ac7565b80516121e2816102d2565b83520151602082015290565b9081602091031261023a5760405190602082018281106001600160401b03821117611aa75760405251815290565b91908260a091031261023a5760405161223481611aac565b60808082948051612244816102d2565b84526020810151612254816102d2565b6020850152604081015161226781611b86565b6040850152606081015161227a8161091e565b6060850152015191611bfd836102d2565b60c08183031261023a5760a0906121e2604051936122a885611ac7565b8261221c565b60208183031261023a578051906001600160401b03821161023a570180820391610180831261023a576080604051936122e685611aac565b6122f0838561221c565b8552609f19011261023a5760405161230781611ae2565b60a08301516123158161091e565b815260c08301516123258161091e565b602082015260e0830151604082015261010083015160608201526020840152610120820151916001600160401b03831161023a5761236b61016092612388948301611d55565b604085015261237d61014082016121b2565b6060850152016121b2565b608082015290565b919082604091031261023a576020825192015190565b6123e961119894936123bb8361014095611c70565b8051600290810b60a08501526020820151900b60c0840152604081015160e084015260600151610100830152565b816101208201520190611163565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190338390036126a1576124379181019061213f565b919061244281611cd1565b806125e4575060406124608360208061248b965183010191016122ae565b9182519060208401515f8486015193855197889586948593632d35e7ed60e11b8552600485016123a6565b03925af191821561053a576104ad92611198925f925f926125a5575b5061258b6124b9836125919495614501565b82515190949061253e906001600160a01b0316608085018051909190612500906001600160a01b0316606088018051909391906001600160a01b0316918b60801d90614550565b85516020015161253390612525906001600160a01b031693516001600160a01b031690565b91516001600160a01b031690565b9188600f0b90614550565b825151612565906001600160a01b03166001546001600160a01b0316908360801d90614535565b8251602001516001600160a01b03166001546001600160a01b03165b91600f0b90614535565b51614560565b604051928391602083019190602083019252565b6124b9935061259192506125d361258b9160403d6040116125dd575b6125cb8183611b18565b810190612390565b90945092506124a7565b503d6125c1565b90506125ef81611cd1565b60018103612623575061260e8160208061261b9451830101910161228b565b60208151910151906143a0565b611198611e5e565b61262c81611cd1565b60028103612656575061264b81602080612651945183010191016121ee565b5161415b565b61261b565b80612662600392611cd1565b1461266e575b5061261b565b6126848160208061269b945183010191016121bd565b80516020906001600160a01b031691015190614012565b5f612668565b63570c108560e11b5f5260045ffd5b91908203918211611e5957565b335f9081527fe555f853ba8728819a094ad27e06454c0a2d2192b2276d77413b0e389312a421602052604090205460ff16156126f557565b610a55612765610a3d612707336152f0565b6104ad6127337f18a63f21c5d860e4c5c007612edb577bd50c23e26967ce9666d519b5311cc27261538a565b601160405195869460176020870176020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81520190614724565b7001034b99036b4b9b9b4b733903937b6329607d1b81520190614724565b335f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16156127bb57565b610a556127656127d96127cd336152f0565b6104ad6127335f61538a565b60405162461bcd60e51b8152602060048201529182916024830190611163565b335f9081527fb5b2f2f29595ed323888dd73602637cfd9cbe9a45c930d041e1756bb9bb738ad602052604090205460ff161561283157565b610a55612765610a3d612843336152f0565b6104ad6127337fbf63066482b01a20567880b14a2934fecb21c925e6bcc0a0a091c59723fa9c0661538a565b5f8181526020818152604080832033845290915290205460ff16156128915750565b6127656127d9610a55926104ad6127336128aa336152f0565b9261538a565b5f818152602081815260408083206001600160a01b038616845290915290205460ff166128db575050565b5f818152602081815260408083206001600160a01b03861684529091529020805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4565b905f821261293e57565b6393dafdf160e01b5f5260045ffd5b92909163ffffffff925f606060405161296581611ae2565b82815282602082015282604082015201526040519461298386611ae2565b60020b855260020b6020850152604084015216606082015290565b929190926001600160801b038160801d94816129b987614736565b91169182911610612a1657506001600160801b03929350600f0b90826129de83614736565b911692839116106129ed575050565b906129ff6001600160801b0392614736565b90630940b79160e11b5f526004521660245260445ffd5b6001600160801b03906129ff86614736565b90610c9a612ad792611b4894612a4d61059685610c9a855f52600960205260405f2090565b612a5e60208360801d920151151590565b15612b3d576001600160801b0316906001600160801b0316905b826001600160801b038216612ae8576040516001600160801b0393909316835263ffffffff8616929091507fc30519384fc06c8980606deb9afba7ead7255480b9ca9d71ce6ea7afc54ee81f90602090a35f52600960205260405f2090565b60025f918281558260018201550155565b604080516001600160801b03938416815293909216602084015263ffffffff86169290917f3106ea4798dd088b5d8a48e31e98028856d919d9049646768fb8c9856f7851ce91a35f52600960205260405f2090565b6001600160801b039081169116612a78565b634e487b7160e01b5f52603260045260245ffd5b8054821015612b78575f5260205f2001905f90565b612b4f565b63ffffffff5f199116019063ffffffff8211611e5957565b600181901b91906001600160ff1b03811603611e5957565b8054905f815581612bbc575050565b5f5260205f20908101905b818110612bd2575050565b5f8155600101612bc7565b91906003830191612bef835460020b90565b60020b15612eed5760018401612c1d612c1384839060020b5f5260205260405f2090565b5463ffffffff1690565b63ffffffff8116918215612e91575f80945f5b858110612e9a575b505015612e9157849387612c57612c4e85612b7d565b63ffffffff1690565b821015612e0557506007811690859060031c612c7285612b7d565b63ffffffff16612c8660078260031c921690565b929093828c8587612ca286849060020b5f5260205260405f2090565b90612cac91612b63565b9054612cbc929160031b1c614791565b93612cd1919060020b5f5260205260405f2090565b90612cdb91612b63565b9054612ceb939160031b1c6147e7565b90612d01888c9060020b5f5260205260405f2090565b90612d0b91612b63565b612d25929082549060031b91821b915f19901b1916179055565b81612d3b878b9060020b5f5260205260405f2090565b90612d4591612b63565b9054612d55929160031b1c6147bb565b90612d6b868a9060020b5f5260205260405f2090565b90612d7591612b63565b612d8f929082549060031b91821b915f19901b1916179055565b612db2600194612da1612dc794612b7d565b929060020b5f5260205260405f2090565b9063ffffffff1663ffffffff19825416179055565b14612dd157505050565b611b4892612df0612de6612e00945460020b90565b8360028401614819565b9060020b5f5260205260405f2090565b612bad565b94612da1612dc794612e8c600198612e74612e63612e4f87612e30612db29a9060078260031c921690565b612e5e612e5483612e4f868b9996999060020b5f5260205260405f2090565b612b63565b90549060031b1c90565b6147bb565b949060020b5f5260205260405f2090565b90919082549060031b91821b915f19901b1916179055565b612b7d565b50505050505050565b612ec988612ec4612e548d612e4f600387901c600788169590929060020b5f5260205260405f2090565b614791565b63ffffffff808416911614612ee057600101612c30565b9550505060015f80612c38565b63f0aa9f9b60e01b5f5260045ffd5b6001600160401b038111611aa75760051b60200190565b90612f1d82612efc565b612f2a6040519182611b18565b8281528092611ea1601f1991612efc565b5f198114611e595760010190565b8051821015612b785760209160051b010190565b928260020b928260020b928484146130d9576003860194612f7f865460020b90565b60020b156130ca57612f9a612f9584848a614865565b612f13565b9412156130bc57612faa90611fe3565b905b5f915b8160020b808260020b12156130b057612fd86002890192612fd1895460020b90565b908461492c565b909290806130a4575b612ffb575b508160020b12612faf57505091935091508252565b613010838a9060020b5f5260205260405f2090565b80545f5b81811061307a575050506130749061303a612e00858c9060020b5f5260205260405f2090565b6130626130558560018d019060020b5f5260205260405f2090565b805463ffffffff19169055565b8361306e8a5460020b90565b91614819565b5f612fe6565b8061308a612e5460019386612b63565b61309d6130968b612f3b565b9a8d612f49565b5201613014565b50818360020b12612fe1565b50505091935091508252565b6130c590611faa565b612fac565b50505092505050611198611e5e565b505092505050611198611e5e565b9060028201809211611e5957565b9060018201809211611e5957565b91908201809211611e5957565b5f9190825b81518410156131455761313161312b8584612f49565b516149cf565b8101809111611e5957600190930192613115565b925050565b919095949260a0832094613166865f52600a60205260405f2090565b9482916001908460020b8160020b8181036133c2575b505050905f5b8a5181101561337857613195818c612f49565b5161319f816149cf565b908a8a8a8a8a8a8a8a5f975b8a89106131c5575050505050505050505050600101613182565b91610c9a9593916131f46105968b9a9997956131e360019d8f614791565b998a915f52600960205260405f2090565b9260808401511561336a5782613355575b505015613223575b5050505050505b018a8a8a8a8f8a8a8d926131ab565b60a08101511561331d57602081019361323c8551151590565b1561330657613279613262613255604085015160020b90565b606084015160020b610767565b955b61326f858789614bdc565b6132f65751151590565b156132d257506060015160020b925b8360020b9060020b141591826132c0575b50506132af575b5050505b8b5f8c8c8c8361320d565b6132b892613f2d565b8b5f806132a0565b6132cb925083614bdc565b8c8e613299565b6107ab60606132e7816132f095015160020b90565b92015160020b90565b92613288565b61330188888b613f2d565b61077c565b613279613317604084015160020b90565b95613264565b9150506133449391506133336020820151151590565b15613349576060015160020b610eba565b6132a4565b6040015160020b610eba565b613363925085848989614a1c565b8c8f613205565b505050505050505050613214565b50508451979850611b48976133a29750602096506133b494506001600160a01b0316925086915050565b6001546001600160a01b031690614c1f565b01516001600160a01b031690565b8760020b918083125f146133ec5750136133e45750505f905b905f808061317c565b9250906133db565b82136133fc575b505050906133db565b1261340f5750505f905b905f80806133f3565b925090613406565b90915f80915f925b84518410156134e95761343561312b8587612f49565b90866134418386613103565b116134645760019161345561345b92612f3b565b94613103565b9301929161341f565b9350509350505b61347481612f13565b91613483612f958383516126b0565b935f5b8381106134ca5750825b82518110156134c157806134a660019285612f49565b516134ba6134b487846126b0565b89612f49565b5201613490565b50929150509190565b806134d760019285612f49565b516134e28288612f49565b5201613486565b925093505061346b565b634e487b7160e01b5f52601260045260245ffd5b8115613511570490565b6134f3565b602081526080810191805192606060208401528351809152602060a084019401905f5b81811061355f575050506040816020606093015160020b82850152015160020b91015290565b8251865260209586019590920191600101613539565b81518051906001600160401b038211611aa757600160401b8211611aa7578254828455808310613619575b50602001825f5260205f205f5b83811061360557505050509060406001611b489301916135e3602082015160020b849062ffffff198254169062ffffff16179055565b015160020b81549060181b65ffffff000000169065ffffff0000001916179055565b6001906020845194019381840155016135ad565b835f528260205f2091820191015b81811061363457506135a0565b5f8155600101613627565b90929183519161365160025460031c90565b93841561378f575b5f5b84811061366b5750505050505050565b8561367682876126b0565b111561377e5785805b61368881612f13565b905f5b81811061374f57505091613743926136a1611b77565b908152600287900b6020820152600285900b604082015260405160208101906136ce816104ad8585613516565b519020906136f5826136e8895f52600360205260405f2090565b905f5260205260405f2090565b546137485761371990613714836136e88a5f52600360205260405f2090565b613575565b857fb8af2cfd92b780679d7a123f0f68fbbaf493456e13c774103cc964045172508f5f80a3613103565b61365b565b5050613103565b6001919293506137686137628287613103565b8c612f49565b516137738286612f49565b52019088929161368b565b61378881866126b0565b869061367f565b60019450613659565b60ff16604d8111611e5957600a0a90565b90821561386a5760405163313ce56760e01b815291602090839060049082906001600160a01b03165afa91821561053a575f9261382c575b50826137fe6137ef84613798565b6001600160801b038416613507565b1061380857505050565b630bfc4f0f60e41b5f526001600160801b031660045260ff1660245260445260645ffd5b9091506020813d602011613862575b8161384860209383611b18565b8101031261023a575160ff8116810361023a57905f6137e1565b3d915061383b565b505050565b9060020b9081156135115760020b0790565b919290928360020b8360020b12156139145761389d818461386f565b60020b613914576138b76138b1828661386f565b60020b90565b613914576138c58385611ffe565b9060020b809160020b1261391457816138fd575b506138e2575050565b632dddf51960e11b5f52600290810b6004520b60245260445ffd5b905061390c6138b18385611ffe565b13155f6138d9565b632dddf51960e11b5f52600283810b60045284900b60245260445ffd5b60209061397c93926040518381019182526006604082015260408152613958606082611b18565b519020906040518080968194631e2eaeaf60e01b8352600483019190602083019252565b03916001600160a01b03165afa91821561053a575f926139bf575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b6139d991925060203d6020116119eb576119dc8183611b18565b905f613997565b9190849081613a54575b50613a335783159081613a22575b50613a0257505050565b6325ff790160e11b5f52600290810b6004520b602452151560445260645ffd5b905060020b8160020b13155f6139f8565b506325ff790160e11b5f52600290810b6004520b602452151560445260645ffd5b905060020b8260020b12155f6139ea565b60020b908160ff1d82810118620d89e88111613d7f5763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b189160028116613d63575b60048116613d47575b60088116613d2b575b60108116613d0f575b60208116613cf3575b60408116613cd7575b60808116613cbb575b6101008116613c9f575b6102008116613c83575b6104008116613c67575b6108008116613c4b575b6110008116613c2f575b6120008116613c13575b6140008116613bf7575b6180008116613bdb575b620100008116613bbf575b620200008116613ba4575b620400008116613b89575b6208000016613b70575b5f12613b68575b0160201c90565b5f1904613b61565b6b048a170391f7dc42444e8fa290910260801c90613b5a565b6d2216e584f5fa1ea926041bedfe9890920260801c91613b50565b916e5d6af8dedb81196699c329225ee6040260801c91613b45565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c91613b3a565b916f31be135f97d08fd981231505542fcfa60260801c91613b2f565b916f70d869a156d2a1b890bb3df62baf32f70260801c91613b25565b916fa9f746462d870fdf8a65dc1f90e061e50260801c91613b1b565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91613b11565b916fe7159475a2c29b7443b29c7fa6e889d90260801c91613b07565b916ff3392b0822b70005940c7a398e4b70f30260801c91613afd565b916ff987a7253ac413176f2b074cf7815e540260801c91613af3565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91613ae9565b916ffe5dee046a99a2a811c461f1969c30530260801c91613adf565b916fff2ea16466c96a3843ec78b326b528610260801c91613ad6565b916fff973b41fa98c081472e6896dfb254c00260801c91613acd565b916fffcb9843d60f6159c9db58835c9266440260801c91613ac4565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91613abb565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c91613ab2565b916ffff97272373d413259a46990580e213a0260801c91613aa9565b82614c35565b61119892613db49290916001600160a01b0380831690821611613db9575b90036001600160a01b031690614c51565b614daa565b90613da3565b61119892613db4929091906001600160a01b0380821690831611613e06575b613df46001600160a01b03828116908416614cde565b9190036001600160a01b031691614d27565b90613dde565b60030190815460020b613e62575f8160020b1315613e5357613e3d90829062ffffff198254169062ffffff16179055565b805466ffffffff00000019166301000000179055565b63013840ad60e51b5f5260045ffd5b633bf0b18560e01b5f5260045ffd5b6003019081548060020b15612eed57825466ffffffff00000019166001601892831c63ffffffff1690810190921b66ffffffff00000016178355918215613eb55750565b805466ffffffff0000001981166001601892831c63ffffffff1690810190921b66ffffffff000000161790915590915090565b8054600160401b811015611aa757613f0591600182018155612b63565b8154905f199060031b1b19169055565b63ffffffff60019116019063ffffffff8211611e5957565b91600383015460020b908160020b15612eed57612da1612db292613fd786612e748795612e4f87612e63613f96613f79612c13611b489f6001019e8f9060020b5f5260205260405f2090565b9863ffffffff8a16908115613ffe575b509060078260031c921690565b9094613fad84899060020b5f5260205260405f2090565b54861015613fdc575b613fd2612e5487612e4f878c9060020b5f5260205260405f2090565b6147e7565b613f15565b613ff9613ff4858a9060020b5f5260205260405f2090565b613ee8565b613fb6565b61400c908560028b01614819565b5f613f89565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929061404c90610aa490841681565b833b1561023a57604051637a94c56560e11b81523060048201526024810191909152604481018290525f8160648183885af1801561053a576140eb575b50823b1561023a57604051630b0d9c0960e01b81526001600160a01b0390921660048301523060248301526044820152905f908290818381606481015b03925af1801561053a576140d75750565b806140e55f611b4893611b18565b8061085a565b806140e55f6140f993611b18565b5f614089565b600282101561166c5752565b90611b4860405161411b81611aac565b83546001600160a01b0390811682526001850154602083015260028501541660408201526003840154606082015260049093015460ff16608084016140ff565b6141a761418a61417b614176845f52600460205260405f2090565b61410b565b925f52600460205260405f2090565b60045f918281558260018201558260028201558260038201550155565b60208101805182516141df906141d7906141c9906001600160a01b0316610aa4565b5f52600560205260405f2090565b9182546126b0565b905581516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116916142199116610aa4565b825190823b1561023a57604051637a94c56560e11b8152306004820152602481019190915260448101919091525f8160648183865af1801561053a5761437b575b506001608084015161426b81611662565b61427481611662565b03614367576007546001600160a01b0316905b83516001600160a01b031690835190803b1561023a57604051630b0d9c0960e01b81526001600160a01b03938416600482015293909216602484015260448301525f908290606490829084905af1801561053a57614353575b507f55eee1551bf119666f3f07e9d0544e0795da1a27142626fda843fc52f45c5eb361434e61432c604061431d610aa4875160018060a01b031690565b9501516001600160a01b031690565b92516040519081526001600160a01b0393841694909316929081906020820190565b0390a3565b806140e55f61436193611b18565b5f6142e0565b60408301516001600160a01b031690614287565b806140e55f61438993611b18565b5f61425a565b60015f9161439c81612bad565b0155565b60a0812090815f52600360205260405f20835f5260205260405f20604051906143c882611afd565b6040518060208354918281520190835f5260205f20905f5b8181106144eb57505050926107e460016144cd94846144266144c5967f197626f98a3f3660285baa238f79fd032a5d10dfafd3a36fa9b744557c19155e9a990382611b18565b845201549161444c6144388460020b90565b60020b602083019081529360181c60020b90565b60020b60408201908152956144756144708b6136e88c5f52600360205260405f2090565b61438f565b6144a260a082207f0000000000000000000000000000000000000000000000000000000000000000613931565b5050919092516144b3865160020b90565b906144bf8a5160020b90565b9261314a565b915160020b90565b60408051600293840b81529190920b6020820152908190810161434e565b82548452602090930192600192830192016143e0565b614524906145168360801d8260801d03614dbe565b92600f0b90600f0b03614dbe565b6001600160801b03169060801b1790565b611b4892916145465f848385614dec565b90600f0b90614f9c565b90614546611b4894848385614dec565b80517f00000000000000000000000000000000000000000000000000000000000000009190614599906001600160a01b0316308461512f565b905f8213614621575b6020018051909291506145bf906001600160a01b0316308361512f565b905f82136145cc57505050565b91516001600160a01b03928316921690823b1561023a5760405163203c2d1360e21b81526001600160a01b039290921660048301526024820152905f908290604490829084905af1801561053a576140d75750565b80516001600160a01b0384811693911690833b1561023a5760405163203c2d1360e21b81526001600160a01b039290921660048301526024820152915f908390604490829084905af191821561053a5760209261467f575b506145a2565b806140e55f61468d93611b18565b5f614679565b9091906001600160a01b0381166146c057505f8080806146b494865af11590565b6146bb5750565b615202565b6040805163a9059cbb60e01b81526001600160a01b039094166004850152602484019290925291905f9060208260448582885af13d15601f3d116001855114161716928281528260208201520152156147165750565b6001600160a01b0316615195565b805191908290602001825e015f815290565b5f81600f0b1261293e576001600160801b031690565b1561475357565b60405162461bcd60e51b8152602060048201526016602482015275506f736974696f6e206f7574206f6620626f756e647360501b6044820152606490fd5b61479d6008831061474c565b8160051b9180830460201490151715611e595763ffffffff911c1690565b906147c86008821061474c565b8060051b9080820460201490151715611e595763ffffffff901b191690565b906147f46008841061474c565b8260051b9280840460201490151715611e595763ffffffff809116831b921b19161790565b919060020b9060020b908181076148475705908160081d5f52602052600160ff60405f2092161b8154189055565b601c906044926040519163d4d8f3e683526020830152604082015201fd5b9290915f92614878600386015460020b90565b908160020b15614922578260020b8160020b125f146149135761489a90611fe3565b8260020b90818160020b121561490a57826148b8916002890161492c565b909190806148fe575b6148d7575b8160020b1261489a57505050909150565b946148f8906148f183899060020b5f5260205260405f2090565b5490613103565b946148c6565b50808260020b126148c1565b50505050909150565b61491c90611faa565b9161489a565b5050509150505f90565b6001614978939260020b8360020b5f818307129105030160020b9061495a829060ff8260020b60081d921690565b94905f19600160ff88161b0119929060010b5f5260205260405f2090565b5416801580159491906149ba57916149a960ff6149b09361499c6149b7979661540d565b031662ffffff1660020b90565b0160020b90565b0260020b90565b91565b5060ff9081031660020b0160020b0260020b91565b905f915f5b600881106149e0575050565b8060051b81810460201482151715611e59578263ffffffff911c16614a08575b6001016149d4565b92614a14600191612f3b565b939050614a00565b949390936020830193614a2f8551151590565b8360020b8260020b1281151514614a4d575b50505050505050505f90565b15614baf57606084015160020b93614a79614a6c604083015160020b90565b60608a015160020b610767565b905b614a86858488614bdc565b614b995760a0015115614a4157614a9e918491614bdc565b614aa9578080614a41565b614ab49185876155d1565b91809691961580614b8e575b80614b83575b614b7857614ada575b505050505050600190565b614b21614b3f96614b0187614afa60a086205f52600a60205260405f2090565b9687612bdd565b855115614b7257614b1a90610767606085015160020b90565b9451151590565b15614b5b5750915b838360020b8260020b03614b4a575b5050613f2d565b5f8080808080614acf565b614b549183613f2d565b5f83614b38565b60600151614b6c919060020b6107ab565b91614b29565b9461077c565b505050505050505f90565b508260020b15614ac6565b508660020b15614ac0565b9695505050505050614baa9261549a565b600190565b604084015160020b93614bd6614bc9606083015160020b90565b60608a015160020b6107ab565b90614a7b565b9160020b9060020b918183125f14614c065760020b809213159182614c0057505090565b12905090565b60020b908113919082614c1857505090565b1315905090565b90611b4891614c2f5f8383615a44565b90614f9c565b6345c3193d60e11b5f5260020b60045260245ffd5b1561023a57565b90606082901b905f19600160601b8409928280851094039380850394614c78868511614c4a565b14614cd7578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b81810291905f1982820991838084109303928084039384600160601b111561023a5714614d1e57600160601b910990828211900360a01b910360601c1790565b50505060601c90565b91818302915f19818509938380861095039480860395614d48878611614c4a565b14614da2579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b906001600160801b03821680920361293e57565b9081600f0b91820361293e57565b600f0b6f7fffffffffffffffffffffffffffffff198114611e59575f0390565b9192909283600f0b905f8213614ee457505f13614e0b57505050600490565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561023a57604051632961046560e21b81526001600160a01b0384166004820152925f8460248183875af191821561053a57614e87610c3c610c3c5f98602098614e8d97614ed0575b50614dcc565b91615c1f565b600460405180948193630476982d60e21b83525af1801561053a57614eb3575b50600190565b614ecb9060203d6020116119eb576119dc8183611b18565b614ead565b806140e58c614ede93611b18565b5f614e81565b936001600160801b03169150507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681614f268285615bd0565b10614f9357803b1561023a57604051630b0d9c0960e01b81526001600160a01b03938416600482015293909216602484015260448301525f908290606490829084905af19081614f7f575b50614f7b57600390565b5f90565b806140e55f614f8d93611b18565b5f614f71565b50505050600290565b9291925f82131561209c57600581101561166c5760028103614fc25750611b4892615dcf565b909190600314614fd157505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691908416823b1561023a57604051630ab714fb60e11b81523060048201526024810182905260448101859052925f908490606490829084905af191821561053a576150e4936150dc9361511b575b5061509561505a60065460010190565b9161506483600655565b61507e61506f611b4a565b6001600160a01b039099168952565b602088018790526001600160a01b03166040880152565b60608601526150a86001608087016140ff565b6141c960405160208101906150c1816104ad8a85615cff565b519020956150d7875f52600460205260405f2090565b615d46565b918254613103565b90557f3a8e0e845d4ffe17d3f4de3f55c4aa80b788b6098d01c39cb04cc56318d9305960405180615116600182615dbf565b0390a2565b806140e55f61512993611b18565b5f61504a565b6001600160a01b039182165f9081529282166020908152604093849020935163789add5560e11b815260048101949094529183916024918391165afa90811561053a575f9161517c575090565b611198915060203d6020116119eb576119dc8183611b18565b6040516390bfb86560e01b81526001600160a01b03909116600482015263a9059cbb60e01b60248201526080604482015260a03d601f01601f191690810160648301523d60848301523d5f60a484013e808201600460a482015260c4633c9fd93960e21b91015260e40190fd5b6040516390bfb86560e01b81526001600160a01b0390911660048201525f602482018190526080604483015260a03d601f01601f191690810160648401523d6084840152903d9060a484013e808201600460a482015260c4633d2cec6f60e21b91015260e40190fd5b805115612b785760200190565b805160011015612b785760210190565b908151811015612b78570160200190565b8015611e59575f190190565b156152ac57565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b6153026152fd60286130e7565b611e79565b90603061530e8361526b565b53607861531a83615278565b5361532d6153286014612b95565b6130f5565b905b60018211615342576111989150156152a5565b600f81166010811015612b78576153849161537e916f181899199a1a9b1b9c1cb0b131b232b360811b901a6153778587615288565b5360041c90565b91615299565b9061532f565b6153976152fd60406130e7565b9060306153a38361526b565b5360786153af83615278565b536153bd6153286020612b95565b905b600182116153d2576111989150156152a5565b600f81166010811015612b78576154079161537e916f181899199a1a9b1b9c1cb0b131b232b360811b901a6153778587615288565b906153bf565b801561023a57805f03167e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405601f6101e07f804040554300526644320000502061067405302602000010750620017611707760fc7fb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff860260f81c161b60f71c1692831c63d76453e004161a1790565b916154ee9260406154ca846154b28386015160020b90565b606086015160020b610cef6106006080890151612934565b6154d2611e5e565b8251632d35e7ed60e11b815296879283929086600485016123a6565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561053a5760206125819261555161554661252594611b48995f905f92615576575b50614501565b809760a08420612a28565b80516133b4906001600160a01b031686516001600160a01b0316908860801d90614535565b9050615591915060403d6040116125dd576125cb8183611b18565b905f615540565b60020b9060020b90811561351157627fffff1981145f19831416611e59570590565b9060020b9060020b02908160020b918203611e5957565b93909392919260a08120926155f286610c9a865f52600960205260405f2090565b90600182019081549583549861560c8a60ff9060a01c1690565b9061562761561d8c60a81c60020b90565b9b60c01c60020b90565b82156159ae579a8a9b61565a61564e6156489c9d60608c019d8e5160020b90565b90615598565b8c5160020b5b906155ba565b9a5f829e60020b12615998575b8260020b8c60020b14615983578d908160020b8d60020b1215615955575b505061569d918391610cef6106006156f09e9f612934565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694906040906156d4611e5e565b8251632d35e7ed60e11b81529c8d928392908d600485016123a6565b03815f895af194851561053a57615770610c3c6157198f9d988f995f905f926155765750614501565b958015615944578d8760801d6001600160801b0316955b821561592f57886001600160801b03169a8b935b156159195761576a6001600160801b03806157608b9794613a65565b9316951693613a65565b91615eb0565b908c8215159e8f5f146158f6576157b992615793876040948f94610cef89612934565b5f61579c611e5e565b8551632d35e7ed60e11b81529687958694859391600485016123a6565b03925af194851561053a578d9583925f905f926158d2575b506157dc9192615f4b565b906157e691614501565b9755875462ffffff60a81b191662ffffff60a81b60a886901b16178855875462ffffff60c01b191662ffffff60c01b60c08d901b161788558a6040519463ffffffff86951697615866948691926001600160801b0360809497969592978160a086019916855216602084015260020b604083015260020b60608201520152565b037f83d95630ba1c16b250c21852892313e6fc6fd79af2101b9aebf9ccc2f37862dd91a36158ba6020611b48945b80516133b4906001600160a01b031686546001600160a01b031630918760801d90614550565b91543092906001600160a01b031691600f0b90614550565b6157dc92506158f0915060403d6040116125dd576125cb8183611b18565b916157d1565b505050505081611b48979295506158ba945061591491602094612a28565b615894565b61576a6001600160801b03806157608b94613a65565b8860801d6001600160801b03169a8b93615744565b8d876001600160801b031695615730565b6156f09c5091610cef61060061597561569d96946107ab89975160020b90565b9e505050918e919350615685565b505f9c508c9b508b9a50505050505050505050565b9a6159a8906107ab8d5160020b90565b9a615667565b8b998b5f6159d26159c860608d0193615648855160020b90565b835160020b615654565b9d60020b13615a2e575b8260020b8d60020b14615983578c60020b8c60020b1215615a10575b506156f09a9b9c61569d92610cef6106008694612934565b519a9b509099829060020b615a25908d611fc5565b9b9a91906159f8565b9b615a3e906107678e5160020b90565b9b6159dc565b929190927f0000000000000000000000000000000000000000000000000000000000000000615a7482308361512f565b94855f8713615b3f5750505f8512615a925750505090506004905f90565b6001600160a01b0316803b1561023a57604051632961046560e21b81526001600160a01b0383166004820152915f8360248183865af190811561053a575f94602094615ae793615b2b575b50614e8788611e49565b600460405180948193630476982d60e21b83525af1801561053a57615b0e575b5060019190565b615b269060203d6020116119eb576119dc8183611b18565b615b07565b806140e588615b3993611b18565b5f615add565b909350906001600160a01b031685615b578285615bd0565b10615bc657803b1561023a57604051630b0d9c0960e01b81526001600160a01b03938416600482015293909216602484015260448301525f908290606490829084905af19081615bb2575b50615bad5760039190565b5f9190565b806140e55f615bc093611b18565b5f615ba2565b5050505060029190565b6001600160a01b038116615be357503190565b6040516370a0823160e01b81526001600160a01b0392831660048201529160209183916024918391165afa90811561053a575f9161517c575090565b9091906001600160a01b0383163003615c6757611b4892507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690614693565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561023a57604051631b63c28b60e11b81526001600160a01b0394851660048201527f00000000000000000000000000000000000000000000000000000000000000008516602482015291841660448301529190921660648301525f908290818381608481016140c6565b81516001600160a01b03908116825260208084015190830152604080840151909116908201526060808301519082015260809182015160a082019392611b48920190611671565b815181546001600160a01b0319166001600160a01b03919091161781556080906004906020840151600182015560408401516002820180546001600160a01b0319166001600160a01b03929092169190911790556060840151600382015501910151600281101561166c5760ff80198354169116179055565b602081019291611b489190611671565b916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691908416823b1561023a57604051630ab714fb60e11b81523060048201526024810182905260448101859052925f908490606490829084905af191821561053a57615e6b936150dc93615e9c575b50615e5961505a60065460010190565b60608601526150a85f608087016140ff565b90557f3a8e0e845d4ffe17d3f4de3f55c4aa80b788b6098d01c39cb04cc56318d93059604051806151165f82615dbf565b806140e55f615eaa93611b18565b5f615e49565b936001600160a01b0383811690831611615f43575b6001600160a01b03858116959083168611615ee65750506111989350613dbf565b919490939192906001600160a01b0382161115615f37578291615f0d91615f139594613dbf565b93613d85565b6001600160801b0381166001600160801b038316105f14615f32575090565b905090565b91505061119892613d85565b909190615ec5565b61452490615f608360801d8260801d01614dbe565b92600f0b90600f0b01614dbe56fea264697066735822122080b8c7fb005145149e5f06eaed27100b426804f28c61c47a48f37ff3cffdf10e64736f6c634300081a0033ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5000000000000000000000000498581ff718922c3f8e6a244956af099b2652b2b000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba30000000000000000000000003f168219dadf4460dc6ad93eaa3641340c1330d6