0 txs
1.1k calls
constructor
constructor()
functions
ADMIN_ROLE
viewfunction ADMIN_ROLE() view returns (bytes32)
adminUnlocked
viewfunction adminUnlocked() view returns (bool)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
balanceOfAt
viewfunction balanceOfAt(address account, uint256 timestamp) view returns (uint256)
balanceOfLock
viewfunction balanceOfLock(address account, uint256 index) view returns (uint256)
baseToken
viewfunction baseToken() view returns (address)
CLOCK_MODE
viewfunction CLOCK_MODE() view returns (string)
clock
viewfunction clock() view returns (uint48)
decimals
purefunction decimals() pure returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
delegates
viewfunction delegates(address account) view returns (address)
DENOM
viewfunction DENOM() view returns (uint16)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
getMaturity
viewfunction getMaturity(address account, uint256 id) view returns (uint256)
getPastTotalSupply
viewfunction getPastTotalSupply(uint256 timepoint) view returns (uint256)
getPastVotes
viewfunction getPastVotes(address account, uint256 timepoint) view returns (uint256)
getPositions
viewfunction getPositions(address account, uint256 start, uint256 count) view returns (tuple[])
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getVotes
viewfunction getVotes(address account) view returns (uint256)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
locks
viewfunction locks(address, uint256) view returns (uint256 amount, uint256 start, uint256 end, uint8 numWeeks, bool autoRenew, uint256 id)
MAX_POSITIONS
viewfunction MAX_POSITIONS() view returns (uint256)
maxWeeks
viewfunction maxWeeks() view returns (uint8)
name
viewfunction name() view returns (string)
nonces
viewfunction nonces(address owner) view returns (uint256)
numPositions
viewfunction numPositions(address account) view returns (uint256)
stakedAmountOf
viewfunction stakedAmountOf(address account) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
delegate
nonpayablefunction delegate(address delegatee)
delegateBySig
nonpayablefunction delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s)
extend
nonpayablefunction extend(uint256 id, uint8 numWeeks)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address baseToken_, uint8 maxWeeks_, string name_, string symbol_)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setAdminUnlocked
nonpayablefunction setAdminUnlocked(bool adminUnlocked_)
setMaxWeeks
nonpayablefunction setMaxWeeks(uint8 maxWeeks_)
stake
nonpayablefunction stake(uint256 amount)
toggleAutoRenew
nonpayablefunction toggleAutoRenew(uint256 id)
withdraw
nonpayablefunction withdraw(uint256 id)
events
AdminUnlocked
event AdminUnlocked(bool adminUnlocked)
AutoRenew
event AutoRenew(address indexed user, uint256 id, bool autoRenew)
DelegateChanged
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)
DelegateVotesChanged
event DelegateVotesChanged(address indexed delegate, uint256 previousVotes, uint256 newVotes)
EIP712DomainChanged
event EIP712DomainChanged()
Extend
event Extend(address indexed user, uint256 id, uint8 numWeeks)
Initialized
event Initialized(uint64 version)
MaxWeeksSet
event MaxWeeksSet(uint8 newMaxWeeks, uint8 oldMaxWeeks)
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)
Stake
event Stake(address indexed user, uint256 id, uint256 amount, uint8 numWeeks)
Withdraw
event Withdraw(address indexed user, uint256 id, uint256 amount)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
CheckpointUnorderedInsertion
error CheckpointUnorderedInsertion()
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
ERC5805FutureLookup
error ERC5805FutureLookup(uint256 timepoint, uint48 clock)
ERC6372InconsistentClock
error ERC6372InconsistentClock()
FailedInnerCall
error FailedInnerCall()
InvalidAccountNonce
error InvalidAccountNonce(address account, uint256 currentNonce)
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
VotesExpiredSignature
error VotesExpiredSignature(uint256 expiry)
creation bytecode
0x60808060405234620000bd577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16620000ae57506001600160401b036002600160401b03198282160162000068575b604051613cdc9081620000c28239f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f808062000058565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146102a457806306fdde031461029f57806316343da41461029a578063248a9ca314610295578063288b1c68146102905780632b4bce311461028b5780632e1a7d4d146102865780632f2ff15d14610281578063313ce5671461027c57806336568abe146102775780633a46b1a81461027257806342fe09801461026d5780634bf5d7e9146102685780634ee2cd7e1461026357806355168c931461025e578063587cde1e146102595780635c19a95c146102545780635fcdad911461024f578063605830ef1461024a5780636e7ed07b1461024557806370a082311461024057806375b238fc1461023b5780637e530d2f146102365780637ecebe001461023157806384b0196e1461022c5780638e539e8c1461022757806391d148541461022257806391ddadf41461021d57806395d89b41146102185780639ab24eb014610213578063a217fddf1461020e578063a694fc3a14610209578063b425f80214610204578063b7d7702c146101ff578063be3956bf146101fa578063c3cda520146101f5578063c55dae63146101f0578063d547741f146101eb578063de6e659c146101e6578063f48355b9146101e15763f7b24e08146101dc575f80fd5b61191c565b61182a565b6117e3565b61179a565b61176f565b6116a6565b611646565b611604565b61156d565b6113a4565b61138a565b61134e565b6112c5565b61129a565b611250565b611143565b611099565b610fbc565b610f9b565b610f74565b610f4f565b610e85565b610e5e565b610e3b565b610e19565b610dd4565b610cb6565b610c87565b610bf6565b610a93565b610839565b6107f2565b6107d7565b61078e565b610645565b610623565b610502565b610426565b61040a565b610350565b346102fa5760203660031901126102fa5760043563ffffffff60e01b81168091036102fa57602090637965db0b60e01b81149081156102e9575b506040519015158152f35b6301ffc9a760e01b1490505f6102de565b5f80fd5b91908251928382525f5b848110610328575050825f602080949584010152601f8019910116010190565b602081830181015184830182015201610308565b90602061034d9281815201906102fe565b90565b346102fa575f3660031901126102fa576040515f9060025461037181611937565b8083526020916001908181169081156103ea57506001146103ad575b6103a98461039d818803826109f5565b6040519182918261033c565b0390f35b91935060025f52835f20915f925b8284106103d757505050816103a99361039d928201019361038d565b80548585018701529285019281016103bb565b60ff1916858501525050151560051b820101915061039d816103a961038d565b346102fa575f3660031901126102fa5760206040516127108152f35b346102fa5760203660031901126102fa576004355f525f80516020613c078339815191526020526020600160405f200154604051908152f35b600435906001600160a01b03821682036102fa57565b602435906001600160a01b03821682036102fa57565b60208082019080835283518092528060408094019401925f905b8382106104b457505050505090565b8451805187528084015187850152808201518783015260608082015160ff169088015260808082015115159088015260a0908101519087015260c090950194938201936001909101906104a5565b346102fa5760603660031901126102fa5761051b61045f565b60243560443560018060a01b0383165f52600460205260405f20549281156105de576105528461054b8486611aca565b1115611ad7565b61055b82611b2a565b9383925f5b61056a8287611aca565b8510806105d5575b156105c757906105be6105b861056a9361059d610597896105928a6114d5565b61154f565b50611bc1565b6105a7828c611bad565b526105b2818b611bad565b50611b9f565b95611b9f565b94909150610560565b604051806103a9898261048b565b50828510610572565b60405162461bcd60e51b815260206004820152601c60248201527f636f756e74206d7573742062652067726561746572207468616e2030000000006044820152606490fd5b346102fa575f3660031901126102fa57602060ff5f5460081c16604051908152f35b346102fa5760203660031901126102fa576107436004356106646128a4565b61066e81336128e6565b9061067f61059783610592336114d5565b60408101514210801590610778575b61069790611c0d565b6106ad6106a76080830151151590565b15611c4f565b51916106c16106bb336114d5565b54611c93565b9081810361074d575b50506106dd6106d8336114d5565b611d40565b5f5461070990839033906107049060101c6001600160a01b03165b6001600160a01b031690565b61295f565b604080519182526020820183905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689190a2336129a0565b61074b6128d3565b005b61076b61076061077193610592336114d5565b5091610592336114d5565b90611cc5565b5f806106ca565b506106976107875f5460ff1690565b905061068e565b346102fa5760403660031901126102fa5761074b6004356107ad610475565b90805f525f80516020613c078339815191526020526107d2600160405f200154612b20565b612cb9565b346102fa575f3660031901126102fa57602060405160128152f35b346102fa5760403660031901126102fa5761080b610475565b336001600160a01b038216036108275761074b90600435612d23565b60405163334bd91960e11b8152600490fd5b346102fa5760403660031901126102fa5761085261045f565b6024359061085f43612d9e565b9065ffffffffffff91828116841015610932575061087f610885916114ee565b92612d9e565b8254905f9082600581116108e4575b506108a0935084613539565b90816108c75750506103a95f5b6040516001600160d01b0390911681529081906020820190565b6108d36103a992611c93565b905f5260205f20015460301c6108ad565b90926108ef82613376565b820391821161092d576108a094865f52808360205f20015416908516105f1461091b5750915b5f610894565b92915061092790611abc565b90610915565b611aa8565b604051637669fc0f60e11b81526004810185905265ffffffffffff919091166024820152604490fd5b6024359060ff821682036102fa57565b6004359060ff821682036102fa57565b6064359060ff821682036102fa57565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b038211176109ba57604052565b61098b565b604081019081106001600160401b038211176109ba57604052565b60a081019081106001600160401b038211176109ba57604052565b90601f801991011681019081106001600160401b038211176109ba57604052565b60405190610a238261099f565b565b60405190610a23826109bf565b6001600160401b0381116109ba57601f01601f191660200190565b81601f820112156102fa57803590610a6482610a32565b92610a7260405194856109f5565b828452602083830101116102fa57815f926020809301838601378301015290565b346102fa5760803660031901126102fa57610aac61045f565b610ab461095b565b6001600160401b0391906044358381116102fa57610ad6903690600401610a4d565b6064358481116102fa57610aee903690600401610a4d565b915f80516020613c67833981519152549460ff8660401c1615951680159081610bee575b6001149081610be4575b159081610bdb575b50610bc9575f80516020613c67833981519152805467ffffffffffffffff19166001179055610b579385610ba5576122bc565b610b5d57005b5f80516020613c67833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b5f80516020613c67833981519152805460ff60401b1916600160401b1790556122bc565b60405163f92ee8a960e01b8152600490fd5b9050155f610b24565b303b159150610b1c565b869150610b12565b346102fa575f3660031901126102fa57610c0f43612d9e565b65ffffffffffff80610c2043612d9e565b16911603610c75576103a9604051610c37816109bf565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c7400000060208201526040519182916020835260208301906102fe565b6040516301bfc1c560e61b8152600490fd5b346102fa5760403660031901126102fa576020610cae610ca561045f565b60243590612501565b604051908152f35b346102fa5760403660031901126102fa576004357f2b1bad57ed45c0298a4d6a14dc8850fb68015d5bd10457c2ec5ff8b587230173610dc9610cf661095b565b610cfe6128a4565b60ff8116610d0d811515612573565b610d23610d1a86336128e6565b610592336114d5565b50610dad60038201610d9f85610d996002845496610d4760ff8960081c1615611c4f565b0195610d9360ff885492610d5c8442106125be565b1698610d8e610d6b868c6125fc565b60ff610d85610d7f5f5460ff9060081c1690565b60ff1690565b91161115612610565b61266a565b90611aca565b956125fc565b60ff1660ff19825416179055565b556040805194855260ff90911660208501523393918291820190565b0390a261074b6128d3565b346102fa5760203660031901126102fa5760206001600160a01b0380610df861045f565b165f525f80516020613b67833981519152825260405f205416604051908152f35b346102fa5760203660031901126102fa5761074b610e3561045f565b33612eaf565b346102fa5760203660031901126102fa576020610cae610e5961045f565b6126ac565b346102fa5760403660031901126102fa576020610cae610e7c61045f565b602435906126f7565b346102fa5760203660031901126102fa57610e9e61096b565b610ea6612aa9565b60ff5f5460081c16908160ff82161115610efb576040805160ff838116825293909316602084015261074b927f6224e7691e132b657102111ee5f0230118e90ba436df71a43293bf7be662273d9190a1611e9b565b60405162461bcd60e51b815260206004820152602660248201527f6d61785765656b735f206d7573742062652067726561746572207468616e20636044820152651d5c9c995b9d60d21b6064820152608490fd5b346102fa5760203660031901126102fa576020610cae610f6d61045f565b4290612501565b346102fa575f3660031901126102fa5760206040515f80516020613c478339815191528152f35b346102fa575f3660031901126102fa57602060ff5f54166040519015158152f35b346102fa5760203660031901126102fa576001600160a01b03610fdd61045f565b165f527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052602060405f2054604051908152f35b9161104790949194600f60f81b845261103960209660e0602087015260e08601906102fe565b9084820360408601526102fe565b92606083015260018060a01b031660808201525f60a082015260c0818303910152602080845192838152019301915f5b828110611085575050505090565b835185529381019392810192600101611077565b346102fa575f3660031901126102fa575f80516020613bc783398151915254158061112d575b156110f0576110cc61196f565b6110d4611a1d565b906103a96110e0612771565b6040519384933091469186611013565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020613c8783398151915254156110bf565b346102fa5760203660031901126102fa5760043561116043612d9e565b9065ffffffffffff91828116821015611229575061117d90612d9e565b905f80516020613be7833981519152918254905f9082600581116111e0575b506111a793506134b4565b90816111c557505060205f5b6040516001600160d01b039091168152f35b6111d0602092611c93565b905f52815f20015460301c6111b3565b90926111eb82613376565b820391821161092d576111a794865f52808360205f20015416908516105f146112175750915b5f61119c565b92915061122390611abc565b90611211565b604051637669fc0f60e11b8152600481019290925265ffffffffffff166024820152604490fd5b346102fa5760403660031901126102fa57602060ff61128e611270610475565b6004355f525f80516020613c07833981519152845260405f20611526565b54166040519015158152f35b346102fa575f3660031901126102fa5760206112b543612d9e565b65ffffffffffff60405191168152f35b346102fa575f3660031901126102fa576040515f906003546112e681611937565b8083526020916001908181169081156103ea5750600114611311576103a98461039d818803826109f5565b91935060035f52835f20915f925b82841061133b57505050816103a99361039d928201019361038d565b805485850187015292850192810161131f565b346102fa5760203660031901126102fa5760206001600160d01b0361138161137c61137761045f565b6114ee565b612f5d565b16604051908152f35b346102fa575f3660031901126102fa5760206040515f8152f35b346102fa5760203660031901126102fa576107436004356113c36128a4565b6113ce811515612797565b6113e360c86113dc336114d5565b54106127e3565b5f546114099082906114009060101c6001600160a01b03166106f8565b30903390612f6a565b5f5460081c60ff167f6fa2f6021ee337436cdf2b2570285886da18bc06402ce284d296504a0fe8f8756114cc61144a61144460ff851661266a565b42611aca565b6114a56001549161146261145d84611b9f565b600155565b61146a610a16565b90878252426020830152604082015261148986606083019060ff169052565b6001608082015260a081019283526114a0336114d5565b612824565b51926040519182918633968491604091949360ff9160608501968552602085015216910152565b0390a233612a2a565b6001600160a01b03165f90815260046020526040902090565b6001600160a01b03165f9081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d016020526040902090565b9060018060a01b03165f5260205260405f2090565b634e487b7160e01b5f52603260045260245ffd5b8054821015611568575f52600560205f20910201905f90565b61153b565b346102fa5760403660031901126102fa5761158661045f565b6001600160a01b03165f9081526004602052604090208054602435908110156102fa576115b29161154f565b5080546001820154600283015460038401546004909401546040805194855260208501939093529183015260ff808416606084015260089390931c9092161515608082015260a081019190915260c090f35b346102fa5760203660031901126102fa576001600160a01b0361162561045f565b165f526004602052602060405f2054604051908152f35b801515036102fa57565b346102fa5760203660031901126102fa577f1664fc9d2adc81edeb38788b177fdfe12c9c15bd10b40663e9744e1af1c56a8660206004356116868161163c565b61168e612aa9565b151560ff195f541660ff8216175f55604051908152a1005b346102fa5760c03660031901126102fa576116bf61045f565b604435906024356116ce61097b565b8342116117565761174a61074b94611751926040519060208201927fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf845260018060a01b0388166040840152866060840152608083015260808252611732826109da565b61174560a4359360843593519020612fac565b61302c565b9182613044565b612eaf565b604051632341d78760e11b815260048101859052602490fd5b346102fa575f3660031901126102fa575f5460405160109190911c6001600160a01b03168152602090f35b346102fa5760403660031901126102fa5761074b6004356117b9610475565b90805f525f80516020613c078339815191526020526117de600160405f200154612b20565b612d23565b346102fa5760403660031901126102fa576001600160a01b0361180461045f565b165f5260046020526020610cae61182361059760243560405f2061154f565b4290612dee565b346102fa5760203660031901126102fa576004356118466128a4565b7f1d94e785ca79528225ae3b538b0fc686337b6c73da42dbfee64c8d01b0779913610dc961188861187784336128e6565b335f52600460205260405f2061154f565b5092600384016118c26118a76118a3835460ff9060081c1690565b1590565b828054909161ff001990911690151560081b61ff0016179055565b5f546118de9060081c60ff16825460ff191660ff909116178255565b426001860155549360026118f761144460ff881661266a565b9101556040805191825260089490941c60ff1615156020820152339390918291820190565b346102fa575f3660031901126102fa57602060405160c88152f35b90600182811c92168015611965575b602083101461195157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611946565b604051905f825f80516020613b8783398151915291825461198f81611937565b908184526020946001916001811690815f146119fb57506001146119bd575b505050610a23925003836109f5565b5f90815285812095935091905b8183106119e3575050610a2393508201015f80806119ae565b855488840185015294850194879450918301916119ca565b92505050610a2394925060ff191682840152151560051b8201015f80806119ae565b604051905f825f80516020613ba7833981519152918254611a3d81611937565b908184526020946001916001811690815f146119fb5750600114611a6a57505050610a23925003836109f5565b5f90815285812095935091905b818310611a90575050610a2393508201015f80806119ae565b85548884018501529485019487945091830191611a77565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161092d57565b9190820180921161092d57565b15611ade57565b60405162461bcd60e51b815260206004820152600d60248201526c4f7574206f6620626f756e647360981b6044820152606490fd5b6001600160401b0381116109ba5760051b60200190565b90611b3482611b13565b604090611b4460405191826109f5565b8381528093611b55601f1991611b13565b01915f5b838110611b665750505050565b6020908251611b748161099f565b5f8152825f818301525f858301525f60608301525f60808301525f60a0830152828601015201611b59565b5f19811461092d5760010190565b80518210156115685760209160051b010190565b90604051611bce8161099f565b60a06004829480548452600181015460208501526002810154604085015260ff6003820154818116606087015260081c16151560808501520154910152565b15611c1457565b60405162461bcd60e51b8152602060048201526013602482015272131bd8dac81a5cc81b9bdd08195e1c1a5c9959606a1b6044820152606490fd5b15611c5657565b60405162461bcd60e51b81526020600482015260156024820152744c6f636b206973206175746f2d72656e6577696e6760581b6044820152606490fd5b5f1981019190821161092d57565b9190820391821161092d57565b634e487b7160e01b5f525f60045260245ffd5b9055565b9190611d3b57808203611cd6575050565b6004818192548455600181015460018501556002810154600285015560038401611d3260ff60038401611d1682825416859060ff1660ff19825416179055565b5460081c16151582549061ff009060081b169061ff0019161790565b90550154910155565b611cae565b80548015611d78575f190190611d56828261154f565b611d3b576004815f809355826001820155826002820155826003820155015555565b634e487b7160e01b5f52603160045260245ffd5b15611d9357565b606460405162461bcd60e51b815260206004820152602060248201527f6d61785765656b735f206d7573742062652067726561746572207468616e20306044820152fd5b15611dde57565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606490fd5b15611e1a57565b60405162461bcd60e51b81526020600482015260146024820152734e616d652063616e6e6f7420626520656d70747960601b6044820152606490fd5b15611e5d57565b60405162461bcd60e51b815260206004820152601660248201527553796d626f6c2063616e6e6f7420626520656d70747960501b6044820152606490fd5b5f5461ff00191660089190911b61ff0016175f55565b601f8111611ebd575050565b5f80516020613b878339815191525f5260205f20906020601f840160051c83019310611f03575b601f0160051c01905b818110611ef8575050565b5f8155600101611eed565b9091508190611ee4565b601f8111611f19575050565b60025f5260205f20906020601f840160051c83019310611f53575b601f0160051c01905b818110611f48575050565b5f8155600101611f3d565b9091508190611f34565b601f8111611f69575050565b60035f5260205f20906020601f840160051c83019310611fa3575b601f0160051c01905b818110611f98575050565b5f8155600101611f8d565b9091508190611f84565b601f8111611fb9575050565b5f80516020613ba78339815191525f5260205f20906020601f840160051c83019310611fff575b601f0160051c01905b818110611ff4575050565b5f8155600101611fe9565b9091508190611fe0565b9081516001600160401b0381116109ba5761202e81612029600254611937565b611f0d565b602080601f831160011461206f5750819061205f93945f92612064575b50508160011b915f199060031b1c19161790565b600255565b015190505f8061204b565b60025f52601f198316949091907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace925f905b8782106120d85750508360019596106120c0575b505050811b01600255565b01515f1960f88460031b161c191690555f80806120b5565b806001859682949686015181550195019301906120a1565b9081516001600160401b0381116109ba5761211581612110600354611937565b611f5d565b602080601f831160011461214a5750819061214593945f926120645750508160011b915f199060031b1c19161790565b600355565b60035f52601f198316949091907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b925f905b8782106121b357505083600195961061219b575b505050811b01600355565b01515f1960f88460031b161c191690555f8080612190565b8060018596829496860151815501950193019061217c565b9081516001600160401b0381116109ba575f80516020613ba7833981519152906121fe816121f98454611937565b611fad565b602080601f831160011461222f57508190611cc19394955f926120645750508160011b915f199060031b1c19161790565b5f80516020613ba78339815191525f52601f198316959091907f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75925f905b8882106122a45750508360019596971061228c575b505050811b019055565b01515f1960f88460031b161c191690555f8080612282565b8060018596829496860151815501950193019061226d565b6122c4613598565b6122cc613598565b6001805f80516020613c27833981519152556122e6613598565b6122ee613598565b604051906122fb826109bf565b600182526020603160f81b6020840152612313613598565b61231b613598565b8551906001600160401b0382116109ba575f80516020613b878339815191529261234e836123498654611937565b611eb1565b602091601f841160011461245d5750509361239a61242b946124399794612393856124269661243e9d9c9a5f91612452575b508160011b915f199060031b1c19161790565b90556121cb565b6123af5f5f80516020613bc783398151915255565b6123c45f5f80516020613c8783398151915255565b6123d260ff84161515611d8c565b6123e66001600160a01b0382161515611dd7565b6123f285511515611e13565b6123fe87511515611e56565b5f805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b611e9b565b61243460018055565b612009565b6120f0565b612446612b43565b5061244f612bf6565b50565b90508a01515f612380565b5f80516020613b878339815191525f529190601f198416907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d935f915b8383106124ea5750505094612439979460018561243e9c9b999561239a956124269861242b9b106124d2575b5050811b0190556121cb565b8b01515f1960f88460031b161c191690555f806124c6565b8b850151865594850194938101939181019161249a565b6001600160a01b03165f818152600460208181526040808420549395869590939192905b858710612536575050505050505090565b90919293949596815f5283835261255b866125566105978b895f2061154f565b612dee565b810180911161092d5796600101959493929190612525565b1561257a57565b606460405162461bcd60e51b815260206004820152602060248201527f4e756d207765656b73206d7573742062652067726561746572207468616e20306044820152fd5b156125c557565b60405162461bcd60e51b815260206004820152600f60248201526e131bd8dac81a5cc8195e1c1a5c9959608a1b6044820152606490fd5b9060ff8091169116019060ff821161092d57565b1561261757565b60405162461bcd60e51b815260206004820152602560248201527f4e756d207765656b73206d757374206265206c657373207468616e206d6178206044820152647765656b7360d81b6064820152608490fd5b9062093a809182810292818404149015171561092d57565b906127109182810292818404149015171561092d57565b8181029291811591840414171561092d57565b5f91825b6001600160a01b0383165f90815260046020526040902080548510156126f057846126da9161154f565b5054810180911161092d576001909301926126b0565b5092509050565b9061270290826128e6565b9060018060a01b0316805f52600460205260806127256105978460405f2061154f565b01511561275457505062093a8060ff5f5460081c160262ffffff811690810361092d57420180421161092d5790565b60029161276b915f52600460205260405f2061154f565b50015490565b604051602081018181106001600160401b038211176109ba576040525f8152905f368137565b1561279e57565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b156127ea57565b60405162461bcd60e51b81526020600482015260126024820152714f766572206d617820706f736974696f6e7360701b6044820152606490fd5b8054600160401b8110156109ba576128419160018201815561154f565b919091611d3b5760a08160049251845560208101516001850155604081015160028501556003840161288460ff606084015116829060ff1660ff19825416179055565b6080820151815461ff00191690151560081b61ff00161790550151910155565b5f80516020613c2783398151915260028154146128c15760029055565b604051633ee5aeb560e01b8152600490fd5b60015f80516020613c2783398151915255565b905f5b60018060a01b0383165f5260048060205260405f209081548310156129295761291383859361154f565b50015414612923576001016128e9565b91505090565b60405162461bcd60e51b815260206004820152600e60248201526d131bd8dac81b9bdd08199bdd5b9960921b6044820152606490fd5b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152610a239161299b6064836109f5565b6130cf565b610a2391906001600160a01b039081168015612a12575b6129c86129c384613176565b6131de565b50505f9081525f80516020613b6783398151915260205260408120549080527fd4fb29e10204005f1a39963c6862b79a755e22f0177c53f05cdc3786c702f9745482169116613242565b612a23612a1e84613176565b6131a9565b50506129b7565b90610a2391612a3b612a1e83613176565b50506001600160a01b03908116908115612a96575b5f80516020613b678339815191526020527fd4fb29e10204005f1a39963c6862b79a755e22f0177c53f05cdc3786c702f974545f92835260409092205481169116613242565b612aa26129c384613176565b5050612a50565b5f80516020613c478339815191525f8190525f80516020613c0783398151915260205260ff612af8337fb16e88c42fd4e48df2dd6a2eabd6bc9aec654ec170056b470819f8892cc6431c611526565b541615612b025750565b6044906040519063e2517d3f60e01b82523360048301526024820152fd5b805f525f80516020613c0783398151915260205260ff612af83360405f20611526565b73e57a09c3fdfb6bd2b8ebc46e0ff884876fae60fd5f8190527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020527f57d940f6b71d76356fa611c176bfc5e244f6e4e6c864e64a09644a31a6eba5b4545f80516020613c078339815191529060ff16612bf0575f805260205260405f20815f5260205260405f20600160ff1982541617905533905f5f80516020613b478339815191528180a4600190565b50505f90565b73e57a09c3fdfb6bd2b8ebc46e0ff884876fae60fd5f8190527fb16e88c42fd4e48df2dd6a2eabd6bc9aec654ec170056b470819f8892cc6431c6020527fa5686516980e783bdbfeec7e71b222c31eeb674bfb0e6b0df311193ee4e2ad37545f80516020613c4783398151915291905f80516020613c078339815191529060ff16612cb257825f5260205260405f20815f5260205260405f20600160ff1982541617905533915f80516020613b478339815191525f80a4600190565b5050505f90565b805f525f80516020613c078339815191528060205260ff612cdd8460405f20611526565b5416612cb257815f52602052612cf68260405f20611526565b805460ff1916600117905533916001600160a01b0316905f80516020613b478339815191525f80a4600190565b805f525f80516020613c078339815191528060205260ff612d478460405f20611526565b541615612cb257815f52602052612d618260405f20611526565b805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b65ffffffffffff90818111612db1571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b8115612dda570490565b634e487b7160e01b5f52601260045260245ffd5b90815190612e22612e1b6080850193612e078551151590565b15612ea2575f5460081c60ff165b906135c6565b9251151590565b612e9c5760208301908151918282108015612e8e575b612e8557612e71612e62612e7793612e5a612e7f96604061034d9a0151611ca1565b935190611ca1565b91612e6c86612682565b612dd0565b90612699565b612710900490565b90611ca1565b50505050505f90565b506040850151821015612e38565b50905090565b606086015160ff16612e15565b6001600160a01b038181165f8181525f80516020613b678339815191526020526040812080548685166001600160a01b031982168117909255610a2396941694612f219390928691907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9080a46126ac565b91613242565b5f80516020613be7833981519152805480612f425750505f90565b5f1991818381011161092d575f5260205f2001015460301c90565b805480612f425750505f90565b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610a239161299b826109da565b604290612fb7613a5a565b612fbf613ab1565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815261300e8161099f565b519020906040519161190160f01b8352600283015260228201522090565b9161034d939161303b936135fd565b9092919261369e565b6001600160a01b0381165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052604090208054600181019091559182900361308f575050565b6040516301d4b62360e61b81526001600160a01b039190911660048201526024810191909152604490fd5b908160209103126102fa575161034d8161163c565b5f806131179260018060a01b03169360208151910182865af13d1561316e573d906130f982610a32565b9161310760405193846109f5565b82523d5f602084013e5b83613ae3565b8051908115159182613150575b505061312d5750565b604051635274afe760e01b81526001600160a01b03919091166004820152602490fd5b6131679250906020806118a39383010191016130ba565b5f80613124565b606090613111565b6001600160d01b039081811161318a571690565b604490604051906306dfcc6560e41b825260d060048301526024820152fd5b6131b243612d9e565b906001600160d01b039081806131c6612f27565b1691160190811161092d576131da91613840565b9091565b6131e743612d9e565b906001600160d01b039081806131fb612f27565b169116900390811161092d576131da91613840565b9061321a43612d9e565b6001600160d01b0391828061322e86612f5d565b1691160191821161092d576131da9261397c565b6001600160a01b0380831693929190811690818514158061336d575b61326a575b5050505050565b816132df575b50508261327f575b8080613263565b7fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724916132b66132b06132bc936114ee565b91613176565b90613210565b604080516001600160d01b039384168152919092166020820152a25f8080613278565b6132e8906114ee565b6132f184613176565b6132fa43612d9e565b6001600160d01b0391828061330e86612f5d565b16911690039282841161092d577fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724936133639261334a9261397c565b6040805192851683529316602082015291829190820190565b0390a25f80613270565b5083151561325e565b80156134af578061344861344161343761342d61342361341961340f613405600161034d9a5f908b60801c806134a3575b508060401c80613496575b508060201c80613489575b508060101c8061347c575b508060081c8061346f575b508060041c80613462575b508060021c80613455575b50821c61344e575b811c1b6133fe818b612dd0565b0160011c90565b6133fe818a612dd0565b6133fe8189612dd0565b6133fe8188612dd0565b6133fe8187612dd0565b6133fe8186612dd0565b6133fe8185612dd0565b8092612dd0565b9061372b565b81016133f1565b600291509101905f6133e9565b600491509101905f6133de565b600891509101905f6133d3565b601091509101905f6133c8565b602091509101905f6133bd565b604091509101905f6133b2565b9150506080905f6133a7565b505f90565b905b8281106134c257505090565b90918082169080831860011c820180921161092d575f80516020613be78339815191525f527f88c46c62109817164d0ae1873830d4299a82e5daf552a3d8e989b27638fcf74882015465ffffffffffff90811690851610156135275750915b906134b6565b92915061353390611abc565b90613521565b91905b8382106135495750505090565b9091928083169080841860011c820180921161092d57845f5265ffffffffffff808360205f20015416908416105f146135865750925b919061353c565b93925061359290611abc565b9161357f565b60ff5f80516020613c678339815191525460401c16156135b457565b604051631afcd79f60e31b8152600490fd5b6135ed906127109260ff805f5460081c16911690808210155f146135f15750508290612699565b0490565b612e6c612e7192612682565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411613675579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561366a575f516001600160a01b0381161561366057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b6004111561368a57565b634e487b7160e01b5f52602160045260245ffd5b6136a781613680565b806136b0575050565b6136b981613680565b600181036136d35760405163f645eedf60e01b8152600490fd5b6136dc81613680565b600281036136fd5760405163fce698f760e01b815260048101839052602490fd5b80613709600392613680565b146137115750565b6040516335e2f38360e21b81526004810191909152602490fd5b9080821015613738575090565b905090565b9065ffffffffffff82549181199060301b169116179055565b5f80516020613be7833981519152908154600160401b8110156109ba576001810180845581101561156857610a23925f5260205f20019065ffffffffffff81511665ffffffffffff19835416178255602060018060d01b03910151169061373d565b908154600160401b8110156109ba576001810180845581101561156857610a23925f5260205f20019065ffffffffffff81511665ffffffffffff19835416178255602060018060d01b03910151169061373d565b90604051604081018181106001600160401b038211176109ba57604052915465ffffffffffff8116835260301c6020830152565b5f80516020613be783398151915254919291908115613953576138a261389d61386884611c93565b5f80516020613be78339815191525f527f88c46c62109817164d0ae1873830d4299a82e5daf552a3d8e989b27638fcf7480190565b61380c565b805165ffffffffffff83811694911684106139415785602093613905956138dd6138d2865165ffffffffffff1690565b65ffffffffffff1690565b0361390957506138f26138686138f793611c93565b61373d565b01516001600160d01b031690565b9190565b905061393c915061392961391b610a25565b65ffffffffffff9092168252565b6001600160d01b03871681850152613756565b6138f7565b604051632520601d60e01b8152600490fd5b613977915061396361391b610a25565b6001600160d01b0384166020820152613756565b5f9190565b805492939291908215613a36576139a361389d61399885611c93565b835f5260205f200190565b906139b4825165ffffffffffff1690565b65ffffffffffff84811691168110613941576139059460209488926139e26138d2875165ffffffffffff1690565b03613a0357506138f7926139f86138f292611c93565b905f5260205f200190565b91505061393c91613a23613a15610a25565b65ffffffffffff9093168352565b6001600160d01b038816828601526137b8565b6139779250613a46613a15610a25565b6001600160d01b03851660208301526137b8565b613a6261196f565b8051908115613a72576020012090565b50505f80516020613bc7833981519152548015613a8c5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b613ab9611a1d565b8051908115613ac9576020012090565b50505f80516020613c87833981519152548015613a8c5790565b90613b0a5750805115613af857805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580613b3d575b613b1b575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15613b1356fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0de8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100e8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0202dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101a2646970667358221220faaa87eaa0717c9cbe20633faa0ec243e14af4970ae14ca8b8443e338d5f839064736f6c63430008170033