0 txs
1 call
constructor
constructor()
functions
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
positions
viewfunction positions(address, address, bool) view returns (uint256 collateral, uint256 sizeDelta, bool isLong, bool isOpen)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
swapRouter
viewfunction swapRouter() view returns (address)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
vaultToTrader
viewfunction vaultToTrader(address) view returns (address)
_syncPositionFromGMX
nonpayablefunction _syncPositionFromGMX(address vault, address market, bool isLong)
afterOrderCancellation
nonpayablefunction afterOrderCancellation(bytes32, tuple order, tuple)
afterOrderExecution
nonpayablefunction afterOrderExecution(bytes32, tuple order, tuple eventData)
afterOrderFrozen
nonpayablefunction afterOrderFrozen(bytes32, tuple order, tuple)
allocateDepositForUser
nonpayablefunction allocateDepositForUser(address vault, address[] marketTokens, uint256[] collateralAmounts, uint256[] sizeDeltas, uint256[] acceptablePrices, uint256[] triggerPrices, bool[] isLongs, uint256[] execFees)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address _initAdmin, address _beManager, address _swapRouter)
proportionalClosePositions
nonpayablefunction proportionalClosePositions(address vault, uint256 lpAmount, address[] marketTokens, bool[] isLongs, uint256[] acceptablePrices, uint256[] triggerPrices, uint256[] execFees)
refundExecutionFee
payablefunction refundExecutionFee(bytes32, tuple) payable
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
rescueFunds
nonpayablefunction rescueFunds(address token, address recipient, uint256 amount)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setSwapRouter
nonpayablefunction setSwapRouter(address _swapRouter)
traderClosePosition
payablefunction traderClosePosition(address vault, address marketToken, uint256 collateralDelta, uint256 sizeDelta, bool isLong, uint256 acceptablePrice, uint256 triggerPrice, uint256 executionFee) payable
traderOpenPosition
payablefunction traderOpenPosition(address vault, address marketToken, uint256 amountIn, uint256 sizeDelta, bool isLong, uint256 acceptablePrice, uint256 triggerPrice, uint256 executionFee) payable
updateVaultAccess
nonpayablefunction updateVaultAccess(address vault, address trader)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
ExecutionFeeRefunded
event ExecutionFeeRefunded(uint256 amt)
FundsRescued
event FundsRescued(address indexed token, address indexed recipient, uint256 amount, address indexed manager)
Initialized
event Initialized(uint64 version)
OrderCancelled
event OrderCancelled(address indexed cancellationReceiver, uint256 ethAmount)
OrderFrozen
event OrderFrozen(address indexed cancellationReceiver, uint256 ethAmount)
PositionClosed
event PositionClosed(address indexed vault, address indexed marketToken, uint256 collateralDelta, uint256 sizeDelta, bool isLongType, bool fullyClosed)
PositionIncreased
event PositionIncreased(address indexed vault, address indexed marketToken, uint256 amountIn, uint256 sizeDelta, bool isLongType, uint256 acceptablePrice, uint256 trigggerPrice)
PositionOpened
event PositionOpened(address indexed vault, address indexed marketToken, uint256 amountIn, uint256 sizeDelta, bool isLongType, uint256 acceptablePrice, uint256 trigggerPrice)
ProportionalRedemptionExecuted
event ProportionalRedemptionExecuted(address indexed vault, uint256 lpAmount, uint256 totalMarkets)
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)
SwapRouterUpdated
event SwapRouterUpdated(address indexed swapRouter, address indexed admin)
Upgraded
event Upgraded(address indexed implementation)
UserDepositAllocated
event UserDepositAllocated(address indexed vault, uint256 totalAmount, uint256 positionsOpened)
VaultAccessUpdated
event VaultAccessUpdated(address indexed vault, address indexed trader, address indexed admin)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
FailedCall
error FailedCall()
IncorrectCaller
error IncorrectCaller()
IncorrectCollateralDelta
error IncorrectCollateralDelta()
IncorrectExecutionFee
error IncorrectExecutionFee()
IncorrectSizeDelta
error IncorrectSizeDelta()
InsufficientBalance
error InsufficientBalance(uint256 balance, uint256 needed)
InvalidInitialization
error InvalidInitialization()
LengthMismatch
error LengthMismatch()
NotInitializing
error NotInitializing()
NotTraderToVault
error NotTraderToVault()
PositionNotOpen
error PositionNotOpen()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
ZeroAddress
error ZeroAddress()
ZeroAmount
error ZeroAmount()
creation bytecode
0x60a080604052346100c257306080525f5160206141375f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b60405161407090816100c7823960805181818161123001526112d20152f35b6001600160401b0319166001600160401b039081175f5160206141375f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe61022080604052600436101561001d575b50361561001b575f80fd5b005b5f610140525f3560e01c90816301ffc9a7146115f757508063248a9ca3146115b85780632bdc0ad2146115785780632f2ff15d1461152e57806336568abe146114ea5780633c3722401461148b57806341273657146114625780634f1ef2861461128457806352d1902d1461121e5780636ccae0541461110b578063705846661461104e578063750ff6b514610f9f5780637746327814610f6d5780638b9e55dc14610f5557806391d1485414610efa578063a217fddf14610eda578063ad3cb1cc14610e76578063b10eceb814610de0578063c0c53b8b14610bf5578063c31c9c0714610bc8578063c6f7a64314610b55578063cf17829414610725578063d3d3206d146106e2578063d547741f1461068b578063e96de1bd146101e95763f0c089751461014c575f610010565b346101e25761015a366117ff565b5090507fdd003742fb214507783ce004fe55f5ac14f89c6de4a7cd7487e47eb091c622656020610195604061018f8580611c53565b01611c68565b61019e81612e6b565b6101c46101b060a061018f8780611c53565b6101bd6101808701611c46565b90836118bd565b60405160e0949094013584526001600160a01b031692a26101405180f35b6101405180fd5b346101e25760e03660031901126101e25761020261164a565b6080526044356001600160401b0381116101e25761022490369060040161185a565b60a0526064356001600160401b0381116101e25761024690369060040161185a565b906084356001600160401b0381116101e25761026690369060040161185a565b939060a4356001600160401b0381116101e25761028790369060040161185a565b9060e0529060c4356001600160401b0381116101e2576102ab90369060040161185a565b9061010052926102b96124e8565b6102c161212a565b60805161014080516001600160a01b0392831690526001602052516040902054161561067657602435156106615760a051151580610656575b8061064b575b80610640575b80610635575b1561062057604051636dc7b0a160e01b815260408160048160018060a01b03608051165afa90811561059a5761014051916105eb575b50670de0b6b3a764000060243502906024358204670de0b6b3a7640000036105d15761036d916120bd565b610140519091905b60a05181106103d75760408051602435815260a05160208201526080516001600160a01b0316917f8c7800309791647cebc58a9ad7f5b61cd35f8c5a112e600b8b47aa801e2c4a4491a260015f5160206140245f395f51905f52556101405180f35b6103ec6103e78260a05185612086565b611c68565b906104006103fb828b8b612086565b611c46565b9161040e83826080516118bd565b60018060a01b0360805116610140515260026020526040610140512060018060a01b0382165f5260205260405f208315156101405152602052604061014051209260ff6002604051956104608761168a565b805487526001810154602088015201548181161515604087015260081c1615801560608601526105bc57670de0b6b3a76400006104ae87826104a68260208a01516120aa565b0496516120aa565b04841580156105b4575b6105a85764e8d4a510009004936104d3848b61010051612086565b608051903592906001600160a01b03163b156101e25760405163c7abd40b60e01b81526004810193909352610140516080518490602490829084906001600160a01b03165af191821561059a578e8a8d958d9561056f575b509761055f886105548161054a816105699c9b9a99989760019f612086565b359760e051612086565b359661010051612086565b35956080516137ae565b01610375565b9294505050610585919493506101405190611726565b610140516101e25789919289918e8a5f61052b565b6040513d61014051823e3d90fd5b50505060019150610569565b5080156104b8565b6394e88a2160e01b6101405152600461014051fd5b634e487b7160e01b61014051526011600452602461014051fd5b90506040813d604011610618575b8161060660409383611726565b810103126101e2576020015188610342565b3d91506105f9565b631fec674760e31b6101405152600461014051fd5b508360a0511461030c565b508260a05114610306565b508660a05114610300565b508560a051146102fa565b631f2a200560e01b6101405152600461014051fd5b633b4e077560e11b6101405152600461014051fd5b346101e25760403660031901126101e2576106da6004356106aa611660565b906106d56106d0825f525f5160206140045f395f51905f52602052600160405f20015490565b612199565b6123fe565b506101405180f35b346101e2576106f0366117ff565b5090507fb255fad558f3e9e70ce7dd650085b45f7536ab33f1249bc476d06143dede56ee6020610195604061018f8580611c53565b346101e2576101003660031901126101e25761073f61164a565b6101c0526024356001600160401b0381116101e25761076290369060040161185a565b610120526044356001600160401b0381116101e25761078590369060040161185a565b610160526064356001600160401b0381116101e2576107a890369060040161185a565b90926084356001600160401b0381116101e2576107c990369060040161185a565b60a4929192356001600160401b0381116101e2576107eb90369060040161185a565b929060c4356001600160401b0381116101e25761080c90369060040161185a565b92909560e4356001600160401b0381116101e25761082e90369060040161185a565b60c0529661083a6124e8565b61084261212a565b6101c05161014080516001600160a01b039283169052600160205251604090205416156106765761012051151580610b46575b80610b3a575b80610b2e575b80610b22575b80610b16575b80610b08575b1561062057610140516101e08190526101a0525b610160516101a05110610ad6576108c46101e0516101c05161260e565b6101c0516001600160a01b03163b156101e257604051610180526360c66b1360e11b6101805152600461018051015261014051610180516024610180516101405160018060a01b036101c051165af1801561059a57610ab6575b610140515b61012051811061098957604080516101e05181526101205160208201526101c0516001600160a01b0316917fdcde17004932a81154ef61951ce171646b0e83ee2cd0ed4e1c01ab178634563791a260015f5160206140245f395f51905f52556101405180f35b6109968160c0518b612086565b6101c0519035906001600160a01b03163b156101e25760405163c7abd40b60e01b81526004810191909152610140516101c0518290602490829084906001600160a01b03165af190811561059a578a838f8f948f948e928b8f93928f93610a86575b509185949291858095938161012051610a1092612086565b610a1990611c68565b9a8161016051610a2892612086565b3599610a3392612086565b3593610a3f918c612086565b610a4890611c46565b93610a53918c612086565b3593610a5f918d612086565b35938760c051610a6e92612086565b35946101c05196610a7e97612714565b600101610923565b975050505050505050610a9e91506101405190611726565b610140516101e2578a8a8a838f8b8b8e928b5f6109f8565b610ac66101405161018051611726565b610140511561091e576101405180fd5b610af4610aea6101a051610160518d612086565b356101e051611c7c565b6101e05260016101a051016101a0526108a7565b5060c0516101205114610893565b5084610120511461088d565b50866101205114610887565b50856101205114610881565b5088610120511461087b565b50610160516101205114610875565b610b5e366117a7565b95610b6d9591959492946124e8565b61014080516001600160a01b038a811690915260016020529051604090205416330361067657610bb097610ba088612596565b610bab8583836118bd565b6137ae565b60015f5160206140245f395f51905f52556101405180f35b346101e257610140513660031901126101e25761014051546040516001600160a01b039091168152602090f35b346101e25760603660031901126101e257610c0e61164a565b610c16611660565b60443591906001600160a01b03831683036101e2575f5160206140445f395f51905f52549260ff8460401c1615936001600160401b03811680159081610dd8575b6001149081610dce575b159081610dc5575b50610db05767ffffffffffffffff1981166001175f5160206140445f395f51905f525584610d84575b506001600160a01b038316151580610d72575b15610d5d57610cf692610ceb610cf092610cbd613f73565b610cc5613f73565b610ccd613f73565b610cd5613f73565b60015f5160206140245f395f51905f525561249a565b6121df565b5061228e565b50610d03575b6101405180f35b68ff0000000000000000195f5160206140445f395f51905f5254165f5160206140445f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1610cfc565b63d92e233d60e01b6101405152600461014051fd5b506001600160a01b0382161515610ca5565b68ffffffffffffffffff191668010000000000000001175f5160206140445f395f51905f525584610c92565b63f92ee8a960e01b6101405152600461014051fd5b90501586610c69565b303b159150610c61565b869150610c57565b346101e25760403660031901126101e257610df961164a565b610e01611660565b90610e0a61212a565b6001600160a01b0316908115610d5d5761014080518390526001602052516040812080546001600160a01b0319166001600160a01b0390931692831790553392907f38e97131c41f365b330583dbfa8b164e45cafde736f4842613f04ae7700155709080a46101405180f35b346101e257610140513660031901126101e2576040805190610e988183611726565b600582526020820191640352e302e360dc1b83528151928391602083525180918160208501528484015e61014051828201840152601f01601f19168101030190f35b346101e257610140513660031901126101e2576020604051610140518152f35b346101e25760403660031901126101e257610f13611660565b60043561014051525f5160206140045f395f51905f52602052604061014051209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101e257610cfc610f66366117ff565b9150611caa565b346101e25760603660031901126101e257610cfc610f8961164a565b610f91611660565b610f99611798565b916118bd565b346101e25760603660031901126101e257610fb861164a565b610fc0611660565b610fc8611798565b9160018060a01b031661014051526002602052604061014051209060018060a01b03165f5260205260405f2090151561014051526020526040610140512080549061104a6002600183015492015460405193849360ff808460081c16931691859260609295949195608085019685526020850152151560408401521515910152565b0390f35b611057366117a7565b956110669591959492946124e8565b6001600160a01b038881165f818152600160205260409020549099911633036110fc5761109288612596565b61109c838261260e565b893b156110f8575f9960248b926040519c8d9384926360c66b1360e11b845260048401525af19889156110ed57610bb0996110d8575b50612714565b5f6110e291611726565b5f61014052896110d2565b6040513d5f823e3d90fd5b5f80fd5b633b4e077560e11b5f5260045ffd5b346110f85760603660031901126110f85761112461164a565b61112c611660565b90604435916111396124e8565b6111416120db565b6001600160a01b03811691821561120f578315611200576001600160a01b0316908382156111e95760405163a9059cbb60e01b60208201526001600160a01b0392909216602483015260448083019190915281526111aa906111a4606482611726565b82613eab565b6040519283527f2098976920827f095c56419969a63d95c46499f652b474df5dc8b5433faa64b260203394a460015f5160206140245f395f51905f5255005b90504710611200576111fb838361254f565b6111aa565b631f2a200560e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b346110f8575f3660031901126110f8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036112755760206040515f516020613fe45f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b60403660031901126110f85761129861164a565b6024356001600160401b0381116110f857366023820112156110f8576112c8903690602481600401359101611762565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611440575b506112755761130a6120db565b6040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f918161140c575b5061134c5783634c9c8ce360e01b5f5260045260245ffd5b805f516020613fe45f395f51905f528592036113fa5750813b156113e8575f516020613fe45f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156113d0575f8083602061001b95519101845af46113ca612520565b91613f9e565b5050346113d957005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011611438575b8161142860209383611726565b810103126110f857519085611334565b3d915061141b565b5f516020613fe45f395f51905f52546001600160a01b031614159050836112fd565b346110f85760203660031901126110f85761001b61147e61164a565b6114866120db565b61249a565b60403660031901126110f8576024356001600160401b0381116110f85760e09060031990360301126110f857346114be57005b7fc202efce9101af0f52dd65dab6174a60de5e3c29f65a1711b050e306933045436020604051348152a1005b346110f85760403660031901126110f857611503611660565b336001600160a01b0382160361151f5761001b906004356123fe565b63334bd91960e11b5f5260045ffd5b346110f85760403660031901126110f85761001b60043561154d611660565b906115736106d0825f525f5160206140045f395f51905f52602052600160405f20015490565b61235a565b346110f85760203660031901126110f8576001600160a01b0361159961164a565b165f526001602052602060018060a01b0360405f205416604051908152f35b346110f85760203660031901126110f85760206115ef6004355f525f5160206140045f395f51905f52602052600160405f20015490565b604051908152f35b346110f85760203660031901126110f8576004359063ffffffff60e01b82168092036110f857602091637965db0b60e01b8114908115611639575b5015158152f35b6301ffc9a760e01b14905083611632565b600435906001600160a01b03821682036110f857565b602435906001600160a01b03821682036110f857565b35906001600160a01b03821682036110f857565b608081019081106001600160401b038211176116a557604052565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176116a557604052565b604081019081106001600160401b038211176116a557604052565b60e081019081106001600160401b038211176116a557604052565b61010081019081106001600160401b038211176116a557604052565b90601f801991011681019081106001600160401b038211176116a557604052565b6001600160401b0381116116a557601f01601f191660200190565b92919261176e82611747565b9161177c6040519384611726565b8294818452818301116110f8578281602093845f960137010152565b6044359081151582036110f857565b6101009060031901126110f8576004356001600160a01b03811681036110f857906024356001600160a01b03811681036110f85790604435906064359060843580151581036110f8579060a4359060c4359060e43590565b60606003198201126110f857600435916024356001600160401b0381116110f85761020081840360031901126110f85760040191604435906001600160401b0382116110f85760e09082900360031901126110f85760040190565b9181601f840112156110f8578235916001600160401b0383116110f8576020808501948460051b0101116110f857565b908160209103126110f857516001600160a01b03811681036110f85790565b51906001600160a01b03821682036110f857565b60405163046bb67760e31b81529290916001600160a01b038316602085600481845afa9485156110ed575f95611c15575b50604051630111635160e71b8152602081600481855afa9081156110ed575f91611bdb575b5060405163143af47760e01b8152602081600481865afa9081156110ed575f91611b96575b50906119b6966101a09260405196602088019186835260018060a01b03881660408a015260018060a01b031660608901521515968760808201526080815261198160a082611726565b5190206040516307d47a8b60e11b81526001600160a01b03909316600484015260248301529096879190829081906044820190565b03916001600160a01b03165afa9485156110ed575f95611a46575b505f52600260205260405f209060018060a01b03165f5260205260405f20905f5260205260026040805f2093611a176020820194838651805160018a015501519061260e565b85550151519201805491515161ffff1990921660ff931515939093169290921790151560081b61ff0016179055565b809195506101a03d8111611b8f575b611a5f8183611726565b810103906101a082126110f85760405191611a79836116b9565b606081126110f857604051611a8d816116b9565b611a96836118a9565b8152611aa4602084016118a9565b6020820152611ab5604084016118a9565b60408201528352610120605f198201126110f857604051906101208201918083106001600160401b038411176116a5576020926040526060840151815260808401518382015260a0840151604082015260c0840151606082015260e0840151608082015261010084015160a082015261012084015160c082015261014084015160e08201526101608401516101008201528285015261017f1901126110f8576040519060208201908282106001600160401b038311176116a55761018091604052015180151581036110f85781526040820152935f6119d1565b503d611a55565b9190506020823d602011611bd3575b81611bb260209383611726565b810103126110f8576119b696611bca6101a0936118a9565b91925096611938565b3d9150611ba5565b90506020813d602011611c0d575b81611bf660209383611726565b810103126110f857611c07906118a9565b5f611913565b3d9150611be9565b611c3891955060203d602011611c3f575b611c308183611726565b81019061188a565b935f6118ee565b503d611c26565b3580151581036110f85790565b90359060fe19813603018212156110f8570190565b356001600160a01b03811681036110f85790565b91908201809211611c8957565b634e487b7160e01b5f52601160045260245ffd5b91908203918211611c8957565b90611cb86101808301611c46565b90611cc860a061018f8580611c53565b611cd7604061018f8680611c53565b90611ce182612e6b565b60205f95013560098110156110f857600319016120785760405163143af47760e01b81526001600160a01b038316949093602085600481895afa9485156110ed575f9561203c575b50604051631b206b7360e01b81526020816004818a5afa9081156110ed575f9161201d575b506040516370a0823160e01b8152306004820152956001600160a01b03818116921690602088602481865afa9788156110ed575f98611fe9575b50611d928461306b565b97611d9c85613279565b611da586613187565b611dae87613382565b915f9b878215159182611fd6575b5050611fce575b50858215159182611fbb575b5050611fa4575b50908792916003548082115f14611f9c57611df091611c9d565b8915611f9657808a11611f915750885b905b81611f2d575b505050506020602491604051928380926370a0823160e01b82523060048301525afa908115611f22578891611ee9575b5060026040611e867fac97038b540f6a1396a1cf2c930d884a15867813ba2e406e8b0dafb4d61ccb2698611e80611ee4979660ff96600355611e7b888b8d6118bd565b613479565b9861260e565b998981528260205281812060018060a01b0388165f52602052815f20851515825260205220015460081c169060405194859460018060a01b031698859260609295949195608085019685526020850152151560408401521515910152565b0390a3565b929190506020833d602011611f1a575b81611f0660209383611726565b810103126110f85791519091906002611e38565b3d9150611ef9565b6040513d8a823e3d90fd5b8291611f4493611f3c92613570565b928391613670565b873b156110f85760405190639ae4116b60e01b825260048201525f81602481838c5af180156110ed57611f7b575b80808792611e08565b611f889198505f90611726565b5f966020611f72565b611e00565b90611e02565b50505f611df0565b611fb290899493929a611c7c565b98909192611dd6565b6001600160a01b0316149050855f611dcf565b9a505f611dc3565b6001600160a01b0316149050875f611dbc565b9097506020813d602011612015575b8161200560209383611726565b810103126110f85751965f611d88565b3d9150611ff8565b612036915060203d602011611c3f57611c308183611726565b5f611d4e565b9094506020813d602011612070575b8161205860209383611726565b810103126110f857612069906118a9565b935f611d29565b3d915061204b565b915061208493506118bd565b565b91908110156120965760051b0190565b634e487b7160e01b5f52603260045260245ffd5b81810292918115918404141715611c8957565b81156120c7570490565b634e487b7160e01b5f52601260045260245ffd5b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff161561211357565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527f9820777f3b5c4a55ba3649af6ff157717cfd4aa964ddedabebc16c5bafb84aba602052604090205460ff161561216257565b63e2517d3f60e01b5f52336004527f205783d38d15a7146707395edcf4f3346fe724136da9a399f4abb11a50e4316c60245260445ffd5b5f8181525f5160206140045f395f51905f526020908152604080832033845290915290205460ff16156121c95750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16612289576001600160a01b03165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b6001600160a01b0381165f9081527f9820777f3b5c4a55ba3649af6ff157717cfd4aa964ddedabebc16c5bafb84aba602052604090205460ff16612289576001600160a01b03165f8181527f9820777f3b5c4a55ba3649af6ff157717cfd4aa964ddedabebc16c5bafb84aba60205260408120805460ff191660011790553391907f205783d38d15a7146707395edcf4f3346fe724136da9a399f4abb11a50e4316c907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181525f5160206140045f395f51905f52602090815260408083206001600160a01b038616845290915290205460ff166123f8575f8181525f5160206140045f395f51905f52602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f8181525f5160206140045f395f51905f52602090815260408083206001600160a01b038616845290915290205460ff16156123f8575f8181525f5160206140045f395f51905f52602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b6001600160a01b0316801561120f57806bffffffffffffffffffffffff60a01b5f5416175f5533907fca394f95d8dbf1e8b2e76b9a8da90cacce1da85181a65508dab13212dc1df53b5f80a3565b60025f5160206140245f395f51905f5254146125115760025f5160206140245f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b3d1561254a573d9061253182611747565b9161253f6040519384611726565b82523d5f602084013e565b606090565b81471061257f575f918291829182916001600160a01b03165af1612571612520565b901561257a5750565b613e8d565b504763cf47918160e01b5f5260045260245260445ffd5b6125a03447611c9d565b8181106125ba575050346125b057565b612084343361254f565b6125c391611c9d565b8034106125e6576125d49034611c9d565b806125dc5750565b612084903361254f565b63451fd27960e01b5f5260045ffd5b908160209103126110f8575160ff811681036110f85790565b604051631b206b7360e01b815291906001600160a01b0316602083600481845afa9283156110ed576004936020915f916126f7575b5060405163313ce56760e01b815294859182906001600160a01b03165afa9081156110ed576004935f926126d5575b506020906040519485809263313ce56760e01b82525afa9182156110ed576126a1935f936126a4575b50613f03565b90565b6126c791935060203d6020116126ce575b6126bf8183611726565b8101906125f5565b915f61269b565b503d6126b5565b60209192506126f090823d84116126ce576126bf8183611726565b9190612672565b61270e9150823d8411611c3f57611c308183611726565b5f612643565b9695949195939092935f97871561120057612730828787613f42565b60405163143af47760e01b81526001600160a01b038216986020826004818d5afa9182156110ed575f92612e2d575b50604051631b206b7360e01b8152906020826004818e5afa9283156110ed576127a39361279c935f91612e0e575b506001600160a01b0316613570565b809261260e565b9460405163046bb67760e31b81526020816004818d5afa80156110ed57612df1575b5060405163f132f9f760e01b81529960208b6004818d5afa9384156110ed575f94612db5575b604051630111635160e71b81529b5060208c6004818e5afa80156110ed57612d7b575b60405163143af47760e01b81529b5060208c6004818e5afa80156110ed575f61020052612d3e575b604051630e3a261d60e41b81529b5060208c6004818e5afa9485156110ed575f9c8d96612d1d575b506020956040519d8e6128718982611726565b525f3681376001600160a01b031690813b156110f857604051637d39aaf160e01b81526001600160a01b0382166004820152602481018490525f8160448187875af180156110ed57612d08575b5083612cf4576040516303e21fa960e61b81528781600481865afa80156110ed5787905f90612cbc575b610200516128ff93506001600160a01b0316613670565b813b156110f857604051631cdacd5960e31b8152610200516001600160a01b039081166004830152909116602482015260448101869052905f908290606490829084905af180156110ed57612ca7575b506040519261295d846116ef565b3084528b8685015230604085015282606085015260018060a01b03169b8c608085015260018060a01b03610200511660a085015260c084015262061a8090604051946129a88661170a565b8a8652868601528a6040860152876060860152608085015260a08401528060c08401528060e0840152604051916129de8361170a565b8252838201928352806040830191612c9357506002815260608201915f915f84528b60808301948815159586815260a08501915f835260c08601945f865260e08701948086523b156110f85760408051631f49d83960e31b8152600481018d905297516101e060248a015280516001600160a01b039081166102048b0152818e015181166102248b01529181015182166102448a0152606081015182166102648a0152608081015182166102848a015260a08101519091166102a489015260c0015160e06102c489015280516102e48901819052979a6103048c019890918d01905f8e5b828210612c75575050505060e09051805160448d01528c81015160648d0152604081015160848d0152606081015160a48d0152608081015160c48d015260a081015160e48d015260c08101516101048d015201516101248b0152516009811015612c61576101448a0152516003811015612c61576101648901525115156101848801525115156101a4870152905115156101c4860152516101e48501525f90849081900381838e5af19182156110ed5760ff94600294604094612c4c575b508b83528481528383208d5f528152835f209183525220015460081c16155f14612bf85793611ee4917f9f000dddd6c040982ed4c0ff91e48ded516eada329b0e43af2935f24255856e795604051958695869192608093969594919660a0840197845260208401521515604083015260608201520152565b93611ee4917fcb92546a59e272e39d67fd89f8c6026242b9c190258225c7d6de6cc37d076ba895604051958695869192608093969594919660a0840197845260208401521515604083015260608201520152565b612c599193505f90611726565b5f915f612b80565b634e487b7160e01b5f52602160045260245ffd5b83516001600160a01b03168c529a8b019a909201916001018e612ac2565b634e487b7160e01b81526021600452602490fd5b612cb49192505f90611726565b5f905f61294f565b50508781813d8311612ced575b612cd38183611726565b810103126110f85786612ce86128ff926118a9565b6128e8565b503d612cc9565b634e487b7160e01b84526021600452602484fd5b612d159194505f90611726565b5f925f6128be565b612d3791965060203d602011611c3f57611c308183611726565b945f61285e565b60208c3d602011612d73575b81612d5760209383611726565b810103126110f857612d6a60049c6118a9565b61020052612836565b3d9150612d4a565b60208c3d602011612dad575b81612d9460209383611726565b810103126110f857612da760049c6118a9565b5061280e565b3d9150612d87565b935060208b3d602011612de9575b81612dd060209383611726565b810103126110f857612de360049b6118a9565b936127eb565b3d9150612dc3565b612e099060203d602011611c3f57611c308183611726565b6127c5565b612e27915060203d602011611c3f57611c308183611726565b5f61278d565b9091506020813d602011612e63575b81612e4960209383611726565b810103126110f857612e5c6004916118a9565b919061275f565b3d9150612e3c565b60405163f132f9f760e01b8152906001600160a01b0316602082600481845afa9182156110ed575f92612f9f575b50604051635d9f4eaf60e01b815290602082600481845afa9182156110ed575f92612f5e575b50602060049160405192838092630e3a261d60e41b82525afa9081156110ed575f91612f3f575b506001600160a01b03163314918215612f2c575b508115612f19575b5015612f0a57565b6317fe949f60e01b5f5260045ffd5b6001600160a01b0316331490505f612f02565b6001600160a01b0316331491505f612efa565b612f58915060203d602011611c3f57611c308183611726565b5f612ee6565b9091506020813d602011612f97575b81612f7a60209383611726565b810103126110f8576020612f8f6004926118a9565b929150612ebf565b3d9150612f6d565b9091506020813d602011612fd3575b81612fbb60209383611726565b810103126110f857612fcc906118a9565b905f612e99565b3d9150612fae565b903590603e19813603018212156110f8570190565b903590601e19813603018212156110f857018035906001600160401b0382116110f857602001918160051b360383136110f857565b6001600160401b0381116116a55760051b60200190565b9080601f830112156110f8578160206126a193359101611762565b80518210156120965760209160051b010190565b61307861307e9180612fdb565b80612ff0565b61308781613025565b916130956040519384611726565b818352602083019160051b8101903682116110f85780925b82841061312057505050505f5b81518110156123f8577f0e2bdb4543d3dde638889e299f3077a504f2459e21e772b880736b2908359a476130ee8284613057565b51516020815191012014613104576001016130ba565b6001600160a01b039160209161311991613057565b5101511690565b83356001600160401b0381116110f8578201906040823603126110f8576040519061314a826116d4565b8235916001600160401b0383116110f8576131786020809561317082963690830161303c565b845201611676565b838201528152019301926130ad565b6130786131949180612fdb565b61319d81613025565b916131ab6040519384611726565b818352602083019160051b8101903682116110f85780925b82841061321a57505050505f5b81518110156123f8577fe25be3b9d0e519197846c36d36faee0d5177aab6c1945085a27d84e14f46503a6132048284613057565b51516020815191012014613104576001016131d0565b83356001600160401b0381116110f8578201906040823603126110f85760405190613244826116d4565b8235916001600160401b0383116110f85761326a6020809561317082963690830161303c565b838201528152019301926131c3565b61307861328a916020810190612fdb565b61329381613025565b916132a16040519384611726565b818352602083019160051b8101903682116110f85780925b82841061332257505050505f5b81518110156123f8577fc990f6f26e1062806d4ec4839054fa0f73903c3e7e395d83b1ce838a0791b88d6132fa8284613057565b51516020815191012014613310576001016132c6565b61331c90602092613057565b51015190565b83356001600160401b0381116110f85782016040813603126110f8576040519161334b836116d4565b8135926001600160401b0384116110f857602080949361336f82953690830161303c565b83520135838201528152019301926132b9565b613078613393916020810190612fdb565b61339c81613025565b916133aa6040519384611726565b818352602083019160051b8101903682116110f85780925b82841061341957505050505f5b81518110156123f8577fbd1174896b31e04603a1f9064bb1be4e504f7030724f2f62cdd19e77cfe464b56134038284613057565b51516020815191012014613310576001016133cf565b83356001600160401b0381116110f85782016040813603126110f85760405191613442836116d4565b8135926001600160401b0384116110f857602080949361346682953690830161303c565b83520135838201528152019301926133c2565b61307861348a916020810190612fdb565b61349381613025565b916134a16040519384611726565b818352602083019160051b8101903682116110f85780925b82841061351057505050505f5b81518110156123f8577f2db38b377f74401c3936458f83559e0836d91e7a02a019425a7d651a6f671a7e6134fa8284613057565b51516020815191012014613310576001016134c6565b83356001600160401b0381116110f85782016040813603126110f85760405191613539836116d4565b8135926001600160401b0384116110f857602080949361355d82953690830161303c565b83520135838201528152019301926134b9565b5f546020929160e4916001600160a01b03918216916135929187911683613670565b6040519061359f826116ef565b81526001600160a01b039283168482019081526101f460408084019182523060608501908152608085019889525f60a0860181815260c08701828152825494516304e45aaf60e01b815297518a166004890152955189166024880152935162ffffff16604487015290518716606486015297516084850152905160a48401529051841660c4830152909485938492165af19081156110ed575f91613641575090565b90506020813d602011613668575b8161365c60209383611726565b810103126110f8575190565b3d915061364f565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152929392821692602082604481875afa80156110ed575f9061377a575b6136b99250611c7c565b60405163095ea7b360e01b60208083019182526001600160a01b0387166024840152604480840194909452928252909391905f906136f8606487611726565b85519082865af1903d5f51908361375b575b5050501561371757505050565b60405163095ea7b360e01b60208201526001600160a01b0390931660248401525f604480850191909152835261208492613756906111a4606482611726565b613eab565b9192509061377057503b15155b5f808061370a565b6001915014613768565b506020823d6020116137a6575b8161379460209383611726565b810103126110f8576136b991516136af565b3d9150613787565b929391909594966137c0818689613f42565b5f9780156112005760018060a01b03851696875f52600260205260405f2060018060a01b038a165f5260205260405f209585151596875f5260205260405f209060ff600283015460081c1615613e7e5760018201548911613e6f57856138259161260e565b8015159182613e63575b505015613e545760405163046bb67760e31b8152946020866004818c5afa9586156110ed575f96613e33575b5060405163f132f9f760e01b8152906020826004818d5afa9081156110ed575f91613df7575b604051630111635160e71b815292506020836004818e5afa9081156110ed575f91613dbb575b60405163143af47760e01b815293506020846004818f5afa9384156110ed575f94613d7f575b50600460208d60405192838092630e3a261d60e41b82525afa998a156110ed578e915f9b613d51575b5060405163714af34b60e01b81526001600160a01b0394851660048201529390911660248401526060919060809084908180604481015b03916001600160a01b03165afa9283156110ed575f93613cd6575b5015613cc65750604001516001600160a01b03165b6001600160a01b03908116921690818314613ca757604051613980606082611726565b600281526020810193604036863781948251156120965752805160011015612096576040839101526001975b6001600160a01b0316803b156110f857604051637d39aaf160e01b81526001600160a01b03929092166004830152602482018790525f90829060449082908a905af180156110ed57613c92575b506040519a613a078c6116ef565b308c528a60208d01523060408d01528c60608d015260018060a01b031660808c015260a08b015260c08a01526216e3609360405197613a458961170a565b8852602088015260408701526060860152608085015260a08401528560c08401528560e084015260405194613a798661170a565b85526020850192835260408501916004835260608601916003811015613c7e5782526080860190815260a086019087825260c087019288845260e0880194878652873b15613c7a5760408051631f49d83960e31b81526020600482018190529a516101e0602483015280516001600160a01b03908116610204840152818d01518116610224840152928101518316610244830152606081015183166102648301526080810151831661028483015260a08101519092166102a482015260c09091015160e06102c483015280516102e48301819052919a6103048c0199929101908c5b818110613c5b5750505060e09051805160448c0152602081015160648c0152604081015160848c0152606081015160a48c0152608081015160c48c015260a081015160e48c015260c08101516101048c015201516101248a0152516009811015613c4757610144890152516003811015613c33576101648801525115156101848701525115156101a48601525115156101c4850152516101e48401528391839182900390829084905af18015613c2857613c13575050565b613c1e828092611726565b613c255750565b80fd5b6040513d84823e3d90fd5b634e487b7160e01b89526021600452602489fd5b634e487b7160e01b8a52602160045260248afd5b82516001600160a01b03168b5260209a8b019a90920191600101613b5b565b8980fd5b634e487b7160e01b88526021600452602488fd5b613c9f919c505f90611726565b5f9a5f6139f9565b9150604051613cb7602082611726565b5f81525f368137915f976139ac565b01516001600160a01b031661395d565b9092506080813d608011613d49575b81613cf260809383611726565b810103126110f857613d3e8260405192613d0b8461168a565b613d14816118a9565b8452613d22602082016118a9565b6020850152613d33604082016118a9565b6040850152016118a9565b82820152915f613948565b3d9150613ce5565b6080919b5091613d7461392d95949360203d602011611c3f57611c308183611726565b9b91509192936138f6565b9093506020813d602011613db3575b81613d9b60209383611726565b810103126110f857613dac906118a9565b925f6138cd565b3d9150613d8e565b90506020833d602011613def575b81613dd660209383611726565b810103126110f857613de96004936118a9565b906138a7565b3d9150613dc9565b90506020823d602011613e2b575b81613e1260209383611726565b810103126110f857613e256004926118a9565b90613881565b3d9150613e05565b613e4d91965060203d602011611c3f57611c308183611726565b945f61385b565b63174ab2cb60e31b5f5260045ffd5b54101590505f8061382f565b63fa98bf3d60e01b5f5260045ffd5b6394e88a2160e01b5f5260045ffd5b805115613e9c57805190602001fd5b63d6bda27560e01b5f5260045ffd5b905f602091828151910182855af1156110ed575f513d613efa57506001600160a01b0381163b155b613eda5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415613ed3565b9060ff831660ff82168181145f14613f1d57505050905090565b1015613f305760ff91920316600a0a0290565b6126a19260ff910316600a0a906120bd565b9015613e6f576001600160a01b03161561120f578015159081613f68575b50156125e657565b90504710155f613f60565b60ff5f5160206140445f395f51905f525460401c1615613f8f57565b631afcd79f60e31b5f5260045ffd5b90613fa95750613e8d565b81511580613fda575b613fba575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15613fb256fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081d000af0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00