{"matchId":"46813201","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-08-25T04:24:17Z","creationBytecode":{"onchainBytecode":"0x60e060405234801561000f575f80fd5b5060405161723838038061723883398101604081905261002e9161031e565b8383838282828161003e8161014f565b5062ffffff811615806100585750620f424062ffffff8216115b156100765760405163a51d0c8160e01b815260040160405180910390fd5b62ffffff81166080526001600160a01b03831660a05261010b30610106604080516101c0810182525f60208201819052918101829052606081018290526080810182905260a0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152600180825260c082015290565b6101a2565b5050506001600160a01b038416925061013a9150505760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660c05250610381915050565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad9060200160405180910390a150565b80511515612000831615151415806101c65750602081015115156110008316151514155b806101dd5750604081015115156108008316151514155b806101f45750606081015115156104008316151514155b8061020b5750608081015115156102008316151514155b80610222575060a081015115156101008316151514155b80610238575060c0810151151560808316151514155b8061024e575060e0810151151560408316151514155b806102655750610100810151151560208316151514155b8061027c5750610120810151151560108316151514155b806102935750610140810151151560088316151514155b806102aa5750610160810151151560048316151514155b806102c15750610180810151151560028316151514155b806102d857506101a0810151151560018316151514155b156102ee576102ee630732d7b560e51b836102f2565b5050565b815f526001600160a01b03811660045260245ffd5b6001600160a01b038116811461031b575f80fd5b50565b5f805f8060808587031215610331575f80fd5b845161033c81610307565b602086015190945061034d81610307565b604086015190935062ffffff81168114610365575f80fd5b606086015190925061037681610307565b939692955090935050565b60805160a05160c051616e1d61041b5f395f81816106e501528181613c3b01528181613cb50152613d2f01525f81816103e601528181610ed80152818161169701528181611c700152818161239701528181612421015281816124d401528181612c9f0152818161391e01528181613b6001528181613c0d0152818161407b0152614b1901525f81816106b2015261383b0152616e1d5ff3fe6080604052600436106103d6575f3560e01c80637e445230116101ff578063bdde80c611610113578063daf58566116100a8578063e74c37f711610078578063e74c37f714610f38578063f4314f1d14610f57578063f69ec15814610f9e578063f8c543ce14610fb3578063fe99049a14610fc7575f80fd5b8063daf5856614610ea8578063dc4c90d314610ec7578063dc98354e14610efa578063df848a9f14610f19575f80fd5b8063d0ba2baa116100e3578063d0ba2baa14610e25578063d5a2472414610e44578063d677eaad14610e74578063da748b1014610e93575f80fd5b8063bdde80c614610dac578063bf7e214f14610dcb578063bfcb418514610de7578063bfe1092814610e06575f80fd5b8063999d55fb11610194578063a6acaacc11610164578063a6acaacc14610cf1578063ab9e5bfd14610d05578063ae4a578514610d24578063b11dcb2314610d43578063b6363cf214610d73575f80fd5b8063999d55fb14610c565780639d1712c514610c6c578063a23e4db514610cb8578063a2ba1fc814610cd2575f80fd5b806391dd7346116101cf57806391dd734614610b75578063936852d414610ba1578063966af35a14610bd557806396f25d4214610c36575f80fd5b80637e44523014610af55780637fa7b6ac14610b0a5780638aebf0c114610b295780638fb3603714610b48575f80fd5b80634dc4b5c9116102f65780635ca344691161028b57806370233ddd1161025b57806370233ddd14610a585780637339254914610a835780637a526f4e14610a975780637a9e5e4b14610ab15780637c5e62d014610ad0575f80fd5b80635ca34469146109be5780635cd04cf8146109dd5780635f4934a814610a0d57806363cb7bdf14610a2c575f80fd5b8063558a7297116102c6578063558a729714610903578063575e24b414610922578063598af9e71461096c5780635c975abb146109a8575f80fd5b80634dc4b5c91461087a5780634e8d0048146108995780634eb5c4fd146108b857806351789ea2146108e4575f80fd5b806326f5ef521161036c5780633fc8cef31161033c5780633fc8cef3146106d4578063412b82c81461071f57806341b69b2a1461073e578063426a84931461085b575f80fd5b806326f5ef521461058f5780632e32a3b0146105ae57806336a9ca1a1461068e5780633c2f373f146106a1575f80fd5b8063113b9ac4116103a7578063113b9ac4146104e0578063136439dd1461051257806315452022146105315780632384b55414610564575f80fd5b8062fdd58e1461042a57806301ffc9a714610473578063095bcdb6146104a257806309974324146104c1575f80fd5b3661042657336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042457604051632dc88d5b60e21b815260040160405180910390fd5b005b5f80fd5b348015610435575f80fd5b50610460610444366004615b9f565b600560209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561047e575f80fd5b5061049261048d366004615bc9565b610fe6565b604051901515815260200161046a565b3480156104ad575f80fd5b506104926104bc366004615bf0565b61101c565b3480156104cc575f80fd5b506104246104db366004615c78565b6110ac565b3480156104eb575f80fd5b506104ff6104fa366004615cda565b611177565b60405161ffff909116815260200161046a565b34801561051d575f80fd5b5061042461052c366004615d00565b6111a5565b34801561053c575f80fd5b5061055061054b366004615d24565b611246565b60405162ffffff909116815260200161046a565b34801561056f575f80fd5b5061046061057e366004615d52565b60146020525f908152604090205481565b34801561059a575f80fd5b506104246105a9366004615d6d565b611276565b3480156105b9575f80fd5b5061067e6105c8366004615d00565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152601060209081526040918290206003810154835160a08101855282546001600160a01b039081168252600184015480821695830195909552600160a01b850462ffffff1695820195909552600160b81b909304600290810b6060850152918201549093166080830152909282820b926301000000810490920b91600160301b900460ff1690565b60405161046a9493929190615e02565b61042461069c366004615e6c565b611332565b3480156106ac575f80fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b3480156106df575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161046a565b34801561072a575f80fd5b50600a54610707906001600160a01b031681565b348015610749575f80fd5b5061084e610758366004615d00565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152505f9081526011602090815260409182902082516101408101845281546001600160801b038082168352600160801b918290048116948301949094526001830154948201949094526002820154606082015260038201546080820152600482015460a0820152600582015480841660c08301529390930490911660e0830152600601546001600160401b03808216610100840152600160401b9091041661012082015290565b60405161046a9190615ef8565b348015610866575f80fd5b50610492610875366004615bf0565b61172c565b348015610885575f80fd5b50610424610894366004615fd3565b6117a2565b3480156108a4575f80fd5b506104246108b3366004616021565b61187d565b3480156108c3575f80fd5b506108d76108d236600461608b565b611a75565b60405161046a91906160ae565b3480156108ef575f80fd5b506104246108fe366004615d00565b611b73565b34801561090e575f80fd5b5061049261091d366004616135565b611bf3565b34801561092d575f80fd5b5061094161093c36600461619e565b611c62565b604080516001600160e01b03199094168452602084019290925262ffffff169082015260600161046a565b348015610977575f80fd5b5061046061098636600461621e565b600660209081525f938452604080852082529284528284209052825290205481565b3480156109b3575f80fd5b50600e544210610492565b3480156109c9575f80fd5b506104246109d836600461625c565b611cf8565b3480156109e8575f80fd5b506105506109f7366004615d00565b60026020525f908152604090205462ffffff1681565b348015610a18575f80fd5b50610424610a27366004615d00565b611f91565b348015610a37575f80fd5b50610a426203f48081565b60405164ffffffffff909116815260200161046a565b348015610a63575f80fd5b50610460610a72366004615d52565b60136020525f908152604090205481565b348015610a8e575f80fd5b50600b54610460565b348015610aa2575f80fd5b506007546104ff9061ffff1681565b348015610abc575f80fd5b50610424610acb366004615d52565b611fe0565b348015610adb575f80fd5b50600754610707906201000090046001600160a01b031681565b348015610b00575f80fd5b506104ff61138881565b348015610b15575f80fd5b50610424610b243660046162aa565b61205d565b348015610b34575f80fd5b50610424610b433660046162f1565b6121f3565b348015610b53575f80fd5b50610b5c612368565b6040516001600160e01b0319909116815260200161046a565b348015610b80575f80fd5b50610b94610b8f36600461632e565b61238a565b60405161046a919061639a565b348015610bac575f80fd5b50610bc0610bbb366004615d00565b612448565b6040805192835260208301919091520161046a565b348015610be0575f80fd5b50610c15610bef366004615d00565b60036020525f908152604090205462ffffff8116906301000000900464ffffffffff1682565b6040805162ffffff909316835264ffffffffff90911660208301520161046a565b348015610c41575f80fd5b505f80516020616df18339815191525c610492565b348015610c61575f80fd5b5061046062093a8081565b348015610c77575f80fd5b50610ca0610c86366004615d00565b600d6020525f90815260409020546001600160401b031681565b6040516001600160401b03909116815260200161046a565b348015610cc3575f80fd5b50600c546104ff9061ffff1681565b348015610cdd575f80fd5b50610424610cec3660046163ac565b612517565b348015610cfc575f80fd5b50610550606481565b348015610d10575f80fd5b50610424610d1f366004615d52565b612865565b348015610d2f575f80fd5b50610424610d3e366004615d52565b6128a4565b348015610d4e575f80fd5b50610550610d5d366004615d00565b60016020525f908152604090205462ffffff1681565b348015610d7e575f80fd5b50610492610d8d36600461644a565b600460209081525f928352604080842090915290825290205460ff1681565b348015610db7575f80fd5b50610424610dc6366004615d52565b612a3e565b348015610dd6575f80fd5b505f546001600160a01b0316610707565b348015610df2575f80fd5b50600954610707906001600160a01b031681565b348015610e11575f80fd5b50600854610707906001600160a01b031681565b348015610e30575f80fd5b50610424610e3f366004615d6d565b612a72565b348015610e4f575f80fd5b50610550610e5e366004615d00565b5f9081526015602052604090205462ffffff1690565b348015610e7f575f80fd5b506104ff610e8e366004615d00565b612b10565b348015610e9e575f80fd5b50610460600e5481565b348015610eb3575f80fd5b50610424610ec236600461625c565b612b1a565b348015610ed2575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b348015610f05575f80fd5b50610b5c610f14366004616476565b612c93565b348015610f24575f80fd5b50610460610f333660046164b2565b612db1565b348015610f43575f80fd5b50600f54610707906001600160a01b031681565b348015610f62575f80fd5b50610f76610f71366004615d00565b612dfc565b6040805182516001600160401b0316815260209283015161ffff16928101929092520161046a565b348015610fa9575f80fd5b506104ff6107d081565b348015610fbe575f80fd5b50610460602081565b348015610fd2575f80fd5b50610492610fe13660046164e6565b612e5d565b5f6301ffc9a760e01b6001600160e01b0319831614806110165750630f632fb360e01b6001600160e01b03198316145b92915050565b5f611025612eef565b600e544210156110485760405163b359f26960e01b815260040160405180910390fd5b815f0361106857604051639811e0c760e01b815260040160405180910390fd5b611073338484612f13565b61107c83612f7c565b6110868333613092565b6110908385613092565b61109b8484846130d7565b90506110a561316f565b9392505050565b6110b8335b5f36613186565b6110c0612eef565b6110ca8484613275565b600854600c546110f091600b91859185916001600160a01b039091169061ffff166132e5565b600c805461ffff191661ffff928316179055600780549184166001600160b01b03199092168217620100006001600160a01b038516908102919091179091556040805192835260208301919091527f0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87910160405180910390a161117161316f565b50505050565b600754600c545f9161101691600b9185916001600160a01b03620100008304169161ffff908116911661345d565b6111ae336110b1565b8015806111bd575062093a8081115b156111db576040516316873e3160e11b815260040160405180910390fd5b5f6111e6824261653d565b9050600e54811161120a576040516316873e3160e11b815260040160405180910390fd5b600e8190556040518181527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df9219060200160405180910390a15050565b5f6110a583604051806060016040528085151581526020015f81526020015f6001600160a01b031681525061356c565b61127f336110b1565b611287612eef565b6112918383613275565b6008546001600160a01b03828116911614806112b557506001600160a01b03811630145b156112d3576040516343c829db60e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834906020015b60405180910390a161132d61316f565b505050565b61133a612eef565b600e5442101561135d5760405163b359f26960e01b815260040160405180910390fd5b836001600160801b03165f0361138657604051630200e8a960e31b815260040160405180910390fd5b804211156113a757604051631ab7da6b60e01b815260040160405180910390fd5b6113b087613642565b6113cd6113c06020890189615d52565b6001600160a01b03161590565b1561140157826001600160801b03163410156113fc57604051631841b4e160e01b815260040160405180910390fd5b611420565b341561142057604051631841b4e160e01b815260040160405180910390fd5b5f61144461143d611436368b90038b018b6165de565b60a0902090565b8888612db1565b5f81815260106020526040902060030154909150600160301b900460ff166115885760405180608001604052808980360381019061148291906165de565b8152600289810b60208084019190915289820b604080850191909152600160609485018190525f878152601084528290208651805182546001600160a01b03199081166001600160a01b0392831617845582870151948401805484880151858c01519785166001600160b81b031990921691909117600160a01b62ffffff928316021762ffffff60b81b1916600160b81b978216979097029690961790556080909201519683018054909216961695909517909455918501516003909301805491860151959094015192821665ffffffffffff1990911617630100000094909116939093029290921766ff0000000000001916600160301b921515929092029190911790555b61159181612f7c565b61159b8133613092565b5f818152601160205260409020546001600160801b0316158015611612575f8281526011602052604090206006018054600191906008906115ed908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5f82815260116020526040812080548892906116389084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506116703383886001600160801b03166136e5565b611688898989896001600160801b0316338a8a613757565b80156116bc576116bc601160107f000000000000000000000000000000000000000000000000000000000000000085613774565b6040516001600160801b0387168152829033907f1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a9060200160405180910390a361170c6113c060208b018b615d52565b15611719576117196137ba565b505061172361316f565b50505050505050565b335f8181526006602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906117909087815260200190565b60405180910390a45060019392505050565b6117ab336110b1565b8262ffffff168262ffffff1610806117cc57508062ffffff168262ffffff16115b156117ea576040516306b7c75960e31b815260040160405180910390fd5b5f6117fd611436368790038701876165de565b5f818152601560205260409020805462ffffff191662ffffff8616179055905061182881858461382c565b6040805162ffffff8087168252808616602083015284169181019190915281907f0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5906060015b60405180910390a25050505050565b611885612eef565b600e544210156118a85760405163b359f26960e01b815260040160405180910390fd5b6118b185613642565b5f6118ce6118c7611436368990038901896165de565b8686612db1565b90508161ffff166118de826138f9565b61ffff1611156119015760405163663fffd960e01b815260040160405180910390fd5b5f8181526012602090815260408083203384528252808320600583528184208585529092529091205415801561194657508054600160801b90046001600160801b0316155b801561195d575060018101546001600160801b0316155b1561197b576040516312d37ee560e31b815260040160405180910390fd5b61198482612f7c565b61198e8233613092565b5f8281526012602090815260408083203384529091529020805460018201546001600160801b03600160801b90920482169116811580156119cd575080155b156119dc575050505050611a66565b6001830180546001600160801b031916905582546001600160801b03168355611a23611a0b60208c018c615d52565b611a1b60408d0160208e01615d52565b84848b613919565b6040805183815260208101839052869133917fd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77910160405180910390a350505050505b611a6e61316f565b5050505050565b611ad66040518061012001604052805f6001600160801b031681526020015f6001600160801b031681526020015f6001600160801b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b505f9182526012602090815260408084206001600160a01b039390931684529181529181902081516101208101835281546001600160801b038082168352600160801b9091048116948201949094526001820154909316918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e08301526007015461010082015290565b611b7c336110b1565b62093a80811115611ba0576040516316873e3160e11b815260040160405180910390fd5b8015611bb557611bb0814261653d565b611bb7565b5f5b600e8190556040519081527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f8080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611cae5760405163570c108560e11b815260040160405180910390fd5b5f611cd8611cc4611436368b90038b018b6165de565b611cd3368a90038a018a616696565b61356c565b6315d7892d60e21b94505f93506240000017915050955095509592505050565b611d00612eef565b600e54421015611d235760405163b359f26960e01b815260040160405180910390fd5b806001600160801b03165f03611d4c57604051639811e0c760e01b815260040160405180910390fd5b611d5584613642565b600f546001600160a01b0316801580611de957506001600160a01b038116637f55485b611d8a611436368990038901896165de565b6040518263ffffffff1660e01b8152600401611da891815260200190565b602060405180830381865afa158015611dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de791906166fe565b155b15611e0757604051630ac6deb160e31b815260040160405180910390fd5b5f611e1d6118c7611436368990038901896165de565b9050611e2881612f7c565b611e328133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529220546001600160801b0380871692611e7492911690616719565b6001600160801b03161015611e9c57604051631a61620360e01b815260040160405180910390fd5b8054849082905f90611eb89084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316611f119190616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a86604051611f7e91906001600160801b0391909116815260200190565b60405180910390a350505061117161316f565b611f9a336110b1565b5f81815260036020526040808220805467ffffffffffffffff191690555182917fb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb91a250565b5f5433906001600160a01b0316811461201b5760405162d1953b60e31b81526001600160a01b03821660048201526024015b60405180910390fd5b816001600160a01b03163b5f03612050576040516361798f2f60e11b81526001600160a01b0383166004820152602401612012565b61205982613947565b5050565b612065612eef565b600f546001600160a01b03168061208f57604051634e3fb44d60e01b815260040160405180910390fd5b5f5b828110156121e9575f8484838181106120ac576120ac616738565b602090810292909201355f81815260119093526040832054909350600160801b90046001600160801b031690910390506120e657506121e1565b5f81815260106020908152604091829020825160a0808201855282546001600160a01b03908116835260018401548082168487015262ffffff600160a01b82041684880152600160b81b9004600290810b606085015290930154831660808301529020835163181e22b360e01b8152336004820152602481018b9052604481019190915292519086169263181e22b39260648083019391928290030181865afa158015612195573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b991906166fe565b6121d657604051630c8563b360e41b815260040160405180910390fd5b6121df81612f7c565b505b600101612091565b505061132d61316f565b6121fc336110b1565b5f8381526001602052604081205462ffffff169081900361223057604051636b271baf60e11b815260040160405180910390fd5b8062ffffff168362ffffff16111561225b5760405163329429f760e11b815260040160405180910390fd5b5f8481526002602052604090205462ffffff9081169084161015612292576040516310dd5b7f60e31b815260040160405180910390fd5b64ffffffffff821615806122af57506203f48064ffffffffff8316115b156122cd57604051631ee3453360e11b815260040160405180910390fd5b5f6122d8834261674c565b60408051808201825262ffffff87811680835264ffffffffff85811660208086018281525f8e81526003835288902096518754915190941663010000000267ffffffffffffffff1990911693909516929092179390931790935583519081529182015291925086917fcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04910161186e565b5f8054600160a01b900460ff1661237e57505f90565b50638fb3603760e01b90565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123d55760405163570c108560e11b815260040160405180910390fd5b6040805160608101825260075461ffff8082168352600c541660208301526201000090046001600160a01b0316918101919091526110a590601190601090601390601490600d90600b907f0000000000000000000000000000000000000000000000000000000000000000908b8b613994565b5f8181526010602052604081206003810154829190600160301b900460ff1661247657505f93849350915050565b6040805160a0808201835283546001600160a01b03908116835260018501548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b606084015284015490921660808201522061250d907f0000000000000000000000000000000000000000000000000000000000000000906003840154600281810b9163010000009004900b613a54565b9250925050915091565b61251f612eef565b846001600160801b03165f0361254857604051630200e8a960e31b815260040160405180910390fd5b6001600160a01b03841661256f5760405163d92e233d60e01b815260040160405180910390fd5b8042111561259057604051631ab7da6b60e01b815260040160405180910390fd5b61259988613642565b5f6125b66125af611436368c90038c018c6165de565b8989612db1565b90506125c181612f7c565b6125cb8133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529083205490929161260e916001600160801b0390911690616719565b9050876001600160801b0316816001600160801b03161015612724575f612635828a616719565b8354909150819084905f906126549084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508060115f8681526020019081526020015f205f0160108282829054906101000a90046001600160801b03166126ad9190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b68360405161271a91906001600160801b0391909116815260200190565b60405180910390a3505b61273833848a6001600160801b0316613af0565b5f83815260116020526040812080548a929061275e9084906001600160801b0316616719565b82546101009290920a6001600160801b038181021990931691831602179091555f85815260116020526040812054909116900390506127f0575f8381526011602052604090206006018054600191906008906127cb908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b6128108b8b8b6128086001600160801b038d16616769565b8b8b8b613757565b6040516001600160801b0389168152839033907f07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a09060200160405180910390a350505061285b61316f565b5050505050505050565b61286d612eef565b600e544210156128905760405163b359f26960e01b815260040160405180910390fd5b61289981613b59565b6128a161316f565b50565b6128ad336110b1565b6001600160a01b038116156129f057806001600160a01b03163b5f036128e657604051638fadf87960e01b815260040160405180910390fd5b60405163181e22b360e01b81523060048201525f6024820181905260448201526001600160a01b0382169063181e22b390606401602060405180830381865afa925050508015612953575060408051601f3d908101601f19168201909252612950918101906166fe565b60015b61297057604051638fadf87960e01b815260040160405180910390fd5b50604051637f55485b60e01b81525f60048201526001600160a01b03821690637f55485b90602401602060405180830381865afa9250505080156129d1575060408051601f3d908101601f191682019092526129ce918101906166fe565b60015b6129ee57604051638fadf87960e01b815260040160405180910390fd5b505b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba90602001611be8565b612a46612eef565b600e54421015612a695760405163b359f26960e01b815260040160405180910390fd5b61289981613b9b565b612a7b336110b1565b612a83612eef565b612a8d8383613275565b600a54600754612ab29183916001600160a01b03918216916201000090910416613d9f565b600980546001600160a01b03199081166001600160a01b03938416179091556008805490911691831691821790556040519081527f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858869060200161131d565b5f611016826138f9565b612b22612eef565b806001600160801b03165f03612b4b57604051639811e0c760e01b815260040160405180910390fd5b612b5484613642565b5f612b71612b6a611436368890038801886165de565b8585612db1565b9050612b7c81612f7c565b612b868133613092565b5f8181526012602090815260408083203384529091528120805490918491839190612bbb9084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508260115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316612c149190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b685604051612c8191906001600160801b0391909116815260200190565b60405180910390a3505061117161316f565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cdd5760405163570c108560e11b815260040160405180910390fd5b612d02612cf06060850160408601616783565b62ffffff1662ffffff16628000001490565b612d1f576040516309a90e8160e01b815260040160405180910390fd5b60015f612d34611436368790038701876165de565b815260208101919091526040015f9081205462ffffff169003612d6a57604051636b271baf60e11b815260040160405180910390fd5b612d7a6113c06020850185615d52565b8015612d8357505f5b15612da157604051630a7287b560e01b815260040160405180910390fd5b50636e4c1aa760e11b9392505050565b5f838383604051602001612ddc93929190928352600291820b6020840152900b604082015260600190565b60408051601f198184030181529190528051602090910120949350505050565b604080518082019091525f8082526020820152600b8281548110612e2257612e22616738565b5f918252602091829020604080518082019091529101546001600160401b0381168252600160401b900461ffff169181019190915292915050565b5f612e66612eef565b600e54421015612e895760405163b359f26960e01b815260040160405180910390fd5b815f03612ea957604051639811e0c760e01b815260040160405180910390fd5b612eb4858484612f13565b612ebd83612f7c565b612ec78386613092565b612ed18385613092565b612edd85858585613ee7565b9050612ee761316f565b949350505050565b612ef7614045565b612f1160015f80516020616df18339815191525b90614072565b565b5f8281526012602090815260408083206001600160a01b038716845282528083205460058352818420868552909252909120548291612f5d916001600160801b039091169061679e565b101561132d57604051631a61620360e01b815260040160405180910390fd5b5f8181526010602090815260409182902082516101208101845281546001600160a01b0390811660808301908152600184015480831660a0850152600160a01b810462ffffff1660c0850152600160b81b9004600290810b60e085015280850154909216610100840152825260039092015480830b938201939093526301000000830490910b92810192909252600160301b900460ff1615801560608301528061303a57505f828152601160205260409020546001600160801b0316155b156130715750600b545f918252600d6020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b612059815f0151826020015183604001515f306001600160801b0380614079565b5f828152601160209081526040808320601283528184206001600160a01b03861685528352818420600584528285208786529093529220546120599291908486614198565b335f90815260056020908152604080832085845290915281208054839190839061310290849061679e565b90915550506001600160a01b0384165f9081526005602090815260408083208684529091528120805484929061313990849061653d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020616dd18339815191529101611790565b612f115f5f80516020616df1833981519152612f0b565b5f806131b961319c5f546001600160a01b031690565b86306131ab60045f898b6167b1565b6131b4916167d8565b614398565b9150915081611a6e5763ffffffff811615613252575f805460ff60a01b198116600160a01b17909155604051634a63ebf760e11b81526001600160a01b03909116906394c7d7ee906132139088908890889060040161680e565b5f604051808303815f87803b15801561322a575f80fd5b505af115801561323c573d5f803e3d5ffd5b50505f805460ff60a01b1916905550611a6e9050565b60405162d1953b60e31b81526001600160a01b0386166004820152602401612012565b5f5b8181101561132d576132ae83838381811061329457613294616738565b90506020020160208101906132a99190615d52565b613b9b565b6132dd8383838181106132c3576132c3616738565b90506020020160208101906132d89190615d52565b613b59565b600101613277565b5f6107d061ffff8616111561330d5760405163af2eb37360e01b815260040160405180910390fd5b61ffff85161580159061332757506001600160a01b038416155b156133455760405163af2eb37360e01b815260040160405180910390fd5b306001600160a01b0385160361336e5760405163af2eb37360e01b815260040160405180910390fd5b6001600160a01b038416158015906133975750826001600160a01b0316846001600160a01b0316145b156133b55760405163af2eb37360e01b815260040160405180910390fd5b85545f6001600160a01b038616156133cd57866133cf565b5f5b604080518082019091526001600160401b03428116825261ffff80841660208085019182528d54600181018f555f8f8152919091209451940180549151909216600160401b0269ffffffffffffffffffff199091169390921692909217179055905081158061344557508361ffff168161ffff16105b61344f5783613451565b805b98975050505050505050565b5f846001600160401b03165f0361347557505f613563565b5f6001600160a01b0385161561348b578361348d565b5f5b90505f6134a460016001600160401b03891661679e565b88549091505f5b82821180156134ba5750602081105b15613531575f8a6134cc60018561679e565b815481106134dc576134dc616738565b5f918252602090912001805490915061ffff808716600160401b909204161015613510578054600160401b900461ffff1694505b8261351a8161684d565b935050818061352890616862565b925050506134ab565b8282036135445783945050505050613563565b8561ffff80861690821610613559578461355b565b805b955050505050505b95945050505050565b5f828152601560209081526040808320546003835281842082518084019093525462ffffff8082168452630100000090910464ffffffffff1693830184905216918291904210156136185780515f8781526002602052604081205462ffffff9283169450909116906127106135e36113888261687a565b6135f19061ffff1687616894565b6135fb91906168bf565b905080821015613609578091505b81841015613615578193505b50505b5f8681526001602052604090205462ffffff1680831115613637578092505b509095945050505050565b3061365360a0830160808401615d52565b6001600160a01b0316141580613690575060015f613679611436368590038501856165de565b815260208101919091526040015f205462ffffff16155b156136ae57604051636b271baf60e11b815260040160405180910390fd5b6136be6113c06020830183615d52565b80156136c757505f5b156128a157604051630a7287b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526005602090815260408083208584529091528120805483929061371790849061653d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020616dd183398151915291015b60405180910390a4505050565b611723613769368990038901896165de565b878787878787614079565b5f81815260208581526040808320868352818420825160a0810184528681529384018590529183018490526060830184905260808301939093526111719291859061442a565b475f8190036137c65750565b6040515f90339083908381818185875af1925050503d805f8114613805576040519150601f19603f3d011682016040523d82523d5f602084013e61380a565b606091505b505090508061205957604051633c31275160e21b815260040160405180910390fd5b62ffffff8116158061386757507f000000000000000000000000000000000000000000000000000000000000000062ffffff168162ffffff16115b156138855760405163a51d0c8160e01b815260040160405180910390fd5b606462ffffff831610806138a257508062ffffff168262ffffff16115b156138c05760405163a51d0c8160e01b815260040160405180910390fd5b5f928352600160209081526040808520805462ffffff1990811662ffffff95861617909155600290925290932080549093169116179055565b5f818152600d6020526040812054611016906001600160401b0316611177565b611a6e7f000000000000000000000000000000000000000000000000000000000000000086868686866144a9565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602001611be8565b60605f806139a484860186616904565b909250905060018260018111156139bd576139bd616993565b03613a21575f818060200190518101906139d791906169b2565b90506139f088825f0151836040015184608001516145e5565b613a08888260200151836060015184608001516145e5565b60405180602001604052805f8152509350505050613a46565b613a328d8d8d8d8d8d8d8d896146d6565b60405180602001604052805f815250925050505b9a9950505050505050505050565b5f805f80613a6288886148a6565b915091505f80613a738a8a8a61494f565b915091505f80613a848c8c8b61494f565b915091505f613a938d8d6149a4565b50509150508a60020b8160020b1215613ab55782850398508184039750613ae0565b8960020b8160020b12613ad15784830398508382039750613ae0565b82858803039850818487030397505b5050505050505094509492505050565b6001600160a01b0383165f90815260056020908152604080832085845290915281208054839290613b2290849061679e565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020616dd1833981519152910161374a565b6128a160147f000000000000000000000000000000000000000000000000000000000000000083600760029054906101000a90046001600160a01b0316614a56565b6001600160a01b03811615613bb3576128a181614b07565b6001600160a01b0381165f9081526013602052604081205490819003613bd7575050565b6008546001600160a01b031680613bed57505050565b6001600160a01b0383165f908152601360205260408120819055613c39907f000000000000000000000000000000000000000000000000000000000000000090859081908690306144a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015613c92575f80fd5b505af1158015613ca4573d5f803e3d5ffd5b50613ce09350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915083905084614b50565b806001600160a01b0316836001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb884604051613d2591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03167fb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e84604051613d9291815260200190565b60405180910390a3505050565b5f6001600160a01b038416613db557505f6110a5565b826001600160a01b0316846001600160a01b031603613de7576040516343c829db60e01b815260040160405180910390fd5b816001600160a01b0316846001600160a01b031603613e19576040516343c829db60e01b815260040160405180910390fd5b306001600160a01b03851603613e42576040516343c829db60e01b815260040160405180910390fd5b836001600160a01b031663667d31686040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613e9c575060408051601f3d908101601f19168201909252613e9991810190616a0e565b60015b613eb95760405163281d5dd760e11b815260040160405180910390fd5b6001600160a01b038116613ee05760405163281d5dd760e11b815260040160405180910390fd5b90506110a5565b5f336001600160a01b03861614801590613f2457506001600160a01b0385165f90815260046020908152604080832033845290915290205460ff16155b15613f94576001600160a01b0385165f90815260066020908152604080832033845282528083208684529091529020545f198114613f9257613f66838261679e565b6001600160a01b0387165f90815260066020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260056020908152604080832086845290915281208054849290613fc690849061679e565b90915550506001600160a01b0384165f90815260056020908152604080832086845290915281208054849290613ffd90849061653d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020616dd1833981519152910160405180910390a4506001949350505050565b5f80516020616df18339815191525c15612f1157604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060e001604052808b81526020018a60020b81526020018960020b8152602001888152602001876001600160a01b03168152602001866001600160801b03168152602001856001600160801b031681525060405160200161410d9190616a29565b60408051601f198184030181529082905261412b9291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401614156919061639a565b5f604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285b9190810190616ad6565b83545f906141af906001600160801b03168561679e565b90508015614278576141d981866002015488600101546141cf919061679e565b600160801b614b85565b855486906010906141fb908490600160801b90046001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061423781866003015488600201546141cf919061679e565b6001860180545f906142539084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6001860154600280870191909155860154600386015584546001600160801b03168015614375575f6142c1826001600160801b031688600401548a600301546141cf919061679e565b90505f6142e5836001600160801b031689600501548b600401546141cf919061679e565b9050811515806142f457508015155b156143725781886006015f82825461430c919061653d565b9250508190555080886007015f828254614326919061653d565b9091555050604080518381526020810183905286916001600160a01b038916917f7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d910160405180910390a35b50505b866003015486600401819055508660040154866005018190555050505050505050565b6040516001600160a01b038085166024830152831660448201526001600160e01b0319821660648201525f908190819060840160408051601f19818403018152918152602080830180516001600160e01b031663b700961360e01b1781525f808052918290528351939450919290918a5afa15614420575f516020805191945081901c150291505b5094509492505050565b600684018054600191905f9061444a9084906001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505f8061447a8585614c21565b915091506144a1835f0151846020015185604001518660600151876080015187878d614ca8565b505050505050565b821580156144b5575081155b6144a157856001600160a01b03166348c8949160016040518060a00160405280896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001856001600160a01b031681525060405160200161455a919081516001600160a01b0390811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b60408051601f19818403018152908290526145789291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016145a3919061639a565b5f604051808303815f875af11580156145be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190616ad6565b811561117157836001600160a01b031663f5298aca30614614866001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b15801561465e575f80fd5b505af1158015614670573d5f803e3d5ffd5b5050604051630b0d9c0960e01b81526001600160a01b03868116600483015284811660248301526044820186905287169250630b0d9c0991506064015b5f604051808303815f87803b1580156146c4575f80fd5b505af115801561285b573d5f803e3d5ffd5b5f818060200190518101906146eb9190616b60565b90505f80856001600160a01b0316635a6bcfda845f01516040518060800160405280876020015160020b8152602001876040015160020b8152602001876060015181526020015f801b8152506040518363ffffffff1660e01b8152600401614754929190616c5d565b60408051808303815f875af115801561476f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147939190616cae565b915091506148758c8c8c8c8c8c8c6040518060e001604052806147ba8d5f015160a0902090565b8d602001518e604001516040516020016147eb93929190928352600291820b6020840152900b604082015260600190565b604051602081830303815290604052805190602001205f1c81526020018c5f0151815260200161481b8b60801d90565b6001600160801b031681526020016148338b600f0b90565b600f0b6001600160801b031681526020018e5f015161ffff1681526020018e6020015161ffff1681526020018e604001516001600160a01b0316815250614d6c565b61489886845f01518484876080015188606001518960a001518a60c00151614e3d565b505050505050505050505050565b5f805f6148b284614ec0565b90505f6148c060018361653d565b604051631afeb18d60e11b815260048101829052600260248201529091505f906001600160a01b038816906335fd631a906044015b5f60405180830381865afa15801561490f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526149369190810190616cd0565b6020810151604090910151909890975095505050505050565b5f805f61495c8585614efc565b90505f6001600160a01b0387166335fd631a61497984600161653d565b60405160e083901b6001600160e01b03191681526004810191909152600260248201526044016148f5565b5f805f805f6149b286614ec0565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156149fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1e9190616d7a565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6001600160a01b038083165f908152602086905260409020549082161580614a7c575080155b15614a875750611171565b6001600160a01b0383165f908152602086905260408120819055614ab3908590859081908590876144a9565b816001600160a01b0316836001600160a01b03167f8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e080866483604051614af891815260200190565b60405180910390a35050505050565b600854600954600a546128a1926013927f00000000000000000000000000000000000000000000000000000000000000009286926001600160a01b039081169281169116614f4f565b614b5d8383836001615031565b61132d57604051635274afe760e01b81526001600160a01b0384166004820152602401612012565b5f838302815f1985870982811083820303915050808411614ba4575f80fd5b805f03614bb6575082900490506110a5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6040805160a0808201835284546001600160a01b03908116835260018601548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b60608401528501549092166080820152205f908190614c9c9084906003870154600281810b9163010000009004900b613a54565b915091505b9250929050565b6003810154600482015482546006840154604080518c8152602081018c90529081018a905260608101899052608081019490945260a084019290925260c0830186905260e083018590526001600160801b03808216610100850152600160801b909104166101208301526001600160401b03808216610140840152600160401b9091041661016082015288907f9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309906101800160405180910390a25050505050505050565b80515f9081526020859052604081205460c0830151608084015160a0850151614da49388936001600160401b0390911692909161345d565b845483515f9081526020889052604090819020805467ffffffffffffffff19166001600160401b03909316929092179091558301519091506001600160801b0316158015614dfd575060608201516001600160801b0316155b15614e08575061285b565b81515f90815260208a8152604080832085518452918b9052909120614e3291908989878787615093565b505050505050505050565b5f614e488660801d90565b614e528860801d90565b614e5c9190616d91565b90505f614e6987600f0b90565b614e7389600f0b90565b614e7d9190616d91565b9050614e8a8286866156d7565b614e958186856156d7565b614ea48a8a5f01518489615797565b614eb48a8a602001518389615797565b50505050505050505050565b6040515f90614edf908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f80614f0784614ec0565b90505f614f1560048361653d565b60408051600287900b6020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6001600160a01b0384165f9081526020879052604081205490819003614f7557506144a1565b5f836001600160a01b0316866001600160a01b031614614f955784614f97565b825b90506001600160a01b038116614fae5750506144a1565b6001600160a01b0386165f908152602089905260408120819055614fda908890889081908690866144a9565b806001600160a01b0316866001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb88460405161501f91815260200190565b60405180910390a35050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661508757838315161561507b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60408201516001600160801b031615615126576020820151516040808401518151630ab714fb60e11b81523060048201526001600160a01b0393841660248201526001600160801b03909116604482015290519185169163156e29f6916064808201925f9290919082900301818387803b15801561510f575f80fd5b505af1158015615121573d5f803e3d5ffd5b505050505b60608201516001600160801b0316156151da57826001600160a01b031663156e29f63061516a8560200151602001516001600160a01b03166001600160a01b031690565b60608601516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526001600160801b031660448201526064015f604051808303815f87803b1580156151c3575f80fd5b505af11580156151d5573d5f803e3d5ffd5b505050505b86546001600160801b03165f8190036152f55782604001516001600160801b0316865f85602001515f01516001600160a01b03166001600160a01b031681526020019081526020015f205f828254615232919061653d565b9250508190555082606001516001600160801b0316865f8560200151602001516001600160a01b03166001600160a01b031681526020019081526020015f205f82825461527f919061653d565b925050819055506152ef8888866040518060a00160405280885f0151815260200188604001516001600160801b0316815260200188606001516001600160801b0316815260200188604001516001600160801b0316815260200188606001516001600160801b031681525061442a565b50611723565b5f61530789856040015184600161594f565b90505f61531a8a8660600151855f61594f565b9050811561535457602080860151516001600160a01b03165f9081529089905260408120805484929061534e90849061653d565b90915550505b801561538e576020808601518101516001600160a01b03165f9081529089905260408120805483929061538890849061653d565b90915550505b6153998a8383615a57565b89545f906153b790600160801b90046001600160801b03168561679e565b9050805f03615505578286604001516001600160801b03166153d9919061679e565b602080880151516001600160a01b03165f908152908b905260408120805490919061540590849061653d565b909155505060608601516154239083906001600160801b031661679e565b6020808801518101516001600160a01b03165f908152908b905260408120805490919061545190849061653d565b925050819055506154938b8488604001516001600160801b0316615475919061679e565b8489606001516001600160801b031661548e919061679e565b615a57565b6154fc8b8b896040518060a001604052808b5f015181526020018b604001516001600160801b031681526020018b606001516001600160801b031681526020018b604001516001600160801b031681526020018b606001516001600160801b031681525061442a565b50505050611723565b5f8387604001516001600160801b031661551f919061679e565b90505f8388606001516001600160801b031661553b919061679e565b905061ffff87161580159061555c575060c08801516001600160a01b031615155b1561562a575f61271061557361ffff8a1685616894565b61557d91906168bf565b90505f61271061559161ffff8b1685616894565b61559b91906168bf565b905081156155d5576020808b0151516001600160a01b03165f908152908d90526040812080548492906155cf90849061653d565b90915550505b801561560f576020808b01518101516001600160a01b03165f908152908d905260408120805483929061560990849061653d565b90915550505b615619828561679e565b9350615625818461679e565b925050505b61563982600160801b85614b85565b8d6001015f82825461564b919061653d565b90915550615660905081600160801b85614b85565b8d6002015f828254615672919061653d565b925050819055506156c88d8d8b6040518060a001604052808d5f015181526020018d604001516001600160801b031681526020018d606001516001600160801b031681526020018a81526020018981525061442a565b50505050505050505050505050565b5f82131561573b575f8084600f0b126156f0575f6156fd565b83600f0b6156fd90616769565b9050816001600160801b031681111561117157604051630f569baf60e01b8152600481018290526001600160801b0383166024820152604401612012565b5f82121561132d575f8084600f0b13615754575f615759565b83600f0b5b9050816001600160801b031681101561117157604051636741d67d60e11b8152600481018290526001600160801b0383166024820152604401612012565b5f82600f0b12156158ff575f82600f0b6157b090616769565b604051632961046560e21b81526001600160a01b0386811660048301529192509086169063a5841194906024015f604051808303815f87803b1580156157f4575f80fd5b505af1158015615806573d5f803e3d5ffd5b505050506001600160a01b03841661588157846001600160a01b03166311da60b4826040518263ffffffff1660e01b815260040160206040518083038185885af1158015615856573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061587b9190616d7a565b506158f9565b6158966001600160a01b038516838784615ae8565b846001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156158d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158f79190616d7a565b505b50611171565b5f82600f0b131561117157604051630b0d9c0960e01b81526001600160a01b03848116600483015282811660248301526001600160801b0384166044830152851690630b0d9c09906064016146ad565b83545f90600160801b90046001600160801b0316816159958580615975576159756168ab565b836001600160801b0316886001600160801b031609600160801b87614b85565b846159b4576005880154600160801b90046001600160801b03166159c3565b60058801546001600160801b03165b6001600160801b03166159d6919061653d565b9050608081901c6159fa876001600160801b0316846001600160801b031688614b85565b615a04919061653d565b9250808415615a2f576005880180546001600160801b0319166001600160801b038316179055615a4c565b6005880180546001600160801b03808416600160801b0291161790555b505050949350505050565b8254600160801b90046001600160801b03165f819003615a775750505050565b8215615aad57615a9583600160801b836001600160801b0316614b85565b846003015f828254615aa7919061653d565b90915550505b811561117157615acb82600160801b836001600160801b0316614b85565b846004015f828254615add919061653d565b909155505050505050565b615af6848484846001615b1e565b61117157604051635274afe760e01b81526001600160a01b0385166004820152602401612012565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316615b7a578383151615615b6e573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146128a1575f80fd5b5f8060408385031215615bb0575f80fd5b8235615bbb81615b8b565b946020939093013593505050565b5f60208284031215615bd9575f80fd5b81356001600160e01b0319811681146110a5575f80fd5b5f805f60608486031215615c02575f80fd5b8335615c0d81615b8b565b95602085013595506040909401359392505050565b5f8083601f840112615c32575f80fd5b5081356001600160401b03811115615c48575f80fd5b6020830191508360208260051b8501011115614ca1575f80fd5b803561ffff81168114615c73575f80fd5b919050565b5f805f8060608587031215615c8b575f80fd5b84356001600160401b03811115615ca0575f80fd5b615cac87828801615c22565b9095509350615cbf905060208601615c62565b91506040850135615ccf81615b8b565b939692955090935050565b5f60208284031215615cea575f80fd5b81356001600160401b03811681146110a5575f80fd5b5f60208284031215615d10575f80fd5b5035919050565b80151581146128a1575f80fd5b5f8060408385031215615d35575f80fd5b823591506020830135615d4781615d17565b809150509250929050565b5f60208284031215615d62575f80fd5b81356110a581615b8b565b5f805f60408486031215615d7f575f80fd5b83356001600160401b03811115615d94575f80fd5b615da086828701615c22565b9094509250506020840135615db481615b8b565b809150509250925092565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101008101615e118287615dbf565b8460020b60a08301528360020b60c083015282151560e083015295945050505050565b5f60a08284031215615e44575f80fd5b50919050565b8060020b81146128a1575f80fd5b6001600160801b03811681146128a1575f80fd5b5f805f805f805f610160888a031215615e83575f80fd5b615e8d8989615e34565b965060a0880135615e9d81615e4a565b955060c0880135615ead81615e4a565b945060e0880135615ebd81615e58565b9350610100880135615ece81615e58565b9250610120880135615edf81615e58565b9699959850939692959194919350506101409091013590565b81516001600160801b0316815261014081016020830151615f2460208401826001600160801b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151615f6760c08401826001600160801b03169052565b5060e0830151615f8260e08401826001600160801b03169052565b50610100830151615f9f6101008401826001600160401b03169052565b50610120830151615fbc6101208401826001600160401b03169052565b5092915050565b62ffffff811681146128a1575f80fd5b5f805f806101008587031215615fe7575f80fd5b615ff18686615e34565b935060a085013561600181615fc3565b925060c085013561601181615fc3565b915060e0850135615ccf81615fc3565b5f805f805f6101208688031215616036575f80fd5b6160408787615e34565b945060a086013561605081615e4a565b935060c086013561606081615e4a565b925060e086013561607081615b8b565b915061607f6101008701615c62565b90509295509295909350565b5f806040838503121561609c575f80fd5b823591506020830135615d4781615b8b565b5f610120820190506001600160801b0383511682526001600160801b03602084015116602083015260408301516160f060408401826001600160801b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b5f8060408385031215616146575f80fd5b823561615181615b8b565b91506020830135615d4781615d17565b5f8083601f840112616171575f80fd5b5081356001600160401b03811115616187575f80fd5b602083019150836020828501011115614ca1575f80fd5b5f805f805f8587036101408112156161b4575f80fd5b86356161bf81615b8b565b95506161ce8860208901615e34565b9450606060bf19820112156161e1575f80fd5b5060c0860192506101208601356001600160401b03811115616201575f80fd5b61620d88828901616161565b969995985093965092949392505050565b5f805f60608486031215616230575f80fd5b833561623b81615b8b565b9250602084013561624b81615b8b565b929592945050506040919091013590565b5f805f806101008587031215616270575f80fd5b61627a8686615e34565b935060a085013561628a81615e4a565b925060c085013561629a81615e4a565b915060e0850135615ccf81615e58565b5f805f604084860312156162bc575f80fd5b8335925060208401356001600160401b038111156162d8575f80fd5b6162e486828701615c22565b9497909650939450505050565b5f805f60608486031215616303575f80fd5b83359250602084013561631581615fc3565b9150604084013564ffffffffff81168114615db4575f80fd5b5f806020838503121561633f575f80fd5b82356001600160401b03811115616354575f80fd5b61636085828601616161565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a5602083018461636c565b5f805f805f805f80610180898b0312156163c4575f80fd5b6163ce8a8a615e34565b975060a08901356163de81615e4a565b965060c08901356163ee81615e4a565b955060e08901356163fe81615e58565b945061010089013561640f81615b8b565b935061012089013561642081615e58565b925061014089013561643181615e58565b979a969950949793969295919450919261016001359150565b5f806040838503121561645b575f80fd5b823561646681615b8b565b91506020830135615d4781615b8b565b5f805f60e08486031215616488575f80fd5b833561649381615b8b565b92506164a28560208601615e34565b915060c0840135615db481615b8b565b5f805f606084860312156164c4575f80fd5b8335925060208401356164d681615e4a565b91506040840135615db481615e4a565b5f805f80608085870312156164f9575f80fd5b843561650481615b8b565b9350602085013561651481615b8b565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561101657611016616529565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561658657616586616550565b60405290565b60405160e081016001600160401b038111828210171561658657616586616550565b604051601f8201601f191681016001600160401b03811182821017156165d6576165d6616550565b604052919050565b5f60a08284031280156165ef575f80fd5b506165f8616564565b823561660381615b8b565b8152602083013561661381615b8b565b6020820152604083013561662681615fc3565b6040820152606083013561663981615e4a565b6060820152608083013561664c81615b8b565b60808201529392505050565b6001600160401b03818116838216019081111561101657611016616529565b6001600160801b03818116838216019081111561101657611016616529565b5f60608284031280156166a7575f80fd5b50604051606081016001600160401b03811182821017156166ca576166ca616550565b60405282356166d881615d17565b81526020838101359082015260408301356166f281615b8b565b60408201529392505050565b5f6020828403121561670e575f80fd5b81516110a581615d17565b6001600160801b03828116828216039081111561101657611016616529565b634e487b7160e01b5f52603260045260245ffd5b64ffffffffff818116838216019081111561101657611016616529565b5f600160ff1b820161677d5761677d616529565b505f0390565b5f60208284031215616793575f80fd5b81356110a581615fc3565b8181038181111561101657611016616529565b5f80858511156167bf575f80fd5b838611156167cb575f80fd5b5050820193919092039150565b80356001600160e01b03198116906004841015615fbc576001600160e01b031960049490940360031b84901b1690921692915050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8161685b5761685b616529565b505f190190565b5f6001820161687357616873616529565b5060010190565b61ffff828116828216039081111561101657611016616529565b808202811582820484141761101657611016616529565b634e487b7160e01b5f52601260045260245ffd5b5f826168d957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b038211156168f6576168f6616550565b50601f01601f191660200190565b5f8060408385031215616915575f80fd5b823560028110616923575f80fd5b915060208301356001600160401b0381111561693d575f80fd5b8301601f8101851361694d575f80fd5b803561696061695b826168de565b6165ae565b818152866020838501011115616974575f80fd5b816020840160208301375f602083830101528093505050509250929050565b634e487b7160e01b5f52602160045260245ffd5b8051615c7381615b8b565b5f60a08284031280156169c3575f80fd5b506169cc616564565b82516169d781615b8b565b815260208301516169e781615b8b565b60208201526040838101519082015260608084015190820152608083015161664c81615b8b565b5f60208284031215616a1e575f80fd5b81516110a581615b8b565b5f61016082019050616a3c828451615dbf565b602083015160020b60a0830152604083015160020b60c0830152606083015160e083015260018060a01b036080840151166101008301526001600160801b0360a08401511661012083015260c0830151615fbc6101408401826001600160801b03169052565b5f60028410616abf57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152612ee7604083018461636c565b5f60208284031215616ae6575f80fd5b81516001600160401b03811115616afb575f80fd5b8201601f81018413616b0b575f80fd5b8051616b1961695b826168de565b818152856020838501011115616b2d575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b8051615c7381615e4a565b8051615c7381615e58565b5f81830361016081128015616b73575f80fd5b50616b7c61658c565b60a0821215616b89575f80fd5b616b91616564565b91508351616b9e81615b8b565b82526020840151616bae81615b8b565b60208301526040840151616bc181615fc3565b60408301526060840151616bd481615e4a565b60608301526080840151616be781615b8b565b6080830152818152616bfb60a08501616b4a565b6020820152616c0c60c08501616b4a565b604082015260e0840151606082018190529150616c2c61010085016169a7565b6080820152616c3e6101208501616b55565b60a0820152616c506101408501616b55565b60c0820152949350505050565b616c678184615dbf565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f8060408385031215616cbf575f80fd5b505080516020909101519092909150565b5f60208284031215616ce0575f80fd5b81516001600160401b03811115616cf5575f80fd5b8201601f81018413616d05575f80fd5b80516001600160401b03811115616d1e57616d1e616550565b8060051b616d2e602082016165ae565b91825260208184018101929081019087841115616d49575f80fd5b6020850194505b83851015616d6f57845180835260209586019590935090910190616d50565b979650505050505050565b5f60208284031215616d8a575f80fd5b5051919050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff1981126f7fffffffffffffffffffffffffffffff821317156110165761101661652956fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac7288599b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081a000a0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951000000000000000000000000a362d98b33a7bb5b5e2180a05f995a70fb404f300000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73","recompiledBytecode":"0x60e060405234801561000f575f80fd5b5060405161723838038061723883398101604081905261002e9161031e565b8383838282828161003e8161014f565b5062ffffff811615806100585750620f424062ffffff8216115b156100765760405163a51d0c8160e01b815260040160405180910390fd5b62ffffff81166080526001600160a01b03831660a05261010b30610106604080516101c0810182525f60208201819052918101829052606081018290526080810182905260a0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152600180825260c082015290565b6101a2565b5050506001600160a01b038416925061013a9150505760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660c05250610381915050565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad9060200160405180910390a150565b80511515612000831615151415806101c65750602081015115156110008316151514155b806101dd5750604081015115156108008316151514155b806101f45750606081015115156104008316151514155b8061020b5750608081015115156102008316151514155b80610222575060a081015115156101008316151514155b80610238575060c0810151151560808316151514155b8061024e575060e0810151151560408316151514155b806102655750610100810151151560208316151514155b8061027c5750610120810151151560108316151514155b806102935750610140810151151560088316151514155b806102aa5750610160810151151560048316151514155b806102c15750610180810151151560028316151514155b806102d857506101a0810151151560018316151514155b156102ee576102ee630732d7b560e51b836102f2565b5050565b815f526001600160a01b03811660045260245ffd5b6001600160a01b038116811461031b575f80fd5b50565b5f805f8060808587031215610331575f80fd5b845161033c81610307565b602086015190945061034d81610307565b604086015190935062ffffff81168114610365575f80fd5b606086015190925061037681610307565b939692955090935050565b60805160a05160c051616e1d61041b5f395f81816106e501528181613c3b01528181613cb50152613d2f01525f81816103e601528181610ed80152818161169701528181611c700152818161239701528181612421015281816124d401528181612c9f0152818161391e01528181613b6001528181613c0d0152818161407b0152614b1901525f81816106b2015261383b0152616e1d5ff3fe6080604052600436106103d6575f3560e01c80637e445230116101ff578063bdde80c611610113578063daf58566116100a8578063e74c37f711610078578063e74c37f714610f38578063f4314f1d14610f57578063f69ec15814610f9e578063f8c543ce14610fb3578063fe99049a14610fc7575f80fd5b8063daf5856614610ea8578063dc4c90d314610ec7578063dc98354e14610efa578063df848a9f14610f19575f80fd5b8063d0ba2baa116100e3578063d0ba2baa14610e25578063d5a2472414610e44578063d677eaad14610e74578063da748b1014610e93575f80fd5b8063bdde80c614610dac578063bf7e214f14610dcb578063bfcb418514610de7578063bfe1092814610e06575f80fd5b8063999d55fb11610194578063a6acaacc11610164578063a6acaacc14610cf1578063ab9e5bfd14610d05578063ae4a578514610d24578063b11dcb2314610d43578063b6363cf214610d73575f80fd5b8063999d55fb14610c565780639d1712c514610c6c578063a23e4db514610cb8578063a2ba1fc814610cd2575f80fd5b806391dd7346116101cf57806391dd734614610b75578063936852d414610ba1578063966af35a14610bd557806396f25d4214610c36575f80fd5b80637e44523014610af55780637fa7b6ac14610b0a5780638aebf0c114610b295780638fb3603714610b48575f80fd5b80634dc4b5c9116102f65780635ca344691161028b57806370233ddd1161025b57806370233ddd14610a585780637339254914610a835780637a526f4e14610a975780637a9e5e4b14610ab15780637c5e62d014610ad0575f80fd5b80635ca34469146109be5780635cd04cf8146109dd5780635f4934a814610a0d57806363cb7bdf14610a2c575f80fd5b8063558a7297116102c6578063558a729714610903578063575e24b414610922578063598af9e71461096c5780635c975abb146109a8575f80fd5b80634dc4b5c91461087a5780634e8d0048146108995780634eb5c4fd146108b857806351789ea2146108e4575f80fd5b806326f5ef521161036c5780633fc8cef31161033c5780633fc8cef3146106d4578063412b82c81461071f57806341b69b2a1461073e578063426a84931461085b575f80fd5b806326f5ef521461058f5780632e32a3b0146105ae57806336a9ca1a1461068e5780633c2f373f146106a1575f80fd5b8063113b9ac4116103a7578063113b9ac4146104e0578063136439dd1461051257806315452022146105315780632384b55414610564575f80fd5b8062fdd58e1461042a57806301ffc9a714610473578063095bcdb6146104a257806309974324146104c1575f80fd5b3661042657336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042457604051632dc88d5b60e21b815260040160405180910390fd5b005b5f80fd5b348015610435575f80fd5b50610460610444366004615b9f565b600560209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561047e575f80fd5b5061049261048d366004615bc9565b610fe6565b604051901515815260200161046a565b3480156104ad575f80fd5b506104926104bc366004615bf0565b61101c565b3480156104cc575f80fd5b506104246104db366004615c78565b6110ac565b3480156104eb575f80fd5b506104ff6104fa366004615cda565b611177565b60405161ffff909116815260200161046a565b34801561051d575f80fd5b5061042461052c366004615d00565b6111a5565b34801561053c575f80fd5b5061055061054b366004615d24565b611246565b60405162ffffff909116815260200161046a565b34801561056f575f80fd5b5061046061057e366004615d52565b60146020525f908152604090205481565b34801561059a575f80fd5b506104246105a9366004615d6d565b611276565b3480156105b9575f80fd5b5061067e6105c8366004615d00565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152601060209081526040918290206003810154835160a08101855282546001600160a01b039081168252600184015480821695830195909552600160a01b850462ffffff1695820195909552600160b81b909304600290810b6060850152918201549093166080830152909282820b926301000000810490920b91600160301b900460ff1690565b60405161046a9493929190615e02565b61042461069c366004615e6c565b611332565b3480156106ac575f80fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b3480156106df575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161046a565b34801561072a575f80fd5b50600a54610707906001600160a01b031681565b348015610749575f80fd5b5061084e610758366004615d00565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152505f9081526011602090815260409182902082516101408101845281546001600160801b038082168352600160801b918290048116948301949094526001830154948201949094526002820154606082015260038201546080820152600482015460a0820152600582015480841660c08301529390930490911660e0830152600601546001600160401b03808216610100840152600160401b9091041661012082015290565b60405161046a9190615ef8565b348015610866575f80fd5b50610492610875366004615bf0565b61172c565b348015610885575f80fd5b50610424610894366004615fd3565b6117a2565b3480156108a4575f80fd5b506104246108b3366004616021565b61187d565b3480156108c3575f80fd5b506108d76108d236600461608b565b611a75565b60405161046a91906160ae565b3480156108ef575f80fd5b506104246108fe366004615d00565b611b73565b34801561090e575f80fd5b5061049261091d366004616135565b611bf3565b34801561092d575f80fd5b5061094161093c36600461619e565b611c62565b604080516001600160e01b03199094168452602084019290925262ffffff169082015260600161046a565b348015610977575f80fd5b5061046061098636600461621e565b600660209081525f938452604080852082529284528284209052825290205481565b3480156109b3575f80fd5b50600e544210610492565b3480156109c9575f80fd5b506104246109d836600461625c565b611cf8565b3480156109e8575f80fd5b506105506109f7366004615d00565b60026020525f908152604090205462ffffff1681565b348015610a18575f80fd5b50610424610a27366004615d00565b611f91565b348015610a37575f80fd5b50610a426203f48081565b60405164ffffffffff909116815260200161046a565b348015610a63575f80fd5b50610460610a72366004615d52565b60136020525f908152604090205481565b348015610a8e575f80fd5b50600b54610460565b348015610aa2575f80fd5b506007546104ff9061ffff1681565b348015610abc575f80fd5b50610424610acb366004615d52565b611fe0565b348015610adb575f80fd5b50600754610707906201000090046001600160a01b031681565b348015610b00575f80fd5b506104ff61138881565b348015610b15575f80fd5b50610424610b243660046162aa565b61205d565b348015610b34575f80fd5b50610424610b433660046162f1565b6121f3565b348015610b53575f80fd5b50610b5c612368565b6040516001600160e01b0319909116815260200161046a565b348015610b80575f80fd5b50610b94610b8f36600461632e565b61238a565b60405161046a919061639a565b348015610bac575f80fd5b50610bc0610bbb366004615d00565b612448565b6040805192835260208301919091520161046a565b348015610be0575f80fd5b50610c15610bef366004615d00565b60036020525f908152604090205462ffffff8116906301000000900464ffffffffff1682565b6040805162ffffff909316835264ffffffffff90911660208301520161046a565b348015610c41575f80fd5b505f80516020616df18339815191525c610492565b348015610c61575f80fd5b5061046062093a8081565b348015610c77575f80fd5b50610ca0610c86366004615d00565b600d6020525f90815260409020546001600160401b031681565b6040516001600160401b03909116815260200161046a565b348015610cc3575f80fd5b50600c546104ff9061ffff1681565b348015610cdd575f80fd5b50610424610cec3660046163ac565b612517565b348015610cfc575f80fd5b50610550606481565b348015610d10575f80fd5b50610424610d1f366004615d52565b612865565b348015610d2f575f80fd5b50610424610d3e366004615d52565b6128a4565b348015610d4e575f80fd5b50610550610d5d366004615d00565b60016020525f908152604090205462ffffff1681565b348015610d7e575f80fd5b50610492610d8d36600461644a565b600460209081525f928352604080842090915290825290205460ff1681565b348015610db7575f80fd5b50610424610dc6366004615d52565b612a3e565b348015610dd6575f80fd5b505f546001600160a01b0316610707565b348015610df2575f80fd5b50600954610707906001600160a01b031681565b348015610e11575f80fd5b50600854610707906001600160a01b031681565b348015610e30575f80fd5b50610424610e3f366004615d6d565b612a72565b348015610e4f575f80fd5b50610550610e5e366004615d00565b5f9081526015602052604090205462ffffff1690565b348015610e7f575f80fd5b506104ff610e8e366004615d00565b612b10565b348015610e9e575f80fd5b50610460600e5481565b348015610eb3575f80fd5b50610424610ec236600461625c565b612b1a565b348015610ed2575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b348015610f05575f80fd5b50610b5c610f14366004616476565b612c93565b348015610f24575f80fd5b50610460610f333660046164b2565b612db1565b348015610f43575f80fd5b50600f54610707906001600160a01b031681565b348015610f62575f80fd5b50610f76610f71366004615d00565b612dfc565b6040805182516001600160401b0316815260209283015161ffff16928101929092520161046a565b348015610fa9575f80fd5b506104ff6107d081565b348015610fbe575f80fd5b50610460602081565b348015610fd2575f80fd5b50610492610fe13660046164e6565b612e5d565b5f6301ffc9a760e01b6001600160e01b0319831614806110165750630f632fb360e01b6001600160e01b03198316145b92915050565b5f611025612eef565b600e544210156110485760405163b359f26960e01b815260040160405180910390fd5b815f0361106857604051639811e0c760e01b815260040160405180910390fd5b611073338484612f13565b61107c83612f7c565b6110868333613092565b6110908385613092565b61109b8484846130d7565b90506110a561316f565b9392505050565b6110b8335b5f36613186565b6110c0612eef565b6110ca8484613275565b600854600c546110f091600b91859185916001600160a01b039091169061ffff166132e5565b600c805461ffff191661ffff928316179055600780549184166001600160b01b03199092168217620100006001600160a01b038516908102919091179091556040805192835260208301919091527f0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87910160405180910390a161117161316f565b50505050565b600754600c545f9161101691600b9185916001600160a01b03620100008304169161ffff908116911661345d565b6111ae336110b1565b8015806111bd575062093a8081115b156111db576040516316873e3160e11b815260040160405180910390fd5b5f6111e6824261653d565b9050600e54811161120a576040516316873e3160e11b815260040160405180910390fd5b600e8190556040518181527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df9219060200160405180910390a15050565b5f6110a583604051806060016040528085151581526020015f81526020015f6001600160a01b031681525061356c565b61127f336110b1565b611287612eef565b6112918383613275565b6008546001600160a01b03828116911614806112b557506001600160a01b03811630145b156112d3576040516343c829db60e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834906020015b60405180910390a161132d61316f565b505050565b61133a612eef565b600e5442101561135d5760405163b359f26960e01b815260040160405180910390fd5b836001600160801b03165f0361138657604051630200e8a960e31b815260040160405180910390fd5b804211156113a757604051631ab7da6b60e01b815260040160405180910390fd5b6113b087613642565b6113cd6113c06020890189615d52565b6001600160a01b03161590565b1561140157826001600160801b03163410156113fc57604051631841b4e160e01b815260040160405180910390fd5b611420565b341561142057604051631841b4e160e01b815260040160405180910390fd5b5f61144461143d611436368b90038b018b6165de565b60a0902090565b8888612db1565b5f81815260106020526040902060030154909150600160301b900460ff166115885760405180608001604052808980360381019061148291906165de565b8152600289810b60208084019190915289820b604080850191909152600160609485018190525f878152601084528290208651805182546001600160a01b03199081166001600160a01b0392831617845582870151948401805484880151858c01519785166001600160b81b031990921691909117600160a01b62ffffff928316021762ffffff60b81b1916600160b81b978216979097029690961790556080909201519683018054909216961695909517909455918501516003909301805491860151959094015192821665ffffffffffff1990911617630100000094909116939093029290921766ff0000000000001916600160301b921515929092029190911790555b61159181612f7c565b61159b8133613092565b5f818152601160205260409020546001600160801b0316158015611612575f8281526011602052604090206006018054600191906008906115ed908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5f82815260116020526040812080548892906116389084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506116703383886001600160801b03166136e5565b611688898989896001600160801b0316338a8a613757565b80156116bc576116bc601160107f000000000000000000000000000000000000000000000000000000000000000085613774565b6040516001600160801b0387168152829033907f1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a9060200160405180910390a361170c6113c060208b018b615d52565b15611719576117196137ba565b505061172361316f565b50505050505050565b335f8181526006602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906117909087815260200190565b60405180910390a45060019392505050565b6117ab336110b1565b8262ffffff168262ffffff1610806117cc57508062ffffff168262ffffff16115b156117ea576040516306b7c75960e31b815260040160405180910390fd5b5f6117fd611436368790038701876165de565b5f818152601560205260409020805462ffffff191662ffffff8616179055905061182881858461382c565b6040805162ffffff8087168252808616602083015284169181019190915281907f0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5906060015b60405180910390a25050505050565b611885612eef565b600e544210156118a85760405163b359f26960e01b815260040160405180910390fd5b6118b185613642565b5f6118ce6118c7611436368990038901896165de565b8686612db1565b90508161ffff166118de826138f9565b61ffff1611156119015760405163663fffd960e01b815260040160405180910390fd5b5f8181526012602090815260408083203384528252808320600583528184208585529092529091205415801561194657508054600160801b90046001600160801b0316155b801561195d575060018101546001600160801b0316155b1561197b576040516312d37ee560e31b815260040160405180910390fd5b61198482612f7c565b61198e8233613092565b5f8281526012602090815260408083203384529091529020805460018201546001600160801b03600160801b90920482169116811580156119cd575080155b156119dc575050505050611a66565b6001830180546001600160801b031916905582546001600160801b03168355611a23611a0b60208c018c615d52565b611a1b60408d0160208e01615d52565b84848b613919565b6040805183815260208101839052869133917fd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77910160405180910390a350505050505b611a6e61316f565b5050505050565b611ad66040518061012001604052805f6001600160801b031681526020015f6001600160801b031681526020015f6001600160801b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b505f9182526012602090815260408084206001600160a01b039390931684529181529181902081516101208101835281546001600160801b038082168352600160801b9091048116948201949094526001820154909316918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e08301526007015461010082015290565b611b7c336110b1565b62093a80811115611ba0576040516316873e3160e11b815260040160405180910390fd5b8015611bb557611bb0814261653d565b611bb7565b5f5b600e8190556040519081527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f8080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611cae5760405163570c108560e11b815260040160405180910390fd5b5f611cd8611cc4611436368b90038b018b6165de565b611cd3368a90038a018a616696565b61356c565b6315d7892d60e21b94505f93506240000017915050955095509592505050565b611d00612eef565b600e54421015611d235760405163b359f26960e01b815260040160405180910390fd5b806001600160801b03165f03611d4c57604051639811e0c760e01b815260040160405180910390fd5b611d5584613642565b600f546001600160a01b0316801580611de957506001600160a01b038116637f55485b611d8a611436368990038901896165de565b6040518263ffffffff1660e01b8152600401611da891815260200190565b602060405180830381865afa158015611dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de791906166fe565b155b15611e0757604051630ac6deb160e31b815260040160405180910390fd5b5f611e1d6118c7611436368990038901896165de565b9050611e2881612f7c565b611e328133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529220546001600160801b0380871692611e7492911690616719565b6001600160801b03161015611e9c57604051631a61620360e01b815260040160405180910390fd5b8054849082905f90611eb89084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316611f119190616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a86604051611f7e91906001600160801b0391909116815260200190565b60405180910390a350505061117161316f565b611f9a336110b1565b5f81815260036020526040808220805467ffffffffffffffff191690555182917fb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb91a250565b5f5433906001600160a01b0316811461201b5760405162d1953b60e31b81526001600160a01b03821660048201526024015b60405180910390fd5b816001600160a01b03163b5f03612050576040516361798f2f60e11b81526001600160a01b0383166004820152602401612012565b61205982613947565b5050565b612065612eef565b600f546001600160a01b03168061208f57604051634e3fb44d60e01b815260040160405180910390fd5b5f5b828110156121e9575f8484838181106120ac576120ac616738565b602090810292909201355f81815260119093526040832054909350600160801b90046001600160801b031690910390506120e657506121e1565b5f81815260106020908152604091829020825160a0808201855282546001600160a01b03908116835260018401548082168487015262ffffff600160a01b82041684880152600160b81b9004600290810b606085015290930154831660808301529020835163181e22b360e01b8152336004820152602481018b9052604481019190915292519086169263181e22b39260648083019391928290030181865afa158015612195573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b991906166fe565b6121d657604051630c8563b360e41b815260040160405180910390fd5b6121df81612f7c565b505b600101612091565b505061132d61316f565b6121fc336110b1565b5f8381526001602052604081205462ffffff169081900361223057604051636b271baf60e11b815260040160405180910390fd5b8062ffffff168362ffffff16111561225b5760405163329429f760e11b815260040160405180910390fd5b5f8481526002602052604090205462ffffff9081169084161015612292576040516310dd5b7f60e31b815260040160405180910390fd5b64ffffffffff821615806122af57506203f48064ffffffffff8316115b156122cd57604051631ee3453360e11b815260040160405180910390fd5b5f6122d8834261674c565b60408051808201825262ffffff87811680835264ffffffffff85811660208086018281525f8e81526003835288902096518754915190941663010000000267ffffffffffffffff1990911693909516929092179390931790935583519081529182015291925086917fcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04910161186e565b5f8054600160a01b900460ff1661237e57505f90565b50638fb3603760e01b90565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123d55760405163570c108560e11b815260040160405180910390fd5b6040805160608101825260075461ffff8082168352600c541660208301526201000090046001600160a01b0316918101919091526110a590601190601090601390601490600d90600b907f0000000000000000000000000000000000000000000000000000000000000000908b8b613994565b5f8181526010602052604081206003810154829190600160301b900460ff1661247657505f93849350915050565b6040805160a0808201835283546001600160a01b03908116835260018501548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b606084015284015490921660808201522061250d907f0000000000000000000000000000000000000000000000000000000000000000906003840154600281810b9163010000009004900b613a54565b9250925050915091565b61251f612eef565b846001600160801b03165f0361254857604051630200e8a960e31b815260040160405180910390fd5b6001600160a01b03841661256f5760405163d92e233d60e01b815260040160405180910390fd5b8042111561259057604051631ab7da6b60e01b815260040160405180910390fd5b61259988613642565b5f6125b66125af611436368c90038c018c6165de565b8989612db1565b90506125c181612f7c565b6125cb8133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529083205490929161260e916001600160801b0390911690616719565b9050876001600160801b0316816001600160801b03161015612724575f612635828a616719565b8354909150819084905f906126549084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508060115f8681526020019081526020015f205f0160108282829054906101000a90046001600160801b03166126ad9190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b68360405161271a91906001600160801b0391909116815260200190565b60405180910390a3505b61273833848a6001600160801b0316613af0565b5f83815260116020526040812080548a929061275e9084906001600160801b0316616719565b82546101009290920a6001600160801b038181021990931691831602179091555f85815260116020526040812054909116900390506127f0575f8381526011602052604090206006018054600191906008906127cb908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b6128108b8b8b6128086001600160801b038d16616769565b8b8b8b613757565b6040516001600160801b0389168152839033907f07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a09060200160405180910390a350505061285b61316f565b5050505050505050565b61286d612eef565b600e544210156128905760405163b359f26960e01b815260040160405180910390fd5b61289981613b59565b6128a161316f565b50565b6128ad336110b1565b6001600160a01b038116156129f057806001600160a01b03163b5f036128e657604051638fadf87960e01b815260040160405180910390fd5b60405163181e22b360e01b81523060048201525f6024820181905260448201526001600160a01b0382169063181e22b390606401602060405180830381865afa925050508015612953575060408051601f3d908101601f19168201909252612950918101906166fe565b60015b61297057604051638fadf87960e01b815260040160405180910390fd5b50604051637f55485b60e01b81525f60048201526001600160a01b03821690637f55485b90602401602060405180830381865afa9250505080156129d1575060408051601f3d908101601f191682019092526129ce918101906166fe565b60015b6129ee57604051638fadf87960e01b815260040160405180910390fd5b505b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba90602001611be8565b612a46612eef565b600e54421015612a695760405163b359f26960e01b815260040160405180910390fd5b61289981613b9b565b612a7b336110b1565b612a83612eef565b612a8d8383613275565b600a54600754612ab29183916001600160a01b03918216916201000090910416613d9f565b600980546001600160a01b03199081166001600160a01b03938416179091556008805490911691831691821790556040519081527f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858869060200161131d565b5f611016826138f9565b612b22612eef565b806001600160801b03165f03612b4b57604051639811e0c760e01b815260040160405180910390fd5b612b5484613642565b5f612b71612b6a611436368890038801886165de565b8585612db1565b9050612b7c81612f7c565b612b868133613092565b5f8181526012602090815260408083203384529091528120805490918491839190612bbb9084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508260115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316612c149190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b685604051612c8191906001600160801b0391909116815260200190565b60405180910390a3505061117161316f565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cdd5760405163570c108560e11b815260040160405180910390fd5b612d02612cf06060850160408601616783565b62ffffff1662ffffff16628000001490565b612d1f576040516309a90e8160e01b815260040160405180910390fd5b60015f612d34611436368790038701876165de565b815260208101919091526040015f9081205462ffffff169003612d6a57604051636b271baf60e11b815260040160405180910390fd5b612d7a6113c06020850185615d52565b8015612d8357505f5b15612da157604051630a7287b560e01b815260040160405180910390fd5b50636e4c1aa760e11b9392505050565b5f838383604051602001612ddc93929190928352600291820b6020840152900b604082015260600190565b60408051601f198184030181529190528051602090910120949350505050565b604080518082019091525f8082526020820152600b8281548110612e2257612e22616738565b5f918252602091829020604080518082019091529101546001600160401b0381168252600160401b900461ffff169181019190915292915050565b5f612e66612eef565b600e54421015612e895760405163b359f26960e01b815260040160405180910390fd5b815f03612ea957604051639811e0c760e01b815260040160405180910390fd5b612eb4858484612f13565b612ebd83612f7c565b612ec78386613092565b612ed18385613092565b612edd85858585613ee7565b9050612ee761316f565b949350505050565b612ef7614045565b612f1160015f80516020616df18339815191525b90614072565b565b5f8281526012602090815260408083206001600160a01b038716845282528083205460058352818420868552909252909120548291612f5d916001600160801b039091169061679e565b101561132d57604051631a61620360e01b815260040160405180910390fd5b5f8181526010602090815260409182902082516101208101845281546001600160a01b0390811660808301908152600184015480831660a0850152600160a01b810462ffffff1660c0850152600160b81b9004600290810b60e085015280850154909216610100840152825260039092015480830b938201939093526301000000830490910b92810192909252600160301b900460ff1615801560608301528061303a57505f828152601160205260409020546001600160801b0316155b156130715750600b545f918252600d6020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b612059815f0151826020015183604001515f306001600160801b0380614079565b5f828152601160209081526040808320601283528184206001600160a01b03861685528352818420600584528285208786529093529220546120599291908486614198565b335f90815260056020908152604080832085845290915281208054839190839061310290849061679e565b90915550506001600160a01b0384165f9081526005602090815260408083208684529091528120805484929061313990849061653d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020616dd18339815191529101611790565b612f115f5f80516020616df1833981519152612f0b565b5f806131b961319c5f546001600160a01b031690565b86306131ab60045f898b6167b1565b6131b4916167d8565b614398565b9150915081611a6e5763ffffffff811615613252575f805460ff60a01b198116600160a01b17909155604051634a63ebf760e11b81526001600160a01b03909116906394c7d7ee906132139088908890889060040161680e565b5f604051808303815f87803b15801561322a575f80fd5b505af115801561323c573d5f803e3d5ffd5b50505f805460ff60a01b1916905550611a6e9050565b60405162d1953b60e31b81526001600160a01b0386166004820152602401612012565b5f5b8181101561132d576132ae83838381811061329457613294616738565b90506020020160208101906132a99190615d52565b613b9b565b6132dd8383838181106132c3576132c3616738565b90506020020160208101906132d89190615d52565b613b59565b600101613277565b5f6107d061ffff8616111561330d5760405163af2eb37360e01b815260040160405180910390fd5b61ffff85161580159061332757506001600160a01b038416155b156133455760405163af2eb37360e01b815260040160405180910390fd5b306001600160a01b0385160361336e5760405163af2eb37360e01b815260040160405180910390fd5b6001600160a01b038416158015906133975750826001600160a01b0316846001600160a01b0316145b156133b55760405163af2eb37360e01b815260040160405180910390fd5b85545f6001600160a01b038616156133cd57866133cf565b5f5b604080518082019091526001600160401b03428116825261ffff80841660208085019182528d54600181018f555f8f8152919091209451940180549151909216600160401b0269ffffffffffffffffffff199091169390921692909217179055905081158061344557508361ffff168161ffff16105b61344f5783613451565b805b98975050505050505050565b5f846001600160401b03165f0361347557505f613563565b5f6001600160a01b0385161561348b578361348d565b5f5b90505f6134a460016001600160401b03891661679e565b88549091505f5b82821180156134ba5750602081105b15613531575f8a6134cc60018561679e565b815481106134dc576134dc616738565b5f918252602090912001805490915061ffff808716600160401b909204161015613510578054600160401b900461ffff1694505b8261351a8161684d565b935050818061352890616862565b925050506134ab565b8282036135445783945050505050613563565b8561ffff80861690821610613559578461355b565b805b955050505050505b95945050505050565b5f828152601560209081526040808320546003835281842082518084019093525462ffffff8082168452630100000090910464ffffffffff1693830184905216918291904210156136185780515f8781526002602052604081205462ffffff9283169450909116906127106135e36113888261687a565b6135f19061ffff1687616894565b6135fb91906168bf565b905080821015613609578091505b81841015613615578193505b50505b5f8681526001602052604090205462ffffff1680831115613637578092505b509095945050505050565b3061365360a0830160808401615d52565b6001600160a01b0316141580613690575060015f613679611436368590038501856165de565b815260208101919091526040015f205462ffffff16155b156136ae57604051636b271baf60e11b815260040160405180910390fd5b6136be6113c06020830183615d52565b80156136c757505f5b156128a157604051630a7287b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526005602090815260408083208584529091528120805483929061371790849061653d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020616dd183398151915291015b60405180910390a4505050565b611723613769368990038901896165de565b878787878787614079565b5f81815260208581526040808320868352818420825160a0810184528681529384018590529183018490526060830184905260808301939093526111719291859061442a565b475f8190036137c65750565b6040515f90339083908381818185875af1925050503d805f8114613805576040519150601f19603f3d011682016040523d82523d5f602084013e61380a565b606091505b505090508061205957604051633c31275160e21b815260040160405180910390fd5b62ffffff8116158061386757507f000000000000000000000000000000000000000000000000000000000000000062ffffff168162ffffff16115b156138855760405163a51d0c8160e01b815260040160405180910390fd5b606462ffffff831610806138a257508062ffffff168262ffffff16115b156138c05760405163a51d0c8160e01b815260040160405180910390fd5b5f928352600160209081526040808520805462ffffff1990811662ffffff95861617909155600290925290932080549093169116179055565b5f818152600d6020526040812054611016906001600160401b0316611177565b611a6e7f000000000000000000000000000000000000000000000000000000000000000086868686866144a9565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602001611be8565b60605f806139a484860186616904565b909250905060018260018111156139bd576139bd616993565b03613a21575f818060200190518101906139d791906169b2565b90506139f088825f0151836040015184608001516145e5565b613a08888260200151836060015184608001516145e5565b60405180602001604052805f8152509350505050613a46565b613a328d8d8d8d8d8d8d8d896146d6565b60405180602001604052805f815250925050505b9a9950505050505050505050565b5f805f80613a6288886148a6565b915091505f80613a738a8a8a61494f565b915091505f80613a848c8c8b61494f565b915091505f613a938d8d6149a4565b50509150508a60020b8160020b1215613ab55782850398508184039750613ae0565b8960020b8160020b12613ad15784830398508382039750613ae0565b82858803039850818487030397505b5050505050505094509492505050565b6001600160a01b0383165f90815260056020908152604080832085845290915281208054839290613b2290849061679e565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020616dd1833981519152910161374a565b6128a160147f000000000000000000000000000000000000000000000000000000000000000083600760029054906101000a90046001600160a01b0316614a56565b6001600160a01b03811615613bb3576128a181614b07565b6001600160a01b0381165f9081526013602052604081205490819003613bd7575050565b6008546001600160a01b031680613bed57505050565b6001600160a01b0383165f908152601360205260408120819055613c39907f000000000000000000000000000000000000000000000000000000000000000090859081908690306144a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015613c92575f80fd5b505af1158015613ca4573d5f803e3d5ffd5b50613ce09350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915083905084614b50565b806001600160a01b0316836001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb884604051613d2591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03167fb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e84604051613d9291815260200190565b60405180910390a3505050565b5f6001600160a01b038416613db557505f6110a5565b826001600160a01b0316846001600160a01b031603613de7576040516343c829db60e01b815260040160405180910390fd5b816001600160a01b0316846001600160a01b031603613e19576040516343c829db60e01b815260040160405180910390fd5b306001600160a01b03851603613e42576040516343c829db60e01b815260040160405180910390fd5b836001600160a01b031663667d31686040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613e9c575060408051601f3d908101601f19168201909252613e9991810190616a0e565b60015b613eb95760405163281d5dd760e11b815260040160405180910390fd5b6001600160a01b038116613ee05760405163281d5dd760e11b815260040160405180910390fd5b90506110a5565b5f336001600160a01b03861614801590613f2457506001600160a01b0385165f90815260046020908152604080832033845290915290205460ff16155b15613f94576001600160a01b0385165f90815260066020908152604080832033845282528083208684529091529020545f198114613f9257613f66838261679e565b6001600160a01b0387165f90815260066020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260056020908152604080832086845290915281208054849290613fc690849061679e565b90915550506001600160a01b0384165f90815260056020908152604080832086845290915281208054849290613ffd90849061653d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020616dd1833981519152910160405180910390a4506001949350505050565b5f80516020616df18339815191525c15612f1157604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060e001604052808b81526020018a60020b81526020018960020b8152602001888152602001876001600160a01b03168152602001866001600160801b03168152602001856001600160801b031681525060405160200161410d9190616a29565b60408051601f198184030181529082905261412b9291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401614156919061639a565b5f604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285b9190810190616ad6565b83545f906141af906001600160801b03168561679e565b90508015614278576141d981866002015488600101546141cf919061679e565b600160801b614b85565b855486906010906141fb908490600160801b90046001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061423781866003015488600201546141cf919061679e565b6001860180545f906142539084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6001860154600280870191909155860154600386015584546001600160801b03168015614375575f6142c1826001600160801b031688600401548a600301546141cf919061679e565b90505f6142e5836001600160801b031689600501548b600401546141cf919061679e565b9050811515806142f457508015155b156143725781886006015f82825461430c919061653d565b9250508190555080886007015f828254614326919061653d565b9091555050604080518381526020810183905286916001600160a01b038916917f7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d910160405180910390a35b50505b866003015486600401819055508660040154866005018190555050505050505050565b6040516001600160a01b038085166024830152831660448201526001600160e01b0319821660648201525f908190819060840160408051601f19818403018152918152602080830180516001600160e01b031663b700961360e01b1781525f808052918290528351939450919290918a5afa15614420575f516020805191945081901c150291505b5094509492505050565b600684018054600191905f9061444a9084906001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505f8061447a8585614c21565b915091506144a1835f0151846020015185604001518660600151876080015187878d614ca8565b505050505050565b821580156144b5575081155b6144a157856001600160a01b03166348c8949160016040518060a00160405280896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001856001600160a01b031681525060405160200161455a919081516001600160a01b0390811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b60408051601f19818403018152908290526145789291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016145a3919061639a565b5f604051808303815f875af11580156145be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190616ad6565b811561117157836001600160a01b031663f5298aca30614614866001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b15801561465e575f80fd5b505af1158015614670573d5f803e3d5ffd5b5050604051630b0d9c0960e01b81526001600160a01b03868116600483015284811660248301526044820186905287169250630b0d9c0991506064015b5f604051808303815f87803b1580156146c4575f80fd5b505af115801561285b573d5f803e3d5ffd5b5f818060200190518101906146eb9190616b60565b90505f80856001600160a01b0316635a6bcfda845f01516040518060800160405280876020015160020b8152602001876040015160020b8152602001876060015181526020015f801b8152506040518363ffffffff1660e01b8152600401614754929190616c5d565b60408051808303815f875af115801561476f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147939190616cae565b915091506148758c8c8c8c8c8c8c6040518060e001604052806147ba8d5f015160a0902090565b8d602001518e604001516040516020016147eb93929190928352600291820b6020840152900b604082015260600190565b604051602081830303815290604052805190602001205f1c81526020018c5f0151815260200161481b8b60801d90565b6001600160801b031681526020016148338b600f0b90565b600f0b6001600160801b031681526020018e5f015161ffff1681526020018e6020015161ffff1681526020018e604001516001600160a01b0316815250614d6c565b61489886845f01518484876080015188606001518960a001518a60c00151614e3d565b505050505050505050505050565b5f805f6148b284614ec0565b90505f6148c060018361653d565b604051631afeb18d60e11b815260048101829052600260248201529091505f906001600160a01b038816906335fd631a906044015b5f60405180830381865afa15801561490f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526149369190810190616cd0565b6020810151604090910151909890975095505050505050565b5f805f61495c8585614efc565b90505f6001600160a01b0387166335fd631a61497984600161653d565b60405160e083901b6001600160e01b03191681526004810191909152600260248201526044016148f5565b5f805f805f6149b286614ec0565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156149fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1e9190616d7a565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6001600160a01b038083165f908152602086905260409020549082161580614a7c575080155b15614a875750611171565b6001600160a01b0383165f908152602086905260408120819055614ab3908590859081908590876144a9565b816001600160a01b0316836001600160a01b03167f8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e080866483604051614af891815260200190565b60405180910390a35050505050565b600854600954600a546128a1926013927f00000000000000000000000000000000000000000000000000000000000000009286926001600160a01b039081169281169116614f4f565b614b5d8383836001615031565b61132d57604051635274afe760e01b81526001600160a01b0384166004820152602401612012565b5f838302815f1985870982811083820303915050808411614ba4575f80fd5b805f03614bb6575082900490506110a5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6040805160a0808201835284546001600160a01b03908116835260018601548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b60608401528501549092166080820152205f908190614c9c9084906003870154600281810b9163010000009004900b613a54565b915091505b9250929050565b6003810154600482015482546006840154604080518c8152602081018c90529081018a905260608101899052608081019490945260a084019290925260c0830186905260e083018590526001600160801b03808216610100850152600160801b909104166101208301526001600160401b03808216610140840152600160401b9091041661016082015288907f9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309906101800160405180910390a25050505050505050565b80515f9081526020859052604081205460c0830151608084015160a0850151614da49388936001600160401b0390911692909161345d565b845483515f9081526020889052604090819020805467ffffffffffffffff19166001600160401b03909316929092179091558301519091506001600160801b0316158015614dfd575060608201516001600160801b0316155b15614e08575061285b565b81515f90815260208a8152604080832085518452918b9052909120614e3291908989878787615093565b505050505050505050565b5f614e488660801d90565b614e528860801d90565b614e5c9190616d91565b90505f614e6987600f0b90565b614e7389600f0b90565b614e7d9190616d91565b9050614e8a8286866156d7565b614e958186856156d7565b614ea48a8a5f01518489615797565b614eb48a8a602001518389615797565b50505050505050505050565b6040515f90614edf908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f80614f0784614ec0565b90505f614f1560048361653d565b60408051600287900b6020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6001600160a01b0384165f9081526020879052604081205490819003614f7557506144a1565b5f836001600160a01b0316866001600160a01b031614614f955784614f97565b825b90506001600160a01b038116614fae5750506144a1565b6001600160a01b0386165f908152602089905260408120819055614fda908890889081908690866144a9565b806001600160a01b0316866001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb88460405161501f91815260200190565b60405180910390a35050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661508757838315161561507b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60408201516001600160801b031615615126576020820151516040808401518151630ab714fb60e11b81523060048201526001600160a01b0393841660248201526001600160801b03909116604482015290519185169163156e29f6916064808201925f9290919082900301818387803b15801561510f575f80fd5b505af1158015615121573d5f803e3d5ffd5b505050505b60608201516001600160801b0316156151da57826001600160a01b031663156e29f63061516a8560200151602001516001600160a01b03166001600160a01b031690565b60608601516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526001600160801b031660448201526064015f604051808303815f87803b1580156151c3575f80fd5b505af11580156151d5573d5f803e3d5ffd5b505050505b86546001600160801b03165f8190036152f55782604001516001600160801b0316865f85602001515f01516001600160a01b03166001600160a01b031681526020019081526020015f205f828254615232919061653d565b9250508190555082606001516001600160801b0316865f8560200151602001516001600160a01b03166001600160a01b031681526020019081526020015f205f82825461527f919061653d565b925050819055506152ef8888866040518060a00160405280885f0151815260200188604001516001600160801b0316815260200188606001516001600160801b0316815260200188604001516001600160801b0316815260200188606001516001600160801b031681525061442a565b50611723565b5f61530789856040015184600161594f565b90505f61531a8a8660600151855f61594f565b9050811561535457602080860151516001600160a01b03165f9081529089905260408120805484929061534e90849061653d565b90915550505b801561538e576020808601518101516001600160a01b03165f9081529089905260408120805483929061538890849061653d565b90915550505b6153998a8383615a57565b89545f906153b790600160801b90046001600160801b03168561679e565b9050805f03615505578286604001516001600160801b03166153d9919061679e565b602080880151516001600160a01b03165f908152908b905260408120805490919061540590849061653d565b909155505060608601516154239083906001600160801b031661679e565b6020808801518101516001600160a01b03165f908152908b905260408120805490919061545190849061653d565b925050819055506154938b8488604001516001600160801b0316615475919061679e565b8489606001516001600160801b031661548e919061679e565b615a57565b6154fc8b8b896040518060a001604052808b5f015181526020018b604001516001600160801b031681526020018b606001516001600160801b031681526020018b604001516001600160801b031681526020018b606001516001600160801b031681525061442a565b50505050611723565b5f8387604001516001600160801b031661551f919061679e565b90505f8388606001516001600160801b031661553b919061679e565b905061ffff87161580159061555c575060c08801516001600160a01b031615155b1561562a575f61271061557361ffff8a1685616894565b61557d91906168bf565b90505f61271061559161ffff8b1685616894565b61559b91906168bf565b905081156155d5576020808b0151516001600160a01b03165f908152908d90526040812080548492906155cf90849061653d565b90915550505b801561560f576020808b01518101516001600160a01b03165f908152908d905260408120805483929061560990849061653d565b90915550505b615619828561679e565b9350615625818461679e565b925050505b61563982600160801b85614b85565b8d6001015f82825461564b919061653d565b90915550615660905081600160801b85614b85565b8d6002015f828254615672919061653d565b925050819055506156c88d8d8b6040518060a001604052808d5f015181526020018d604001516001600160801b031681526020018d606001516001600160801b031681526020018a81526020018981525061442a565b50505050505050505050505050565b5f82131561573b575f8084600f0b126156f0575f6156fd565b83600f0b6156fd90616769565b9050816001600160801b031681111561117157604051630f569baf60e01b8152600481018290526001600160801b0383166024820152604401612012565b5f82121561132d575f8084600f0b13615754575f615759565b83600f0b5b9050816001600160801b031681101561117157604051636741d67d60e11b8152600481018290526001600160801b0383166024820152604401612012565b5f82600f0b12156158ff575f82600f0b6157b090616769565b604051632961046560e21b81526001600160a01b0386811660048301529192509086169063a5841194906024015f604051808303815f87803b1580156157f4575f80fd5b505af1158015615806573d5f803e3d5ffd5b505050506001600160a01b03841661588157846001600160a01b03166311da60b4826040518263ffffffff1660e01b815260040160206040518083038185885af1158015615856573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061587b9190616d7a565b506158f9565b6158966001600160a01b038516838784615ae8565b846001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156158d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158f79190616d7a565b505b50611171565b5f82600f0b131561117157604051630b0d9c0960e01b81526001600160a01b03848116600483015282811660248301526001600160801b0384166044830152851690630b0d9c09906064016146ad565b83545f90600160801b90046001600160801b0316816159958580615975576159756168ab565b836001600160801b0316886001600160801b031609600160801b87614b85565b846159b4576005880154600160801b90046001600160801b03166159c3565b60058801546001600160801b03165b6001600160801b03166159d6919061653d565b9050608081901c6159fa876001600160801b0316846001600160801b031688614b85565b615a04919061653d565b9250808415615a2f576005880180546001600160801b0319166001600160801b038316179055615a4c565b6005880180546001600160801b03808416600160801b0291161790555b505050949350505050565b8254600160801b90046001600160801b03165f819003615a775750505050565b8215615aad57615a9583600160801b836001600160801b0316614b85565b846003015f828254615aa7919061653d565b90915550505b811561117157615acb82600160801b836001600160801b0316614b85565b846004015f828254615add919061653d565b909155505050505050565b615af6848484846001615b1e565b61117157604051635274afe760e01b81526001600160a01b0385166004820152602401612012565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316615b7a578383151615615b6e573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146128a1575f80fd5b5f8060408385031215615bb0575f80fd5b8235615bbb81615b8b565b946020939093013593505050565b5f60208284031215615bd9575f80fd5b81356001600160e01b0319811681146110a5575f80fd5b5f805f60608486031215615c02575f80fd5b8335615c0d81615b8b565b95602085013595506040909401359392505050565b5f8083601f840112615c32575f80fd5b5081356001600160401b03811115615c48575f80fd5b6020830191508360208260051b8501011115614ca1575f80fd5b803561ffff81168114615c73575f80fd5b919050565b5f805f8060608587031215615c8b575f80fd5b84356001600160401b03811115615ca0575f80fd5b615cac87828801615c22565b9095509350615cbf905060208601615c62565b91506040850135615ccf81615b8b565b939692955090935050565b5f60208284031215615cea575f80fd5b81356001600160401b03811681146110a5575f80fd5b5f60208284031215615d10575f80fd5b5035919050565b80151581146128a1575f80fd5b5f8060408385031215615d35575f80fd5b823591506020830135615d4781615d17565b809150509250929050565b5f60208284031215615d62575f80fd5b81356110a581615b8b565b5f805f60408486031215615d7f575f80fd5b83356001600160401b03811115615d94575f80fd5b615da086828701615c22565b9094509250506020840135615db481615b8b565b809150509250925092565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101008101615e118287615dbf565b8460020b60a08301528360020b60c083015282151560e083015295945050505050565b5f60a08284031215615e44575f80fd5b50919050565b8060020b81146128a1575f80fd5b6001600160801b03811681146128a1575f80fd5b5f805f805f805f610160888a031215615e83575f80fd5b615e8d8989615e34565b965060a0880135615e9d81615e4a565b955060c0880135615ead81615e4a565b945060e0880135615ebd81615e58565b9350610100880135615ece81615e58565b9250610120880135615edf81615e58565b9699959850939692959194919350506101409091013590565b81516001600160801b0316815261014081016020830151615f2460208401826001600160801b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151615f6760c08401826001600160801b03169052565b5060e0830151615f8260e08401826001600160801b03169052565b50610100830151615f9f6101008401826001600160401b03169052565b50610120830151615fbc6101208401826001600160401b03169052565b5092915050565b62ffffff811681146128a1575f80fd5b5f805f806101008587031215615fe7575f80fd5b615ff18686615e34565b935060a085013561600181615fc3565b925060c085013561601181615fc3565b915060e0850135615ccf81615fc3565b5f805f805f6101208688031215616036575f80fd5b6160408787615e34565b945060a086013561605081615e4a565b935060c086013561606081615e4a565b925060e086013561607081615b8b565b915061607f6101008701615c62565b90509295509295909350565b5f806040838503121561609c575f80fd5b823591506020830135615d4781615b8b565b5f610120820190506001600160801b0383511682526001600160801b03602084015116602083015260408301516160f060408401826001600160801b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b5f8060408385031215616146575f80fd5b823561615181615b8b565b91506020830135615d4781615d17565b5f8083601f840112616171575f80fd5b5081356001600160401b03811115616187575f80fd5b602083019150836020828501011115614ca1575f80fd5b5f805f805f8587036101408112156161b4575f80fd5b86356161bf81615b8b565b95506161ce8860208901615e34565b9450606060bf19820112156161e1575f80fd5b5060c0860192506101208601356001600160401b03811115616201575f80fd5b61620d88828901616161565b969995985093965092949392505050565b5f805f60608486031215616230575f80fd5b833561623b81615b8b565b9250602084013561624b81615b8b565b929592945050506040919091013590565b5f805f806101008587031215616270575f80fd5b61627a8686615e34565b935060a085013561628a81615e4a565b925060c085013561629a81615e4a565b915060e0850135615ccf81615e58565b5f805f604084860312156162bc575f80fd5b8335925060208401356001600160401b038111156162d8575f80fd5b6162e486828701615c22565b9497909650939450505050565b5f805f60608486031215616303575f80fd5b83359250602084013561631581615fc3565b9150604084013564ffffffffff81168114615db4575f80fd5b5f806020838503121561633f575f80fd5b82356001600160401b03811115616354575f80fd5b61636085828601616161565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a5602083018461636c565b5f805f805f805f80610180898b0312156163c4575f80fd5b6163ce8a8a615e34565b975060a08901356163de81615e4a565b965060c08901356163ee81615e4a565b955060e08901356163fe81615e58565b945061010089013561640f81615b8b565b935061012089013561642081615e58565b925061014089013561643181615e58565b979a969950949793969295919450919261016001359150565b5f806040838503121561645b575f80fd5b823561646681615b8b565b91506020830135615d4781615b8b565b5f805f60e08486031215616488575f80fd5b833561649381615b8b565b92506164a28560208601615e34565b915060c0840135615db481615b8b565b5f805f606084860312156164c4575f80fd5b8335925060208401356164d681615e4a565b91506040840135615db481615e4a565b5f805f80608085870312156164f9575f80fd5b843561650481615b8b565b9350602085013561651481615b8b565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561101657611016616529565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561658657616586616550565b60405290565b60405160e081016001600160401b038111828210171561658657616586616550565b604051601f8201601f191681016001600160401b03811182821017156165d6576165d6616550565b604052919050565b5f60a08284031280156165ef575f80fd5b506165f8616564565b823561660381615b8b565b8152602083013561661381615b8b565b6020820152604083013561662681615fc3565b6040820152606083013561663981615e4a565b6060820152608083013561664c81615b8b565b60808201529392505050565b6001600160401b03818116838216019081111561101657611016616529565b6001600160801b03818116838216019081111561101657611016616529565b5f60608284031280156166a7575f80fd5b50604051606081016001600160401b03811182821017156166ca576166ca616550565b60405282356166d881615d17565b81526020838101359082015260408301356166f281615b8b565b60408201529392505050565b5f6020828403121561670e575f80fd5b81516110a581615d17565b6001600160801b03828116828216039081111561101657611016616529565b634e487b7160e01b5f52603260045260245ffd5b64ffffffffff818116838216019081111561101657611016616529565b5f600160ff1b820161677d5761677d616529565b505f0390565b5f60208284031215616793575f80fd5b81356110a581615fc3565b8181038181111561101657611016616529565b5f80858511156167bf575f80fd5b838611156167cb575f80fd5b5050820193919092039150565b80356001600160e01b03198116906004841015615fbc576001600160e01b031960049490940360031b84901b1690921692915050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8161685b5761685b616529565b505f190190565b5f6001820161687357616873616529565b5060010190565b61ffff828116828216039081111561101657611016616529565b808202811582820484141761101657611016616529565b634e487b7160e01b5f52601260045260245ffd5b5f826168d957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b038211156168f6576168f6616550565b50601f01601f191660200190565b5f8060408385031215616915575f80fd5b823560028110616923575f80fd5b915060208301356001600160401b0381111561693d575f80fd5b8301601f8101851361694d575f80fd5b803561696061695b826168de565b6165ae565b818152866020838501011115616974575f80fd5b816020840160208301375f602083830101528093505050509250929050565b634e487b7160e01b5f52602160045260245ffd5b8051615c7381615b8b565b5f60a08284031280156169c3575f80fd5b506169cc616564565b82516169d781615b8b565b815260208301516169e781615b8b565b60208201526040838101519082015260608084015190820152608083015161664c81615b8b565b5f60208284031215616a1e575f80fd5b81516110a581615b8b565b5f61016082019050616a3c828451615dbf565b602083015160020b60a0830152604083015160020b60c0830152606083015160e083015260018060a01b036080840151166101008301526001600160801b0360a08401511661012083015260c0830151615fbc6101408401826001600160801b03169052565b5f60028410616abf57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152612ee7604083018461636c565b5f60208284031215616ae6575f80fd5b81516001600160401b03811115616afb575f80fd5b8201601f81018413616b0b575f80fd5b8051616b1961695b826168de565b818152856020838501011115616b2d575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b8051615c7381615e4a565b8051615c7381615e58565b5f81830361016081128015616b73575f80fd5b50616b7c61658c565b60a0821215616b89575f80fd5b616b91616564565b91508351616b9e81615b8b565b82526020840151616bae81615b8b565b60208301526040840151616bc181615fc3565b60408301526060840151616bd481615e4a565b60608301526080840151616be781615b8b565b6080830152818152616bfb60a08501616b4a565b6020820152616c0c60c08501616b4a565b604082015260e0840151606082018190529150616c2c61010085016169a7565b6080820152616c3e6101208501616b55565b60a0820152616c506101408501616b55565b60c0820152949350505050565b616c678184615dbf565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f8060408385031215616cbf575f80fd5b505080516020909101519092909150565b5f60208284031215616ce0575f80fd5b81516001600160401b03811115616cf5575f80fd5b8201601f81018413616d05575f80fd5b80516001600160401b03811115616d1e57616d1e616550565b8060051b616d2e602082016165ae565b91825260208184018101929081019087841115616d49575f80fd5b6020850194505b83851015616d6f57845180835260209586019590935090910190616d50565b979650505050505050565b5f60208284031215616d8a575f80fd5b5051919050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff1981126f7fffffffffffffffffffffffffffffff821317156110165761101661652956fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac7288599b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081a000a","sourceMap":"3553:4264:41:-:0;;;5170:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5286:12;5300:10;5312:15;5286:12;5300:10;5312:15;5300:10;1145:31:0;5300:10:41;1145:13:0;:31::i;:::-;-1:-1:-1;3396:20:42::1;::::0;::::1;::::0;;:65:::1;;-1:-1:-1::0;1111:7:29::1;3420:41:42;::::0;::::1;;3396:65;3392:93;;;3470:15;;-1:-1:-1::0;;;3470:15:42::1;;;;;;;;;;;3392:93;3495:34;::::0;::::1;;::::0;-1:-1:-1;;;;;3539:26:42;::::1;;::::0;3575:72:::1;3620:4;3628:18;3553:4264:41::0;;;;;;;;-1:-1:-1;3553:4264:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2780:4:40;2749:35;;;3553:4264:41;;;2794:29:40;3553:4264:41;2641:189:40;3628:18:42::1;3575:29;:72::i;:::-;-1:-1:-1::0;;;;;;;;5347:28:41;::::1;::::0;-1:-1:-1;5343:54:41::1;::::0;-1:-1:-1;;5343:54:41::1;5384:13;;-1:-1:-1::0;;;5384:13:41::1;;;;;;;;;;;5343:54;-1:-1:-1::0;;;;;5407:12:41::1;;::::0;-1:-1:-1;3553:4264:41;;-1:-1:-1;;3553:4264:41;3759:149:0;3831:10;:25;;-1:-1:-1;;;;;;3831:25:0;-1:-1:-1;;;;;3831:25:0;;;;;;;;3871:30;;1076:51:46;;;3871:30:0;;1064:2:46;1049:18;3871:30:0;;;;;;;3759:149;:::o;3532:1599:28:-;3651:28;;:74;;1319:7;16441:29;;:34;;3651:74;;;:166;;-1:-1:-1;3745:27:28;;;;:72;;1382:7;16441:29;;:34;;3745:72;;3651:166;:265;;;-1:-1:-1;3837:30:28;;;;:79;;1450:7;16441:29;;:34;;3837:79;;3651:265;:362;;;-1:-1:-1;3936:29:28;;;;:77;;1516:7;16441:29;;:34;;3936:77;;3651:362;:467;;;-1:-1:-1;4033:33:28;;;;:85;;1587:6;16441:29;;:34;;4033:85;;3651:467;:570;;;-1:-1:-1;4138:32:28;;;;:83;;1655:6;16441:29;;:34;;4138:83;;3651:570;:652;;;-1:-1:-1;4241:22:28;;;;:62;;1713:6;16441:29;;:34;;4241:62;;3651:652;:732;;;-1:-1:-1;4323:21:28;;;;:60;;1769:6;16441:29;;:34;;4323:60;;3651:732;:818;;;-1:-1:-1;4403:24:28;;;;:66;;1829:6;16441:29;;:34;;4403:66;;3651:818;:902;;;-1:-1:-1;4489:23:28;;;;:64;;1887:6;16441:29;;:34;;4489:64;;3651:902;:1009;;;-1:-1:-1;4573:33:28;;;;:87;;1959:6;16441:29;;:34;;4573:87;;3651:1009;:1114;;;-1:-1:-1;4680:32:28;;;;:85;;2029:6;16441:29;;:34;;4680:85;;3651:1114;:1236;;;-1:-1:-1;4785:40:28;;;;:102;;2108:6;16441:29;;:34;;4785:102;;3651:1236;:1384;;;-1:-1:-1;4907:43:28;;;;:128;;2190:6;16441:29;;:34;;4907:128;;3651:1384;3634:1491;;;5060:54;-1:-1:-1;;;5108:4:28;5060:39;:54::i;:::-;3532:1599;;:::o;1009:257:25:-;1133:8;1130:1;1123:19;-1:-1:-1;;;;;1172:4:25;1168:53;1162:4;1155:67;1245:4;1242:1;1235:15;14:145:46;-1:-1:-1;;;;;103:31:46;;93:42;;83:70;;149:1;146;139:12;83:70;14:145;:::o;164:761::-;296:6;304;312;320;373:3;361:9;352:7;348:23;344:33;341:53;;;390:1;387;380:12;341:53;422:9;416:16;441:45;480:5;441:45;:::i;:::-;555:2;540:18;;534:25;505:5;;-1:-1:-1;568:47:46;534:25;568:47;:::i;:::-;686:2;671:18;;665:25;634:7;;-1:-1:-1;734:8:46;721:22;;709:35;;699:63;;758:1;755;748:12;699:63;833:2;818:18;;812:25;781:7;;-1:-1:-1;846:47:46;812:25;846:47;:::i;:::-;164:761;;;;-1:-1:-1;164:761:46;;-1:-1:-1;;164:761:46:o;930:203::-;3553:4264:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa164736f6c634300081a000a","offset":29228}},"transformations":[{"type":"insert","offset":29240,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951000000000000000000000000a362d98b33a7bb5b5e2180a05f995a70fb404f300000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73"}},"runtimeBytecode":{"onchainBytecode":"0x6080604052600436106103d6575f3560e01c80637e445230116101ff578063bdde80c611610113578063daf58566116100a8578063e74c37f711610078578063e74c37f714610f38578063f4314f1d14610f57578063f69ec15814610f9e578063f8c543ce14610fb3578063fe99049a14610fc7575f80fd5b8063daf5856614610ea8578063dc4c90d314610ec7578063dc98354e14610efa578063df848a9f14610f19575f80fd5b8063d0ba2baa116100e3578063d0ba2baa14610e25578063d5a2472414610e44578063d677eaad14610e74578063da748b1014610e93575f80fd5b8063bdde80c614610dac578063bf7e214f14610dcb578063bfcb418514610de7578063bfe1092814610e06575f80fd5b8063999d55fb11610194578063a6acaacc11610164578063a6acaacc14610cf1578063ab9e5bfd14610d05578063ae4a578514610d24578063b11dcb2314610d43578063b6363cf214610d73575f80fd5b8063999d55fb14610c565780639d1712c514610c6c578063a23e4db514610cb8578063a2ba1fc814610cd2575f80fd5b806391dd7346116101cf57806391dd734614610b75578063936852d414610ba1578063966af35a14610bd557806396f25d4214610c36575f80fd5b80637e44523014610af55780637fa7b6ac14610b0a5780638aebf0c114610b295780638fb3603714610b48575f80fd5b80634dc4b5c9116102f65780635ca344691161028b57806370233ddd1161025b57806370233ddd14610a585780637339254914610a835780637a526f4e14610a975780637a9e5e4b14610ab15780637c5e62d014610ad0575f80fd5b80635ca34469146109be5780635cd04cf8146109dd5780635f4934a814610a0d57806363cb7bdf14610a2c575f80fd5b8063558a7297116102c6578063558a729714610903578063575e24b414610922578063598af9e71461096c5780635c975abb146109a8575f80fd5b80634dc4b5c91461087a5780634e8d0048146108995780634eb5c4fd146108b857806351789ea2146108e4575f80fd5b806326f5ef521161036c5780633fc8cef31161033c5780633fc8cef3146106d4578063412b82c81461071f57806341b69b2a1461073e578063426a84931461085b575f80fd5b806326f5ef521461058f5780632e32a3b0146105ae57806336a9ca1a1461068e5780633c2f373f146106a1575f80fd5b8063113b9ac4116103a7578063113b9ac4146104e0578063136439dd1461051257806315452022146105315780632384b55414610564575f80fd5b8062fdd58e1461042a57806301ffc9a714610473578063095bcdb6146104a257806309974324146104c1575f80fd5b3661042657336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951161461042457604051632dc88d5b60e21b815260040160405180910390fd5b005b5f80fd5b348015610435575f80fd5b50610460610444366004615b9f565b600560209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561047e575f80fd5b5061049261048d366004615bc9565b610fe6565b604051901515815260200161046a565b3480156104ad575f80fd5b506104926104bc366004615bf0565b61101c565b3480156104cc575f80fd5b506104246104db366004615c78565b6110ac565b3480156104eb575f80fd5b506104ff6104fa366004615cda565b611177565b60405161ffff909116815260200161046a565b34801561051d575f80fd5b5061042461052c366004615d00565b6111a5565b34801561053c575f80fd5b5061055061054b366004615d24565b611246565b60405162ffffff909116815260200161046a565b34801561056f575f80fd5b5061046061057e366004615d52565b60146020525f908152604090205481565b34801561059a575f80fd5b506104246105a9366004615d6d565b611276565b3480156105b9575f80fd5b5061067e6105c8366004615d00565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152601060209081526040918290206003810154835160a08101855282546001600160a01b039081168252600184015480821695830195909552600160a01b850462ffffff1695820195909552600160b81b909304600290810b6060850152918201549093166080830152909282820b926301000000810490920b91600160301b900460ff1690565b60405161046a9493929190615e02565b61042461069c366004615e6c565b611332565b3480156106ac575f80fd5b506105507f0000000000000000000000000000000000000000000000000000000000004e2081565b3480156106df575f80fd5b506107077f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381565b6040516001600160a01b03909116815260200161046a565b34801561072a575f80fd5b50600a54610707906001600160a01b031681565b348015610749575f80fd5b5061084e610758366004615d00565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152505f9081526011602090815260409182902082516101408101845281546001600160801b038082168352600160801b918290048116948301949094526001830154948201949094526002820154606082015260038201546080820152600482015460a0820152600582015480841660c08301529390930490911660e0830152600601546001600160401b03808216610100840152600160401b9091041661012082015290565b60405161046a9190615ef8565b348015610866575f80fd5b50610492610875366004615bf0565b61172c565b348015610885575f80fd5b50610424610894366004615fd3565b6117a2565b3480156108a4575f80fd5b506104246108b3366004616021565b61187d565b3480156108c3575f80fd5b506108d76108d236600461608b565b611a75565b60405161046a91906160ae565b3480156108ef575f80fd5b506104246108fe366004615d00565b611b73565b34801561090e575f80fd5b5061049261091d366004616135565b611bf3565b34801561092d575f80fd5b5061094161093c36600461619e565b611c62565b604080516001600160e01b03199094168452602084019290925262ffffff169082015260600161046a565b348015610977575f80fd5b5061046061098636600461621e565b600660209081525f938452604080852082529284528284209052825290205481565b3480156109b3575f80fd5b50600e544210610492565b3480156109c9575f80fd5b506104246109d836600461625c565b611cf8565b3480156109e8575f80fd5b506105506109f7366004615d00565b60026020525f908152604090205462ffffff1681565b348015610a18575f80fd5b50610424610a27366004615d00565b611f91565b348015610a37575f80fd5b50610a426203f48081565b60405164ffffffffff909116815260200161046a565b348015610a63575f80fd5b50610460610a72366004615d52565b60136020525f908152604090205481565b348015610a8e575f80fd5b50600b54610460565b348015610aa2575f80fd5b506007546104ff9061ffff1681565b348015610abc575f80fd5b50610424610acb366004615d52565b611fe0565b348015610adb575f80fd5b50600754610707906201000090046001600160a01b031681565b348015610b00575f80fd5b506104ff61138881565b348015610b15575f80fd5b50610424610b243660046162aa565b61205d565b348015610b34575f80fd5b50610424610b433660046162f1565b6121f3565b348015610b53575f80fd5b50610b5c612368565b6040516001600160e01b0319909116815260200161046a565b348015610b80575f80fd5b50610b94610b8f36600461632e565b61238a565b60405161046a919061639a565b348015610bac575f80fd5b50610bc0610bbb366004615d00565b612448565b6040805192835260208301919091520161046a565b348015610be0575f80fd5b50610c15610bef366004615d00565b60036020525f908152604090205462ffffff8116906301000000900464ffffffffff1682565b6040805162ffffff909316835264ffffffffff90911660208301520161046a565b348015610c41575f80fd5b505f80516020616df18339815191525c610492565b348015610c61575f80fd5b5061046062093a8081565b348015610c77575f80fd5b50610ca0610c86366004615d00565b600d6020525f90815260409020546001600160401b031681565b6040516001600160401b03909116815260200161046a565b348015610cc3575f80fd5b50600c546104ff9061ffff1681565b348015610cdd575f80fd5b50610424610cec3660046163ac565b612517565b348015610cfc575f80fd5b50610550606481565b348015610d10575f80fd5b50610424610d1f366004615d52565b612865565b348015610d2f575f80fd5b50610424610d3e366004615d52565b6128a4565b348015610d4e575f80fd5b50610550610d5d366004615d00565b60016020525f908152604090205462ffffff1681565b348015610d7e575f80fd5b50610492610d8d36600461644a565b600460209081525f928352604080842090915290825290205460ff1681565b348015610db7575f80fd5b50610424610dc6366004615d52565b612a3e565b348015610dd6575f80fd5b505f546001600160a01b0316610707565b348015610df2575f80fd5b50600954610707906001600160a01b031681565b348015610e11575f80fd5b50600854610707906001600160a01b031681565b348015610e30575f80fd5b50610424610e3f366004615d6d565b612a72565b348015610e4f575f80fd5b50610550610e5e366004615d00565b5f9081526015602052604090205462ffffff1690565b348015610e7f575f80fd5b506104ff610e8e366004615d00565b612b10565b348015610e9e575f80fd5b50610460600e5481565b348015610eb3575f80fd5b50610424610ec236600461625c565b612b1a565b348015610ed2575f80fd5b506107077f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b348015610f05575f80fd5b50610b5c610f14366004616476565b612c93565b348015610f24575f80fd5b50610460610f333660046164b2565b612db1565b348015610f43575f80fd5b50600f54610707906001600160a01b031681565b348015610f62575f80fd5b50610f76610f71366004615d00565b612dfc565b6040805182516001600160401b0316815260209283015161ffff16928101929092520161046a565b348015610fa9575f80fd5b506104ff6107d081565b348015610fbe575f80fd5b50610460602081565b348015610fd2575f80fd5b50610492610fe13660046164e6565b612e5d565b5f6301ffc9a760e01b6001600160e01b0319831614806110165750630f632fb360e01b6001600160e01b03198316145b92915050565b5f611025612eef565b600e544210156110485760405163b359f26960e01b815260040160405180910390fd5b815f0361106857604051639811e0c760e01b815260040160405180910390fd5b611073338484612f13565b61107c83612f7c565b6110868333613092565b6110908385613092565b61109b8484846130d7565b90506110a561316f565b9392505050565b6110b8335b5f36613186565b6110c0612eef565b6110ca8484613275565b600854600c546110f091600b91859185916001600160a01b039091169061ffff166132e5565b600c805461ffff191661ffff928316179055600780549184166001600160b01b03199092168217620100006001600160a01b038516908102919091179091556040805192835260208301919091527f0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87910160405180910390a161117161316f565b50505050565b600754600c545f9161101691600b9185916001600160a01b03620100008304169161ffff908116911661345d565b6111ae336110b1565b8015806111bd575062093a8081115b156111db576040516316873e3160e11b815260040160405180910390fd5b5f6111e6824261653d565b9050600e54811161120a576040516316873e3160e11b815260040160405180910390fd5b600e8190556040518181527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df9219060200160405180910390a15050565b5f6110a583604051806060016040528085151581526020015f81526020015f6001600160a01b031681525061356c565b61127f336110b1565b611287612eef565b6112918383613275565b6008546001600160a01b03828116911614806112b557506001600160a01b03811630145b156112d3576040516343c829db60e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834906020015b60405180910390a161132d61316f565b505050565b61133a612eef565b600e5442101561135d5760405163b359f26960e01b815260040160405180910390fd5b836001600160801b03165f0361138657604051630200e8a960e31b815260040160405180910390fd5b804211156113a757604051631ab7da6b60e01b815260040160405180910390fd5b6113b087613642565b6113cd6113c06020890189615d52565b6001600160a01b03161590565b1561140157826001600160801b03163410156113fc57604051631841b4e160e01b815260040160405180910390fd5b611420565b341561142057604051631841b4e160e01b815260040160405180910390fd5b5f61144461143d611436368b90038b018b6165de565b60a0902090565b8888612db1565b5f81815260106020526040902060030154909150600160301b900460ff166115885760405180608001604052808980360381019061148291906165de565b8152600289810b60208084019190915289820b604080850191909152600160609485018190525f878152601084528290208651805182546001600160a01b03199081166001600160a01b0392831617845582870151948401805484880151858c01519785166001600160b81b031990921691909117600160a01b62ffffff928316021762ffffff60b81b1916600160b81b978216979097029690961790556080909201519683018054909216961695909517909455918501516003909301805491860151959094015192821665ffffffffffff1990911617630100000094909116939093029290921766ff0000000000001916600160301b921515929092029190911790555b61159181612f7c565b61159b8133613092565b5f818152601160205260409020546001600160801b0316158015611612575f8281526011602052604090206006018054600191906008906115ed908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5f82815260116020526040812080548892906116389084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506116703383886001600160801b03166136e5565b611688898989896001600160801b0316338a8a613757565b80156116bc576116bc601160107f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095185613774565b6040516001600160801b0387168152829033907f1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a9060200160405180910390a361170c6113c060208b018b615d52565b15611719576117196137ba565b505061172361316f565b50505050505050565b335f8181526006602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906117909087815260200190565b60405180910390a45060019392505050565b6117ab336110b1565b8262ffffff168262ffffff1610806117cc57508062ffffff168262ffffff16115b156117ea576040516306b7c75960e31b815260040160405180910390fd5b5f6117fd611436368790038701876165de565b5f818152601560205260409020805462ffffff191662ffffff8616179055905061182881858461382c565b6040805162ffffff8087168252808616602083015284169181019190915281907f0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5906060015b60405180910390a25050505050565b611885612eef565b600e544210156118a85760405163b359f26960e01b815260040160405180910390fd5b6118b185613642565b5f6118ce6118c7611436368990038901896165de565b8686612db1565b90508161ffff166118de826138f9565b61ffff1611156119015760405163663fffd960e01b815260040160405180910390fd5b5f8181526012602090815260408083203384528252808320600583528184208585529092529091205415801561194657508054600160801b90046001600160801b0316155b801561195d575060018101546001600160801b0316155b1561197b576040516312d37ee560e31b815260040160405180910390fd5b61198482612f7c565b61198e8233613092565b5f8281526012602090815260408083203384529091529020805460018201546001600160801b03600160801b90920482169116811580156119cd575080155b156119dc575050505050611a66565b6001830180546001600160801b031916905582546001600160801b03168355611a23611a0b60208c018c615d52565b611a1b60408d0160208e01615d52565b84848b613919565b6040805183815260208101839052869133917fd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77910160405180910390a350505050505b611a6e61316f565b5050505050565b611ad66040518061012001604052805f6001600160801b031681526020015f6001600160801b031681526020015f6001600160801b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b505f9182526012602090815260408084206001600160a01b039390931684529181529181902081516101208101835281546001600160801b038082168352600160801b9091048116948201949094526001820154909316918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e08301526007015461010082015290565b611b7c336110b1565b62093a80811115611ba0576040516316873e3160e11b815260040160405180910390fd5b8015611bb557611bb0814261653d565b611bb7565b5f5b600e8190556040519081527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f8080336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511614611cae5760405163570c108560e11b815260040160405180910390fd5b5f611cd8611cc4611436368b90038b018b6165de565b611cd3368a90038a018a616696565b61356c565b6315d7892d60e21b94505f93506240000017915050955095509592505050565b611d00612eef565b600e54421015611d235760405163b359f26960e01b815260040160405180910390fd5b806001600160801b03165f03611d4c57604051639811e0c760e01b815260040160405180910390fd5b611d5584613642565b600f546001600160a01b0316801580611de957506001600160a01b038116637f55485b611d8a611436368990038901896165de565b6040518263ffffffff1660e01b8152600401611da891815260200190565b602060405180830381865afa158015611dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de791906166fe565b155b15611e0757604051630ac6deb160e31b815260040160405180910390fd5b5f611e1d6118c7611436368990038901896165de565b9050611e2881612f7c565b611e328133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529220546001600160801b0380871692611e7492911690616719565b6001600160801b03161015611e9c57604051631a61620360e01b815260040160405180910390fd5b8054849082905f90611eb89084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316611f119190616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a86604051611f7e91906001600160801b0391909116815260200190565b60405180910390a350505061117161316f565b611f9a336110b1565b5f81815260036020526040808220805467ffffffffffffffff191690555182917fb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb91a250565b5f5433906001600160a01b0316811461201b5760405162d1953b60e31b81526001600160a01b03821660048201526024015b60405180910390fd5b816001600160a01b03163b5f03612050576040516361798f2f60e11b81526001600160a01b0383166004820152602401612012565b61205982613947565b5050565b612065612eef565b600f546001600160a01b03168061208f57604051634e3fb44d60e01b815260040160405180910390fd5b5f5b828110156121e9575f8484838181106120ac576120ac616738565b602090810292909201355f81815260119093526040832054909350600160801b90046001600160801b031690910390506120e657506121e1565b5f81815260106020908152604091829020825160a0808201855282546001600160a01b03908116835260018401548082168487015262ffffff600160a01b82041684880152600160b81b9004600290810b606085015290930154831660808301529020835163181e22b360e01b8152336004820152602481018b9052604481019190915292519086169263181e22b39260648083019391928290030181865afa158015612195573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b991906166fe565b6121d657604051630c8563b360e41b815260040160405180910390fd5b6121df81612f7c565b505b600101612091565b505061132d61316f565b6121fc336110b1565b5f8381526001602052604081205462ffffff169081900361223057604051636b271baf60e11b815260040160405180910390fd5b8062ffffff168362ffffff16111561225b5760405163329429f760e11b815260040160405180910390fd5b5f8481526002602052604090205462ffffff9081169084161015612292576040516310dd5b7f60e31b815260040160405180910390fd5b64ffffffffff821615806122af57506203f48064ffffffffff8316115b156122cd57604051631ee3453360e11b815260040160405180910390fd5b5f6122d8834261674c565b60408051808201825262ffffff87811680835264ffffffffff85811660208086018281525f8e81526003835288902096518754915190941663010000000267ffffffffffffffff1990911693909516929092179390931790935583519081529182015291925086917fcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04910161186e565b5f8054600160a01b900460ff1661237e57505f90565b50638fb3603760e01b90565b6060336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146123d55760405163570c108560e11b815260040160405180910390fd5b6040805160608101825260075461ffff8082168352600c541660208301526201000090046001600160a01b0316918101919091526110a590601190601090601390601490600d90600b907f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951908b8b613994565b5f8181526010602052604081206003810154829190600160301b900460ff1661247657505f93849350915050565b6040805160a0808201835283546001600160a01b03908116835260018501548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b606084015284015490921660808201522061250d907f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951906003840154600281810b9163010000009004900b613a54565b9250925050915091565b61251f612eef565b846001600160801b03165f0361254857604051630200e8a960e31b815260040160405180910390fd5b6001600160a01b03841661256f5760405163d92e233d60e01b815260040160405180910390fd5b8042111561259057604051631ab7da6b60e01b815260040160405180910390fd5b61259988613642565b5f6125b66125af611436368c90038c018c6165de565b8989612db1565b90506125c181612f7c565b6125cb8133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529083205490929161260e916001600160801b0390911690616719565b9050876001600160801b0316816001600160801b03161015612724575f612635828a616719565b8354909150819084905f906126549084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508060115f8681526020019081526020015f205f0160108282829054906101000a90046001600160801b03166126ad9190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b68360405161271a91906001600160801b0391909116815260200190565b60405180910390a3505b61273833848a6001600160801b0316613af0565b5f83815260116020526040812080548a929061275e9084906001600160801b0316616719565b82546101009290920a6001600160801b038181021990931691831602179091555f85815260116020526040812054909116900390506127f0575f8381526011602052604090206006018054600191906008906127cb908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b6128108b8b8b6128086001600160801b038d16616769565b8b8b8b613757565b6040516001600160801b0389168152839033907f07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a09060200160405180910390a350505061285b61316f565b5050505050505050565b61286d612eef565b600e544210156128905760405163b359f26960e01b815260040160405180910390fd5b61289981613b59565b6128a161316f565b50565b6128ad336110b1565b6001600160a01b038116156129f057806001600160a01b03163b5f036128e657604051638fadf87960e01b815260040160405180910390fd5b60405163181e22b360e01b81523060048201525f6024820181905260448201526001600160a01b0382169063181e22b390606401602060405180830381865afa925050508015612953575060408051601f3d908101601f19168201909252612950918101906166fe565b60015b61297057604051638fadf87960e01b815260040160405180910390fd5b50604051637f55485b60e01b81525f60048201526001600160a01b03821690637f55485b90602401602060405180830381865afa9250505080156129d1575060408051601f3d908101601f191682019092526129ce918101906166fe565b60015b6129ee57604051638fadf87960e01b815260040160405180910390fd5b505b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba90602001611be8565b612a46612eef565b600e54421015612a695760405163b359f26960e01b815260040160405180910390fd5b61289981613b9b565b612a7b336110b1565b612a83612eef565b612a8d8383613275565b600a54600754612ab29183916001600160a01b03918216916201000090910416613d9f565b600980546001600160a01b03199081166001600160a01b03938416179091556008805490911691831691821790556040519081527f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858869060200161131d565b5f611016826138f9565b612b22612eef565b806001600160801b03165f03612b4b57604051639811e0c760e01b815260040160405180910390fd5b612b5484613642565b5f612b71612b6a611436368890038801886165de565b8585612db1565b9050612b7c81612f7c565b612b868133613092565b5f8181526012602090815260408083203384529091528120805490918491839190612bbb9084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508260115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316612c149190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b685604051612c8191906001600160801b0391909116815260200190565b60405180910390a3505061117161316f565b5f336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511614612cdd5760405163570c108560e11b815260040160405180910390fd5b612d02612cf06060850160408601616783565b62ffffff1662ffffff16628000001490565b612d1f576040516309a90e8160e01b815260040160405180910390fd5b60015f612d34611436368790038701876165de565b815260208101919091526040015f9081205462ffffff169003612d6a57604051636b271baf60e11b815260040160405180910390fd5b612d7a6113c06020850185615d52565b8015612d8357505f5b15612da157604051630a7287b560e01b815260040160405180910390fd5b50636e4c1aa760e11b9392505050565b5f838383604051602001612ddc93929190928352600291820b6020840152900b604082015260600190565b60408051601f198184030181529190528051602090910120949350505050565b604080518082019091525f8082526020820152600b8281548110612e2257612e22616738565b5f918252602091829020604080518082019091529101546001600160401b0381168252600160401b900461ffff169181019190915292915050565b5f612e66612eef565b600e54421015612e895760405163b359f26960e01b815260040160405180910390fd5b815f03612ea957604051639811e0c760e01b815260040160405180910390fd5b612eb4858484612f13565b612ebd83612f7c565b612ec78386613092565b612ed18385613092565b612edd85858585613ee7565b9050612ee761316f565b949350505050565b612ef7614045565b612f1160015f80516020616df18339815191525b90614072565b565b5f8281526012602090815260408083206001600160a01b038716845282528083205460058352818420868552909252909120548291612f5d916001600160801b039091169061679e565b101561132d57604051631a61620360e01b815260040160405180910390fd5b5f8181526010602090815260409182902082516101208101845281546001600160a01b0390811660808301908152600184015480831660a0850152600160a01b810462ffffff1660c0850152600160b81b9004600290810b60e085015280850154909216610100840152825260039092015480830b938201939093526301000000830490910b92810192909252600160301b900460ff1615801560608301528061303a57505f828152601160205260409020546001600160801b0316155b156130715750600b545f918252600d6020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b612059815f0151826020015183604001515f306001600160801b0380614079565b5f828152601160209081526040808320601283528184206001600160a01b03861685528352818420600584528285208786529093529220546120599291908486614198565b335f90815260056020908152604080832085845290915281208054839190839061310290849061679e565b90915550506001600160a01b0384165f9081526005602090815260408083208684529091528120805484929061313990849061653d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020616dd18339815191529101611790565b612f115f5f80516020616df1833981519152612f0b565b5f806131b961319c5f546001600160a01b031690565b86306131ab60045f898b6167b1565b6131b4916167d8565b614398565b9150915081611a6e5763ffffffff811615613252575f805460ff60a01b198116600160a01b17909155604051634a63ebf760e11b81526001600160a01b03909116906394c7d7ee906132139088908890889060040161680e565b5f604051808303815f87803b15801561322a575f80fd5b505af115801561323c573d5f803e3d5ffd5b50505f805460ff60a01b1916905550611a6e9050565b60405162d1953b60e31b81526001600160a01b0386166004820152602401612012565b5f5b8181101561132d576132ae83838381811061329457613294616738565b90506020020160208101906132a99190615d52565b613b9b565b6132dd8383838181106132c3576132c3616738565b90506020020160208101906132d89190615d52565b613b59565b600101613277565b5f6107d061ffff8616111561330d5760405163af2eb37360e01b815260040160405180910390fd5b61ffff85161580159061332757506001600160a01b038416155b156133455760405163af2eb37360e01b815260040160405180910390fd5b306001600160a01b0385160361336e5760405163af2eb37360e01b815260040160405180910390fd5b6001600160a01b038416158015906133975750826001600160a01b0316846001600160a01b0316145b156133b55760405163af2eb37360e01b815260040160405180910390fd5b85545f6001600160a01b038616156133cd57866133cf565b5f5b604080518082019091526001600160401b03428116825261ffff80841660208085019182528d54600181018f555f8f8152919091209451940180549151909216600160401b0269ffffffffffffffffffff199091169390921692909217179055905081158061344557508361ffff168161ffff16105b61344f5783613451565b805b98975050505050505050565b5f846001600160401b03165f0361347557505f613563565b5f6001600160a01b0385161561348b578361348d565b5f5b90505f6134a460016001600160401b03891661679e565b88549091505f5b82821180156134ba5750602081105b15613531575f8a6134cc60018561679e565b815481106134dc576134dc616738565b5f918252602090912001805490915061ffff808716600160401b909204161015613510578054600160401b900461ffff1694505b8261351a8161684d565b935050818061352890616862565b925050506134ab565b8282036135445783945050505050613563565b8561ffff80861690821610613559578461355b565b805b955050505050505b95945050505050565b5f828152601560209081526040808320546003835281842082518084019093525462ffffff8082168452630100000090910464ffffffffff1693830184905216918291904210156136185780515f8781526002602052604081205462ffffff9283169450909116906127106135e36113888261687a565b6135f19061ffff1687616894565b6135fb91906168bf565b905080821015613609578091505b81841015613615578193505b50505b5f8681526001602052604090205462ffffff1680831115613637578092505b509095945050505050565b3061365360a0830160808401615d52565b6001600160a01b0316141580613690575060015f613679611436368590038501856165de565b815260208101919091526040015f205462ffffff16155b156136ae57604051636b271baf60e11b815260040160405180910390fd5b6136be6113c06020830183615d52565b80156136c757505f5b156128a157604051630a7287b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526005602090815260408083208584529091528120805483929061371790849061653d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020616dd183398151915291015b60405180910390a4505050565b611723613769368990038901896165de565b878787878787614079565b5f81815260208581526040808320868352818420825160a0810184528681529384018590529183018490526060830184905260808301939093526111719291859061442a565b475f8190036137c65750565b6040515f90339083908381818185875af1925050503d805f8114613805576040519150601f19603f3d011682016040523d82523d5f602084013e61380a565b606091505b505090508061205957604051633c31275160e21b815260040160405180910390fd5b62ffffff8116158061386757507f0000000000000000000000000000000000000000000000000000000000004e2062ffffff168162ffffff16115b156138855760405163a51d0c8160e01b815260040160405180910390fd5b606462ffffff831610806138a257508062ffffff168262ffffff16115b156138c05760405163a51d0c8160e01b815260040160405180910390fd5b5f928352600160209081526040808520805462ffffff1990811662ffffff95861617909155600290925290932080549093169116179055565b5f818152600d6020526040812054611016906001600160401b0316611177565b611a6e7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095186868686866144a9565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602001611be8565b60605f806139a484860186616904565b909250905060018260018111156139bd576139bd616993565b03613a21575f818060200190518101906139d791906169b2565b90506139f088825f0151836040015184608001516145e5565b613a08888260200151836060015184608001516145e5565b60405180602001604052805f8152509350505050613a46565b613a328d8d8d8d8d8d8d8d896146d6565b60405180602001604052805f815250925050505b9a9950505050505050505050565b5f805f80613a6288886148a6565b915091505f80613a738a8a8a61494f565b915091505f80613a848c8c8b61494f565b915091505f613a938d8d6149a4565b50509150508a60020b8160020b1215613ab55782850398508184039750613ae0565b8960020b8160020b12613ad15784830398508382039750613ae0565b82858803039850818487030397505b5050505050505094509492505050565b6001600160a01b0383165f90815260056020908152604080832085845290915281208054839290613b2290849061679e565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020616dd1833981519152910161374a565b6128a160147f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095183600760029054906101000a90046001600160a01b0316614a56565b6001600160a01b03811615613bb3576128a181614b07565b6001600160a01b0381165f9081526013602052604081205490819003613bd7575050565b6008546001600160a01b031680613bed57505050565b6001600160a01b0383165f908152601360205260408120819055613c39907f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095190859081908690306144a9565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015613c92575f80fd5b505af1158015613ca4573d5f803e3d5ffd5b50613ce09350506001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316915083905084614b50565b806001600160a01b0316836001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb884604051613d2591815260200190565b60405180910390a37f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316816001600160a01b03167fb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e84604051613d9291815260200190565b60405180910390a3505050565b5f6001600160a01b038416613db557505f6110a5565b826001600160a01b0316846001600160a01b031603613de7576040516343c829db60e01b815260040160405180910390fd5b816001600160a01b0316846001600160a01b031603613e19576040516343c829db60e01b815260040160405180910390fd5b306001600160a01b03851603613e42576040516343c829db60e01b815260040160405180910390fd5b836001600160a01b031663667d31686040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613e9c575060408051601f3d908101601f19168201909252613e9991810190616a0e565b60015b613eb95760405163281d5dd760e11b815260040160405180910390fd5b6001600160a01b038116613ee05760405163281d5dd760e11b815260040160405180910390fd5b90506110a5565b5f336001600160a01b03861614801590613f2457506001600160a01b0385165f90815260046020908152604080832033845290915290205460ff16155b15613f94576001600160a01b0385165f90815260066020908152604080832033845282528083208684529091529020545f198114613f9257613f66838261679e565b6001600160a01b0387165f90815260066020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260056020908152604080832086845290915281208054849290613fc690849061679e565b90915550506001600160a01b0384165f90815260056020908152604080832086845290915281208054849290613ffd90849061653d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020616dd1833981519152910160405180910390a4506001949350505050565b5f80516020616df18339815191525c15612f1157604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c894915f6040518060e001604052808b81526020018a60020b81526020018960020b8152602001888152602001876001600160a01b03168152602001866001600160801b03168152602001856001600160801b031681525060405160200161410d9190616a29565b60408051601f198184030181529082905261412b9291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401614156919061639a565b5f604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285b9190810190616ad6565b83545f906141af906001600160801b03168561679e565b90508015614278576141d981866002015488600101546141cf919061679e565b600160801b614b85565b855486906010906141fb908490600160801b90046001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061423781866003015488600201546141cf919061679e565b6001860180545f906142539084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6001860154600280870191909155860154600386015584546001600160801b03168015614375575f6142c1826001600160801b031688600401548a600301546141cf919061679e565b90505f6142e5836001600160801b031689600501548b600401546141cf919061679e565b9050811515806142f457508015155b156143725781886006015f82825461430c919061653d565b9250508190555080886007015f828254614326919061653d565b9091555050604080518381526020810183905286916001600160a01b038916917f7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d910160405180910390a35b50505b866003015486600401819055508660040154866005018190555050505050505050565b6040516001600160a01b038085166024830152831660448201526001600160e01b0319821660648201525f908190819060840160408051601f19818403018152918152602080830180516001600160e01b031663b700961360e01b1781525f808052918290528351939450919290918a5afa15614420575f516020805191945081901c150291505b5094509492505050565b600684018054600191905f9061444a9084906001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505f8061447a8585614c21565b915091506144a1835f0151846020015185604001518660600151876080015187878d614ca8565b505050505050565b821580156144b5575081155b6144a157856001600160a01b03166348c8949160016040518060a00160405280896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001856001600160a01b031681525060405160200161455a919081516001600160a01b0390811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b60408051601f19818403018152908290526145789291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016145a3919061639a565b5f604051808303815f875af11580156145be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190616ad6565b811561117157836001600160a01b031663f5298aca30614614866001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b15801561465e575f80fd5b505af1158015614670573d5f803e3d5ffd5b5050604051630b0d9c0960e01b81526001600160a01b03868116600483015284811660248301526044820186905287169250630b0d9c0991506064015b5f604051808303815f87803b1580156146c4575f80fd5b505af115801561285b573d5f803e3d5ffd5b5f818060200190518101906146eb9190616b60565b90505f80856001600160a01b0316635a6bcfda845f01516040518060800160405280876020015160020b8152602001876040015160020b8152602001876060015181526020015f801b8152506040518363ffffffff1660e01b8152600401614754929190616c5d565b60408051808303815f875af115801561476f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147939190616cae565b915091506148758c8c8c8c8c8c8c6040518060e001604052806147ba8d5f015160a0902090565b8d602001518e604001516040516020016147eb93929190928352600291820b6020840152900b604082015260600190565b604051602081830303815290604052805190602001205f1c81526020018c5f0151815260200161481b8b60801d90565b6001600160801b031681526020016148338b600f0b90565b600f0b6001600160801b031681526020018e5f015161ffff1681526020018e6020015161ffff1681526020018e604001516001600160a01b0316815250614d6c565b61489886845f01518484876080015188606001518960a001518a60c00151614e3d565b505050505050505050505050565b5f805f6148b284614ec0565b90505f6148c060018361653d565b604051631afeb18d60e11b815260048101829052600260248201529091505f906001600160a01b038816906335fd631a906044015b5f60405180830381865afa15801561490f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526149369190810190616cd0565b6020810151604090910151909890975095505050505050565b5f805f61495c8585614efc565b90505f6001600160a01b0387166335fd631a61497984600161653d565b60405160e083901b6001600160e01b03191681526004810191909152600260248201526044016148f5565b5f805f805f6149b286614ec0565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156149fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1e9190616d7a565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6001600160a01b038083165f908152602086905260409020549082161580614a7c575080155b15614a875750611171565b6001600160a01b0383165f908152602086905260408120819055614ab3908590859081908590876144a9565b816001600160a01b0316836001600160a01b03167f8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e080866483604051614af891815260200190565b60405180910390a35050505050565b600854600954600a546128a1926013927f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409519286926001600160a01b039081169281169116614f4f565b614b5d8383836001615031565b61132d57604051635274afe760e01b81526001600160a01b0384166004820152602401612012565b5f838302815f1985870982811083820303915050808411614ba4575f80fd5b805f03614bb6575082900490506110a5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6040805160a0808201835284546001600160a01b03908116835260018601548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b60608401528501549092166080820152205f908190614c9c9084906003870154600281810b9163010000009004900b613a54565b915091505b9250929050565b6003810154600482015482546006840154604080518c8152602081018c90529081018a905260608101899052608081019490945260a084019290925260c0830186905260e083018590526001600160801b03808216610100850152600160801b909104166101208301526001600160401b03808216610140840152600160401b9091041661016082015288907f9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309906101800160405180910390a25050505050505050565b80515f9081526020859052604081205460c0830151608084015160a0850151614da49388936001600160401b0390911692909161345d565b845483515f9081526020889052604090819020805467ffffffffffffffff19166001600160401b03909316929092179091558301519091506001600160801b0316158015614dfd575060608201516001600160801b0316155b15614e08575061285b565b81515f90815260208a8152604080832085518452918b9052909120614e3291908989878787615093565b505050505050505050565b5f614e488660801d90565b614e528860801d90565b614e5c9190616d91565b90505f614e6987600f0b90565b614e7389600f0b90565b614e7d9190616d91565b9050614e8a8286866156d7565b614e958186856156d7565b614ea48a8a5f01518489615797565b614eb48a8a602001518389615797565b50505050505050505050565b6040515f90614edf908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f80614f0784614ec0565b90505f614f1560048361653d565b60408051600287900b6020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6001600160a01b0384165f9081526020879052604081205490819003614f7557506144a1565b5f836001600160a01b0316866001600160a01b031614614f955784614f97565b825b90506001600160a01b038116614fae5750506144a1565b6001600160a01b0386165f908152602089905260408120819055614fda908890889081908690866144a9565b806001600160a01b0316866001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb88460405161501f91815260200190565b60405180910390a35050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661508757838315161561507b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60408201516001600160801b031615615126576020820151516040808401518151630ab714fb60e11b81523060048201526001600160a01b0393841660248201526001600160801b03909116604482015290519185169163156e29f6916064808201925f9290919082900301818387803b15801561510f575f80fd5b505af1158015615121573d5f803e3d5ffd5b505050505b60608201516001600160801b0316156151da57826001600160a01b031663156e29f63061516a8560200151602001516001600160a01b03166001600160a01b031690565b60608601516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526001600160801b031660448201526064015f604051808303815f87803b1580156151c3575f80fd5b505af11580156151d5573d5f803e3d5ffd5b505050505b86546001600160801b03165f8190036152f55782604001516001600160801b0316865f85602001515f01516001600160a01b03166001600160a01b031681526020019081526020015f205f828254615232919061653d565b9250508190555082606001516001600160801b0316865f8560200151602001516001600160a01b03166001600160a01b031681526020019081526020015f205f82825461527f919061653d565b925050819055506152ef8888866040518060a00160405280885f0151815260200188604001516001600160801b0316815260200188606001516001600160801b0316815260200188604001516001600160801b0316815260200188606001516001600160801b031681525061442a565b50611723565b5f61530789856040015184600161594f565b90505f61531a8a8660600151855f61594f565b9050811561535457602080860151516001600160a01b03165f9081529089905260408120805484929061534e90849061653d565b90915550505b801561538e576020808601518101516001600160a01b03165f9081529089905260408120805483929061538890849061653d565b90915550505b6153998a8383615a57565b89545f906153b790600160801b90046001600160801b03168561679e565b9050805f03615505578286604001516001600160801b03166153d9919061679e565b602080880151516001600160a01b03165f908152908b905260408120805490919061540590849061653d565b909155505060608601516154239083906001600160801b031661679e565b6020808801518101516001600160a01b03165f908152908b905260408120805490919061545190849061653d565b925050819055506154938b8488604001516001600160801b0316615475919061679e565b8489606001516001600160801b031661548e919061679e565b615a57565b6154fc8b8b896040518060a001604052808b5f015181526020018b604001516001600160801b031681526020018b606001516001600160801b031681526020018b604001516001600160801b031681526020018b606001516001600160801b031681525061442a565b50505050611723565b5f8387604001516001600160801b031661551f919061679e565b90505f8388606001516001600160801b031661553b919061679e565b905061ffff87161580159061555c575060c08801516001600160a01b031615155b1561562a575f61271061557361ffff8a1685616894565b61557d91906168bf565b90505f61271061559161ffff8b1685616894565b61559b91906168bf565b905081156155d5576020808b0151516001600160a01b03165f908152908d90526040812080548492906155cf90849061653d565b90915550505b801561560f576020808b01518101516001600160a01b03165f908152908d905260408120805483929061560990849061653d565b90915550505b615619828561679e565b9350615625818461679e565b925050505b61563982600160801b85614b85565b8d6001015f82825461564b919061653d565b90915550615660905081600160801b85614b85565b8d6002015f828254615672919061653d565b925050819055506156c88d8d8b6040518060a001604052808d5f015181526020018d604001516001600160801b031681526020018d606001516001600160801b031681526020018a81526020018981525061442a565b50505050505050505050505050565b5f82131561573b575f8084600f0b126156f0575f6156fd565b83600f0b6156fd90616769565b9050816001600160801b031681111561117157604051630f569baf60e01b8152600481018290526001600160801b0383166024820152604401612012565b5f82121561132d575f8084600f0b13615754575f615759565b83600f0b5b9050816001600160801b031681101561117157604051636741d67d60e11b8152600481018290526001600160801b0383166024820152604401612012565b5f82600f0b12156158ff575f82600f0b6157b090616769565b604051632961046560e21b81526001600160a01b0386811660048301529192509086169063a5841194906024015f604051808303815f87803b1580156157f4575f80fd5b505af1158015615806573d5f803e3d5ffd5b505050506001600160a01b03841661588157846001600160a01b03166311da60b4826040518263ffffffff1660e01b815260040160206040518083038185885af1158015615856573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061587b9190616d7a565b506158f9565b6158966001600160a01b038516838784615ae8565b846001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156158d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158f79190616d7a565b505b50611171565b5f82600f0b131561117157604051630b0d9c0960e01b81526001600160a01b03848116600483015282811660248301526001600160801b0384166044830152851690630b0d9c09906064016146ad565b83545f90600160801b90046001600160801b0316816159958580615975576159756168ab565b836001600160801b0316886001600160801b031609600160801b87614b85565b846159b4576005880154600160801b90046001600160801b03166159c3565b60058801546001600160801b03165b6001600160801b03166159d6919061653d565b9050608081901c6159fa876001600160801b0316846001600160801b031688614b85565b615a04919061653d565b9250808415615a2f576005880180546001600160801b0319166001600160801b038316179055615a4c565b6005880180546001600160801b03808416600160801b0291161790555b505050949350505050565b8254600160801b90046001600160801b03165f819003615a775750505050565b8215615aad57615a9583600160801b836001600160801b0316614b85565b846003015f828254615aa7919061653d565b90915550505b811561117157615acb82600160801b836001600160801b0316614b85565b846004015f828254615add919061653d565b909155505050505050565b615af6848484846001615b1e565b61117157604051635274afe760e01b81526001600160a01b0385166004820152602401612012565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316615b7a578383151615615b6e573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146128a1575f80fd5b5f8060408385031215615bb0575f80fd5b8235615bbb81615b8b565b946020939093013593505050565b5f60208284031215615bd9575f80fd5b81356001600160e01b0319811681146110a5575f80fd5b5f805f60608486031215615c02575f80fd5b8335615c0d81615b8b565b95602085013595506040909401359392505050565b5f8083601f840112615c32575f80fd5b5081356001600160401b03811115615c48575f80fd5b6020830191508360208260051b8501011115614ca1575f80fd5b803561ffff81168114615c73575f80fd5b919050565b5f805f8060608587031215615c8b575f80fd5b84356001600160401b03811115615ca0575f80fd5b615cac87828801615c22565b9095509350615cbf905060208601615c62565b91506040850135615ccf81615b8b565b939692955090935050565b5f60208284031215615cea575f80fd5b81356001600160401b03811681146110a5575f80fd5b5f60208284031215615d10575f80fd5b5035919050565b80151581146128a1575f80fd5b5f8060408385031215615d35575f80fd5b823591506020830135615d4781615d17565b809150509250929050565b5f60208284031215615d62575f80fd5b81356110a581615b8b565b5f805f60408486031215615d7f575f80fd5b83356001600160401b03811115615d94575f80fd5b615da086828701615c22565b9094509250506020840135615db481615b8b565b809150509250925092565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101008101615e118287615dbf565b8460020b60a08301528360020b60c083015282151560e083015295945050505050565b5f60a08284031215615e44575f80fd5b50919050565b8060020b81146128a1575f80fd5b6001600160801b03811681146128a1575f80fd5b5f805f805f805f610160888a031215615e83575f80fd5b615e8d8989615e34565b965060a0880135615e9d81615e4a565b955060c0880135615ead81615e4a565b945060e0880135615ebd81615e58565b9350610100880135615ece81615e58565b9250610120880135615edf81615e58565b9699959850939692959194919350506101409091013590565b81516001600160801b0316815261014081016020830151615f2460208401826001600160801b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151615f6760c08401826001600160801b03169052565b5060e0830151615f8260e08401826001600160801b03169052565b50610100830151615f9f6101008401826001600160401b03169052565b50610120830151615fbc6101208401826001600160401b03169052565b5092915050565b62ffffff811681146128a1575f80fd5b5f805f806101008587031215615fe7575f80fd5b615ff18686615e34565b935060a085013561600181615fc3565b925060c085013561601181615fc3565b915060e0850135615ccf81615fc3565b5f805f805f6101208688031215616036575f80fd5b6160408787615e34565b945060a086013561605081615e4a565b935060c086013561606081615e4a565b925060e086013561607081615b8b565b915061607f6101008701615c62565b90509295509295909350565b5f806040838503121561609c575f80fd5b823591506020830135615d4781615b8b565b5f610120820190506001600160801b0383511682526001600160801b03602084015116602083015260408301516160f060408401826001600160801b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b5f8060408385031215616146575f80fd5b823561615181615b8b565b91506020830135615d4781615d17565b5f8083601f840112616171575f80fd5b5081356001600160401b03811115616187575f80fd5b602083019150836020828501011115614ca1575f80fd5b5f805f805f8587036101408112156161b4575f80fd5b86356161bf81615b8b565b95506161ce8860208901615e34565b9450606060bf19820112156161e1575f80fd5b5060c0860192506101208601356001600160401b03811115616201575f80fd5b61620d88828901616161565b969995985093965092949392505050565b5f805f60608486031215616230575f80fd5b833561623b81615b8b565b9250602084013561624b81615b8b565b929592945050506040919091013590565b5f805f806101008587031215616270575f80fd5b61627a8686615e34565b935060a085013561628a81615e4a565b925060c085013561629a81615e4a565b915060e0850135615ccf81615e58565b5f805f604084860312156162bc575f80fd5b8335925060208401356001600160401b038111156162d8575f80fd5b6162e486828701615c22565b9497909650939450505050565b5f805f60608486031215616303575f80fd5b83359250602084013561631581615fc3565b9150604084013564ffffffffff81168114615db4575f80fd5b5f806020838503121561633f575f80fd5b82356001600160401b03811115616354575f80fd5b61636085828601616161565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a5602083018461636c565b5f805f805f805f80610180898b0312156163c4575f80fd5b6163ce8a8a615e34565b975060a08901356163de81615e4a565b965060c08901356163ee81615e4a565b955060e08901356163fe81615e58565b945061010089013561640f81615b8b565b935061012089013561642081615e58565b925061014089013561643181615e58565b979a969950949793969295919450919261016001359150565b5f806040838503121561645b575f80fd5b823561646681615b8b565b91506020830135615d4781615b8b565b5f805f60e08486031215616488575f80fd5b833561649381615b8b565b92506164a28560208601615e34565b915060c0840135615db481615b8b565b5f805f606084860312156164c4575f80fd5b8335925060208401356164d681615e4a565b91506040840135615db481615e4a565b5f805f80608085870312156164f9575f80fd5b843561650481615b8b565b9350602085013561651481615b8b565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561101657611016616529565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561658657616586616550565b60405290565b60405160e081016001600160401b038111828210171561658657616586616550565b604051601f8201601f191681016001600160401b03811182821017156165d6576165d6616550565b604052919050565b5f60a08284031280156165ef575f80fd5b506165f8616564565b823561660381615b8b565b8152602083013561661381615b8b565b6020820152604083013561662681615fc3565b6040820152606083013561663981615e4a565b6060820152608083013561664c81615b8b565b60808201529392505050565b6001600160401b03818116838216019081111561101657611016616529565b6001600160801b03818116838216019081111561101657611016616529565b5f60608284031280156166a7575f80fd5b50604051606081016001600160401b03811182821017156166ca576166ca616550565b60405282356166d881615d17565b81526020838101359082015260408301356166f281615b8b565b60408201529392505050565b5f6020828403121561670e575f80fd5b81516110a581615d17565b6001600160801b03828116828216039081111561101657611016616529565b634e487b7160e01b5f52603260045260245ffd5b64ffffffffff818116838216019081111561101657611016616529565b5f600160ff1b820161677d5761677d616529565b505f0390565b5f60208284031215616793575f80fd5b81356110a581615fc3565b8181038181111561101657611016616529565b5f80858511156167bf575f80fd5b838611156167cb575f80fd5b5050820193919092039150565b80356001600160e01b03198116906004841015615fbc576001600160e01b031960049490940360031b84901b1690921692915050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8161685b5761685b616529565b505f190190565b5f6001820161687357616873616529565b5060010190565b61ffff828116828216039081111561101657611016616529565b808202811582820484141761101657611016616529565b634e487b7160e01b5f52601260045260245ffd5b5f826168d957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b038211156168f6576168f6616550565b50601f01601f191660200190565b5f8060408385031215616915575f80fd5b823560028110616923575f80fd5b915060208301356001600160401b0381111561693d575f80fd5b8301601f8101851361694d575f80fd5b803561696061695b826168de565b6165ae565b818152866020838501011115616974575f80fd5b816020840160208301375f602083830101528093505050509250929050565b634e487b7160e01b5f52602160045260245ffd5b8051615c7381615b8b565b5f60a08284031280156169c3575f80fd5b506169cc616564565b82516169d781615b8b565b815260208301516169e781615b8b565b60208201526040838101519082015260608084015190820152608083015161664c81615b8b565b5f60208284031215616a1e575f80fd5b81516110a581615b8b565b5f61016082019050616a3c828451615dbf565b602083015160020b60a0830152604083015160020b60c0830152606083015160e083015260018060a01b036080840151166101008301526001600160801b0360a08401511661012083015260c0830151615fbc6101408401826001600160801b03169052565b5f60028410616abf57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152612ee7604083018461636c565b5f60208284031215616ae6575f80fd5b81516001600160401b03811115616afb575f80fd5b8201601f81018413616b0b575f80fd5b8051616b1961695b826168de565b818152856020838501011115616b2d575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b8051615c7381615e4a565b8051615c7381615e58565b5f81830361016081128015616b73575f80fd5b50616b7c61658c565b60a0821215616b89575f80fd5b616b91616564565b91508351616b9e81615b8b565b82526020840151616bae81615b8b565b60208301526040840151616bc181615fc3565b60408301526060840151616bd481615e4a565b60608301526080840151616be781615b8b565b6080830152818152616bfb60a08501616b4a565b6020820152616c0c60c08501616b4a565b604082015260e0840151606082018190529150616c2c61010085016169a7565b6080820152616c3e6101208501616b55565b60a0820152616c506101408501616b55565b60c0820152949350505050565b616c678184615dbf565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f8060408385031215616cbf575f80fd5b505080516020909101519092909150565b5f60208284031215616ce0575f80fd5b81516001600160401b03811115616cf5575f80fd5b8201601f81018413616d05575f80fd5b80516001600160401b03811115616d1e57616d1e616550565b8060051b616d2e602082016165ae565b91825260208184018101929081019087841115616d49575f80fd5b6020850194505b83851015616d6f57845180835260209586019590935090910190616d50565b979650505050505050565b5f60208284031215616d8a575f80fd5b5051919050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff1981126f7fffffffffffffffffffffffffffffff821317156110165761101661652956fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac7288599b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081a000a","recompiledBytecode":"0x6080604052600436106103d6575f3560e01c80637e445230116101ff578063bdde80c611610113578063daf58566116100a8578063e74c37f711610078578063e74c37f714610f38578063f4314f1d14610f57578063f69ec15814610f9e578063f8c543ce14610fb3578063fe99049a14610fc7575f80fd5b8063daf5856614610ea8578063dc4c90d314610ec7578063dc98354e14610efa578063df848a9f14610f19575f80fd5b8063d0ba2baa116100e3578063d0ba2baa14610e25578063d5a2472414610e44578063d677eaad14610e74578063da748b1014610e93575f80fd5b8063bdde80c614610dac578063bf7e214f14610dcb578063bfcb418514610de7578063bfe1092814610e06575f80fd5b8063999d55fb11610194578063a6acaacc11610164578063a6acaacc14610cf1578063ab9e5bfd14610d05578063ae4a578514610d24578063b11dcb2314610d43578063b6363cf214610d73575f80fd5b8063999d55fb14610c565780639d1712c514610c6c578063a23e4db514610cb8578063a2ba1fc814610cd2575f80fd5b806391dd7346116101cf57806391dd734614610b75578063936852d414610ba1578063966af35a14610bd557806396f25d4214610c36575f80fd5b80637e44523014610af55780637fa7b6ac14610b0a5780638aebf0c114610b295780638fb3603714610b48575f80fd5b80634dc4b5c9116102f65780635ca344691161028b57806370233ddd1161025b57806370233ddd14610a585780637339254914610a835780637a526f4e14610a975780637a9e5e4b14610ab15780637c5e62d014610ad0575f80fd5b80635ca34469146109be5780635cd04cf8146109dd5780635f4934a814610a0d57806363cb7bdf14610a2c575f80fd5b8063558a7297116102c6578063558a729714610903578063575e24b414610922578063598af9e71461096c5780635c975abb146109a8575f80fd5b80634dc4b5c91461087a5780634e8d0048146108995780634eb5c4fd146108b857806351789ea2146108e4575f80fd5b806326f5ef521161036c5780633fc8cef31161033c5780633fc8cef3146106d4578063412b82c81461071f57806341b69b2a1461073e578063426a84931461085b575f80fd5b806326f5ef521461058f5780632e32a3b0146105ae57806336a9ca1a1461068e5780633c2f373f146106a1575f80fd5b8063113b9ac4116103a7578063113b9ac4146104e0578063136439dd1461051257806315452022146105315780632384b55414610564575f80fd5b8062fdd58e1461042a57806301ffc9a714610473578063095bcdb6146104a257806309974324146104c1575f80fd5b3661042657336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042457604051632dc88d5b60e21b815260040160405180910390fd5b005b5f80fd5b348015610435575f80fd5b50610460610444366004615b9f565b600560209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561047e575f80fd5b5061049261048d366004615bc9565b610fe6565b604051901515815260200161046a565b3480156104ad575f80fd5b506104926104bc366004615bf0565b61101c565b3480156104cc575f80fd5b506104246104db366004615c78565b6110ac565b3480156104eb575f80fd5b506104ff6104fa366004615cda565b611177565b60405161ffff909116815260200161046a565b34801561051d575f80fd5b5061042461052c366004615d00565b6111a5565b34801561053c575f80fd5b5061055061054b366004615d24565b611246565b60405162ffffff909116815260200161046a565b34801561056f575f80fd5b5061046061057e366004615d52565b60146020525f908152604090205481565b34801561059a575f80fd5b506104246105a9366004615d6d565b611276565b3480156105b9575f80fd5b5061067e6105c8366004615d00565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152601060209081526040918290206003810154835160a08101855282546001600160a01b039081168252600184015480821695830195909552600160a01b850462ffffff1695820195909552600160b81b909304600290810b6060850152918201549093166080830152909282820b926301000000810490920b91600160301b900460ff1690565b60405161046a9493929190615e02565b61042461069c366004615e6c565b611332565b3480156106ac575f80fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b3480156106df575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161046a565b34801561072a575f80fd5b50600a54610707906001600160a01b031681565b348015610749575f80fd5b5061084e610758366004615d00565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152505f9081526011602090815260409182902082516101408101845281546001600160801b038082168352600160801b918290048116948301949094526001830154948201949094526002820154606082015260038201546080820152600482015460a0820152600582015480841660c08301529390930490911660e0830152600601546001600160401b03808216610100840152600160401b9091041661012082015290565b60405161046a9190615ef8565b348015610866575f80fd5b50610492610875366004615bf0565b61172c565b348015610885575f80fd5b50610424610894366004615fd3565b6117a2565b3480156108a4575f80fd5b506104246108b3366004616021565b61187d565b3480156108c3575f80fd5b506108d76108d236600461608b565b611a75565b60405161046a91906160ae565b3480156108ef575f80fd5b506104246108fe366004615d00565b611b73565b34801561090e575f80fd5b5061049261091d366004616135565b611bf3565b34801561092d575f80fd5b5061094161093c36600461619e565b611c62565b604080516001600160e01b03199094168452602084019290925262ffffff169082015260600161046a565b348015610977575f80fd5b5061046061098636600461621e565b600660209081525f938452604080852082529284528284209052825290205481565b3480156109b3575f80fd5b50600e544210610492565b3480156109c9575f80fd5b506104246109d836600461625c565b611cf8565b3480156109e8575f80fd5b506105506109f7366004615d00565b60026020525f908152604090205462ffffff1681565b348015610a18575f80fd5b50610424610a27366004615d00565b611f91565b348015610a37575f80fd5b50610a426203f48081565b60405164ffffffffff909116815260200161046a565b348015610a63575f80fd5b50610460610a72366004615d52565b60136020525f908152604090205481565b348015610a8e575f80fd5b50600b54610460565b348015610aa2575f80fd5b506007546104ff9061ffff1681565b348015610abc575f80fd5b50610424610acb366004615d52565b611fe0565b348015610adb575f80fd5b50600754610707906201000090046001600160a01b031681565b348015610b00575f80fd5b506104ff61138881565b348015610b15575f80fd5b50610424610b243660046162aa565b61205d565b348015610b34575f80fd5b50610424610b433660046162f1565b6121f3565b348015610b53575f80fd5b50610b5c612368565b6040516001600160e01b0319909116815260200161046a565b348015610b80575f80fd5b50610b94610b8f36600461632e565b61238a565b60405161046a919061639a565b348015610bac575f80fd5b50610bc0610bbb366004615d00565b612448565b6040805192835260208301919091520161046a565b348015610be0575f80fd5b50610c15610bef366004615d00565b60036020525f908152604090205462ffffff8116906301000000900464ffffffffff1682565b6040805162ffffff909316835264ffffffffff90911660208301520161046a565b348015610c41575f80fd5b505f80516020616df18339815191525c610492565b348015610c61575f80fd5b5061046062093a8081565b348015610c77575f80fd5b50610ca0610c86366004615d00565b600d6020525f90815260409020546001600160401b031681565b6040516001600160401b03909116815260200161046a565b348015610cc3575f80fd5b50600c546104ff9061ffff1681565b348015610cdd575f80fd5b50610424610cec3660046163ac565b612517565b348015610cfc575f80fd5b50610550606481565b348015610d10575f80fd5b50610424610d1f366004615d52565b612865565b348015610d2f575f80fd5b50610424610d3e366004615d52565b6128a4565b348015610d4e575f80fd5b50610550610d5d366004615d00565b60016020525f908152604090205462ffffff1681565b348015610d7e575f80fd5b50610492610d8d36600461644a565b600460209081525f928352604080842090915290825290205460ff1681565b348015610db7575f80fd5b50610424610dc6366004615d52565b612a3e565b348015610dd6575f80fd5b505f546001600160a01b0316610707565b348015610df2575f80fd5b50600954610707906001600160a01b031681565b348015610e11575f80fd5b50600854610707906001600160a01b031681565b348015610e30575f80fd5b50610424610e3f366004615d6d565b612a72565b348015610e4f575f80fd5b50610550610e5e366004615d00565b5f9081526015602052604090205462ffffff1690565b348015610e7f575f80fd5b506104ff610e8e366004615d00565b612b10565b348015610e9e575f80fd5b50610460600e5481565b348015610eb3575f80fd5b50610424610ec236600461625c565b612b1a565b348015610ed2575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b348015610f05575f80fd5b50610b5c610f14366004616476565b612c93565b348015610f24575f80fd5b50610460610f333660046164b2565b612db1565b348015610f43575f80fd5b50600f54610707906001600160a01b031681565b348015610f62575f80fd5b50610f76610f71366004615d00565b612dfc565b6040805182516001600160401b0316815260209283015161ffff16928101929092520161046a565b348015610fa9575f80fd5b506104ff6107d081565b348015610fbe575f80fd5b50610460602081565b348015610fd2575f80fd5b50610492610fe13660046164e6565b612e5d565b5f6301ffc9a760e01b6001600160e01b0319831614806110165750630f632fb360e01b6001600160e01b03198316145b92915050565b5f611025612eef565b600e544210156110485760405163b359f26960e01b815260040160405180910390fd5b815f0361106857604051639811e0c760e01b815260040160405180910390fd5b611073338484612f13565b61107c83612f7c565b6110868333613092565b6110908385613092565b61109b8484846130d7565b90506110a561316f565b9392505050565b6110b8335b5f36613186565b6110c0612eef565b6110ca8484613275565b600854600c546110f091600b91859185916001600160a01b039091169061ffff166132e5565b600c805461ffff191661ffff928316179055600780549184166001600160b01b03199092168217620100006001600160a01b038516908102919091179091556040805192835260208301919091527f0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87910160405180910390a161117161316f565b50505050565b600754600c545f9161101691600b9185916001600160a01b03620100008304169161ffff908116911661345d565b6111ae336110b1565b8015806111bd575062093a8081115b156111db576040516316873e3160e11b815260040160405180910390fd5b5f6111e6824261653d565b9050600e54811161120a576040516316873e3160e11b815260040160405180910390fd5b600e8190556040518181527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df9219060200160405180910390a15050565b5f6110a583604051806060016040528085151581526020015f81526020015f6001600160a01b031681525061356c565b61127f336110b1565b611287612eef565b6112918383613275565b6008546001600160a01b03828116911614806112b557506001600160a01b03811630145b156112d3576040516343c829db60e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834906020015b60405180910390a161132d61316f565b505050565b61133a612eef565b600e5442101561135d5760405163b359f26960e01b815260040160405180910390fd5b836001600160801b03165f0361138657604051630200e8a960e31b815260040160405180910390fd5b804211156113a757604051631ab7da6b60e01b815260040160405180910390fd5b6113b087613642565b6113cd6113c06020890189615d52565b6001600160a01b03161590565b1561140157826001600160801b03163410156113fc57604051631841b4e160e01b815260040160405180910390fd5b611420565b341561142057604051631841b4e160e01b815260040160405180910390fd5b5f61144461143d611436368b90038b018b6165de565b60a0902090565b8888612db1565b5f81815260106020526040902060030154909150600160301b900460ff166115885760405180608001604052808980360381019061148291906165de565b8152600289810b60208084019190915289820b604080850191909152600160609485018190525f878152601084528290208651805182546001600160a01b03199081166001600160a01b0392831617845582870151948401805484880151858c01519785166001600160b81b031990921691909117600160a01b62ffffff928316021762ffffff60b81b1916600160b81b978216979097029690961790556080909201519683018054909216961695909517909455918501516003909301805491860151959094015192821665ffffffffffff1990911617630100000094909116939093029290921766ff0000000000001916600160301b921515929092029190911790555b61159181612f7c565b61159b8133613092565b5f818152601160205260409020546001600160801b0316158015611612575f8281526011602052604090206006018054600191906008906115ed908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5f82815260116020526040812080548892906116389084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506116703383886001600160801b03166136e5565b611688898989896001600160801b0316338a8a613757565b80156116bc576116bc601160107f000000000000000000000000000000000000000000000000000000000000000085613774565b6040516001600160801b0387168152829033907f1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a9060200160405180910390a361170c6113c060208b018b615d52565b15611719576117196137ba565b505061172361316f565b50505050505050565b335f8181526006602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906117909087815260200190565b60405180910390a45060019392505050565b6117ab336110b1565b8262ffffff168262ffffff1610806117cc57508062ffffff168262ffffff16115b156117ea576040516306b7c75960e31b815260040160405180910390fd5b5f6117fd611436368790038701876165de565b5f818152601560205260409020805462ffffff191662ffffff8616179055905061182881858461382c565b6040805162ffffff8087168252808616602083015284169181019190915281907f0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5906060015b60405180910390a25050505050565b611885612eef565b600e544210156118a85760405163b359f26960e01b815260040160405180910390fd5b6118b185613642565b5f6118ce6118c7611436368990038901896165de565b8686612db1565b90508161ffff166118de826138f9565b61ffff1611156119015760405163663fffd960e01b815260040160405180910390fd5b5f8181526012602090815260408083203384528252808320600583528184208585529092529091205415801561194657508054600160801b90046001600160801b0316155b801561195d575060018101546001600160801b0316155b1561197b576040516312d37ee560e31b815260040160405180910390fd5b61198482612f7c565b61198e8233613092565b5f8281526012602090815260408083203384529091529020805460018201546001600160801b03600160801b90920482169116811580156119cd575080155b156119dc575050505050611a66565b6001830180546001600160801b031916905582546001600160801b03168355611a23611a0b60208c018c615d52565b611a1b60408d0160208e01615d52565b84848b613919565b6040805183815260208101839052869133917fd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77910160405180910390a350505050505b611a6e61316f565b5050505050565b611ad66040518061012001604052805f6001600160801b031681526020015f6001600160801b031681526020015f6001600160801b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b505f9182526012602090815260408084206001600160a01b039390931684529181529181902081516101208101835281546001600160801b038082168352600160801b9091048116948201949094526001820154909316918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e08301526007015461010082015290565b611b7c336110b1565b62093a80811115611ba0576040516316873e3160e11b815260040160405180910390fd5b8015611bb557611bb0814261653d565b611bb7565b5f5b600e8190556040519081527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f8080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611cae5760405163570c108560e11b815260040160405180910390fd5b5f611cd8611cc4611436368b90038b018b6165de565b611cd3368a90038a018a616696565b61356c565b6315d7892d60e21b94505f93506240000017915050955095509592505050565b611d00612eef565b600e54421015611d235760405163b359f26960e01b815260040160405180910390fd5b806001600160801b03165f03611d4c57604051639811e0c760e01b815260040160405180910390fd5b611d5584613642565b600f546001600160a01b0316801580611de957506001600160a01b038116637f55485b611d8a611436368990038901896165de565b6040518263ffffffff1660e01b8152600401611da891815260200190565b602060405180830381865afa158015611dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de791906166fe565b155b15611e0757604051630ac6deb160e31b815260040160405180910390fd5b5f611e1d6118c7611436368990038901896165de565b9050611e2881612f7c565b611e328133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529220546001600160801b0380871692611e7492911690616719565b6001600160801b03161015611e9c57604051631a61620360e01b815260040160405180910390fd5b8054849082905f90611eb89084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316611f119190616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a86604051611f7e91906001600160801b0391909116815260200190565b60405180910390a350505061117161316f565b611f9a336110b1565b5f81815260036020526040808220805467ffffffffffffffff191690555182917fb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb91a250565b5f5433906001600160a01b0316811461201b5760405162d1953b60e31b81526001600160a01b03821660048201526024015b60405180910390fd5b816001600160a01b03163b5f03612050576040516361798f2f60e11b81526001600160a01b0383166004820152602401612012565b61205982613947565b5050565b612065612eef565b600f546001600160a01b03168061208f57604051634e3fb44d60e01b815260040160405180910390fd5b5f5b828110156121e9575f8484838181106120ac576120ac616738565b602090810292909201355f81815260119093526040832054909350600160801b90046001600160801b031690910390506120e657506121e1565b5f81815260106020908152604091829020825160a0808201855282546001600160a01b03908116835260018401548082168487015262ffffff600160a01b82041684880152600160b81b9004600290810b606085015290930154831660808301529020835163181e22b360e01b8152336004820152602481018b9052604481019190915292519086169263181e22b39260648083019391928290030181865afa158015612195573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b991906166fe565b6121d657604051630c8563b360e41b815260040160405180910390fd5b6121df81612f7c565b505b600101612091565b505061132d61316f565b6121fc336110b1565b5f8381526001602052604081205462ffffff169081900361223057604051636b271baf60e11b815260040160405180910390fd5b8062ffffff168362ffffff16111561225b5760405163329429f760e11b815260040160405180910390fd5b5f8481526002602052604090205462ffffff9081169084161015612292576040516310dd5b7f60e31b815260040160405180910390fd5b64ffffffffff821615806122af57506203f48064ffffffffff8316115b156122cd57604051631ee3453360e11b815260040160405180910390fd5b5f6122d8834261674c565b60408051808201825262ffffff87811680835264ffffffffff85811660208086018281525f8e81526003835288902096518754915190941663010000000267ffffffffffffffff1990911693909516929092179390931790935583519081529182015291925086917fcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04910161186e565b5f8054600160a01b900460ff1661237e57505f90565b50638fb3603760e01b90565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123d55760405163570c108560e11b815260040160405180910390fd5b6040805160608101825260075461ffff8082168352600c541660208301526201000090046001600160a01b0316918101919091526110a590601190601090601390601490600d90600b907f0000000000000000000000000000000000000000000000000000000000000000908b8b613994565b5f8181526010602052604081206003810154829190600160301b900460ff1661247657505f93849350915050565b6040805160a0808201835283546001600160a01b03908116835260018501548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b606084015284015490921660808201522061250d907f0000000000000000000000000000000000000000000000000000000000000000906003840154600281810b9163010000009004900b613a54565b9250925050915091565b61251f612eef565b846001600160801b03165f0361254857604051630200e8a960e31b815260040160405180910390fd5b6001600160a01b03841661256f5760405163d92e233d60e01b815260040160405180910390fd5b8042111561259057604051631ab7da6b60e01b815260040160405180910390fd5b61259988613642565b5f6125b66125af611436368c90038c018c6165de565b8989612db1565b90506125c181612f7c565b6125cb8133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529083205490929161260e916001600160801b0390911690616719565b9050876001600160801b0316816001600160801b03161015612724575f612635828a616719565b8354909150819084905f906126549084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508060115f8681526020019081526020015f205f0160108282829054906101000a90046001600160801b03166126ad9190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b68360405161271a91906001600160801b0391909116815260200190565b60405180910390a3505b61273833848a6001600160801b0316613af0565b5f83815260116020526040812080548a929061275e9084906001600160801b0316616719565b82546101009290920a6001600160801b038181021990931691831602179091555f85815260116020526040812054909116900390506127f0575f8381526011602052604090206006018054600191906008906127cb908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b6128108b8b8b6128086001600160801b038d16616769565b8b8b8b613757565b6040516001600160801b0389168152839033907f07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a09060200160405180910390a350505061285b61316f565b5050505050505050565b61286d612eef565b600e544210156128905760405163b359f26960e01b815260040160405180910390fd5b61289981613b59565b6128a161316f565b50565b6128ad336110b1565b6001600160a01b038116156129f057806001600160a01b03163b5f036128e657604051638fadf87960e01b815260040160405180910390fd5b60405163181e22b360e01b81523060048201525f6024820181905260448201526001600160a01b0382169063181e22b390606401602060405180830381865afa925050508015612953575060408051601f3d908101601f19168201909252612950918101906166fe565b60015b61297057604051638fadf87960e01b815260040160405180910390fd5b50604051637f55485b60e01b81525f60048201526001600160a01b03821690637f55485b90602401602060405180830381865afa9250505080156129d1575060408051601f3d908101601f191682019092526129ce918101906166fe565b60015b6129ee57604051638fadf87960e01b815260040160405180910390fd5b505b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba90602001611be8565b612a46612eef565b600e54421015612a695760405163b359f26960e01b815260040160405180910390fd5b61289981613b9b565b612a7b336110b1565b612a83612eef565b612a8d8383613275565b600a54600754612ab29183916001600160a01b03918216916201000090910416613d9f565b600980546001600160a01b03199081166001600160a01b03938416179091556008805490911691831691821790556040519081527f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858869060200161131d565b5f611016826138f9565b612b22612eef565b806001600160801b03165f03612b4b57604051639811e0c760e01b815260040160405180910390fd5b612b5484613642565b5f612b71612b6a611436368890038801886165de565b8585612db1565b9050612b7c81612f7c565b612b868133613092565b5f8181526012602090815260408083203384529091528120805490918491839190612bbb9084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508260115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316612c149190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b685604051612c8191906001600160801b0391909116815260200190565b60405180910390a3505061117161316f565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cdd5760405163570c108560e11b815260040160405180910390fd5b612d02612cf06060850160408601616783565b62ffffff1662ffffff16628000001490565b612d1f576040516309a90e8160e01b815260040160405180910390fd5b60015f612d34611436368790038701876165de565b815260208101919091526040015f9081205462ffffff169003612d6a57604051636b271baf60e11b815260040160405180910390fd5b612d7a6113c06020850185615d52565b8015612d8357505f5b15612da157604051630a7287b560e01b815260040160405180910390fd5b50636e4c1aa760e11b9392505050565b5f838383604051602001612ddc93929190928352600291820b6020840152900b604082015260600190565b60408051601f198184030181529190528051602090910120949350505050565b604080518082019091525f8082526020820152600b8281548110612e2257612e22616738565b5f918252602091829020604080518082019091529101546001600160401b0381168252600160401b900461ffff169181019190915292915050565b5f612e66612eef565b600e54421015612e895760405163b359f26960e01b815260040160405180910390fd5b815f03612ea957604051639811e0c760e01b815260040160405180910390fd5b612eb4858484612f13565b612ebd83612f7c565b612ec78386613092565b612ed18385613092565b612edd85858585613ee7565b9050612ee761316f565b949350505050565b612ef7614045565b612f1160015f80516020616df18339815191525b90614072565b565b5f8281526012602090815260408083206001600160a01b038716845282528083205460058352818420868552909252909120548291612f5d916001600160801b039091169061679e565b101561132d57604051631a61620360e01b815260040160405180910390fd5b5f8181526010602090815260409182902082516101208101845281546001600160a01b0390811660808301908152600184015480831660a0850152600160a01b810462ffffff1660c0850152600160b81b9004600290810b60e085015280850154909216610100840152825260039092015480830b938201939093526301000000830490910b92810192909252600160301b900460ff1615801560608301528061303a57505f828152601160205260409020546001600160801b0316155b156130715750600b545f918252600d6020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b612059815f0151826020015183604001515f306001600160801b0380614079565b5f828152601160209081526040808320601283528184206001600160a01b03861685528352818420600584528285208786529093529220546120599291908486614198565b335f90815260056020908152604080832085845290915281208054839190839061310290849061679e565b90915550506001600160a01b0384165f9081526005602090815260408083208684529091528120805484929061313990849061653d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020616dd18339815191529101611790565b612f115f5f80516020616df1833981519152612f0b565b5f806131b961319c5f546001600160a01b031690565b86306131ab60045f898b6167b1565b6131b4916167d8565b614398565b9150915081611a6e5763ffffffff811615613252575f805460ff60a01b198116600160a01b17909155604051634a63ebf760e11b81526001600160a01b03909116906394c7d7ee906132139088908890889060040161680e565b5f604051808303815f87803b15801561322a575f80fd5b505af115801561323c573d5f803e3d5ffd5b50505f805460ff60a01b1916905550611a6e9050565b60405162d1953b60e31b81526001600160a01b0386166004820152602401612012565b5f5b8181101561132d576132ae83838381811061329457613294616738565b90506020020160208101906132a99190615d52565b613b9b565b6132dd8383838181106132c3576132c3616738565b90506020020160208101906132d89190615d52565b613b59565b600101613277565b5f6107d061ffff8616111561330d5760405163af2eb37360e01b815260040160405180910390fd5b61ffff85161580159061332757506001600160a01b038416155b156133455760405163af2eb37360e01b815260040160405180910390fd5b306001600160a01b0385160361336e5760405163af2eb37360e01b815260040160405180910390fd5b6001600160a01b038416158015906133975750826001600160a01b0316846001600160a01b0316145b156133b55760405163af2eb37360e01b815260040160405180910390fd5b85545f6001600160a01b038616156133cd57866133cf565b5f5b604080518082019091526001600160401b03428116825261ffff80841660208085019182528d54600181018f555f8f8152919091209451940180549151909216600160401b0269ffffffffffffffffffff199091169390921692909217179055905081158061344557508361ffff168161ffff16105b61344f5783613451565b805b98975050505050505050565b5f846001600160401b03165f0361347557505f613563565b5f6001600160a01b0385161561348b578361348d565b5f5b90505f6134a460016001600160401b03891661679e565b88549091505f5b82821180156134ba5750602081105b15613531575f8a6134cc60018561679e565b815481106134dc576134dc616738565b5f918252602090912001805490915061ffff808716600160401b909204161015613510578054600160401b900461ffff1694505b8261351a8161684d565b935050818061352890616862565b925050506134ab565b8282036135445783945050505050613563565b8561ffff80861690821610613559578461355b565b805b955050505050505b95945050505050565b5f828152601560209081526040808320546003835281842082518084019093525462ffffff8082168452630100000090910464ffffffffff1693830184905216918291904210156136185780515f8781526002602052604081205462ffffff9283169450909116906127106135e36113888261687a565b6135f19061ffff1687616894565b6135fb91906168bf565b905080821015613609578091505b81841015613615578193505b50505b5f8681526001602052604090205462ffffff1680831115613637578092505b509095945050505050565b3061365360a0830160808401615d52565b6001600160a01b0316141580613690575060015f613679611436368590038501856165de565b815260208101919091526040015f205462ffffff16155b156136ae57604051636b271baf60e11b815260040160405180910390fd5b6136be6113c06020830183615d52565b80156136c757505f5b156128a157604051630a7287b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526005602090815260408083208584529091528120805483929061371790849061653d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020616dd183398151915291015b60405180910390a4505050565b611723613769368990038901896165de565b878787878787614079565b5f81815260208581526040808320868352818420825160a0810184528681529384018590529183018490526060830184905260808301939093526111719291859061442a565b475f8190036137c65750565b6040515f90339083908381818185875af1925050503d805f8114613805576040519150601f19603f3d011682016040523d82523d5f602084013e61380a565b606091505b505090508061205957604051633c31275160e21b815260040160405180910390fd5b62ffffff8116158061386757507f000000000000000000000000000000000000000000000000000000000000000062ffffff168162ffffff16115b156138855760405163a51d0c8160e01b815260040160405180910390fd5b606462ffffff831610806138a257508062ffffff168262ffffff16115b156138c05760405163a51d0c8160e01b815260040160405180910390fd5b5f928352600160209081526040808520805462ffffff1990811662ffffff95861617909155600290925290932080549093169116179055565b5f818152600d6020526040812054611016906001600160401b0316611177565b611a6e7f000000000000000000000000000000000000000000000000000000000000000086868686866144a9565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602001611be8565b60605f806139a484860186616904565b909250905060018260018111156139bd576139bd616993565b03613a21575f818060200190518101906139d791906169b2565b90506139f088825f0151836040015184608001516145e5565b613a08888260200151836060015184608001516145e5565b60405180602001604052805f8152509350505050613a46565b613a328d8d8d8d8d8d8d8d896146d6565b60405180602001604052805f815250925050505b9a9950505050505050505050565b5f805f80613a6288886148a6565b915091505f80613a738a8a8a61494f565b915091505f80613a848c8c8b61494f565b915091505f613a938d8d6149a4565b50509150508a60020b8160020b1215613ab55782850398508184039750613ae0565b8960020b8160020b12613ad15784830398508382039750613ae0565b82858803039850818487030397505b5050505050505094509492505050565b6001600160a01b0383165f90815260056020908152604080832085845290915281208054839290613b2290849061679e565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020616dd1833981519152910161374a565b6128a160147f000000000000000000000000000000000000000000000000000000000000000083600760029054906101000a90046001600160a01b0316614a56565b6001600160a01b03811615613bb3576128a181614b07565b6001600160a01b0381165f9081526013602052604081205490819003613bd7575050565b6008546001600160a01b031680613bed57505050565b6001600160a01b0383165f908152601360205260408120819055613c39907f000000000000000000000000000000000000000000000000000000000000000090859081908690306144a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015613c92575f80fd5b505af1158015613ca4573d5f803e3d5ffd5b50613ce09350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915083905084614b50565b806001600160a01b0316836001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb884604051613d2591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03167fb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e84604051613d9291815260200190565b60405180910390a3505050565b5f6001600160a01b038416613db557505f6110a5565b826001600160a01b0316846001600160a01b031603613de7576040516343c829db60e01b815260040160405180910390fd5b816001600160a01b0316846001600160a01b031603613e19576040516343c829db60e01b815260040160405180910390fd5b306001600160a01b03851603613e42576040516343c829db60e01b815260040160405180910390fd5b836001600160a01b031663667d31686040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613e9c575060408051601f3d908101601f19168201909252613e9991810190616a0e565b60015b613eb95760405163281d5dd760e11b815260040160405180910390fd5b6001600160a01b038116613ee05760405163281d5dd760e11b815260040160405180910390fd5b90506110a5565b5f336001600160a01b03861614801590613f2457506001600160a01b0385165f90815260046020908152604080832033845290915290205460ff16155b15613f94576001600160a01b0385165f90815260066020908152604080832033845282528083208684529091529020545f198114613f9257613f66838261679e565b6001600160a01b0387165f90815260066020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260056020908152604080832086845290915281208054849290613fc690849061679e565b90915550506001600160a01b0384165f90815260056020908152604080832086845290915281208054849290613ffd90849061653d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020616dd1833981519152910160405180910390a4506001949350505050565b5f80516020616df18339815191525c15612f1157604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060e001604052808b81526020018a60020b81526020018960020b8152602001888152602001876001600160a01b03168152602001866001600160801b03168152602001856001600160801b031681525060405160200161410d9190616a29565b60408051601f198184030181529082905261412b9291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401614156919061639a565b5f604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285b9190810190616ad6565b83545f906141af906001600160801b03168561679e565b90508015614278576141d981866002015488600101546141cf919061679e565b600160801b614b85565b855486906010906141fb908490600160801b90046001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061423781866003015488600201546141cf919061679e565b6001860180545f906142539084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6001860154600280870191909155860154600386015584546001600160801b03168015614375575f6142c1826001600160801b031688600401548a600301546141cf919061679e565b90505f6142e5836001600160801b031689600501548b600401546141cf919061679e565b9050811515806142f457508015155b156143725781886006015f82825461430c919061653d565b9250508190555080886007015f828254614326919061653d565b9091555050604080518381526020810183905286916001600160a01b038916917f7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d910160405180910390a35b50505b866003015486600401819055508660040154866005018190555050505050505050565b6040516001600160a01b038085166024830152831660448201526001600160e01b0319821660648201525f908190819060840160408051601f19818403018152918152602080830180516001600160e01b031663b700961360e01b1781525f808052918290528351939450919290918a5afa15614420575f516020805191945081901c150291505b5094509492505050565b600684018054600191905f9061444a9084906001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505f8061447a8585614c21565b915091506144a1835f0151846020015185604001518660600151876080015187878d614ca8565b505050505050565b821580156144b5575081155b6144a157856001600160a01b03166348c8949160016040518060a00160405280896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001856001600160a01b031681525060405160200161455a919081516001600160a01b0390811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b60408051601f19818403018152908290526145789291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016145a3919061639a565b5f604051808303815f875af11580156145be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190616ad6565b811561117157836001600160a01b031663f5298aca30614614866001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b15801561465e575f80fd5b505af1158015614670573d5f803e3d5ffd5b5050604051630b0d9c0960e01b81526001600160a01b03868116600483015284811660248301526044820186905287169250630b0d9c0991506064015b5f604051808303815f87803b1580156146c4575f80fd5b505af115801561285b573d5f803e3d5ffd5b5f818060200190518101906146eb9190616b60565b90505f80856001600160a01b0316635a6bcfda845f01516040518060800160405280876020015160020b8152602001876040015160020b8152602001876060015181526020015f801b8152506040518363ffffffff1660e01b8152600401614754929190616c5d565b60408051808303815f875af115801561476f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147939190616cae565b915091506148758c8c8c8c8c8c8c6040518060e001604052806147ba8d5f015160a0902090565b8d602001518e604001516040516020016147eb93929190928352600291820b6020840152900b604082015260600190565b604051602081830303815290604052805190602001205f1c81526020018c5f0151815260200161481b8b60801d90565b6001600160801b031681526020016148338b600f0b90565b600f0b6001600160801b031681526020018e5f015161ffff1681526020018e6020015161ffff1681526020018e604001516001600160a01b0316815250614d6c565b61489886845f01518484876080015188606001518960a001518a60c00151614e3d565b505050505050505050505050565b5f805f6148b284614ec0565b90505f6148c060018361653d565b604051631afeb18d60e11b815260048101829052600260248201529091505f906001600160a01b038816906335fd631a906044015b5f60405180830381865afa15801561490f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526149369190810190616cd0565b6020810151604090910151909890975095505050505050565b5f805f61495c8585614efc565b90505f6001600160a01b0387166335fd631a61497984600161653d565b60405160e083901b6001600160e01b03191681526004810191909152600260248201526044016148f5565b5f805f805f6149b286614ec0565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156149fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1e9190616d7a565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6001600160a01b038083165f908152602086905260409020549082161580614a7c575080155b15614a875750611171565b6001600160a01b0383165f908152602086905260408120819055614ab3908590859081908590876144a9565b816001600160a01b0316836001600160a01b03167f8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e080866483604051614af891815260200190565b60405180910390a35050505050565b600854600954600a546128a1926013927f00000000000000000000000000000000000000000000000000000000000000009286926001600160a01b039081169281169116614f4f565b614b5d8383836001615031565b61132d57604051635274afe760e01b81526001600160a01b0384166004820152602401612012565b5f838302815f1985870982811083820303915050808411614ba4575f80fd5b805f03614bb6575082900490506110a5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6040805160a0808201835284546001600160a01b03908116835260018601548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b60608401528501549092166080820152205f908190614c9c9084906003870154600281810b9163010000009004900b613a54565b915091505b9250929050565b6003810154600482015482546006840154604080518c8152602081018c90529081018a905260608101899052608081019490945260a084019290925260c0830186905260e083018590526001600160801b03808216610100850152600160801b909104166101208301526001600160401b03808216610140840152600160401b9091041661016082015288907f9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309906101800160405180910390a25050505050505050565b80515f9081526020859052604081205460c0830151608084015160a0850151614da49388936001600160401b0390911692909161345d565b845483515f9081526020889052604090819020805467ffffffffffffffff19166001600160401b03909316929092179091558301519091506001600160801b0316158015614dfd575060608201516001600160801b0316155b15614e08575061285b565b81515f90815260208a8152604080832085518452918b9052909120614e3291908989878787615093565b505050505050505050565b5f614e488660801d90565b614e528860801d90565b614e5c9190616d91565b90505f614e6987600f0b90565b614e7389600f0b90565b614e7d9190616d91565b9050614e8a8286866156d7565b614e958186856156d7565b614ea48a8a5f01518489615797565b614eb48a8a602001518389615797565b50505050505050505050565b6040515f90614edf908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f80614f0784614ec0565b90505f614f1560048361653d565b60408051600287900b6020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6001600160a01b0384165f9081526020879052604081205490819003614f7557506144a1565b5f836001600160a01b0316866001600160a01b031614614f955784614f97565b825b90506001600160a01b038116614fae5750506144a1565b6001600160a01b0386165f908152602089905260408120819055614fda908890889081908690866144a9565b806001600160a01b0316866001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb88460405161501f91815260200190565b60405180910390a35050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661508757838315161561507b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60408201516001600160801b031615615126576020820151516040808401518151630ab714fb60e11b81523060048201526001600160a01b0393841660248201526001600160801b03909116604482015290519185169163156e29f6916064808201925f9290919082900301818387803b15801561510f575f80fd5b505af1158015615121573d5f803e3d5ffd5b505050505b60608201516001600160801b0316156151da57826001600160a01b031663156e29f63061516a8560200151602001516001600160a01b03166001600160a01b031690565b60608601516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526001600160801b031660448201526064015f604051808303815f87803b1580156151c3575f80fd5b505af11580156151d5573d5f803e3d5ffd5b505050505b86546001600160801b03165f8190036152f55782604001516001600160801b0316865f85602001515f01516001600160a01b03166001600160a01b031681526020019081526020015f205f828254615232919061653d565b9250508190555082606001516001600160801b0316865f8560200151602001516001600160a01b03166001600160a01b031681526020019081526020015f205f82825461527f919061653d565b925050819055506152ef8888866040518060a00160405280885f0151815260200188604001516001600160801b0316815260200188606001516001600160801b0316815260200188604001516001600160801b0316815260200188606001516001600160801b031681525061442a565b50611723565b5f61530789856040015184600161594f565b90505f61531a8a8660600151855f61594f565b9050811561535457602080860151516001600160a01b03165f9081529089905260408120805484929061534e90849061653d565b90915550505b801561538e576020808601518101516001600160a01b03165f9081529089905260408120805483929061538890849061653d565b90915550505b6153998a8383615a57565b89545f906153b790600160801b90046001600160801b03168561679e565b9050805f03615505578286604001516001600160801b03166153d9919061679e565b602080880151516001600160a01b03165f908152908b905260408120805490919061540590849061653d565b909155505060608601516154239083906001600160801b031661679e565b6020808801518101516001600160a01b03165f908152908b905260408120805490919061545190849061653d565b925050819055506154938b8488604001516001600160801b0316615475919061679e565b8489606001516001600160801b031661548e919061679e565b615a57565b6154fc8b8b896040518060a001604052808b5f015181526020018b604001516001600160801b031681526020018b606001516001600160801b031681526020018b604001516001600160801b031681526020018b606001516001600160801b031681525061442a565b50505050611723565b5f8387604001516001600160801b031661551f919061679e565b90505f8388606001516001600160801b031661553b919061679e565b905061ffff87161580159061555c575060c08801516001600160a01b031615155b1561562a575f61271061557361ffff8a1685616894565b61557d91906168bf565b90505f61271061559161ffff8b1685616894565b61559b91906168bf565b905081156155d5576020808b0151516001600160a01b03165f908152908d90526040812080548492906155cf90849061653d565b90915550505b801561560f576020808b01518101516001600160a01b03165f908152908d905260408120805483929061560990849061653d565b90915550505b615619828561679e565b9350615625818461679e565b925050505b61563982600160801b85614b85565b8d6001015f82825461564b919061653d565b90915550615660905081600160801b85614b85565b8d6002015f828254615672919061653d565b925050819055506156c88d8d8b6040518060a001604052808d5f015181526020018d604001516001600160801b031681526020018d606001516001600160801b031681526020018a81526020018981525061442a565b50505050505050505050505050565b5f82131561573b575f8084600f0b126156f0575f6156fd565b83600f0b6156fd90616769565b9050816001600160801b031681111561117157604051630f569baf60e01b8152600481018290526001600160801b0383166024820152604401612012565b5f82121561132d575f8084600f0b13615754575f615759565b83600f0b5b9050816001600160801b031681101561117157604051636741d67d60e11b8152600481018290526001600160801b0383166024820152604401612012565b5f82600f0b12156158ff575f82600f0b6157b090616769565b604051632961046560e21b81526001600160a01b0386811660048301529192509086169063a5841194906024015f604051808303815f87803b1580156157f4575f80fd5b505af1158015615806573d5f803e3d5ffd5b505050506001600160a01b03841661588157846001600160a01b03166311da60b4826040518263ffffffff1660e01b815260040160206040518083038185885af1158015615856573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061587b9190616d7a565b506158f9565b6158966001600160a01b038516838784615ae8565b846001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156158d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158f79190616d7a565b505b50611171565b5f82600f0b131561117157604051630b0d9c0960e01b81526001600160a01b03848116600483015282811660248301526001600160801b0384166044830152851690630b0d9c09906064016146ad565b83545f90600160801b90046001600160801b0316816159958580615975576159756168ab565b836001600160801b0316886001600160801b031609600160801b87614b85565b846159b4576005880154600160801b90046001600160801b03166159c3565b60058801546001600160801b03165b6001600160801b03166159d6919061653d565b9050608081901c6159fa876001600160801b0316846001600160801b031688614b85565b615a04919061653d565b9250808415615a2f576005880180546001600160801b0319166001600160801b038316179055615a4c565b6005880180546001600160801b03808416600160801b0291161790555b505050949350505050565b8254600160801b90046001600160801b03165f819003615a775750505050565b8215615aad57615a9583600160801b836001600160801b0316614b85565b846003015f828254615aa7919061653d565b90915550505b811561117157615acb82600160801b836001600160801b0316614b85565b846004015f828254615add919061653d565b909155505050505050565b615af6848484846001615b1e565b61117157604051635274afe760e01b81526001600160a01b0385166004820152602401612012565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316615b7a578383151615615b6e573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146128a1575f80fd5b5f8060408385031215615bb0575f80fd5b8235615bbb81615b8b565b946020939093013593505050565b5f60208284031215615bd9575f80fd5b81356001600160e01b0319811681146110a5575f80fd5b5f805f60608486031215615c02575f80fd5b8335615c0d81615b8b565b95602085013595506040909401359392505050565b5f8083601f840112615c32575f80fd5b5081356001600160401b03811115615c48575f80fd5b6020830191508360208260051b8501011115614ca1575f80fd5b803561ffff81168114615c73575f80fd5b919050565b5f805f8060608587031215615c8b575f80fd5b84356001600160401b03811115615ca0575f80fd5b615cac87828801615c22565b9095509350615cbf905060208601615c62565b91506040850135615ccf81615b8b565b939692955090935050565b5f60208284031215615cea575f80fd5b81356001600160401b03811681146110a5575f80fd5b5f60208284031215615d10575f80fd5b5035919050565b80151581146128a1575f80fd5b5f8060408385031215615d35575f80fd5b823591506020830135615d4781615d17565b809150509250929050565b5f60208284031215615d62575f80fd5b81356110a581615b8b565b5f805f60408486031215615d7f575f80fd5b83356001600160401b03811115615d94575f80fd5b615da086828701615c22565b9094509250506020840135615db481615b8b565b809150509250925092565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101008101615e118287615dbf565b8460020b60a08301528360020b60c083015282151560e083015295945050505050565b5f60a08284031215615e44575f80fd5b50919050565b8060020b81146128a1575f80fd5b6001600160801b03811681146128a1575f80fd5b5f805f805f805f610160888a031215615e83575f80fd5b615e8d8989615e34565b965060a0880135615e9d81615e4a565b955060c0880135615ead81615e4a565b945060e0880135615ebd81615e58565b9350610100880135615ece81615e58565b9250610120880135615edf81615e58565b9699959850939692959194919350506101409091013590565b81516001600160801b0316815261014081016020830151615f2460208401826001600160801b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151615f6760c08401826001600160801b03169052565b5060e0830151615f8260e08401826001600160801b03169052565b50610100830151615f9f6101008401826001600160401b03169052565b50610120830151615fbc6101208401826001600160401b03169052565b5092915050565b62ffffff811681146128a1575f80fd5b5f805f806101008587031215615fe7575f80fd5b615ff18686615e34565b935060a085013561600181615fc3565b925060c085013561601181615fc3565b915060e0850135615ccf81615fc3565b5f805f805f6101208688031215616036575f80fd5b6160408787615e34565b945060a086013561605081615e4a565b935060c086013561606081615e4a565b925060e086013561607081615b8b565b915061607f6101008701615c62565b90509295509295909350565b5f806040838503121561609c575f80fd5b823591506020830135615d4781615b8b565b5f610120820190506001600160801b0383511682526001600160801b03602084015116602083015260408301516160f060408401826001600160801b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b5f8060408385031215616146575f80fd5b823561615181615b8b565b91506020830135615d4781615d17565b5f8083601f840112616171575f80fd5b5081356001600160401b03811115616187575f80fd5b602083019150836020828501011115614ca1575f80fd5b5f805f805f8587036101408112156161b4575f80fd5b86356161bf81615b8b565b95506161ce8860208901615e34565b9450606060bf19820112156161e1575f80fd5b5060c0860192506101208601356001600160401b03811115616201575f80fd5b61620d88828901616161565b969995985093965092949392505050565b5f805f60608486031215616230575f80fd5b833561623b81615b8b565b9250602084013561624b81615b8b565b929592945050506040919091013590565b5f805f806101008587031215616270575f80fd5b61627a8686615e34565b935060a085013561628a81615e4a565b925060c085013561629a81615e4a565b915060e0850135615ccf81615e58565b5f805f604084860312156162bc575f80fd5b8335925060208401356001600160401b038111156162d8575f80fd5b6162e486828701615c22565b9497909650939450505050565b5f805f60608486031215616303575f80fd5b83359250602084013561631581615fc3565b9150604084013564ffffffffff81168114615db4575f80fd5b5f806020838503121561633f575f80fd5b82356001600160401b03811115616354575f80fd5b61636085828601616161565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a5602083018461636c565b5f805f805f805f80610180898b0312156163c4575f80fd5b6163ce8a8a615e34565b975060a08901356163de81615e4a565b965060c08901356163ee81615e4a565b955060e08901356163fe81615e58565b945061010089013561640f81615b8b565b935061012089013561642081615e58565b925061014089013561643181615e58565b979a969950949793969295919450919261016001359150565b5f806040838503121561645b575f80fd5b823561646681615b8b565b91506020830135615d4781615b8b565b5f805f60e08486031215616488575f80fd5b833561649381615b8b565b92506164a28560208601615e34565b915060c0840135615db481615b8b565b5f805f606084860312156164c4575f80fd5b8335925060208401356164d681615e4a565b91506040840135615db481615e4a565b5f805f80608085870312156164f9575f80fd5b843561650481615b8b565b9350602085013561651481615b8b565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561101657611016616529565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561658657616586616550565b60405290565b60405160e081016001600160401b038111828210171561658657616586616550565b604051601f8201601f191681016001600160401b03811182821017156165d6576165d6616550565b604052919050565b5f60a08284031280156165ef575f80fd5b506165f8616564565b823561660381615b8b565b8152602083013561661381615b8b565b6020820152604083013561662681615fc3565b6040820152606083013561663981615e4a565b6060820152608083013561664c81615b8b565b60808201529392505050565b6001600160401b03818116838216019081111561101657611016616529565b6001600160801b03818116838216019081111561101657611016616529565b5f60608284031280156166a7575f80fd5b50604051606081016001600160401b03811182821017156166ca576166ca616550565b60405282356166d881615d17565b81526020838101359082015260408301356166f281615b8b565b60408201529392505050565b5f6020828403121561670e575f80fd5b81516110a581615d17565b6001600160801b03828116828216039081111561101657611016616529565b634e487b7160e01b5f52603260045260245ffd5b64ffffffffff818116838216019081111561101657611016616529565b5f600160ff1b820161677d5761677d616529565b505f0390565b5f60208284031215616793575f80fd5b81356110a581615fc3565b8181038181111561101657611016616529565b5f80858511156167bf575f80fd5b838611156167cb575f80fd5b5050820193919092039150565b80356001600160e01b03198116906004841015615fbc576001600160e01b031960049490940360031b84901b1690921692915050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8161685b5761685b616529565b505f190190565b5f6001820161687357616873616529565b5060010190565b61ffff828116828216039081111561101657611016616529565b808202811582820484141761101657611016616529565b634e487b7160e01b5f52601260045260245ffd5b5f826168d957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b038211156168f6576168f6616550565b50601f01601f191660200190565b5f8060408385031215616915575f80fd5b823560028110616923575f80fd5b915060208301356001600160401b0381111561693d575f80fd5b8301601f8101851361694d575f80fd5b803561696061695b826168de565b6165ae565b818152866020838501011115616974575f80fd5b816020840160208301375f602083830101528093505050509250929050565b634e487b7160e01b5f52602160045260245ffd5b8051615c7381615b8b565b5f60a08284031280156169c3575f80fd5b506169cc616564565b82516169d781615b8b565b815260208301516169e781615b8b565b60208201526040838101519082015260608084015190820152608083015161664c81615b8b565b5f60208284031215616a1e575f80fd5b81516110a581615b8b565b5f61016082019050616a3c828451615dbf565b602083015160020b60a0830152604083015160020b60c0830152606083015160e083015260018060a01b036080840151166101008301526001600160801b0360a08401511661012083015260c0830151615fbc6101408401826001600160801b03169052565b5f60028410616abf57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152612ee7604083018461636c565b5f60208284031215616ae6575f80fd5b81516001600160401b03811115616afb575f80fd5b8201601f81018413616b0b575f80fd5b8051616b1961695b826168de565b818152856020838501011115616b2d575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b8051615c7381615e4a565b8051615c7381615e58565b5f81830361016081128015616b73575f80fd5b50616b7c61658c565b60a0821215616b89575f80fd5b616b91616564565b91508351616b9e81615b8b565b82526020840151616bae81615b8b565b60208301526040840151616bc181615fc3565b60408301526060840151616bd481615e4a565b60608301526080840151616be781615b8b565b6080830152818152616bfb60a08501616b4a565b6020820152616c0c60c08501616b4a565b604082015260e0840151606082018190529150616c2c61010085016169a7565b6080820152616c3e6101208501616b55565b60a0820152616c506101408501616b55565b60c0820152949350505050565b616c678184615dbf565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f8060408385031215616cbf575f80fd5b505080516020909101519092909150565b5f60208284031215616ce0575f80fd5b81516001600160401b03811115616cf5575f80fd5b8201601f81018413616d05575f80fd5b80516001600160401b03811115616d1e57616d1e616550565b8060051b616d2e602082016165ae565b91825260208184018101929081019087841115616d49575f80fd5b6020850194505b83851015616d6f57845180835260209586019590935090910190616d50565b979650505050505050565b5f60208284031215616d8a575f80fd5b5051919050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff1981126f7fffffffffffffffffffffffffffffff821317156110165761101661652956fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac7288599b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081a000a","sourceMap":"3553:4264:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5952:10;-1:-1:-1;;;;;5974:11:41;5952:34;;5948:70;;5995:23;;-1:-1:-1;;;5995:23:41;;;;;;;;;;;5948:70;3553:4264;;;;;792:81:16;;;;;;;;;;-1:-1:-1;792:81:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;668:25:46;;;656:2;641:18;792:81:16;;;;;;;;2663:241;;;;;;;;;;-1:-1:-1;2663:241:16;;;;;:::i;:::-;;:::i;:::-;;;1160:14:46;;1153:22;1135:41;;1123:2;1108:18;2663:241:16;995:187:46;39200:740:43;;;;;;;;;;-1:-1:-1;39200:740:43;;;;;:::i;:::-;;:::i;14234:856::-;;;;;;;;;;-1:-1:-1;14234:856:43;;;;;:::i;:::-;;:::i;53463:196::-;;;;;;;;;;-1:-1:-1;53463:196:43;;;;;:::i;:::-;;:::i;:::-;;;3400:6:46;3388:19;;;3370:38;;3358:2;3343:18;53463:196:43;3226:188:46;18678:342:43;;;;;;;;;;-1:-1:-1;18678:342:43;;;;;:::i;:::-;;:::i;6119:241:42:-;;;;;;;;;;-1:-1:-1;6119:241:42;;;;;:::i;:::-;;:::i;:::-;;;4340:8:46;4328:21;;;4310:40;;4298:2;4283:18;6119:241:42;4166:190:46;10438:62:43;;;;;;;;;;-1:-1:-1;10438:62:43;;;;;:::i;:::-;;;;;;;;;;;;;;15270:792;;;;;;;;;;-1:-1:-1;15270:792:43;;;;;:::i;:::-;;:::i;11721:299::-;;;;;;;;;;-1:-1:-1;11721:299:43;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11818:15:43;11906:14;;;:10;:14;;;;;;;;;11954:20;;;;11930:83;;;;;;;;;-1:-1:-1;;;;;11930:83:43;;;;;11954:20;11930:83;;;;;;;;;;;;;-1:-1:-1;;;11930:83:43;;;;;;;;;;;-1:-1:-1;;;11930:83:43;;;11954:20;11930:83;;;;;;;;;;;;;;;;;;;;11954:20;;;;11976;;;;;;;-1:-1:-1;;;11998:14:43;;;;;11721:299;;;;;;;;;;;:::i;22828:2887::-;;;;;;:::i;:::-;;:::i;2127:40:42:-;;;;;;;;;;;;;;;5135:28:41;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7874:32:46;;;7856:51;;7844:2;7829:18;5135:28:41;7695:218:46;6592:24:43;;;;;;;;;;-1:-1:-1;6592:24:43;;;;-1:-1:-1;;;;;6592:24:43;;;13888:109;;;;;;;;;;-1:-1:-1;13888:109:43;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13979:11:43;;;;:7;:11;;;;;;;;;13972:18;;;;;;;;;-1:-1:-1;;;;;13972:18:43;;;;;-1:-1:-1;;;13972:18:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13972:18:43;;;;;;;-1:-1:-1;;;13972:18:43;;;;;;;;;13888:109;;;;;;;;:::i;2013:231:16:-;;;;;;;;;;-1:-1:-1;2013:231:16;;;;;:::i;:::-;;:::i;3298:471:40:-;;;;;;;;;;-1:-1:-1;3298:471:40;;;;;:::i;:::-;;:::i;30875:2536:43:-;;;;;;;;;;-1:-1:-1;30875:2536:43;;;;;:::i;:::-;;:::i;14003:138::-;;;;;;;;;;-1:-1:-1;14003:138:43;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17789:228::-;;;;;;;;;;-1:-1:-1;17789:228:43;;;;;:::i;:::-;;:::i;2250:225:16:-;;;;;;;;;;-1:-1:-1;2250:225:16;;;;;:::i;:::-;;:::i;5539:395:42:-;;;;;;;;;;-1:-1:-1;5539:395:42;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;14073:33:46;;;14055:52;;14138:2;14123:18;;14116:34;;;;14198:8;14186:21;14166:18;;;14159:49;14043:2;14028:18;5539:395:42;13822:392:46;880:108:16;;;;;;;;;;-1:-1:-1;880:108:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9460:218:43;;;;;;;;;;-1:-1:-1;9642:11:43;;9656:15;-1:-1:-1;9460:218:43;;33502:3026;;;;;;;;;;-1:-1:-1;33502:3026:43;;;;;:::i;:::-;;:::i;2961:55:42:-;;;;;;;;;;-1:-1:-1;2961:55:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;7808:126;;;;;;;;;;-1:-1:-1;7808:126:42;;;;;:::i;:::-;;:::i;1894:46::-;;;;;;;;;;;;1932:8;1894:46;;;;;15820:12:46;15808:25;;;15790:44;;15778:2;15763:18;1894:46:42;15646:194:46;10198:65:43;;;;;;;;;;-1:-1:-1;10198:65:43;;;;;:::i;:::-;;;;;;;;;;;;;;53719:112;;;;;;;;;;-1:-1:-1;53801:16:43;:23;53719:112;;6270:25;;;;;;;;;;-1:-1:-1;6270:25:43;;;;;;;;3012:362:0;;;;;;;;;;-1:-1:-1;3012:362:0;;;;;:::i;:::-;;:::i;6301:32:43:-;;;;;;;;;;-1:-1:-1;6301:32:43;;;;;;;-1:-1:-1;;;;;6301:32:43;;;2632:51:42;;;;;;;;;;;;2679:4;2632:51;;46697:1240:43;;;;;;;;;;-1:-1:-1;46697:1240:43;;;;;:::i;:::-;;:::i;7222:499:42:-;;;;;;;;;;-1:-1:-1;7222:499:42;;;;;:::i;:::-;;:::i;3415:156:0:-;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;;17408:33:46;;;17390:52;;17378:2;17363:18;3415:156:0;17246:202:46;42697:531:43;;;;;;;;;;-1:-1:-1;42697:531:43;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13517:365::-;;;;;;;;;;-1:-1:-1;13517:365:43;;;;;:::i;:::-;;:::i;:::-;;;;18556:25:46;;;18612:2;18597:18;;18590:34;;;;18529:18;13517:365:43;18382:248:46;3093:49:42;;;;;;;;;;-1:-1:-1;3093:49:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18835:8:46;18823:21;;;18805:40;;18893:12;18881:25;;;18876:2;18861:18;;18854:53;18778:18;3093:49:42;18635:278:46;10869:100:43;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;3375:11:14;10869:100:43;3415:156:0;9362:42:43;;;;;;;;;;;;9398:6;9362:42;;8303:65;;;;;;;;;;-1:-1:-1;8303:65:43;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;8303:65:43;;;;;;-1:-1:-1;;;;;19080:31:46;;;19062:50;;19050:2;19035:18;8303:65:43;18918:200:46;7667:32:43;;;;;;;;;;-1:-1:-1;7667:32:43;;;;;;;;28400:2140;;;;;;;;;;-1:-1:-1;28400:2140:43;;;;;:::i;:::-;;:::i;2776:41:42:-;;;;;;;;;;;;2814:3;2776:41;;55042:119:43;;;;;;;;;;-1:-1:-1;55042:119:43;;;;;:::i;:::-;;:::i;48753:1651::-;;;;;;;;;;-1:-1:-1;48753:1651:43;;;;;:::i;:::-;;:::i;2303:50:42:-;;;;;;;;;;-1:-1:-1;2303:50:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;697:88:16;;;;;;;;;;-1:-1:-1;697:88:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;38060:125:43;;;;;;;;;;-1:-1:-1;38060:125:43;;;;;:::i;:::-;;:::i;2878:93:0:-;;;;;;;;;;-1:-1:-1;2928:7:0;2954:10;-1:-1:-1;;;;;2954:10:0;2878:93;;6467:28:43;;;;;;;;;;-1:-1:-1;6467:28:43;;;;-1:-1:-1;;;;;6467:28:43;;;6339:26;;;;;;;;;;-1:-1:-1;6339:26:43;;;;-1:-1:-1;;;;;6339:26:43;;;16935:757;;;;;;;;;;-1:-1:-1;16935:757:43;;;;;:::i;:::-;;:::i;2897:104:40:-;;;;;;;;;;-1:-1:-1;2897:104:40;;;;;:::i;:::-;2952:6;2977:17;;;:9;:17;;;;;;;;;2897:104;54112:116:43;;;;;;;;;;-1:-1:-1;54112:116:43;;;;;:::i;:::-;;:::i;9125:26::-;;;;;;;;;;;;;;;;37039:922;;;;;;;;;;-1:-1:-1;37039:922:43;;;;;:::i;:::-;;:::i;2174:41:42:-;;;;;;;;;;;;;;;4576:879;;;;;;;;;;-1:-1:-1;4576:879:42;;;;;:::i;:::-;;:::i;10975:180:43:-;;;;;;;;;;-1:-1:-1;10975:180:43;;;;;:::i;:::-;;:::i;9244:25::-;;;;;;;;;;-1:-1:-1;9244:25:43;;;;-1:-1:-1;;;;;9244:25:43;;;53884:134;;;;;;;;;;-1:-1:-1;53884:134:43;;;;;:::i;:::-;;:::i;:::-;;;;22233:13:46;;-1:-1:-1;;;;;22229:38:46;22211:57;;22328:4;22316:17;;;22310:24;22336:6;22306:37;22284:20;;;22277:67;;;;22184:18;53884:134:43;22001:349:46;5312:47:43;;;;;;;;;;;;5355:4;5312:47;;5835;;;;;;;;;;;;5880:2;5835:47;;39946:764;;;;;;;;;;-1:-1:-1;39946:764:43;;;;;:::i;:::-;;:::i;2663:241:16:-;2739:4;-1:-1:-1;;;;;;;;;2762:25:16;;;;:100;;-1:-1:-1;;;;;;;;;;2837:25:16;;;2762:100;2755:107;2663:241;-1:-1:-1;;2663:241:16:o;39200:740:43:-;39356:4;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;39643:6:::2;39653:1;39643:11:::0;39639:36:::2;;39663:12;;-1:-1:-1::0;;;39663:12:43::2;;;;;;;;;;;39639:36;39685:42;39704:10;39716:2;39720:6;39685:18;:42::i;:::-;39737:14;39748:2;39737:10;:14::i;:::-;39818:27;39830:2;39834:10;39818:11;:27::i;:::-;39855:25;39867:2;39871:8;39855:11;:25::i;:::-;39897:36;39912:8;39922:2;39926:6;39897:14;:36::i;:::-;39890:43;;1281:20:13::0;:18;:20::i;:::-;39200:740:43;;;;;:::o;14234:856::-;2780:39:0;735:10:12;2794:12:0;809:14:12;;2780:13:0;:39::i;:::-;1239:21:13::1;:19;:21::i;:::-;14390:25:43::2;14403:11;;14390:12;:25::i;:::-;14943:11;::::0;14956:18:::2;::::0;14884:91:::2;::::0;14909:16:::2;::::0;14927:3;;14932:9;;-1:-1:-1;;;;;14943:11:43;;::::2;::::0;14956:18:::2;;14884:24;:91::i;:::-;14863:18;:112:::0;;-1:-1:-1;;14863:112:43::2;;::::0;;::::2;;::::0;;14985:11:::2;:17:::0;;;;::::2;-1:-1:-1::0;;;;;;15012:29:43;;;;;;-1:-1:-1;;;;;15012:29:43;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;15056:27:::2;::::0;;23161:38:46;;;23230:2;23215:18;;23208:60;;;;15056:27:43::2;::::0;23134:18:46;15056:27:43::2;;;;;;;1281:20:13::1;:18;:20::i;:::-;14234:856:43::0;;;;:::o;53463:196::-;53601:17;;53633:18;;53524:6;;53549:103;;53571:16;;53589:10;;-1:-1:-1;;;;;53601:17:43;;;;;53620:11;;;;;53633:18;53549:21;:103::i;18678:342::-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;18745:13:43;;;:37:::1;;;9398:6;18762:8;:20;18745:37;18741:64;;;18791:14;;-1:-1:-1::0;;;18791:14:43::1;;;;;;;;;;;18741:64;18815:14;18832:26;18850:8:::0;18832:15:::1;:26;:::i;:::-;18815:43;;18882:11;;18872:6;:21;18868:48;;18902:14;;-1:-1:-1::0;;;18902:14:43::1;;;;;;;;;;;18868:48;18961:11;:20:::0;;;18996:17:::1;::::0;668:25:46;;;18996:17:43::1;::::0;656:2:46;641:18;18996:17:43::1;;;;;;;18731:289;18678:342:::0;:::o;6119:241:42:-;6194:6;6219:134;6244:6;6252:91;;;;;;;;6289:10;6252:91;;;;;;6318:1;6252:91;;;;6340:1;-1:-1:-1;;;;;6252:91:42;;;;6219:11;:134::i;15270:792:43:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;1239:21:13::1;:19;:21::i;:::-;15382:25:43::2;15395:11;;15382:12;:25::i;:::-;15938:11;::::0;-1:-1:-1;;;;;15930:19:43;;::::2;15938:11:::0;::::2;15930:19;::::0;:44:::2;;-1:-1:-1::0;;;;;;15953:21:43;::::2;15969:4;15953:21;15930:44;15926:70;;;15983:13;;-1:-1:-1::0;;;15983:13:43::2;;;;;;;;;;;15926:70;16006:9;:16:::0;;-1:-1:-1;;;;;;16006:16:43::2;-1:-1:-1::0;;;;;16006:16:43;::::2;::::0;;::::2;::::0;;;16037:18:::2;::::0;7856:51:46;;;16037:18:43::2;::::0;7844:2:46;7829:18;16037::43::2;;;;;;;;1281:20:13::1;:18;:20::i;:::-;15270:792:43::0;;;:::o;22828:2887::-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;23098:9:::2;-1:-1:-1::0;;;;;23098:14:43::2;23111:1;23098:14:::0;23094:42:::2;;23121:15;;-1:-1:-1::0;;;23121:15:43::2;;;;;;;;;;;23094:42;23226:8;23208:15;:26;23204:56;;;23243:17;;-1:-1:-1::0;;;23243:17:43::2;;;;;;;;;;;23204:56;23270:14;23280:3;23270:9;:14::i;:::-;23298:29;:13;;::::0;::::2;:3:::0;:13:::2;:::i;:::-;-1:-1:-1::0;;;;;23298:27:43::2;4998:58:37::0;;4910:153;23298:29:43::2;23294:187;;;23359:10;-1:-1:-1::0;;;;;23347:22:43::2;:9;:22;23343:52;;;23378:17;;-1:-1:-1::0;;;23378:17:43::2;;;;;;;;;;;23343:52;23294:187;;;23416:9;:14:::0;23412:69:::2;;23453:17;;-1:-1:-1::0;;;23453:17:43::2;;;;;;;;;;;23412:69;23491:10;23504:41;23512:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;:::-;515:4:38::0;496:24;;;271:265;23512:10:43::2;23524:9;23535;23504:7;:41::i;:::-;23560:14;::::0;;;:10:::2;:14;::::0;;;;:18:::2;;::::0;:14;;-1:-1:-1;;;;23560:18:43;::::2;;;23555:142;;23611:75;;;;;;;;23626:3;23611:75;;;;;;;;;;:::i;:::-;::::0;;::::2;::::0;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;23680:4:::2;23611:75:::0;;;;;;;-1:-1:-1;23594:14:43;;;:10:::2;:14:::0;;;;;:92;;;;;;-1:-1:-1;;;;;;23594:92:43;;::::2;-1:-1:-1::0;;;;;23594:92:43;;::::2;;::::0;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;23594:92:43;;;;;;;-1:-1:-1;;;23594:92:43::2;::::0;;::::2;;;-1:-1:-1::0;;;;23594:92:43::2;-1:-1:-1::0;;;23594:92:43;;;;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;;;-1:-1:-1;;23594:92:43;;;;;;;;;;;;::::2;::::0;;;::::2;-1:-1:-1::0;;23594:92:43::2;-1:-1:-1::0;;;23594:92:43;::::2;;::::0;;;::::2;::::0;;;::::2;::::0;;23555:142:::2;24070:14;24081:2;24070:10;:14::i;:::-;24094:27;24106:2;24110:10;24094:11;:27::i;:::-;24368:14;24385:11:::0;;;:7:::2;:11;::::0;;;;:23;-1:-1:-1;;;;;24385:23:43::2;:28:::0;24423:40;::::2;;;24438:11;::::0;;;:7:::2;:11;::::0;;;;:20:::2;;:25:::0;;24462:1:::2;::::0;24438:20;::::2;::::0;:25:::2;::::0;24462:1;;-1:-1:-1;;;24438:25:43;::::2;-1:-1:-1::0;;;;;24438:25:43::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;24438:25:43::2;;;;;-1:-1:-1::0;;;;;24438:25:43::2;;;;;;24423:40;24473:11;::::0;;;:7:::2;:11;::::0;;;;:36;;24500:9;;24473:11;:36:::2;::::0;24500:9;;-1:-1:-1;;;;;24473:36:43::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;24473:36:43::2;;;;;-1:-1:-1::0;;;;;24473:36:43::2;;;;;;24519:32;24525:10;24537:2;24541:9;-1:-1:-1::0;;;;;24519:32:43::2;:5;:32::i;:::-;24561:98;24569:3;24574:9;24585;24611;-1:-1:-1::0;;;;;24603:18:43::2;24624:10;24636;24648;24561:7;:98::i;:::-;25179:9;25175:81;;;25190:66;25219:7;25228:10;25240:11;25253:2;25190:28;:66::i;:::-;25271:36;::::0;-1:-1:-1;;;;;26018:47:46;;26000:66;;25293:2:43;;25281:10:::2;::::0;25271:36:::2;::::0;25988:2:46;25973:18;25271:36:43::2;;;;;;;25662:29;:13;;::::0;::::2;:3:::0;:13:::2;:::i;:29::-;25658:50;;;25693:15;:13;:15::i;:::-;23084:2631;;1281:20:13::0;:18;:20::i;:::-;22828:2887:43;;;;;;;:::o;2013:231:16:-;2125:10;2099:4;2115:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;2115:30:16;;;;;;;;;;;:34;;;;;;;;;:43;;;2174:41;2099:4;;2146:2;;2174:41;;;;2152:6;668:25:46;;656:2;641:18;;522:177;2174:41:16;;;;;;;;-1:-1:-1;2233:4:16;2013:231;;;;;:::o;3298:471:40:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;3435:9:40::1;3424:20;;:8;:20;;;:38;;;;3459:3;3448:14;;:8;:14;;;3424:38;3420:66;;;3471:15;;-1:-1:-1::0;;;3471:15:40::1;;;;;;;;;;;3420:66;3496:13;3512:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;3532:17;::::0;;;:9:::1;:17;::::0;;;;:28;;-1:-1:-1;;3532:28:40::1;;::::0;::::1;;::::0;;:17;-1:-1:-1;3661:38:40::1;3532:17:::0;3684:9;3695:3;3661:14:::1;:38::i;:::-;3714:48;::::0;;26303:8:46;26291:21;;;26273:40;;26349:21;;;26344:2;26329:18;;26322:49;26407:21;;26387:18;;;26380:49;;;;3729:6:40;;3714:48:::1;::::0;26261:2:46;26246:18;3714:48:40::1;;;;;;;;3410:359;3298:471:::0;;;;:::o;30875:2536:43:-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;31964:14:::2;31974:3;31964:9;:14::i;:::-;31988:10;32001:41;32009:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;:10::-;32021:9;32032;32001:7;:41::i;:::-;31988:54;;32081:9;32056:34;;:22;32075:2;32056:18;:22::i;:::-;:34;;;32052:65;;;32099:18;;-1:-1:-1::0;;;32099:18:43::2;;;;;;;;;;;32052:65;32583:29;32615:14:::0;;;:10:::2;:14;::::0;;;;;;;32630:10:::2;32615:26:::0;;;;;;;32655:9:::2;:21:::0;;;;;:25;;;;;;;;;;:30;:53;::::2;;;-1:-1:-1::0;32689:14:43;;-1:-1:-1;;;32689:14:43;::::2;-1:-1:-1::0;;;;;32689:14:43::2;:19:::0;32655:53:::2;:76;;;;-1:-1:-1::0;32712:14:43::2;::::0;::::2;::::0;-1:-1:-1;;;;;32712:14:43::2;:19:::0;32655:76:::2;32651:130;;;32754:16;;-1:-1:-1::0;;;32754:16:43::2;;;;;;;;;;;32651:130;32790:14;32801:2;32790:10;:14::i;:::-;32814:27;32826:2;32830:10;32814:11;:27::i;:::-;32852:29;32884:14:::0;;;:10:::2;:14;::::0;;;;;;;32899:10:::2;32884:26:::0;;;;;;;32958:14;;32974::::2;::::0;::::2;::::0;-1:-1:-1;;;;;;;;32958:14:43;;::::2;::::0;::::2;::::0;32974::::2;33003:12:::0;;:28;::::2;;;-1:-1:-1::0;33019:12:43;;33003:28:::2;32999:41;;;33033:7;;;;;;;32999:41;33066:14;::::0;::::2;33049:41:::0;;-1:-1:-1;;;;;;33049:41:43::2;::::0;;;;-1:-1:-1;;;;;33049:41:43::2;::::0;;33285:59:::2;33293:13;;::::0;::::2;:3:::0;:13:::2;:::i;:::-;33308;::::0;;;::::2;::::0;::::2;;:::i;:::-;33323:7;33332;33341:2;33285:7;:59::i;:::-;33359:45;::::0;;18556:25:46;;;18612:2;18597:18;;18590:34;;;33383:2:43;;33371:10:::2;::::0;33359:45:::2;::::0;18529:18:46;33359:45:43::2;;;;;;;31044:2367;;;;;9764:1;1281:20:13::0;:18;:20::i;:::-;30875:2536:43;;;;;:::o;14003:138::-;14075:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14075:19:43;-1:-1:-1;14113:14:43;;;;:10;:14;;;;;;;;-1:-1:-1;;;;;14113:21:43;;;;;;;;;;;;;14106:28;;;;;;;;;-1:-1:-1;;;;;14106:28:43;;;;;-1:-1:-1;;;14106:28:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14003:138::o;17789:228::-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;9398:6:43::1;17860:8;:20;17856:47;;;17889:14;;-1:-1:-1::0;;;17889:14:43::1;;;;;;;;;;;17856:47;17927:13:::0;;:46:::1;;17947:26;17965:8:::0;17947:15:::1;:26;:::i;:::-;17927:46;;;17943:1;17927:46;17913:11;:60:::0;;;17988:22:::1;::::0;668:25:46;;;17988:22:43::1;::::0;656:2:46;641:18;17988:22:43::1;;;;;;;;17789:228:::0;:::o;2250:225:16:-;2355:10;2328:4;2344:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;2344:32:16;;;;;;;;;;;:43;;-1:-1:-1;;2344:43:16;;;;;;;;;;2403;;1135:41:46;;;2328:4:16;;2355:10;2403:43;;1108:18:46;2403:43:16;;;;;;;-1:-1:-1;2464:4:16;2250:225;;;;:::o;5539:395:42:-;5718:6;;;3190:10;-1:-1:-1;;;;;3212:11:42;3190:34;;3186:63;;3233:16;;-1:-1:-1;;;3233:16:42;;;;;;;;;;;3186:63;5765:10:::1;5778:31;5790:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;5778:31;;::::0;;::::1;::::0;::::1;5802:6:::0;5778:31:::1;:::i;:::-;:11;:31::i;:::-;-1:-1:-1::0;;;5827:26:42;-1:-1:-1;830:1:36::1;::::0;-1:-1:-1;819:8:29::1;5890:36:42;::::0;-1:-1:-1;;5539:395:42;;;;;;;;;:::o;33502:3026:43:-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;33667:6:::2;-1:-1:-1::0;;;;;33667:11:43::2;33677:1;33667:11:::0;33663:36:::2;;33687:12;;-1:-1:-1::0;;;33687:12:43::2;;;;;;;;;;;33663:36;33709:14;33719:3;33709:9;:14::i;:::-;35924:10;::::0;-1:-1:-1;;;;;35924:10:43::2;35948:18:::0;;;:67:::2;;-1:-1:-1::0;;;;;;35971:32:43;::::2;;36004:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;:10::-;35971:44;;;;;;;;;;;;;668:25:46::0;;656:2;641:18;;522:177;35971:44:43::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35970:45;35948:67;35944:93;;;36024:13;;-1:-1:-1::0;;;36024:13:43::2;;;;;;;;;;;35944:93;36047:10;36060:41;36068:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;36060:41::-;36047:54;;36111:14;36122:2;36111:10;:14::i;:::-;36191:27;36203:2;36207:10;36191:11;:27::i;:::-;36228:29;36260:14:::0;;;:10:::2;:14;::::0;;;;;;;36275:10:::2;36260:26:::0;;;;;;;36337:15;;36308:9:::2;:21:::0;;;;;:25;;;;;;;;;-1:-1:-1;;;;;36300:61:43;;::::2;::::0;:52:::2;::::0;36337:15;::::2;::::0;36300:52:::2;:::i;:::-;-1:-1:-1::0;;;;;36300:61:43::2;;36296:102;;;36370:28;;-1:-1:-1::0;;;36370:28:43::2;;;;;;;;;;;36296:102;36408:25:::0;;36427:6;;36408:8;;:15:::2;::::0;:25:::2;::::0;36427:6;;-1:-1:-1;;;;;36408:25:43::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;36408:25:43::2;;;;;-1:-1:-1::0;;;;;36408:25:43::2;;;;;;36470:6;36443:7;:11;36451:2;36443:11;;;;;;;;;;;:23;;;:33;;;;;;;;;;-1:-1:-1::0;;;;;36443:33:43::2;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;36443:33:43::2;;;;;-1:-1:-1::0;;;;;36443:33:43::2;;;;;;36510:2;36498:10;-1:-1:-1::0;;;;;36491:30:43::2;;36514:6;36491:30;;;;;-1:-1:-1::0;;;;;26018:47:46;;;;26000:66;;25988:2;25973:18;;25854:218;36491:30:43::2;;;;;;;;33653:2875;;;1281:20:13::0;:18;:20::i;7808:126:42:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;7879:14:42::1;::::0;;;:6:::1;:14;::::0;;;;;7872:21;;-1:-1:-1;;7872:21:42;;;7908:19;7886:6;;7908:19:::1;::::0;::::1;7808:126:::0;:::o;3012:362:0:-;3081:14;2954:10;735::12;;-1:-1:-1;;;;;2954:10:0;3124:21;;3120:92;;3168:33;;-1:-1:-1;;;3168:33:0;;-1:-1:-1;;;;;7874:32:46;;3168:33:0;;;7856:51:46;7829:18;;3168:33:0;;;;;;;;3120:92;3225:12;-1:-1:-1;;;;;3225:24:0;;3253:1;3225:29;3221:110;;3277:43;;-1:-1:-1;;;3277:43:0;;-1:-1:-1;;;;;7874:32:46;;3277:43:0;;;7856:51:46;7829:18;;3277:43:0;7695:218:46;3221:110:0;3340:27;3354:12;3340:13;:27::i;:::-;3071:303;3012:362;:::o;46697:1240:43:-;1239:21:13;:19;:21::i;:::-;46805:10:43::1;::::0;-1:-1:-1;;;;;46805:10:43::1;::::0;46825:48:::1;;46856:17;;-1:-1:-1::0;;;46856:17:43::1;;;;;;;;;;;46825:48;46888:9;46883:1048;46903:14:::0;;::::1;46883:1048;;;46938:10;46951:3;;46955:1;46951:6;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;47063:11;::::0;;;:7:::1;:11:::0;;;;;;:23;46951:6;;-1:-1:-1;;;;47063:23:43;::::1;-1:-1:-1::0;;;;;47063:23:43::1;:28:::0;;;;-1:-1:-1;47059:42:43::1;;47093:8;;;47059:42;47804:14;::::0;;;:10:::1;:14;::::0;;;;;;;;:23;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;47804:23:43;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;47804:23:43;::::1;;::::0;;;;-1:-1:-1;;;47804:23:43;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;496:24:38;;47753:77:43;;-1:-1:-1;;;47753:77:43;;47783:10:::1;47753:77;::::0;::::1;28280:51:46::0;28347:18;;;28340:34;;;28390:18;;;28383:34;;;;47753:77:43;;:29;;::::1;::::0;::::1;::::0;28253:18:46;;;;;47804:14:43;;47753:77;;;;;:29;:77:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47748:145;;47857:21;;-1:-1:-1::0;;;47857:21:43::1;;;;;;;;;;;47748:145;47906:14;47917:2;47906:10;:14::i;:::-;46924:1007;46883:1048;46919:3;;46883:1048;;;;46780:1157;1281:20:13::0;:18;:20::i;7222:499:42:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;7308:10:42::1;7321:14:::0;;;:6:::1;:14;::::0;;;;;::::1;;::::0;7349:8;;;7345:40:::1;;7366:19;;-1:-1:-1::0;;;7366:19:42::1;;;;;;;;;;;7345:40;7405:3;7399:9;;:3;:9;;;7395:35;;;7417:13;;-1:-1:-1::0;;;7417:13:42::1;;;;;;;;;;;7395:35;7450:17;::::0;;;:9:::1;:17;::::0;;;;;::::1;::::0;;::::1;7444:23:::0;;::::1;;7440:51;;;7476:15;;-1:-1:-1::0;;;7476:15:42::1;;;;;;;;;;;7440:51;7505:8;::::0;::::1;::::0;;:30:::1;;-1:-1:-1::0;1932:8:42::1;7517:18;::::0;::::1;;7505:30;7501:55;;;7544:12;;-1:-1:-1::0;;;7544:12:42::1;;;;;;;;;;;7501:55;7566:13;7582:29;7608:3:::0;7589:15:::1;7582:29;:::i;:::-;7638:32;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;7621:14:42;;;:6:::1;:14:::0;;;;;:49;;;;;;;;::::1;::::0;::::1;-1:-1:-1::0;;7621:49:42;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;7685:29;;18805:40:46;;;18861:18;;;18854:53;7638:32:42;;-1:-1:-1;7621:14:42;;7685:29:::1;::::0;18778:18:46;7685:29:42::1;18635:278:46::0;3415:156:0;3470:6;3495:18;;-1:-1:-1;;;3495:18:0;;;;:69;;-1:-1:-1;3562:1:0;;3415:156::o;3495:69::-;-1:-1:-1;;;;3516:36:0;3415:156::o;42697:531:43:-;42763:12;42791:10;-1:-1:-1;;;;;42813:11:43;42791:34;;42787:63;;42834:16;;-1:-1:-1;;;42834:16:43;;;;;;;;;;;42787:63;43085:105;;;;;;;;43115:11;;;;;;43085:105;;43140:18;;;43085:105;;;;43171:17;;;-1:-1:-1;;;;;43171:17:43;43085:105;;;;;;;42867:354;;42899:7;;42920:10;;42944:15;;42973:12;;42999:17;;43030:16;;43060:11;;43204:7;;42867:18;:354::i;13517:365::-;13573:15;13647:14;;;:10;:14;;;;;13676;;;;13573:15;;13647:14;-1:-1:-1;;;13676:14:43;;;;13671:34;;-1:-1:-1;13700:1:43;;;;-1:-1:-1;13517:365:43;-1:-1:-1;;13517:365:43:o;13671:34::-;13796:19;;;;;;;;;;;-1:-1:-1;;;;;13796:19:43;;;;;;;;;;;;;;;;-1:-1:-1;;;13796:19:43;;;;;;;;;;;-1:-1:-1;;;13796:19:43;;;;;;;;;;;;;;;;;;;;;496:24:38;13734:141:43;;13783:11;;13819:20;;;;;;;;;13841;;;;;13734:31;:141::i;:::-;13715:160;;;;;13517:365;;;:::o;28400:2140::-;1239:21:13;:19;:21::i;:::-;28669:9:43::1;-1:-1:-1::0;;;;;28669:14:43::1;28682:1;28669:14:::0;28665:42:::1;;28692:15;;-1:-1:-1::0;;;28692:15:43::1;;;;;;;;;;;28665:42;-1:-1:-1::0;;;;;28721:16:43;::::1;28717:42;;28746:13;;-1:-1:-1::0;;;28746:13:43::1;;;;;;;;;;;28717:42;28849:8;28831:15;:26;28827:56;;;28866:17;;-1:-1:-1::0;;;28866:17:43::1;;;;;;;;;;;28827:56;28893:14;28903:3;28893:9;:14::i;:::-;28917:10;28930:41;28938:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;28950:9;28961;28930:7;:41::i;:::-;28917:54;;28982:14;28993:2;28982:10;:14::i;:::-;29006:27;29018:2;29022:10;29006:11;:27::i;:::-;29044:29;29076:14:::0;;;:10:::1;:14;::::0;;;;;;;29091:10:::1;29076:26:::0;;;;;;;29313:15;;29284:9:::1;:21:::0;;;;;:25;;;;;;;;;;29076:26;;29044:29;29276:52:::1;::::0;-1:-1:-1;;;;;29313:15:43;;::::1;::::0;29276:52:::1;:::i;:::-;29257:71;;29353:9;-1:-1:-1::0;;;;;29342:20:43::1;:8;-1:-1:-1::0;;;;;29342:20:43::1;;29338:290;;;29378:18;29399:20;29411:8:::0;29399:9;:20:::1;:::i;:::-;29433:29:::0;;29378:41;;-1:-1:-1;29378:41:43;;29433:8;;:15:::1;::::0;:29:::1;::::0;29378:41;;-1:-1:-1;;;;;29433:29:43::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;29433:29:43::1;;;;;-1:-1:-1::0;;;;;29433:29:43::1;;;;;;29552:10;29525:7;:11;29533:2;29525:11;;;;;;;;;;;:23;;;:37;;;;;;;;;;-1:-1:-1::0;;;;;29525:37:43::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;29525:37:43::1;;;;;-1:-1:-1::0;;;;;29525:37:43::1;;;;;;29602:2;29590:10;-1:-1:-1::0;;;;;29581:36:43::1;;29606:10;29581:36;;;;;-1:-1:-1::0;;;;;26018:47:46;;;;26000:66;;25988:2;25973:18;;25854:218;29581:36:43::1;;;;;;;;29364:264;29338:290;29637:32;29643:10;29655:2;29659:9;-1:-1:-1::0;;;;;29637:32:43::1;:5;:32::i;:::-;29679:11;::::0;;;:7:::1;:11;::::0;;;;:36;;29706:9;;29679:11;:36:::1;::::0;29706:9;;-1:-1:-1;;;;;29679:36:43::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;29679:36:43;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;30326:11:43;;;:7:::1;:11;::::0;;;;:23;;;::::1;:28:::0;;;-1:-1:-1;30322:59:43::1;;30356:11;::::0;;;:7:::1;:11;::::0;;;;:20:::1;;:25:::0;;30380:1:::1;::::0;30356:20;::::1;::::0;:25:::1;::::0;30380:1;;-1:-1:-1;;;30356:25:43;::::1;-1:-1:-1::0;;;;;30356:25:43::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;30356:25:43::1;;;;;-1:-1:-1::0;;;;;30356:25:43::1;;;;;;30322:59;30391:91;30399:3:::0;30404:9;30415;30426:27:::1;-1:-1:-1::0;;;;;30434:18:43;::::1;30426:27;:::i;:::-;30455:2;30459:10;30471;30391:7;:91::i;:::-;30497:36;::::0;-1:-1:-1;;;;;26018:47:46;;26000:66;;30519:2:43;;30507:10:::1;::::0;30497:36:::1;::::0;25988:2:46;25973:18;30497:36:43::1;;;;;;;28655:1885;;;1281:20:13::0;:18;:20::i;:::-;28400:2140:43;;;;;;;;:::o;55042:119::-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;55130:24:::2;55145:8;55130:14;:24::i;:::-;1281:20:13::0;:18;:20::i;:::-;55042:119:43;:::o;48753:1651::-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;-1:-1:-1;;;;;48824:18:43;::::1;::::0;48820:1517:::1;;49341:4;-1:-1:-1::0;;;;;49341:16:43::1;;49361:1;49341:21:::0;49337:53:::1;;49371:19;;-1:-1:-1::0;;;49371:19:43::1;;;;;;;;;;;49337:53;49408:72;::::0;-1:-1:-1;;;49408:72:43;;49446:4:::1;49408:72;::::0;::::1;28280:51:46::0;49453:1:43::1;28347:18:46::0;;;28340:34;;;28390:18;;;28383:34;-1:-1:-1;;;;;49408:29:43;::::1;::::0;::::1;::::0;28253:18:46;;49408:72:43::1;;;;;;;;;;;;;;;;;;-1:-1:-1::0;49408:72:43::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;49408:72:43::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;49404:172;;49542:19;;-1:-1:-1::0;;;49542:19:43::1;;;;;;;;;;;49404:172;-1:-1:-1::0;50174:57:43::1;::::0;-1:-1:-1;;;50174:57:43;;50227:1:::1;50174:57;::::0;::::1;668:25:46::0;-1:-1:-1;;;;;50174:32:43;::::1;::::0;::::1;::::0;641:18:46;;50174:57:43::1;;;;;;;;;;;;;;;;;;-1:-1:-1::0;50174:57:43::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;50174:57:43::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;50170:157;;50293:19;;-1:-1:-1::0;;;50293:19:43::1;;;;;;;;;;;50170:157;50232:17;50170:157;50346:10;:17:::0;;-1:-1:-1;;;;;;50346:17:43::1;-1:-1:-1::0;;;;;50346:17:43;::::1;::::0;;::::1;::::0;;;50378:19:::1;::::0;7856:51:46;;;50378:19:43::1;::::0;7844:2:46;7829:18;50378:19:43::1;7695:218:46::0;38060:125:43;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;38151:27:::2;38169:8;38151:17;:27::i;16935:757::-:0;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;1239:21:13::1;:19;:21::i;:::-;17057:25:43::2;17070:11;;17057:12;:25::i;:::-;17577:9;::::0;17588:17:::2;::::0;17533:73:::2;::::0;17563:12;;-1:-1:-1;;;;;17577:9:43;;::::2;::::0;17588:17;;;::::2;;17533:29;:73::i;:::-;17517:13;:89:::0;;-1:-1:-1;;;;;;17517:89:43;;::::2;-1:-1:-1::0;;;;;17517:89:43;;::::2;;::::0;;;17616:11:::2;:26:::0;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;17657:28:::2;::::0;7856:51:46;;;17657:28:43::2;::::0;7844:2:46;7829:18;17657:28:43::2;7695:218:46::0;54112:116:43;54174:6;54199:22;54218:2;54199:18;:22::i;37039:922::-;1239:21:13;:19;:21::i;:::-;37488:6:43::1;-1:-1:-1::0;;;;;37488:11:43::1;37498:1;37488:11:::0;37484:36:::1;;37508:12;;-1:-1:-1::0;;;37508:12:43::1;;;;;;;;;;;37484:36;37530:14;37540:3;37530:9;:14::i;:::-;37554:10;37567:41;37575:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;37587:9;37598;37567:7;:41::i;:::-;37554:54;;37618:14;37629:2;37618:10;:14::i;:::-;37710:27;37722:2;37726:10;37710:11;:27::i;:::-;37747:29;37779:14:::0;;;:10:::1;:14;::::0;;;;;;;37794:10:::1;37779:26:::0;;;;;;;37815:25;;37779:26;;37834:6;;37779:26;;37747:29;37815:25:::1;::::0;37834:6;;-1:-1:-1;;;;;37815:25:43::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;37815:25:43::1;;;;;-1:-1:-1::0;;;;;37815:25:43::1;;;;;;37901:6;37874:7;:11;37882:2;37874:11;;;;;;;;;;;:23;;;:33;;;;;;;;;;-1:-1:-1::0;;;;;37874:33:43::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;37874:33:43::1;;;;;-1:-1:-1::0;;;;;37874:33:43::1;;;;;;37943:2;37931:10;-1:-1:-1::0;;;;;37922:32:43::1;;37947:6;37922:32;;;;;-1:-1:-1::0;;;;;26018:47:46;;;;26000:66;;25988:2;25973:18;;25854:218;37922:32:43::1;;;;;;;;37150:811;;1281:20:13::0;:18;:20::i;4576:879:42:-;4681:6;3190:10;-1:-1:-1;;;;;3212:11:42;3190:34;;3186:63;;3233:16;;-1:-1:-1;;;3233:16:42;;;;;;;;;;;3186:63;4704:22:::1;:7;::::0;;;::::1;::::0;::::1;;:::i;:::-;:20;;1379:24:29::0;;552:8;1379:24;;1298:112;4704:22:42::1;4699:55;;4735:19;;-1:-1:-1::0;;;4735:19:42::1;;;;;;;;;;;4699:55;4768:6;:18;4775:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;4768:18:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;4768:18:42;;;;::::1;;:23:::0;;4764:55:::1;;4800:19;;-1:-1:-1::0;;;4800:19:42::1;;;;;;;;;;;4764:55;5320:29;:13;;::::0;::::1;:3:::0;:13:::1;:::i;:29::-;:50;;;;-1:-1:-1::0;5353:17:42;5320:50:::1;5316:83;;;5379:20;;-1:-1:-1::0;;;5379:20:42::1;;;;;;;;;;;5316:83;-1:-1:-1::0;;;;4576:879:42;;;;;:::o;10975:180:43:-;11062:7;11117:6;11125:9;11136;11106:40;;;;;;;;;29603:25:46;;;29675:1;29664:21;;;29659:2;29644:18;;29637:49;29722:21;;29717:2;29702:18;;29695:49;29591:2;29576:18;;29382:368;11106:40:43;;;;-1:-1:-1;;11106:40:43;;;;;;;;;11096:51;;11106:40;11096:51;;;;;10975:180;-1:-1:-1;;;;10975:180:43:o;53884:134::-;-1:-1:-1;;;;;;;;;;;;;;;;;53988:16:43;54005:5;53988:23;;;;;;;;:::i;:::-;;;;;;;;;;53981:30;;;;;;;;;53988:23;;53981:30;-1:-1:-1;;;;;53981:30:43;;;;-1:-1:-1;;;53981:30:43;;;;;;;;;;;;;-1:-1:-1;;53884:134:43:o;39946:764::-;40122:4;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;40409:6:::2;40419:1;40409:11:::0;40405:36:::2;;40429:12;;-1:-1:-1::0;;;40429:12:43::2;;;;;;;;;;;40405:36;40451:38;40470:6;40478:2;40482:6;40451:18;:38::i;:::-;40499:14;40510:2;40499:10;:14::i;:::-;40580:23;40592:2;40596:6;40580:11;:23::i;:::-;40613:25;40625:2;40629:8;40613:11;:25::i;:::-;40655:48;40674:6;40682:8;40692:2;40696:6;40655:18;:48::i;:::-;40648:55;;1281:20:13::0;:18;:20::i;:::-;39946:764:43;;;;;;:::o;1965:315:13:-;2119:25;:23;:25::i;:::-;2219:54;2268:4;-1:-1:-1;;;;;;;;;;;2219:41:13;:48;;:54::i;:::-;1965:315::o;40716:203:43:-;40838:14;;;;:10;:14;;;;;;;;-1:-1:-1;;;;;40838:21:43;;;;;;;;;:28;40815:9;:16;;;;;:20;;;;;;;;;;40869:6;;40815:51;;-1:-1:-1;;;;;40838:28:43;;;;40815:51;:::i;:::-;:60;40811:101;;;40884:28;;-1:-1:-1;;;40884:28:43;;;;;;;;;;;20285:956;20336:26;20365:14;;;:10;:14;;;;;;;;;20336:43;;;;;;;;;-1:-1:-1;;;;;20336:43:43;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20336:43:43;;;;;;;;-1:-1:-1;;;20336:43:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20336:43:43;;;;;;;-1:-1:-1;20336:43:43;;;;20393:47;;-1:-1:-1;20412:11:43;;;;:7;:11;;;;;:23;-1:-1:-1;;;;;20412:23:43;:28;20393:47;20389:432;;;-1:-1:-1;20766:16:43;:23;20735:21;;;;:17;:21;;;;;;:55;;-1:-1:-1;;20735:55:43;-1:-1:-1;;;;;20735:55:43;;;;;;;;;20285:956::o;20389:432::-;21014:220;21038:10;:14;;;21066:10;:20;;;21100:10;:20;;;21134:1;21157:4;-1:-1:-1;;;;;21207:17:43;21014:10;:220::i;54786:163::-;54874:11;;;;:7;:11;;;;;;;;54887:10;:14;;;;;-1:-1:-1;;;;;54887:21:43;;;;;;;;;54910:9;:16;;;;;:20;;;;;;;;;54853:89;;54874:11;54887:21;54902:5;54882:2;54853:20;:89::i;1178:282:16:-;1292:10;1266:4;1282:21;;;:9;:21;;;;;;;;:25;;;;;;;;:35;;1311:6;;1282:25;1266:4;;1282:35;;1311:6;;1282:35;:::i;:::-;;;;-1:-1:-1;;;;;;;1328:19:16;;;;;;:9;:19;;;;;;;;:23;;;;;;;;:33;;1355:6;;1328:19;:33;;1355:6;;1328:33;:::i;:::-;;;;-1:-1:-1;;1377:54:16;;;1398:10;30062:51:46;;;30144:2;30129:18;;30122:34;;;1420:2:16;;-1:-1:-1;;;;;1377:54:16;;;-1:-1:-1;;;;;;;;;;;1377:54:16;30035:18:46;1377:54:16;29888:274:46;2286:110:13;2334:55;2383:5;-1:-1:-1;;;;;;;;;;;2334:41:13;1666:115:14;4083:594:0;4171:14;4187:12;4203:144;4248:11;2928:7;2954:10;-1:-1:-1;;;;;2954:10:0;;2878:93;4248:11;4273:6;4301:4;4327:9;4334:1;4332;4327:4;;:9;:::i;:::-;4320:17;;;:::i;:::-;4203:31;:144::i;:::-;4170:177;;;;4362:9;4357:314;;4391:9;;;;4387:274;;4420:18;:25;;-1:-1:-1;;;;4420:25:0;;-1:-1:-1;;;4420:25:0;;;;4463:60;;-1:-1:-1;;;4463:60:0;;-1:-1:-1;;;;;2954:10:0;;;;4463:46;;:60;;4510:6;;4518:4;;;;4463:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4562:5:0;4541:26;;-1:-1:-1;;;;4541:26:0;;;-1:-1:-1;4387:274:0;;-1:-1:-1;4387:274:0;;4613:33;;-1:-1:-1;;;4613:33:0;;-1:-1:-1;;;;;7874:32:46;;4613:33:0;;;7856:51:46;7829:18;;4613:33:0;7695:218:46;16702:227:43;16780:9;16775:148;16795:21;;;16775:148;;;16837:32;16855:10;;16866:1;16855:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16837:17;:32::i;:::-;16883:29;16898:10;;16909:1;16898:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16883:14;:29::i;:::-;16818:3;;16775:148;;12944:994:45;13152:20;3078:4;13188:23;;;;13184:53;;;13220:17;;-1:-1:-1;;;13220:17:45;;;;;;;;;;;13184:53;13251:8;;;;;;;:35;;-1:-1:-1;;;;;;13263:23:45;;;13251:35;13247:65;;;13295:17;;-1:-1:-1;;;13295:17:45;;;;;;;;;;;13247:65;13347:4;-1:-1:-1;;;;;13326:26:45;;;13322:56;;13361:17;;-1:-1:-1;;;13361:17:45;;;;;;;;;;;13322:56;-1:-1:-1;;;;;13392:23:45;;;;;;:51;;;13432:11;-1:-1:-1;;;;;13419:24:45;:9;-1:-1:-1;;;;;13419:24:45;;13392:51;13388:81;;;13452:17;;-1:-1:-1;;;13452:17:45;;;;;;;;;;;13388:81;13497:22;;13480:14;-1:-1:-1;;;;;13548:23:45;;;:33;;13578:3;13548:33;;;13574:1;13548:33;13761:65;;;;;;;;;-1:-1:-1;;;;;13792:15:45;13761:65;;;;;;;;;;;;;;;13740:87;;;;;;;-1:-1:-1;13740:87:45;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13740:87:45;-1:-1:-1;;13740:87:45;;;;;;;;;;;;;;13529:52;-1:-1:-1;13854:11:45;;;:44;;;13881:17;13869:29;;:9;:29;;;13854:44;13853:78;;13914:17;13853:78;;;13902:9;13853:78;13837:94;12944:994;-1:-1:-1;;;;;;;;12944:994:45:o;11211:1202::-;11436:6;11559:10;-1:-1:-1;;;;;11559:15:45;11573:1;11559:15;11555:29;;-1:-1:-1;11583:1:45;11576:8;;11555:29;11595:11;-1:-1:-1;;;;;11609:31:45;;;:49;;11647:11;11609:49;;;11643:1;11609:49;11595:63;-1:-1:-1;11668:13:45;11684:23;11706:1;-1:-1:-1;;;;;11684:19:45;;:23;:::i;:::-;11775:22;;11668:39;;-1:-1:-1;11763:9:45;11835:221;11846:5;11842:1;:9;:40;;;;;2964:2;11855:6;:27;11842:40;11835:221;;;11898:29;11930:15;11946:5;11950:1;11946;:5;:::i;:::-;11930:22;;;;;;;;:::i;:::-;;;;;;;;;;11970:10;;11930:22;;-1:-1:-1;11970:17:45;;;;-1:-1:-1;;;11970:10:45;;;;:17;11966:40;;;11996:10;;-1:-1:-1;;;11996:10:45;;;;;-1:-1:-1;11966:40:45;12020:3;;;;:::i;:::-;;;;12037:8;;;;;:::i;:::-;;;;11884:172;11835:221;;;12074:5;12069:1;:10;12065:27;;12088:4;12081:11;;;;;;;;12065:27;12342:18;12377:13;;;;;;;;:29;;12402:4;12377:29;;;12393:6;12377:29;12370:36;;;;;;;11211:1202;;;;;;;;:::o;8189:1558:42:-;8287:6;4051:17:40;;;:9;:17;;;;;;;;;8419:6:42;:14;;;;;8400:33;;;;;;;;;4051:17:40;8400:33:42;;;;;;;;;;;;;;;;;4051:17:40;;;;8400:33:42;8592:15;-1:-1:-1;8574:897:42;;;8629:8;;;9241:17;;;:9;:17;;;;;;8623:14;;;;;-1:-1:-1;9241:17:42;;;;9346:6;9311:30;2679:4;9346:6;9311:30;:::i;:::-;9297:45;;;;:10;:45;:::i;:::-;9296:56;;;;:::i;:::-;9272:80;;9379:13;9370:6;:22;9366:50;;;9403:13;9394:22;;9366:50;9440:6;9434:3;:12;9430:30;;;9454:6;9448:12;;9430:30;8609:862;;8574:897;9480:11;9494:14;;;:6;:14;;;;;;;;9522:9;;;9518:24;;;9539:3;9533:9;;9518:24;-1:-1:-1;9736:3:42;;8189:1558;-1:-1:-1;;;;;8189:1558:42:o;19390:635:43:-;19489:4;19467:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19459:35:43;;;:62;;;-1:-1:-1;19498:6:43;:18;19505:10;:8;;;;;;;:3;:8;:::i;:10::-;19498:18;;;;;;;;;;;-1:-1:-1;19498:18:43;;;;:23;19459:62;19455:94;;;19530:19;;-1:-1:-1;;;19530:19:43;;;;;;;;;;;19455:94;19939:29;:13;;;;:3;:13;:::i;:29::-;:50;;;;-1:-1:-1;19972:17:43;19939:50;19935:83;;;19998:20;;-1:-1:-1;;;19998:20:43;;;;;;;;;;;3098:198:16;-1:-1:-1;;;;;3186:19:16;;;;;;:9;:19;;;;;;;;:23;;;;;;;;:33;;3213:6;;3186:19;:33;;3213:6;;3186:33;:::i;:::-;;;;-1:-1:-1;;3235:54:16;;;3244:10;30062:51:46;;30144:2;30129:18;;30122:34;;;3278:2:16;;-1:-1:-1;;;;;3235:54:16;;;3264:1;;-1:-1:-1;;;;;;;;;;;3235:54:16;30035:18:46;3235:54:16;;;;;;;;3098:198;;;:::o;41177:329:43:-;41412:87;;;;;;;;41423:3;41412:87;:::i;:::-;41428:9;41439;41450:14;41466:4;41472:12;41486;41412:10;:87::i;16868:305:45:-;17101:10;;;;;;;;;;;;17113:13;;;;;;17141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17086:80;;17101:10;17128:11;;17086:14;:80::i;26286:232:43:-;26348:21;26330:15;26383:12;;;26379:25;;26397:7;26286:232::o;26379:25::-;26431:35;;26414:12;;26431:10;;26454:7;;26414:12;26431:35;26414:12;26431:35;26454:7;26431:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26413:53;;;26481:7;26476:35;;26497:14;;-1:-1:-1;;;26497:14:43;;;;;;;;;;;9940:621:42;10028:8;;;;;:34;;;10046:16;10040:22;;:3;:22;;;10028:34;10024:62;;;10071:15;;-1:-1:-1;;;10071:15:42;;;;;;;;;;;10024:62;2814:3;10430:20;;;;;:35;;;10462:3;10454:11;;:5;:11;;;10430:35;10426:63;;;10474:15;;-1:-1:-1;;;10474:15:42;;;;;;;;;;;10426:63;10499:14;;;;:6;:14;;;;;;;;:20;;-1:-1:-1;;10499:20:42;;;;;;;;;;;10529:9;:17;;;;;;:25;;;;;;;;;;9940:621::o;51379:129:43:-;51442:6;51479:21;;;:17;:21;;;;;;51467:34;;-1:-1:-1;;;;;51479:21:43;51467:11;:34::i;42212:202::-;42334:73;42351:11;42364:9;42375;42386:7;42395;42404:2;42334:16;:73::i;3759:149:0:-;3831:10;:25;;-1:-1:-1;;;;;;3831:25:0;-1:-1:-1;;;;;3831:25:0;;;;;;;;3871:30;;7856:51:46;;;3871:30:0;;7844:2:46;7829:18;3871:30:0;7695:218:46;24005:1136:45;24490:12;24515:13;;24554:36;;;;24565:7;24554:36;:::i;:::-;24514:76;;-1:-1:-1;24514:76:45;-1:-1:-1;24614:13:45;24604:6;:23;;;;;;;;:::i;:::-;;24600:267;;24643:20;24677:7;24666:33;;;;;;;;;;;;:::i;:::-;24643:56;;24713:53;24721:11;24734:2;:12;;;24748:2;:10;;;24760:2;:5;;;24713:7;:53::i;:::-;24780;24788:11;24801:2;:12;;;24815:2;:10;;;24827:2;:5;;;24780:7;:53::i;:::-;24847:9;;;;;;;;;;;;;;;;;;;24600:267;24876:239;24899:6;24919:9;24942:15;24971:12;24997:17;25028:15;25057:11;25082:2;25098:7;24876:9;:239::i;:::-;25125:9;;;;;;;;;;;;;;;;24005:1136;;;;;;;;;;;;;:::o;13381:1465:34:-;13527:28;13557;13602;13632;13664:36;13684:7;13693:6;13664:19;:36::i;:::-;13601:99;;;;13712:34;13748;13798:51;13822:7;13831:6;13839:9;13798:23;:51::i;:::-;13711:138;;;;13860:34;13896;13946:51;13970:7;13979:6;13987:9;13946:23;:51::i;:::-;13859:138;;;;14010:17;14033:25;14042:7;14051:6;14033:8;:25::i;:::-;14007:51;;;;;14110:9;14096:23;;:11;:23;;;14092:738;;;14191:26;14162;:55;14139:78;;14287:26;14258;:55;14235:78;;14092:738;;;14353:9;14338:24;;:11;:24;;;14334:496;;14434:26;14405;:55;14382:78;;14530:26;14501;:55;14478:78;;14334:496;;;14670:26;14641;14618:20;:49;:78;14595:101;;14789:26;14760;14737:20;:49;:78;14714:101;;14334:496;13591:1255;;;;;;;13381:1465;;;;;;;:::o;3302:192:16:-;-1:-1:-1;;;;;3388:17:16;;;;;;:9;:17;;;;;;;;:21;;;;;;;;:31;;3413:6;;3388:17;:31;;3413:6;;3388:31;:::i;:::-;;;;-1:-1:-1;;3435:52:16;;;3444:10;30062:51:46;;30144:2;30129:18;;30122:34;;;3476:2:16;;3472:1;;-1:-1:-1;;;;;3435:52:16;;;-1:-1:-1;;;;;;;;;;;3435:52:16;30035:18:46;3435:52:16;29888:274:46;55237:148:43;55299:79;55323:12;55337:11;55350:8;55360:17;;;;;;;;;-1:-1:-1;;;;;55360:17:43;55299:23;:79::i;6648:1167:41:-;-1:-1:-1;;;;;6727:22:41;;4998:58:37;6722:109:41;;6767:33;6791:8;6767:23;:33::i;6722:109::-;-1:-1:-1;;;;;6857:25:41;;6840:14;6857:25;;;:15;:25;;;;;;;6896:11;;;6892:24;;6909:7;6648:1167;:::o;6892:24::-;6938:11;;-1:-1:-1;;;;;6938:11:41;;6959:29;;6981:7;;6648:1167;:::o;6959:29::-;-1:-1:-1;;;;;7045:25:41;;7073:1;7045:25;;;:15;:25;;;;;:29;;;7238:75;;7255:11;;7061:8;;;;7288:6;;7307:4;7238:16;:75::i;:::-;7323:4;-1:-1:-1;;;;;7323:12:41;;7343:6;7323:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7362:46:41;;-1:-1:-1;;;;;;;7377:4:41;7362:34;;-1:-1:-1;7397:2:41;;-1:-1:-1;7401:6:41;7362:34;:46::i;:::-;7729:2;-1:-1:-1;;;;;7702:38:41;7719:8;-1:-1:-1;;;;;7702:38:41;;7733:6;7702:38;;;;668:25:46;;656:2;641:18;;522:177;7702:38:41;;;;;;;;7794:4;-1:-1:-1;;;;;7755:53:41;7782:2;-1:-1:-1;;;;;7755:53:41;;7801:6;7755:53;;;;668:25:46;;656:2;641:18;;522:177;7755:53:41;;;;;;;;6712:1103;;6648:1167;:::o;14514:677:45:-;14658:21;-1:-1:-1;;;;;14699:26:45;;14695:49;;-1:-1:-1;14742:1:45;14727:17;;14695:49;14774:9;-1:-1:-1;;;;;14758:25:45;:12;-1:-1:-1;;;;;14758:25:45;;14754:51;;14792:13;;-1:-1:-1;;;14792:13:45;;;;;;;;;;;14754:51;14835:17;-1:-1:-1;;;;;14819:33:45;:12;-1:-1:-1;;;;;14819:33:45;;14815:59;;14861:13;;-1:-1:-1;;;14861:13:45;;;;;;;;;;;14815:59;14912:4;-1:-1:-1;;;;;14888:29:45;;;14884:55;;14926:13;;-1:-1:-1;;;14926:13:45;;;;;;;;;;;14884:55;14968:12;-1:-1:-1;;;;;14953:31:45;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14953:33:45;;;;;;;;-1:-1:-1;;14953:33:45;;;;;;;;;;;;:::i;:::-;;;14949:236;;15151:23;;-1:-1:-1;;;15151:23:45;;;;;;;;;;;14949:236;-1:-1:-1;;;;;15031:21:45;;15027:57;;15061:23;;-1:-1:-1;;;15061:23:45;;;;;;;;;;;15027:57;15105:7;-1:-1:-1;15098:14:45;;1466:541:16;1574:4;1594:10;-1:-1:-1;;;;;1594:20:16;;;;;;:55;;-1:-1:-1;;;;;;1619:18:16;;;;;;:10;:18;;;;;;;;1638:10;1619:30;;;;;;;;;;1618:31;1594:55;1590:237;;;-1:-1:-1;;;;;1683:17:16;;1665:15;1683:17;;;:9;:17;;;;;;;;1701:10;1683:29;;;;;;;:33;;;;;;;;;-1:-1:-1;;1734:28:16;;1730:86;;1800:16;1810:6;1800:7;:16;:::i;:::-;-1:-1:-1;;;;;1764:17:16;;;;;;:9;:17;;;;;;;;1782:10;1764:29;;;;;;;:33;;;;;;;;:52;1730:86;1651:176;1590:237;-1:-1:-1;;;;;1837:17:16;;;;;;:9;:17;;;;;;;;:21;;;;;;;;:31;;1862:6;;1837:17;:31;;1862:6;;1837:31;:::i;:::-;;;;-1:-1:-1;;;;;;;1879:19:16;;;;;;:9;:19;;;;;;;;:23;;;;;;;;:33;;1906:6;;1879:19;:33;;1906:6;;1879:33;:::i;:::-;;;;-1:-1:-1;;1928:50:16;;;1937:10;30062:51:46;;30144:2;30129:18;;30122:34;;;1967:2:16;;-1:-1:-1;;;;;1928:50:16;;;;;;;;-1:-1:-1;;;;;;;;;;;1928:50:16;30035:18:46;1928:50:16;;;;;;;-1:-1:-1;1996:4:16;1466:541;;;;;;:::o;1802:157:13:-;-1:-1:-1;;;;;;;;;;;3375:11:14;1860:93:13;;;1912:30;;-1:-1:-1;;;1912:30:13;;;;;;;;;;;3491:139:14;3608:5;3602:4;3595:19;3491:139;;:::o;41512:459:43:-;41748:11;-1:-1:-1;;;;;41748:18:43;;41808:13;41850:89;;;;;;;;41863:3;41850:89;;;;41868:9;41850:89;;;;;;41879:9;41850:89;;;;;;41890:14;41850:89;;;;41906:4;-1:-1:-1;;;;;41850:89:43;;;;;41912:12;-1:-1:-1;;;;;41850:89:43;;;;;41926:12;-1:-1:-1;;;;;41850:89:43;;;;41839:101;;;;;;;;:::i;:::-;;;;-1:-1:-1;;41839:101:43;;;;;;;;;;41780:174;;;41839:101;41780:174;;:::i;:::-;;;;;;;;;;;;;41748:216;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41748:216:43;;;;;;;;;;;;:::i;21917:1606:45:-;22132:15;;22103:16;;22122:25;;-1:-1:-1;;;;;22132:15:45;22122:7;:25;:::i;:::-;22103:44;-1:-1:-1;22161:13:45;;22157:274;;22216:81;22232:8;22262;:24;;;22242:5;:17;;;:44;;;;:::i;:::-;-1:-1:-1;;;22216:15:45;:81::i;:::-;22190:108;;;;:14;;:108;;;;-1:-1:-1;;;22190:108:45;;-1:-1:-1;;;;;22190:108:45;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;22190:108:45;;;;;-1:-1:-1;;;;;22190:108:45;;;;;;22338:81;22354:8;22384;:24;;;22364:5;:17;;;:44;;;;:::i;22338:81::-;22312:14;;;:108;;:14;;:108;;;;-1:-1:-1;;;;;22312:108:45;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;22312:108:45;;;;;-1:-1:-1;;;;;22312:108:45;;;;;;22157:274;22467:17;;;;22440:24;;;;:44;;;;22521:17;;;22494:24;;;:44;22921:15;;-1:-1:-1;;;;;22921:15:45;22950:11;;22946:445;;22977:10;22990:88;23006:6;-1:-1:-1;;;;;22990:88:45;23037:8;:30;;;23014:5;:20;;;:53;;;;:::i;22990:88::-;22977:101;;23092:10;23105:88;23121:6;-1:-1:-1;;;;;23105:88:45;23152:8;:30;;;23129:5;:20;;;:53;;;;:::i;23105:88::-;23092:101;-1:-1:-1;23211:7:45;;;;:18;;-1:-1:-1;23222:7:45;;;23211:18;23207:174;;;23270:2;23249:8;:17;;;:23;;;;;;;:::i;:::-;;;;;;;;23311:2;23290:8;:17;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;23336:30:45;;;18556:25:46;;;18612:2;18597:18;;18590:34;;;23355:2:45;;-1:-1:-1;;;;;23336:30:45;;;;;18529:18:46;23336:30:45;;;;;;;23207:174;22963:428;;22946:445;23433:5;:20;;;23400:8;:30;;:53;;;;23496:5;:20;;;23463:8;:30;;:53;;;;22093:1430;;21917:1606;;;;;:::o;591:782:1:-;806:62;;-1:-1:-1;;;;;37434:32:46;;;806:62:1;;;37416:51:46;37503:32;;37483:18;;;37476:60;-1:-1:-1;;;;;;37572:33:46;;37552:18;;;37545:61;746:14:1;;;;;;37389:18:46;;806:62:1;;;-1:-1:-1;;806:62:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;806:62:1;-1:-1:-1;;;806:62:1;;;-1:-1:-1;918:18:1;;;949;;;;1030:11;;806:62;;-1:-1:-1;806:62:1;;-1:-1:-1;;1002:9:1;995:5;984:70;981:376;;;1092:4;1086:11;1129:4;1123:11;;1086;;-1:-1:-1;1327:14:1;;;1320:22;1309:34;;-1:-1:-1;981:376:1;904:463;591:782;;;;;;;:::o;17552:369:45:-;17732:19;;;:24;;17755:1;;17732:19;;;:24;;17755:1;;-1:-1:-1;;;;;17732:24:45;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;17732:24:45;;;;;-1:-1:-1;;;;;17732:24:45;;;;;;17767:15;17784;17803:34;17813:10;17825:11;17803:9;:34::i;:::-;17766:71;;;;17847:67;17852:1;:4;;;17858:1;:6;;;17866:1;:6;;;17874:1;:6;;;17882:1;:6;;;17890:7;17899;17908:5;17847:4;:67::i;:::-;17722:199;;17552:369;;;;:::o;31425:393::-;31630:12;;:28;;;;-1:-1:-1;31646:12:45;;31630:28;31660:7;31626:41;31676:11;-1:-1:-1;;;;;31676:18:45;;31719:13;31745:54;;;;;;;;31756:9;-1:-1:-1;;;;;31745:54:45;;;;;31767:9;-1:-1:-1;;;;;31745:54:45;;;;;31778:7;31745:54;;;;31787:7;31745:54;;;;31796:2;-1:-1:-1;;;;;31745:54:45;;;;31734:66;;;;;;;37842:13:46;;-1:-1:-1;;;;;37838:39:46;;;37820:58;;37938:4;37926:17;;;37920:24;37916:50;;37894:20;;;37887:80;38023:4;38011:17;;;38005:24;37983:20;;;37976:54;38086:4;38074:17;;;38068:24;38046:20;;;38039:54;38153:4;38141:17;;;38135:24;38131:50;38109:20;;;38102:80;;;;37807:3;37792:19;;37617:571;31734:66:45;;;;-1:-1:-1;;31734:66:45;;;;;;;;;;31708:93;;;31734:66;31708:93;;:::i;:::-;;;;;;;;;;;;;31676:135;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31676:135:45;;;;;;;;;;;;:::i;30888:252::-;30996:24;;31013:7;30996:24;31029:11;-1:-1:-1;;;;;31029:16:45;;31054:4;31061:15;:8;-1:-1:-1;;;;;31061:13:45;-1:-1:-1;;;;;5144:41:37;;5069:123;31061:15:45;31029:56;;-1:-1:-1;;;;;;31029:56:45;;;;;;;-1:-1:-1;;;;;28298:32:46;;;31029:56:45;;;28280:51:46;28347:18;;;28340:34;28390:18;;;28383:34;;;28253:18;;31029:56:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31095:38:45;;-1:-1:-1;;;31095:38:45;;-1:-1:-1;;;;;38792:32:46;;;31095:38:45;;;38774:51:46;38861:32;;;38841:18;;;38834:60;38910:18;;;38903:34;;;31095:16:45;;;-1:-1:-1;31095:16:45;;-1:-1:-1;38747:18:46;;31095:38:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25315:2461;25799:24;25837:7;25826:35;;;;;;;;;;;;:::i;:::-;25799:62;;25872:24;25898;25926:11;-1:-1:-1;;;;;25926:27:45;;25967:4;:8;;;25989:223;;;;;;;;26053:4;:14;;;25989:223;;;;;;26096:4;:14;;;25989:223;;;;;;26144:4;:19;;;25989:223;;;;26195:1;26187:10;;25989:223;;;25926:312;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25871:367;;;;26523:850;26547:6;26567:9;26590:15;26619:12;26645:17;26676:15;26705:11;26730:633;;;;;;;;26794:15;:4;:8;;;515:4:38;496:24;;;271:265;26794:15:45;26811:4;:14;;;26827:4;:14;;;26783:59;;;;;;;;;29603:25:46;;;29675:1;29664:21;;;29659:2;29644:18;;29637:49;29722:21;;29717:2;29702:18;;29695:49;29591:2;29576:18;;29382:368;26783:59:45;;;;;;;;;;;;;26773:70;;;;;;26765:79;;26730:633;;;;26867:4;:8;;;26730:633;;;;27050:21;:11;2107:3:35;2103:22;;1958:183;27050:21:45;-1:-1:-1;;;;;26730:633:45;;;;;27187:21;:11;2303:2:35;2292:28;;2147:189;27187:21:45;27180:29;;-1:-1:-1;;;;;26730:633:45;;;;;27242:2;:6;;;26730:633;;;;;;27286:2;:13;;;26730:633;;;;;;27336:2;:12;;;-1:-1:-1;;;;;26730:633:45;;;;26523:10;:850::i;:::-;27528:241;27558:11;27583:4;:8;;;27605:11;27630;27655:4;:9;;;27678:4;:19;;;27711:4;:17;;;27742:4;:17;;;27528:16;:241::i;:::-;25789:1987;;;25315:2461;;;;;;;;;:::o;7189:723:34:-;7302:24;7328;7425:17;7445:25;7463:6;7445:17;:25::i;:::-;7425:45;-1:-1:-1;7535:33:34;7579:46;536:1;7425:45;7579:46;:::i;:::-;7708;;-1:-1:-1;;;7708:46:34;;;;;18556:25:46;;;7752:1:34;18597:18:46;;;18590:34;7571:55:34;;-1:-1:-1;7571:55:34;;-1:-1:-1;;;;;7708:16:34;;;;;18529:18:46;;7708:46:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7708:46:34;;;;;;;;;;;;:::i;:::-;7839:2;7829:13;;7823:20;7892:2;7882:13;;;7876:20;7823;;7876;;-1:-1:-1;7189:723:34;-1:-1:-1;;;;;;7189:723:34:o;5904:583::-;6033:29;6064;6109:12;6124:30;6141:6;6149:4;6124:16;:30::i;:::-;6109:45;-1:-1:-1;6248:21:34;-1:-1:-1;;;;;6272:16:34;;;6297:17;6109:45;6313:1;6297:17;:::i;:::-;6272:47;;;;;;-1:-1:-1;;;;;;6272:47:34;;;;;;18556:25:46;;;;6317:1:34;18597:18:46;;;18590:34;18529:18;;6272:47:34;18382:248:46;1580:996:34;1682:20;1704:10;1716:18;1736:12;1821:17;1841:25;1859:6;1841:17;:25::i;:::-;1892:27;;-1:-1:-1;;;1892:27:34;;;;;668:25:46;;;1821:45:34;;-1:-1:-1;1877:12:34;;-1:-1:-1;;;;;1892:16:34;;;;;641:18:46;;1892:27:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1877:42;;-1:-1:-1;;;;;2245:4:34;2241:53;2225:69;;2374:4;2369:3;2365:14;2362:1;2351:29;2343:37;;2464:8;2457:4;2452:3;2448:14;2444:29;2429:44;;2551:8;2544:4;2539:3;2535:14;2531:29;2522:38;;2172:398;;1580:996;;;;;;;:::o;32965:497:45:-;-1:-1:-1;;;;;33185:22:45;;;33168:14;33185:22;;;;;;;;;;;;33221:31;;;;:46;;-1:-1:-1;33256:11:45;;33221:46;33217:59;;;33269:7;;;33217:59;-1:-1:-1;;;;;33285:22:45;;33310:1;33285:22;;;;;;;;;;:26;;;33321:69;;33328:11;;33298:8;;;;33361:6;;33372:17;33321:6;:69::i;:::-;33429:17;-1:-1:-1;;;;;33405:50:45;33419:8;-1:-1:-1;;;;;33405:50:45;;33448:6;33405:50;;;;668:25:46;;656:2;641:18;;522:177;33405:50:45;;;;;;;;33158:304;32965:497;;;;:::o;38836:185:43:-;38976:11;;38989:13;;39004:9;;38909:105;;38936:15;;38953:11;;38966:8;;-1:-1:-1;;;;;38976:11:43;;;;38989:13;;;39004:9;38909:26;:105::i;1290:204:11:-;1377:37;1391:5;1398:2;1402:5;1409:4;1377:13;:37::i;:::-;1372:116;;1437:40;;-1:-1:-1;;;1437:40:11;;-1:-1:-1;;;;;7874:32:46;;1437:40:11;;;7856:51:46;7829:18;;1437:40:11;7695:218:46;741:4141:27;823:14;1212:5;;;823:14;-1:-1:-1;;1216:1:27;1212;1400:20;1473:5;1469:2;1466:13;1458:5;1454:2;1450:14;1446:34;1437:43;;;1633:5;1619:11;:19;1611:28;;;;;;1720:5;1729:1;1720:10;1716:177;;-1:-1:-1;1807:23:27;;;;-1:-1:-1;1865:13:27;;1716:177;2193:17;2293:11;2290:1;2287;2280:25;2701:12;2717:15;;;2716:31;;2869:22;;;;;3776:1;3757;:15;;3756:21;;4019:17;;;4015:21;;4008:28;4081:17;;;4077:21;;4070:28;4144:17;;;4140:21;;4133:28;4207:17;;;4203:21;;4196:28;4270:17;;;4266:21;;4259:28;4334:17;;;4330:21;;;4323:28;3313:12;;;;3309:23;;;3334:1;3305:31;2454:20;;;2443:32;;;3372:12;;;;2501:21;;;;3029:16;;;;3363:21;;;;4827:11;;;;;-1:-1:-1;;741:4141:27;;;;;:::o;18073:291:45:-;18278:19;;;;;;;;;;;-1:-1:-1;;;;;18278:19:45;;;;;;;;;;;;;;;;-1:-1:-1;;;18278:19:45;;;;;;;;;;;-1:-1:-1;;;18278:19:45;;;;;;;;;;;;;;;;;;;;;496:24:38;-1:-1:-1;;;;18216:141:45;;18265:11;;18301:20;;;;;;;;;18323;;;;;18216:31;:141::i;:::-;18197:160;;;;18073:291;;;;;;:::o;18735:586::-;19085:20;;;;19119;;;;19195:17;;19257:19;;;;18970:344;;;44191:25:46;;;44247:2;44232:18;;44225:34;;;44275:18;;;44268:34;;;44333:2;44318:18;;44311:34;;;44376:3;44361:19;;44354:35;;;;44420:3;44405:19;;44398:35;;;;44464:3;44449:19;;44442:35;;;44508:3;44493:19;;44486:35;;;-1:-1:-1;;;;;19195:17:45;;;44552:3:46;44537:19;;44530:76;-1:-1:-1;;;19226:17:45;;;;44637:3:46;44622:19;;44615:76;-1:-1:-1;;;;;19257:19:45;;;44722:3:46;44707:19;;44700:61;-1:-1:-1;;;19290:14:45;;;;44792:3:46;44777:19;;44770:61;18997:2:45;;18970:344;;44178:3:46;44163:19;18970:344:45;;;;;;;18735:586;;;;;;;;:::o;4698:1317::-;5525:4;;5449:13;5507:23;;;;;;;;;;;5532:19;;;;5553:13;;;;5568:20;;;;5465:133;;5490:15;;-1:-1:-1;;;;;5507:23:45;;;;5532:19;;5465:11;:133::i;:::-;5641:22;;5626:4;;5608:23;;;;;;;;;;;;;:56;;-1:-1:-1;;5608:56:45;-1:-1:-1;;;;;5608:56:45;;;;;;;;;;5678:6;;;5449:149;;-1:-1:-1;;;;;;5678:11:45;;:26;;;;-1:-1:-1;5693:6:45;;;;-1:-1:-1;;;;;5693:11:45;;5678:26;5674:39;;;5706:7;;;5674:39;5930:4;;5923:12;;;;;;;;;;;;5947:4;;5937:15;;;;;;;;;5916:92;;5923:12;5954:15;5971:12;5985:11;5930:1;6001:6;5916;:92::i;:::-;5142:873;4698:1317;;;;;;;;:::o;27955:712::-;28248:17;28292:21;:11;2107:3:35;2103:22;;1958:183;28292:21:45;28268;:11;2107:3:35;2103:22;;1958:183;28268:21:45;:45;;;;:::i;:::-;28248:65;;28323:17;28367:21;:11;2303:2:35;2292:28;;2147:189;28367:21:45;28343;:11;2303:2:35;2292:28;;2147:189;28343:21:45;:45;;;;:::i;:::-;28323:65;;28398:53;28410:10;28422:14;28438:12;28398:11;:53::i;:::-;28461;28473:10;28485:14;28501:12;28461:11;:53::i;:::-;28524:63;28542:11;28555:3;:13;;;28570:10;28582:4;28524:17;:63::i;:::-;28597;28615:11;28628:3;:13;;;28643:10;28655:4;28597:17;:63::i;:::-;28238:429;;27955:712;;;;;;;;:::o;14852:160:34:-;14953:51;;14917:7;;14953:51;;14984:6;;414:1;;14953:51;;45253:19:46;;;45297:2;45288:12;;45281:28;45334:2;45325:12;;45096:247;14953:51:34;;;;;;;;;;;;;14943:62;;;;;;14936:69;;14852:160;;;:::o;15018:483::-;15094:7;15170:17;15190:25;15208:6;15190:17;:25::i;:::-;15170:45;-1:-1:-1;15284:24:34;15319:33;829:1;15170:45;15319:33;:::i;:::-;15445:48;;;15462:12;;;;15445:48;;;45253:19:46;45288:12;;;45281:28;;;15311:42:34;;-1:-1:-1;45325:12:46;;15445:48:34;;;;;;;;;;;;15435:59;;;;;;15428:66;;;;15018:483;;;;:::o;32120:676:45:-;-1:-1:-1;;;;;32398:25:45;;32381:14;32398:25;;;;;;;;;;;;32437:11;;;32433:24;;32450:7;;;32433:24;32466:10;32508:13;-1:-1:-1;;;;;32479:42:45;32495:8;-1:-1:-1;;;;;32479:42:45;;:68;;32536:11;32479:68;;;32524:9;32479:68;32466:81;-1:-1:-1;;;;;;32561:16:45;;32557:29;;32579:7;;;;32557:29;-1:-1:-1;;;;;32643:25:45;;32671:1;32643:25;;;;;;;;;;:29;;;32682:54;;32689:11;;32659:8;;;;32722:6;;32733:2;32682:6;:54::i;:::-;32778:2;-1:-1:-1;;;;;32751:38:45;32768:8;-1:-1:-1;;;;;32751:38:45;;32782:6;32751:38;;;;668:25:46;;656:2;641:18;;522:177;32751:38:45;;;;;;;;32371:425;;32120:676;;;;;;:::o;9022:1244:11:-;9249:4;9243:11;-1:-1:-1;;;9116:12:11;9267:22;;;-1:-1:-1;;;;;9315:24:11;;9309:4;9302:38;9360:4;9353:19;;;9116:12;9436:4;9116:12;9424:4;9116:12;;9408:5;9401;9396:45;9385:56;;9653:1;9646:4;9640:11;9637:18;9628:7;9624:32;9614:606;;9785:6;9775:7;9768:15;9764:28;9761:165;;;9841:16;9835:4;9830:3;9815:43;9891:16;9886:3;9879:29;9761:165;10202:1;10194:5;10182:18;10179:25;10160:16;10153:24;10149:56;10140:7;10136:70;10125:81;;9614:606;10240:4;10233:17;-1:-1:-1;9022:1244:11;;-1:-1:-1;;;;9022:1244:11:o;6267:4175:45:-;6969:6;;;;-1:-1:-1;;;;;6969:10:45;;6965:79;;7013:5;;;;:15;7037:6;;;;;6981:63;;-1:-1:-1;;;6981:63:45;;7006:4;6981:63;;;45800:51:46;-1:-1:-1;;;;;7013:20:45;;;45867:18:46;;;45860:34;-1:-1:-1;;;;;45930:47:46;;;45910:18;;;45903:75;6981:63:45;;:16;;;;;;45773:18:46;;;;;-1:-1:-1;;6981:63:45;;;;;;;;-1:-1:-1;6981:16:45;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6965:79;7058:6;;;;-1:-1:-1;;;;;7058:10:45;;7054:79;;7070:11;-1:-1:-1;;;;;7070:16:45;;7095:4;7102:22;:1;:5;;;:15;;;-1:-1:-1;;;;;7102:20:45;-1:-1:-1;;;;;5144:41:37;;5069:123;7102:22:45;7126:6;;;;7070:63;;-1:-1:-1;;;;;;7070:63:45;;;;;;;-1:-1:-1;;;;;45818:32:46;;;7070:63:45;;;45800:51:46;45867:18;;;45860:34;;;;-1:-1:-1;;;;;45930:47:46;45910:18;;;45903:75;45773:18;;7070:63:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7054:79;7160:17;;-1:-1:-1;;;;;7160:17:45;7144:13;7191:10;;;7187:554;;7540:1;:6;;;-1:-1:-1;;;;;7504:42:45;:15;:32;7520:1;:5;;;:15;;;-1:-1:-1;;;;;7504:32:45;-1:-1:-1;;;;;7504:32:45;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;7596:1;:6;;;-1:-1:-1;;;;;7560:42:45;:15;:32;7576:1;:5;;;:15;;;-1:-1:-1;;;;;7560:32:45;-1:-1:-1;;;;;7560:32:45;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;7616:94;7631:5;7638:10;7650:11;7663:46;;;;;;;;7672:1;:4;;;7663:46;;;;7678:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;;7686:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;;7694:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;;7702:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;7616:14;:94::i;:::-;7724:7;;;7187:554;8338:18;8359:42;8374:5;8381:1;:6;;;8389:5;8396:4;8359:14;:42::i;:::-;8338:63;;8411:18;8432:43;8447:5;8454:1;:6;;;8462:5;8469;8432:14;:43::i;:::-;8411:64;-1:-1:-1;8489:14:45;;8485:66;;8521:5;;;;;:15;-1:-1:-1;;;;;8505:32:45;;;;;;;;;;;;:46;;8541:10;;8505:32;:46;;8541:10;;8505:46;:::i;:::-;;;;-1:-1:-1;;8485:66:45;8565:14;;8561:66;;8597:5;;;;;:15;;;-1:-1:-1;;;;;8581:32:45;;;;;;;;;;;;:46;;8617:10;;8581:32;:46;;8617:10;;8581:46;:::i;:::-;;;;-1:-1:-1;;8561:66:45;8637:44;8651:5;8658:10;8670;8637:13;:44::i;:::-;8724:17;;8692:21;;8716:25;;-1:-1:-1;;;8724:17:45;;-1:-1:-1;;;;;8724:17:45;8716:5;:25;:::i;:::-;8692:49;;8755:13;8772:1;8755:18;8751:499;;8926:10;8917:1;:6;;;-1:-1:-1;;;;;8917:19:45;;;;;:::i;:::-;8897:5;;;;;:15;-1:-1:-1;;;;;8881:32:45;;;;;;;;;;;;:55;;:32;;;:55;;;;;:::i;:::-;;;;-1:-1:-1;;8986:6:45;;;;:19;;8995:10;;-1:-1:-1;;;;;8986:19:45;;:::i;:::-;8966:5;;;;;:15;;;-1:-1:-1;;;;;8950:32:45;;;;;;;;;;;;:55;;:32;;;:55;;;;;:::i;:::-;;;;;;;;9019:62;9033:5;9049:10;9040:1;:6;;;-1:-1:-1;;;;;9040:19:45;;;;;:::i;:::-;9070:10;9061:1;:6;;;-1:-1:-1;;;;;9061:19:45;;;;;:::i;:::-;9019:13;:62::i;:::-;9125:94;9140:5;9147:10;9159:11;9172:46;;;;;;;;9181:1;:4;;;9172:46;;;;9187:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;;9195:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;;9203:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;;9211:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;9125:14;:94::i;:::-;9233:7;;;;;;8751:499;9745:12;9769:10;9760:1;:6;;;-1:-1:-1;;;;;9760:19:45;;;;;:::i;:::-;9745:34;;9789:12;9813:10;9804:1;:6;;;-1:-1:-1;;;;;9804:19:45;;;;;:::i;:::-;9789:34;-1:-1:-1;9837:11:45;;;;;;;:48;;-1:-1:-1;9852:19:45;;;;-1:-1:-1;;;;;9852:33:45;;;9837:48;9833:337;;;9901:10;9932:6;9915:13;;;;:4;:13;:::i;:::-;9914:24;;;;:::i;:::-;9901:37;-1:-1:-1;9952:10:45;9983:6;9966:13;;;;:4;:13;:::i;:::-;9965:24;;;;:::i;:::-;9952:37;-1:-1:-1;10007:6:45;;10003:47;;10028:5;;;;;:15;-1:-1:-1;;;;;10015:29:45;;;;;;;;;;;;:35;;10048:2;;10015:29;:35;;10048:2;;10015:35;:::i;:::-;;;;-1:-1:-1;;10003:47:45;10068:6;;10064:47;;10089:5;;;;;:15;;;-1:-1:-1;;;;;10076:29:45;;;;;;;;;;;;:35;;10109:2;;10076:29;:35;;10109:2;;10076:35;:::i;:::-;;;;-1:-1:-1;;10064:47:45;10125:10;10133:2;10125:10;;:::i;:::-;;-1:-1:-1;10149:10:45;10157:2;10149:10;;:::i;:::-;;;9887:283;;9833:337;10200:46;10216:4;-1:-1:-1;;;10232:13:45;10200:15;:46::i;:::-;10179:5;:17;;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;10277:46:45;;-1:-1:-1;10293:4:45;-1:-1:-1;;;10309:13:45;10277:15;:46::i;:::-;10256:5;:17;;;:67;;;;;;;:::i;:::-;;;;;;;;10333:102;10348:5;10355:10;10367:11;10380:54;;;;;;;;10389:1;:4;;;10380:54;;;;10395:1;:6;;;-1:-1:-1;;;;;10380:54:45;;;;;10403:1;:6;;;-1:-1:-1;;;;;10380:54:45;;;;;10411:10;10380:54;;;;10423:10;10380:54;;;10333:14;:102::i;:::-;6577:3865;;;;;;6267:4175;;;;;;;:::o;29930:864::-;30051:1;30034:14;:18;30030:758;;;30308:12;30335:1;30323:9;:13;;;:47;;30369:1;30323:47;;;30355:9;30348:17;;30347:18;;;:::i;:::-;30308:62;;30395:5;-1:-1:-1;;;;;30388:12:45;:4;:12;30384:55;;;30409:30;;-1:-1:-1;;;30409:30:45;;;;;46163:25:46;;;-1:-1:-1;;;;;46224:47:46;;46204:18;;;46197:75;46136:18;;30409:30:45;45989:289:46;30030:758:45;30477:1;30460:14;:18;30456:332;;;30635:16;30666:1;30654:9;:13;;;:46;;30699:1;30654:46;;;30685:9;30678:17;;30654:46;30635:65;;30729:5;-1:-1:-1;;;;;30718:16:45;:8;:16;30714:63;;;30743:34;;-1:-1:-1;;;30743:34:45;;;;;46163:25:46;;;-1:-1:-1;;;;;46224:47:46;;46204:18;;;46197:75;46136:18;;30743:34:45;45989:289:46;33645:1779:45;33777:1;33768:6;:10;;;33764:1654;;;34037:12;34068:6;34061:14;;34060:15;;;:::i;:::-;34478:26;;-1:-1:-1;;;34478:26:45;;-1:-1:-1;;;;;7874:32:46;;;34478:26:45;;;7856:51:46;34037:39:45;;-1:-1:-1;34478:16:45;;;;;;7829:18:46;;34478:26:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;34522:22:45;;34518:625;;34934:11;-1:-1:-1;;;;;34934:18:45;;34960:4;34934:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34518:625;;;35006:84;-1:-1:-1;;;;;35006:50:45;;35057:4;35071:11;35085:4;35006:50;:84::i;:::-;35108:11;-1:-1:-1;;;;;35108:18:45;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34518:625;33780:1373;33764:1654;;;35172:1;35163:6;:10;;;35159:259;;;35349:58;;-1:-1:-1;;;35349:58:45;;-1:-1:-1;;;;;38792:32:46;;;35349:58:45;;;38774:51:46;38861:32;;;38841:18;;;38834:60;-1:-1:-1;;;;;35382:24:45;;38910:18:46;;;38903:34;35349:16:45;;;;;38747:18:46;;35349:58:45;38543:400:46;20007:784:45;20177:17;;20133:11;;-1:-1:-1;;;20177:17:45;;-1:-1:-1;;;;;20177:17:45;20133:11;20302:60;20338:5;;20318:26;;;;:::i;:::-;20330:6;-1:-1:-1;;;;;20318:26:45;20325:3;-1:-1:-1;;;;;20318:26:45;;-1:-1:-1;;;20356:5:45;20302:15;:60::i;:::-;20230:8;:56;;20265:21;;;;-1:-1:-1;;;20265:21:45;;-1:-1:-1;;;;;20265:21:45;20230:56;;;20241:21;;;;-1:-1:-1;;;;;20241:21:45;20230:56;-1:-1:-1;;;;;20222:65:45;:140;;;;:::i;:::-;20204:158;;20428:3;20417:7;:14;;20378:35;20394:3;-1:-1:-1;;;;;20378:35:45;20399:6;-1:-1:-1;;;;;20378:35:45;20407:5;20378:15;:35::i;:::-;:54;;;;:::i;:::-;20372:60;-1:-1:-1;20681:7:45;20699:85;;;;20713:21;;;:28;;-1:-1:-1;;;;;;20713:28:45;-1:-1:-1;;;;;20713:28:45;;;;;20699:85;;;20756:21;;;:28;;-1:-1:-1;;;;;20756:28:45;;;-1:-1:-1;;;20756:28:45;;;;;;20699:85;20150:641;;;20007:784;;;;;;:::o;20891:343::-;21003:17;;-1:-1:-1;;;21003:17:45;;-1:-1:-1;;;;;21003:17:45;20986:14;21034:11;;;21030:24;;21047:7;20891:343;;;:::o;21030:24::-;21067:8;;21063:77;;21101:39;21117:4;-1:-1:-1;;;21133:6:45;-1:-1:-1;;;;;21101:39:45;:15;:39::i;:::-;21077:5;:20;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;21063:77:45;21154:8;;21150:77;;21188:39;21204:4;-1:-1:-1;;;21220:6:45;-1:-1:-1;;;;;21188:39:45;:15;:39::i;:::-;21164:5;:20;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;20976:258:45;20891:343;;;:::o;1733:232:11:-;1838:47;1856:5;1863:4;1869:2;1873:5;1880:4;1838:17;:47::i;:::-;1833:126;;1908:40;;-1:-1:-1;;;1908:40:11;;-1:-1:-1;;;;;7874:32:46;;1908:40:11;;;7856:51:46;7829:18;;1908:40:11;7695:218:46;10814:1393:11;11109:4;11103:11;-1:-1:-1;;;10972:12:11;11127:22;;;-1:-1:-1;;;;;11175:26:11;;;11169:4;11162:40;11228:24;;11222:4;11215:38;11273:4;11266:19;;;10972:12;11349:4;10972:12;11337:4;10972:12;;11321:5;11314;11309:45;11298:56;;11566:1;11559:4;11553:11;11550:18;11541:7;11537:32;11527:606;;11698:6;11688:7;11681:15;11677:28;11674:165;;;11754:16;11748:4;11743:3;11728:43;11804:16;11799:3;11792:29;11674:165;12115:1;12107:5;12095:18;12092:25;12073:16;12066:24;12062:56;12053:7;12049:70;12038:81;;11527:606;12153:4;12146:17;-1:-1:-1;12189:1:11;12183:4;12176:15;10814:1393;;-1:-1:-1;;;;;10814:1393:11:o;14:131:46:-;-1:-1:-1;;;;;89:31:46;;79:42;;69:70;;135:1;132;125:12;150:367;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;481:2;466:18;;;;453:32;;-1:-1:-1;;;150:367:46:o;704:286::-;762:6;815:2;803:9;794:7;790:23;786:32;783:52;;;831:1;828;821:12;783:52;857:23;;-1:-1:-1;;;;;;909:32:46;;899:43;;889:71;;956:1;953;946:12;1187:487;1264:6;1272;1280;1333:2;1321:9;1312:7;1308:23;1304:32;1301:52;;;1349:1;1346;1339:12;1301:52;1388:9;1375:23;1407:31;1432:5;1407:31;:::i;:::-;1457:5;1535:2;1520:18;;1507:32;;-1:-1:-1;1638:2:46;1623:18;;;1610:32;;1187:487;-1:-1:-1;;;1187:487:46:o;1679:389::-;1764:8;1774:6;1828:3;1821:4;1813:6;1809:17;1805:27;1795:55;;1846:1;1843;1836:12;1795:55;-1:-1:-1;1869:20:46;;-1:-1:-1;;;;;1901:30:46;;1898:50;;;1944:1;1941;1934:12;1898:50;1981:4;1973:6;1969:17;1957:29;;2041:3;2034:4;2024:6;2021:1;2017:14;2009:6;2005:27;2001:38;1998:47;1995:67;;;2058:1;2055;2048:12;2073:159;2140:20;;2200:6;2189:18;;2179:29;;2169:57;;2222:1;2219;2212:12;2169:57;2073:159;;;:::o;2237:695::-;2369:6;2377;2385;2393;2446:2;2434:9;2425:7;2421:23;2417:32;2414:52;;;2462:1;2459;2452:12;2414:52;2502:9;2489:23;-1:-1:-1;;;;;2527:6:46;2524:30;2521:50;;;2567:1;2564;2557:12;2521:50;2606:92;2690:7;2681:6;2670:9;2666:22;2606:92;:::i;:::-;2717:8;;-1:-1:-1;2580:118:46;-1:-1:-1;2771:37:46;;-1:-1:-1;2804:2:46;2789:18;;2771:37;:::i;:::-;2761:47;;2858:2;2847:9;2843:18;2830:32;2871:31;2896:5;2871:31;:::i;:::-;2237:695;;;;-1:-1:-1;2237:695:46;;-1:-1:-1;;2237:695:46:o;2937:284::-;2995:6;3048:2;3036:9;3027:7;3023:23;3019:32;3016:52;;;3064:1;3061;3054:12;3016:52;3103:9;3090:23;-1:-1:-1;;;;;3146:5:46;3142:30;3135:5;3132:41;3122:69;;3187:1;3184;3177:12;3419:226;3478:6;3531:2;3519:9;3510:7;3506:23;3502:32;3499:52;;;3547:1;3544;3537:12;3499:52;-1:-1:-1;3592:23:46;;3419:226;-1:-1:-1;3419:226:46:o;3650:118::-;3736:5;3729:13;3722:21;3715:5;3712:32;3702:60;;3758:1;3755;3748:12;3773:388;3865:6;3873;3926:2;3914:9;3905:7;3901:23;3897:32;3894:52;;;3942:1;3939;3932:12;3894:52;3987:23;;;-1:-1:-1;4086:2:46;4071:18;;4058:32;4099:30;4058:32;4099:30;:::i;:::-;4148:7;4138:17;;;3773:388;;;;;:::o;4361:276::-;4449:6;4502:2;4490:9;4481:7;4477:23;4473:32;4470:52;;;4518:1;4515;4508:12;4470:52;4557:9;4544:23;4576:31;4601:5;4576:31;:::i;4642:623::-;4766:6;4774;4782;4835:2;4823:9;4814:7;4810:23;4806:32;4803:52;;;4851:1;4848;4841:12;4803:52;4891:9;4878:23;-1:-1:-1;;;;;4916:6:46;4913:30;4910:50;;;4956:1;4953;4946:12;4910:50;4995:92;5079:7;5070:6;5059:9;5055:22;4995:92;:::i;:::-;5106:8;;-1:-1:-1;4969:118:46;-1:-1:-1;;5191:2:46;5176:18;;5163:32;5204:31;5163:32;5204:31;:::i;:::-;5254:5;5244:15;;;4642:623;;;;;:::o;5270:424::-;5347:12;;-1:-1:-1;;;;;5343:38:46;;;5331:51;;5435:4;5424:16;;;5418:23;5414:49;;5398:14;;;5391:73;5517:4;5506:16;;;5500:23;5525:8;5496:38;5480:14;;;5473:62;5598:4;5587:16;;;5581:23;5578:1;5567:38;5551:14;;;5544:62;5659:4;5648:16;;;5642:23;5638:49;5622:14;;5615:73;5270:424::o;5699:495::-;5953:3;5938:19;;5966:44;5942:9;5992:6;5966:44;:::i;:::-;6061:6;6058:1;6047:21;6041:3;6030:9;6026:19;6019:50;6120:6;6117:1;6106:21;6100:3;6089:9;6085:19;6078:50;6179:6;6172:14;6165:22;6159:3;6148:9;6144:19;6137:51;5699:495;;;;;;;:::o;6199:156::-;6259:5;6304:3;6295:6;6290:3;6286:16;6282:26;6279:46;;;6321:1;6318;6311:12;6279:46;-1:-1:-1;6343:6:46;6199:156;-1:-1:-1;6199:156:46:o;6360:118::-;6447:5;6444:1;6433:20;6426:5;6423:31;6413:59;;6468:1;6465;6458:12;6483:146;-1:-1:-1;;;;;6562:5:46;6558:46;6551:5;6548:57;6538:85;;6619:1;6616;6609:12;6634:1056;6770:6;6778;6786;6794;6802;6810;6818;6871:3;6859:9;6850:7;6846:23;6842:33;6839:53;;;6888:1;6885;6878:12;6839:53;6911:54;6957:7;6946:9;6911:54;:::i;:::-;6901:64;;7015:3;7004:9;7000:19;6987:33;7029:29;7052:5;7029:29;:::i;:::-;7077:5;-1:-1:-1;7134:3:46;7119:19;;7106:33;7148:31;7106:33;7148:31;:::i;:::-;7198:7;-1:-1:-1;7257:3:46;7242:19;;7229:33;7271;7229;7271;:::i;:::-;7323:7;-1:-1:-1;7382:3:46;7367:19;;7354:33;7396;7354;7396;:::i;:::-;7448:7;-1:-1:-1;7507:3:46;7492:19;;7479:33;7521;7479;7521;:::i;:::-;6634:1056;;;;-1:-1:-1;6634:1056:46;;;;;;;;-1:-1:-1;;7653:3:46;7638:19;;;7625:33;;6634:1056::o;8357:1107::-;8579:13;;-1:-1:-1;;;;;8192:46:46;8180:59;;8547:3;8532:19;;8651:4;8643:6;8639:17;8633:24;8666:54;8714:4;8703:9;8699:20;8685:12;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;8666:54;;8776:4;8768:6;8764:17;8758:24;8751:4;8740:9;8736:20;8729:54;8839:4;8831:6;8827:17;8821:24;8814:4;8803:9;8799:20;8792:54;8902:4;8894:6;8890:17;8884:24;8877:4;8866:9;8862:20;8855:54;8965:4;8957:6;8953:17;8947:24;8940:4;8929:9;8925:20;8918:54;9021:4;9013:6;9009:17;9003:24;9036:56;9086:4;9075:9;9071:20;9055:14;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;9036:56;;9141:4;9133:6;9129:17;9123:24;9156:56;9206:4;9195:9;9191:20;9175:14;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;9156:56;;9261:6;9253;9249:19;9243:26;9278:57;9327:6;9316:9;9312:22;9296:14;-1:-1:-1;;;;;8315:30:46;8303:43;;8250:102;9278:57;;9384:6;9376;9372:19;9366:26;9401:57;9450:6;9439:9;9435:22;9419:14;-1:-1:-1;;;;;8315:30:46;8303:43;;8250:102;9401:57;;8357:1107;;;;:::o;9469:119::-;9554:8;9547:5;9543:20;9536:5;9533:31;9523:59;;9578:1;9575;9568:12;9593:653;9703:6;9711;9719;9727;9780:3;9768:9;9759:7;9755:23;9751:33;9748:53;;;9797:1;9794;9787:12;9748:53;9820:54;9866:7;9855:9;9820:54;:::i;:::-;9810:64;;9924:3;9913:9;9909:19;9896:33;9938:30;9962:5;9938:30;:::i;:::-;9987:5;-1:-1:-1;10044:3:46;10029:19;;10016:33;10058:32;10016:33;10058:32;:::i;:::-;10109:7;-1:-1:-1;10168:3:46;10153:19;;10140:33;10182:32;10140:33;10182:32;:::i;10251:724::-;10368:6;10376;10384;10392;10400;10453:3;10441:9;10432:7;10428:23;10424:33;10421:53;;;10470:1;10467;10460:12;10421:53;10493:54;10539:7;10528:9;10493:54;:::i;:::-;10483:64;;10597:3;10586:9;10582:19;10569:33;10611:29;10634:5;10611:29;:::i;:::-;10659:5;-1:-1:-1;10716:3:46;10701:19;;10688:33;10730:31;10688:33;10730:31;:::i;:::-;10780:7;-1:-1:-1;10839:3:46;10824:19;;10811:33;10853;10811;10853;:::i;:::-;10905:7;-1:-1:-1;10931:38:46;10964:3;10949:19;;10931:38;:::i;:::-;10921:48;;10251:724;;;;;;;;:::o;10980:367::-;11048:6;11056;11109:2;11097:9;11088:7;11084:23;11080:32;11077:52;;;11125:1;11122;11115:12;11077:52;11170:23;;;-1:-1:-1;11269:2:46;11254:18;;11241:32;11282:33;11241:32;11282:33;:::i;11352:888::-;11504:4;11546:3;11535:9;11531:19;11523:27;;-1:-1:-1;;;;;11587:6:46;11581:13;11577:54;11566:9;11559:73;-1:-1:-1;;;;;11692:4:46;11684:6;11680:17;11674:24;11670:65;11663:4;11652:9;11648:20;11641:95;11783:4;11775:6;11771:17;11765:24;11798:54;11846:4;11835:9;11831:20;11817:12;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;11798:54;;11908:4;11900:6;11896:17;11890:24;11883:4;11872:9;11868:20;11861:54;11971:4;11963:6;11959:17;11953:24;11946:4;11935:9;11931:20;11924:54;12034:4;12026:6;12022:17;12016:24;12009:4;11998:9;11994:20;11987:54;12097:4;12089:6;12085:17;12079:24;12072:4;12061:9;12057:20;12050:54;12160:4;12152:6;12148:17;12142:24;12135:4;12124:9;12120:20;12113:54;12225:6;12217;12213:19;12207:26;12198:6;12187:9;12183:22;12176:58;11352:888;;;;:::o;12245:382::-;12310:6;12318;12371:2;12359:9;12350:7;12346:23;12342:32;12339:52;;;12387:1;12384;12377:12;12339:52;12426:9;12413:23;12445:31;12470:5;12445:31;:::i;:::-;12495:5;-1:-1:-1;12552:2:46;12537:18;;12524:32;12565:30;12524:32;12565:30;:::i;12632:347::-;12683:8;12693:6;12747:3;12740:4;12732:6;12728:17;12724:27;12714:55;;12765:1;12762;12755:12;12714:55;-1:-1:-1;12788:20:46;;-1:-1:-1;;;;;12820:30:46;;12817:50;;;12863:1;12860;12853:12;12817:50;12900:4;12892:6;12888:17;12876:29;;12952:3;12945:4;12936:6;12928;12924:19;12920:30;12917:39;12914:59;;;12969:1;12966;12959:12;12984:833;13138:6;13146;13154;13162;13170;13214:9;13205:7;13201:23;13244:3;13240:2;13236:12;13233:32;;;13261:1;13258;13251:12;13233:32;13300:9;13287:23;13319:31;13344:5;13319:31;:::i;:::-;13369:5;-1:-1:-1;13393:63:46;13448:7;13443:2;13428:18;;13393:63;:::i;:::-;13383:73;-1:-1:-1;13491:2:46;-1:-1:-1;;13472:17:46;;13468:26;13465:46;;;13507:1;13504;13497:12;13465:46;;13545:3;13534:9;13530:19;13520:29;;13600:3;13589:9;13585:19;13572:33;-1:-1:-1;;;;;13620:6:46;13617:30;13614:50;;;13660:1;13657;13650:12;13614:50;13699:58;13749:7;13740:6;13729:9;13725:22;13699:58;:::i;:::-;12984:833;;;;-1:-1:-1;12984:833:46;;-1:-1:-1;13776:8:46;;13673:84;12984:833;-1:-1:-1;;;12984:833:46:o;14219:508::-;14296:6;14304;14312;14365:2;14353:9;14344:7;14340:23;14336:32;14333:52;;;14381:1;14378;14371:12;14333:52;14420:9;14407:23;14439:31;14464:5;14439:31;:::i;:::-;14489:5;-1:-1:-1;14546:2:46;14531:18;;14518:32;14559:33;14518:32;14559:33;:::i;:::-;14219:508;;14611:7;;-1:-1:-1;;;14691:2:46;14676:18;;;;14663:32;;14219:508::o;14732:651::-;14841:6;14849;14857;14865;14918:3;14906:9;14897:7;14893:23;14889:33;14886:53;;;14935:1;14932;14925:12;14886:53;14958:54;15004:7;14993:9;14958:54;:::i;:::-;14948:64;;15062:3;15051:9;15047:19;15034:33;15076:29;15099:5;15076:29;:::i;:::-;15124:5;-1:-1:-1;15181:3:46;15166:19;;15153:33;15195:31;15153:33;15195:31;:::i;:::-;15245:7;-1:-1:-1;15304:3:46;15289:19;;15276:33;15318;15276;15318;:::i;16097:573::-;16192:6;16200;16208;16261:2;16249:9;16240:7;16236:23;16232:32;16229:52;;;16277:1;16274;16267:12;16229:52;16322:23;;;-1:-1:-1;16420:2:46;16405:18;;16392:32;-1:-1:-1;;;;;16436:30:46;;16433:50;;;16479:1;16476;16469:12;16433:50;16518:92;16602:7;16593:6;16582:9;16578:22;16518:92;:::i;:::-;16097:573;;16629:8;;-1:-1:-1;16492:118:46;;-1:-1:-1;;;;16097:573:46:o;16675:566::-;16777:6;16785;16793;16846:2;16834:9;16825:7;16821:23;16817:32;16814:52;;;16862:1;16859;16852:12;16814:52;16907:23;;;-1:-1:-1;17006:2:46;16991:18;;16978:32;17019;16978;17019;:::i;:::-;17070:7;-1:-1:-1;17129:2:46;17114:18;;17101:32;17177:12;17164:26;;17152:39;;17142:67;;17205:1;17202;17195:12;17453:409;17523:6;17531;17584:2;17572:9;17563:7;17559:23;17555:32;17552:52;;;17600:1;17597;17590:12;17552:52;17640:9;17627:23;-1:-1:-1;;;;;17665:6:46;17662:30;17659:50;;;17705:1;17702;17695:12;17659:50;17744:58;17794:7;17785:6;17774:9;17770:22;17744:58;:::i;:::-;17821:8;;17718:84;;-1:-1:-1;17453:409:46;-1:-1:-1;;;;17453:409:46:o;17867:288::-;17908:3;17946:5;17940:12;17973:6;17968:3;17961:19;18029:6;18022:4;18015:5;18011:16;18004:4;17999:3;17995:14;17989:47;18081:1;18074:4;18065:6;18060:3;18056:16;18052:27;18045:38;18144:4;18137:2;18133:7;18128:2;18120:6;18116:15;18112:29;18107:3;18103:39;18099:50;18092:57;;;17867:288;;;;:::o;18160:217::-;18307:2;18296:9;18289:21;18270:4;18327:44;18367:2;18356:9;18352:18;18344:6;18327:44;:::i;19123:1198::-;19268:6;19276;19284;19292;19300;19308;19316;19324;19377:3;19365:9;19356:7;19352:23;19348:33;19345:53;;;19394:1;19391;19384:12;19345:53;19417:54;19463:7;19452:9;19417:54;:::i;:::-;19407:64;;19521:3;19510:9;19506:19;19493:33;19535:29;19558:5;19535:29;:::i;:::-;19583:5;-1:-1:-1;19640:3:46;19625:19;;19612:33;19654:31;19612:33;19654:31;:::i;:::-;19704:7;-1:-1:-1;19763:3:46;19748:19;;19735:33;19777;19735;19777;:::i;:::-;19829:7;-1:-1:-1;19888:3:46;19873:19;;19860:33;19902;19860;19902;:::i;:::-;19954:7;-1:-1:-1;20013:3:46;19998:19;;19985:33;20027;19985;20027;:::i;:::-;20079:7;-1:-1:-1;20138:3:46;20123:19;;20110:33;20152;20110;20152;:::i;:::-;19123:1198;;;;-1:-1:-1;19123:1198:46;;;;;;;;-1:-1:-1;20204:7:46;;20284:3;20269:19;20256:33;;-1:-1:-1;19123:1198:46:o;20326:388::-;20394:6;20402;20455:2;20443:9;20434:7;20430:23;20426:32;20423:52;;;20471:1;20468;20461:12;20423:52;20510:9;20497:23;20529:31;20554:5;20529:31;:::i;:::-;20579:5;-1:-1:-1;20636:2:46;20621:18;;20608:32;20649:33;20608:32;20649:33;:::i;20948:516::-;21052:6;21060;21068;21121:3;21109:9;21100:7;21096:23;21092:33;21089:53;;;21138:1;21135;21128:12;21089:53;21177:9;21164:23;21196:31;21221:5;21196:31;:::i;:::-;21246:5;-1:-1:-1;21270:63:46;21325:7;21320:2;21305:18;;21270:63;:::i;:::-;21260:73;;21385:3;21374:9;21370:19;21357:33;21399;21424:7;21399:33;:::i;21469:527::-;21569:6;21577;21585;21638:2;21626:9;21617:7;21613:23;21609:32;21606:52;;;21654:1;21651;21644:12;21606:52;21699:23;;;-1:-1:-1;21798:2:46;21783:18;;21770:32;21811:31;21770:32;21811:31;:::i;:::-;21861:7;-1:-1:-1;21920:2:46;21905:18;;21892:32;21933:31;21892:32;21933:31;:::i;22355:629::-;22441:6;22449;22457;22465;22518:3;22506:9;22497:7;22493:23;22489:33;22486:53;;;22535:1;22532;22525:12;22486:53;22574:9;22561:23;22593:31;22618:5;22593:31;:::i;:::-;22643:5;-1:-1:-1;22700:2:46;22685:18;;22672:32;22713:33;22672:32;22713:33;:::i;:::-;22355:629;;22765:7;;-1:-1:-1;;;;22845:2:46;22830:18;;22817:32;;22948:2;22933:18;22920:32;;22355:629::o;23279:127::-;23340:10;23335:3;23331:20;23328:1;23321:31;23371:4;23368:1;23361:15;23395:4;23392:1;23385:15;23411:125;23476:9;;;23497:10;;;23494:36;;;23510:18;;:::i;23541:127::-;23602:10;23597:3;23593:20;23590:1;23583:31;23633:4;23630:1;23623:15;23657:4;23654:1;23647:15;23673:252;23745:2;23739:9;23787:3;23775:16;;-1:-1:-1;;;;;23806:34:46;;23842:22;;;23803:62;23800:88;;;23868:18;;:::i;:::-;23904:2;23897:22;23673:252;:::o;23930:253::-;24002:2;23996:9;24044:4;24032:17;;-1:-1:-1;;;;;24064:34:46;;24100:22;;;24061:62;24058:88;;;24126:18;;:::i;24188:275::-;24259:2;24253:9;24324:2;24305:13;;-1:-1:-1;;24301:27:46;24289:40;;-1:-1:-1;;;;;24344:34:46;;24380:22;;;24341:62;24338:88;;;24406:18;;:::i;:::-;24442:2;24435:22;24188:275;;-1:-1:-1;24188:275:46:o;24468:940::-;24552:6;24612:3;24600:9;24591:7;24587:23;24583:33;24628:2;24625:22;;;24643:1;24640;24633:12;24625:22;-1:-1:-1;24685:22:46;;:::i;:::-;24744:9;24731:23;24763:33;24788:7;24763:33;:::i;:::-;24805:22;;24879:2;24864:18;;24851:32;24892:33;24851:32;24892:33;:::i;:::-;24952:2;24941:14;;24934:31;25017:2;25002:18;;24989:32;25030;24989;25030;:::i;:::-;25089:2;25078:14;;25071:31;25154:2;25139:18;;25126:32;25167:31;25126:32;25167:31;:::i;:::-;25225:2;25214:14;;25207:31;25290:3;25275:19;;25262:33;25304;25262;25304;:::i;:::-;25364:3;25353:15;;25346:32;25357:5;24468:940;-1:-1:-1;;;24468:940:46:o;25413:191::-;-1:-1:-1;;;;;25481:26:46;;;25509;;;25477:59;;25548:27;;25545:53;;;25578:18;;:::i;25609:240::-;-1:-1:-1;;;;;25678:42:46;;;25722;;;25674:91;;25777:43;;25774:69;;;25823:18;;:::i;26440:767::-;26527:6;26587:2;26575:9;26566:7;26562:23;26558:32;26602:2;26599:22;;;26617:1;26614;26607:12;26599:22;-1:-1:-1;26686:2:46;26680:9;26728:2;26716:15;;-1:-1:-1;;;;;26746:34:46;;26782:22;;;26743:62;26740:88;;;26808:18;;:::i;:::-;26844:2;26837:22;26881:23;;26913:28;26881:23;26913:28;:::i;:::-;26950:21;;27032:2;27017:18;;;27004:32;26987:15;;;26980:57;27089:2;27074:18;;27061:32;27102:33;27061:32;27102:33;:::i;:::-;27163:2;27151:15;;27144:32;27155:6;26440:767;-1:-1:-1;;;26440:767:46:o;27421:245::-;27488:6;27541:2;27529:9;27520:7;27516:23;27512:32;27509:52;;;27557:1;27554;27547:12;27509:52;27589:9;27583:16;27608:28;27630:5;27608:28;:::i;27671:243::-;-1:-1:-1;;;;;27786:42:46;;;27742;;;27738:91;;27841:44;;27838:70;;;27888:18;;:::i;27919:127::-;27980:10;27975:3;27971:20;27968:1;27961:31;28011:4;28008:1;28001:15;28035:4;28032:1;28025:15;28428:173;28525:12;28496:20;;;28518;;;28492:47;;28551:21;;28548:47;;;28575:18;;:::i;28606:136::-;28641:3;-1:-1:-1;;;28662:22:46;;28659:48;;28687:18;;:::i;:::-;-1:-1:-1;28727:1:46;28723:13;;28606:136::o;29132:245::-;29190:6;29243:2;29231:9;29222:7;29218:23;29214:32;29211:52;;;29259:1;29256;29249:12;29211:52;29298:9;29285:23;29317:30;29341:5;29317:30;:::i;29755:128::-;29822:9;;;29843:11;;;29840:37;;;29857:18;;:::i;30167:331::-;30272:9;30283;30325:8;30313:10;30310:24;30307:44;;;30347:1;30344;30337:12;30307:44;30376:6;30366:8;30363:20;30360:40;;;30396:1;30393;30386:12;30360:40;-1:-1:-1;;30422:23:46;;;30467:25;;;;;-1:-1:-1;30167:331:46:o;30503:338::-;30623:19;;-1:-1:-1;;;;;;30660:29:46;;;30709:1;30701:10;;30698:137;;;-1:-1:-1;;;;;;30770:1:46;30766:11;;;;30763:1;30759:19;30755:46;;;30747:55;30743:82;;;;30503:338;-1:-1:-1;;30503:338:46:o;30846:485::-;-1:-1:-1;;;;;31031:32:46;;31013:51;;31100:2;31095;31080:18;;31073:30;;;31119:18;;31112:34;;;31139:6;31188;31183:2;31168:18;;31155:48;31252:1;31223:22;;;31247:2;31219:31;;;31212:42;;;;31315:2;31294:15;;;-1:-1:-1;;31290:29:46;31275:45;31271:54;;30846:485;-1:-1:-1;;30846:485:46:o;31336:136::-;31375:3;31403:5;31393:39;;31412:18;;:::i;:::-;-1:-1:-1;;;31448:18:46;;31336:136::o;31477:135::-;31516:3;31537:17;;;31534:43;;31557:18;;:::i;:::-;-1:-1:-1;31604:1:46;31593:13;;31477:135::o;31617:158::-;31710:6;31703:14;;;31687;;;31683:35;;31730:16;;31727:42;;;31749:18;;:::i;31780:168::-;31853:9;;;31884;;31901:15;;;31895:22;;31881:37;31871:71;;31922:18;;:::i;31953:127::-;32014:10;32009:3;32005:20;32002:1;31995:31;32045:4;32042:1;32035:15;32069:4;32066:1;32059:15;32085:217;32125:1;32151;32141:132;;32195:10;32190:3;32186:20;32183:1;32176:31;32230:4;32227:1;32220:15;32258:4;32255:1;32248:15;32141:132;-1:-1:-1;32287:9:46;;32085:217::o;32784:186::-;32832:4;-1:-1:-1;;;;;32857:6:46;32854:30;32851:56;;;32887:18;;:::i;:::-;-1:-1:-1;32953:2:46;32932:15;-1:-1:-1;;32928:29:46;32959:4;32924:40;;32784:186::o;32975:850::-;33063:6;33071;33124:2;33112:9;33103:7;33099:23;33095:32;33092:52;;;33140:1;33137;33130:12;33092:52;33179:9;33166:23;33218:1;33211:5;33208:12;33198:40;;33234:1;33231;33224:12;33198:40;33257:5;-1:-1:-1;33313:2:46;33298:18;;33285:32;-1:-1:-1;;;;;33329:30:46;;33326:50;;;33372:1;33369;33362:12;33326:50;33395:22;;33448:4;33440:13;;33436:27;-1:-1:-1;33426:55:46;;33477:1;33474;33467:12;33426:55;33517:2;33504:16;33542:52;33558:35;33586:6;33558:35;:::i;:::-;33542:52;:::i;:::-;33617:6;33610:5;33603:21;33665:7;33660:2;33651:6;33647:2;33643:15;33639:24;33636:37;33633:57;;;33686:1;33683;33676:12;33633:57;33741:6;33736:2;33732;33728:11;33723:2;33716:5;33712:14;33699:49;33793:1;33788:2;33779:6;33772:5;33768:18;33764:27;33757:38;33814:5;33804:15;;;;;32975:850;;;;;:::o;33830:127::-;33891:10;33886:3;33882:20;33879:1;33872:31;33922:4;33919:1;33912:15;33946:4;33943:1;33936:15;33962:160;34063:13;;34085:31;34063:13;34085:31;:::i;34127:880::-;34225:6;34285:3;34273:9;34264:7;34260:23;34256:33;34301:2;34298:22;;;34316:1;34313;34306:12;34298:22;-1:-1:-1;34358:22:46;;:::i;:::-;34410:9;34404:16;34429:33;34454:7;34429:33;:::i;:::-;34471:22;;34538:2;34523:18;;34517:25;34551:33;34517:25;34551:33;:::i;:::-;34611:2;34600:14;;34593:31;34690:2;34675:18;;;34669:25;34710:14;;;34703:31;34800:2;34785:18;;;34779:25;34820:14;;;34813:31;34889:3;34874:19;;34868:26;34903:33;34868:26;34903:33;:::i;35012:251::-;35082:6;35135:2;35123:9;35114:7;35110:23;35106:32;35103:52;;;35151:1;35148;35141:12;35103:52;35183:9;35177:16;35202:31;35227:5;35202:31;:::i;35268:798::-;35420:4;35462:3;35451:9;35447:19;35439:27;;35475:51;35516:9;35507:6;35501:13;35475:51;:::i;:::-;35596:4;35588:6;35584:17;35578:24;35575:1;35564:39;35557:4;35546:9;35542:20;35535:69;35674:4;35666:6;35662:17;35656:24;35653:1;35642:39;35635:4;35624:9;35620:20;35613:69;35738:4;35730:6;35726:17;35720:24;35713:4;35702:9;35698:20;35691:54;35832:1;35828;35823:3;35819:11;35815:19;35807:4;35799:6;35795:17;35789:24;35785:50;35776:6;35765:9;35761:22;35754:82;-1:-1:-1;;;;;35898:4:46;35890:6;35886:17;35880:24;35876:65;35867:6;35856:9;35852:22;35845:97;35989:4;35981:6;35977:17;35971:24;36004:56;36052:6;36041:9;36037:22;36023:12;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;36071:450;36218:4;36258:1;36250:6;36247:13;36237:144;;36303:10;36298:3;36294:20;36291:1;36284:31;36338:4;36335:1;36328:15;36366:4;36363:1;36356:15;36237:144;36408:6;36397:9;36390:25;36451:2;36446;36435:9;36431:18;36424:30;36471:44;36511:2;36500:9;36496:18;36488:6;36471:44;:::i;36526:685::-;36605:6;36658:2;36646:9;36637:7;36633:23;36629:32;36626:52;;;36674:1;36671;36664:12;36626:52;36707:9;36701:16;-1:-1:-1;;;;;36732:6:46;36729:30;36726:50;;;36772:1;36769;36762:12;36726:50;36795:22;;36848:4;36840:13;;36836:27;-1:-1:-1;36826:55:46;;36877:1;36874;36867:12;36826:55;36910:2;36904:9;36935:52;36951:35;36979:6;36951:35;:::i;36935:52::-;37010:6;37003:5;36996:21;37058:7;37053:2;37044:6;37040:2;37036:15;37032:24;37029:37;37026:57;;;37079:1;37076;37069:12;37026:57;37127:6;37122:2;37118;37114:11;37109:2;37102:5;37098:14;37092:42;37179:1;37154:18;;;37174:2;37150:27;37143:38;;;;37158:5;36526:685;-1:-1:-1;;;;36526:685:46:o;38948:134::-;39025:13;;39047:29;39025:13;39047:29;:::i;39087:138::-;39166:13;;39188:31;39166:13;39188:31;:::i;39230:1621::-;39330:6;39374:9;39365:7;39361:23;39411:3;39407:2;39403:12;39427:2;39424:22;;;39442:1;39439;39432:12;39424:22;-1:-1:-1;39484:22:46;;:::i;:::-;39526:4;39522:2;39518:13;39515:33;;;39544:1;39541;39534:12;39515:33;39572:22;;:::i;:::-;39557:37;;39624:9;39618:16;39643:33;39668:7;39643:33;:::i;:::-;39685:24;;39754:2;39739:18;;39733:25;39767:33;39733:25;39767:33;:::i;:::-;39829:2;39816:16;;39809:33;39887:2;39872:18;;39866:25;39900:32;39866:25;39900:32;:::i;:::-;39961:2;39948:16;;39941:33;40019:2;40004:18;;39998:25;40032:31;39998:25;40032:31;:::i;:::-;40092:2;40079:16;;40072:33;40150:3;40135:19;;40129:26;40164:33;40129:26;40164:33;:::i;:::-;40226:3;40213:17;;40206:34;40249:22;;;40303:49;40346:4;40331:20;;40303:49;:::i;:::-;40298:2;40291:5;40287:14;40280:73;40385:48;40428:3;40417:9;40413:19;40385:48;:::i;:::-;40380:2;40369:14;;40362:72;40500:4;40485:20;;40479:27;40533:2;40522:14;;40515:31;;;40479:27;-1:-1:-1;40579:72:46;40646:3;40631:19;;40579:72;:::i;:::-;40573:3;40566:5;40562:15;40555:97;40686:50;40731:3;40720:9;40716:19;40686:50;:::i;:::-;40679:4;40672:5;40668:16;40661:76;40770:50;40815:3;40804:9;40800:19;40770:50;:::i;:::-;40764:3;40753:15;;40746:75;40757:5;39230:1621;-1:-1:-1;;;;39230:1621:46:o;40856:800::-;41223:44;41257:9;41249:6;41223:44;:::i;:::-;41318:13;;41315:1;41304:28;;;41298:3;41283:19;;41276:57;41402:4;41390:17;;41384:24;41370:39;;41364:3;41349:19;;41342:68;41465:4;41453:17;;41447:24;41441:3;41426:19;;41419:53;41527:4;41515:17;;;41509:24;41503:3;41488:19;;41481:53;41571:3;41565;41550:19;;41543:32;;;-1:-1:-1;41591:19:46;;;41584:30;41646:3;41631:19;;40856:800;-1:-1:-1;40856:800:46:o;41661:409::-;41806:6;41814;41867:2;41855:9;41846:7;41842:23;41838:32;41835:52;;;41883:1;41880;41873:12;41835:52;-1:-1:-1;;41928:16:46;;42034:2;42019:18;;;42013:25;41928:16;;42013:25;;-1:-1:-1;41661:409:46:o;42336:980::-;42431:6;42484:2;42472:9;42463:7;42459:23;42455:32;42452:52;;;42500:1;42497;42490:12;42452:52;42533:9;42527:16;-1:-1:-1;;;;;42558:6:46;42555:30;42552:50;;;42598:1;42595;42588:12;42552:50;42621:22;;42674:4;42666:13;;42662:27;-1:-1:-1;42652:55:46;;42703:1;42700;42693:12;42652:55;42736:2;42730:9;-1:-1:-1;;;;;42754:6:46;42751:30;42748:56;;;42784:18;;:::i;:::-;42830:6;42827:1;42823:14;42857:28;42881:2;42877;42873:11;42857:28;:::i;:::-;42919:19;;;42963:2;42993:11;;;42989:20;;;42954:12;;;;43021:19;;;43018:39;;;43053:1;43050;43043:12;43018:39;43085:2;43081;43077:11;43066:22;;43097:189;43113:6;43108:3;43105:15;43097:189;;;43203:10;;43226:18;;;43273:2;43130:12;;;;43203:10;;-1:-1:-1;43264:12:46;;;;43097:189;;;43305:5;42336:980;-1:-1:-1;;;;;;;42336:980:46:o;43503:230::-;43573:6;43626:2;43614:9;43605:7;43601:23;43597:32;43594:52;;;43642:1;43639;43632:12;43594:52;-1:-1:-1;43687:16:46;;43503:230;-1:-1:-1;43503:230:46:o;44842:249::-;44942:2;44931:17;;;44912;;;;44908:41;-1:-1:-1;;44964:50:46;;45026:34;45016:45;;44961:101;44958:127;;;45065:18;;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa164736f6c634300081a000a","offset":28177}},"immutableReferences":{"6257":[{"start":1765,"length":32},{"start":15419,"length":32},{"start":15541,"length":32},{"start":15663,"length":32}],"6492":[{"start":1714,"length":32},{"start":14395,"length":32}],"6495":[{"start":998,"length":32},{"start":3800,"length":32},{"start":5783,"length":32},{"start":7280,"length":32},{"start":9111,"length":32},{"start":9249,"length":32},{"start":9428,"length":32},{"start":11423,"length":32},{"start":14622,"length":32},{"start":15200,"length":32},{"start":15373,"length":32},{"start":16507,"length":32},{"start":19225,"length":32}]},"transformations":[{"id":"6495","type":"replace","offset":998,"reason":"immutable"},{"id":"6492","type":"replace","offset":1714,"reason":"immutable"},{"id":"6257","type":"replace","offset":1765,"reason":"immutable"},{"id":"6495","type":"replace","offset":3800,"reason":"immutable"},{"id":"6495","type":"replace","offset":5783,"reason":"immutable"},{"id":"6495","type":"replace","offset":7280,"reason":"immutable"},{"id":"6495","type":"replace","offset":9111,"reason":"immutable"},{"id":"6495","type":"replace","offset":9249,"reason":"immutable"},{"id":"6495","type":"replace","offset":9428,"reason":"immutable"},{"id":"6495","type":"replace","offset":11423,"reason":"immutable"},{"id":"6492","type":"replace","offset":14395,"reason":"immutable"},{"id":"6495","type":"replace","offset":14622,"reason":"immutable"},{"id":"6495","type":"replace","offset":15200,"reason":"immutable"},{"id":"6495","type":"replace","offset":15373,"reason":"immutable"},{"id":"6257","type":"replace","offset":15419,"reason":"immutable"},{"id":"6257","type":"replace","offset":15541,"reason":"immutable"},{"id":"6257","type":"replace","offset":15663,"reason":"immutable"},{"id":"6495","type":"replace","offset":16507,"reason":"immutable"},{"id":"6495","type":"replace","offset":19225,"reason":"immutable"}],"transformationValues":{"immutables":{"6257":"0x0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73","6492":"0x0000000000000000000000000000000000000000000000000000000000004e20","6495":"0x0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951"}}},"deployment":{"transactionHash":"0x28e3c77ae5e6caf130818ba751ae2c406a635d6796a51b63d09a478ae95222ea","blockNumber":"41250427","transactionIndex":"1","deployer":"0x359856655934338d798F9ccE1f181486301D36a5"},"sources":{"src/FablesRampETH.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {FablesRamp} from \"./FablesRamp.sol\";\nimport {LedgerLib} from \"./libraries/LedgerLib.sol\";\nimport {DistributorSwept} from \"./base/LedgerTypes.sol\";\n\n/// @notice The one WETH surface this hook needs: wrap. Unwrapping never happens here — native ETH\n///         only ever LEAVES through the PoolManager's own `take`, and the single place the hook\n///         itself must hand ETH to an ERC20-only consumer (the epoch distributor) is a wrap.\ninterface IWETH9 {\n    function deposit() external payable;\n}\n\n/// @title FablesRampETH\n/// @notice `FablesRamp` for pools whose currency0 is NATIVE ETH. Robinhood Chain's real ETH\n///         liquidity is quoted in native ETH, not WETH — the WETH pools are dead — so an ETH desk\n///         that wants the flow must speak native. Same flat-fee-plus-poke pricing, same ledger,\n///         same roles; this contract adds only the machinery that native currency requires.\n/// @dev WHAT NATIVE ACTUALLY TOUCHES. Uniswap v4 already moves native ETH itself on every payout\n///      (`take` pays LPs' withdrawals and claims directly), and swappers settle with the\n///      PoolManager, never with the hook. Exactly three seams remain, and they live in three\n///      places:\n///        1. pay-in — `LedgerLib._resolvePrincipal` settles a native deposit with\n///           `settle{value:}` from the hook's balance, prepaid by the depositor\n///           (`FablesLedger.deposit` is payable, requires `msg.value >= amount0Max`, and refunds\n///           the unspent remainder in full at the end);\n///        2. the gate — `_nativeAllowed()` is the coupled switch: overriding it to true is what\n///           lets `beforeInitialize`/`_checkKey` admit native pools on THIS hook while every\n///           ERC20-only hook keeps refusing them;\n///        3. revenue — the epoch distributor speaks only ERC20, so the NATIVE currency's\n///           staked-fee sweep wraps into WETH at this boundary (`_sweepDistributor` override) and\n///           everything downstream (distributor, settlement indexer, merkle claims) stays\n///           ERC20-pure. LP-facing money (withdraw, claimFees) stays native: LPs deposited ETH\n///           and get ETH back.\n///\n///      WHAT THIS HOOK NEVER DOES: hold ETH between transactions. Deposits refund their whole\n///      remaining balance in the same call; the sweep wraps and forwards within its own call. A\n///      nonzero balance at rest is a stranger's forced transfer, and the next native deposit\n///      returns it to circulation via the full-balance refund.\n///\n///      `receive()` is allowlisted to the PoolManager — the only counterparty that legitimately\n///      pays this contract ETH (`take` during the wrap-sweep). WETH9 never sends ETH here\n///      (`deposit` is a one-way wrap and nothing ever calls `withdraw`), and unsolicited transfers\n///      are refused outright rather than silently absorbed.\n///\n///      ERC20 pools still work on this hook unchanged — `_nativeAllowed` ADDS native capability,\n///      it does not require it. Whether to point ERC20 pools here or keep them on per-pool\n///      `FablesRamp` instances is a deployment (blast-radius) decision, not a code one.\ncontract FablesRampETH is FablesRamp {\n    using CurrencyLibrary for Currency;\n    using SafeERC20 for IERC20;\n\n    error UnauthorizedETHSender();\n\n    /// @notice Emitted when a NATIVE staked-fee sweep is delivered to the distributor as WETH.\n    /// @dev Pairs with the `DistributorSwept(address(0), distributor, amount)` that fires alongside\n    ///      it. The two describe one event from two sides, and BOTH are load-bearing for the\n    ///      off-chain settlement indexer: the `DistributorSwept` clears the ledger's NATIVE\n    ///      `distributorOwed` accrual (which is denominated in address(0), matching the\n    ///      `FeesCollected` events that fed it), while THIS event states the delivered token —\n    ///      the distributor speaks only ERC20 and receives `amount` of `weth`, never native ETH.\n    ///      An indexer reconciling the distributor's on-chain token balances MUST credit WETH from\n    ///      this event, not native ETH from the `DistributorSwept`, or native staked-fee revenue is\n    ///      mis-attributed in the merkle. Making the conversion an explicit on-chain fact removes\n    ///      the alternative — an undocumented `address(0) -> weth` convention the indexer had to\n    ///      just know.\n    event NativeRevenueWrappedToWeth(address indexed distributor, address indexed weth, uint256 amount);\n\n    /// @notice The canonical wrapped-ETH contract native revenue is wrapped into for the\n    ///         ERC20-only distributor. Immutable: a mutable WETH would be a mutable custodian of\n    ///         every future native sweep.\n    IWETH9 public immutable weth;\n\n    constructor(IPoolManager poolManager_, address authority_, uint24 absoluteMaxFee_, IWETH9 weth_)\n        FablesRamp(poolManager_, authority_, absoluteMaxFee_)\n    {\n        if (address(weth_) == address(0)) revert ZeroAddress();\n        weth = weth_;\n    }\n\n    /// @notice Native pools are admitted on this hook — the override travels with the payable\n    ///         deposit, the `settle{value:}` pay-in and the wrap-sweep that make them work.\n    function _nativeAllowed() internal pure override returns (bool) {\n        return true;\n    }\n\n    /// @notice ETH may arrive only from the PoolManager (its `take` during the wrap-sweep). The\n    ///         depositor's own prepay arrives as `msg.value` on `deposit`, not through here.\n    receive() external payable {\n        if (msg.sender != address(poolManager)) revert UnauthorizedETHSender();\n    }\n\n    /// @dev The NATIVE currency's staked-fee sweep: same bookkeeping as the library's\n    ///      (`LedgerLib.sweepDistributor`), different last hop — take the ETH to this contract,\n    ///      wrap it, and forward WETH, because the distributor cannot receive or hold native. The\n    ///      FF-sink fork in the library is deliberately absent here: FF is an ERC20, so the native\n    ///      currency can never be it. Every other currency falls through to the library path\n    ///      untouched. Pull-shaped like the original: an unset distributor keeps the accrual\n    ///      waiting rather than reverting.\n    function _sweepDistributor(Currency currency) internal override {\n        if (!currency.isAddressZero()) {\n            super._sweepDistributor(currency);\n            return;\n        }\n        uint256 amount = distributorOwed[currency];\n        if (amount == 0) return;\n        address to = distributor;\n        if (to == address(0)) return; // unset sink: the accrual simply keeps waiting\n        distributorOwed[currency] = 0;\n        // Burns the hook's claims and takes real ETH to this contract (allowed by `receive`),\n        // inside the same PAYOUT unlock the library uses.\n        LedgerLib.payout(poolManager, currency, currency, amount, 0, address(this));\n        weth.deposit{value: amount}();\n        IERC20(address(weth)).safeTransfer(to, amount);\n        // Two sides of one sweep: `DistributorSwept` clears the native accrual (see the base\n        // library, which the ERC20 currencies still route through), `NativeRevenueWrappedToWeth`\n        // names the token the distributor actually received. See the event's NatSpec.\n        emit DistributorSwept(currency, to, amount);\n        emit NativeRevenueWrappedToWeth(to, address(weth), amount);\n    }\n}\n"},"lib/v4-core/src/interfaces/IPoolManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"./IHooks.sol\";\nimport {IERC6909Claims} from \"./external/IERC6909Claims.sol\";\nimport {IProtocolFees} from \"./IProtocolFees.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IExtsload} from \"./IExtsload.sol\";\nimport {IExttload} from \"./IExttload.sol\";\n\n/// @notice Interface for the PoolManager\ninterface IPoolManager is IProtocolFees, IERC6909Claims, IExtsload, IExttload {\n    /// @notice Thrown when a currency is not netted out after the contract is unlocked\n    error CurrencyNotSettled();\n\n    /// @notice Thrown when trying to interact with a non-initialized pool\n    error PoolNotInitialized();\n\n    /// @notice Thrown when unlock is called, but the contract is already unlocked\n    error AlreadyUnlocked();\n\n    /// @notice Thrown when a function is called that requires the contract to be unlocked, but it is not\n    error ManagerLocked();\n\n    /// @notice Pools are limited to type(int16).max tickSpacing in #initialize, to prevent overflow\n    error TickSpacingTooLarge(int24 tickSpacing);\n\n    /// @notice Pools must have a positive non-zero tickSpacing passed to #initialize\n    error TickSpacingTooSmall(int24 tickSpacing);\n\n    /// @notice PoolKey must have currencies where address(currency0) < address(currency1)\n    error CurrenciesOutOfOrderOrEqual(address currency0, address currency1);\n\n    /// @notice Thrown when a call to updateDynamicLPFee is made by an address that is not the hook,\n    /// or on a pool that does not have a dynamic swap fee.\n    error UnauthorizedDynamicLPFeeUpdate();\n\n    /// @notice Thrown when trying to swap amount of 0\n    error SwapAmountCannotBeZero();\n\n    ///@notice Thrown when native currency is passed to a non native settlement\n    error NonzeroNativeValue();\n\n    /// @notice Thrown when `clear` is called with an amount that is not exactly equal to the open currency delta.\n    error MustClearExactPositiveDelta();\n\n    /// @notice Emitted when a new pool is initialized\n    /// @param id The abi encoded hash of the pool key struct for the new pool\n    /// @param currency0 The first currency of the pool by address sort order\n    /// @param currency1 The second currency of the pool by address sort order\n    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip\n    /// @param tickSpacing The minimum number of ticks between initialized ticks\n    /// @param hooks The hooks contract address for the pool, or address(0) if none\n    /// @param sqrtPriceX96 The price of the pool on initialization\n    /// @param tick The initial tick of the pool corresponding to the initialized price\n    event Initialize(\n        PoolId indexed id,\n        Currency indexed currency0,\n        Currency indexed currency1,\n        uint24 fee,\n        int24 tickSpacing,\n        IHooks hooks,\n        uint160 sqrtPriceX96,\n        int24 tick\n    );\n\n    /// @notice Emitted when a liquidity position is modified\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that modified the pool\n    /// @param tickLower The lower tick of the position\n    /// @param tickUpper The upper tick of the position\n    /// @param liquidityDelta The amount of liquidity that was added or removed\n    /// @param salt The extra data to make positions unique\n    event ModifyLiquidity(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Emitted for swaps between currency0 and currency1\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that initiated the swap call, and that received the callback\n    /// @param amount0 The delta of the currency0 balance of the pool\n    /// @param amount1 The delta of the currency1 balance of the pool\n    /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n    /// @param liquidity The liquidity of the pool after the swap\n    /// @param tick The log base 1.0001 of the price of the pool after the swap\n    /// @param fee The swap fee in hundredths of a bip\n    event Swap(\n        PoolId indexed id,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    /// @notice Emitted for donations\n    /// @param id The abi encoded hash of the pool key struct for the pool that was donated to\n    /// @param sender The address that initiated the donate call\n    /// @param amount0 The amount donated in currency0\n    /// @param amount1 The amount donated in currency1\n    event Donate(PoolId indexed id, address indexed sender, uint256 amount0, uint256 amount1);\n\n    /// @notice All interactions on the contract that account deltas require unlocking. A caller that calls `unlock` must implement\n    /// `IUnlockCallback(msg.sender).unlockCallback(data)`, where they interact with the remaining functions on this contract.\n    /// @dev The only functions callable without an unlocking are `initialize` and `updateDynamicLPFee`\n    /// @param data Any data to pass to the callback, via `IUnlockCallback(msg.sender).unlockCallback(data)`\n    /// @return The data returned by the call to `IUnlockCallback(msg.sender).unlockCallback(data)`\n    function unlock(bytes calldata data) external returns (bytes memory);\n\n    /// @notice Initialize the state for a given pool ID\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The pool key for the pool to initialize\n    /// @param sqrtPriceX96 The initial square root price\n    /// @return tick The initial tick of the pool\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external returns (int24 tick);\n\n    struct ModifyLiquidityParams {\n        // the lower and upper tick of the position\n        int24 tickLower;\n        int24 tickUpper;\n        // how to modify the liquidity\n        int256 liquidityDelta;\n        // a value to set if you want unique liquidity positions at the same range\n        bytes32 salt;\n    }\n\n    /// @notice Modify the liquidity for the given pool\n    /// @dev Poke by calling with a zero liquidityDelta\n    /// @param key The pool to modify liquidity in\n    /// @param params The parameters for modifying the liquidity\n    /// @param hookData The data to pass through to the add/removeLiquidity hooks\n    /// @return callerDelta The balance delta of the caller of modifyLiquidity. This is the total of both principal, fee deltas, and hook deltas if applicable\n    /// @return feesAccrued The balance delta of the fees generated in the liquidity range. Returned for informational purposes\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious actor and integrators should be careful using the value\n    /// For pools with a single liquidity position, actors can donate to themselves to inflate feeGrowthGlobal (and consequently feesAccrued)\n    /// atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued);\n\n    struct SwapParams {\n        /// Whether to swap token0 for token1 or vice versa\n        bool zeroForOne;\n        /// The desired input amount if negative (exactIn), or the desired output amount if positive (exactOut)\n        int256 amountSpecified;\n        /// The sqrt price at which, if reached, the swap will stop executing\n        uint160 sqrtPriceLimitX96;\n    }\n\n    /// @notice Swap against the given pool\n    /// @param key The pool to swap in\n    /// @param params The parameters for swapping\n    /// @param hookData The data to pass through to the swap hooks\n    /// @return swapDelta The balance delta of the address swapping\n    /// @dev Swapping on low liquidity pools may cause unexpected swap amounts when liquidity available is less than amountSpecified.\n    /// Additionally note that if interacting with hooks that have the BEFORE_SWAP_RETURNS_DELTA_FLAG or AFTER_SWAP_RETURNS_DELTA_FLAG\n    /// the hook may alter the swap input/output. Integrators should perform checks on the returned swapDelta.\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta swapDelta);\n\n    /// @notice Donate the given currency amounts to the in-range liquidity providers of a pool\n    /// @dev Calls to donate can be frontrun adding just-in-time liquidity, with the aim of receiving a portion donated funds.\n    /// Donors should keep this in mind when designing donation mechanisms.\n    /// @dev This function donates to in-range LPs at slot0.tick. In certain edge-cases of the swap algorithm, the `sqrtPrice` of\n    /// a pool can be at the lower boundary of tick `n`, but the `slot0.tick` of the pool is already `n - 1`. In this case a call to\n    /// `donate` would donate to tick `n - 1` (slot0.tick) not tick `n` (getTickAtSqrtPrice(slot0.sqrtPriceX96)).\n    /// Read the comments in `Pool.swap()` for more information about this.\n    /// @param key The key of the pool to donate to\n    /// @param amount0 The amount of currency0 to donate\n    /// @param amount1 The amount of currency1 to donate\n    /// @param hookData The data to pass through to the donate hooks\n    /// @return BalanceDelta The delta of the caller after the donate\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        returns (BalanceDelta);\n\n    /// @notice Writes the current ERC20 balance of the specified currency to transient storage\n    /// This is used to checkpoint balances for the manager and derive deltas for the caller.\n    /// @dev This MUST be called before any ERC20 tokens are sent into the contract, but can be skipped\n    /// for native tokens because the amount to settle is determined by the sent value.\n    /// However, if an ERC20 token has been synced and not settled, and the caller instead wants to settle\n    /// native funds, this function can be called with the native currency to then be able to settle the native currency\n    function sync(Currency currency) external;\n\n    /// @notice Called by the user to net out some value owed to the user\n    /// @dev Will revert if the requested amount is not available, consider using `mint` instead\n    /// @dev Can also be used as a mechanism for free flash loans\n    /// @param currency The currency to withdraw from the pool manager\n    /// @param to The address to withdraw to\n    /// @param amount The amount of currency to withdraw\n    function take(Currency currency, address to, uint256 amount) external;\n\n    /// @notice Called by the user to pay what is owed\n    /// @return paid The amount of currency settled\n    function settle() external payable returns (uint256 paid);\n\n    /// @notice Called by the user to pay on behalf of another address\n    /// @param recipient The address to credit for the payment\n    /// @return paid The amount of currency settled\n    function settleFor(address recipient) external payable returns (uint256 paid);\n\n    /// @notice WARNING - Any currency that is cleared, will be non-retrievable, and locked in the contract permanently.\n    /// A call to clear will zero out a positive balance WITHOUT a corresponding transfer.\n    /// @dev This could be used to clear a balance that is considered dust.\n    /// Additionally, the amount must be the exact positive balance. This is to enforce that the caller is aware of the amount being cleared.\n    function clear(Currency currency, uint256 amount) external;\n\n    /// @notice Called by the user to move value into ERC6909 balance\n    /// @param to The address to mint the tokens to\n    /// @param id The currency address to mint to ERC6909s, as a uint256\n    /// @param amount The amount of currency to mint\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function mint(address to, uint256 id, uint256 amount) external;\n\n    /// @notice Called by the user to move value from ERC6909 balance\n    /// @param from The address to burn the tokens from\n    /// @param id The currency address to burn from ERC6909s, as a uint256\n    /// @param amount The amount of currency to burn\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function burn(address from, uint256 id, uint256 amount) external;\n\n    /// @notice Updates the pools lp fees for the a pool that has enabled dynamic lp fees.\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The key of the pool to update dynamic LP fees for\n    /// @param newDynamicLPFee The new dynamic pool LP fee\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external;\n}\n"},"lib/v4-core/src/types/Currency.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\nimport {CustomRevert} from \"../libraries/CustomRevert.sol\";\n\ntype Currency is address;\n\nusing {greaterThan as >, lessThan as <, greaterThanOrEqualTo as >=, equals as ==} for Currency global;\nusing CurrencyLibrary for Currency global;\n\nfunction equals(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) == Currency.unwrap(other);\n}\n\nfunction greaterThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) > Currency.unwrap(other);\n}\n\nfunction lessThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) < Currency.unwrap(other);\n}\n\nfunction greaterThanOrEqualTo(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) >= Currency.unwrap(other);\n}\n\n/// @title CurrencyLibrary\n/// @dev This library allows for transferring and holding native tokens and ERC20 tokens\nlibrary CurrencyLibrary {\n    /// @notice Additional context for ERC-7751 wrapped error when a native transfer fails\n    error NativeTransferFailed();\n\n    /// @notice Additional context for ERC-7751 wrapped error when an ERC20 transfer fails\n    error ERC20TransferFailed();\n\n    /// @notice A constant to represent the native currency\n    Currency public constant ADDRESS_ZERO = Currency.wrap(address(0));\n\n    function transfer(Currency currency, address to, uint256 amount) internal {\n        // altered from https://github.com/transmissions11/solmate/blob/44a9963d4c78111f77caa0e65d677b8b46d6f2e6/src/utils/SafeTransferLib.sol\n        // modified custom error selectors\n\n        bool success;\n        if (currency.isAddressZero()) {\n            assembly (\"memory-safe\") {\n                // Transfer the ETH and revert if it fails.\n                success := call(gas(), to, amount, 0, 0, 0, 0)\n            }\n            // revert with NativeTransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(to, bytes4(0), NativeTransferFailed.selector);\n            }\n        } else {\n            assembly (\"memory-safe\") {\n                // Get a pointer to some free memory.\n                let fmp := mload(0x40)\n\n                // Write the abi-encoded calldata into memory, beginning with the function selector.\n                mstore(fmp, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n                mstore(add(fmp, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the \"to\" argument.\n                mstore(add(fmp, 36), amount) // Append the \"amount\" argument. Masking not required as it's a full 32 byte type.\n\n                success :=\n                    and(\n                        // Set success to whether the call reverted, if not we check it either\n                        // returned exactly 1 (can't just be non-zero data), or had no return data.\n                        or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n                        // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n                        // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n                        // Counterintuitively, this call must be positioned second to the or() call in the\n                        // surrounding and() call or else returndatasize() will be zero during the computation.\n                        call(gas(), currency, 0, fmp, 68, 0, 32)\n                    )\n\n                // Now clean the memory we used\n                mstore(fmp, 0) // 4 byte `selector` and 28 bytes of `to` were stored here\n                mstore(add(fmp, 0x20), 0) // 4 bytes of `to` and 28 bytes of `amount` were stored here\n                mstore(add(fmp, 0x40), 0) // 4 bytes of `amount` were stored here\n            }\n            // revert with ERC20TransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(\n                    Currency.unwrap(currency), IERC20Minimal.transfer.selector, ERC20TransferFailed.selector\n                );\n            }\n        }\n    }\n\n    function balanceOfSelf(Currency currency) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return address(this).balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(address(this));\n        }\n    }\n\n    function balanceOf(Currency currency, address owner) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return owner.balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(owner);\n        }\n    }\n\n    function isAddressZero(Currency currency) internal pure returns (bool) {\n        return Currency.unwrap(currency) == Currency.unwrap(ADDRESS_ZERO);\n    }\n\n    function toId(Currency currency) internal pure returns (uint256) {\n        return uint160(Currency.unwrap(currency));\n    }\n\n    // If the upper 12 bytes are non-zero, they will be zero-ed out\n    // Therefore, fromId() and toId() are not inverses of each other\n    function fromId(uint256 id) internal pure returns (Currency) {\n        return Currency.wrap(address(uint160(id)));\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.7.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\nimport {IERC20Metadata} from \"../../../interfaces/IERC20Metadata.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /// @dev Attempts to fetch the token decimals. A return value of false indicates that the attempt failed in some way.\n    function tryGetDecimals(IERC20 token) internal view returns (bool success, uint8 decimals) {\n        bytes4 selector = IERC20Metadata.decimals.selector;\n        assembly (\"memory-safe\") {\n            mstore(0x00, selector)\n            success := staticcall(gas(), token, 0x00, 4, 0x00, 0x20)\n            success := and(and(success, gt(returndatasize(), 0x1f)), lt(mload(0x00), 0x100))\n            decimals := mul(success, mload(0x00))\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to approve\n     * @param bubble Behavior switch if the approve call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"src/FablesRamp.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {PoolId, PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {FablesLedger} from \"./base/FablesLedger.sol\";\nimport {FablesBaseHook} from \"./base/FablesBaseHook.sol\";\n\n/// @title FablesRamp\n/// @notice The unified non-calendar fee hook. One singleton serves every non-equity pool —\n///         memecoin, blue-chip, token-issuer — each as a per-pool FLAT fee with a bounded, TTL-\n///         expiring operator override (`pokeFee` on the base hook). There is no autonomous dynamic\n///         fee: a pool charges its configured `flatPips`, and any responsiveness is applied off-chain\n///         and poked on top within `[floorPips, cap]`.\n/// @dev WHY NO ON-CHAIN VOLATILITY FEE. An earlier design priced the fee off realized volatility (a\n///      Parkinson tick-range estimator, `VolLib`). It was measured against real data and removed. A\n///      price-derived estimator can only read realized volatility from the pool's OWN series, and\n///      that has two dead ends: for memecoins it saturates, so the ramp pins at its ceiling and is a\n///      flat fee in all but name; for blue-chips the quantity that actually matters — LVR / adverse\n///      selection against the external mid — is invisible without an ORACLE. A flat fee plus an\n///      oracle-driven off-chain poke is both simpler and strictly better where it matters, so the\n///      estimator (and the sell-surcharge / quote-orientation machinery it carried) is gone.\n///\n///      The floor / flat / cap are per-pool and admin-adjustable within the deployment's absolute\n///      ceiling, so calibration is a config change, not a redeploy. The poke can only ever move the\n///      live fee inside `[max(floorPips, flatPips/2), cap]` and lapses back to `flatPips` on expiry,\n///      so a keeper failure is benign — the flat is the fee the pool really charges when unattended.\ncontract FablesRamp is FablesLedger {\n    using PoolIdLibrary for PoolKey;\n\n    error InvalidConfig();\n\n    event PoolConfigured(PoolId indexed poolId, uint24 floorPips, uint24 flatPips, uint24 maxFee);\n\n    /// @notice The flat fee (pips) each pool charges autonomously, before any poke and the cap.\n    mapping(PoolId poolId => uint24 flatPips) internal _flatPips;\n\n    constructor(IPoolManager poolManager_, address authority_, uint24 absoluteMaxFee_)\n        FablesBaseHook(poolManager_, authority_, absoluteMaxFee_)\n    {}\n\n    function _hookPermissions() internal pure override returns (Hooks.Permissions memory permissions) {\n        permissions.beforeInitialize = true;\n        permissions.beforeSwap = true;\n    }\n\n    /// @notice The flat fee configured for a pool, in pips.\n    function flatFee(PoolId poolId) external view returns (uint24) {\n        return _flatPips[poolId];\n    }\n\n    /// @notice Registers or updates a pool's flat fee and its poke bounds. `floorPips` is the\n    ///         cheapest a poke may reach, `flatPips` the fee charged with no live poke, `cap` the\n    ///         ceiling; a poke never escapes `[floorPips, cap]` and expires back to `flatPips`.\n    function setPoolConfig(PoolKey calldata key, uint24 floorPips, uint24 flatPips, uint24 cap) external restricted {\n        if (flatPips < floorPips || flatPips > cap) revert InvalidConfig();\n        PoolId poolId = key.toId();\n        _flatPips[poolId] = flatPips;\n        // Also validates floorPips >= MIN_POOL_FEE, floorPips <= cap <= ABSOLUTE_MAX_FEE.\n        _setPoolBounds(poolId, floorPips, cap);\n        emit PoolConfigured(poolId, floorPips, flatPips, cap);\n    }\n\n    /// @notice The autonomous fee is simply the pool's flat rate; the base resolver applies the poke\n    ///         override and the cap on top.\n    function _autonomousFee(PoolId poolId, IPoolManager.SwapParams memory) internal view override returns (uint256) {\n        return _flatPips[poolId];\n    }\n}\n"},"src/libraries/LedgerLib.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {FullMath} from \"v4-core/src/libraries/FullMath.sol\";\nimport {StateLibrary} from \"v4-core/src/libraries/StateLibrary.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {\n    RangeState,\n    UserPosition,\n    RangeKey,\n    ClaimFeeChange,\n    Action,\n    CallbackData,\n    PayoutData,\n    FeesForgone,\n    FeesCollected,\n    DistributorSwept,\n    ClaimFeeSwept\n} from \"../base/LedgerTypes.sol\";\n\n/// @dev The slice of the distributor the ledger probes when wiring it: the protocol token it must\n///      cache to later refuse. Declared here so `validateDistributor` can run the probe.\ninterface IDistributorFF {\n    function ff() external view returns (address);\n}\n\n/// @title LedgerLib\n/// @notice The fee-collection split for `FablesLedger`. `FablesLedger` is inherited by every hook,\n///         so this cluster (three `FullMath.mulDiv` sites and the staked/claim split) is compiled\n///         into each one. Kept a separate unit purely for organization.\n/// @dev An `internal`-function library, so its code is INLINED into the calling hook (a JUMP, not a\n///      DELEGATECALL). It runs in the hook's own context — `address(this)` is the hook,\n///      `poolManager.mint` mints to the hook, and every write lands in the hook's storage — and the\n///      storage handles it needs are passed by reference. The target chain's ~98,304-byte runtime\n///      limit makes the old EIP-170 delegatecall split unnecessary.\nlibrary LedgerLib {\n    /// @notice A deposit's settled principal exceeded the caller's stated ceiling for that currency.\n    error PrincipalAboveMax(uint256 paid, uint256 max);\n    /// @notice A withdrawal's settled principal fell short of the caller's stated floor.\n    error PrincipalBelowMin(uint256 received, uint256 min);\n\n    using CurrencyLibrary for Currency;\n    using PoolIdLibrary for PoolKey;\n    using SafeERC20 for IERC20;\n\n    /// @dev The ledger's live claim-fee policy, bundled so the unlock callback passes it in one\n    ///      argument. `bps` is the current rate, `allTimeMin` the walk's floor, `recipient` zero\n    ///      when no claim fee is taken.\n    struct ClaimFeeState {\n        uint16 bps;\n        uint16 allTimeMin;\n        address recipient;\n    }\n\n    /// @dev How far back a sync walks the claim-fee rate history; must equal the ledger's own\n    ///      `MAX_CLAIM_FEE_WALK`. Beyond it the all-time minimum is used, which can only charge LESS.\n    uint256 private constant MAX_CLAIM_FEE_WALK = 32;\n    /// @dev Must equal the ledger's own `MAX_CLAIM_FEE_BPS`.\n    uint16 private constant MAX_CLAIM_FEE_BPS = 2000;\n\n    error InvalidClaimFee();\n    error InvalidSink();\n    error DistributorNotFFAware();\n\n    /// @param id The range id being credited (the `FeesCollected` topic).\n    /// @param key The pool key of the range being credited (for the claim mints and currencies).\n    /// @param fee0 Fees realized on currency0 this collection.\n    /// @param fee1 Fees realized on currency1 this collection.\n    /// @param claimFeeBps The ledger's current claim-fee rate (an UPPER bound on what the backlog pays).\n    /// @param claimFeeAllTimeMin The lowest rate the ledger has ever stood at (the walk's fallback).\n    /// @param claimFeeRecipient Zero means no claim fee is taken at all.\n    struct CreditParams {\n        uint256 id;\n        PoolKey key;\n        uint128 fee0;\n        uint128 fee1;\n        uint16 claimFeeBps;\n        uint16 claimFeeAllTimeMin;\n        address claimFeeRecipient;\n    }\n\n    /// @notice The whole fee collection for one range: rolls the claim-fee rate forward, mints the\n    ///         fee claims, splits them between the distributor (voter) bucket and the unstaked\n    ///         accumulators, skims the claim fee, and emits `FeesCollected`. Behaviour is\n    ///         byte-for-byte what lived in the ledger's `_creditFees`.\n    /// @dev Inlined into the hook (internal), so `address(this)` is the hook, `poolManager.mint`\n    ///      mints to the hook, and the passed mappings/array ARE the hook's own storage. Fee tokens\n    ///      are settled as PoolManager claims (never token transfers), so this cannot revert on a\n    ///      hostile token and take a withdrawal down with it.\n    function creditFees(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        mapping(uint256 => uint64) storage claimFeeSyncIndex,\n        ClaimFeeChange[] storage claimFeeHistory,\n        IPoolManager poolManager,\n        CreditParams memory p\n    ) internal {\n        // Roll the range's agreed rate forward FIRST, above every early return: the rate a backlog\n        // is charged is the rate that stood when it started accruing, and this is where that is\n        // knowable. The effective rate is read at the OLD index, then the index moves to the head.\n        uint16 feeBps = claimFeeFor(\n            claimFeeHistory, claimFeeSyncIndex[p.id], p.claimFeeRecipient, p.claimFeeBps, p.claimFeeAllTimeMin\n        );\n        claimFeeSyncIndex[p.id] = uint64(claimFeeHistory.length);\n        if (p.fee0 == 0 && p.fee1 == 0) return;\n        // The mints, split and emit are in `_split` so this frame does not carry the eight storage\n        // handles alongside the split's own locals — the legacy pipeline's stack-too-deep.\n        _split(ranges[p.id], rangeKeys[p.id], distributorOwed, claimFeeOwed, poolManager, p, feeBps);\n    }\n\n    /// @dev The claim mints, the staked/unstaked split and the `FeesCollected` emit for one range\n    ///      with fees. Split off `creditFees` so its frame holds only the two owed mappings it\n    ///      writes, not all eight ledger handles.\n    function _split(\n        RangeState storage range,\n        RangeKey storage descriptor,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        IPoolManager poolManager,\n        CreditParams memory p,\n        uint16 feeBps\n    ) private {\n        // Settle fees as PoolManager claims: exact by construction (immune to a token that later\n        // turns on transfer fees) and, critically, no token contract is called, so this cannot\n        // revert and take the withdraw path down with it. It must happen on every path with fees,\n        // because these claims are how the fee half of `callerDelta` gets resolved.\n        if (p.fee0 > 0) poolManager.mint(address(this), p.key.currency0.toId(), p.fee0);\n        if (p.fee1 > 0) poolManager.mint(address(this), p.key.currency1.toId(), p.fee1);\n\n        uint256 total = range.totalShares;\n        if (total == 0) {\n            // Unreachable: fees imply a position, and a position implies shares. If it ever did\n            // happen the claims are already minted and there is no shareholder to raise an\n            // accumulator for, so the fees go to the voter pot rather than sitting unattributed.\n            distributorOwed[p.key.currency0] += p.fee0;\n            distributorOwed[p.key.currency1] += p.fee1;\n            _emitCollected(range, descriptor, poolManager, EmitArgs(p.id, p.fee0, p.fee1, p.fee0, p.fee1));\n            return;\n        }\n\n        // Carrying the remainder is load-bearing, not tidiness. `_syncRange` is permissionless and\n        // reachable from seven entry points, so ANY party chooses how many windows an epoch's fees\n        // are split across — and a plain floor division contributes exactly zero whenever\n        // `fee * totalStaked < totalShares`. Splitting one accrual into enough windows therefore\n        // drove both the voters' revenue and the staker's emission weight to zero for a few dollars\n        // of gas. The unstaked side was never exposed to this because it is credited in Q128.\n        uint256 stakedCut0 = _takeStakedCut(range, p.fee0, total, true);\n        uint256 stakedCut1 = _takeStakedCut(range, p.fee1, total, false);\n        if (stakedCut0 > 0) distributorOwed[p.key.currency0] += stakedCut0;\n        if (stakedCut1 > 0) distributorOwed[p.key.currency1] += stakedCut1;\n        _creditStaked(range, stakedCut0, stakedCut1);\n\n        uint256 unstakedTotal = total - range.totalStaked;\n        if (unstakedTotal == 0) {\n            // everything is staked: remainder (rounding dust) also goes to the distributor\n            distributorOwed[p.key.currency0] += p.fee0 - stakedCut0;\n            distributorOwed[p.key.currency1] += p.fee1 - stakedCut1;\n            _creditStaked(range, p.fee0 - stakedCut0, p.fee1 - stakedCut1); // the rounding remainder too\n            _emitCollected(range, descriptor, poolManager, EmitArgs(p.id, p.fee0, p.fee1, p.fee0, p.fee1));\n            return;\n        }\n\n        // The claim fee is taken HERE, at the rate in force while these fees were earned, and never\n        // again at claim time. Charging it on withdrawal instead made it retroactive: a single\n        // `setClaimFee` could reach back and take a share of everything every LP had already\n        // accrued under a lower rate. The skim comes off the UNSTAKED residue, after the staked\n        // cut has been set aside, so a voter syncing to fund their own claim never pays for it.\n        uint256 net0 = p.fee0 - stakedCut0;\n        uint256 net1 = p.fee1 - stakedCut1;\n        if (feeBps != 0 && p.claimFeeRecipient != address(0)) {\n            uint256 c0 = (net0 * feeBps) / 10_000;\n            uint256 c1 = (net1 * feeBps) / 10_000;\n            if (c0 > 0) claimFeeOwed[p.key.currency0] += c0;\n            if (c1 > 0) claimFeeOwed[p.key.currency1] += c1;\n            net0 -= c0;\n            net1 -= c1;\n        }\n        range.accFee0X128 += FullMath.mulDiv(net0, 1 << 128, unstakedTotal);\n        range.accFee1X128 += FullMath.mulDiv(net1, 1 << 128, unstakedTotal);\n        _emitCollected(range, descriptor, poolManager, EmitArgs(p.id, p.fee0, p.fee1, stakedCut0, stakedCut1));\n    }\n\n    /// @notice The rate a backlog that opened at history index `sinceIndex` is charged: the LOWEST\n    ///         rate that stood from then until now, capped by the current policy. Held here so both\n    ///         `creditFees` and the hook's consent guard read one definition that cannot drift.\n    /// @dev The minimum (not a time-weighted average, which is not computable from v4's single lump)\n    ///      can never charge an LP a rate the protocol was not advertising while their fees accrued,\n    ///      and it bounds the timing game: waiting can only ever LOWER the rate. Beyond\n    ///      `MAX_CLAIM_FEE_WALK` entries it falls back to the all-time minimum, which cannot\n    ///      overcharge — the direction an approximation here must fail in.\n    function claimFeeFor(\n        ClaimFeeChange[] storage claimFeeHistory,\n        uint64 sinceIndex,\n        address claimFeeRecipient,\n        uint16 claimFeeBps,\n        uint16 claimFeeAllTimeMin\n    ) internal view returns (uint16) {\n        // The backlog opened before this ledger had a claim fee at all, and the rate then was zero.\n        if (sinceIndex == 0) return 0;\n\n        uint16 rate = claimFeeRecipient == address(0) ? 0 : claimFeeBps;\n        uint256 start = uint256(sinceIndex) - 1; // the entry in force when the backlog opened\n        uint256 i = claimFeeHistory.length;\n        uint256 walked = 0;\n        while (i > start && walked < MAX_CLAIM_FEE_WALK) {\n            ClaimFeeChange storage change = claimFeeHistory[i - 1];\n            if (change.bps < rate) rate = change.bps;\n            i--;\n            walked++;\n        }\n        if (i == start) return rate; // the whole window was covered exactly\n\n        // Truncated by the cap. Fall back to the all-time minimum: bounded by definition, and it\n        // CANNOT overcharge — the direction an approximation here has to fail in.\n        uint16 floor_ = claimFeeAllTimeMin;\n        return floor_ < rate ? floor_ : rate;\n    }\n\n    /// @notice Validates a new claim-fee rate, appends it to the history, and returns the updated\n    ///         all-time minimum. The hook writes the `claimFeeBps`/`claimFeeRecipient` value-vars\n    ///         around this call.\n    /// @dev A non-zero rate needs a recipient. The recipient may be neither this hook (the\n    ///      permissionless sweep `take`s to it, so naming the hook destroys the revenue) nor the\n    ///      distributor (which cannot pay FF out as a fee — the same shape `setFFFeeSink` refuses).\n    function recordClaimFee(\n        ClaimFeeChange[] storage claimFeeHistory,\n        uint16 bps,\n        address recipient,\n        address distributor,\n        uint16 currentAllTimeMin\n    ) internal returns (uint16 newAllTimeMin) {\n        if (bps > MAX_CLAIM_FEE_BPS) revert InvalidClaimFee();\n        if (bps != 0 && recipient == address(0)) revert InvalidClaimFee();\n        if (recipient == address(this)) revert InvalidClaimFee();\n        if (recipient != address(0) && recipient == distributor) revert InvalidClaimFee();\n\n        uint256 length = claimFeeHistory.length;\n        uint16 effective = recipient == address(0) ? 0 : bps;\n        // week-granular history; block.timestamp is the ordering key, not a precise clock\n        // forge-lint: disable-next-line(block-timestamp)\n        claimFeeHistory.push(ClaimFeeChange({fromTs: uint64(block.timestamp), bps: effective}));\n        newAllTimeMin = (length == 0 || effective < currentAllTimeMin) ? effective : currentAllTimeMin;\n    }\n\n    /// @notice Validates a new distributor against the FF and claim-fee sinks (a forbidden pairing\n    ///         is reachable in EITHER call ordering, so both setters must reject it), probes it for\n    ///         the protocol token, and returns that token to cache.\n    /// @dev Zero clears the distributor and its cached FF. A live distributor must name the protocol\n    ///      token (so a later sweep can refuse FF): a probe that reverts or answers zero is refused,\n    ///      because a distributor this ledger cannot recognise FF for is one it must not feed.\n    function validateDistributor(address distributor_, address ffFeeSink, address claimFeeRecipient)\n        internal\n        view\n        returns (address distributorFF)\n    {\n        if (distributor_ == address(0)) return address(0);\n        if (distributor_ == ffFeeSink) revert InvalidSink();\n        if (distributor_ == claimFeeRecipient) revert InvalidSink();\n        if (distributor_ == address(this)) revert InvalidSink();\n        try IDistributorFF(distributor_).ff() returns (address ffToken) {\n            if (ffToken == address(0)) revert DistributorNotFFAware();\n            return ffToken;\n        } catch {\n            revert DistributorNotFFAware();\n        }\n    }\n\n    /// @dev The value fields of one `FeesCollected` emit, grouped into memory so the 13-field emit\n    ///      does not carry them all as stack slots (the legacy pipeline's stack-too-deep, the reason\n    ///      this was a separate function in the ledger too).\n    struct EmitArgs {\n        uint256 id;\n        uint256 fee0;\n        uint256 fee1;\n        uint256 cut0;\n        uint256 cut1;\n    }\n\n    /// @notice Emits the zero-fee collection that BRACKETS a liquidity re-base, so settlement always\n    ///         holds a `feeGrowthInside` reading in the fresh base.\n    /// @dev Called by `deposit` right after the pool touch that (re)creates the v4 position — the\n    ///      first instant the new base is readable. Without it, the seam between \"position emptied\"\n    ///      and \"first collection with fees\" carried NO reading in the new base: the next collection\n    ///      compared its growth against a carry still in the OLD base, the split across the re-base\n    ///      was unknowable, and settlement could only credit the whole interval to the epoch the\n    ///      collection landed in — an epoch whichever address forced the collection got to choose\n    ///      (`_syncRange` is reachable from `deposit` with one wei). Emitting the baseline here makes\n    ///      every value-bearing interval same-base by construction: no fees can accrue while the\n    ///      position is empty, and the exit's own sync collected everything before it, so this log\n    ///      carries zero value and exists purely to anchor the base. It consumes a `collectionSeq`\n    ///      like any emission, which is what makes DROPPING it detectable as a sequence gap.\n    function emitRebaseBaseline(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        IPoolManager poolManager,\n        uint256 id\n    ) internal {\n        _emitCollected(ranges[id], rangeKeys[id], poolManager, EmitArgs(id, 0, 0, 0, 0));\n    }\n\n    /// @dev Bumps the collection sequence (H6) and reads v4's live `feeGrowthInside` for the range\n    ///      at the instant of collection, then hands off to `_log`. The growth read and the emit are\n    ///      split into separate frames so the wide 13-field log does not tip the legacy pipeline into\n    ///      stack-too-deep (the reason the ledger split them too).\n    function _emitCollected(\n        RangeState storage range,\n        RangeKey storage descriptor,\n        IPoolManager poolManager,\n        EmitArgs memory e\n    ) private {\n        range.collectionSeq += 1;\n        (uint256 growth0, uint256 growth1) = _growthOf(descriptor, poolManager);\n        _log(e.id, e.fee0, e.fee1, e.cut0, e.cut1, growth0, growth1, range);\n    }\n\n    /// @dev v4's `feeGrowthInside` for a range descriptor, in its own frame so its intermediates do\n    ///      not coexist with the wide emit.\n    function _growthOf(RangeKey storage descriptor, IPoolManager poolManager) private view returns (uint256, uint256) {\n        return\n            StateLibrary.getFeeGrowthInside(\n                poolManager, descriptor.key.toId(), descriptor.tickLower, descriptor.tickUpper\n            );\n    }\n\n    /// @dev The wide emit alone. The value fields arrive as stack params and the range — read six\n    ///      times for its accumulator LEVELS, share totals and sequence anchors — is the LAST param,\n    ///      so it sits shallowest on the stack; that is the eight-slot frame the ledger's own\n    ///      `_emitCollected` used to schedule the 13-field log.\n    function _log(\n        uint256 id,\n        uint256 fee0,\n        uint256 fee1,\n        uint256 cut0,\n        uint256 cut1,\n        uint256 growth0,\n        uint256 growth1,\n        RangeState storage range\n    ) private {\n        emit FeesCollected(\n            id,\n            fee0,\n            fee1,\n            cut0,\n            cut1,\n            range.accStaked0X128,\n            range.accStaked1X128,\n            growth0,\n            growth1,\n            range.totalShares,\n            range.totalStaked,\n            range.collectionSeq,\n            range.resetSeq\n        );\n    }\n\n    /// @dev `fee * staked / total`, plus whatever previous windows could not express. `mulmod`\n    ///      gives the exact remainder without the overflow a plain `fee * staked` would risk. The\n    ///      remainder is carried as a FRACTION of one fee unit (Q128), never as the raw numerator\n    ///      `carried % total`: `total` is `totalShares`, which every withdraw shrinks, so a\n    ///      numerator written under a large denominator would later be spent under a small one and\n    ///      break `cut <= fee`. A fraction of one unit means the same at every denominator, so the\n    ///      carry survives arbitrary share movement and `cut <= fee` holds unconditionally.\n    function _takeStakedCut(RangeState storage range, uint128 fee, uint256 total, bool isToken0)\n        private\n        returns (uint256 cut)\n    {\n        uint128 staked = range.totalStaked;\n        uint256 carried = uint256(isToken0 ? range.stakedResidual0 : range.stakedResidual1)\n            + FullMath.mulDiv(mulmod(fee, staked, total), 1 << 128, total);\n        cut = FullMath.mulDiv(fee, staked, total) + (carried >> 128);\n        // masked to the low 128 bits by construction: `carried < 2^129` and the whole unit, if\n        // any, was just flushed into `cut` on the line above\n        // forge-lint: disable-next-line(unsafe-typecast)\n        uint128 keep = uint128(carried);\n        if (isToken0) range.stakedResidual0 = keep;\n        else range.stakedResidual1 = keep;\n    }\n\n    /// @dev Raises the per-staked-share accumulators by the fees staked shares just forwent.\n    function _creditStaked(RangeState storage range, uint256 cut0, uint256 cut1) private {\n        uint128 staked = range.totalStaked;\n        if (staked == 0) return;\n        if (cut0 > 0) range.accStaked0X128 += FullMath.mulDiv(cut0, 1 << 128, staked);\n        if (cut1 > 0) range.accStaked1X128 += FullMath.mulDiv(cut1, 1 << 128, staked);\n    }\n\n    /// @notice Checkpoints one holder's accrued fees and emission weight against the range's\n    ///         current accumulator levels. Called on every path that changes a holder's share\n    ///         count, so the accrual is always taken at the levels in force before the change.\n    /// @dev The hook's other `FullMath.mulDiv` cluster, kept alongside `creditFees` for organization.\n    ///      `balance` is the holder's ERC-6909 balance, passed by value; the position is mutated in\n    ///      place and `FeesForgone` is emitted with its `LedgerTypes` signature, so the settlement\n    ///      indexer sees the identical event whether the ledger or the library ran it.\n    function settleUser(\n        RangeState storage range,\n        UserPosition storage position,\n        uint256 balance,\n        address owner,\n        uint256 id\n    ) internal {\n        uint256 unstaked = balance - position.staked;\n        if (unstaked != 0) {\n            position.owed0 += uint128(FullMath.mulDiv(unstaked, range.accFee0X128 - position.checkpoint0X128, 1 << 128));\n            position.owed1 += uint128(FullMath.mulDiv(unstaked, range.accFee1X128 - position.checkpoint1X128, 1 << 128));\n        }\n        position.checkpoint0X128 = range.accFee0X128;\n        position.checkpoint1X128 = range.accFee1X128;\n\n        // Emission weight. Staked shares earn nothing here in tokens — they gave these fees to the\n        // voters — but what they gave up is exactly what they are paid emissions for, so it has to\n        // be measured per holder and not merely per range. An out-of-range position accrues zero,\n        // so it can never farm emissions for free.\n        uint128 staked = position.staked;\n        if (staked != 0) {\n            uint256 d0 = FullMath.mulDiv(staked, range.accStaked0X128 - position.stakedCheckpoint0X128, 1 << 128);\n            uint256 d1 = FullMath.mulDiv(staked, range.accStaked1X128 - position.stakedCheckpoint1X128, 1 << 128);\n            if (d0 != 0 || d1 != 0) {\n                position.forgone0 += d0;\n                position.forgone1 += d1;\n                emit FeesForgone(owner, id, d0, d1);\n            }\n        }\n        position.stakedCheckpoint0X128 = range.accStaked0X128;\n        position.stakedCheckpoint1X128 = range.accStaked1X128;\n    }\n\n    /// @notice The PoolManager unlock callback body: a PAYOUT redeems held claims into real tokens,\n    ///         and a MODIFY applies the liquidity delta then settles fees (into the ledger's\n    ///         accumulators) and principal (to/from the user). The hook's `unlockCallback` is a thin\n    ///         shell that checks the caller and calls this; it is inlined, so `address(this)` is the\n    ///         hook throughout and every write lands in the hook's storage.\n    function onUnlock(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        mapping(uint256 => uint64) storage claimFeeSyncIndex,\n        ClaimFeeChange[] storage claimFeeHistory,\n        IPoolManager poolManager,\n        ClaimFeeState memory cf,\n        bytes calldata rawData\n    ) internal returns (bytes memory) {\n        (Action action, bytes memory payload) = abi.decode(rawData, (Action, bytes));\n        if (action == Action.PAYOUT) {\n            PayoutData memory pd = abi.decode(payload, (PayoutData));\n            _redeem(poolManager, pd.currency0, pd.amount0, pd.to);\n            _redeem(poolManager, pd.currency1, pd.amount1, pd.to);\n            return \"\";\n        }\n        _onModify(\n            ranges,\n            rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            claimFeeHistory,\n            poolManager,\n            cf,\n            payload\n        );\n        return \"\";\n    }\n\n    /// @dev The MODIFY arm, in its own frame so the two balance deltas, the fee pair and the\n    ///      principal pair do not coexist with the eight ledger handles.\n    function _onModify(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        mapping(uint256 => uint64) storage claimFeeSyncIndex,\n        ClaimFeeChange[] storage claimFeeHistory,\n        IPoolManager poolManager,\n        ClaimFeeState memory cf,\n        bytes memory payload\n    ) private {\n        CallbackData memory data = abi.decode(payload, (CallbackData));\n        (BalanceDelta callerDelta, BalanceDelta feesAccrued) = poolManager.modifyLiquidity(\n            data.key,\n            IPoolManager.ModifyLiquidityParams({\n                tickLower: data.tickLower,\n                tickUpper: data.tickUpper,\n                liquidityDelta: data.liquidityDelta,\n                salt: bytes32(0)\n            }),\n            \"\"\n        );\n\n        // Fees always come to the ledger and are credited using the share totals as they stand\n        // BEFORE this action's mint/burn (callers order it so). Fee amounts are non-negative credits,\n        // computed inline so no extra locals weigh on this frame's stack.\n        creditFees(\n            ranges,\n            rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            claimFeeHistory,\n            poolManager,\n            CreditParams({\n                id: uint256(keccak256(abi.encode(data.key.toId(), data.tickLower, data.tickUpper))),\n                key: data.key,\n                // fee deltas are always non-negative credits\n                // forge-lint: disable-next-line(unsafe-typecast)\n                fee0: uint128(uint256(int256(feesAccrued.amount0()))),\n                // forge-lint: disable-next-line(unsafe-typecast)\n                fee1: uint128(uint256(int256(feesAccrued.amount1()))),\n                claimFeeBps: cf.bps,\n                claimFeeAllTimeMin: cf.allTimeMin,\n                claimFeeRecipient: cf.recipient\n            })\n        );\n\n        // Principal = callerDelta minus fees, settled in its own frame so the two deltas do not\n        // coexist with the credit call above.\n        _settlePrincipal(\n            poolManager,\n            data.key,\n            callerDelta,\n            feesAccrued,\n            data.user,\n            data.liquidityDelta,\n            data.amount0Limit,\n            data.amount1Limit\n        );\n    }\n\n    /// @dev Settles both currencies' principal for a modify: `callerDelta - feesAccrued` per side,\n    ///      after checking each side against the caller's stated bound.\n    function _settlePrincipal(\n        IPoolManager poolManager,\n        PoolKey memory key,\n        BalanceDelta callerDelta,\n        BalanceDelta feesAccrued,\n        address user,\n        int256 liquidityDelta,\n        uint128 amount0Limit,\n        uint128 amount1Limit\n    ) private {\n        int128 principal0 = callerDelta.amount0() - feesAccrued.amount0();\n        int128 principal1 = callerDelta.amount1() - feesAccrued.amount1();\n        _checkBound(principal0, liquidityDelta, amount0Limit);\n        _checkBound(principal1, liquidityDelta, amount1Limit);\n        _resolvePrincipal(poolManager, key.currency0, principal0, user);\n        _resolvePrincipal(poolManager, key.currency1, principal1, user);\n    }\n\n    /// @dev The caller's consent, checked against what the price actually decided.\n    ///\n    ///      A `liquidity` figure is not a price: the same liquidity costs `L*(1/sqrt(Pa) -\n    ///      1/sqrt(Pb))` of currency0 with the price at or below the range and `L*(sqrt(Pb) -\n    ///      sqrt(Pa))` of currency1 at or above it, against a roughly even split mid-range. So a\n    ///      price move between signing and execution silently converts the whole position into one\n    ///      leg at a price nobody agreed to — and the pull was previously bounded only by the\n    ///      caller's ERC-20 allowance. Worst on a freshly initialized pool, where there is no\n    ///      liquidity to cross, so walking the price to any target consumes no input and pays no\n    ///      fee: the manipulation is free, not merely cheap, which makes the FIRST deposit into a\n    ///      new pool the highest-value target in the system.\n    ///\n    ///      Checked per currency, in the direction the action moves value:\n    ///        - adding liquidity, the caller PAYS, so the bound is a ceiling;\n    ///        - removing it, the caller RECEIVES, so the bound is a floor.\n    ///      A zero delta is an internal fee sync that moves no principal, and is exempt.\n    function _checkBound(int128 principal, int256 liquidityDelta, uint128 limit) private pure {\n        if (liquidityDelta > 0) {\n            // widen before negating: -int128 panics on type(int128).min\n            // negating a NEGATIVE int128 inside int256 is always positive, so the uint256 cast is exact\n            // forge-lint: disable-next-line(unsafe-typecast)\n            uint256 paid = principal < 0 ? uint256(-int256(principal)) : 0;\n            if (paid > limit) revert PrincipalAboveMax(paid, limit);\n        } else if (liquidityDelta < 0) {\n            // guarded positive on the same line, so the uint256 cast is exact\n            // forge-lint: disable-next-line(unsafe-typecast)\n            uint256 received = principal > 0 ? uint256(int256(principal)) : 0;\n            if (received < limit) revert PrincipalBelowMin(received, limit);\n        }\n    }\n\n    /// @dev Redeems held claims into real tokens for `to`. Kept off the withdraw path.\n    function _redeem(IPoolManager poolManager, Currency currency, uint256 amount, address to) private {\n        if (amount == 0) return;\n        poolManager.burn(address(this), currency.toId(), amount);\n        poolManager.take(currency, to, amount);\n    }\n\n    /// @notice Burns the ledger's claims and pays `to` in real tokens, via a PAYOUT unlock. A\n    ///         failure here (paused/blocklisted token, blocked recipient) affects only this claim,\n    ///         never principal. The hook's `_payout` is a one-line call into this.\n    function payout(\n        IPoolManager poolManager,\n        Currency currency0,\n        Currency currency1,\n        uint256 amount0,\n        uint256 amount1,\n        address to\n    ) internal {\n        if (amount0 == 0 && amount1 == 0) return;\n        poolManager.unlock(\n            abi.encode(Action.PAYOUT, abi.encode(PayoutData(currency0, currency1, amount0, amount1, to)))\n        );\n    }\n\n    /// @notice Pushes a currency's accrued staked-share revenue to the distributor — or, for the\n    ///         protocol token, to the dedicated FF sink, since the epoch distributor treats every FF\n    ///         it holds as the emission tranche and would strand fee revenue arriving there.\n    function sweepDistributor(\n        mapping(Currency => uint256) storage distributorOwed,\n        IPoolManager poolManager,\n        Currency currency,\n        address distributor,\n        address distributorFF,\n        address ffFeeSink\n    ) internal {\n        uint256 amount = distributorOwed[currency];\n        if (amount == 0) return;\n        address to = Currency.unwrap(currency) == distributorFF ? ffFeeSink : distributor;\n        if (to == address(0)) return; // unset sink: the accrual simply keeps waiting\n        distributorOwed[currency] = 0;\n        payout(poolManager, currency, currency, amount, 0, to);\n        emit DistributorSwept(currency, to, amount);\n    }\n\n    /// @notice Pushes a currency's accrued claim-fee revenue to the recipient. Pull-shaped: a\n    ///         blocked recipient cannot wedge anyone else's sweep.\n    function sweepClaimFee(\n        mapping(Currency => uint256) storage claimFeeOwed,\n        IPoolManager poolManager,\n        Currency currency,\n        address claimFeeRecipient\n    ) internal {\n        uint256 amount = claimFeeOwed[currency];\n        if (claimFeeRecipient == address(0) || amount == 0) return;\n        claimFeeOwed[currency] = 0;\n        payout(poolManager, currency, currency, amount, 0, claimFeeRecipient);\n        emit ClaimFeeSwept(currency, claimFeeRecipient, amount);\n    }\n\n    /// @dev Settles one currency's principal: a negative delta is owed BY the user (pulled and\n    ///      settled to the pool manager), a positive delta is paid TO the user.\n    function _resolvePrincipal(IPoolManager poolManager, Currency currency, int128 amount, address user) private {\n        if (amount < 0) {\n            // widen before negating: -int128 panics on type(int128).min; the negation of a negative\n            // int128 is always a positive int256, so the uint256 cast is exact\n            // forge-lint: disable-next-line(unsafe-typecast)\n            uint256 owed = uint256(-int256(amount));\n            // Sync FIRST for both branches — the CurrencySettler-canonical order. For native it\n            // clears the synced-currency slot so `settle` reads the attached value; skipping it\n            // and relying on \"no ERC20 was synced yet this unlock\" would make correctness hinge\n            // on resolution ORDER (native leg before ERC20 leg), a coupling nobody would see.\n            poolManager.sync(currency);\n            if (currency.isAddressZero()) {\n                // The hook prepaid: `deposit` requires `msg.value >= amount0Max` and `_checkBound`\n                // caps `owed` at `amount0Max`, so the balance this spends from can never be short.\n                // Only a native-capable hook can reach here — every other hook's `_checkKey`\n                // refuses native pools before an unlock is ever taken.\n                poolManager.settle{value: owed}();\n            } else {\n                IERC20(Currency.unwrap(currency)).safeTransferFrom(user, address(poolManager), owed);\n                poolManager.settle();\n            }\n        } else if (amount > 0) {\n            // `take` moves native and ERC20 alike — the PoolManager itself pays the recipient.\n            // forge-lint: disable-next-line(unsafe-typecast)\n            poolManager.take(currency, user, uint256(uint128(amount)));\n        }\n    }\n}\n"},"src/base/LedgerTypes.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\n\n/// @title LedgerTypes\n/// @notice Shared ledger types split into their own file so `FablesLedger` and its inlined\n///         helper library `LedgerLib` can both reference `RangeState` without a circular import. The\n///         struct layout is unchanged from when it lived inside the ledger, so storage is\n///         identical; moving the declaration touches no slot.\nstruct RangeState {\n    uint128 totalShares;\n    uint128 totalStaked;\n    uint256 accFee0X128; // fee per unstaked share, Q128\n    uint256 accFee1X128;\n    /// @dev Fee per STAKED share, Q128 — the fees staked shares gave up. This is the\n    ///      emission weight. Within a pool, fee growth per unit of liquidity is identical\n    ///      for every in-range position at any instant, so this quantity IS in-range\n    ///      liquidity-seconds, measured in the units that matter. A position the price\n    ///      never reaches accrues exactly zero here, which is the whole point.\n    uint256 accStaked0X128;\n    uint256 accStaked1X128;\n    /// @dev Sub-unit remainder left over by the staked-cut division, carried into the next\n    ///      window so no accrual can be truncated away by splitting it across syncs. Held as\n    ///      a FRACTION of one fee unit in Q128, never as a numerator over `totalShares`:\n    ///      see `LedgerLib._takeStakedCut` for why the denominator must not appear here.\n    uint128 stakedResidual0;\n    uint128 stakedResidual1;\n    /// @dev Emitted-collection counter (H6) and zero-liquidity-crossing counter (H2). Both are\n    ///      settlement anchors, not accounting: see the `FeesCollected` params. They share a slot.\n    uint64 collectionSeq;\n    uint64 resetSeq;\n}\n\n/// @notice One claim-fee rate and the moment it took effect. Shared with `LedgerLib`, which walks\n///         the history to price a range's backlog inside `creditFees`.\nstruct ClaimFeeChange {\n    uint64 fromTs;\n    uint16 bps;\n}\n\n/// @dev The two things `poolManager.unlock` calls back to do, decoded in `LedgerLib.onUnlock`.\nenum Action {\n    MODIFY,\n    PAYOUT\n}\n\n/// @dev A liquidity-modify unlock: apply `liquidityDelta` to the range and settle principal + fees.\n///\n///      `amount0Limit`/`amount1Limit` carry the CALLER'S CONSENT to the only place that can enforce\n///      it. A liquidity quantity does not say what it costs — the token amounts come out of the\n///      pool's live price inside `modifyLiquidity` — so without these the settled principal was\n///      whatever the price happened to make it, pulled from the caller with no ceiling. On a\n///      deposit they are the MOST the caller will pay per currency; on a withdraw, the LEAST they\n///      will accept. Ignored entirely when `liquidityDelta == 0` (an internal fee sync moves no\n///      principal).\nstruct CallbackData {\n    PoolKey key;\n    int24 tickLower;\n    int24 tickUpper;\n    int256 liquidityDelta;\n    address user;\n    uint128 amount0Limit;\n    uint128 amount1Limit;\n}\n\n/// @dev A payout unlock: redeem held claims into real tokens for `to`, kept off the withdraw path.\nstruct PayoutData {\n    Currency currency0;\n    Currency currency1;\n    uint256 amount0;\n    uint256 amount1;\n    address to;\n}\n\n/// @dev Emitted when accrued staked-share revenue is pushed to the distributor (or the FF sink).\n///      File-level so `LedgerLib.sweepDistributor` emits it with the identical\n///      signature the settlement indexer reads.\nevent DistributorSwept(Currency indexed currency, address indexed distributor, uint256 amount);\n\n/// @dev Mirrors `DistributorSwept` for the claim-fee sink. Its absence was a hole in the indexer's\n///      reconstruction of the fee split, which is derived from logs alone.\nevent ClaimFeeSwept(Currency indexed currency, address indexed recipient, uint256 amount);\n\nstruct UserPosition {\n    uint128 staked;\n    uint128 owed0;\n    uint128 owed1;\n    uint256 checkpoint0X128;\n    uint256 checkpoint1X128;\n    uint256 stakedCheckpoint0X128;\n    uint256 stakedCheckpoint1X128;\n    /// @notice Cumulative fees this holder's STAKED shares gave up, per currency. The basis\n    ///         for their emission share within the pool — settlement buckets the deltas by\n    ///         epoch from `FeesForgone`, and this running total is the on-chain anchor\n    ///         anyone can check a root against.\n    uint256 forgone0;\n    uint256 forgone1;\n}\n\n/// @dev The emission weight, emitted per holder as it accrues. Settlement buckets these by\n///      epoch to split a pool's vote-won emissions among the LPs who actually earned them.\n///      File-level so `LedgerLib` emits it with the identical signature the\n///      settlement indexer already reads.\nevent FeesForgone(address indexed owner, uint256 indexed rangeId, uint256 amount0, uint256 amount1);\n\n/// @dev Range descriptor, stored on first deposit so paths without a PoolKey argument (ERC-6909\n///      transfers) can still sync the pool's lazily-accrued fees first. File-level so `LedgerLib`\n///      can read a range's `feeGrowthInside` for the `FeesCollected` emit.\nstruct RangeKey {\n    PoolKey key;\n    int24 tickLower;\n    int24 tickUpper;\n    bool set;\n}\n\n/// @dev Emitted on every fee collection so the split between voters (staked) and holders\n///      (unstaked) is reproducible from logs — the epoch-settlement trust model assumes exactly\n///      that. File-level so `LedgerLib` emits it with the identical signature the\n///      indexer reads.\n///\n///      Carries the per-staked-share accumulator LEVELS, which is what makes emission weight\n///      attributable in time. `FeesForgone` fires when a holder is settled, and a settle can be\n///      triggered by anyone (a dust transfer settles the receiver) at any block — so its timestamp\n///      says when someone poked the position, not when the fees were earned. These levels move only\n///      inside the collection itself, so integrating them against the Staked/Unstaked timeline\n///      gives each holder's weight per epoch regardless of when anyone settles.\n///\n///      `feeGrowthInside0X128`/`1X128` are v4's own per-liquidity accumulator for the range, read at\n///      the instant of collection: a week's forgone fees become a function of what the position\n///      GENERATED rather than of when somebody collected it, so settlement can split a segment that\n///      straddles a week boundary AT the boundary, identically for every holder. `totalShares`/\n///      `totalStaked` carry the staked fraction rather than reconstructing it. `collectionSeq`\n///      increments on EVERY emitted collection, so a DROPPED log is a visible gap and its epoch is\n///      quarantined rather than under-paid (H6); `resetSeq` increments whenever the range's v4\n///      position crosses zero liquidity in EITHER direction — the deterministic re-base signal that\n///      replaced the indexer's steerable magnitude heuristic (H2).\nevent FeesCollected(\n    uint256 indexed rangeId,\n    uint256 fee0,\n    uint256 fee1,\n    uint256 stakedCut0,\n    uint256 stakedCut1,\n    uint256 accStaked0X128,\n    uint256 accStaked1X128,\n    uint256 feeGrowthInside0X128,\n    uint256 feeGrowthInside1X128,\n    uint128 totalShares,\n    uint128 totalStaked,\n    uint64 collectionSeq,\n    uint64 resetSeq\n);\n"},"lib/v4-core/src/types/PoolKey.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"./Currency.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {PoolIdLibrary} from \"./PoolId.sol\";\n\nusing PoolIdLibrary for PoolKey global;\n\n/// @notice Returns the key for identifying a pool\nstruct PoolKey {\n    /// @notice The lower currency of the pool, sorted numerically\n    Currency currency0;\n    /// @notice The higher currency of the pool, sorted numerically\n    Currency currency1;\n    /// @notice The pool LP fee, capped at 1_000_000. If the highest bit is 1, the pool has a dynamic fee and must be exactly equal to 0x800000\n    uint24 fee;\n    /// @notice Ticks that involve positions must be a multiple of tick spacing\n    int24 tickSpacing;\n    /// @notice The hooks of the pool\n    IHooks hooks;\n}\n"},"lib/v4-core/src/interfaces/IHooks.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {IPoolManager} from \"./IPoolManager.sol\";\nimport {BeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\n/// See the Hooks library for the full spec.\n/// @dev Should only be callable by the v4 PoolManager.\ninterface IHooks {\n    /// @notice The hook called before the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @return bytes4 The function selector for the hook\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96) external returns (bytes4);\n\n    /// @notice The hook called after the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @param tick The current tick after the state of a pool is initialized\n    /// @return bytes4 The function selector for the hook\n    function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n        external\n        returns (bytes4);\n\n    /// @notice The hook called before liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param delta The caller's balance delta after adding liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param delta The caller's balance delta after removing liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BeforeSwapDelta The hook's delta in specified and unspecified currencies. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    /// @return uint24 Optionally override the lp fee, only used if three conditions are met: 1. the Pool has a dynamic fee, 2. the value's 2nd highest bit is set (23rd bit, 0x400000), and 3. the value is less than or equal to the maximum fee (1 million)\n    function beforeSwap(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.SwapParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4, BeforeSwapDelta, uint24);\n\n    /// @notice The hook called after a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param delta The amount owed to the caller (positive) or owed to the pool (negative)\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return int128 The hook's delta in unspecified currency. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external returns (bytes4, int128);\n\n    /// @notice The hook called before donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function afterDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n}\n"},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for claims over a contract balance, wrapped as a ERC6909\ninterface IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event OperatorSet(address indexed owner, address indexed operator, bool approved);\n\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);\n\n    event Transfer(address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount);\n\n    /*//////////////////////////////////////////////////////////////\n                                 FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice Owner balance of an id.\n    /// @param owner The address of the owner.\n    /// @param id The id of the token.\n    /// @return amount The balance of the token.\n    function balanceOf(address owner, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Spender allowance of an id.\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @return amount The allowance of the token.\n    function allowance(address owner, address spender, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Checks if a spender is approved by an owner as an operator\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @return approved The approval status.\n    function isOperator(address owner, address spender) external view returns (bool approved);\n\n    /// @notice Transfers an amount of an id from the caller to a receiver.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Transfers an amount of an id from a sender to a receiver.\n    /// @param sender The address of the sender.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Approves an amount of an id to a spender.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always\n    function approve(address spender, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Sets or removes an operator for the caller.\n    /// @param operator The address of the operator.\n    /// @param approved The approval status.\n    /// @return bool True, always\n    function setOperator(address operator, bool approved) external returns (bool);\n}\n"},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\n\n/// @notice Interface for all protocol-fee related functions in the pool manager\ninterface IProtocolFees {\n    /// @notice Thrown when protocol fee is set too high\n    error ProtocolFeeTooLarge(uint24 fee);\n\n    /// @notice Thrown when collectProtocolFees or setProtocolFee is not called by the controller.\n    error InvalidCaller();\n\n    /// @notice Thrown when collectProtocolFees is attempted on a token that is synced.\n    error ProtocolFeeCurrencySynced();\n\n    /// @notice Emitted when the protocol fee controller address is updated in setProtocolFeeController.\n    event ProtocolFeeControllerUpdated(address indexed protocolFeeController);\n\n    /// @notice Emitted when the protocol fee is updated for a pool.\n    event ProtocolFeeUpdated(PoolId indexed id, uint24 protocolFee);\n\n    /// @notice Given a currency address, returns the protocol fees accrued in that currency\n    /// @param currency The currency to check\n    /// @return amount The amount of protocol fees accrued in the currency\n    function protocolFeesAccrued(Currency currency) external view returns (uint256 amount);\n\n    /// @notice Sets the protocol fee for the given pool\n    /// @param key The key of the pool to set a protocol fee for\n    /// @param newProtocolFee The fee to set\n    function setProtocolFee(PoolKey memory key, uint24 newProtocolFee) external;\n\n    /// @notice Sets the protocol fee controller\n    /// @param controller The new protocol fee controller\n    function setProtocolFeeController(address controller) external;\n\n    /// @notice Collects the protocol fees for a given recipient and currency, returning the amount collected\n    /// @dev This will revert if the contract is unlocked\n    /// @param recipient The address to receive the protocol fees\n    /// @param currency The currency to withdraw\n    /// @param amount The amount of currency to withdraw\n    /// @return amountCollected The amount of currency successfully withdrawn\n    function collectProtocolFees(address recipient, Currency currency, uint256 amount)\n        external\n        returns (uint256 amountCollected);\n\n    /// @notice Returns the current protocol fee controller address\n    /// @return address The current protocol fee controller address\n    function protocolFeeController() external view returns (address);\n}\n"},"lib/v4-core/src/types/BalanceDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\n\n/// @dev Two `int128` values packed into a single `int256` where the upper 128 bits represent the amount0\n/// and the lower 128 bits represent the amount1.\ntype BalanceDelta is int256;\n\nusing {add as +, sub as -, eq as ==, neq as !=} for BalanceDelta global;\nusing BalanceDeltaLibrary for BalanceDelta global;\nusing SafeCast for int256;\n\nfunction toBalanceDelta(int128 _amount0, int128 _amount1) pure returns (BalanceDelta balanceDelta) {\n    assembly (\"memory-safe\") {\n        balanceDelta := or(shl(128, _amount0), and(sub(shl(128, 1), 1), _amount1))\n    }\n}\n\nfunction add(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := add(a0, b0)\n        res1 := add(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction sub(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := sub(a0, b0)\n        res1 := sub(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction eq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) == BalanceDelta.unwrap(b);\n}\n\nfunction neq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) != BalanceDelta.unwrap(b);\n}\n\n/// @notice Library for getting the amount0 and amount1 deltas from the BalanceDelta type\nlibrary BalanceDeltaLibrary {\n    /// @notice A BalanceDelta of 0\n    BalanceDelta public constant ZERO_DELTA = BalanceDelta.wrap(0);\n\n    function amount0(BalanceDelta balanceDelta) internal pure returns (int128 _amount0) {\n        assembly (\"memory-safe\") {\n            _amount0 := sar(128, balanceDelta)\n        }\n    }\n\n    function amount1(BalanceDelta balanceDelta) internal pure returns (int128 _amount1) {\n        assembly (\"memory-safe\") {\n            _amount1 := signextend(15, balanceDelta)\n        }\n    }\n}\n"},"lib/v4-core/src/types/PoolId.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"./PoolKey.sol\";\n\ntype PoolId is bytes32;\n\n/// @notice Library for computing the ID of a pool\nlibrary PoolIdLibrary {\n    /// @notice Returns value equal to keccak256(abi.encode(poolKey))\n    function toId(PoolKey memory poolKey) internal pure returns (PoolId poolId) {\n        assembly (\"memory-safe\") {\n            // 0xa0 represents the total size of the poolKey struct (5 slots of 32 bytes)\n            poolId := keccak256(poolKey, 0xa0)\n        }\n    }\n}\n"},"lib/v4-core/src/interfaces/IExtsload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for functions to access any storage slot in a contract\ninterface IExtsload {\n    /// @notice Called by external contracts to access granular pool state\n    /// @param slot Key of slot to sload\n    /// @return value The value of the slot as bytes32\n    function extsload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access granular pool state\n    /// @param startSlot Key of slot to start sloading from\n    /// @param nSlots Number of slots to load into return value\n    /// @return values List of loaded values.\n    function extsload(bytes32 startSlot, uint256 nSlots) external view returns (bytes32[] memory values);\n\n    /// @notice Called by external contracts to access sparse pool state\n    /// @param slots List of slots to SLOAD from.\n    /// @return values List of loaded values.\n    function extsload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"lib/v4-core/src/interfaces/IExttload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/// @notice Interface for functions to access any transient storage slot in a contract\ninterface IExttload {\n    /// @notice Called by external contracts to access transient storage of the contract\n    /// @param slot Key of slot to tload\n    /// @return value The value of the slot as bytes32\n    function exttload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access sparse transient pool state\n    /// @param slots List of slots to tload\n    /// @return values List of loaded values\n    function exttload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Minimal ERC20 interface for Uniswap\n/// @notice Contains a subset of the full ERC20 interface that is used in Uniswap V3\ninterface IERC20Minimal {\n    /// @notice Returns an account's balance in the token\n    /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n    /// @return The number of tokens held by the account\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n    /// @param recipient The account that will receive the amount transferred\n    /// @param amount The number of tokens to send from the sender to the recipient\n    /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Returns the current allowance given to a spender by an owner\n    /// @param owner The account of the token owner\n    /// @param spender The account of the token spender\n    /// @return The current allowance granted by `owner` to `spender`\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n    /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n    /// @param amount The amount of tokens allowed to be used by `spender`\n    /// @return Returns true for a successful approval, false for unsuccessful\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n    /// @param sender The account from which the transfer will be initiated\n    /// @param recipient The recipient of the transfer\n    /// @param amount The amount of the transfer\n    /// @return Returns true for a successful transfer, false for unsuccessful\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n    /// @param from The account from which the tokens were sent, i.e. the balance decreased\n    /// @param to The account to which the tokens were sent, i.e. the balance increased\n    /// @param value The amount of tokens that were transferred\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n    /// @param owner The account that approved spending of its tokens\n    /// @param spender The account for which the spending allowance was modified\n    /// @param value The new allowance from the owner to the spender\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"lib/v4-core/src/libraries/CustomRevert.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Library for reverting with custom errors efficiently\n/// @notice Contains functions for reverting with custom errors with different argument types efficiently\n/// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with\n/// `CustomError.selector.revertWith()`\n/// @dev The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\nlibrary CustomRevert {\n    /// @dev ERC-7751 error for wrapping bubbled up reverts\n    error WrappedError(address target, bytes4 selector, bytes reason, bytes details);\n\n    /// @dev Reverts with the selector of a custom error in the scratch space\n    function revertWith(bytes4 selector) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            revert(0, 0x04)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an address argument in the scratch space\n    function revertWith(bytes4 selector, address addr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an int24 argument in the scratch space\n    function revertWith(bytes4 selector, int24 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, signextend(2, value))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with a uint160 argument in the scratch space\n    function revertWith(bytes4 selector, uint160 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two int24 arguments\n    function revertWith(bytes4 selector, int24 value1, int24 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), signextend(2, value1))\n            mstore(add(fmp, 0x24), signextend(2, value2))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two uint160 arguments\n    function revertWith(bytes4 selector, uint160 value1, uint160 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two address arguments\n    function revertWith(bytes4 selector, address value1, address value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @notice bubble up the revert message returned by a call and revert with a wrapped ERC-7751 error\n    /// @dev this method can be vulnerable to revert data bombs\n    function bubbleUpAndRevertWith(\n        address revertingContract,\n        bytes4 revertingFunctionSelector,\n        bytes4 additionalContext\n    ) internal pure {\n        bytes4 wrappedErrorSelector = WrappedError.selector;\n        assembly (\"memory-safe\") {\n            // Ensure the size of the revert data is a multiple of 32 bytes\n            let encodedDataSize := mul(div(add(returndatasize(), 31), 32), 32)\n\n            let fmp := mload(0x40)\n\n            // Encode wrapped error selector, address, function selector, offset, additional context, size, revert reason\n            mstore(fmp, wrappedErrorSelector)\n            mstore(add(fmp, 0x04), and(revertingContract, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(\n                add(fmp, 0x24),\n                and(revertingFunctionSelector, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            // offset revert reason\n            mstore(add(fmp, 0x44), 0x80)\n            // offset additional context\n            mstore(add(fmp, 0x64), add(0xa0, encodedDataSize))\n            // size revert reason\n            mstore(add(fmp, 0x84), returndatasize())\n            // revert reason\n            returndatacopy(add(fmp, 0xa4), 0, returndatasize())\n            // size additional context\n            mstore(add(fmp, add(0xa4, encodedDataSize)), 0x04)\n            // additional context\n            mstore(\n                add(fmp, add(0xc4, encodedDataSize)),\n                and(additionalContext, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            revert(fmp, add(0xe4, encodedDataSize))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20Metadata} from \"../token/ERC20/extensions/IERC20Metadata.sol\";\n"},"lib/v4-core/src/libraries/Hooks.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\nimport {LPFeeLibrary} from \"./LPFeeLibrary.sol\";\nimport {BalanceDelta, toBalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ParseBytes} from \"./ParseBytes.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\nlibrary Hooks {\n    using LPFeeLibrary for uint24;\n    using Hooks for IHooks;\n    using SafeCast for int256;\n    using BeforeSwapDeltaLibrary for BeforeSwapDelta;\n    using ParseBytes for bytes;\n    using CustomRevert for bytes4;\n\n    uint160 internal constant ALL_HOOK_MASK = uint160((1 << 14) - 1);\n\n    uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;\n    uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;\n\n    uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;\n\n    uint160 internal constant BEFORE_REMOVE_LIQUIDITY_FLAG = 1 << 9;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_FLAG = 1 << 8;\n\n    uint160 internal constant BEFORE_SWAP_FLAG = 1 << 7;\n    uint160 internal constant AFTER_SWAP_FLAG = 1 << 6;\n\n    uint160 internal constant BEFORE_DONATE_FLAG = 1 << 5;\n    uint160 internal constant AFTER_DONATE_FLAG = 1 << 4;\n\n    uint160 internal constant BEFORE_SWAP_RETURNS_DELTA_FLAG = 1 << 3;\n    uint160 internal constant AFTER_SWAP_RETURNS_DELTA_FLAG = 1 << 2;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 1;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 0;\n\n    struct Permissions {\n        bool beforeInitialize;\n        bool afterInitialize;\n        bool beforeAddLiquidity;\n        bool afterAddLiquidity;\n        bool beforeRemoveLiquidity;\n        bool afterRemoveLiquidity;\n        bool beforeSwap;\n        bool afterSwap;\n        bool beforeDonate;\n        bool afterDonate;\n        bool beforeSwapReturnDelta;\n        bool afterSwapReturnDelta;\n        bool afterAddLiquidityReturnDelta;\n        bool afterRemoveLiquidityReturnDelta;\n    }\n\n    /// @notice Thrown if the address will not lead to the specified hook calls being called\n    /// @param hooks The address of the hooks contract\n    error HookAddressNotValid(address hooks);\n\n    /// @notice Hook did not return its selector\n    error InvalidHookResponse();\n\n    /// @notice Additional context for ERC-7751 wrapped error when a hook call fails\n    error HookCallFailed();\n\n    /// @notice The hook's delta changed the swap from exactIn to exactOut or vice versa\n    error HookDeltaExceedsSwapAmount();\n\n    /// @notice Utility function intended to be used in hook constructors to ensure\n    /// the deployed hooks address causes the intended hooks to be called\n    /// @param permissions The hooks that are intended to be called\n    /// @dev permissions param is memory as the function will be called from constructors\n    function validateHookPermissions(IHooks self, Permissions memory permissions) internal pure {\n        if (\n            permissions.beforeInitialize != self.hasPermission(BEFORE_INITIALIZE_FLAG)\n                || permissions.afterInitialize != self.hasPermission(AFTER_INITIALIZE_FLAG)\n                || permissions.beforeAddLiquidity != self.hasPermission(BEFORE_ADD_LIQUIDITY_FLAG)\n                || permissions.afterAddLiquidity != self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG)\n                || permissions.beforeRemoveLiquidity != self.hasPermission(BEFORE_REMOVE_LIQUIDITY_FLAG)\n                || permissions.afterRemoveLiquidity != self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)\n                || permissions.beforeSwap != self.hasPermission(BEFORE_SWAP_FLAG)\n                || permissions.afterSwap != self.hasPermission(AFTER_SWAP_FLAG)\n                || permissions.beforeDonate != self.hasPermission(BEFORE_DONATE_FLAG)\n                || permissions.afterDonate != self.hasPermission(AFTER_DONATE_FLAG)\n                || permissions.beforeSwapReturnDelta != self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)\n                || permissions.afterSwapReturnDelta != self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)\n                || permissions.afterAddLiquidityReturnDelta != self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)\n                || permissions.afterRemoveLiquidityReturnDelta\n                    != self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n        ) {\n            HookAddressNotValid.selector.revertWith(address(self));\n        }\n    }\n\n    /// @notice Ensures that the hook address includes at least one hook flag or dynamic fees, or is the 0 address\n    /// @param self The hook to verify\n    /// @param fee The fee of the pool the hook is used with\n    /// @return bool True if the hook address is valid\n    function isValidHookAddress(IHooks self, uint24 fee) internal pure returns (bool) {\n        // The hook can only have a flag to return a hook delta on an action if it also has the corresponding action flag\n        if (!self.hasPermission(BEFORE_SWAP_FLAG) && self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)) return false;\n        if (!self.hasPermission(AFTER_SWAP_FLAG) && self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)) return false;\n        if (!self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG) && self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG))\n        {\n            return false;\n        }\n        if (\n            !self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)\n                && self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n        ) return false;\n\n        // If there is no hook contract set, then fee cannot be dynamic\n        // If a hook contract is set, it must have at least 1 flag set, or have a dynamic fee\n        return address(self) == address(0)\n            ? !fee.isDynamicFee()\n            : (uint160(address(self)) & ALL_HOOK_MASK > 0 || fee.isDynamicFee());\n    }\n\n    /// @notice performs a hook call using the given calldata on the given hook that doesn't return a delta\n    /// @return result The complete data returned by the hook\n    function callHook(IHooks self, bytes memory data) internal returns (bytes memory result) {\n        bool success;\n        assembly (\"memory-safe\") {\n            success := call(gas(), self, 0, add(data, 0x20), mload(data), 0, 0)\n        }\n        // Revert with FailedHookCall, containing any error message to bubble up\n        if (!success) CustomRevert.bubbleUpAndRevertWith(address(self), bytes4(data), HookCallFailed.selector);\n\n        // The call was successful, fetch the returned data\n        assembly (\"memory-safe\") {\n            // allocate result byte array from the free memory pointer\n            result := mload(0x40)\n            // store new free memory pointer at the end of the array padded to 32 bytes\n            mstore(0x40, add(result, and(add(returndatasize(), 0x3f), not(0x1f))))\n            // store length in memory\n            mstore(result, returndatasize())\n            // copy return data to result\n            returndatacopy(add(result, 0x20), 0, returndatasize())\n        }\n\n        // Length must be at least 32 to contain the selector. Check expected selector and returned selector match.\n        if (result.length < 32 || result.parseSelector() != data.parseSelector()) {\n            InvalidHookResponse.selector.revertWith();\n        }\n    }\n\n    /// @notice performs a hook call using the given calldata on the given hook\n    /// @return int256 The delta returned by the hook\n    function callHookWithReturnDelta(IHooks self, bytes memory data, bool parseReturn) internal returns (int256) {\n        bytes memory result = callHook(self, data);\n\n        // If this hook wasn't meant to return something, default to 0 delta\n        if (!parseReturn) return 0;\n\n        // A length of 64 bytes is required to return a bytes4, and a 32 byte delta\n        if (result.length != 64) InvalidHookResponse.selector.revertWith();\n        return result.parseReturnDelta();\n    }\n\n    /// @notice modifier to prevent calling a hook if they initiated the action\n    modifier noSelfCall(IHooks self) {\n        if (msg.sender != address(self)) {\n            _;\n        }\n    }\n\n    /// @notice calls beforeInitialize hook if permissioned and validates return value\n    function beforeInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96) internal noSelfCall(self) {\n        if (self.hasPermission(BEFORE_INITIALIZE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeInitialize, (msg.sender, key, sqrtPriceX96)));\n        }\n    }\n\n    /// @notice calls afterInitialize hook if permissioned and validates return value\n    function afterInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96, int24 tick)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(AFTER_INITIALIZE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.afterInitialize, (msg.sender, key, sqrtPriceX96, tick)));\n        }\n    }\n\n    /// @notice calls beforeModifyLiquidity hook if permissioned and validates return value\n    function beforeModifyLiquidity(\n        IHooks self,\n        PoolKey memory key,\n        IPoolManager.ModifyLiquidityParams memory params,\n        bytes calldata hookData\n    ) internal noSelfCall(self) {\n        if (params.liquidityDelta > 0 && self.hasPermission(BEFORE_ADD_LIQUIDITY_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeAddLiquidity, (msg.sender, key, params, hookData)));\n        } else if (params.liquidityDelta <= 0 && self.hasPermission(BEFORE_REMOVE_LIQUIDITY_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeRemoveLiquidity, (msg.sender, key, params, hookData)));\n        }\n    }\n\n    /// @notice calls afterModifyLiquidity hook if permissioned and validates return value\n    function afterModifyLiquidity(\n        IHooks self,\n        PoolKey memory key,\n        IPoolManager.ModifyLiquidityParams memory params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) internal returns (BalanceDelta callerDelta, BalanceDelta hookDelta) {\n        if (msg.sender == address(self)) return (delta, BalanceDeltaLibrary.ZERO_DELTA);\n\n        callerDelta = delta;\n        if (params.liquidityDelta > 0) {\n            if (self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG)) {\n                hookDelta = BalanceDelta.wrap(\n                    self.callHookWithReturnDelta(\n                        abi.encodeCall(\n                            IHooks.afterAddLiquidity, (msg.sender, key, params, delta, feesAccrued, hookData)\n                        ),\n                        self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)\n                    )\n                );\n                callerDelta = callerDelta - hookDelta;\n            }\n        } else {\n            if (self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)) {\n                hookDelta = BalanceDelta.wrap(\n                    self.callHookWithReturnDelta(\n                        abi.encodeCall(\n                            IHooks.afterRemoveLiquidity, (msg.sender, key, params, delta, feesAccrued, hookData)\n                        ),\n                        self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n                    )\n                );\n                callerDelta = callerDelta - hookDelta;\n            }\n        }\n    }\n\n    /// @notice calls beforeSwap hook if permissioned and validates return value\n    function beforeSwap(IHooks self, PoolKey memory key, IPoolManager.SwapParams memory params, bytes calldata hookData)\n        internal\n        returns (int256 amountToSwap, BeforeSwapDelta hookReturn, uint24 lpFeeOverride)\n    {\n        amountToSwap = params.amountSpecified;\n        if (msg.sender == address(self)) return (amountToSwap, BeforeSwapDeltaLibrary.ZERO_DELTA, lpFeeOverride);\n\n        if (self.hasPermission(BEFORE_SWAP_FLAG)) {\n            bytes memory result = callHook(self, abi.encodeCall(IHooks.beforeSwap, (msg.sender, key, params, hookData)));\n\n            // A length of 96 bytes is required to return a bytes4, a 32 byte delta, and an LP fee\n            if (result.length != 96) InvalidHookResponse.selector.revertWith();\n\n            // dynamic fee pools that want to override the cache fee, return a valid fee with the override flag. If override flag\n            // is set but an invalid fee is returned, the transaction will revert. Otherwise the current LP fee will be used\n            if (key.fee.isDynamicFee()) lpFeeOverride = result.parseFee();\n\n            // skip this logic for the case where the hook return is 0\n            if (self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)) {\n                hookReturn = BeforeSwapDelta.wrap(result.parseReturnDelta());\n\n                // any return in unspecified is passed to the afterSwap hook for handling\n                int128 hookDeltaSpecified = hookReturn.getSpecifiedDelta();\n\n                // Update the swap amount according to the hook's return, and check that the swap type doesn't change (exact input/output)\n                if (hookDeltaSpecified != 0) {\n                    bool exactInput = amountToSwap < 0;\n                    amountToSwap += hookDeltaSpecified;\n                    if (exactInput ? amountToSwap > 0 : amountToSwap < 0) {\n                        HookDeltaExceedsSwapAmount.selector.revertWith();\n                    }\n                }\n            }\n        }\n    }\n\n    /// @notice calls afterSwap hook if permissioned and validates return value\n    function afterSwap(\n        IHooks self,\n        PoolKey memory key,\n        IPoolManager.SwapParams memory params,\n        BalanceDelta swapDelta,\n        bytes calldata hookData,\n        BeforeSwapDelta beforeSwapHookReturn\n    ) internal returns (BalanceDelta, BalanceDelta) {\n        if (msg.sender == address(self)) return (swapDelta, BalanceDeltaLibrary.ZERO_DELTA);\n\n        int128 hookDeltaSpecified = beforeSwapHookReturn.getSpecifiedDelta();\n        int128 hookDeltaUnspecified = beforeSwapHookReturn.getUnspecifiedDelta();\n\n        if (self.hasPermission(AFTER_SWAP_FLAG)) {\n            hookDeltaUnspecified += self.callHookWithReturnDelta(\n                abi.encodeCall(IHooks.afterSwap, (msg.sender, key, params, swapDelta, hookData)),\n                self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)\n            ).toInt128();\n        }\n\n        BalanceDelta hookDelta;\n        if (hookDeltaUnspecified != 0 || hookDeltaSpecified != 0) {\n            hookDelta = (params.amountSpecified < 0 == params.zeroForOne)\n                ? toBalanceDelta(hookDeltaSpecified, hookDeltaUnspecified)\n                : toBalanceDelta(hookDeltaUnspecified, hookDeltaSpecified);\n\n            // the caller has to pay for (or receive) the hook's delta\n            swapDelta = swapDelta - hookDelta;\n        }\n        return (swapDelta, hookDelta);\n    }\n\n    /// @notice calls beforeDonate hook if permissioned and validates return value\n    function beforeDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(BEFORE_DONATE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeDonate, (msg.sender, key, amount0, amount1, hookData)));\n        }\n    }\n\n    /// @notice calls afterDonate hook if permissioned and validates return value\n    function afterDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(AFTER_DONATE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.afterDonate, (msg.sender, key, amount0, amount1, hookData)));\n        }\n    }\n\n    function hasPermission(IHooks self, uint160 flag) internal pure returns (bool) {\n        return uint160(address(self)) & flag != 0;\n    }\n}\n"},"src/base/FablesLedger.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {PoolId, PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {StateLibrary} from \"v4-core/src/libraries/StateLibrary.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {ERC6909} from \"v4-core/src/ERC6909.sol\";\nimport {ReentrancyGuardTransient} from \"@openzeppelin/contracts/utils/ReentrancyGuardTransient.sol\";\nimport {FablesBaseHook} from \"./FablesBaseHook.sol\";\nimport {\n    RangeState,\n    UserPosition,\n    RangeKey,\n    ClaimFeeChange,\n    Action,\n    CallbackData,\n    PayoutData,\n    FeesForgone,\n    FeesCollected,\n    DistributorSwept,\n    ClaimFeeSwept\n} from \"./LedgerTypes.sol\";\nimport {LedgerLib} from \"../libraries/LedgerLib.sol\";\n\n/// @title FablesLedger\n/// @notice Per-range liquidity ledger inside the singleton hook: users deposit concentrated\n///         liquidity in any tick range; the hook holds one PoolManager position per range and\n///         mints ERC-6909 receipts 1:1 with liquidity units.\n/// @dev Founding constraints, in order of importance:\n///       - WITHDRAWALS ARE UNCONDITIONAL. The withdraw path reads no admin state: no pause,\n///         no oracle, no distributor, no claim fee on principal; staked shares auto-unstake.\n///         It also makes no token call on the ledger's own behalf: collected fees settle as\n///         PoolManager ERC-6909 claims, never as transfers to this contract. A token that\n///         blocklists THIS contract therefore cannot freeze anyone's principal, and the only\n///         transfer on the path is the PoolManager paying the withdrawer directly.\n///       - SOLVENT BY CONSTRUCTION. Shares are liquidity units (no exchange rate), so\n///         totalShares(range) == position liquidity is an invariant, not an aspiration, and\n///         there is no share-price inflation attack surface.\n///       - Fees accrue per range via Q128 accumulators, checkpointed on every share change;\n///         claims are pull-only. A claim fee (default 0) applies to FEES exclusively.\n///       - The staking switch ships dormant: staked shares route their fee accrual to a\n///         settable distributor instead of the holder. It costs nothing until used and\n///         cannot be retrofitted later (contracts are immutable).\n/// @dev The slice of the Voter this contract needs: does `account` back `poolId` with a lock it\n///      owns? Declared here rather than importing the Voter so the hook does not carry the whole\n///      voting contract in its bytecode, and so the two can be deployed in either order.\ninterface IBallotGate {\n    function ballotBacks(address account, uint256 tokenId, PoolId poolId) external view returns (bool);\n    function isGaugeKilled(PoolId poolId) external view returns (bool);\n    function isGaugeLive(PoolId poolId) external view returns (bool);\n    function isGaugeEarning(PoolId poolId) external view returns (bool);\n}\n\nabstract contract FablesLedger is FablesBaseHook, ERC6909, ReentrancyGuardTransient, IUnlockCallback {\n    using PoolIdLibrary for PoolKey;\n    using CurrencyLibrary for Currency;\n\n    error LedgerPaused();\n    error PauseTooLong();\n    error ZeroLiquidity();\n    /// @notice The transaction was mined after the caller's stated deadline.\n    error DeadlineExpired();\n    error InsufficientUnstakedShares();\n    error ZeroShares();\n    error ZeroAddress();\n    error InvalidSink();\n    // Reverted from inside `LedgerLib` on the admin paths, so they surface through this\n    // contract with these selectors; declared here for that ABI surface and cost no bytecode.\n    error InvalidClaimFee();\n    error DistributorNotFFAware();\n    error ClaimFeeAboveMax();\n    error NothingToClaim();\n    error NotAVoterOfThisPool();\n    error BallotGateUnset();\n    error DeskRetired();\n    error InvalidBallotGate();\n    error InvalidMsgValue();\n    error RefundFailed();\n\n    event Deposited(address indexed owner, uint256 indexed rangeId, uint128 liquidity);\n    event Withdrawn(address indexed owner, uint256 indexed rangeId, uint128 liquidity);\n    event FeesClaimed(address indexed owner, uint256 indexed rangeId, uint256 amount0, uint256 amount1);\n    event Staked(address indexed owner, uint256 indexed rangeId, uint128 shares);\n    // `FeesForgone` is declared in `LedgerTypes.sol`, so `LedgerLib` emits it with\n    // the identical signature the settlement indexer reads.\n    event Unstaked(address indexed owner, uint256 indexed rangeId, uint128 shares);\n    // `FeesCollected` is declared in `LedgerTypes.sol` (with its full per-field settlement\n    // rationale), so `LedgerLib.creditFees` emits it with the identical signature\n    // the indexer reads.\n    // `DistributorSwept` and `ClaimFeeSwept` are declared in `LedgerTypes.sol`, so\n    // `LedgerLib`'s sweep functions emit them with the identical signatures the\n    // indexer reads.\n    event ClaimFeeSet(uint16 bps, address recipient);\n    event DistributorSet(address distributor);\n    event FFFeeSinkSet(address sink);\n    event PausedSet(uint256 pausedUntil);\n    event BallotGateSet(address gate);\n\n    uint16 public constant MAX_CLAIM_FEE_BPS = 2000; // 20%, fixed in bytecode\n    /// @dev How far back a sync will walk the rate history. Beyond it the all-time minimum is\n    ///      used, which can only ever charge LESS — never more — than the true window minimum.\n    ///      This cap, not a cooldown, is what bounds the cost: it holds whatever the history\n    ///      length, and the AccessManager execution delay on `setClaimFee` already stops the\n    ///      history being grown quickly in the first place.\n    uint256 public constant MAX_CLAIM_FEE_WALK = 32;\n\n    // `RangeState` now lives in `LedgerTypes.sol` (shared with `LedgerLib`); its layout is\n    // unchanged. See that file for the per-field notes.\n\n    // `UserPosition` now lives in `LedgerTypes.sol` (shared with `LedgerLib`); its layout is\n    // unchanged. See that file for the per-field notes.\n\n    /// @notice Admin levers. None of them is readable from the withdraw path.\n    uint16 public claimFeeBps;\n    address public claimFeeRecipient;\n    address public distributor;\n    /// @notice The protocol token, cached from the distributor. Refused by `sweepDistributor`.\n    address public distributorFF;\n    /// @notice Destination for FF-denominated staked-fee revenue. See `sweepDistributor`.\n    address public ffFeeSink;\n\n    // `ClaimFeeChange` now lives in `LedgerTypes.sol` (shared with `LedgerLib`, which walks the\n    // history inside `creditFees`); its layout is unchanged.\n\n    /// @notice Every claim-fee rate this ledger has ever stood at, oldest first.\n    /// @dev v4 accrues fees LAZILY: nothing is paid until a position is touched, so a range's\n    ///      backlog is an opaque lump earned over a window of arbitrary length that may span any\n    ///      number of rate changes. A single per-range snapshot could not describe that. It gave\n    ///      `min(rate now, rate at last touch)`, which is right at both ends and wrong in the\n    ///      middle — a rate that dipped and recovered between two touches billed the WHOLE\n    ///      backlog at the high rate, including everything earned while the protocol was\n    ///      advertising the low one.\n    ClaimFeeChange[] internal _claimFeeHistory;\n\n    /// @notice The lowest rate this ledger has ever stood at. The fallback for a backlog older\n    ///         than the bounded walk can reach.\n    uint16 public claimFeeAllTimeMin;\n\n    /// @notice How many rate changes had been recorded when each range last realized its fees —\n    ///         i.e. where in the history its current backlog opened.\n    /// @dev An INDEX, not a timestamp, and not a rate. Not a rate because a single rate cannot\n    ///      answer \"what was in force across this window\". Not a timestamp because several rate\n    ///      changes and several syncs can share one `block.timestamp`, and a cursor that cannot\n    ///      order two events in the same block would charge a backlog at a rate that was set\n    ///      after it was already realized.\n    mapping(uint256 rangeId => uint64 index) public claimFeeSyncIndex;\n\n    /// @notice Exploit-response switch: freezes deposits, claims, staking, transfers and\n    ///         sweeps. Principal withdrawal and unstaking are deliberately NOT pausable, ever.\n    /// @dev An expiry, not a flag. A pause that never lapses is indistinguishable from a\n    ///      confiscation of everything it touches: fees already credited to a holder become\n    ///      permanently unclaimable and a receipt becomes permanently untransferable, with no\n    ///      recourse if the key that set it is gone. Bounding the duration in bytecode keeps\n    ///      the emergency power without letting it become a permanent one — renewing is always\n    ///      possible, but it is a deliberate, visible act each time rather than the default.\n    uint256 public pausedUntil;\n\n    /// @notice The Voter, consulted to decide who may collect a staked range's fees.\n    address public ballotGate;\n\n    /// @notice Longest a single pause can last before it must be renewed on purpose.\n    uint256 public constant MAX_PAUSE = 7 days;\n\n    /// @notice True while the ledger is paused.\n    function paused() public view returns (bool) {\n        // day-scale window; second-level drift is immaterial\n        // forge-lint: disable-next-line(block-timestamp)\n        return pausedUntil > block.timestamp;\n    }\n\n    modifier whenNotPaused() {\n        if (paused()) revert LedgerPaused();\n        _;\n    }\n\n    // `RangeKey` now lives in `LedgerTypes.sol` (shared with `LedgerLib`, which reads a range's\n    // descriptor for the `FeesCollected` growth read); its layout is unchanged.\n\n    mapping(uint256 rangeId => RangeKey descriptor) internal _rangeKeys;\n    mapping(uint256 rangeId => RangeState state) internal _ranges;\n    mapping(uint256 rangeId => mapping(address owner => UserPosition position)) internal _positions;\n    mapping(Currency currency => uint256 owed) public distributorOwed;\n\n    /// @notice Claim-fee cut accrued for the recipient. Pull, never push: a blocked or\n    ///         paused recipient must not be able to block anyone else's claim.\n    mapping(Currency currency => uint256 owed) public claimFeeOwed;\n\n    /* ---------------------------------- views ---------------------------------- */\n\n    /// @notice True while a ledger operation is mid-flight. Always false to an external\n    ///         caller; only a token callback fired from inside this contract can observe it\n    ///         set. Integrators pricing receipts from within such a callback should refuse.\n    function isSettling() external view returns (bool) {\n        return _reentrancyGuardEntered();\n    }\n\n    function rangeId(PoolId poolId, int24 tickLower, int24 tickUpper) public pure returns (uint256) {\n        return uint256(keccak256(abi.encode(poolId, tickLower, tickUpper)));\n    }\n\n    /// @notice The pool key and tick range a `rangeId` was registered under. `set` is false for an\n    ///         id that has never been deposited into.\n    /// @dev `rangeId` is a one-way hash, and the `Deposited`/`Staked`/`FeesCollected` events carry\n    ///      only the id — so an off-chain settlement run seeing a `rangeId` cannot otherwise attribute\n    ///      that range's fees to a pool/gauge without decoding deposit calldata. This exposes the\n    ///      stored preimage so the mapping is available from the public ABI, first deposit onward.\n    function rangeKey(uint256 id)\n        external\n        view\n        returns (PoolKey memory key, int24 tickLower, int24 tickUpper, bool set)\n    {\n        RangeKey storage descriptor = _rangeKeys[id];\n        return (descriptor.key, descriptor.tickLower, descriptor.tickUpper, descriptor.set);\n    }\n\n    /// @notice v4's per-liquidity fee accumulator for a range, right now.\n    /// @dev The read the boundary snapshotter is built on. Settlement attributes forgone fees to\n    ///      the week they were GENERATED, so an interval of collection that straddles a week\n    ///      boundary has to be split AT the boundary — and nothing happens on chain at a boundary\n    ///      unless somebody syncs, so that one value cannot come from the log stream. It comes\n    ///      from calling this at the boundary block instead.\n    ///\n    ///      A view rather than a stored snapshot, deliberately: reading it at a historical block\n    ///      is exact, whereas a stored snapshot would be exact only if someone remembered to\n    ///      write it in time — the punctuality dependency this whole change exists to remove.\n    ///\n    ///      IT IS NOT MONOTONIC ACROSS A LIQUIDITY RESET. An earlier version of this comment\n    ///      claimed the accumulator \"moves only when a swap crosses the range\". It also moves\n    ///      when a tick is initialised or cleared: v4 deletes `feeGrowthOutside` once the last\n    ///      liquidity at a tick is removed and re-bases it against the current global on the next\n    ///      deposit, so a range that empties and refills reads a fresh, unrelated baseline. Two\n    ///      readings either side of that are not comparable, and settlement must treat a backwards\n    ///      step as a reset rather than as a delta — which it does, loudly.\n    function rangeGrowth(uint256 id) external view returns (uint256 growth0, uint256 growth1) {\n        RangeKey storage descriptor = _rangeKeys[id];\n        if (!descriptor.set) return (0, 0);\n        return\n            StateLibrary.getFeeGrowthInside(\n                poolManager, descriptor.key.toId(), descriptor.tickLower, descriptor.tickUpper\n            );\n    }\n\n    function rangeState(uint256 id) external view returns (RangeState memory) {\n        return _ranges[id];\n    }\n\n    function userPosition(uint256 id, address owner) external view returns (UserPosition memory) {\n        return _positions[id][owner];\n    }\n\n    /* ---------------------------------- admin ---------------------------------- */\n\n    function setClaimFee(Currency[] calldata settleFirst, uint16 bps, address recipient)\n        external\n        restricted\n        nonReentrant\n    {\n        _settleSinks(settleFirst);\n        // Validation, the history append and the all-time-min update live in `LedgerLib`\n        // (inlined); the value-vars are written here around it. The\n        // recipient may be neither this hook (the permissionless sweep would `take` the revenue\n        // straight to it) nor the distributor (which cannot pay FF out as a fee) — and that guard\n        // holds in EITHER call ordering, `setDistributor` enforcing the mirror.\n        claimFeeAllTimeMin = LedgerLib.recordClaimFee(_claimFeeHistory, bps, recipient, distributor, claimFeeAllTimeMin);\n        claimFeeBps = bps;\n        claimFeeRecipient = recipient;\n        emit ClaimFeeSet(bps, recipient);\n    }\n\n    /// @notice Where FF-denominated staked-share fee revenue is swept. Separate from\n    ///         `distributor` because the epoch distributor cannot pay FF out as a fee.\n    function setFFFeeSink(Currency[] calldata settleFirst, address sink) external restricted nonReentrant {\n        _settleSinks(settleFirst);\n        // The two addresses this sink exists to avoid, and the contract already holds both.\n        // Pointing it at the epoch distributor routes FF into the one place that can neither\n        // declare nor rescue it; pointing it at the hook leaves it as an unaccounted balance\n        // with no payout path. `setDistributor` spends a try/catch preventing the mirror\n        // mistake — and the sweep that would destroy the funds is permissionless, so the\n        // operator gets no window to notice.\n        if (sink == distributor || sink == address(this)) revert InvalidSink();\n        ffFeeSink = sink;\n        emit FFFeeSinkSet(sink);\n    }\n\n    /// @dev Pushes every named pot to its CURRENT destination before that destination changes.\n    ///      The pots are keyed by currency alone and the destination is resolved at sweep time,\n    ///      so rotating a sink silently re-pointed revenue that accrued entirely under the old\n    ///      one. The permissionless sweep was the old sink's only defence, and it is\n    ///      `whenNotPaused` while the setters are not — so a pause covering the rotation removed\n    ///      even that. Settling here makes the rotation deterministic, exactly as\n    ///      `FablesTreasurySplitter.setSplit` does for its own recipients.\n    function _settleSinks(Currency[] calldata currencies) internal {\n        for (uint256 i = 0; i < currencies.length; i++) {\n            _sweepDistributor(currencies[i]);\n            _sweepClaimFee(currencies[i]);\n        }\n    }\n\n    function setDistributor(Currency[] calldata settleFirst, address distributor_) external restricted nonReentrant {\n        _settleSinks(settleFirst);\n        // The sink guards (distributor may equal neither the FF sink nor the claim-fee recipient\n        // nor this hook — reachable in either call ordering, so both setters reject it) and the FF\n        // probe (a live distributor must name the protocol token so a later sweep can refuse FF)\n        // live in `LedgerLib.validateDistributor` (inlined). It returns\n        // the token to cache, or zero when clearing.\n        distributorFF = LedgerLib.validateDistributor(distributor_, ffFeeSink, claimFeeRecipient);\n        distributor = distributor_;\n        emit DistributorSet(distributor_);\n    }\n\n    /// @notice Pauses for `duration` seconds, or lifts the pause when `duration` is zero.\n    function setPaused(uint256 duration) external restricted {\n        if (duration > MAX_PAUSE) revert PauseTooLong();\n        pausedUntil = duration == 0 ? 0 : block.timestamp + duration;\n        emit PausedSet(pausedUntil);\n    }\n\n    /// @notice Freezes the ledger. Cannot unfreeze, and cannot shorten a freeze already running.\n    /// @dev A separate selector from `setPaused` so the fast key really is one-way. Binding the\n    ///      combined `setPaused` to a zero-delay role looked like an emergency stop but handed\n    ///      that same key the UNPAUSE — `setPaused(0)` clears the freeze — so a compromised\n    ///      guardian could lift the multisig's freeze every block. This entry point can only\n    ///      ever move `pausedUntil` forward, which is what makes it safe to run at zero delay,\n    ///      and `setPaused` stays on the delayed ADMIN_ROLE for lifting it.\n    function pause(uint256 duration) external restricted {\n        if (duration == 0 || duration > MAX_PAUSE) revert PauseTooLong();\n        uint256 until_ = block.timestamp + duration;\n        if (until_ <= pausedUntil) revert PauseTooLong(); // never shortens a running freeze\n        pausedUntil = until_;\n        emit PausedSet(until_);\n    }\n\n    /* ---------------------------------- internals: guards & sync ---------------------------------- */\n\n    /// @dev Rejects pools that are not this hook's, so `callerDelta - feesAccrued` really is\n    ///      principal (a foreign hook holding liquidity-delta flags would break that identity)\n    ///      and receipts can only ever be minted for vetted pools.\n    function _checkKey(PoolKey calldata key) internal view {\n        if (address(key.hooks) != address(this) || maxFee[key.toId()] == 0) revert PoolNotConfigured();\n        // Mirrors `beforeInitialize`: a native pool can only exist behind a hook whose\n        // `_nativeAllowed` override ships the payable/settlement machinery, so on such a hook the\n        // ledger paths must accept it; on every other hook the pool cannot have been initialized,\n        // and this guard keeps receipts unmintable for a key that never passed the gate.\n        if (key.currency0.isAddressZero() && !_nativeAllowed()) revert NativeNotSupported();\n    }\n\n    /// @dev Collect-only touch: materializes v4's lazily-accrued fees into the range's\n    ///      accumulators BEFORE any share or stake mutation, so fees are always split at the\n    ///      state that earned them. No-op for empty or unknown ranges.\n    function _syncRange(uint256 id) internal {\n        RangeKey memory descriptor = _rangeKeys[id];\n        if (!descriptor.set || _ranges[id].totalShares == 0) {\n            // A range with nothing in it has no backlog to mis-price, so this is the one moment\n            // its rate can be set forward rather than backward. Without it a brand-new range\n            // would carry a zero snapshot into its first real accrual and pay nothing.\n            claimFeeSyncIndex[id] = uint64(_claimFeeHistory.length);\n            return;\n        }\n        // A zero delta moves no principal, so the bounds are irrelevant here and `_checkBound`\n        // exempts a zero delta outright; passing the widest value states that plainly.\n        _modifyMem(\n            descriptor.key,\n            descriptor.tickLower,\n            descriptor.tickUpper,\n            0,\n            address(this),\n            type(uint128).max,\n            type(uint128).max\n        );\n    }\n\n    /* ---------------------------------- actions ---------------------------------- */\n\n    /// @notice Deposits `liquidity` units into the hook-owned position for the given range and\n    ///         mints receipts 1:1. Caller must have approved this contract for both tokens.\n    /// @param amount0Max The most currency0 the caller will pay for this liquidity.\n    /// @param amount1Max The most currency1 the caller will pay for this liquidity.\n    /// @param deadline Latest block timestamp at which this deposit may execute.\n    /// @dev The bounds are NOT optional ceremony. `liquidity` says nothing about what it costs: the\n    ///      token amounts fall out of the pool's live price inside `modifyLiquidity`, and whatever v4\n    ///      asks for is pulled from the caller. Without a ceiling, the only limit was the caller's own\n    ///      ERC-20 allowance, so a price move between signing and execution bought the whole position\n    ///      one-sided at a price nobody agreed to. See `LedgerLib._checkBound`.\n    /// @dev Payable for the native-capable variant only. On an ERC20 pool any attached value\n    ///      reverts — accepting it would strand ETH on a contract with no path back out. On a\n    ///      native pool the caller must attach AT LEAST `amount0Max`: the actual amount owed is\n    ///      only learned inside the unlock callback, `_checkBound` caps it at `amount0Max`, so\n    ///      prepaying the ceiling guarantees settlement can never under-fund — and the unspent\n    ///      remainder is refunded in full at the end (see `_refundNative`).\n    function deposit(\n        PoolKey calldata key,\n        int24 tickLower,\n        int24 tickUpper,\n        uint128 liquidity,\n        uint128 amount0Max,\n        uint128 amount1Max,\n        uint256 deadline\n    ) external payable nonReentrant whenNotPaused {\n        if (liquidity == 0) revert ZeroLiquidity();\n        // forge-lint: disable-next-line(block-timestamp)\n        if (block.timestamp > deadline) revert DeadlineExpired();\n        _checkKey(key);\n        if (key.currency0.isAddressZero()) {\n            if (msg.value < amount0Max) revert InvalidMsgValue();\n        } else if (msg.value != 0) {\n            revert InvalidMsgValue();\n        }\n\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        if (!_rangeKeys[id].set) {\n            _rangeKeys[id] = RangeKey({key: key, tickLower: tickLower, tickUpper: tickUpper, set: true});\n        }\n        // Collect pending fees at PRE-mint totals (no token call: fees settle as claims), then\n        // finish all bookkeeping, and only then touch the pool. The pool touch is the only\n        // step that can hand control to a token, so by the time it can, `totalShares` and the\n        // position's liquidity already agree — nothing observes a torn state.\n        _syncRange(id);\n        _settleUser(id, msg.sender);\n        // Crossing UP from zero (re)creates the v4 position, so its ticks re-initialize and its\n        // `feeGrowthInside` re-bases. Bumped BEFORE the pool touch so the collection it may trigger\n        // carries the new value (H2).\n        bool recreated = _ranges[id].totalShares == 0;\n        if (recreated) _ranges[id].resetSeq += 1;\n        _ranges[id].totalShares += liquidity;\n        _mint(msg.sender, id, liquidity);\n        _modify(key, tickLower, tickUpper, int256(uint256(liquidity)), msg.sender, amount0Max, amount1Max);\n        // AFTER the pool touch, which is the first instant the fresh base is readable: emit the\n        // zero-fee collection that anchors it. Every re-base is thereby bracketed — the exit's own\n        // sync collected everything in the old base, nothing accrues while empty, and this baseline\n        // opens the new base — so settlement never meets two growth readings it cannot compare, and\n        // the epoch a backlog is credited to can never depend on when a stranger forces a collection.\n        if (recreated) LedgerLib.emitRebaseBaseline(_ranges, _rangeKeys, poolManager, id);\n        emit Deposited(msg.sender, id, liquidity);\n        // LAST, after every state write and event (unlike the AlphixETH precedent, which refunded\n        // mid-function): the refund hands control to the caller, and by now there is nothing left\n        // for reentrant code to observe torn — and `nonReentrant` (transient) blocks re-entry into\n        // every ledger door regardless.\n        if (key.currency0.isAddressZero()) _refundNative();\n    }\n\n    /// @dev Returns the hook's ENTIRE native balance to the caller, not `msg.value - spent`: the\n    ///      hook never holds ETH between transactions (deposits are the only pay-in and they end\n    ///      here; sweeps wrap-and-forward within their own call), so the whole balance IS this\n    ///      deposit's unspent remainder — plus any dust a stranger force-sent, which this returns\n    ///      to circulation instead of stranding. Full-gas call, hard revert on failure: a caller\n    ///      that cannot receive ETH must not be able to leave it behind.\n    function _refundNative() internal {\n        uint256 balance = address(this).balance;\n        if (balance == 0) return;\n        (bool success,) = msg.sender.call{value: balance}(\"\");\n        if (!success) revert RefundFailed();\n    }\n\n    /// @notice Burns receipts and removes the corresponding liquidity to the caller. Reads no\n    ///         admin state; auto-unstakes if the unstaked balance is insufficient.\n    /// @dev Fees are collected first via `_syncRange` — a claims-only touch that makes no\n    ///      token call — so the withdrawer still receives their cut at pre-burn totals. Shares\n    ///      are burned before the pool touch that pays principal, so the only step that can\n    ///      hand control to a token sees `totalShares` and position liquidity already in\n    ///      agreement. Over-withdrawing still reverts, now at `_burn`, before anything moves.\n    /// @param to Where the principal lands. `claimFees` already takes one so a holder can route\n    ///        around a token that blocks their own address; `withdraw` hardcoded `msg.sender`,\n    ///        which meant a blocklist on the LP froze their principal in BOTH currencies — and\n    ///        the documented escape (transfer the receipt to a clean address) is pausable, so a\n    ///        pause concurrent with a blocklist closed every exit. That contradicted this\n    ///        contract's headline guarantee that withdrawals are unconditional.\n    /// @param amount0Min The least currency0 the caller will accept back for this liquidity.\n    /// @param amount1Min The least currency1 the caller will accept back for this liquidity.\n    /// @param deadline Latest block timestamp at which this withdrawal may execute.\n    /// @dev The mirror of `deposit`'s ceiling. A liquidity figure does not say what mix it returns —\n    ///      the price decides — so an exit during a moved market handed back a lopsided pair the LP\n    ///      never consented to. Deliberately still NOT pausable: a bound the caller chose is not a\n    ///      reason to trap them, and passing zeroes remains a valid \"any mix will do\".\n    function withdraw(\n        PoolKey calldata key,\n        int24 tickLower,\n        int24 tickUpper,\n        uint128 liquidity,\n        address to,\n        uint128 amount0Min,\n        uint128 amount1Min,\n        uint256 deadline\n    ) external nonReentrant {\n        if (liquidity == 0) revert ZeroLiquidity();\n        if (to == address(0)) revert ZeroAddress();\n        // forge-lint: disable-next-line(block-timestamp)\n        if (block.timestamp > deadline) revert DeadlineExpired();\n        _checkKey(key);\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n\n        _syncRange(id);\n        _settleUser(id, msg.sender);\n\n        UserPosition storage position = _positions[id][msg.sender];\n        // balances are sums of uint128 liquidity mints, bounded by pool max liquidity\n        // forge-lint: disable-next-line(unsafe-typecast)\n        uint128 unstaked = uint128(balanceOf[msg.sender][id]) - position.staked;\n        if (unstaked < liquidity) {\n            uint128 fromStaked = liquidity - unstaked;\n            position.staked -= fromStaked; // reverts on underflow: not enough total shares\n            _ranges[id].totalStaked -= fromStaked;\n            emit Unstaked(msg.sender, id, fromStaked);\n        }\n        _burn(msg.sender, id, liquidity);\n        _ranges[id].totalShares -= liquidity;\n        // Crossing DOWN to zero empties the position, clearing its ticks and re-basing\n        // `feeGrowthInside`. Bumped BEFORE the pool touch so the collection it may trigger carries\n        // the new value (H2), pairing with the up-crossing bump in `deposit`. No baseline emission\n        // here, deliberately: the ticks are about to be cleared, so a reading taken now describes a\n        // base no future collection will ever be in — the anchor worth having is the refill's, and\n        // `deposit` emits it. Nothing accrues while the position is empty, so the seam carries no value.\n        if (_ranges[id].totalShares == 0) _ranges[id].resetSeq += 1;\n        _modify(key, tickLower, tickUpper, -int256(uint256(liquidity)), to, amount0Min, amount1Min);\n        emit Withdrawn(msg.sender, id, liquidity);\n    }\n\n    /// @notice Syncs the range's fees from the pool and pays the caller's accrued share, minus\n    ///         the claim fee (fees only — principal is never touched).\n    /// @param to Recipient of the fees; lets a holder route around a token that blocks their\n    ///        own address without stranding the other currency.\n    function claimFees(PoolKey calldata key, int24 tickLower, int24 tickUpper, address to, uint16 maxFeeBps)\n        external\n        nonReentrant\n        whenNotPaused\n    {\n        // The rate the caller is willing to pay. Uniswap v4 accrues fees lazily, so the hook\n        // only learns of them when a ledger operation syncs the range — which means the rate\n        // applied is whatever stands at sync time, and an LP whose range has been quiet since\n        // before a `setClaimFee` would otherwise pay the new rate on the whole backlog. Taking\n        // the cut at accrual bounds that window to the last sync; this bounds it to consent.\n        // Checks the rate this call will actually charge — the range's snapshot — not the live\n        // rate. Comparing against `claimFeeBps` once the charge moved to the snapshot made the\n        // guard read one variable and the skim another, so it permitted exactly the skims it was\n        // meant to block (snapshot high, live zero) and reverted claims that would have cost\n        // nothing (snapshot zero, live high).\n        _checkKey(key);\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        if (_effectiveClaimFee(id) > maxFeeBps) revert ClaimFeeAboveMax();\n        // Third free-sync door, same shape as the zero-amount ones closed on stake/unstake and\n        // transfer: an address with no position here still reached `_syncRange` before hitting\n        // the `owed == 0` exit, letting a stranger force a range's rate snapshot forward. A\n        // holder who has withdrawn but still has unclaimed fees must remain able to claim, so\n        // the test is \"has shares OR is owed something\", not \"has shares\".\n        UserPosition storage claimant = _positions[id][msg.sender];\n        if (balanceOf[msg.sender][id] == 0 && claimant.owed0 == 0 && claimant.owed1 == 0) {\n            revert NothingToClaim();\n        }\n        _syncRange(id);\n        _settleUser(id, msg.sender);\n\n        UserPosition storage position = _positions[id][msg.sender];\n        (uint256 amount0, uint256 amount1) = (position.owed0, position.owed1);\n        if (amount0 == 0 && amount1 == 0) return;\n        (position.owed0, position.owed1) = (0, 0);\n\n        // No cut here: it was already taken at accrual, at the rate in force when the range was\n        // last synced, so a later change cannot reach back into what is already owed.\n        _payout(key.currency0, key.currency1, amount0, amount1, to);\n        emit FeesClaimed(msg.sender, id, amount0, amount1);\n    }\n\n    /// @notice Stakes receipts: their future fee accrual routes to the distributor.\n    function stake(PoolKey calldata key, int24 tickLower, int24 tickUpper, uint128 shares)\n        external\n        nonReentrant\n        whenNotPaused\n    {\n        if (shares == 0) revert ZeroShares();\n        _checkKey(key);\n        // A desk that is not a LIVE gauge — killed, retired, or never added at all — has no voters\n        // and earns no emissions, so forgoing fees to it buys nothing and strands the money: it\n        // reaches the distributor with nobody entitled to claim it and sits there until the release\n        // window 26 weeks later. `isGaugeLive` folds the class check together with the kill/retire\n        // state: a never-gauged pool reads class NONE while `isGaugeKilled` alone returns false (the\n        // LIVE default of an empty history), so the kill check by itself lets a stake strand into a\n        // pool that was configured on the hook but never gauged — the exact gap FablesBribes closes\n        // with `gaugeClass != NONE`. Staking is the only side that closes — unstaking, withdrawing,\n        // claiming and ordinary LPing all stay open, because a wind-down must never trap anyone.\n        // `isGaugeEarning`, not `isGaugeLive`. The comment above states the condition this guard is\n        // for — \"has no voters and earns no emissions, so forgoing fees to it buys nothing and\n        // strands the money\" — and `isGaugeLive` never tested the voters half of it: it is class +\n        // kill state only. A LIVE, never-killed desk with no ballot pointed at it earns `_shareOf`\n        // exactly zero while its stakers' fees are still swept to the distributor and booked to the\n        // treasury, silently and indefinitely. `isGaugeEarning` adds the missing term.\n        // FAILS CLOSED. An unset `ballotGate` used to make this guard a no-op, which is not only a\n        // genesis condition: `ballotGate` is per-LEDGER, so every hook added to a running protocol\n        // has its own, and between the new pool becoming depositable (`initialize` is permissionless)\n        // and `setBallotGate` landing behind its config delay, staking was accepted on a desk with no\n        // gauge at all. Fees swept, nothing earned, nobody told. Staking before the gate is wired\n        // could never earn anyway — `_shareOf` needs a gauge — so refusing costs nothing real and\n        // removes a window whose length is set by a multisig delay.\n        address gate = ballotGate;\n        if (gate == address(0) || !IBallotGate(gate).isGaugeEarning(key.toId())) revert DeskRetired();\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        _syncRange(id); // fees earned before this stake stay with their earner\n        _settleUser(id, msg.sender);\n        UserPosition storage position = _positions[id][msg.sender];\n        if (uint128(balanceOf[msg.sender][id]) - position.staked < shares) revert InsufficientUnstakedShares();\n        position.staked += shares;\n        _ranges[id].totalStaked += shares;\n        emit Staked(msg.sender, id, shares);\n    }\n\n    /// @notice Unstakes receipts; permissionless, instant, dependency-free.\n    /// @dev Deliberately NOT pausable, unlike `stake`. Unstaking only ever SHRINKS what the\n    ///      distributor is owed and makes no external call, so it cannot be an exploit vector —\n    ///      while pausing it would mean an LP cannot stop routing their fees to a distributor\n    ///      the admin also chooses. Freezing the exit from a revenue assignment is not an\n    ///      exploit response, it is the exploit.\n    function unstake(PoolKey calldata key, int24 tickLower, int24 tickUpper, uint128 shares) external nonReentrant {\n        // A zero-share call did real work: it forced a full fee sync for free, from any address,\n        // with no balance and no approval, and is not pausable. That was the cheapest trigger for\n        // the claim-fee raid, and it also let anyone spam the Staked/Unstaked stream the\n        // settlement indexer reads.\n        if (shares == 0) revert ZeroShares();\n        _checkKey(key);\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        _syncRange(id); // fees owed to the distributor are banked before the stake shrinks\n        _settleUser(id, msg.sender);\n        UserPosition storage position = _positions[id][msg.sender];\n        position.staked -= shares; // reverts on underflow\n        _ranges[id].totalStaked -= shares;\n        emit Unstaked(msg.sender, id, shares);\n    }\n\n    /// @notice Pushes accumulated staked-share fees to the distributor. Callable by anyone.\n    function sweepDistributor(Currency currency) external nonReentrant whenNotPaused {\n        _sweepDistributor(currency);\n    }\n\n    /// @dev A thin wrapper over `LedgerLib.sweepDistributor` (inlined).\n    ///      FF-denominated staked-fee revenue does NOT go to the epoch distributor — which treats\n    ///      every FF it holds as the emission tranche, where fee revenue would strand — but to the\n    ///      dedicated `ffFeeSink`; both destinations are resolved inside the library, and an unset\n    ///      one simply keeps the accrual waiting. Virtual because the distributor speaks only\n    ///      ERC20: the native-capable hook overrides the NATIVE currency's sweep to wrap into WETH\n    ///      at this boundary, so everything downstream stays ERC20-pure.\n    function _sweepDistributor(Currency currency) internal virtual {\n        LedgerLib.sweepDistributor(distributorOwed, poolManager, currency, distributor, distributorFF, ffFeeSink);\n    }\n\n    /* ---------------------------------- transfers ---------------------------------- */\n\n    /// @dev Staked shares are locked: only the unstaked balance is transferable.\n    function transfer(address receiver, uint256 id, uint256 amount)\n        public\n        override\n        nonReentrant\n        whenNotPaused\n        returns (bool)\n    {\n        // Same free, permissionless fee-sync primitive that was closed on stake/unstake: a\n        // zero-amount transfer needs no balance and no approval, moves nothing, and still forces\n        // a full unlock + modifyLiquidity round trip against any range.\n        if (amount == 0) revert ZeroShares();\n        _checkTransferable(msg.sender, id, amount);\n        _syncRange(id); // the sender keeps the fees their shares already earned\n        _settleUser(id, msg.sender);\n        _settleUser(id, receiver);\n        return super.transfer(receiver, id, amount);\n    }\n\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount)\n        public\n        override\n        nonReentrant\n        whenNotPaused\n        returns (bool)\n    {\n        // Same free, permissionless fee-sync primitive that was closed on stake/unstake: a\n        // zero-amount transfer needs no balance and no approval, moves nothing, and still forces\n        // a full unlock + modifyLiquidity round trip against any range.\n        if (amount == 0) revert ZeroShares();\n        _checkTransferable(sender, id, amount);\n        _syncRange(id); // the sender keeps the fees their shares already earned\n        _settleUser(id, sender);\n        _settleUser(id, receiver);\n        return super.transferFrom(sender, receiver, id, amount);\n    }\n\n    function _checkTransferable(address owner, uint256 id, uint256 amount) internal view {\n        if (balanceOf[owner][id] - _positions[id][owner].staked < amount) revert InsufficientUnstakedShares();\n    }\n\n    /* ---------------------------------- internals ---------------------------------- */\n\n    // `Action`, `CallbackData` and `PayoutData` now live in `LedgerTypes.sol` (shared with\n    // `LedgerLib.onUnlock`, which holds the unlock-callback body).\n\n    function _modify(\n        PoolKey calldata key,\n        int24 tickLower,\n        int24 tickUpper,\n        int256 liquidityDelta,\n        address user,\n        uint128 amount0Limit,\n        uint128 amount1Limit\n    ) internal {\n        _modifyMem(key, tickLower, tickUpper, liquidityDelta, user, amount0Limit, amount1Limit);\n    }\n\n    function _modifyMem(\n        PoolKey memory key,\n        int24 tickLower,\n        int24 tickUpper,\n        int256 liquidityDelta,\n        address user,\n        uint128 amount0Limit,\n        uint128 amount1Limit\n    ) internal {\n        poolManager.unlock(\n            abi.encode(\n                Action.MODIFY,\n                abi.encode(CallbackData(key, tickLower, tickUpper, liquidityDelta, user, amount0Limit, amount1Limit))\n            )\n        );\n    }\n\n    /// @dev Burns the ledger's claims and pays `to` in real tokens, via `LedgerLib.payout`\n    ///      (inlined). A failure here (paused or blocklisted token, blocked recipient) affects\n    ///      only this claim, never principal.\n    function _payout(Currency currency0, Currency currency1, uint256 amount0, uint256 amount1, address to) internal {\n        LedgerLib.payout(poolManager, currency0, currency1, amount0, amount1, to);\n    }\n\n    /// @inheritdoc IUnlockCallback\n    /// @dev A thin shell: it checks the caller and hands the whole callback body to\n    ///      `LedgerLib.onUnlock` (inlined), which decodes the action, applies a liquidity\n    ///      modify or a payout, and settles fees and principal.\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        return LedgerLib.onUnlock(\n            _ranges,\n            _rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            _claimFeeHistory,\n            poolManager,\n            LedgerLib.ClaimFeeState({bps: claimFeeBps, allTimeMin: claimFeeAllTimeMin, recipient: claimFeeRecipient}),\n            rawData\n        );\n    }\n\n    /// @dev The whole fee collection — claim-fee rate roll-forward, the claim mints, the staked /\n    ///      unstaked split, the claim-fee skim and the `FeesCollected` emit — lives in\n    ///      `LedgerLib.creditFees` (inlined), which mutates this contract's own storage\n    ///      (mappings passed by reference). Behaviour is identical.\n    function _creditFees(uint256 id, PoolKey memory key, uint128 fee0, uint128 fee1) internal {\n        LedgerLib.creditFees(\n            _ranges,\n            _rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            _claimFeeHistory,\n            poolManager,\n            LedgerLib.CreditParams({\n                id: id,\n                key: key,\n                fee0: fee0,\n                fee1: fee1,\n                claimFeeBps: claimFeeBps,\n                claimFeeAllTimeMin: claimFeeAllTimeMin,\n                claimFeeRecipient: claimFeeRecipient\n            })\n        );\n    }\n\n    /// @notice Realizes v4's lazily-accrued fees for a list of ranges, splitting each between\n    ///         its unstaked holders and the voters' pot. Permissionless, unpausable, and it\n    ///         moves no tokens out of this contract — it only turns fees the pool already holds\n    ///         into balances this ledger has attributed.\n    /// @dev Settlement needs this. v4 pays nothing until a position is touched, and a `rangeId`\n    ///      is `(pool, tickLower, tickUpper)`, so an LP on bespoke bounds is the ONLY party who\n    ///      can touch their range. Staked shares give their fees up to voters, which left\n    ///      voters' revenue hostage to whether the LP who forgoes it ever felt like syncing —\n    ///      and left each epoch's emission split guessing at fees that had not been booked yet.\n    ///      Ops calls this over the staked ranges at each epoch boundary, which is also what\n    ///      makes the `FeesCollected` accumulator levels line up with epoch boundaries so the\n    ///      week's forgone fees are attributable exactly.\n    /// @dev It takes the claim fee like every other door, and it must. An earlier version skipped\n    ///      the skim here on the grounds that \"the protocol forgoes its claim fee on syncs it did\n    ///      not initiate — it still collects on every owner-driven path\". The second clause was\n    ///      false. v4 pays nothing until a position is touched, so an owner-driven sync can only\n    ///      ever skim fees accrued SINCE THE LAST TOUCH — and a free door that collects the whole\n    ///      backlog sets that to nothing. Whoever touches a range last wins, so any voter of the\n    ///      pool could hold the protocol's revenue on every staked range in it at zero forever,\n    ///      for gas, by sweeping just before each owner claim. Charging uniformly is the only\n    ///      shape with no door to arbitrage between.\n    ///\n    ///      It costs the caller nothing they are owed: the skim is taken from the UNSTAKED\n    ///      residue, after `stakedCut` has already been set aside for the voters' pot. A voter\n    ///      syncing to fund their own claim is not paying for the privilege.\n    ///\n    ///      The rate is still `min(live, snapshot)`, so a raise can never reach back over a\n    ///      backlog earned under the old rate — which was the other thing the exemption was\n    ///      protecting, and is protected here by `_effectiveClaimFee` instead of by a hole.\n    function syncRanges(uint256 tokenId, uint256[] calldata ids) external nonReentrant {\n        address gate = ballotGate;\n        if (gate == address(0)) revert BallotGateUnset();\n        for (uint256 i = 0; i < ids.length; i++) {\n            uint256 id = ids[i];\n            // Staked ranges only. A range with nothing staked owes the voters nothing.\n            if (_ranges[id].totalStaked == 0) continue;\n            // And only a voter of THIS pool, on the strength of a lock they own. Collecting is\n            // already harmless to principal — `_syncRange` passes `liquidityDelta == 0`, so it\n            // can never move a position, and it merely books an unstaked holder's share into an\n            // accumulator only they can draw down. The gate is not there to stop theft; it is\n            // there because fees are attributed to the week they are COLLECTED in, so whoever\n            // chooses the moment chooses the epoch. That choice belongs to the people the money\n            // is owed to, not to whoever is watching.\n            if (!IBallotGate(gate).ballotBacks(msg.sender, tokenId, _rangeKeys[id].key.toId())) {\n                revert NotAVoterOfThisPool();\n            }\n            _syncRange(id);\n        }\n    }\n\n    /// @notice Points the sync gate at the Voter. Until it is set, nothing can be synced through\n    ///         this door at all — a closed door being the safe default for one that decides who\n    ///         may reach into someone else's position.\n    /// @dev Probed, not merely stored. `setDistributor` spends a `try/catch` on its counterpart\n    ///      for exactly this reason and this setter did not, so an EOA or a wrong-ABI contract\n    ///      made `syncRanges` revert on `abi.decode` for every staked range — permanently\n    ///      unusable, with no on-chain signal. `address(0)` stays explicitly allowed: a closed\n    ///      door is the safe default for one that decides who may reach into someone else's\n    ///      position, and `syncRanges` refuses outright while the gate is unset.\n    function setBallotGate(address gate) external restricted {\n        if (gate != address(0)) {\n            // Explicit, because `try/catch` alone does NOT cover this. Since solc 0.8.10 a\n            // high-level call expecting return data skips the extcodesize check and lets the ABI\n            // decoder revert instead — and that revert happens in the SUCCESS branch, so `catch`\n            // never sees it. An EOA here would have produced a bare revert indistinguishable\n            // from out-of-gas: the very \"no on-chain signal\" this setter is guarding against.\n            if (gate.code.length == 0) revert InvalidBallotGate();\n            try IBallotGate(gate).ballotBacks(address(this), 0, PoolId.wrap(bytes32(0))) returns (bool) {}\n            catch {\n                revert InvalidBallotGate();\n            }\n            // BOTH members, not just the one this contract happens to call first. `stake` calls\n            // `isGaugeEarning`, so a gate implementing only `ballotBacks` passed this setter and\n            // then made `stake` revert on the ABI decode for every pool at once — with no\n            // on-chain signal, which is the exact failure the probe above exists to prevent. The\n            // probe must track the member `stake` actually calls: it was `isGaugeLive` before the\n            // guard moved to `isGaugeEarning`, and staying on the old member reopened the gap.\n            try IBallotGate(gate).isGaugeEarning(PoolId.wrap(bytes32(0))) returns (bool) {}\n            catch {\n                revert InvalidBallotGate();\n            }\n        }\n        ballotGate = gate;\n        emit BallotGateSet(gate);\n    }\n\n    /// @dev The rate a sync of `id` will ACTUALLY charge: the range's snapshot, capped by the\n    ///      policy standing now. A reduction binds immediately, so the snapshot is an upper\n    ///      bound rather than a figure that can outlive the policy it came from; only an\n    ///      increase waits for the range's next sync, which is what stops a raise reaching back\n    ///      over a backlog earned entirely under the old rate.\n    /// @dev Both the skim and `claimFees`'s consent guard read this one function. They used to\n    ///      compute it separately, and drifted apart twice: the guard read the live rate while\n    ///      the skim charged the snapshot, then the guard read the snapshot while the skim\n    ///      charged the minimum. Each time the two disagreed the guard rejected claims that\n    ///      would have cost nothing, or waved through skims it existed to block. One definition\n    ///      is the only shape that cannot drift again.\n    function _effectiveClaimFee(uint256 id) internal view returns (uint16) {\n        return claimFeeFor(claimFeeSyncIndex[id]);\n    }\n\n    /// @notice The rate a backlog that opened at history index `sinceIndex` will actually be\n    ///         charged: the LOWEST rate that stood at any point from then until now.\n    /// @dev The minimum, and not a time-weighted average, because a time-weighted average is not\n    ///      computable here and pretending otherwise would be a guess dressed as arithmetic. v4\n    ///      hands over one lump for the whole window and says nothing about WHEN inside it the\n    ///      fees were earned — a week's backlog might all have accrued in one busy hour. Any\n    ///      apportionment would be invented.\n    ///\n    ///      Given that, the minimum is the only defensible answer, for two reasons that matter\n    ///      more than the revenue:\n    ///\n    ///        - It can never charge an LP a rate the protocol was not actually advertising while\n    ///          their fees were accruing. Every other rule can.\n    ///        - It bounds the timing game, though it does not remove it. Anyone can force a range\n    ///          to realize its fees (`deposit` of one unit does it), so a third party picks the\n    ///          moment a backlog is priced. Waiting can only ever LOWER the rate — so there is\n    ///          nothing to gain by delaying. But a scheduled cut is public before it lands, and\n    ///          collecting just BEFORE it closes the window at the old rate. An earlier version\n    ///          of this comment claimed there was nothing to front-run; that is false, and the\n    ///          exposure is bounded only by `MAX_CLAIM_FEE_BPS` and by the rate shipping at zero.\n    ///\n    ///      The cost is that ops must treat a dip as retroactive. Lowering the rate for an hour\n    ///      applies that hour's rate to every backlog spanning it, however long. That is a real\n    ///      constraint on the lever, and the right way round: it makes a cut generous rather than\n    ///      a raise reaching backwards.\n    function claimFeeFor(uint64 sinceIndex) public view returns (uint16) {\n        return LedgerLib.claimFeeFor(_claimFeeHistory, sinceIndex, claimFeeRecipient, claimFeeBps, claimFeeAllTimeMin);\n    }\n\n    /// @notice Number of recorded claim-fee changes.\n    function claimFeeHistoryLength() external view returns (uint256) {\n        return _claimFeeHistory.length;\n    }\n\n    /// @notice One recorded claim-fee change.\n    function claimFeeChangeAt(uint256 index) external view returns (ClaimFeeChange memory) {\n        return _claimFeeHistory[index];\n    }\n\n    /// @notice The rate a range's current backlog will be charged if it is synced now.\n    function effectiveClaimFee(uint256 id) external view returns (uint16) {\n        return _effectiveClaimFee(id);\n    }\n\n    // `_creditFees` emits `FeesCollected` from inside `LedgerLib.creditFees` (inlined), which\n    // also reads the range's live `feeGrowthInside` there; both used to be `_emitCollected` /\n    // `_growthOf` here, factored into `LedgerLib` for organization.\n\n    /// @dev A thin wrapper over `LedgerLib.settleUser` (inlined), so the per-holder fee and\n    ///      emission-weight checkpoint math — this contract's other `FullMath.mulDiv` cluster —\n    ///      lives in `LedgerLib`. Called from nine paths, all of which are cheap internal jumps.\n    function _settleUser(uint256 id, address owner) internal {\n        LedgerLib.settleUser(_ranges[id], _positions[id][owner], balanceOf[owner][id], owner, id);\n    }\n\n    /// @notice Pushes accrued claim-fee revenue to the recipient. Callable by anyone.\n    function sweepClaimFee(Currency currency) external nonReentrant whenNotPaused {\n        _sweepClaimFee(currency);\n    }\n\n    /// @dev A thin wrapper over `LedgerLib.sweepClaimFee` (inlined).\n    function _sweepClaimFee(Currency currency) internal {\n        LedgerLib.sweepClaimFee(claimFeeOwed, poolManager, currency, claimFeeRecipient);\n    }\n}\n"},"src/base/FablesBaseHook.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"v4-core/src/libraries/LPFeeLibrary.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {PoolId, PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"v4-core/src/types/BeforeSwapDelta.sol\";\nimport {AccessManaged} from \"@openzeppelin/contracts/access/manager/AccessManaged.sol\";\n\n/// @title FablesBaseHook\n/// @notice Singleton dynamic-fee hook base: per-pool fee caps, an autonomous per-pool fee\n///         supplied by the inheriting contract, and a TTL-bounded poked override on top.\n/// @dev The fee resolves as: poked fee while fresh, otherwise the autonomous fee; always\n///      clamped to the pool's cap. The poke fully replaces the autonomous fee (it can lower\n///      as well as raise) and expires on its own, so the system never depends on an operator\n///      but can always be corrected by one. Uses only the fee-override return of\n///      `beforeSwap` — no delta flags.\nabstract contract FablesBaseHook is AccessManaged {\n    using LPFeeLibrary for uint24;\n    using PoolIdLibrary for PoolKey;\n\n    error NotPoolManager();\n    error NotDynamicFeePool();\n    error NativeNotSupported();\n    error PoolNotConfigured();\n    error FeeAboveCap();\n    error InvalidTtl();\n    error InvalidMaxFee();\n    error FeeBelowFloor();\n\n    event FeePoked(PoolId indexed poolId, uint24 fee, uint40 expiry);\n    event PokeCleared(PoolId indexed poolId);\n\n    struct Poke {\n        uint24 fee;\n        uint40 expiry;\n    }\n\n    /// @notice Longest a poked fee can outlive its transaction.\n    uint40 public constant MAX_POKE_TTL = 72 hours;\n\n    /// @notice Hard ceiling on any pool's fee cap, fixed at deployment. No role can configure\n    ///         or poke a fee above it; changing it means deploying a new singleton.\n    uint24 public immutable ABSOLUTE_MAX_FEE;\n\n    IPoolManager public immutable poolManager;\n\n    /// @notice Per-pool fee cap in pips; zero means the pool is not configured.\n    mapping(PoolId poolId => uint24 cap) public maxFee;\n    /// @notice Most of the live autonomous fee a poke may cut away. A poke is for reacting\n    ///         fast, not for switching the curve off; a mis-classified market day is corrected\n    ///         through the calendar overlay, which is what that overlay exists for.\n    uint16 public constant MAX_POKE_DISCOUNT_BPS = 5000;\n\n    /// @notice Cheapest fee any pool may be configured to charge, fixed in bytecode.\n    uint24 public constant MIN_POOL_FEE = 100; // 0.01%, Uniswap's smallest standard tier\n\n    /// @notice Cheapest fee each pool can charge autonomously — the lower bound on a poke.\n    mapping(PoolId poolId => uint24 floor) public pokeFloor;\n\n    /// @notice Active poked override per pool; ignored once expired.\n    mapping(PoolId poolId => Poke poke) public pokeOf;\n\n    modifier onlyPoolManager() {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        _;\n    }\n\n    constructor(IPoolManager poolManager_, address authority_, uint24 absoluteMaxFee_) AccessManaged(authority_) {\n        if (absoluteMaxFee_ == 0 || absoluteMaxFee_ > LPFeeLibrary.MAX_LP_FEE) revert InvalidMaxFee();\n        ABSOLUTE_MAX_FEE = absoluteMaxFee_;\n        poolManager = poolManager_;\n        Hooks.validateHookPermissions(IHooks(address(this)), _hookPermissions());\n    }\n\n    /// @notice Callback set this hook uses; never includes delta flags.\n    function _hookPermissions() internal pure virtual returns (Hooks.Permissions memory permissions) {\n        permissions.beforeInitialize = true;\n        permissions.beforeSwap = true;\n    }\n\n    /// @notice Whether this hook accepts pools whose currency0 is native ETH. False here and in\n    ///         every ERC20-only hook; a native-capable variant (e.g. `FablesRampETH`) overrides it\n    ///         to true AND carries the payable/settlement machinery that makes native pools work.\n    ///         The flag and the machinery must travel together — flipping this alone would create\n    ///         pools the ledger cannot settle deposits for.\n    function _nativeAllowed() internal pure virtual returns (bool) {\n        return false;\n    }\n\n    /// @notice Pools must use the dynamic-fee flag and be configured before initialization.\n    function beforeInitialize(address, PoolKey calldata key, uint160) external view onlyPoolManager returns (bytes4) {\n        if (!key.fee.isDynamicFee()) revert NotDynamicFeePool();\n        if (maxFee[key.toId()] == 0) revert PoolNotConfigured();\n        // `_checkKey` refuses native currency0, but that guard sits on the ledger paths, not on\n        // the gate that creates the pool — so a native pool could be configured, initialized and\n        // traded with dynamic fees while every deposit, withdraw, stake and claim reverted. A\n        // pool no LP can ever hold a position in should not exist at all. Native-capable variants\n        // opt out via `_nativeAllowed`, whose override is coupled to the settlement machinery.\n        if (key.currency0.isAddressZero() && !_nativeAllowed()) revert NativeNotSupported();\n        return IHooks.beforeInitialize.selector;\n    }\n\n    /// @notice Returns the per-swap fee override; never touches swap deltas.\n    function beforeSwap(address, PoolKey calldata key, IPoolManager.SwapParams calldata params, bytes calldata)\n        external\n        view\n        onlyPoolManager\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        uint24 fee = _resolveFee(key.toId(), params);\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, fee | LPFeeLibrary.OVERRIDE_FEE_FLAG);\n    }\n\n    /// @notice Fee the pool would charge a swap in the given direction right now, in pips.\n    /// @dev Uses a zero-amount probe, so size-dependent components read as zero here.\n    function currentFee(PoolId poolId, bool zeroForOne) external view returns (uint24) {\n        return _resolveFee(\n            poolId, IPoolManager.SwapParams({zeroForOne: zeroForOne, amountSpecified: 0, sqrtPriceLimitX96: 0})\n        );\n    }\n\n    /// @notice Temporarily replaces the autonomous fee for a pool. Expires on its own.\n    /// @dev Bounded on BOTH sides. The ceiling is the pool cap; the floor is the cheapest fee\n    ///      the pool is configured to charge autonomously, so ops can still correct a fee that\n    ///      is wrongly high (a mis-classified market day, say) but cannot go anywhere the pool\n    ///      would not have gone by itself. This role is the one hot key in the system, granted\n    ///      with no execution delay because reacting fast is its whole purpose — which makes it\n    ///      the likeliest to be compromised. Without a floor, whoever held it could set every\n    ///      pool to zero for 72 hours and renew for the price of gas, so LPs earn nothing while\n    ///      arbitrageurs take the pool apart for free. A ceiling alone bounds the wrong end.\n    function pokeFee(PoolId poolId, uint24 fee, uint40 ttl) external restricted {\n        uint24 cap = maxFee[poolId];\n        if (cap == 0) revert PoolNotConfigured();\n        if (fee > cap) revert FeeAboveCap();\n        if (fee < pokeFloor[poolId]) revert FeeBelowFloor();\n        if (ttl == 0 || ttl > MAX_POKE_TTL) revert InvalidTtl();\n        uint40 expiry = uint40(block.timestamp) + ttl;\n        pokeOf[poolId] = Poke({fee: fee, expiry: expiry});\n        emit FeePoked(poolId, fee, expiry);\n    }\n\n    /// @notice Clears an active poke, returning the pool to its autonomous fee.\n    function clearPoke(PoolId poolId) external restricted {\n        delete pokeOf[poolId];\n        emit PokeCleared(poolId);\n    }\n\n    /// @notice Autonomous per-pool fee in pips for a swap, before poke and cap are applied.\n    function _autonomousFee(PoolId poolId, IPoolManager.SwapParams memory params)\n        internal\n        view\n        virtual\n        returns (uint256);\n\n    function _resolveFee(PoolId poolId, IPoolManager.SwapParams memory params) internal view returns (uint24) {\n        uint256 autonomous = _autonomousFee(poolId, params);\n        uint256 fee = autonomous;\n        Poke memory poke = pokeOf[poolId];\n        // second-level timestamp drift is immaterial against a >=1h TTL\n        // forge-lint: disable-next-line(block-timestamp)\n        if (poke.expiry > block.timestamp) {\n            fee = poke.fee;\n            // The poke's bounds are enforced at RESOLUTION, not only when it was set. Checking\n            // once at `pokeFee` left two holes: raising a pool's floor afterwards left a live\n            // poke charging under the new floor for up to 72h, and the static floor said nothing\n            // about the pool's CURRENT fee — so the hot key could pin a pool that its own curve\n            // had ramped to 400bps back down to its 100bps configured floor, renewably, handing\n            // a permanent subsidy to exactly the toxic flow the curve exists to price.\n            uint256 floor_ = pokeFloor[poolId];\n            uint256 discountFloor = (autonomous * (10_000 - MAX_POKE_DISCOUNT_BPS)) / 10_000;\n            if (floor_ < discountFloor) floor_ = discountFloor;\n            if (fee < floor_) fee = floor_;\n        }\n        uint256 cap = maxFee[poolId];\n        if (fee > cap) fee = cap;\n        // casting to 'uint24' is safe: fee is clamped to cap, which _setPoolBounds bounds to MAX_LP_FEE < 2^24\n        // forge-lint: disable-next-line(unsafe-typecast)\n        return uint24(fee);\n    }\n\n    /// @dev Records the pool's bounds. `floor` is the cheapest fee its own curve can produce;\n    ///      it is what a poke may not undercut. Each hook computes it from its own config.\n    function _setPoolBounds(PoolId poolId, uint24 floor, uint24 cap) internal {\n        if (cap == 0 || cap > ABSOLUTE_MAX_FEE) revert InvalidMaxFee();\n        // A lower bound on the CONFIG, not just on the poke. `pokeFee` was carefully bounded on\n        // both sides while the config path — which sets the very floor the poke is measured\n        // against — could be driven to 1 pip on a live pool, draining LPs by the same route the\n        // poke floor exists to block.\n        if (floor < MIN_POOL_FEE || floor > cap) revert InvalidMaxFee();\n        maxFee[poolId] = cap;\n        pokeFloor[poolId] = floor;\n    }\n}\n"},"lib/v4-core/src/libraries/FullMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n    function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = a * b\n            // Compute the product mod 2**256 and mod 2**256 - 1\n            // then use the Chinese Remainder Theorem to reconstruct\n            // the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2**256 + prod0\n            uint256 prod0 = a * b; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly (\"memory-safe\") {\n                let mm := mulmod(a, b, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Make sure the result is less than 2**256.\n            // Also prevents denominator == 0\n            require(denominator > prod1);\n\n            // Handle non-overflow cases, 256 by 256 division\n            if (prod1 == 0) {\n                assembly (\"memory-safe\") {\n                    result := div(prod0, denominator)\n                }\n                return result;\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0]\n            // Compute remainder using mulmod\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                remainder := mulmod(a, b, denominator)\n            }\n            // Subtract 256 bit number from 512 bit number\n            assembly (\"memory-safe\") {\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator\n            // Compute largest power of two divisor of denominator.\n            // Always >= 1.\n            uint256 twos = (0 - denominator) & denominator;\n            // Divide denominator by power of two\n            assembly (\"memory-safe\") {\n                denominator := div(denominator, twos)\n            }\n\n            // Divide [prod1 prod0] by the factors of two\n            assembly (\"memory-safe\") {\n                prod0 := div(prod0, twos)\n            }\n            // Shift in bits from prod1 into prod0. For this we need\n            // to flip `twos` such that it is 2**256 / twos.\n            // If twos is zero, then it becomes one\n            assembly (\"memory-safe\") {\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2**256\n            // Now that denominator is an odd number, it has an inverse\n            // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n            // Compute the inverse by starting with a seed that is correct\n            // correct for four bits. That is, denominator * inv = 1 mod 2**4\n            uint256 inv = (3 * denominator) ^ 2;\n            // Now use Newton-Raphson iteration to improve the precision.\n            // Thanks to Hensel's lifting lemma, this also works in modular\n            // arithmetic, doubling the correct bits in each step.\n            inv *= 2 - denominator * inv; // inverse mod 2**8\n            inv *= 2 - denominator * inv; // inverse mod 2**16\n            inv *= 2 - denominator * inv; // inverse mod 2**32\n            inv *= 2 - denominator * inv; // inverse mod 2**64\n            inv *= 2 - denominator * inv; // inverse mod 2**128\n            inv *= 2 - denominator * inv; // inverse mod 2**256\n\n            // Because the division is now exact we can divide by multiplying\n            // with the modular inverse of denominator. This will give us the\n            // correct result modulo 2**256. Since the preconditions guarantee\n            // that the outcome is less than 2**256, this is the final result.\n            // We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inv;\n            return result;\n        }\n    }\n\n    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            result = mulDiv(a, b, denominator);\n            if (mulmod(a, b, denominator) != 0) {\n                require(++result > 0);\n            }\n        }\n    }\n}\n"},"lib/v4-core/src/libraries/StateLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Position} from \"./Position.sol\";\n\n/// @notice A helper library to provide state getters that use extsload\nlibrary StateLibrary {\n    /// @notice index of pools mapping in the PoolManager\n    bytes32 public constant POOLS_SLOT = bytes32(uint256(6));\n\n    /// @notice index of feeGrowthGlobal0X128 in Pool.State\n    uint256 public constant FEE_GROWTH_GLOBAL0_OFFSET = 1;\n\n    // feeGrowthGlobal1X128 offset in Pool.State = 2\n\n    /// @notice index of liquidity in Pool.State\n    uint256 public constant LIQUIDITY_OFFSET = 3;\n\n    /// @notice index of TicksInfo mapping in Pool.State: mapping(int24 => TickInfo) ticks;\n    uint256 public constant TICKS_OFFSET = 4;\n\n    /// @notice index of tickBitmap mapping in Pool.State\n    uint256 public constant TICK_BITMAP_OFFSET = 5;\n\n    /// @notice index of Position.State mapping in Pool.State: mapping(bytes32 => Position.State) positions;\n    uint256 public constant POSITIONS_OFFSET = 6;\n\n    /**\n     * @notice Get Slot0 of the pool: sqrtPriceX96, tick, protocolFee, lpFee\n     * @dev Corresponds to pools[poolId].slot0\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return sqrtPriceX96 The square root of the price of the pool, in Q96 precision.\n     * @return tick The current tick of the pool.\n     * @return protocolFee The protocol fee of the pool.\n     * @return lpFee The swap fee of the pool.\n     */\n    function getSlot0(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        bytes32 data = manager.extsload(stateSlot);\n\n        //   24 bits  |24bits|24bits      |24 bits|160 bits\n        // 0x000000   |000bb8|000000      |ffff75 |0000000000000000fe3aa841ba359daa0ea9eff7\n        // ---------- | fee  |protocolfee | tick  | sqrtPriceX96\n        assembly (\"memory-safe\") {\n            // bottom 160 bits of data\n            sqrtPriceX96 := and(data, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            // next 24 bits of data\n            tick := signextend(2, shr(160, data))\n            // next 24 bits of data\n            protocolFee := and(shr(184, data), 0xFFFFFF)\n            // last 24 bits of data\n            lpFee := and(shr(208, data), 0xFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the tick information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve information for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickInfo(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (\n            uint128 liquidityGross,\n            int128 liquidityNet,\n            uint256 feeGrowthOutside0X128,\n            uint256 feeGrowthOutside1X128\n        )\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // read all 3 words of the TickInfo struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n        assembly (\"memory-safe\") {\n            let firstWord := mload(add(data, 32))\n            liquidityNet := sar(128, firstWord)\n            liquidityGross := and(firstWord, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            feeGrowthOutside0X128 := mload(add(data, 64))\n            feeGrowthOutside1X128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick].liquidityGross and pools[poolId].ticks[tick].liquidityNet. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve liquidity for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     */\n    function getTickLiquidity(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint128 liquidityGross, int128 liquidityNet)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        bytes32 value = manager.extsload(slot);\n        assembly (\"memory-safe\") {\n            liquidityNet := sar(128, value)\n            liquidityGross := and(value, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the fee growth outside a tick range of a pool\n     * @dev Corresponds to pools[poolId].ticks[tick].feeGrowthOutside0X128 and pools[poolId].ticks[tick].feeGrowthOutside1X128. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve fee growth for.\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickFeeGrowthOutside(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // offset by 1 word, since the first word is liquidityGross + liquidityNet\n        bytes32[] memory data = manager.extsload(bytes32(uint256(slot) + 1), 2);\n        assembly (\"memory-safe\") {\n            feeGrowthOutside0X128 := mload(add(data, 32))\n            feeGrowthOutside1X128 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves the global fee growth of a pool.\n     * @dev Corresponds to pools[poolId].feeGrowthGlobal0X128 and pools[poolId].feeGrowthGlobal1X128\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return feeGrowthGlobal0 The global fee growth for token0.\n     * @return feeGrowthGlobal1 The global fee growth for token1.\n     * @dev Note that feeGrowthGlobal can be artificially inflated\n     * For pools with a single liquidity position, actors can donate to themselves to freely inflate feeGrowthGlobal\n     * atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n     */\n    function getFeeGrowthGlobals(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State, `uint256 feeGrowthGlobal0X128`\n        bytes32 slot_feeGrowthGlobal0X128 = bytes32(uint256(stateSlot) + FEE_GROWTH_GLOBAL0_OFFSET);\n\n        // read the 2 words of feeGrowthGlobal\n        bytes32[] memory data = manager.extsload(slot_feeGrowthGlobal0X128, 2);\n        assembly (\"memory-safe\") {\n            feeGrowthGlobal0 := mload(add(data, 32))\n            feeGrowthGlobal1 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves total the liquidity of a pool.\n     * @dev Corresponds to pools[poolId].liquidity\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return liquidity The liquidity of the pool.\n     */\n    function getLiquidity(IPoolManager manager, PoolId poolId) internal view returns (uint128 liquidity) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `uint128 liquidity`\n        bytes32 slot = bytes32(uint256(stateSlot) + LIQUIDITY_OFFSET);\n\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Retrieves the tick bitmap of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].tickBitmap[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve the bitmap for.\n     * @return tickBitmap The bitmap of the tick.\n     */\n    function getTickBitmap(IPoolManager manager, PoolId poolId, int16 tick)\n        internal\n        view\n        returns (uint256 tickBitmap)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int16 => uint256) tickBitmap;`\n        bytes32 tickBitmapMapping = bytes32(uint256(stateSlot) + TICK_BITMAP_OFFSET);\n\n        // slot id of the mapping key: `pools[poolId].tickBitmap[tick]\n        bytes32 slot = keccak256(abi.encodePacked(int256(tick), tickBitmapMapping));\n\n        tickBitmap = uint256(manager.extsload(slot));\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool without needing to calculate the `positionId`.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param poolId The ID of the pool.\n     * @param owner The owner of the liquidity position.\n     * @param tickLower The lower tick of the liquidity range.\n     * @param tickUpper The upper tick of the liquidity range.\n     * @param salt The bytes32 randomness to further distinguish position state.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(\n        IPoolManager manager,\n        PoolId poolId,\n        address owner,\n        int24 tickLower,\n        int24 tickUpper,\n        bytes32 salt\n    ) internal view returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128) {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        bytes32 positionKey = Position.calculatePositionKey(owner, tickLower, tickUpper, salt);\n\n        (liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128) = getPositionInfo(manager, poolId, positionKey);\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool at a specific position ID.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n\n        // read all 3 words of the Position.State struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n\n        assembly (\"memory-safe\") {\n            liquidity := mload(add(data, 32))\n            feeGrowthInside0LastX128 := mload(add(data, 64))\n            feeGrowthInside1LastX128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity of a position.\n     * @dev Corresponds to pools[poolId].positions[positionId].liquidity. More gas efficient for just retrieiving liquidity as compared to getPositionInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     */\n    function getPositionLiquidity(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Calculate the fee growth inside a tick range of a pool\n     * @dev pools[poolId].feeGrowthInside0LastX128 in Position.State is cached and can become stale. This function will calculate the up to date feeGrowthInside\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tickLower The lower tick of the range.\n     * @param tickUpper The upper tick of the range.\n     * @return feeGrowthInside0X128 The fee growth inside the tick range for token0.\n     * @return feeGrowthInside1X128 The fee growth inside the tick range for token1.\n     */\n    function getFeeGrowthInside(IPoolManager manager, PoolId poolId, int24 tickLower, int24 tickUpper)\n        internal\n        view\n        returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)\n    {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = getFeeGrowthGlobals(manager, poolId);\n\n        (uint256 lowerFeeGrowthOutside0X128, uint256 lowerFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickLower);\n        (uint256 upperFeeGrowthOutside0X128, uint256 upperFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickUpper);\n        (, int24 tickCurrent,,) = getSlot0(manager, poolId);\n        unchecked {\n            if (tickCurrent < tickLower) {\n                feeGrowthInside0X128 = lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            } else if (tickCurrent >= tickUpper) {\n                feeGrowthInside0X128 = upperFeeGrowthOutside0X128 - lowerFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = upperFeeGrowthOutside1X128 - lowerFeeGrowthOutside1X128;\n            } else {\n                feeGrowthInside0X128 = feeGrowthGlobal0X128 - lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = feeGrowthGlobal1X128 - lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            }\n        }\n    }\n\n    function _getPoolStateSlot(PoolId poolId) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(PoolId.unwrap(poolId), POOLS_SLOT));\n    }\n\n    function _getTickInfoSlot(PoolId poolId, int24 tick) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int24 => TickInfo) ticks`\n        bytes32 ticksMappingSlot = bytes32(uint256(stateSlot) + TICKS_OFFSET);\n\n        // slot key of the tick key: `pools[poolId].ticks[tick]\n        return keccak256(abi.encodePacked(int256(tick), ticksMappingSlot));\n    }\n\n    function _getPositionInfoSlot(PoolId poolId, bytes32 positionId) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(bytes32 => Position.State) positions;`\n        bytes32 positionMapping = bytes32(uint256(stateSlot) + POSITIONS_OFFSET);\n\n        // slot of the mapping key: `pools[poolId].positions[positionId]\n        return keccak256(abi.encodePacked(positionId, positionMapping));\n    }\n}\n"},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Return type of the beforeSwap hook.\n// Upper 128 bits is the delta in specified tokens. Lower 128 bits is delta in unspecified tokens (to match the afterSwap hook)\ntype BeforeSwapDelta is int256;\n\n// Creates a BeforeSwapDelta from specified and unspecified\nfunction toBeforeSwapDelta(int128 deltaSpecified, int128 deltaUnspecified)\n    pure\n    returns (BeforeSwapDelta beforeSwapDelta)\n{\n    assembly (\"memory-safe\") {\n        beforeSwapDelta := or(shl(128, deltaSpecified), and(sub(shl(128, 1), 1), deltaUnspecified))\n    }\n}\n\n/// @notice Library for getting the specified and unspecified deltas from the BeforeSwapDelta type\nlibrary BeforeSwapDeltaLibrary {\n    /// @notice A BeforeSwapDelta of 0\n    BeforeSwapDelta public constant ZERO_DELTA = BeforeSwapDelta.wrap(0);\n\n    /// extracts int128 from the upper 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap\n    function getSpecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaSpecified) {\n        assembly (\"memory-safe\") {\n            deltaSpecified := sar(128, delta)\n        }\n    }\n\n    /// extracts int128 from the lower 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap and afterSwap\n    function getUnspecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaUnspecified) {\n        assembly (\"memory-safe\") {\n            deltaUnspecified := signextend(15, delta)\n        }\n    }\n}\n"},"lib/v4-core/src/libraries/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n    using CustomRevert for bytes4;\n\n    error SafeCastOverflow();\n\n    /// @notice Cast a uint256 to a uint160, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint160\n    function toUint160(uint256 x) internal pure returns (uint160 y) {\n        y = uint160(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a uint128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint128\n    function toUint128(uint256 x) internal pure returns (uint128 y) {\n        y = uint128(x);\n        if (x != y) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a int128 to a uint128, revert on overflow or underflow\n    /// @param x The int128 to be casted\n    /// @return y The casted integer, now type uint128\n    function toUint128(int128 x) internal pure returns (uint128 y) {\n        if (x < 0) SafeCastOverflow.selector.revertWith();\n        y = uint128(x);\n    }\n\n    /// @notice Cast a int256 to a int128, revert on overflow or underflow\n    /// @param x The int256 to be downcasted\n    /// @return y The downcasted integer, now type int128\n    function toInt128(int256 x) internal pure returns (int128 y) {\n        y = int128(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int256, revert on overflow\n    /// @param x The uint256 to be casted\n    /// @return y The casted integer, now type int256\n    function toInt256(uint256 x) internal pure returns (int256 y) {\n        y = int256(x);\n        if (y < 0) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return The downcasted integer, now type int128\n    function toInt128(uint256 x) internal pure returns (int128) {\n        if (x >= 1 << 127) SafeCastOverflow.selector.revertWith();\n        return int128(int256(x));\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice Library of helper functions for a pools LP fee\nlibrary LPFeeLibrary {\n    using LPFeeLibrary for uint24;\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the static or dynamic fee on a pool exceeds 100%.\n    error LPFeeTooLarge(uint24 fee);\n\n    /// @notice An lp fee of exactly 0b1000000... signals a dynamic fee pool. This isn't a valid static fee as it is > MAX_LP_FEE\n    uint24 public constant DYNAMIC_FEE_FLAG = 0x800000;\n\n    /// @notice the second bit of the fee returned by beforeSwap is used to signal if the stored LP fee should be overridden in this swap\n    // only dynamic-fee pools can return a fee via the beforeSwap hook\n    uint24 public constant OVERRIDE_FEE_FLAG = 0x400000;\n\n    /// @notice mask to remove the override fee flag from a fee returned by the beforeSwaphook\n    uint24 public constant REMOVE_OVERRIDE_MASK = 0xBFFFFF;\n\n    /// @notice the lp fee is represented in hundredths of a bip, so the max is 100%\n    uint24 public constant MAX_LP_FEE = 1000000;\n\n    /// @notice returns true if a pool's LP fee signals that the pool has a dynamic fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is dynamic\n    function isDynamicFee(uint24 self) internal pure returns (bool) {\n        return self == DYNAMIC_FEE_FLAG;\n    }\n\n    /// @notice returns true if an LP fee is valid, aka not above the maximum permitted fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is valid\n    function isValid(uint24 self) internal pure returns (bool) {\n        return self <= MAX_LP_FEE;\n    }\n\n    /// @notice validates whether an LP fee is larger than the maximum, and reverts if invalid\n    /// @param self The fee to validate\n    function validate(uint24 self) internal pure {\n        if (!self.isValid()) LPFeeTooLarge.selector.revertWith(self);\n    }\n\n    /// @notice gets and validates the initial LP fee for a pool. Dynamic fee pools have an initial fee of 0.\n    /// @dev if a dynamic fee pool wants a non-0 initial fee, it should call `updateDynamicLPFee` in the afterInitialize hook\n    /// @param self The fee to get the initial LP from\n    /// @return initialFee 0 if the fee is dynamic, otherwise the fee (if valid)\n    function getInitialLPFee(uint24 self) internal pure returns (uint24) {\n        // the initial fee for a dynamic fee pool is 0\n        if (self.isDynamicFee()) return 0;\n        self.validate();\n        return self;\n    }\n\n    /// @notice returns true if the fee has the override flag set (2nd highest bit of the uint24)\n    /// @param self The fee to check\n    /// @return bool True of the fee has the override flag set\n    function isOverride(uint24 self) internal pure returns (bool) {\n        return self & OVERRIDE_FEE_FLAG != 0;\n    }\n\n    /// @notice returns a fee with the override flag removed\n    /// @param self The fee to remove the override flag from\n    /// @return fee The fee without the override flag set\n    function removeOverrideFlag(uint24 self) internal pure returns (uint24) {\n        return self & REMOVE_OVERRIDE_MASK;\n    }\n\n    /// @notice Removes the override flag and validates the fee (reverts if the fee is too large)\n    /// @param self The fee to remove the override flag from, and then validate\n    /// @return fee The fee without the override flag set (if valid)\n    function removeOverrideFlagAndValidate(uint24 self) internal pure returns (uint24 fee) {\n        fee = self.removeOverrideFlag();\n        fee.validate();\n    }\n}\n"},"lib/v4-core/src/libraries/ParseBytes.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @notice Parses bytes returned from hooks and the byte selector used to check return selectors from hooks.\n/// @dev parseSelector also is used to parse the expected selector\n/// For parsing hook returns, note that all hooks return either bytes4 or (bytes4, 32-byte-delta) or (bytes4, 32-byte-delta, uint24).\nlibrary ParseBytes {\n    function parseSelector(bytes memory result) internal pure returns (bytes4 selector) {\n        // equivalent: (selector,) = abi.decode(result, (bytes4, int256));\n        assembly (\"memory-safe\") {\n            selector := mload(add(result, 0x20))\n        }\n    }\n\n    function parseFee(bytes memory result) internal pure returns (uint24 lpFee) {\n        // equivalent: (,, lpFee) = abi.decode(result, (bytes4, int256, uint24));\n        assembly (\"memory-safe\") {\n            lpFee := mload(add(result, 0x60))\n        }\n    }\n\n    function parseReturnDelta(bytes memory result) internal pure returns (int256 hookReturn) {\n        // equivalent: (, hookReturnDelta) = abi.decode(result, (bytes4, int256));\n        assembly (\"memory-safe\") {\n            hookReturn := mload(add(result, 0x40))\n        }\n    }\n}\n"},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for the callback executed when an address unlocks the pool manager\ninterface IUnlockCallback {\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    /// @param data The data that was passed to the call to unlock\n    /// @return Any data that you want to be returned from the unlock call\n    function unlockCallback(bytes calldata data) external returns (bytes memory);\n}\n"},"lib/v4-core/src/ERC6909.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC6909Claims} from \"./interfaces/external/IERC6909Claims.sol\";\n\n/// @notice Minimalist and gas efficient standard ERC6909 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC6909.sol)\n/// @dev Copied from the commit at 4b47a19038b798b4a33d9749d25e570443520647\n/// @dev This contract has been modified from the implementation at the above link.\nabstract contract ERC6909 is IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                             ERC6909 STORAGE\n    //////////////////////////////////////////////////////////////*/\n\n    mapping(address owner => mapping(address operator => bool isOperator)) public isOperator;\n\n    mapping(address owner => mapping(uint256 id => uint256 balance)) public balanceOf;\n\n    mapping(address owner => mapping(address spender => mapping(uint256 id => uint256 amount))) public allowance;\n\n    /*//////////////////////////////////////////////////////////////\n                              ERC6909 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function transfer(address receiver, uint256 id, uint256 amount) public virtual returns (bool) {\n        balanceOf[msg.sender][id] -= amount;\n\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, msg.sender, receiver, id, amount);\n\n        return true;\n    }\n\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) public virtual returns (bool) {\n        if (msg.sender != sender && !isOperator[sender][msg.sender]) {\n            uint256 allowed = allowance[sender][msg.sender][id];\n            if (allowed != type(uint256).max) allowance[sender][msg.sender][id] = allowed - amount;\n        }\n\n        balanceOf[sender][id] -= amount;\n\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, sender, receiver, id, amount);\n\n        return true;\n    }\n\n    function approve(address spender, uint256 id, uint256 amount) public virtual returns (bool) {\n        allowance[msg.sender][spender][id] = amount;\n\n        emit Approval(msg.sender, spender, id, amount);\n\n        return true;\n    }\n\n    function setOperator(address operator, bool approved) public virtual returns (bool) {\n        isOperator[msg.sender][operator] = approved;\n\n        emit OperatorSet(msg.sender, operator, approved);\n\n        return true;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                              ERC165 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n            || interfaceId == 0x0f632fb3; // ERC165 Interface ID for ERC6909\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        INTERNAL MINT/BURN LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function _mint(address receiver, uint256 id, uint256 amount) internal virtual {\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, address(0), receiver, id, amount);\n    }\n\n    function _burn(address sender, uint256 id, uint256 amount) internal virtual {\n        balanceOf[sender][id] -= amount;\n\n        emit Transfer(msg.sender, sender, address(0), id, amount);\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (utils/ReentrancyGuardTransient.sol)\n\npragma solidity ^0.8.24;\n\nimport {TransientSlot} from \"./TransientSlot.sol\";\n\n/**\n * @dev Variant of {ReentrancyGuard} that uses transient storage.\n *\n * NOTE: This variant only works on networks where EIP-1153 is available.\n *\n * _Available since v5.1._\n *\n * @custom:stateless\n */\nabstract contract ReentrancyGuardTransient {\n    using TransientSlot for *;\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant REENTRANCY_GUARD_STORAGE =\n        0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    /**\n     * @dev A `view` only version of {nonReentrant}. Use to block view functions\n     * from being called, preventing reading from inconsistent contract state.\n     *\n     * CAUTION: This is a \"view\" modifier and does not change the reentrancy\n     * status. Use it only on view functions. For payable or non-payable functions,\n     * use the standard {nonReentrant} modifier instead.\n     */\n    modifier nonReentrantView() {\n        _nonReentrantBeforeView();\n        _;\n    }\n\n    function _nonReentrantBeforeView() private view {\n        if (_reentrancyGuardEntered()) {\n            revert ReentrancyGuardReentrantCall();\n        }\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, REENTRANCY_GUARD_STORAGE.asBoolean().tload() will be false\n        _nonReentrantBeforeView();\n\n        // Any calls to nonReentrant after this point will fail\n        _reentrancyGuardStorageSlot().asBoolean().tstore(true);\n    }\n\n    function _nonReentrantAfter() private {\n        _reentrancyGuardStorageSlot().asBoolean().tstore(false);\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _reentrancyGuardStorageSlot().asBoolean().tload();\n    }\n\n    function _reentrancyGuardStorageSlot() internal pure virtual returns (bytes32) {\n        return REENTRANCY_GUARD_STORAGE;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/AccessManaged.sol)\n\npragma solidity ^0.8.20;\n\nimport {AuthorityUtils} from \"./AuthorityUtils.sol\";\nimport {IAccessManager} from \"./IAccessManager.sol\";\nimport {IAccessManaged} from \"./IAccessManaged.sol\";\nimport {Context} from \"../../utils/Context.sol\";\n\n/**\n * @dev This contract module makes available a {restricted} modifier. Functions decorated with this modifier will be\n * permissioned according to an \"authority\": a contract like {AccessManager} that follows the {IAuthority} interface,\n * implementing a policy that allows certain callers to access certain functions.\n *\n * IMPORTANT: The `restricted` modifier should never be used on `internal` functions, judiciously used in `public`\n * functions, and ideally only used in `external` functions. See {restricted}.\n */\nabstract contract AccessManaged is Context, IAccessManaged {\n    address private _authority;\n\n    bool private _consumingSchedule;\n\n    /**\n     * @dev Initializes the contract connected to an initial authority.\n     */\n    constructor(address initialAuthority) {\n        _setAuthority(initialAuthority);\n    }\n\n    /**\n     * @dev Restricts access to a function as defined by the connected Authority for this contract and the\n     * caller and selector of the function that entered the contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * In general, this modifier should only be used on `external` functions. It is okay to use it on `public`\n     * functions that are used as external entry points and are not called internally. Unless you know what you're\n     * doing, it should never be used on `internal` functions. Failure to follow these rules can have critical security\n     * implications! This is because the permissions are determined by the function that entered the contract, i.e. the\n     * function at the bottom of the call stack, and not the function where the modifier is visible in the source code.\n     * ====\n     *\n     * [WARNING]\n     * ====\n     * Avoid adding this modifier to the https://docs.soliditylang.org/en/v0.8.20/contracts.html#receive-ether-function[`receive()`]\n     * function or the https://docs.soliditylang.org/en/v0.8.20/contracts.html#fallback-function[`fallback()`]. These\n     * functions are the only execution paths where a function selector cannot be unambiguously determined from the calldata\n     * since the selector defaults to `0x00000000` in the `receive()` function and similarly in the `fallback()` function\n     * if no calldata is provided. (See {_checkCanCall}).\n     *\n     * The `receive()` function will always panic whereas the `fallback()` may panic depending on the calldata length.\n     * ====\n     */\n    modifier restricted() {\n        _checkCanCall(_msgSender(), _msgData());\n        _;\n    }\n\n    /// @inheritdoc IAccessManaged\n    function authority() public view virtual returns (address) {\n        return _authority;\n    }\n\n    /// @inheritdoc IAccessManaged\n    function setAuthority(address newAuthority) public virtual {\n        address caller = _msgSender();\n        if (caller != authority()) {\n            revert AccessManagedUnauthorized(caller);\n        }\n        if (newAuthority.code.length == 0) {\n            revert AccessManagedInvalidAuthority(newAuthority);\n        }\n        _setAuthority(newAuthority);\n    }\n\n    /// @inheritdoc IAccessManaged\n    function isConsumingScheduledOp() public view returns (bytes4) {\n        return _consumingSchedule ? this.isConsumingScheduledOp.selector : bytes4(0);\n    }\n\n    /**\n     * @dev Transfers control to a new authority. Internal function with no access restriction. Allows bypassing the\n     * permissions set by the current authority.\n     */\n    function _setAuthority(address newAuthority) internal virtual {\n        _authority = newAuthority;\n        emit AuthorityUpdated(newAuthority);\n    }\n\n    /**\n     * @dev Reverts if the caller is not allowed to call the function identified by a selector. Panics if the calldata\n     * is less than 4 bytes long.\n     */\n    function _checkCanCall(address caller, bytes calldata data) internal virtual {\n        (bool immediate, uint32 delay) = AuthorityUtils.canCallWithDelay(\n            authority(),\n            caller,\n            address(this),\n            bytes4(data[0:4])\n        );\n        if (!immediate) {\n            if (delay > 0) {\n                _consumingSchedule = true;\n                IAccessManager(authority()).consumeScheduledOp(caller, data);\n                _consumingSchedule = false;\n            } else {\n                revert AccessManagedUnauthorized(caller);\n            }\n        }\n    }\n}\n"},"lib/v4-core/src/libraries/Position.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {FixedPoint128} from \"./FixedPoint128.sol\";\nimport {LiquidityMath} from \"./LiquidityMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n    using CustomRevert for bytes4;\n\n    /// @notice Cannot update a position with no liquidity\n    error CannotUpdateEmptyPosition();\n\n    // info stored for each user's position\n    struct State {\n        // the amount of liquidity owned by this position\n        uint128 liquidity;\n        // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n        uint256 feeGrowthInside0LastX128;\n        uint256 feeGrowthInside1LastX128;\n    }\n\n    /// @notice Returns the State struct of a position, given an owner and position boundaries\n    /// @param self The mapping containing all user positions\n    /// @param owner The address of the position owner\n    /// @param tickLower The lower tick boundary of the position\n    /// @param tickUpper The upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range\n    /// @return position The position info struct of the given owners' position\n    function get(mapping(bytes32 => State) storage self, address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        view\n        returns (State storage position)\n    {\n        bytes32 positionKey = calculatePositionKey(owner, tickLower, tickUpper, salt);\n        position = self[positionKey];\n    }\n\n    /// @notice A helper function to calculate the position key\n    /// @param owner The address of the position owner\n    /// @param tickLower the lower tick boundary of the position\n    /// @param tickUpper the upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range, by the same owner. Passed in by the caller.\n    function calculatePositionKey(address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        pure\n        returns (bytes32 positionKey)\n    {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(add(fmp, 0x26), salt) // [0x26, 0x46)\n            mstore(add(fmp, 0x06), tickUpper) // [0x23, 0x26)\n            mstore(add(fmp, 0x03), tickLower) // [0x20, 0x23)\n            mstore(fmp, owner) // [0x0c, 0x20)\n            positionKey := keccak256(add(fmp, 0x0c), 0x3a) // len is 58 bytes\n\n            // now clean the memory we used\n            mstore(add(fmp, 0x40), 0) // fmp+0x40 held salt\n            mstore(add(fmp, 0x20), 0) // fmp+0x20 held tickLower, tickUpper, salt\n            mstore(fmp, 0) // fmp held owner\n        }\n    }\n\n    /// @notice Credits accumulated fees to a user's position\n    /// @param self The individual position to update\n    /// @param liquidityDelta The change in pool liquidity as a result of the position update\n    /// @param feeGrowthInside0X128 The all-time fee growth in currency0, per unit of liquidity, inside the position's tick boundaries\n    /// @param feeGrowthInside1X128 The all-time fee growth in currency1, per unit of liquidity, inside the position's tick boundaries\n    /// @return feesOwed0 The amount of currency0 owed to the position owner\n    /// @return feesOwed1 The amount of currency1 owed to the position owner\n    function update(\n        State storage self,\n        int128 liquidityDelta,\n        uint256 feeGrowthInside0X128,\n        uint256 feeGrowthInside1X128\n    ) internal returns (uint256 feesOwed0, uint256 feesOwed1) {\n        uint128 liquidity = self.liquidity;\n\n        if (liquidityDelta == 0) {\n            // disallow pokes for 0 liquidity positions\n            if (liquidity == 0) CannotUpdateEmptyPosition.selector.revertWith();\n        } else {\n            self.liquidity = LiquidityMath.addDelta(liquidity, liquidityDelta);\n        }\n\n        // calculate accumulated fees. overflow in the subtraction of fee growth is expected\n        unchecked {\n            feesOwed0 =\n                FullMath.mulDiv(feeGrowthInside0X128 - self.feeGrowthInside0LastX128, liquidity, FixedPoint128.Q128);\n            feesOwed1 =\n                FullMath.mulDiv(feeGrowthInside1X128 - self.feeGrowthInside1LastX128, liquidity, FixedPoint128.Q128);\n        }\n\n        // update the position\n        self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n        self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/TransientSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/TransientSlot.js.\n\npragma solidity ^0.8.24;\n\n/**\n * @dev Library for reading and writing value-types to specific transient storage slots.\n *\n * Transient slots are often used to store temporary values that are removed after the current transaction.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n *  * Example reading and writing values using transient storage:\n * ```solidity\n * contract Lock {\n *     using TransientSlot for *;\n *\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542;\n *\n *     modifier locked() {\n *         require(!_LOCK_SLOT.asBoolean().tload());\n *\n *         _LOCK_SLOT.asBoolean().tstore(true);\n *         _;\n *         _LOCK_SLOT.asBoolean().tstore(false);\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary TransientSlot {\n    /**\n     * @dev UDVT that represents a slot holding an address.\n     */\n    type AddressSlot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a AddressSlot.\n     */\n    function asAddress(bytes32 slot) internal pure returns (AddressSlot) {\n        return AddressSlot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a bool.\n     */\n    type BooleanSlot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a BooleanSlot.\n     */\n    function asBoolean(bytes32 slot) internal pure returns (BooleanSlot) {\n        return BooleanSlot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a bytes32.\n     */\n    type Bytes32Slot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a Bytes32Slot.\n     */\n    function asBytes32(bytes32 slot) internal pure returns (Bytes32Slot) {\n        return Bytes32Slot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a uint256.\n     */\n    type Uint256Slot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a Uint256Slot.\n     */\n    function asUint256(bytes32 slot) internal pure returns (Uint256Slot) {\n        return Uint256Slot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a int256.\n     */\n    type Int256Slot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a Int256Slot.\n     */\n    function asInt256(bytes32 slot) internal pure returns (Int256Slot) {\n        return Int256Slot.wrap(slot);\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(AddressSlot slot) internal view returns (address value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(AddressSlot slot, address value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(BooleanSlot slot) internal view returns (bool value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(BooleanSlot slot, bool value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(Bytes32Slot slot) internal view returns (bytes32 value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(Bytes32Slot slot, bytes32 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(Uint256Slot slot) internal view returns (uint256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(Uint256Slot slot, uint256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(Int256Slot slot) internal view returns (int256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(Int256Slot slot, int256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (access/manager/AuthorityUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAuthority} from \"./IAuthority.sol\";\n\nlibrary AuthorityUtils {\n    /**\n     * @dev Since `AccessManager` implements an extended IAuthority interface, invoking `canCall` with backwards compatibility\n     * for the preexisting `IAuthority` interface requires special care to avoid reverting on insufficient return data.\n     * This helper function takes care of invoking `canCall` in a backwards compatible way without reverting.\n     */\n    function canCallWithDelay(\n        address authority,\n        address caller,\n        address target,\n        bytes4 selector\n    ) internal view returns (bool immediate, uint32 delay) {\n        bytes memory data = abi.encodeCall(IAuthority.canCall, (caller, target, selector));\n\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x00)\n            mstore(0x20, 0x00)\n\n            if staticcall(gas(), authority, add(data, 0x20), mload(data), 0x00, 0x40) {\n                immediate := mload(0x00)\n                delay := mload(0x20)\n\n                // If delay does not fit in a uint32, return 0 (no delay)\n                // equivalent to: if gt(delay, 0xFFFFFFFF) { delay := 0 }\n                delay := mul(delay, iszero(shr(32, delay)))\n            }\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.7.0) (access/manager/IAccessManager.sol)\n\npragma solidity >=0.8.4;\n\ninterface IAccessManager {\n    /**\n     * @dev A delayed operation was scheduled.\n     */\n    event OperationScheduled(\n        bytes32 indexed operationId,\n        uint32 indexed nonce,\n        uint48 schedule,\n        address caller,\n        address target,\n        bytes data\n    );\n\n    /**\n     * @dev A scheduled operation was executed.\n     */\n    event OperationExecuted(bytes32 indexed operationId, uint32 indexed nonce);\n\n    /**\n     * @dev A scheduled operation was canceled.\n     */\n    event OperationCanceled(bytes32 indexed operationId, uint32 indexed nonce);\n\n    /**\n     * @dev Informational labelling for a roleId.\n     */\n    event RoleLabel(uint64 indexed roleId, string label);\n\n    /**\n     * @dev Emitted when `account` is granted `roleId`.\n     *\n     * NOTE: The meaning of the `since` argument depends on the `newMember` argument.\n     * If the role is granted to a new member, the `since` argument indicates when the account becomes a member of the role,\n     * otherwise it indicates the timestamp when the execution delay update takes effect for this account and roleId.\n     */\n    event RoleGranted(uint64 indexed roleId, address indexed account, uint32 delay, uint48 since, bool newMember);\n\n    /**\n     * @dev Emitted when `account` membership or `roleId` is revoked. Unlike granting, revoking is instantaneous.\n     */\n    event RoleRevoked(uint64 indexed roleId, address indexed account);\n\n    /**\n     * @dev Role acting as admin over a given `roleId` is updated.\n     */\n    event RoleAdminChanged(uint64 indexed roleId, uint64 indexed admin);\n\n    /**\n     * @dev Role acting as guardian over a given `roleId` is updated.\n     */\n    event RoleGuardianChanged(uint64 indexed roleId, uint64 indexed guardian);\n\n    /**\n     * @dev Grant delay for a given `roleId` will be updated to `delay` when `since` is reached.\n     */\n    event RoleGrantDelayChanged(uint64 indexed roleId, uint32 delay, uint48 since);\n\n    /**\n     * @dev Target mode is updated (true = closed, false = open).\n     */\n    event TargetClosed(address indexed target, bool closed);\n\n    /**\n     * @dev Role required to invoke `selector` on `target` is updated to `roleId`.\n     */\n    event TargetFunctionRoleUpdated(address indexed target, bytes4 selector, uint64 indexed roleId);\n\n    /**\n     * @dev Admin delay for a given `target` will be updated to `delay` when `since` is reached.\n     */\n    event TargetAdminDelayUpdated(address indexed target, uint32 delay, uint48 since);\n\n    error AccessManagerAlreadyScheduled(bytes32 operationId);\n    error AccessManagerNotScheduled(bytes32 operationId);\n    error AccessManagerNotReady(bytes32 operationId);\n    error AccessManagerExpired(bytes32 operationId);\n    error AccessManagerLockedRole(uint64 roleId);\n    error AccessManagerLockedFunction(bytes4 selector);\n    error AccessManagerBadConfirmation();\n    error AccessManagerUnauthorizedAccount(address msgsender, uint64 roleId);\n    error AccessManagerUnauthorizedCall(address caller, address target, bytes4 selector);\n    error AccessManagerUnauthorizedConsume(address target);\n    error AccessManagerUnauthorizedCancel(address msgsender, address caller, address target, bytes4 selector);\n    error AccessManagerInvalidInitialAdmin(address initialAdmin);\n\n    /**\n     * @dev Check if an address (`caller`) is authorised to call a given function on a given contract directly (with\n     * no restriction). Additionally, it returns the delay needed to perform the call indirectly through the {schedule}\n     * & {execute} workflow.\n     *\n     * This function is usually called by the targeted contract to control immediate execution of restricted functions.\n     * Therefore we only return true if the call can be performed without any delay. If the call is subject to a\n     * previously set delay (not zero), then the function should return false and the caller should schedule the operation\n     * for future execution.\n     *\n     * If `allowed` is true, the delay can be disregarded and the operation can be immediately executed, otherwise\n     * the operation can be executed if and only if delay is greater than 0.\n     *\n     * NOTE: The IAuthority interface does not include the `uint32` delay. This is an extension of that interface that\n     * is backward compatible. Some contracts may thus ignore the second return argument. In that case they will fail\n     * to identify the indirect workflow, and will consider calls that require a delay to be forbidden.\n     *\n     * NOTE: This function does not report the permissions of the admin functions in the manager itself. These are defined by the\n     * {AccessManager} documentation.\n     *\n     * NOTE: The `setAuthority(address)` selector is reserved on all targets (whether or not they are {AccessManaged}):\n     * it is gated to `ADMIN_ROLE` with a possible delay, and it cannot be reconfigured via {setTargetFunctionRole}.\n     * Any target function whose selector collides with `setAuthority(address)` inherits this restriction when routed\n     * through the manager.\n     */\n    function canCall(\n        address caller,\n        address target,\n        bytes4 selector\n    ) external view returns (bool allowed, uint32 delay);\n\n    /**\n     * @dev Expiration delay for scheduled proposals. Defaults to 1 week.\n     *\n     * IMPORTANT: Avoid overriding the expiration with 0. Otherwise every contract proposal will be expired immediately,\n     * disabling any scheduling usage.\n     */\n    function expiration() external view returns (uint32);\n\n    /**\n     * @dev Minimum setback for all delay updates, with the exception of execution delays. It\n     * can be increased without setback (and reset via {revokeRole} in the event of an\n     * accidental increase). Defaults to 5 days.\n     */\n    function minSetback() external view returns (uint32);\n\n    /**\n     * @dev Get whether the contract is closed disabling any access. Otherwise role permissions are applied.\n     *\n     * NOTE: When the manager itself is closed, admin functions are still accessible to avoid locking the contract.\n     */\n    function isTargetClosed(address target) external view returns (bool);\n\n    /**\n     * @dev Get the role required to call a function.\n     */\n    function getTargetFunctionRole(address target, bytes4 selector) external view returns (uint64);\n\n    /**\n     * @dev Get the admin delay for a target contract. Changes to contract configuration are subject to this delay.\n     */\n    function getTargetAdminDelay(address target) external view returns (uint32);\n\n    /**\n     * @dev Get the id of the role that acts as an admin for the given role.\n     *\n     * The admin permission is required to grant the role, revoke the role and update the execution delay to execute\n     * an operation that is restricted to this role.\n     */\n    function getRoleAdmin(uint64 roleId) external view returns (uint64);\n\n    /**\n     * @dev Get the role that acts as a guardian for a given role.\n     *\n     * The guardian permission allows canceling operations that have been scheduled under the role.\n     */\n    function getRoleGuardian(uint64 roleId) external view returns (uint64);\n\n    /**\n     * @dev Get the role current grant delay.\n     *\n     * Its value may change at any point without an event emitted following a call to {setGrantDelay}.\n     * Changes to this value, including effect timepoint are notified in advance by the {RoleGrantDelayChanged} event.\n     */\n    function getRoleGrantDelay(uint64 roleId) external view returns (uint32);\n\n    /**\n     * @dev Get the access details for a given account for a given role. These details include the timepoint at which\n     * membership becomes active, and the delay applied to all operations by this user that requires this permission\n     * level.\n     *\n     * Returns:\n     * [0] Timestamp at which the account membership becomes valid. 0 means role is not granted.\n     * [1] Current execution delay for the account.\n     * [2] Pending execution delay for the account.\n     * [3] Timestamp at which the pending execution delay will become active. 0 means no delay update is scheduled.\n     */\n    function getAccess(\n        uint64 roleId,\n        address account\n    ) external view returns (uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect);\n\n    /**\n     * @dev Check if a given account currently has the permission level corresponding to a given role. Note that this\n     * permission might be associated with an execution delay. {getAccess} can provide more details.\n     */\n    function hasRole(uint64 roleId, address account) external view returns (bool isMember, uint32 executionDelay);\n\n    /**\n     * @dev Give a label to a role, for improved role discoverability by UIs.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `ADMIN_ROLE` or `PUBLIC_ROLE`\n     *\n     * Emits a {RoleLabel} event.\n     */\n    function labelRole(uint64 roleId, string calldata label) external;\n\n    /**\n     * @dev Add `account` to `roleId`, or change its execution delay.\n     *\n     * This gives the account the authorization to call any function that is restricted to this role. An optional\n     * execution delay (in seconds) can be set. If that delay is non 0, the user is required to schedule any operation\n     * that is restricted to members of this role. The user will only be able to execute the operation after the delay has\n     * passed, before it has expired. During this period, admin and guardians can cancel the operation (see {cancel}).\n     *\n     * If the account has already been granted this role, the execution delay will be updated. This update is not\n     * immediate and follows the delay rules. For example, if a user currently has a delay of 3 hours, and this is\n     * called to reduce that delay to 1 hour, the new delay will take some time to take effect, enforcing that any\n     * operation executed in the 3 hours that follows this update was indeed scheduled before this update.\n     *\n     * Requirements:\n     *\n     * - the caller must be an admin for the role (see {getRoleAdmin})\n     * - granted role must not be the `PUBLIC_ROLE`\n     *\n     * Emits a {RoleGranted} event.\n     */\n    function grantRole(uint64 roleId, address account, uint32 executionDelay) external;\n\n    /**\n     * @dev Remove an account from a role, with immediate effect. If the account does not have the role, this call has\n     * no effect.\n     *\n     * Requirements:\n     *\n     * - the caller must be an admin for the role (see {getRoleAdmin})\n     * - revoked role must not be the `PUBLIC_ROLE`\n     *\n     * Emits a {RoleRevoked} event if the account had the role.\n     */\n    function revokeRole(uint64 roleId, address account) external;\n\n    /**\n     * @dev Renounce role permissions for the calling account with immediate effect. If the sender is not in\n     * the role this call has no effect.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * Emits a {RoleRevoked} event if the account had the role.\n     */\n    function renounceRole(uint64 roleId, address callerConfirmation) external;\n\n    /**\n     * @dev Change admin role for a given role.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `ADMIN_ROLE` or `PUBLIC_ROLE`\n     *\n     * Emits a {RoleAdminChanged} event\n     */\n    function setRoleAdmin(uint64 roleId, uint64 admin) external;\n\n    /**\n     * @dev Change guardian role for a given role.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `ADMIN_ROLE` or `PUBLIC_ROLE`\n     *\n     * Emits a {RoleGuardianChanged} event\n     */\n    function setRoleGuardian(uint64 roleId, uint64 guardian) external;\n\n    /**\n     * @dev Update the delay for granting a `roleId`.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `PUBLIC_ROLE`\n     *\n     * Emits a {RoleGrantDelayChanged} event.\n     */\n    function setGrantDelay(uint64 roleId, uint32 newDelay) external;\n\n    /**\n     * @dev Set the role required to call functions identified by the `selectors` in the `target` contract.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `selectors` must not contain the `setAuthority(address)` selector, which is reserved. See {canCall}.\n     *\n     * Emits a {TargetFunctionRoleUpdated} event per selector.\n     */\n    function setTargetFunctionRole(address target, bytes4[] calldata selectors, uint64 roleId) external;\n\n    /**\n     * @dev Set the delay for changing the configuration of a given target contract.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     *\n     * Emits a {TargetAdminDelayUpdated} event.\n     */\n    function setTargetAdminDelay(address target, uint32 newDelay) external;\n\n    /**\n     * @dev Set the closed flag for a contract.\n     *\n     * Closing the manager itself won't disable access to admin methods to avoid locking the contract.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     *\n     * Emits a {TargetClosed} event.\n     */\n    function setTargetClosed(address target, bool closed) external;\n\n    /**\n     * @dev Return the timepoint at which a scheduled operation will be ready for execution. This returns 0 if the\n     * operation is not yet scheduled, has expired, was executed, or was canceled.\n     */\n    function getSchedule(bytes32 id) external view returns (uint48);\n\n    /**\n     * @dev Return the nonce for the latest scheduled operation with a given id. Returns 0 if the operation has never\n     * been scheduled.\n     */\n    function getNonce(bytes32 id) external view returns (uint32);\n\n    /**\n     * @dev Schedule a delayed operation for future execution, and return the operation identifier. It is possible to\n     * choose the timestamp at which the operation becomes executable as long as it satisfies the execution delays\n     * required for the caller. The special value zero will automatically set the earliest possible time.\n     *\n     * Returns the `operationId` that was scheduled. Since this value is a hash of the parameters, it can reoccur when\n     * the same parameters are used; if this is relevant, the returned `nonce` can be used to uniquely identify this\n     * scheduled operation from other occurrences of the same `operationId` in invocations of {execute} and {cancel}.\n     *\n     * Emits a {OperationScheduled} event.\n     *\n     * NOTE: It is not possible to concurrently schedule more than one operation with the same `target` and `data`. If\n     * this is necessary, a random byte can be appended to `data` to act as a salt that will be ignored by the target\n     * contract if it is using standard Solidity ABI encoding.\n     */\n    function schedule(\n        address target,\n        bytes calldata data,\n        uint48 when\n    ) external returns (bytes32 operationId, uint32 nonce);\n\n    /**\n     * @dev Execute a function that is delay restricted, provided it was properly scheduled beforehand, or the\n     * execution delay is 0.\n     *\n     * Returns the nonce that identifies the previously scheduled operation that is executed, or 0 if the\n     * operation wasn't previously scheduled (if the caller doesn't have an execution delay).\n     *\n     * Emits an {OperationExecuted} event only if the call was scheduled and delayed.\n     */\n    function execute(address target, bytes calldata data) external payable returns (uint32);\n\n    /**\n     * @dev Cancel a scheduled (delayed) operation. Returns the nonce that identifies the previously scheduled\n     * operation that is cancelled.\n     *\n     * Requirements:\n     *\n     * - the caller must be the proposer, a guardian of the targeted function, or a global admin\n     *\n     * Emits a {OperationCanceled} event.\n     */\n    function cancel(address caller, address target, bytes calldata data) external returns (uint32);\n\n    /**\n     * @dev Consume a scheduled operation targeting the caller. If such an operation exists, mark it as consumed\n     * (emit an {OperationExecuted} event and clean the state). Otherwise, throw an error.\n     *\n     * This is useful for contracts that want to enforce that calls targeting them were scheduled on the manager,\n     * with all the verifications that it implies.\n     *\n     * Emit a {OperationExecuted} event.\n     */\n    function consumeScheduledOp(address caller, bytes calldata data) external;\n\n    /**\n     * @dev Hashing function for delayed operations.\n     */\n    function hashOperation(address caller, address target, bytes calldata data) external view returns (bytes32);\n\n    /**\n     * @dev Changes the authority of a target managed by this manager instance.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     */\n    function updateAuthority(address target, address newAuthority) external;\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/IAccessManaged.sol)\n\npragma solidity >=0.8.4;\n\ninterface IAccessManaged {\n    /**\n     * @dev Authority that manages this contract was updated.\n     */\n    event AuthorityUpdated(address authority);\n\n    error AccessManagedUnauthorized(address caller);\n    error AccessManagedRequiredDelay(address caller, uint32 delay);\n    error AccessManagedInvalidAuthority(address authority);\n\n    /**\n     * @dev Returns the current authority.\n     */\n    function authority() external view returns (address);\n\n    /**\n     * @dev Transfers control to a new authority. The caller must be the current authority.\n     */\n    function setAuthority(address) external;\n\n    /**\n     * @dev Returns true only in the context of a delayed restricted call, at the moment that the scheduled operation is\n     * being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs\n     * attacker controlled calls.\n     */\n    function isConsumingScheduledOp() external view returns (bytes4);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"lib/v4-core/src/libraries/FixedPoint128.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n    uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"},"lib/v4-core/src/libraries/LiquidityMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n    /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n    /// @param x The liquidity before change\n    /// @param y The delta by which liquidity should be changed\n    /// @return z The liquidity delta\n    function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n        assembly (\"memory-safe\") {\n            z := add(and(x, 0xffffffffffffffffffffffffffffffff), signextend(15, y))\n            if shr(128, z) {\n                // revert SafeCastOverflow()\n                mstore(0, 0x93dafdf1)\n                revert(0x1c, 0x04)\n            }\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/IAuthority.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Standard interface for permissioning originally defined in Dappsys.\n */\ninterface IAuthority {\n    /**\n     * @dev Returns true if the caller can invoke on a target the function identified by a function selector.\n     */\n    function canCall(address caller, address target, bytes4 selector) external view returns (bool allowed);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.26+commit.8a97fa7a","compilerSettings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"none","useLiteralContent":false},"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"cancun","remappings":["forge-std/=lib/forge-std/src/","v4-core/=lib/v4-core/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","solmate/=lib/v4-core/lib/solmate/","@ensdomains/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/@ensdomains/","ds-test/=lib/v4-core/lib/solmate/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","hardhat/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/hardhat/","openzeppelin-contracts/=lib/openzeppelin-contracts/"]},"name":"FablesRampETH","fullyQualifiedName":"src/FablesRampETH.sol:FablesRampETH"},"abi":[{"type":"constructor","inputs":[{"name":"poolManager_","type":"address","internalType":"contract IPoolManager"},{"name":"authority_","type":"address","internalType":"address"},{"name":"absoluteMaxFee_","type":"uint24","internalType":"uint24"},{"name":"weth_","type":"address","internalType":"contract IWETH9"}],"stateMutability":"nonpayable"},{"name":"AccessManagedInvalidAuthority","type":"error","inputs":[{"name":"authority","type":"address","internalType":"address"}]},{"name":"AccessManagedRequiredDelay","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"delay","type":"uint32","internalType":"uint32"}]},{"name":"AccessManagedUnauthorized","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"}]},{"name":"BallotGateUnset","type":"error","inputs":[]},{"name":"ClaimFeeAboveMax","type":"error","inputs":[]},{"name":"DeadlineExpired","type":"error","inputs":[]},{"name":"DeskRetired","type":"error","inputs":[]},{"name":"DistributorNotFFAware","type":"error","inputs":[]},{"name":"DistributorNotFFAware","type":"error","inputs":[]},{"name":"FeeAboveCap","type":"error","inputs":[]},{"name":"FeeBelowFloor","type":"error","inputs":[]},{"name":"InsufficientUnstakedShares","type":"error","inputs":[]},{"name":"InvalidBallotGate","type":"error","inputs":[]},{"name":"InvalidClaimFee","type":"error","inputs":[]},{"name":"InvalidClaimFee","type":"error","inputs":[]},{"name":"InvalidConfig","type":"error","inputs":[]},{"name":"InvalidMaxFee","type":"error","inputs":[]},{"name":"InvalidMsgValue","type":"error","inputs":[]},{"name":"InvalidSink","type":"error","inputs":[]},{"name":"InvalidSink","type":"error","inputs":[]},{"name":"InvalidTtl","type":"error","inputs":[]},{"name":"LedgerPaused","type":"error","inputs":[]},{"name":"NativeNotSupported","type":"error","inputs":[]},{"name":"NotAVoterOfThisPool","type":"error","inputs":[]},{"name":"NotDynamicFeePool","type":"error","inputs":[]},{"name":"NotPoolManager","type":"error","inputs":[]},{"name":"NothingToClaim","type":"error","inputs":[]},{"name":"PauseTooLong","type":"error","inputs":[]},{"name":"PoolNotConfigured","type":"error","inputs":[]},{"name":"PrincipalAboveMax","type":"error","inputs":[{"name":"paid","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"PrincipalBelowMin","type":"error","inputs":[{"name":"received","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"}]},{"name":"ReentrancyGuardReentrantCall","type":"error","inputs":[]},{"name":"RefundFailed","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"UnauthorizedETHSender","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"ZeroLiquidity","type":"error","inputs":[]},{"name":"ZeroShares","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AuthorityUpdated","type":"event","inputs":[{"name":"authority","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"BallotGateSet","type":"event","inputs":[{"name":"gate","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"ClaimFeeSet","type":"event","inputs":[{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"ClaimFeeSwept","type":"event","inputs":[{"name":"currency","type":"address","indexed":true,"internalType":"Currency"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Deposited","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"DistributorSet","type":"event","inputs":[{"name":"distributor","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"DistributorSwept","type":"event","inputs":[{"name":"currency","type":"address","indexed":true,"internalType":"Currency"},{"name":"distributor","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FFFeeSinkSet","type":"event","inputs":[{"name":"sink","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"FeePoked","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"fee","type":"uint24","indexed":false,"internalType":"uint24"},{"name":"expiry","type":"uint40","indexed":false,"internalType":"uint40"}],"anonymous":false},{"name":"FeesClaimed","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FeesCollected","type":"event","inputs":[{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"fee0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"fee1","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"stakedCut0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"stakedCut1","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"accStaked0X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"accStaked1X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeGrowthInside0X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeGrowthInside1X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalShares","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"totalStaked","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"collectionSeq","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"resetSeq","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"FeesForgone","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NativeRevenueWrappedToWeth","type":"event","inputs":[{"name":"distributor","type":"address","indexed":true,"internalType":"address"},{"name":"weth","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OperatorSet","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"PausedSet","type":"event","inputs":[{"name":"pausedUntil","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PokeCleared","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"}],"anonymous":false},{"name":"PoolConfigured","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"floorPips","type":"uint24","indexed":false,"internalType":"uint24"},{"name":"flatPips","type":"uint24","indexed":false,"internalType":"uint24"},{"name":"maxFee","type":"uint24","indexed":false,"internalType":"uint24"}],"anonymous":false},{"name":"Staked","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"caller","type":"address","indexed":false,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Unstaked","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"Withdrawn","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"ABSOLUTE_MAX_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"MAX_CLAIM_FEE_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"MAX_CLAIM_FEE_WALK","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PAUSE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_POKE_DISCOUNT_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"MAX_POKE_TTL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"MIN_POOL_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authority","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"balance","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ballotGate","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"beforeInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"","type":"uint160","internalType":"uint160"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"name":"beforeSwap","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct IPoolManager.SwapParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BeforeSwapDelta"},{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"claimFeeAllTimeMin","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"claimFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"claimFeeChangeAt","type":"function","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"fromTs","type":"uint64","internalType":"uint64"},{"name":"bps","type":"uint16","internalType":"uint16"}],"internalType":"struct ClaimFeeChange"}],"stateMutability":"view"},{"name":"claimFeeFor","type":"function","inputs":[{"name":"sinceIndex","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"claimFeeHistoryLength","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimFeeOwed","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[{"name":"owed","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimFeeRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"claimFeeSyncIndex","type":"function","inputs":[{"name":"rangeId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"index","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"claimFees","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"to","type":"address","internalType":"address"},{"name":"maxFeeBps","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"clearPoke","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"currentFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"},{"name":"zeroForOne","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"deposit","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"amount0Max","type":"uint128","internalType":"uint128"},{"name":"amount1Max","type":"uint128","internalType":"uint128"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"distributor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"distributorFF","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"distributorOwed","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[{"name":"owed","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"effectiveClaimFee","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"ffFeeSink","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"flatFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"isConsumingScheduledOp","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"name":"isOperator","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"isOperator","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isSettling","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"cap","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pausedUntil","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pokeFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"ttl","type":"uint40","internalType":"uint40"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"pokeFloor","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"floor","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"pokeOf","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"expiry","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"poolManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPoolManager"}],"stateMutability":"view"},{"name":"rangeGrowth","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"growth0","type":"uint256","internalType":"uint256"},{"name":"growth1","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rangeId","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"rangeKey","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"set","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"rangeState","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"totalShares","type":"uint128","internalType":"uint128"},{"name":"totalStaked","type":"uint128","internalType":"uint128"},{"name":"accFee0X128","type":"uint256","internalType":"uint256"},{"name":"accFee1X128","type":"uint256","internalType":"uint256"},{"name":"accStaked0X128","type":"uint256","internalType":"uint256"},{"name":"accStaked1X128","type":"uint256","internalType":"uint256"},{"name":"stakedResidual0","type":"uint128","internalType":"uint128"},{"name":"stakedResidual1","type":"uint128","internalType":"uint128"},{"name":"collectionSeq","type":"uint64","internalType":"uint64"},{"name":"resetSeq","type":"uint64","internalType":"uint64"}],"internalType":"struct RangeState"}],"stateMutability":"view"},{"name":"setAuthority","type":"function","inputs":[{"name":"newAuthority","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBallotGate","type":"function","inputs":[{"name":"gate","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setClaimFee","type":"function","inputs":[{"name":"settleFirst","type":"address[]","internalType":"Currency[]"},{"name":"bps","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setDistributor","type":"function","inputs":[{"name":"settleFirst","type":"address[]","internalType":"Currency[]"},{"name":"distributor_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFFFeeSink","type":"function","inputs":[{"name":"settleFirst","type":"address[]","internalType":"Currency[]"},{"name":"sink","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setOperator","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"setPaused","type":"function","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPoolConfig","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"floorPips","type":"uint24","internalType":"uint24"},{"name":"flatPips","type":"uint24","internalType":"uint24"},{"name":"cap","type":"uint24","internalType":"uint24"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stake","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"shares","type":"uint128","internalType":"uint128"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"sweepClaimFee","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sweepDistributor","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"syncRanges","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"ids","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transfer","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"receiver","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"unlockCallback","type":"function","inputs":[{"name":"rawData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"unstake","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"shares","type":"uint128","internalType":"uint128"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"userPosition","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"staked","type":"uint128","internalType":"uint128"},{"name":"owed0","type":"uint128","internalType":"uint128"},{"name":"owed1","type":"uint128","internalType":"uint128"},{"name":"checkpoint0X128","type":"uint256","internalType":"uint256"},{"name":"checkpoint1X128","type":"uint256","internalType":"uint256"},{"name":"stakedCheckpoint0X128","type":"uint256","internalType":"uint256"},{"name":"stakedCheckpoint1X128","type":"uint256","internalType":"uint256"},{"name":"forgone0","type":"uint256","internalType":"uint256"},{"name":"forgone1","type":"uint256","internalType":"uint256"}],"internalType":"struct UserPosition"}],"stateMutability":"view"},{"name":"weth","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWETH9"}],"stateMutability":"view"},{"name":"withdraw","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"to","type":"address","internalType":"address"},{"name":"amount0Min","type":"uint128","internalType":"uint128"},{"name":"amount1Min","type":"uint128","internalType":"uint128"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"}],"metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IPoolManager","name":"poolManager_","type":"address"},{"internalType":"address","name":"authority_","type":"address"},{"internalType":"uint24","name":"absoluteMaxFee_","type":"uint24"},{"internalType":"contract IWETH9","name":"weth_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"authority","type":"address"}],"name":"AccessManagedInvalidAuthority","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint32","name":"delay","type":"uint32"}],"name":"AccessManagedRequiredDelay","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"AccessManagedUnauthorized","type":"error"},{"inputs":[],"name":"BallotGateUnset","type":"error"},{"inputs":[],"name":"ClaimFeeAboveMax","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"DeskRetired","type":"error"},{"inputs":[],"name":"DistributorNotFFAware","type":"error"},{"inputs":[],"name":"DistributorNotFFAware","type":"error"},{"inputs":[],"name":"FeeAboveCap","type":"error"},{"inputs":[],"name":"FeeBelowFloor","type":"error"},{"inputs":[],"name":"InsufficientUnstakedShares","type":"error"},{"inputs":[],"name":"InvalidBallotGate","type":"error"},{"inputs":[],"name":"InvalidClaimFee","type":"error"},{"inputs":[],"name":"InvalidClaimFee","type":"error"},{"inputs":[],"name":"InvalidConfig","type":"error"},{"inputs":[],"name":"InvalidMaxFee","type":"error"},{"inputs":[],"name":"InvalidMsgValue","type":"error"},{"inputs":[],"name":"InvalidSink","type":"error"},{"inputs":[],"name":"InvalidSink","type":"error"},{"inputs":[],"name":"InvalidTtl","type":"error"},{"inputs":[],"name":"LedgerPaused","type":"error"},{"inputs":[],"name":"NativeNotSupported","type":"error"},{"inputs":[],"name":"NotAVoterOfThisPool","type":"error"},{"inputs":[],"name":"NotDynamicFeePool","type":"error"},{"inputs":[],"name":"NotPoolManager","type":"error"},{"inputs":[],"name":"NothingToClaim","type":"error"},{"inputs":[],"name":"PauseTooLong","type":"error"},{"inputs":[],"name":"PoolNotConfigured","type":"error"},{"inputs":[{"internalType":"uint256","name":"paid","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"PrincipalAboveMax","type":"error"},{"inputs":[{"internalType":"uint256","name":"received","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"PrincipalBelowMin","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RefundFailed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnauthorizedETHSender","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroLiquidity","type":"error"},{"inputs":[],"name":"ZeroShares","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"authority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gate","type":"address"}],"name":"BallotGateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"bps","type":"uint16"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ClaimFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"Currency","name":"currency","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimFeeSwept","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"distributor","type":"address"}],"name":"DistributorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"Currency","name":"currency","type":"address"},{"indexed":true,"internalType":"address","name":"distributor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributorSwept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sink","type":"address"}],"name":"FFFeeSinkSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint24","name":"fee","type":"uint24"},{"indexed":false,"internalType":"uint40","name":"expiry","type":"uint40"}],"name":"FeePoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"FeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedCut0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedCut1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accStaked0X128","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accStaked1X128","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeGrowthInside0X128","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeGrowthInside1X128","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"totalShares","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"totalStaked","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"collectionSeq","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"resetSeq","type":"uint64"}],"name":"FeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"FeesForgone","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"distributor","type":"address"},{"indexed":true,"internalType":"address","name":"weth","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeRevenueWrappedToWeth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"OperatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pausedUntil","type":"uint256"}],"name":"PausedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"PokeCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"PoolId","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint24","name":"floorPips","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"flatPips","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"maxFee","type":"uint24"}],"name":"PoolConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"shares","type":"uint128"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"shares","type":"uint128"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"rangeId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"ABSOLUTE_MAX_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CLAIM_FEE_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CLAIM_FEE_WALK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PAUSE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POKE_DISCOUNT_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POKE_TTL","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_POOL_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ballotGate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"uint160","name":"","type":"uint160"}],"name":"beforeInitialize","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"components":[{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct IPoolManager.SwapParams","name":"params","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeSwap","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BeforeSwapDelta","name":"","type":"int256"},{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFeeAllTimeMin","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"claimFeeChangeAt","outputs":[{"components":[{"internalType":"uint64","name":"fromTs","type":"uint64"},{"internalType":"uint16","name":"bps","type":"uint16"}],"internalType":"struct ClaimFeeChange","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sinceIndex","type":"uint64"}],"name":"claimFeeFor","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFeeHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Currency","name":"currency","type":"address"}],"name":"claimFeeOwed","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rangeId","type":"uint256"}],"name":"claimFeeSyncIndex","outputs":[{"internalType":"uint64","name":"index","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"maxFeeBps","type":"uint16"}],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"clearPoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"bool","name":"zeroForOne","type":"bool"}],"name":"currentFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint128","name":"amount0Max","type":"uint128"},{"internalType":"uint128","name":"amount1Max","type":"uint128"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorFF","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Currency","name":"currency","type":"address"}],"name":"distributorOwed","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"effectiveClaimFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ffFeeSink","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"flatFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isConsumingScheduledOp","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSettling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"maxFee","outputs":[{"internalType":"uint24","name":"cap","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint40","name":"ttl","type":"uint40"}],"name":"pokeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"pokeFloor","outputs":[{"internalType":"uint24","name":"floor","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"pokeOf","outputs":[{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint40","name":"expiry","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"contract IPoolManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"rangeGrowth","outputs":[{"internalType":"uint256","name":"growth0","type":"uint256"},{"internalType":"uint256","name":"growth1","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"name":"rangeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"rangeKey","outputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"bool","name":"set","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"rangeState","outputs":[{"components":[{"internalType":"uint128","name":"totalShares","type":"uint128"},{"internalType":"uint128","name":"totalStaked","type":"uint128"},{"internalType":"uint256","name":"accFee0X128","type":"uint256"},{"internalType":"uint256","name":"accFee1X128","type":"uint256"},{"internalType":"uint256","name":"accStaked0X128","type":"uint256"},{"internalType":"uint256","name":"accStaked1X128","type":"uint256"},{"internalType":"uint128","name":"stakedResidual0","type":"uint128"},{"internalType":"uint128","name":"stakedResidual1","type":"uint128"},{"internalType":"uint64","name":"collectionSeq","type":"uint64"},{"internalType":"uint64","name":"resetSeq","type":"uint64"}],"internalType":"struct RangeState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gate","type":"address"}],"name":"setBallotGate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"Currency[]","name":"settleFirst","type":"address[]"},{"internalType":"uint16","name":"bps","type":"uint16"},{"internalType":"address","name":"recipient","type":"address"}],"name":"setClaimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"Currency[]","name":"settleFirst","type":"address[]"},{"internalType":"address","name":"distributor_","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"Currency[]","name":"settleFirst","type":"address[]"},{"internalType":"address","name":"sink","type":"address"}],"name":"setFFFeeSink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"uint24","name":"floorPips","type":"uint24"},{"internalType":"uint24","name":"flatPips","type":"uint24"},{"internalType":"uint24","name":"cap","type":"uint24"}],"name":"setPoolConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"shares","type":"uint128"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Currency","name":"currency","type":"address"}],"name":"sweepClaimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"Currency","name":"currency","type":"address"}],"name":"sweepDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"syncRanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"rawData","type":"bytes"}],"name":"unlockCallback","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"shares","type":"uint128"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"userPosition","outputs":[{"components":[{"internalType":"uint128","name":"staked","type":"uint128"},{"internalType":"uint128","name":"owed0","type":"uint128"},{"internalType":"uint128","name":"owed1","type":"uint128"},{"internalType":"uint256","name":"checkpoint0X128","type":"uint256"},{"internalType":"uint256","name":"checkpoint1X128","type":"uint256"},{"internalType":"uint256","name":"stakedCheckpoint0X128","type":"uint256"},{"internalType":"uint256","name":"stakedCheckpoint1X128","type":"uint256"},{"internalType":"uint256","name":"forgone0","type":"uint256"},{"internalType":"uint256","name":"forgone1","type":"uint256"}],"internalType":"struct UserPosition","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH9","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"Currency","name":"currency0","type":"address"},{"internalType":"Currency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"contract IHooks","name":"hooks","type":"address"}],"internalType":"struct PoolKey","name":"key","type":"tuple"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint128","name":"amount0Min","type":"uint128"},{"internalType":"uint128","name":"amount1Min","type":"uint128"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"devdoc":{"details":"WHAT NATIVE ACTUALLY TOUCHES. Uniswap v4 already moves native ETH itself on every payout      (`take` pays LPs' withdrawals and claims directly), and swappers settle with the      PoolManager, never with the hook. Exactly three seams remain, and they live in three      places:        1. pay-in — `LedgerLib._resolvePrincipal` settles a native deposit with           `settle{value:}` from the hook's balance, prepaid by the depositor           (`FablesLedger.deposit` is payable, requires `msg.value >= amount0Max`, and refunds           the unspent remainder in full at the end);        2. the gate — `_nativeAllowed()` is the coupled switch: overriding it to true is what           lets `beforeInitialize`/`_checkKey` admit native pools on THIS hook while every           ERC20-only hook keeps refusing them;        3. revenue — the epoch distributor speaks only ERC20, so the NATIVE currency's           staked-fee sweep wraps into WETH at this boundary (`_sweepDistributor` override) and           everything downstream (distributor, settlement indexer, merkle claims) stays           ERC20-pure. LP-facing money (withdraw, claimFees) stays native: LPs deposited ETH           and get ETH back.      WHAT THIS HOOK NEVER DOES: hold ETH between transactions. Deposits refund their whole      remaining balance in the same call; the sweep wraps and forwards within its own call. A      nonzero balance at rest is a stranger's forced transfer, and the next native deposit      returns it to circulation via the full-balance refund.      `receive()` is allowlisted to the PoolManager — the only counterparty that legitimately      pays this contract ETH (`take` during the wrap-sweep). WETH9 never sends ETH here      (`deposit` is a one-way wrap and nothing ever calls `withdraw`), and unsolicited transfers      are refused outright rather than silently absorbed.      ERC20 pools still work on this hook unchanged — `_nativeAllowed` ADDS native capability,      it does not require it. Whether to point ERC20 pools here or keep them on per-pool      `FablesRamp` instances is a deployment (blast-radius) decision, not a code one.","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"AuthorityUpdated(address)":{"details":"Authority that manages this contract was updated."},"ClaimFeeSwept(address,address,uint256)":{"details":"Mirrors `DistributorSwept` for the claim-fee sink. Its absence was a hole in the indexer's      reconstruction of the fee split, which is derived from logs alone."},"DistributorSwept(address,address,uint256)":{"details":"Emitted when accrued staked-share revenue is pushed to the distributor (or the FF sink).      File-level so `LedgerLib.sweepDistributor` emits it with the identical      signature the settlement indexer reads."},"FeesCollected(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint128,uint128,uint64,uint64)":{"details":"Emitted on every fee collection so the split between voters (staked) and holders      (unstaked) is reproducible from logs — the epoch-settlement trust model assumes exactly      that. File-level so `LedgerLib` emits it with the identical signature the      indexer reads.      Carries the per-staked-share accumulator LEVELS, which is what makes emission weight      attributable in time. `FeesForgone` fires when a holder is settled, and a settle can be      triggered by anyone (a dust transfer settles the receiver) at any block — so its timestamp      says when someone poked the position, not when the fees were earned. These levels move only      inside the collection itself, so integrating them against the Staked/Unstaked timeline      gives each holder's weight per epoch regardless of when anyone settles.      `feeGrowthInside0X128`/`1X128` are v4's own per-liquidity accumulator for the range, read at      the instant of collection: a week's forgone fees become a function of what the position      GENERATED rather than of when somebody collected it, so settlement can split a segment that      straddles a week boundary AT the boundary, identically for every holder. `totalShares`/      `totalStaked` carry the staked fraction rather than reconstructing it. `collectionSeq`      increments on EVERY emitted collection, so a DROPPED log is a visible gap and its epoch is      quarantined rather than under-paid (H6); `resetSeq` increments whenever the range's v4      position crosses zero liquidity in EITHER direction — the deterministic re-base signal that      replaced the indexer's steerable magnitude heuristic (H2)."},"FeesForgone(address,uint256,uint256,uint256)":{"details":"The emission weight, emitted per holder as it accrues. Settlement buckets these by      epoch to split a pool's vote-won emissions among the LPs who actually earned them.      File-level so `LedgerLib` emits it with the identical signature the      settlement indexer already reads."},"NativeRevenueWrappedToWeth(address,address,uint256)":{"details":"Pairs with the `DistributorSwept(address(0), distributor, amount)` that fires alongside      it. The two describe one event from two sides, and BOTH are load-bearing for the      off-chain settlement indexer: the `DistributorSwept` clears the ledger's NATIVE      `distributorOwed` accrual (which is denominated in address(0), matching the      `FeesCollected` events that fed it), while THIS event states the delivered token —      the distributor speaks only ERC20 and receives `amount` of `weth`, never native ETH.      An indexer reconciling the distributor's on-chain token balances MUST credit WETH from      this event, not native ETH from the `DistributorSwept`, or native staked-fee revenue is      mis-attributed in the merkle. Making the conversion an explicit on-chain fact removes      the alternative — an undocumented `address(0) -> weth` convention the indexer had to      just know."}},"kind":"dev","methods":{"approve(address,uint256,uint256)":{"params":{"amount":"The amount of the token.","id":"The id of the token.","spender":"The address of the spender."},"returns":{"_0":"bool True, always"}},"authority()":{"details":"Returns the current authority."},"claimFeeFor(uint64)":{"details":"The minimum, and not a time-weighted average, because a time-weighted average is not      computable here and pretending otherwise would be a guess dressed as arithmetic. v4      hands over one lump for the whole window and says nothing about WHEN inside it the      fees were earned — a week's backlog might all have accrued in one busy hour. Any      apportionment would be invented.      Given that, the minimum is the only defensible answer, for two reasons that matter      more than the revenue:        - It can never charge an LP a rate the protocol was not actually advertising while          their fees were accruing. Every other rule can.        - It bounds the timing game, though it does not remove it. Anyone can force a range          to realize its fees (`deposit` of one unit does it), so a third party picks the          moment a backlog is priced. Waiting can only ever LOWER the rate — so there is          nothing to gain by delaying. But a scheduled cut is public before it lands, and          collecting just BEFORE it closes the window at the old rate. An earlier version          of this comment claimed there was nothing to front-run; that is false, and the          exposure is bounded only by `MAX_CLAIM_FEE_BPS` and by the rate shipping at zero.      The cost is that ops must treat a dip as retroactive. Lowering the rate for an hour      applies that hour's rate to every backlog spanning it, however long. That is a real      constraint on the lever, and the right way round: it makes a cut generous rather than      a raise reaching backwards."},"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)":{"params":{"to":"Recipient of the fees; lets a holder route around a token that blocks their        own address without stranding the other currency."}},"currentFee(bytes32,bool)":{"details":"Uses a zero-amount probe, so size-dependent components read as zero here."},"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)":{"details":"The bounds are NOT optional ceremony. `liquidity` says nothing about what it costs: the      token amounts fall out of the pool's live price inside `modifyLiquidity`, and whatever v4      asks for is pulled from the caller. Without a ceiling, the only limit was the caller's own      ERC-20 allowance, so a price move between signing and execution bought the whole position      one-sided at a price nobody agreed to. See `LedgerLib._checkBound`.Payable for the native-capable variant only. On an ERC20 pool any attached value      reverts — accepting it would strand ETH on a contract with no path back out. On a      native pool the caller must attach AT LEAST `amount0Max`: the actual amount owed is      only learned inside the unlock callback, `_checkBound` caps it at `amount0Max`, so      prepaying the ceiling guarantees settlement can never under-fund — and the unspent      remainder is refunded in full at the end (see `_refundNative`).","params":{"amount0Max":"The most currency0 the caller will pay for this liquidity.","amount1Max":"The most currency1 the caller will pay for this liquidity.","deadline":"Latest block timestamp at which this deposit may execute."}},"isConsumingScheduledOp()":{"details":"Returns true only in the context of a delayed restricted call, at the moment that the scheduled operation is being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs attacker controlled calls."},"pause(uint256)":{"details":"A separate selector from `setPaused` so the fast key really is one-way. Binding the      combined `setPaused` to a zero-delay role looked like an emergency stop but handed      that same key the UNPAUSE — `setPaused(0)` clears the freeze — so a compromised      guardian could lift the multisig's freeze every block. This entry point can only      ever move `pausedUntil` forward, which is what makes it safe to run at zero delay,      and `setPaused` stays on the delayed ADMIN_ROLE for lifting it."},"pokeFee(bytes32,uint24,uint40)":{"details":"Bounded on BOTH sides. The ceiling is the pool cap; the floor is the cheapest fee      the pool is configured to charge autonomously, so ops can still correct a fee that      is wrongly high (a mis-classified market day, say) but cannot go anywhere the pool      would not have gone by itself. This role is the one hot key in the system, granted      with no execution delay because reacting fast is its whole purpose — which makes it      the likeliest to be compromised. Without a floor, whoever held it could set every      pool to zero for 72 hours and renew for the price of gas, so LPs earn nothing while      arbitrageurs take the pool apart for free. A ceiling alone bounds the wrong end."},"rangeGrowth(uint256)":{"details":"The read the boundary snapshotter is built on. Settlement attributes forgone fees to      the week they were GENERATED, so an interval of collection that straddles a week      boundary has to be split AT the boundary — and nothing happens on chain at a boundary      unless somebody syncs, so that one value cannot come from the log stream. It comes      from calling this at the boundary block instead.      A view rather than a stored snapshot, deliberately: reading it at a historical block      is exact, whereas a stored snapshot would be exact only if someone remembered to      write it in time — the punctuality dependency this whole change exists to remove.      IT IS NOT MONOTONIC ACROSS A LIQUIDITY RESET. An earlier version of this comment      claimed the accumulator \"moves only when a swap crosses the range\". It also moves      when a tick is initialised or cleared: v4 deletes `feeGrowthOutside` once the last      liquidity at a tick is removed and re-bases it against the current global on the next      deposit, so a range that empties and refills reads a fresh, unrelated baseline. Two      readings either side of that are not comparable, and settlement must treat a backwards      step as a reset rather than as a delta — which it does, loudly."},"rangeKey(uint256)":{"details":"`rangeId` is a one-way hash, and the `Deposited`/`Staked`/`FeesCollected` events carry      only the id — so an off-chain settlement run seeing a `rangeId` cannot otherwise attribute      that range's fees to a pool/gauge without decoding deposit calldata. This exposes the      stored preimage so the mapping is available from the public ABI, first deposit onward."},"setAuthority(address)":{"details":"Transfers control to a new authority. The caller must be the current authority."},"setBallotGate(address)":{"details":"Probed, not merely stored. `setDistributor` spends a `try/catch` on its counterpart      for exactly this reason and this setter did not, so an EOA or a wrong-ABI contract      made `syncRanges` revert on `abi.decode` for every staked range — permanently      unusable, with no on-chain signal. `address(0)` stays explicitly allowed: a closed      door is the safe default for one that decides who may reach into someone else's      position, and `syncRanges` refuses outright while the gate is unset."},"setOperator(address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator."},"returns":{"_0":"bool True, always"}},"syncRanges(uint256,uint256[])":{"details":"Settlement needs this. v4 pays nothing until a position is touched, and a `rangeId`      is `(pool, tickLower, tickUpper)`, so an LP on bespoke bounds is the ONLY party who      can touch their range. Staked shares give their fees up to voters, which left      voters' revenue hostage to whether the LP who forgoes it ever felt like syncing —      and left each epoch's emission split guessing at fees that had not been booked yet.      Ops calls this over the staked ranges at each epoch boundary, which is also what      makes the `FeesCollected` accumulator levels line up with epoch boundaries so the      week's forgone fees are attributable exactly.It takes the claim fee like every other door, and it must. An earlier version skipped      the skim here on the grounds that \"the protocol forgoes its claim fee on syncs it did      not initiate — it still collects on every owner-driven path\". The second clause was      false. v4 pays nothing until a position is touched, so an owner-driven sync can only      ever skim fees accrued SINCE THE LAST TOUCH — and a free door that collects the whole      backlog sets that to nothing. Whoever touches a range last wins, so any voter of the      pool could hold the protocol's revenue on every staked range in it at zero forever,      for gas, by sweeping just before each owner claim. Charging uniformly is the only      shape with no door to arbitrage between.      It costs the caller nothing they are owed: the skim is taken from the UNSTAKED      residue, after `stakedCut` has already been set aside for the voters' pot. A voter      syncing to fund their own claim is not paying for the privilege.      The rate is still `min(live, snapshot)`, so a raise can never reach back over a      backlog earned under the old rate — which was the other thing the exemption was      protecting, and is protected here by `_effectiveClaimFee` instead of by a hole."},"transfer(address,uint256,uint256)":{"details":"Staked shares are locked: only the unstaked balance is transferable."},"transferFrom(address,address,uint256,uint256)":{"params":{"amount":"The amount of the token.","id":"The id of the token.","receiver":"The address of the receiver.","sender":"The address of the sender."},"returns":{"_0":"bool True, always, unless the function reverts"}},"unlockCallback(bytes)":{"details":"A thin shell: it checks the caller and hands the whole callback body to      `LedgerLib.onUnlock` (inlined), which decodes the action, applies a liquidity      modify or a payout, and settles fees and principal.","params":{"data":"The data that was passed to the call to unlock"},"returns":{"_0":"Any data that you want to be returned from the unlock call"}},"unstake((address,address,uint24,int24,address),int24,int24,uint128)":{"details":"Deliberately NOT pausable, unlike `stake`. Unstaking only ever SHRINKS what the      distributor is owed and makes no external call, so it cannot be an exploit vector —      while pausing it would mean an LP cannot stop routing their fees to a distributor      the admin also chooses. Freezing the exit from a revenue assignment is not an      exploit response, it is the exploit."},"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)":{"details":"Fees are collected first via `_syncRange` — a claims-only touch that makes no      token call — so the withdrawer still receives their cut at pre-burn totals. Shares      are burned before the pool touch that pays principal, so the only step that can      hand control to a token sees `totalShares` and position liquidity already in      agreement. Over-withdrawing still reverts, now at `_burn`, before anything moves.The mirror of `deposit`'s ceiling. A liquidity figure does not say what mix it returns —      the price decides — so an exit during a moved market handed back a lopsided pair the LP      never consented to. Deliberately still NOT pausable: a bound the caller chose is not a      reason to trap them, and passing zeroes remains a valid \"any mix will do\".","params":{"amount0Min":"The least currency0 the caller will accept back for this liquidity.","amount1Min":"The least currency1 the caller will accept back for this liquidity.","deadline":"Latest block timestamp at which this withdrawal may execute.","to":"Where the principal lands. `claimFees` already takes one so a holder can route        around a token that blocks their own address; `withdraw` hardcoded `msg.sender`,        which meant a blocklist on the LP froze their principal in BOTH currencies — and        the documented escape (transfer the receipt to a clean address) is pausable, so a        pause concurrent with a blocklist closed every exit. That contradicted this        contract's headline guarantee that withdrawals are unconditional."}}},"title":"FablesRampETH","version":1},"userdoc":{"errors":{"DeadlineExpired()":[{"notice":"The transaction was mined after the caller's stated deadline."}],"PrincipalAboveMax(uint256,uint256)":[{"notice":"A deposit's settled principal exceeded the caller's stated ceiling for that currency."}],"PrincipalBelowMin(uint256,uint256)":[{"notice":"A withdrawal's settled principal fell short of the caller's stated floor."}]},"events":{"NativeRevenueWrappedToWeth(address,address,uint256)":{"notice":"Emitted when a NATIVE staked-fee sweep is delivered to the distributor as WETH."}},"kind":"user","methods":{"ABSOLUTE_MAX_FEE()":{"notice":"Hard ceiling on any pool's fee cap, fixed at deployment. No role can configure         or poke a fee above it; changing it means deploying a new singleton."},"MAX_PAUSE()":{"notice":"Longest a single pause can last before it must be renewed on purpose."},"MAX_POKE_DISCOUNT_BPS()":{"notice":"Most of the live autonomous fee a poke may cut away. A poke is for reacting         fast, not for switching the curve off; a mis-classified market day is corrected         through the calendar overlay, which is what that overlay exists for."},"MAX_POKE_TTL()":{"notice":"Longest a poked fee can outlive its transaction."},"MIN_POOL_FEE()":{"notice":"Cheapest fee any pool may be configured to charge, fixed in bytecode."},"allowance(address,address,uint256)":{"notice":"Spender allowance of an id."},"approve(address,uint256,uint256)":{"notice":"Approves an amount of an id to a spender."},"balanceOf(address,uint256)":{"notice":"Owner balance of an id."},"ballotGate()":{"notice":"The Voter, consulted to decide who may collect a staked range's fees."},"beforeInitialize(address,(address,address,uint24,int24,address),uint160)":{"notice":"Pools must use the dynamic-fee flag and be configured before initialization."},"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)":{"notice":"Returns the per-swap fee override; never touches swap deltas."},"claimFeeAllTimeMin()":{"notice":"The lowest rate this ledger has ever stood at. The fallback for a backlog older         than the bounded walk can reach."},"claimFeeBps()":{"notice":"Admin levers. None of them is readable from the withdraw path."},"claimFeeChangeAt(uint256)":{"notice":"One recorded claim-fee change."},"claimFeeFor(uint64)":{"notice":"The rate a backlog that opened at history index `sinceIndex` will actually be         charged: the LOWEST rate that stood at any point from then until now."},"claimFeeHistoryLength()":{"notice":"Number of recorded claim-fee changes."},"claimFeeOwed(address)":{"notice":"Claim-fee cut accrued for the recipient. Pull, never push: a blocked or         paused recipient must not be able to block anyone else's claim."},"claimFeeSyncIndex(uint256)":{"notice":"How many rate changes had been recorded when each range last realized its fees —         i.e. where in the history its current backlog opened."},"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)":{"notice":"Syncs the range's fees from the pool and pays the caller's accrued share, minus         the claim fee (fees only — principal is never touched)."},"clearPoke(bytes32)":{"notice":"Clears an active poke, returning the pool to its autonomous fee."},"currentFee(bytes32,bool)":{"notice":"Fee the pool would charge a swap in the given direction right now, in pips."},"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)":{"notice":"Deposits `liquidity` units into the hook-owned position for the given range and         mints receipts 1:1. Caller must have approved this contract for both tokens."},"distributorFF()":{"notice":"The protocol token, cached from the distributor. Refused by `sweepDistributor`."},"effectiveClaimFee(uint256)":{"notice":"The rate a range's current backlog will be charged if it is synced now."},"ffFeeSink()":{"notice":"Destination for FF-denominated staked-fee revenue. See `sweepDistributor`."},"flatFee(bytes32)":{"notice":"The flat fee configured for a pool, in pips."},"isOperator(address,address)":{"notice":"Checks if a spender is approved by an owner as an operator"},"isSettling()":{"notice":"True while a ledger operation is mid-flight. Always false to an external         caller; only a token callback fired from inside this contract can observe it         set. Integrators pricing receipts from within such a callback should refuse."},"maxFee(bytes32)":{"notice":"Per-pool fee cap in pips; zero means the pool is not configured."},"pause(uint256)":{"notice":"Freezes the ledger. Cannot unfreeze, and cannot shorten a freeze already running."},"paused()":{"notice":"True while the ledger is paused."},"pausedUntil()":{"notice":"Exploit-response switch: freezes deposits, claims, staking, transfers and         sweeps. Principal withdrawal and unstaking are deliberately NOT pausable, ever."},"pokeFee(bytes32,uint24,uint40)":{"notice":"Temporarily replaces the autonomous fee for a pool. Expires on its own."},"pokeFloor(bytes32)":{"notice":"Cheapest fee each pool can charge autonomously — the lower bound on a poke."},"pokeOf(bytes32)":{"notice":"Active poked override per pool; ignored once expired."},"rangeGrowth(uint256)":{"notice":"v4's per-liquidity fee accumulator for a range, right now."},"rangeKey(uint256)":{"notice":"The pool key and tick range a `rangeId` was registered under. `set` is false for an         id that has never been deposited into."},"setBallotGate(address)":{"notice":"Points the sync gate at the Voter. Until it is set, nothing can be synced through         this door at all — a closed door being the safe default for one that decides who         may reach into someone else's position."},"setFFFeeSink(address[],address)":{"notice":"Where FF-denominated staked-share fee revenue is swept. Separate from         `distributor` because the epoch distributor cannot pay FF out as a fee."},"setOperator(address,bool)":{"notice":"Sets or removes an operator for the caller."},"setPaused(uint256)":{"notice":"Pauses for `duration` seconds, or lifts the pause when `duration` is zero."},"setPoolConfig((address,address,uint24,int24,address),uint24,uint24,uint24)":{"notice":"Registers or updates a pool's flat fee and its poke bounds. `floorPips` is the         cheapest a poke may reach, `flatPips` the fee charged with no live poke, `cap` the         ceiling; a poke never escapes `[floorPips, cap]` and expires back to `flatPips`."},"stake((address,address,uint24,int24,address),int24,int24,uint128)":{"notice":"Stakes receipts: their future fee accrual routes to the distributor."},"sweepClaimFee(address)":{"notice":"Pushes accrued claim-fee revenue to the recipient. Callable by anyone."},"sweepDistributor(address)":{"notice":"Pushes accumulated staked-share fees to the distributor. Callable by anyone."},"syncRanges(uint256,uint256[])":{"notice":"Realizes v4's lazily-accrued fees for a list of ranges, splitting each between         its unstaked holders and the voters' pot. Permissionless, unpausable, and it         moves no tokens out of this contract — it only turns fees the pool already holds         into balances this ledger has attributed."},"transferFrom(address,address,uint256,uint256)":{"notice":"Transfers an amount of an id from a sender to a receiver."},"unlockCallback(bytes)":{"notice":"Called by the pool manager on `msg.sender` when the manager is unlocked"},"unstake((address,address,uint24,int24,address),int24,int24,uint128)":{"notice":"Unstakes receipts; permissionless, instant, dependency-free."},"weth()":{"notice":"The canonical wrapped-ETH contract native revenue is wrapped into for the         ERC20-only distributor. Immutable: a mutable WETH would be a mutable custodian of         every future native sweep."},"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)":{"notice":"Burns receipts and removes the corresponding liquidity to the caller. Reads no         admin state; auto-unstakes if the unstaked balance is insufficient."}},"notice":"`FablesRamp` for pools whose currency0 is NATIVE ETH. Robinhood Chain's real ETH         liquidity is quoted in native ETH, not WETH — the WETH pools are dead — so an ETH desk         that wants the flow must speak native. Same flat-fee-plus-poke pricing, same ledger,         same roles; this contract adds only the machinery that native currency requires.","version":1}},"settings":{"compilationTarget":{"src/FablesRampETH.sol":"FablesRampETH"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"none"},"optimizer":{"enabled":true,"runs":200},"remappings":[":@ensdomains/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/@ensdomains/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":ds-test/=lib/v4-core/lib/solmate/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",":hardhat/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/hardhat/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":solmate/=lib/v4-core/lib/solmate/",":v4-core/=lib/v4-core/"]},"sources":{"lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol":{"keccak256":"0x9a41463f69550175831e0868e65e2701658b32f0773ad9f319dacca6d5a43739","license":"MIT","urls":["bzz-raw://054247d4c7d0c68fa77efa361c9eee5b110b49df05518f016ba68f2c496dfe74","dweb:/ipfs/QmeQQixquSPZtsHkQw7nruH7hXmLFHWfhN6AZwoLFMp5KS"]},"lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol":{"keccak256":"0x05fd06ae5bca9dc7470fb2dfae764315c81a84f591e86be6fec0c115474edc6c","license":"MIT","urls":["bzz-raw://998ffed150fad3264d73c847f2ca35ee750d747ece382bb48885e8c8dce62941","dweb:/ipfs/QmSjacwVExF2T9ZFysQQ3vVLJbDQ16G7zd81SDxPCfNFxe"]},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol":{"keccak256":"0x1121e070554cffc6d536f658332a1a3d65fb2ea5573cd774f4ecbd02a2fcf4b7","license":"MIT","urls":["bzz-raw://6913b339d10018d60322c56faa6d6455e707b3c46a15261b639389a710a42ff3","dweb:/ipfs/QmXrKvfnS5hnXACEzu1Kd4DBBW2gJm2Tg2tFpLynhvuTUM"]},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol":{"keccak256":"0x18d11c7284c6ff8c378db95771175322b8bf360d1ed8d147838784f1fa042daa","license":"MIT","urls":["bzz-raw://ccb94094fd000bc31d4b6982008d9d6cb683027342f6153a5d62a27cd1b7ba1b","dweb:/ipfs/QmdU5fQGidjCeixpgELbVnygAyD8pQz2UKSfbzMmq3dE5g"]},"lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol":{"keccak256":"0x9c9a58dd831b9bb4a0ea47d96b53c13ab9a6e4270a518ea395b1424092fd74dc","license":"MIT","urls":["bzz-raw://d806b0c87fbcaf0cb827b51203b27f8289b13743aeadb5867fbbe041fcf87a92","dweb:/ipfs/QmfTEGiDGxKDaqBuBJ5wWJockGDrsEBZnW5S7UWrKhAxGc"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","license":"MIT","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","license":"MIT","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","license":"MIT","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol":{"keccak256":"0xd735962e3d6660884153ba8a972b5f100dde4c482f2ff1c525ba7fdefb154cbd","license":"MIT","urls":["bzz-raw://5a264d17b093f585844b0d977e9f60555b8c8d6513b304fde863cdf652a0d336","dweb:/ipfs/QmWXfaJisjVnrjTUjZGryZpMob9wKivvtbodLS3PTc1ttq"]},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f","license":"MIT","urls":["bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e","dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR"]},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x318ea37780610ca7808852275651885d428669402b81488cb7434fde361e9704","license":"MIT","urls":["bzz-raw://4aad80ad93cedad85619900fd7c2084c4d2f4b28f1dbda27e491c5f4fd31025d","dweb:/ipfs/QmUyXtX7FUi2u1W5fs7ufka9XkRVb5ss2menQHTsrsSmqZ"]},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol":{"keccak256":"0x8b95459390767d84c984d18faee298ce913e69cf0be8d2fe7785e2ad487ffed8","license":"MIT","urls":["bzz-raw://b5949065ea24feded902e4b0586f547ae6360b4eda7572419d72fe9d5714d1b9","dweb:/ipfs/Qme52ocDwVG8nt9Xvf3j4h9SU1WWk2PHSEk97nRD4sNvY4"]},"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","license":"MIT","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"]},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"lib/v4-core/src/ERC6909.sol":{"keccak256":"0x22476a1c183be1b547a509b3e6906abaccb6408375f798fce805ff7877aca09f","license":"MIT","urls":["bzz-raw://e85580e1563ea0556705132fb6bd038ca4aa355749039923853ebcb76b7c84e6","dweb:/ipfs/QmVoxPrbagRKpFdRWoaCSKmStYLZrhNFuedcuyGycSGR7q"]},"lib/v4-core/src/interfaces/IExtsload.sol":{"keccak256":"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43","license":"MIT","urls":["bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1","dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN"]},"lib/v4-core/src/interfaces/IExttload.sol":{"keccak256":"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937","license":"MIT","urls":["bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8","dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY"]},"lib/v4-core/src/interfaces/IHooks.sol":{"keccak256":"0x4c9571aed0c2b6ef11832545554fc11ffdb03746daaf5c73683c00600bfc7ec0","license":"MIT","urls":["bzz-raw://e78b34b58ce9de91b91943b4f3cc3ce121d0b151e123e8a600ac5ef64d91db6c","dweb:/ipfs/QmRkaQnPCYwLrXgbpGujJTx32PaZK63KSPJJV1XmnQuCMb"]},"lib/v4-core/src/interfaces/IPoolManager.sol":{"keccak256":"0x3534f00531038e77ab8a7fc4d0a6e0993ee53fb7a396b1324ad917318ea46cea","license":"MIT","urls":["bzz-raw://0a4a7e771828dc40848485b568a1cf514f553ace6653f4f4d1ad3f3e9cdb6c27","dweb:/ipfs/QmTjzQ7KVYnrEWtxPER2E4MXzycgcznfzSDsZtd5turk5V"]},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"keccak256":"0x32a666e588a2f66334430357bb1e2424fe7eebeb98a3364b1dd16eb6ccca9848","license":"MIT","urls":["bzz-raw://85751d302125881f72e5f8af051c2d5d9b1f606ebaea8ca7d04fccdd27cc252d","dweb:/ipfs/QmeRwomeh9NWm6A6fgNA4KZPQZHPpdKsPQyYsHSFmvud7J"]},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"keccak256":"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719","license":"MIT","urls":["bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b","dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK"]},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"keccak256":"0xeccadf1bf69ba2eb51f2fe4fa511bc7bb05bbd6b9f9a3cb8e5d83d9582613e0f","license":"MIT","urls":["bzz-raw://118757369892687b99ef46ce28d6861f62c098285bd7687a4f17f7e44e5f81de","dweb:/ipfs/QmUxqbYqQtcEwwFbb9e6BBMePEaSgN8C45v6RKubD4ib8d"]},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"keccak256":"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48","license":"MIT","urls":["bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f","dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK"]},"lib/v4-core/src/libraries/CustomRevert.sol":{"keccak256":"0x111ed3031b6990c80a93ae35dde6b6ac0b7e6af471388fdd7461e91edda9b7de","license":"MIT","urls":["bzz-raw://c9ea883c98d6ae1829160d0977bb5195761cfd5bc81692d0a941f45717f594cd","dweb:/ipfs/QmZPwxzaeMNv536wzrAMrMswu7vMHuqPVpjcqL3YvCMoxt"]},"lib/v4-core/src/libraries/FixedPoint128.sol":{"keccak256":"0xad236e10853f4b4b20a35a9bb52b857c4fc79874846b7e444e06ead7f2630542","license":"MIT","urls":["bzz-raw://0de1f9a06520b1a689660943faa14fc0b8344ab41fab9e6012ea34bff4b9b3eb","dweb:/ipfs/QmRNMPTyko7W6d6KxuTsnDBa9oZgDK4xiwRRq3H9ASTbwy"]},"lib/v4-core/src/libraries/FullMath.sol":{"keccak256":"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2","license":"MIT","urls":["bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52","dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC"]},"lib/v4-core/src/libraries/Hooks.sol":{"keccak256":"0x27b1c3b8aa3d07d8e3123970695745929315685a5ffaa7342c3ba3582f37fecb","license":"MIT","urls":["bzz-raw://fa3bb092dc205eaa1b9defc93e9bbad5f4c5c44e1c4aa531dfca2574c2aba9ba","dweb:/ipfs/QmR1soxkepHNkbGxAMaK4XqhQ4VxWn69dewzGkQJNx5byM"]},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"keccak256":"0xbf6914e01014e7c1044111feb7df7a3d96bb503b3da827ad8464b1955580d13b","license":"MIT","urls":["bzz-raw://33823c20a91882c9aacdcbb02f0558c05209f4d5954aa6dd4fa17c95664db475","dweb:/ipfs/QmR7owkFgpfztpp1QUg3ut3nw9iPVQqLGP4hzgmZtRUQ2J"]},"lib/v4-core/src/libraries/LiquidityMath.sol":{"keccak256":"0x000ef2eadcc1eb7b2c18a77655f94e76e0e860f605783484657ef65fd6eda353","license":"MIT","urls":["bzz-raw://a766b620a7a22798b43c6c1f23b5c6cff0ebf588deb89842bad05208d448cd99","dweb:/ipfs/QmVKjaFJdzkqA3ey2Byum8iTCMssWVD8MmVC8rw62Tj5WD"]},"lib/v4-core/src/libraries/ParseBytes.sol":{"keccak256":"0x7533b13f53ee2c2c55500100b22ffd6e37e7523c27874edc98663d53a8672b15","license":"MIT","urls":["bzz-raw://82449058634fde28a085f3c59a6a5f412550c02181590593fd84c3e8b329aa17","dweb:/ipfs/Qmev4E9Au6SsE4wsArChCwfg94KhHc5gYsEsZUnjF5sRLa"]},"lib/v4-core/src/libraries/Position.sol":{"keccak256":"0xddab2a831f1befb6abf5567e77c4582169ca8156cf69eb4f22d8e87f7226a3f9","license":"BUSL-1.1","urls":["bzz-raw://c79fe61b50f3b70cff503abfa6f5643fcbefb9b794855bee1019b1e6d9c083b2","dweb:/ipfs/QmbKmYNQesaMz8bo1b7TMHQcAwaDd3eDPrE5pAdPPZTtk5"]},"lib/v4-core/src/libraries/SafeCast.sol":{"keccak256":"0x42c4a24f996a14d358be397b71f7ec9d7daf666aaec78002c63315a6ee67aa86","license":"MIT","urls":["bzz-raw://c3db86e2ba3679105fc32edec656c70282e1fede6cab11217702443f6c26fa59","dweb:/ipfs/QmX4yaaSPdKQzYNRsezjTvZKsubzS8JRTEGFD3fPpTTCcj"]},"lib/v4-core/src/libraries/StateLibrary.sol":{"keccak256":"0x96db333ee126a841dd959e38e452cc59d73583cb0437a1d48b2052e33a74f952","license":"MIT","urls":["bzz-raw://8672bba1eb69608299b0904f4ff305238eb18479d371c26518f278c9ee184cd0","dweb:/ipfs/QmTLu3s6ECvsEDHStQv8HTVHYtvkviBbdjPrFJd4SpVRFY"]},"lib/v4-core/src/types/BalanceDelta.sol":{"keccak256":"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f","license":"MIT","urls":["bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9","dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H"]},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"keccak256":"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78","license":"MIT","urls":["bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782","dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K"]},"lib/v4-core/src/types/Currency.sol":{"keccak256":"0x4a0b84b282577ff6f8acf13ec9f4d32dbb9348748b49611d00e68bee96609c93","license":"MIT","urls":["bzz-raw://45f9d62ab3d51b52957279e353853ba1547c3182c9a1e3d1846ada4a90263b01","dweb:/ipfs/QmS8NG84ccQS1yXVD8cv3eKX7J1UKxuJhbUfHTQR2opKF5"]},"lib/v4-core/src/types/PoolId.sol":{"keccak256":"0x308311916ea0f5c2fd878b6a2751eb223d170a69e33f601fae56dfe3c5d392af","license":"MIT","urls":["bzz-raw://669c2cd7ac17690b5d8831e0bda72822376c3a04b36afed6d31df4d75fe60918","dweb:/ipfs/QmT6EpkxqU8VF3WsgrZ66F3s1cCQRffR95z1HDYZz7ph6y"]},"lib/v4-core/src/types/PoolKey.sol":{"keccak256":"0xf89856e0580d7a4856d3187a76858377ccee9d59702d230c338d84388221b786","license":"MIT","urls":["bzz-raw://6f3118fa189025695c37fdf0bdd1190f085ad097484d3c88cf4c56d1db65f639","dweb:/ipfs/QmamXpgtB8GV1CaFLvqefPWSoikLDhMk1yU4heBnVzU8gi"]},"src/FablesRamp.sol":{"keccak256":"0x702f66da05bed6bd4f44154a405e4a68cfa80b32155d6734ae17ebe06fd03819","license":"UNLICENSED","urls":["bzz-raw://0883350c59c5b9c8ea4928ce6cef60ca7feb9b4473ddbf2d5d8ebcf8dc611cf7","dweb:/ipfs/QmTwMgLBaegfUKypMtB2wnVSZVUWiUW1CtkAVwHi4bXbNQ"]},"src/FablesRampETH.sol":{"keccak256":"0xe46b0cf72af83625f79ded2650ed878b3ff6dd8b97bf3b8535116246fba8c251","license":"UNLICENSED","urls":["bzz-raw://dd553ea617bb3f12db000b67ec1f4c2dc5496a10670121cb17cd9284e4fb60f8","dweb:/ipfs/QmRhoHPWvskbf4Xrj9LDncvHTjR5CyHTAqBYe7oi1nmmaZ"]},"src/base/FablesBaseHook.sol":{"keccak256":"0x90d06d26d291ec26e1c958c0b36bdcb13728402e966f4c6040b2e6d7d3deb865","license":"UNLICENSED","urls":["bzz-raw://d6547b0a0d3ccc6184ccd58f6da49982d4a4f90a2d022dc46554d0213b3c5496","dweb:/ipfs/QmdSq6RDVdUU4nLjKA1UQ8ThhZpatehRctnaNDrmBzNntc"]},"src/base/FablesLedger.sol":{"keccak256":"0xa87b312bef0ca67c6b0b36251438ea23c3dedf60e6fb657bd0a53937e88cb859","license":"UNLICENSED","urls":["bzz-raw://143a013b33d6c1e3b9dc62c1d04562780656ee7d7df5125b4de996814f6ea6e6","dweb:/ipfs/QmdCW6fKPoRYiMDk1xcbPq4UTX5B2FDp4rs8x6mj4j47Lc"]},"src/base/LedgerTypes.sol":{"keccak256":"0x46c59557e69be54c6f621373a9b8f4fea65e08ee23a5fd2a184bf78d4c04ac86","license":"UNLICENSED","urls":["bzz-raw://cea2667ce65c396876f3dfb9d7652b9134f802907fb7485585ae35560b04beed","dweb:/ipfs/QmT8w49yjcpydED1x3dgmWGrbwDaiPMWUKpniVZB4NUyYr"]},"src/libraries/LedgerLib.sol":{"keccak256":"0x84dc36424753decff5ebac4476f8ba7029db5cc1aebc420817626469d7ffb9c6","license":"UNLICENSED","urls":["bzz-raw://66abbaf52c71a5c59999ff7ba3d0dbd210cff651a0aa1a482ea46a461d0820aa","dweb:/ipfs/QmcMJhWSxfFJXTDHhfwnkZ8UhR3SwspA9y8uVy4SarZBeC"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_int24":{"label":"int24","encoding":"inplace","numberOfBytes":"3"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_uint24":{"label":"uint24","encoding":"inplace","numberOfBytes":"3"},"t_uint40":{"label":"uint40","encoding":"inplace","numberOfBytes":"5"},"t_uint64":{"label":"uint64","encoding":"inplace","numberOfBytes":"8"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint128":{"label":"uint128","encoding":"inplace","numberOfBytes":"16"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(IHooks)2261":{"label":"contract IHooks","encoding":"inplace","numberOfBytes":"20"},"t_struct(Poke)6485_storage":{"label":"struct FablesBaseHook.Poke","members":[{"slot":"0","type":"t_uint24","astId":6482,"label":"fee","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint40","astId":6484,"label":"expiry","offset":3,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint64)":{"key":"t_uint256","label":"mapping(uint256 => uint64)","value":"t_uint64","encoding":"mapping","numberOfBytes":"32"},"t_struct(PoolKey)6046_storage":{"label":"struct PoolKey","members":[{"slot":"0","type":"t_userDefinedValueType(Currency)5700","astId":6031,"label":"currency0","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_userDefinedValueType(Currency)5700","astId":6035,"label":"currency1","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_uint24","astId":6038,"label":"fee","offset":20,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_int24","astId":6041,"label":"tickSpacing","offset":23,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_contract(IHooks)2261","astId":6045,"label":"hooks","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"96"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(RangeKey)9243_storage":{"label":"struct RangeKey","members":[{"slot":"0","type":"t_struct(PoolKey)6046_storage","astId":9236,"label":"key","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_int24","astId":9238,"label":"tickLower","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_int24","astId":9240,"label":"tickUpper","offset":3,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_bool","astId":9242,"label":"set","offset":6,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"128"},"t_struct(RangeState)9140_storage":{"label":"struct RangeState","members":[{"slot":"0","type":"t_uint128","astId":9118,"label":"totalShares","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint128","astId":9120,"label":"totalStaked","offset":16,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_uint256","astId":9122,"label":"accFee0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_uint256","astId":9124,"label":"accFee1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_uint256","astId":9127,"label":"accStaked0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"4","type":"t_uint256","astId":9129,"label":"accStaked1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_uint128","astId":9132,"label":"stakedResidual0","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_uint128","astId":9134,"label":"stakedResidual1","offset":16,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_uint64","astId":9137,"label":"collectionSeq","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_uint64","astId":9139,"label":"resetSeq","offset":8,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"224"},"t_struct(UserPosition)9221_storage":{"label":"struct UserPosition","members":[{"slot":"0","type":"t_uint128","astId":9203,"label":"staked","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint128","astId":9205,"label":"owed0","offset":16,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_uint128","astId":9207,"label":"owed1","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_uint256","astId":9209,"label":"checkpoint0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_uint256","astId":9211,"label":"checkpoint1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"4","type":"t_uint256","astId":9213,"label":"stakedCheckpoint0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_uint256","astId":9215,"label":"stakedCheckpoint1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_uint256","astId":9218,"label":"forgone0","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"7","type":"t_uint256","astId":9220,"label":"forgone1","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"256"},"t_userDefinedValueType(PoolId)6000":{"label":"PoolId","encoding":"inplace","numberOfBytes":"32"},"t_struct(ClaimFeeChange)9146_storage":{"label":"struct ClaimFeeChange","members":[{"slot":"0","type":"t_uint64","astId":9143,"label":"fromTs","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint16","astId":9145,"label":"bps","offset":8,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"32"},"t_userDefinedValueType(Currency)5700":{"label":"Currency","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_bool))":{"key":"t_address","label":"mapping(address => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_uint256,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(uint256 => uint256))","value":"t_mapping(t_uint256,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RangeKey)9243_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct RangeKey)","value":"t_struct(RangeKey)9243_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RangeState)9140_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct RangeState)","value":"t_struct(RangeState)9140_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)":{"key":"t_userDefinedValueType(PoolId)6000","label":"mapping(PoolId => uint24)","value":"t_uint24","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_struct(UserPosition)9221_storage)":{"key":"t_address","label":"mapping(address => struct UserPosition)","value":"t_struct(UserPosition)9221_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(ClaimFeeChange)9146_storage)dyn_storage":{"base":"t_struct(ClaimFeeChange)9146_storage","label":"struct ClaimFeeChange[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_userDefinedValueType(Currency)5700,t_uint256)":{"key":"t_userDefinedValueType(Currency)5700","label":"mapping(Currency => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_uint256)))":{"key":"t_address","label":"mapping(address => mapping(address => mapping(uint256 => uint256)))","value":"t_mapping(t_address,t_mapping(t_uint256,t_uint256))","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_userDefinedValueType(PoolId)6000,t_struct(Poke)6485_storage)":{"key":"t_userDefinedValueType(PoolId)6000","label":"mapping(PoolId => struct FablesBaseHook.Poke)","value":"t_struct(Poke)6485_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_struct(UserPosition)9221_storage))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => struct UserPosition))","value":"t_mapping(t_address,t_struct(UserPosition)9221_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_address","astId":16,"label":"_authority","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_bool","astId":18,"label":"_consumingSchedule","offset":20,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)","astId":6501,"label":"maxFee","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)","astId":6515,"label":"pokeFloor","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_struct(Poke)6485_storage)","astId":6522,"label":"pokeOf","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"4","type":"t_mapping(t_address,t_mapping(t_address,t_bool))","astId":1728,"label":"isOperator","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_mapping(t_address,t_mapping(t_uint256,t_uint256))","astId":1734,"label":"balanceOf","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_uint256)))","astId":1742,"label":"allowance","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"7","type":"t_uint16","astId":7184,"label":"claimFeeBps","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"7","type":"t_address","astId":7186,"label":"claimFeeRecipient","offset":2,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"8","type":"t_address","astId":7188,"label":"distributor","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"9","type":"t_address","astId":7191,"label":"distributorFF","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"10","type":"t_address","astId":7194,"label":"ffFeeSink","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"11","type":"t_array(t_struct(ClaimFeeChange)9146_storage)dyn_storage","astId":7199,"label":"_claimFeeHistory","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"12","type":"t_uint16","astId":7202,"label":"claimFeeAllTimeMin","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"13","type":"t_mapping(t_uint256,t_uint64)","astId":7207,"label":"claimFeeSyncIndex","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"14","type":"t_uint256","astId":7210,"label":"pausedUntil","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"15","type":"t_address","astId":7213,"label":"ballotGate","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"16","type":"t_mapping(t_uint256,t_struct(RangeKey)9243_storage)","astId":7244,"label":"_rangeKeys","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"17","type":"t_mapping(t_uint256,t_struct(RangeState)9140_storage)","astId":7249,"label":"_ranges","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"18","type":"t_mapping(t_uint256,t_mapping(t_address,t_struct(UserPosition)9221_storage))","astId":7256,"label":"_positions","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"19","type":"t_mapping(t_userDefinedValueType(Currency)5700,t_uint256)","astId":7261,"label":"distributorOwed","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"20","type":"t_mapping(t_userDefinedValueType(Currency)5700,t_uint256)","astId":7267,"label":"claimFeeOwed","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"21","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)","astId":6087,"label":"_flatPips","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","errors":{"DeadlineExpired()":[{"notice":"The transaction was mined after the caller's stated deadline."}],"PrincipalAboveMax(uint256,uint256)":[{"notice":"A deposit's settled principal exceeded the caller's stated ceiling for that currency."}],"PrincipalBelowMin(uint256,uint256)":[{"notice":"A withdrawal's settled principal fell short of the caller's stated floor."}]},"events":{"NativeRevenueWrappedToWeth(address,address,uint256)":{"notice":"Emitted when a NATIVE staked-fee sweep is delivered to the distributor as WETH."}},"notice":"`FablesRamp` for pools whose currency0 is NATIVE ETH. Robinhood Chain's real ETH         liquidity is quoted in native ETH, not WETH — the WETH pools are dead — so an ETH desk         that wants the flow must speak native. Same flat-fee-plus-poke pricing, same ledger,         same roles; this contract adds only the machinery that native currency requires.","methods":{"weth()":{"notice":"The canonical wrapped-ETH contract native revenue is wrapped into for the         ERC20-only distributor. Immutable: a mutable WETH would be a mutable custodian of         every future native sweep."},"paused()":{"notice":"True while the ledger is paused."},"MAX_PAUSE()":{"notice":"Longest a single pause can last before it must be renewed on purpose."},"ffFeeSink()":{"notice":"Destination for FF-denominated staked-fee revenue. See `sweepDistributor`."},"ballotGate()":{"notice":"The Voter, consulted to decide who may collect a staked range's fees."},"isSettling()":{"notice":"True while a ledger operation is mid-flight. Always false to an external         caller; only a token callback fired from inside this contract can observe it         set. Integrators pricing receipts from within such a callback should refuse."},"claimFeeBps()":{"notice":"Admin levers. None of them is readable from the withdraw path."},"pausedUntil()":{"notice":"Exploit-response switch: freezes deposits, claims, staking, transfers and         sweeps. Principal withdrawal and unstaking are deliberately NOT pausable, ever."},"MAX_POKE_TTL()":{"notice":"Longest a poked fee can outlive its transaction."},"MIN_POOL_FEE()":{"notice":"Cheapest fee any pool may be configured to charge, fixed in bytecode."},"pause(uint256)":{"notice":"Freezes the ledger. Cannot unfreeze, and cannot shorten a freeze already running."},"distributorFF()":{"notice":"The protocol token, cached from the distributor. Refused by `sweepDistributor`."},"maxFee(bytes32)":{"notice":"Per-pool fee cap in pips; zero means the pool is not configured."},"pokeOf(bytes32)":{"notice":"Active poked override per pool; ignored once expired."},"flatFee(bytes32)":{"notice":"The flat fee configured for a pool, in pips."},"rangeKey(uint256)":{"notice":"The pool key and tick range a `rangeId` was registered under. `set` is false for an         id that has never been deposited into."},"ABSOLUTE_MAX_FEE()":{"notice":"Hard ceiling on any pool's fee cap, fixed at deployment. No role can configure         or poke a fee above it; changing it means deploying a new singleton."},"clearPoke(bytes32)":{"notice":"Clears an active poke, returning the pool to its autonomous fee."},"pokeFloor(bytes32)":{"notice":"Cheapest fee each pool can charge autonomously — the lower bound on a poke."},"setPaused(uint256)":{"notice":"Pauses for `duration` seconds, or lifts the pause when `duration` is zero."},"claimFeeFor(uint64)":{"notice":"The rate a backlog that opened at history index `sinceIndex` will actually be         charged: the LOWEST rate that stood at any point from then until now."},"claimFeeAllTimeMin()":{"notice":"The lowest rate this ledger has ever stood at. The fallback for a backlog older         than the bounded walk can reach."},"rangeGrowth(uint256)":{"notice":"v4's per-liquidity fee accumulator for a range, right now."},"claimFeeOwed(address)":{"notice":"Claim-fee cut accrued for the recipient. Pull, never push: a blocked or         paused recipient must not be able to block anyone else's claim."},"unlockCallback(bytes)":{"notice":"Called by the pool manager on `msg.sender` when the manager is unlocked"},"setBallotGate(address)":{"notice":"Points the sync gate at the Voter. Until it is set, nothing can be synced through         this door at all — a closed door being the safe default for one that decides who         may reach into someone else's position."},"sweepClaimFee(address)":{"notice":"Pushes accrued claim-fee revenue to the recipient. Callable by anyone."},"MAX_POKE_DISCOUNT_BPS()":{"notice":"Most of the live autonomous fee a poke may cut away. A poke is for reacting         fast, not for switching the curve off; a mis-classified market day is corrected         through the calendar overlay, which is what that overlay exists for."},"claimFeeHistoryLength()":{"notice":"Number of recorded claim-fee changes."},"currentFee(bytes32,bool)":{"notice":"Fee the pool would charge a swap in the given direction right now, in pips."},"claimFeeChangeAt(uint256)":{"notice":"One recorded claim-fee change."},"setOperator(address,bool)":{"notice":"Sets or removes an operator for the caller."},"sweepDistributor(address)":{"notice":"Pushes accumulated staked-share fees to the distributor. Callable by anyone."},"balanceOf(address,uint256)":{"notice":"Owner balance of an id."},"claimFeeSyncIndex(uint256)":{"notice":"How many rate changes had been recorded when each range last realized its fees —         i.e. where in the history its current backlog opened."},"effectiveClaimFee(uint256)":{"notice":"The rate a range's current backlog will be charged if it is synced now."},"isOperator(address,address)":{"notice":"Checks if a spender is approved by an owner as an operator"},"syncRanges(uint256,uint256[])":{"notice":"Realizes v4's lazily-accrued fees for a list of ranges, splitting each between         its unstaked holders and the voters' pot. Permissionless, unpausable, and it         moves no tokens out of this contract — it only turns fees the pool already holds         into balances this ledger has attributed."},"pokeFee(bytes32,uint24,uint40)":{"notice":"Temporarily replaces the autonomous fee for a pool. Expires on its own."},"setFFFeeSink(address[],address)":{"notice":"Where FF-denominated staked-share fee revenue is swept. Separate from         `distributor` because the epoch distributor cannot pay FF out as a fee."},"approve(address,uint256,uint256)":{"notice":"Approves an amount of an id to a spender."},"allowance(address,address,uint256)":{"notice":"Spender allowance of an id."},"transferFrom(address,address,uint256,uint256)":{"notice":"Transfers an amount of an id from a sender to a receiver."},"stake((address,address,uint24,int24,address),int24,int24,uint128)":{"notice":"Stakes receipts: their future fee accrual routes to the distributor."},"unstake((address,address,uint24,int24,address),int24,int24,uint128)":{"notice":"Unstakes receipts; permissionless, instant, dependency-free."},"beforeInitialize(address,(address,address,uint24,int24,address),uint160)":{"notice":"Pools must use the dynamic-fee flag and be configured before initialization."},"setPoolConfig((address,address,uint24,int24,address),uint24,uint24,uint24)":{"notice":"Registers or updates a pool's flat fee and its poke bounds. `floorPips` is the         cheapest a poke may reach, `flatPips` the fee charged with no live poke, `cap` the         ceiling; a poke never escapes `[floorPips, cap]` and expires back to `flatPips`."},"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)":{"notice":"Syncs the range's fees from the pool and pays the caller's accrued share, minus         the claim fee (fees only — principal is never touched)."},"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)":{"notice":"Returns the per-swap fee override; never touches swap deltas."},"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)":{"notice":"Deposits `liquidity` units into the hook-owned position for the given range and         mints receipts 1:1. Caller must have approved this contract for both tokens."},"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)":{"notice":"Burns receipts and removes the corresponding liquidity to the caller. Reads no         admin state; auto-unstakes if the unstaked balance is insufficient."}},"version":1},"devdoc":{"kind":"dev","title":"FablesRampETH","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"AuthorityUpdated(address)":{"details":"Authority that manages this contract was updated."},"ClaimFeeSwept(address,address,uint256)":{"details":"Mirrors `DistributorSwept` for the claim-fee sink. Its absence was a hole in the indexer's      reconstruction of the fee split, which is derived from logs alone."},"DistributorSwept(address,address,uint256)":{"details":"Emitted when accrued staked-share revenue is pushed to the distributor (or the FF sink).      File-level so `LedgerLib.sweepDistributor` emits it with the identical      signature the settlement indexer reads."},"FeesForgone(address,uint256,uint256,uint256)":{"details":"The emission weight, emitted per holder as it accrues. Settlement buckets these by      epoch to split a pool's vote-won emissions among the LPs who actually earned them.      File-level so `LedgerLib` emits it with the identical signature the      settlement indexer already reads."},"NativeRevenueWrappedToWeth(address,address,uint256)":{"details":"Pairs with the `DistributorSwept(address(0), distributor, amount)` that fires alongside      it. The two describe one event from two sides, and BOTH are load-bearing for the      off-chain settlement indexer: the `DistributorSwept` clears the ledger's NATIVE      `distributorOwed` accrual (which is denominated in address(0), matching the      `FeesCollected` events that fed it), while THIS event states the delivered token —      the distributor speaks only ERC20 and receives `amount` of `weth`, never native ETH.      An indexer reconciling the distributor's on-chain token balances MUST credit WETH from      this event, not native ETH from the `DistributorSwept`, or native staked-fee revenue is      mis-attributed in the merkle. Making the conversion an explicit on-chain fact removes      the alternative — an undocumented `address(0) -> weth` convention the indexer had to      just know."},"FeesCollected(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint128,uint128,uint64,uint64)":{"details":"Emitted on every fee collection so the split between voters (staked) and holders      (unstaked) is reproducible from logs — the epoch-settlement trust model assumes exactly      that. File-level so `LedgerLib` emits it with the identical signature the      indexer reads.      Carries the per-staked-share accumulator LEVELS, which is what makes emission weight      attributable in time. `FeesForgone` fires when a holder is settled, and a settle can be      triggered by anyone (a dust transfer settles the receiver) at any block — so its timestamp      says when someone poked the position, not when the fees were earned. These levels move only      inside the collection itself, so integrating them against the Staked/Unstaked timeline      gives each holder's weight per epoch regardless of when anyone settles.      `feeGrowthInside0X128`/`1X128` are v4's own per-liquidity accumulator for the range, read at      the instant of collection: a week's forgone fees become a function of what the position      GENERATED rather than of when somebody collected it, so settlement can split a segment that      straddles a week boundary AT the boundary, identically for every holder. `totalShares`/      `totalStaked` carry the staked fraction rather than reconstructing it. `collectionSeq`      increments on EVERY emitted collection, so a DROPPED log is a visible gap and its epoch is      quarantined rather than under-paid (H6); `resetSeq` increments whenever the range's v4      position crosses zero liquidity in EITHER direction — the deterministic re-base signal that      replaced the indexer's steerable magnitude heuristic (H2)."}},"details":"WHAT NATIVE ACTUALLY TOUCHES. Uniswap v4 already moves native ETH itself on every payout      (`take` pays LPs' withdrawals and claims directly), and swappers settle with the      PoolManager, never with the hook. Exactly three seams remain, and they live in three      places:        1. pay-in — `LedgerLib._resolvePrincipal` settles a native deposit with           `settle{value:}` from the hook's balance, prepaid by the depositor           (`FablesLedger.deposit` is payable, requires `msg.value >= amount0Max`, and refunds           the unspent remainder in full at the end);        2. the gate — `_nativeAllowed()` is the coupled switch: overriding it to true is what           lets `beforeInitialize`/`_checkKey` admit native pools on THIS hook while every           ERC20-only hook keeps refusing them;        3. revenue — the epoch distributor speaks only ERC20, so the NATIVE currency's           staked-fee sweep wraps into WETH at this boundary (`_sweepDistributor` override) and           everything downstream (distributor, settlement indexer, merkle claims) stays           ERC20-pure. LP-facing money (withdraw, claimFees) stays native: LPs deposited ETH           and get ETH back.      WHAT THIS HOOK NEVER DOES: hold ETH between transactions. Deposits refund their whole      remaining balance in the same call; the sweep wraps and forwards within its own call. A      nonzero balance at rest is a stranger's forced transfer, and the next native deposit      returns it to circulation via the full-balance refund.      `receive()` is allowlisted to the PoolManager — the only counterparty that legitimately      pays this contract ETH (`take` during the wrap-sweep). WETH9 never sends ETH here      (`deposit` is a one-way wrap and nothing ever calls `withdraw`), and unsolicited transfers      are refused outright rather than silently absorbed.      ERC20 pools still work on this hook unchanged — `_nativeAllowed` ADDS native capability,      it does not require it. Whether to point ERC20 pools here or keep them on per-pool      `FablesRamp` instances is a deployment (blast-radius) decision, not a code one.","methods":{"authority()":{"details":"Returns the current authority."},"pause(uint256)":{"details":"A separate selector from `setPaused` so the fast key really is one-way. Binding the      combined `setPaused` to a zero-delay role looked like an emergency stop but handed      that same key the UNPAUSE — `setPaused(0)` clears the freeze — so a compromised      guardian could lift the multisig's freeze every block. This entry point can only      ever move `pausedUntil` forward, which is what makes it safe to run at zero delay,      and `setPaused` stays on the delayed ADMIN_ROLE for lifting it."},"rangeKey(uint256)":{"details":"`rangeId` is a one-way hash, and the `Deposited`/`Staked`/`FeesCollected` events carry      only the id — so an off-chain settlement run seeing a `rangeId` cannot otherwise attribute      that range's fees to a pool/gauge without decoding deposit calldata. This exposes the      stored preimage so the mapping is available from the public ABI, first deposit onward."},"claimFeeFor(uint64)":{"details":"The minimum, and not a time-weighted average, because a time-weighted average is not      computable here and pretending otherwise would be a guess dressed as arithmetic. v4      hands over one lump for the whole window and says nothing about WHEN inside it the      fees were earned — a week's backlog might all have accrued in one busy hour. Any      apportionment would be invented.      Given that, the minimum is the only defensible answer, for two reasons that matter      more than the revenue:        - It can never charge an LP a rate the protocol was not actually advertising while          their fees were accruing. Every other rule can.        - It bounds the timing game, though it does not remove it. Anyone can force a range          to realize its fees (`deposit` of one unit does it), so a third party picks the          moment a backlog is priced. Waiting can only ever LOWER the rate — so there is          nothing to gain by delaying. But a scheduled cut is public before it lands, and          collecting just BEFORE it closes the window at the old rate. An earlier version          of this comment claimed there was nothing to front-run; that is false, and the          exposure is bounded only by `MAX_CLAIM_FEE_BPS` and by the rate shipping at zero.      The cost is that ops must treat a dip as retroactive. Lowering the rate for an hour      applies that hour's rate to every backlog spanning it, however long. That is a real      constraint on the lever, and the right way round: it makes a cut generous rather than      a raise reaching backwards."},"rangeGrowth(uint256)":{"details":"The read the boundary snapshotter is built on. Settlement attributes forgone fees to      the week they were GENERATED, so an interval of collection that straddles a week      boundary has to be split AT the boundary — and nothing happens on chain at a boundary      unless somebody syncs, so that one value cannot come from the log stream. It comes      from calling this at the boundary block instead.      A view rather than a stored snapshot, deliberately: reading it at a historical block      is exact, whereas a stored snapshot would be exact only if someone remembered to      write it in time — the punctuality dependency this whole change exists to remove.      IT IS NOT MONOTONIC ACROSS A LIQUIDITY RESET. An earlier version of this comment      claimed the accumulator \"moves only when a swap crosses the range\". It also moves      when a tick is initialised or cleared: v4 deletes `feeGrowthOutside` once the last      liquidity at a tick is removed and re-bases it against the current global on the next      deposit, so a range that empties and refills reads a fresh, unrelated baseline. Two      readings either side of that are not comparable, and settlement must treat a backwards      step as a reset rather than as a delta — which it does, loudly."},"setAuthority(address)":{"details":"Transfers control to a new authority. The caller must be the current authority."},"unlockCallback(bytes)":{"params":{"data":"The data that was passed to the call to unlock"},"details":"A thin shell: it checks the caller and hands the whole callback body to      `LedgerLib.onUnlock` (inlined), which decodes the action, applies a liquidity      modify or a payout, and settles fees and principal.","returns":{"_0":"Any data that you want to be returned from the unlock call"}},"setBallotGate(address)":{"details":"Probed, not merely stored. `setDistributor` spends a `try/catch` on its counterpart      for exactly this reason and this setter did not, so an EOA or a wrong-ABI contract      made `syncRanges` revert on `abi.decode` for every staked range — permanently      unusable, with no on-chain signal. `address(0)` stays explicitly allowed: a closed      door is the safe default for one that decides who may reach into someone else's      position, and `syncRanges` refuses outright while the gate is unset."},"currentFee(bytes32,bool)":{"details":"Uses a zero-amount probe, so size-dependent components read as zero here."},"isConsumingScheduledOp()":{"details":"Returns true only in the context of a delayed restricted call, at the moment that the scheduled operation is being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs attacker controlled calls."},"setOperator(address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator."},"returns":{"_0":"bool True, always"}},"syncRanges(uint256,uint256[])":{"details":"Settlement needs this. v4 pays nothing until a position is touched, and a `rangeId`      is `(pool, tickLower, tickUpper)`, so an LP on bespoke bounds is the ONLY party who      can touch their range. Staked shares give their fees up to voters, which left      voters' revenue hostage to whether the LP who forgoes it ever felt like syncing —      and left each epoch's emission split guessing at fees that had not been booked yet.      Ops calls this over the staked ranges at each epoch boundary, which is also what      makes the `FeesCollected` accumulator levels line up with epoch boundaries so the      week's forgone fees are attributable exactly.It takes the claim fee like every other door, and it must. An earlier version skipped      the skim here on the grounds that \"the protocol forgoes its claim fee on syncs it did      not initiate — it still collects on every owner-driven path\". The second clause was      false. v4 pays nothing until a position is touched, so an owner-driven sync can only      ever skim fees accrued SINCE THE LAST TOUCH — and a free door that collects the whole      backlog sets that to nothing. Whoever touches a range last wins, so any voter of the      pool could hold the protocol's revenue on every staked range in it at zero forever,      for gas, by sweeping just before each owner claim. Charging uniformly is the only      shape with no door to arbitrage between.      It costs the caller nothing they are owed: the skim is taken from the UNSTAKED      residue, after `stakedCut` has already been set aside for the voters' pot. A voter      syncing to fund their own claim is not paying for the privilege.      The rate is still `min(live, snapshot)`, so a raise can never reach back over a      backlog earned under the old rate — which was the other thing the exemption was      protecting, and is protected here by `_effectiveClaimFee` instead of by a hole."},"pokeFee(bytes32,uint24,uint40)":{"details":"Bounded on BOTH sides. The ceiling is the pool cap; the floor is the cheapest fee      the pool is configured to charge autonomously, so ops can still correct a fee that      is wrongly high (a mis-classified market day, say) but cannot go anywhere the pool      would not have gone by itself. This role is the one hot key in the system, granted      with no execution delay because reacting fast is its whole purpose — which makes it      the likeliest to be compromised. Without a floor, whoever held it could set every      pool to zero for 72 hours and renew for the price of gas, so LPs earn nothing while      arbitrageurs take the pool apart for free. A ceiling alone bounds the wrong end."},"approve(address,uint256,uint256)":{"params":{"id":"The id of the token.","amount":"The amount of the token.","spender":"The address of the spender."},"returns":{"_0":"bool True, always"}},"transfer(address,uint256,uint256)":{"details":"Staked shares are locked: only the unstaked balance is transferable."},"transferFrom(address,address,uint256,uint256)":{"params":{"id":"The id of the token.","amount":"The amount of the token.","sender":"The address of the sender.","receiver":"The address of the receiver."},"returns":{"_0":"bool True, always, unless the function reverts"}},"unstake((address,address,uint24,int24,address),int24,int24,uint128)":{"details":"Deliberately NOT pausable, unlike `stake`. Unstaking only ever SHRINKS what the      distributor is owed and makes no external call, so it cannot be an exploit vector —      while pausing it would mean an LP cannot stop routing their fees to a distributor      the admin also chooses. Freezing the exit from a revenue assignment is not an      exploit response, it is the exploit."},"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)":{"params":{"to":"Recipient of the fees; lets a holder route around a token that blocks their        own address without stranding the other currency."}},"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)":{"params":{"deadline":"Latest block timestamp at which this deposit may execute.","amount0Max":"The most currency0 the caller will pay for this liquidity.","amount1Max":"The most currency1 the caller will pay for this liquidity."},"details":"The bounds are NOT optional ceremony. `liquidity` says nothing about what it costs: the      token amounts fall out of the pool's live price inside `modifyLiquidity`, and whatever v4      asks for is pulled from the caller. Without a ceiling, the only limit was the caller's own      ERC-20 allowance, so a price move between signing and execution bought the whole position      one-sided at a price nobody agreed to. See `LedgerLib._checkBound`.Payable for the native-capable variant only. On an ERC20 pool any attached value      reverts — accepting it would strand ETH on a contract with no path back out. On a      native pool the caller must attach AT LEAST `amount0Max`: the actual amount owed is      only learned inside the unlock callback, `_checkBound` caps it at `amount0Max`, so      prepaying the ceiling guarantees settlement can never under-fund — and the unspent      remainder is refunded in full at the end (see `_refundNative`)."},"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)":{"params":{"to":"Where the principal lands. `claimFees` already takes one so a holder can route        around a token that blocks their own address; `withdraw` hardcoded `msg.sender`,        which meant a blocklist on the LP froze their principal in BOTH currencies — and        the documented escape (transfer the receipt to a clean address) is pausable, so a        pause concurrent with a blocklist closed every exit. That contradicted this        contract's headline guarantee that withdrawals are unconditional.","deadline":"Latest block timestamp at which this withdrawal may execute.","amount0Min":"The least currency0 the caller will accept back for this liquidity.","amount1Min":"The least currency1 the caller will accept back for this liquidity."},"details":"Fees are collected first via `_syncRange` — a claims-only touch that makes no      token call — so the withdrawer still receives their cut at pre-burn totals. Shares      are burned before the pool touch that pays principal, so the only step that can      hand control to a token sees `totalShares` and position liquidity already in      agreement. Over-withdrawing still reverts, now at `_burn`, before anything moves.The mirror of `deposit`'s ceiling. A liquidity figure does not say what mix it returns —      the price decides — so an exit during a moved market handed back a lopsided pair the LP      never consented to. Deliberately still NOT pausable: a bound the caller chose is not a      reason to trap them, and passing zeroes remains a valid \"any mix will do\"."}},"version":1},"sourceIds":{"src/FablesRamp.sol":{"id":40},"src/FablesRampETH.sol":{"id":41},"src/base/LedgerTypes.sol":{"id":44},"src/base/FablesLedger.sol":{"id":43},"lib/v4-core/src/ERC6909.sol":{"id":16},"src/base/FablesBaseHook.sol":{"id":42},"src/libraries/LedgerLib.sol":{"id":45},"lib/v4-core/src/types/PoolId.sol":{"id":38},"lib/v4-core/src/types/PoolKey.sol":{"id":39},"lib/v4-core/src/types/Currency.sol":{"id":37},"lib/v4-core/src/libraries/Hooks.sol":{"id":28},"lib/v4-core/src/interfaces/IHooks.sol":{"id":19},"lib/v4-core/src/libraries/FullMath.sol":{"id":27},"lib/v4-core/src/libraries/Position.sol":{"id":32},"lib/v4-core/src/libraries/SafeCast.sol":{"id":33},"lib/v4-core/src/types/BalanceDelta.sol":{"id":35},"lib/v4-core/src/interfaces/IExtsload.sol":{"id":17},"lib/v4-core/src/interfaces/IExttload.sol":{"id":18},"lib/v4-core/src/libraries/ParseBytes.sol":{"id":31},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"id":36},"lib/v4-core/src/libraries/CustomRevert.sol":{"id":25},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"id":29},"lib/v4-core/src/libraries/StateLibrary.sol":{"id":34},"lib/v4-core/src/interfaces/IPoolManager.sol":{"id":20},"lib/v4-core/src/libraries/FixedPoint128.sol":{"id":26},"lib/v4-core/src/libraries/LiquidityMath.sol":{"id":30},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"id":21},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"id":23},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":12},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"id":24},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"id":22},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":7},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":6},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":9},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":5},"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol":{"id":14},"lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol":{"id":4},"lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol":{"id":8},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":11},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":15},"lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol":{"id":0},"lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol":{"id":1},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol":{"id":2},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol":{"id":3},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol":{"id":13},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":10}},"additionalInput":null,"stdJsonInput":{"sources":{"src/FablesRamp.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {PoolId, PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {FablesLedger} from \"./base/FablesLedger.sol\";\nimport {FablesBaseHook} from \"./base/FablesBaseHook.sol\";\n\n/// @title FablesRamp\n/// @notice The unified non-calendar fee hook. One singleton serves every non-equity pool —\n///         memecoin, blue-chip, token-issuer — each as a per-pool FLAT fee with a bounded, TTL-\n///         expiring operator override (`pokeFee` on the base hook). There is no autonomous dynamic\n///         fee: a pool charges its configured `flatPips`, and any responsiveness is applied off-chain\n///         and poked on top within `[floorPips, cap]`.\n/// @dev WHY NO ON-CHAIN VOLATILITY FEE. An earlier design priced the fee off realized volatility (a\n///      Parkinson tick-range estimator, `VolLib`). It was measured against real data and removed. A\n///      price-derived estimator can only read realized volatility from the pool's OWN series, and\n///      that has two dead ends: for memecoins it saturates, so the ramp pins at its ceiling and is a\n///      flat fee in all but name; for blue-chips the quantity that actually matters — LVR / adverse\n///      selection against the external mid — is invisible without an ORACLE. A flat fee plus an\n///      oracle-driven off-chain poke is both simpler and strictly better where it matters, so the\n///      estimator (and the sell-surcharge / quote-orientation machinery it carried) is gone.\n///\n///      The floor / flat / cap are per-pool and admin-adjustable within the deployment's absolute\n///      ceiling, so calibration is a config change, not a redeploy. The poke can only ever move the\n///      live fee inside `[max(floorPips, flatPips/2), cap]` and lapses back to `flatPips` on expiry,\n///      so a keeper failure is benign — the flat is the fee the pool really charges when unattended.\ncontract FablesRamp is FablesLedger {\n    using PoolIdLibrary for PoolKey;\n\n    error InvalidConfig();\n\n    event PoolConfigured(PoolId indexed poolId, uint24 floorPips, uint24 flatPips, uint24 maxFee);\n\n    /// @notice The flat fee (pips) each pool charges autonomously, before any poke and the cap.\n    mapping(PoolId poolId => uint24 flatPips) internal _flatPips;\n\n    constructor(IPoolManager poolManager_, address authority_, uint24 absoluteMaxFee_)\n        FablesBaseHook(poolManager_, authority_, absoluteMaxFee_)\n    {}\n\n    function _hookPermissions() internal pure override returns (Hooks.Permissions memory permissions) {\n        permissions.beforeInitialize = true;\n        permissions.beforeSwap = true;\n    }\n\n    /// @notice The flat fee configured for a pool, in pips.\n    function flatFee(PoolId poolId) external view returns (uint24) {\n        return _flatPips[poolId];\n    }\n\n    /// @notice Registers or updates a pool's flat fee and its poke bounds. `floorPips` is the\n    ///         cheapest a poke may reach, `flatPips` the fee charged with no live poke, `cap` the\n    ///         ceiling; a poke never escapes `[floorPips, cap]` and expires back to `flatPips`.\n    function setPoolConfig(PoolKey calldata key, uint24 floorPips, uint24 flatPips, uint24 cap) external restricted {\n        if (flatPips < floorPips || flatPips > cap) revert InvalidConfig();\n        PoolId poolId = key.toId();\n        _flatPips[poolId] = flatPips;\n        // Also validates floorPips >= MIN_POOL_FEE, floorPips <= cap <= ABSOLUTE_MAX_FEE.\n        _setPoolBounds(poolId, floorPips, cap);\n        emit PoolConfigured(poolId, floorPips, flatPips, cap);\n    }\n\n    /// @notice The autonomous fee is simply the pool's flat rate; the base resolver applies the poke\n    ///         override and the cap on top.\n    function _autonomousFee(PoolId poolId, IPoolManager.SwapParams memory) internal view override returns (uint256) {\n        return _flatPips[poolId];\n    }\n}\n"},"src/FablesRampETH.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {FablesRamp} from \"./FablesRamp.sol\";\nimport {LedgerLib} from \"./libraries/LedgerLib.sol\";\nimport {DistributorSwept} from \"./base/LedgerTypes.sol\";\n\n/// @notice The one WETH surface this hook needs: wrap. Unwrapping never happens here — native ETH\n///         only ever LEAVES through the PoolManager's own `take`, and the single place the hook\n///         itself must hand ETH to an ERC20-only consumer (the epoch distributor) is a wrap.\ninterface IWETH9 {\n    function deposit() external payable;\n}\n\n/// @title FablesRampETH\n/// @notice `FablesRamp` for pools whose currency0 is NATIVE ETH. Robinhood Chain's real ETH\n///         liquidity is quoted in native ETH, not WETH — the WETH pools are dead — so an ETH desk\n///         that wants the flow must speak native. Same flat-fee-plus-poke pricing, same ledger,\n///         same roles; this contract adds only the machinery that native currency requires.\n/// @dev WHAT NATIVE ACTUALLY TOUCHES. Uniswap v4 already moves native ETH itself on every payout\n///      (`take` pays LPs' withdrawals and claims directly), and swappers settle with the\n///      PoolManager, never with the hook. Exactly three seams remain, and they live in three\n///      places:\n///        1. pay-in — `LedgerLib._resolvePrincipal` settles a native deposit with\n///           `settle{value:}` from the hook's balance, prepaid by the depositor\n///           (`FablesLedger.deposit` is payable, requires `msg.value >= amount0Max`, and refunds\n///           the unspent remainder in full at the end);\n///        2. the gate — `_nativeAllowed()` is the coupled switch: overriding it to true is what\n///           lets `beforeInitialize`/`_checkKey` admit native pools on THIS hook while every\n///           ERC20-only hook keeps refusing them;\n///        3. revenue — the epoch distributor speaks only ERC20, so the NATIVE currency's\n///           staked-fee sweep wraps into WETH at this boundary (`_sweepDistributor` override) and\n///           everything downstream (distributor, settlement indexer, merkle claims) stays\n///           ERC20-pure. LP-facing money (withdraw, claimFees) stays native: LPs deposited ETH\n///           and get ETH back.\n///\n///      WHAT THIS HOOK NEVER DOES: hold ETH between transactions. Deposits refund their whole\n///      remaining balance in the same call; the sweep wraps and forwards within its own call. A\n///      nonzero balance at rest is a stranger's forced transfer, and the next native deposit\n///      returns it to circulation via the full-balance refund.\n///\n///      `receive()` is allowlisted to the PoolManager — the only counterparty that legitimately\n///      pays this contract ETH (`take` during the wrap-sweep). WETH9 never sends ETH here\n///      (`deposit` is a one-way wrap and nothing ever calls `withdraw`), and unsolicited transfers\n///      are refused outright rather than silently absorbed.\n///\n///      ERC20 pools still work on this hook unchanged — `_nativeAllowed` ADDS native capability,\n///      it does not require it. Whether to point ERC20 pools here or keep them on per-pool\n///      `FablesRamp` instances is a deployment (blast-radius) decision, not a code one.\ncontract FablesRampETH is FablesRamp {\n    using CurrencyLibrary for Currency;\n    using SafeERC20 for IERC20;\n\n    error UnauthorizedETHSender();\n\n    /// @notice Emitted when a NATIVE staked-fee sweep is delivered to the distributor as WETH.\n    /// @dev Pairs with the `DistributorSwept(address(0), distributor, amount)` that fires alongside\n    ///      it. The two describe one event from two sides, and BOTH are load-bearing for the\n    ///      off-chain settlement indexer: the `DistributorSwept` clears the ledger's NATIVE\n    ///      `distributorOwed` accrual (which is denominated in address(0), matching the\n    ///      `FeesCollected` events that fed it), while THIS event states the delivered token —\n    ///      the distributor speaks only ERC20 and receives `amount` of `weth`, never native ETH.\n    ///      An indexer reconciling the distributor's on-chain token balances MUST credit WETH from\n    ///      this event, not native ETH from the `DistributorSwept`, or native staked-fee revenue is\n    ///      mis-attributed in the merkle. Making the conversion an explicit on-chain fact removes\n    ///      the alternative — an undocumented `address(0) -> weth` convention the indexer had to\n    ///      just know.\n    event NativeRevenueWrappedToWeth(address indexed distributor, address indexed weth, uint256 amount);\n\n    /// @notice The canonical wrapped-ETH contract native revenue is wrapped into for the\n    ///         ERC20-only distributor. Immutable: a mutable WETH would be a mutable custodian of\n    ///         every future native sweep.\n    IWETH9 public immutable weth;\n\n    constructor(IPoolManager poolManager_, address authority_, uint24 absoluteMaxFee_, IWETH9 weth_)\n        FablesRamp(poolManager_, authority_, absoluteMaxFee_)\n    {\n        if (address(weth_) == address(0)) revert ZeroAddress();\n        weth = weth_;\n    }\n\n    /// @notice Native pools are admitted on this hook — the override travels with the payable\n    ///         deposit, the `settle{value:}` pay-in and the wrap-sweep that make them work.\n    function _nativeAllowed() internal pure override returns (bool) {\n        return true;\n    }\n\n    /// @notice ETH may arrive only from the PoolManager (its `take` during the wrap-sweep). The\n    ///         depositor's own prepay arrives as `msg.value` on `deposit`, not through here.\n    receive() external payable {\n        if (msg.sender != address(poolManager)) revert UnauthorizedETHSender();\n    }\n\n    /// @dev The NATIVE currency's staked-fee sweep: same bookkeeping as the library's\n    ///      (`LedgerLib.sweepDistributor`), different last hop — take the ETH to this contract,\n    ///      wrap it, and forward WETH, because the distributor cannot receive or hold native. The\n    ///      FF-sink fork in the library is deliberately absent here: FF is an ERC20, so the native\n    ///      currency can never be it. Every other currency falls through to the library path\n    ///      untouched. Pull-shaped like the original: an unset distributor keeps the accrual\n    ///      waiting rather than reverting.\n    function _sweepDistributor(Currency currency) internal override {\n        if (!currency.isAddressZero()) {\n            super._sweepDistributor(currency);\n            return;\n        }\n        uint256 amount = distributorOwed[currency];\n        if (amount == 0) return;\n        address to = distributor;\n        if (to == address(0)) return; // unset sink: the accrual simply keeps waiting\n        distributorOwed[currency] = 0;\n        // Burns the hook's claims and takes real ETH to this contract (allowed by `receive`),\n        // inside the same PAYOUT unlock the library uses.\n        LedgerLib.payout(poolManager, currency, currency, amount, 0, address(this));\n        weth.deposit{value: amount}();\n        IERC20(address(weth)).safeTransfer(to, amount);\n        // Two sides of one sweep: `DistributorSwept` clears the native accrual (see the base\n        // library, which the ERC20 currencies still route through), `NativeRevenueWrappedToWeth`\n        // names the token the distributor actually received. See the event's NatSpec.\n        emit DistributorSwept(currency, to, amount);\n        emit NativeRevenueWrappedToWeth(to, address(weth), amount);\n    }\n}\n"},"src/base/LedgerTypes.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\n\n/// @title LedgerTypes\n/// @notice Shared ledger types split into their own file so `FablesLedger` and its inlined\n///         helper library `LedgerLib` can both reference `RangeState` without a circular import. The\n///         struct layout is unchanged from when it lived inside the ledger, so storage is\n///         identical; moving the declaration touches no slot.\nstruct RangeState {\n    uint128 totalShares;\n    uint128 totalStaked;\n    uint256 accFee0X128; // fee per unstaked share, Q128\n    uint256 accFee1X128;\n    /// @dev Fee per STAKED share, Q128 — the fees staked shares gave up. This is the\n    ///      emission weight. Within a pool, fee growth per unit of liquidity is identical\n    ///      for every in-range position at any instant, so this quantity IS in-range\n    ///      liquidity-seconds, measured in the units that matter. A position the price\n    ///      never reaches accrues exactly zero here, which is the whole point.\n    uint256 accStaked0X128;\n    uint256 accStaked1X128;\n    /// @dev Sub-unit remainder left over by the staked-cut division, carried into the next\n    ///      window so no accrual can be truncated away by splitting it across syncs. Held as\n    ///      a FRACTION of one fee unit in Q128, never as a numerator over `totalShares`:\n    ///      see `LedgerLib._takeStakedCut` for why the denominator must not appear here.\n    uint128 stakedResidual0;\n    uint128 stakedResidual1;\n    /// @dev Emitted-collection counter (H6) and zero-liquidity-crossing counter (H2). Both are\n    ///      settlement anchors, not accounting: see the `FeesCollected` params. They share a slot.\n    uint64 collectionSeq;\n    uint64 resetSeq;\n}\n\n/// @notice One claim-fee rate and the moment it took effect. Shared with `LedgerLib`, which walks\n///         the history to price a range's backlog inside `creditFees`.\nstruct ClaimFeeChange {\n    uint64 fromTs;\n    uint16 bps;\n}\n\n/// @dev The two things `poolManager.unlock` calls back to do, decoded in `LedgerLib.onUnlock`.\nenum Action {\n    MODIFY,\n    PAYOUT\n}\n\n/// @dev A liquidity-modify unlock: apply `liquidityDelta` to the range and settle principal + fees.\n///\n///      `amount0Limit`/`amount1Limit` carry the CALLER'S CONSENT to the only place that can enforce\n///      it. A liquidity quantity does not say what it costs — the token amounts come out of the\n///      pool's live price inside `modifyLiquidity` — so without these the settled principal was\n///      whatever the price happened to make it, pulled from the caller with no ceiling. On a\n///      deposit they are the MOST the caller will pay per currency; on a withdraw, the LEAST they\n///      will accept. Ignored entirely when `liquidityDelta == 0` (an internal fee sync moves no\n///      principal).\nstruct CallbackData {\n    PoolKey key;\n    int24 tickLower;\n    int24 tickUpper;\n    int256 liquidityDelta;\n    address user;\n    uint128 amount0Limit;\n    uint128 amount1Limit;\n}\n\n/// @dev A payout unlock: redeem held claims into real tokens for `to`, kept off the withdraw path.\nstruct PayoutData {\n    Currency currency0;\n    Currency currency1;\n    uint256 amount0;\n    uint256 amount1;\n    address to;\n}\n\n/// @dev Emitted when accrued staked-share revenue is pushed to the distributor (or the FF sink).\n///      File-level so `LedgerLib.sweepDistributor` emits it with the identical\n///      signature the settlement indexer reads.\nevent DistributorSwept(Currency indexed currency, address indexed distributor, uint256 amount);\n\n/// @dev Mirrors `DistributorSwept` for the claim-fee sink. Its absence was a hole in the indexer's\n///      reconstruction of the fee split, which is derived from logs alone.\nevent ClaimFeeSwept(Currency indexed currency, address indexed recipient, uint256 amount);\n\nstruct UserPosition {\n    uint128 staked;\n    uint128 owed0;\n    uint128 owed1;\n    uint256 checkpoint0X128;\n    uint256 checkpoint1X128;\n    uint256 stakedCheckpoint0X128;\n    uint256 stakedCheckpoint1X128;\n    /// @notice Cumulative fees this holder's STAKED shares gave up, per currency. The basis\n    ///         for their emission share within the pool — settlement buckets the deltas by\n    ///         epoch from `FeesForgone`, and this running total is the on-chain anchor\n    ///         anyone can check a root against.\n    uint256 forgone0;\n    uint256 forgone1;\n}\n\n/// @dev The emission weight, emitted per holder as it accrues. Settlement buckets these by\n///      epoch to split a pool's vote-won emissions among the LPs who actually earned them.\n///      File-level so `LedgerLib` emits it with the identical signature the\n///      settlement indexer already reads.\nevent FeesForgone(address indexed owner, uint256 indexed rangeId, uint256 amount0, uint256 amount1);\n\n/// @dev Range descriptor, stored on first deposit so paths without a PoolKey argument (ERC-6909\n///      transfers) can still sync the pool's lazily-accrued fees first. File-level so `LedgerLib`\n///      can read a range's `feeGrowthInside` for the `FeesCollected` emit.\nstruct RangeKey {\n    PoolKey key;\n    int24 tickLower;\n    int24 tickUpper;\n    bool set;\n}\n\n/// @dev Emitted on every fee collection so the split between voters (staked) and holders\n///      (unstaked) is reproducible from logs — the epoch-settlement trust model assumes exactly\n///      that. File-level so `LedgerLib` emits it with the identical signature the\n///      indexer reads.\n///\n///      Carries the per-staked-share accumulator LEVELS, which is what makes emission weight\n///      attributable in time. `FeesForgone` fires when a holder is settled, and a settle can be\n///      triggered by anyone (a dust transfer settles the receiver) at any block — so its timestamp\n///      says when someone poked the position, not when the fees were earned. These levels move only\n///      inside the collection itself, so integrating them against the Staked/Unstaked timeline\n///      gives each holder's weight per epoch regardless of when anyone settles.\n///\n///      `feeGrowthInside0X128`/`1X128` are v4's own per-liquidity accumulator for the range, read at\n///      the instant of collection: a week's forgone fees become a function of what the position\n///      GENERATED rather than of when somebody collected it, so settlement can split a segment that\n///      straddles a week boundary AT the boundary, identically for every holder. `totalShares`/\n///      `totalStaked` carry the staked fraction rather than reconstructing it. `collectionSeq`\n///      increments on EVERY emitted collection, so a DROPPED log is a visible gap and its epoch is\n///      quarantined rather than under-paid (H6); `resetSeq` increments whenever the range's v4\n///      position crosses zero liquidity in EITHER direction — the deterministic re-base signal that\n///      replaced the indexer's steerable magnitude heuristic (H2).\nevent FeesCollected(\n    uint256 indexed rangeId,\n    uint256 fee0,\n    uint256 fee1,\n    uint256 stakedCut0,\n    uint256 stakedCut1,\n    uint256 accStaked0X128,\n    uint256 accStaked1X128,\n    uint256 feeGrowthInside0X128,\n    uint256 feeGrowthInside1X128,\n    uint128 totalShares,\n    uint128 totalStaked,\n    uint64 collectionSeq,\n    uint64 resetSeq\n);\n"},"src/base/FablesLedger.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {PoolId, PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {StateLibrary} from \"v4-core/src/libraries/StateLibrary.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {ERC6909} from \"v4-core/src/ERC6909.sol\";\nimport {ReentrancyGuardTransient} from \"@openzeppelin/contracts/utils/ReentrancyGuardTransient.sol\";\nimport {FablesBaseHook} from \"./FablesBaseHook.sol\";\nimport {\n    RangeState,\n    UserPosition,\n    RangeKey,\n    ClaimFeeChange,\n    Action,\n    CallbackData,\n    PayoutData,\n    FeesForgone,\n    FeesCollected,\n    DistributorSwept,\n    ClaimFeeSwept\n} from \"./LedgerTypes.sol\";\nimport {LedgerLib} from \"../libraries/LedgerLib.sol\";\n\n/// @title FablesLedger\n/// @notice Per-range liquidity ledger inside the singleton hook: users deposit concentrated\n///         liquidity in any tick range; the hook holds one PoolManager position per range and\n///         mints ERC-6909 receipts 1:1 with liquidity units.\n/// @dev Founding constraints, in order of importance:\n///       - WITHDRAWALS ARE UNCONDITIONAL. The withdraw path reads no admin state: no pause,\n///         no oracle, no distributor, no claim fee on principal; staked shares auto-unstake.\n///         It also makes no token call on the ledger's own behalf: collected fees settle as\n///         PoolManager ERC-6909 claims, never as transfers to this contract. A token that\n///         blocklists THIS contract therefore cannot freeze anyone's principal, and the only\n///         transfer on the path is the PoolManager paying the withdrawer directly.\n///       - SOLVENT BY CONSTRUCTION. Shares are liquidity units (no exchange rate), so\n///         totalShares(range) == position liquidity is an invariant, not an aspiration, and\n///         there is no share-price inflation attack surface.\n///       - Fees accrue per range via Q128 accumulators, checkpointed on every share change;\n///         claims are pull-only. A claim fee (default 0) applies to FEES exclusively.\n///       - The staking switch ships dormant: staked shares route their fee accrual to a\n///         settable distributor instead of the holder. It costs nothing until used and\n///         cannot be retrofitted later (contracts are immutable).\n/// @dev The slice of the Voter this contract needs: does `account` back `poolId` with a lock it\n///      owns? Declared here rather than importing the Voter so the hook does not carry the whole\n///      voting contract in its bytecode, and so the two can be deployed in either order.\ninterface IBallotGate {\n    function ballotBacks(address account, uint256 tokenId, PoolId poolId) external view returns (bool);\n    function isGaugeKilled(PoolId poolId) external view returns (bool);\n    function isGaugeLive(PoolId poolId) external view returns (bool);\n    function isGaugeEarning(PoolId poolId) external view returns (bool);\n}\n\nabstract contract FablesLedger is FablesBaseHook, ERC6909, ReentrancyGuardTransient, IUnlockCallback {\n    using PoolIdLibrary for PoolKey;\n    using CurrencyLibrary for Currency;\n\n    error LedgerPaused();\n    error PauseTooLong();\n    error ZeroLiquidity();\n    /// @notice The transaction was mined after the caller's stated deadline.\n    error DeadlineExpired();\n    error InsufficientUnstakedShares();\n    error ZeroShares();\n    error ZeroAddress();\n    error InvalidSink();\n    // Reverted from inside `LedgerLib` on the admin paths, so they surface through this\n    // contract with these selectors; declared here for that ABI surface and cost no bytecode.\n    error InvalidClaimFee();\n    error DistributorNotFFAware();\n    error ClaimFeeAboveMax();\n    error NothingToClaim();\n    error NotAVoterOfThisPool();\n    error BallotGateUnset();\n    error DeskRetired();\n    error InvalidBallotGate();\n    error InvalidMsgValue();\n    error RefundFailed();\n\n    event Deposited(address indexed owner, uint256 indexed rangeId, uint128 liquidity);\n    event Withdrawn(address indexed owner, uint256 indexed rangeId, uint128 liquidity);\n    event FeesClaimed(address indexed owner, uint256 indexed rangeId, uint256 amount0, uint256 amount1);\n    event Staked(address indexed owner, uint256 indexed rangeId, uint128 shares);\n    // `FeesForgone` is declared in `LedgerTypes.sol`, so `LedgerLib` emits it with\n    // the identical signature the settlement indexer reads.\n    event Unstaked(address indexed owner, uint256 indexed rangeId, uint128 shares);\n    // `FeesCollected` is declared in `LedgerTypes.sol` (with its full per-field settlement\n    // rationale), so `LedgerLib.creditFees` emits it with the identical signature\n    // the indexer reads.\n    // `DistributorSwept` and `ClaimFeeSwept` are declared in `LedgerTypes.sol`, so\n    // `LedgerLib`'s sweep functions emit them with the identical signatures the\n    // indexer reads.\n    event ClaimFeeSet(uint16 bps, address recipient);\n    event DistributorSet(address distributor);\n    event FFFeeSinkSet(address sink);\n    event PausedSet(uint256 pausedUntil);\n    event BallotGateSet(address gate);\n\n    uint16 public constant MAX_CLAIM_FEE_BPS = 2000; // 20%, fixed in bytecode\n    /// @dev How far back a sync will walk the rate history. Beyond it the all-time minimum is\n    ///      used, which can only ever charge LESS — never more — than the true window minimum.\n    ///      This cap, not a cooldown, is what bounds the cost: it holds whatever the history\n    ///      length, and the AccessManager execution delay on `setClaimFee` already stops the\n    ///      history being grown quickly in the first place.\n    uint256 public constant MAX_CLAIM_FEE_WALK = 32;\n\n    // `RangeState` now lives in `LedgerTypes.sol` (shared with `LedgerLib`); its layout is\n    // unchanged. See that file for the per-field notes.\n\n    // `UserPosition` now lives in `LedgerTypes.sol` (shared with `LedgerLib`); its layout is\n    // unchanged. See that file for the per-field notes.\n\n    /// @notice Admin levers. None of them is readable from the withdraw path.\n    uint16 public claimFeeBps;\n    address public claimFeeRecipient;\n    address public distributor;\n    /// @notice The protocol token, cached from the distributor. Refused by `sweepDistributor`.\n    address public distributorFF;\n    /// @notice Destination for FF-denominated staked-fee revenue. See `sweepDistributor`.\n    address public ffFeeSink;\n\n    // `ClaimFeeChange` now lives in `LedgerTypes.sol` (shared with `LedgerLib`, which walks the\n    // history inside `creditFees`); its layout is unchanged.\n\n    /// @notice Every claim-fee rate this ledger has ever stood at, oldest first.\n    /// @dev v4 accrues fees LAZILY: nothing is paid until a position is touched, so a range's\n    ///      backlog is an opaque lump earned over a window of arbitrary length that may span any\n    ///      number of rate changes. A single per-range snapshot could not describe that. It gave\n    ///      `min(rate now, rate at last touch)`, which is right at both ends and wrong in the\n    ///      middle — a rate that dipped and recovered between two touches billed the WHOLE\n    ///      backlog at the high rate, including everything earned while the protocol was\n    ///      advertising the low one.\n    ClaimFeeChange[] internal _claimFeeHistory;\n\n    /// @notice The lowest rate this ledger has ever stood at. The fallback for a backlog older\n    ///         than the bounded walk can reach.\n    uint16 public claimFeeAllTimeMin;\n\n    /// @notice How many rate changes had been recorded when each range last realized its fees —\n    ///         i.e. where in the history its current backlog opened.\n    /// @dev An INDEX, not a timestamp, and not a rate. Not a rate because a single rate cannot\n    ///      answer \"what was in force across this window\". Not a timestamp because several rate\n    ///      changes and several syncs can share one `block.timestamp`, and a cursor that cannot\n    ///      order two events in the same block would charge a backlog at a rate that was set\n    ///      after it was already realized.\n    mapping(uint256 rangeId => uint64 index) public claimFeeSyncIndex;\n\n    /// @notice Exploit-response switch: freezes deposits, claims, staking, transfers and\n    ///         sweeps. Principal withdrawal and unstaking are deliberately NOT pausable, ever.\n    /// @dev An expiry, not a flag. A pause that never lapses is indistinguishable from a\n    ///      confiscation of everything it touches: fees already credited to a holder become\n    ///      permanently unclaimable and a receipt becomes permanently untransferable, with no\n    ///      recourse if the key that set it is gone. Bounding the duration in bytecode keeps\n    ///      the emergency power without letting it become a permanent one — renewing is always\n    ///      possible, but it is a deliberate, visible act each time rather than the default.\n    uint256 public pausedUntil;\n\n    /// @notice The Voter, consulted to decide who may collect a staked range's fees.\n    address public ballotGate;\n\n    /// @notice Longest a single pause can last before it must be renewed on purpose.\n    uint256 public constant MAX_PAUSE = 7 days;\n\n    /// @notice True while the ledger is paused.\n    function paused() public view returns (bool) {\n        // day-scale window; second-level drift is immaterial\n        // forge-lint: disable-next-line(block-timestamp)\n        return pausedUntil > block.timestamp;\n    }\n\n    modifier whenNotPaused() {\n        if (paused()) revert LedgerPaused();\n        _;\n    }\n\n    // `RangeKey` now lives in `LedgerTypes.sol` (shared with `LedgerLib`, which reads a range's\n    // descriptor for the `FeesCollected` growth read); its layout is unchanged.\n\n    mapping(uint256 rangeId => RangeKey descriptor) internal _rangeKeys;\n    mapping(uint256 rangeId => RangeState state) internal _ranges;\n    mapping(uint256 rangeId => mapping(address owner => UserPosition position)) internal _positions;\n    mapping(Currency currency => uint256 owed) public distributorOwed;\n\n    /// @notice Claim-fee cut accrued for the recipient. Pull, never push: a blocked or\n    ///         paused recipient must not be able to block anyone else's claim.\n    mapping(Currency currency => uint256 owed) public claimFeeOwed;\n\n    /* ---------------------------------- views ---------------------------------- */\n\n    /// @notice True while a ledger operation is mid-flight. Always false to an external\n    ///         caller; only a token callback fired from inside this contract can observe it\n    ///         set. Integrators pricing receipts from within such a callback should refuse.\n    function isSettling() external view returns (bool) {\n        return _reentrancyGuardEntered();\n    }\n\n    function rangeId(PoolId poolId, int24 tickLower, int24 tickUpper) public pure returns (uint256) {\n        return uint256(keccak256(abi.encode(poolId, tickLower, tickUpper)));\n    }\n\n    /// @notice The pool key and tick range a `rangeId` was registered under. `set` is false for an\n    ///         id that has never been deposited into.\n    /// @dev `rangeId` is a one-way hash, and the `Deposited`/`Staked`/`FeesCollected` events carry\n    ///      only the id — so an off-chain settlement run seeing a `rangeId` cannot otherwise attribute\n    ///      that range's fees to a pool/gauge without decoding deposit calldata. This exposes the\n    ///      stored preimage so the mapping is available from the public ABI, first deposit onward.\n    function rangeKey(uint256 id)\n        external\n        view\n        returns (PoolKey memory key, int24 tickLower, int24 tickUpper, bool set)\n    {\n        RangeKey storage descriptor = _rangeKeys[id];\n        return (descriptor.key, descriptor.tickLower, descriptor.tickUpper, descriptor.set);\n    }\n\n    /// @notice v4's per-liquidity fee accumulator for a range, right now.\n    /// @dev The read the boundary snapshotter is built on. Settlement attributes forgone fees to\n    ///      the week they were GENERATED, so an interval of collection that straddles a week\n    ///      boundary has to be split AT the boundary — and nothing happens on chain at a boundary\n    ///      unless somebody syncs, so that one value cannot come from the log stream. It comes\n    ///      from calling this at the boundary block instead.\n    ///\n    ///      A view rather than a stored snapshot, deliberately: reading it at a historical block\n    ///      is exact, whereas a stored snapshot would be exact only if someone remembered to\n    ///      write it in time — the punctuality dependency this whole change exists to remove.\n    ///\n    ///      IT IS NOT MONOTONIC ACROSS A LIQUIDITY RESET. An earlier version of this comment\n    ///      claimed the accumulator \"moves only when a swap crosses the range\". It also moves\n    ///      when a tick is initialised or cleared: v4 deletes `feeGrowthOutside` once the last\n    ///      liquidity at a tick is removed and re-bases it against the current global on the next\n    ///      deposit, so a range that empties and refills reads a fresh, unrelated baseline. Two\n    ///      readings either side of that are not comparable, and settlement must treat a backwards\n    ///      step as a reset rather than as a delta — which it does, loudly.\n    function rangeGrowth(uint256 id) external view returns (uint256 growth0, uint256 growth1) {\n        RangeKey storage descriptor = _rangeKeys[id];\n        if (!descriptor.set) return (0, 0);\n        return\n            StateLibrary.getFeeGrowthInside(\n                poolManager, descriptor.key.toId(), descriptor.tickLower, descriptor.tickUpper\n            );\n    }\n\n    function rangeState(uint256 id) external view returns (RangeState memory) {\n        return _ranges[id];\n    }\n\n    function userPosition(uint256 id, address owner) external view returns (UserPosition memory) {\n        return _positions[id][owner];\n    }\n\n    /* ---------------------------------- admin ---------------------------------- */\n\n    function setClaimFee(Currency[] calldata settleFirst, uint16 bps, address recipient)\n        external\n        restricted\n        nonReentrant\n    {\n        _settleSinks(settleFirst);\n        // Validation, the history append and the all-time-min update live in `LedgerLib`\n        // (inlined); the value-vars are written here around it. The\n        // recipient may be neither this hook (the permissionless sweep would `take` the revenue\n        // straight to it) nor the distributor (which cannot pay FF out as a fee) — and that guard\n        // holds in EITHER call ordering, `setDistributor` enforcing the mirror.\n        claimFeeAllTimeMin = LedgerLib.recordClaimFee(_claimFeeHistory, bps, recipient, distributor, claimFeeAllTimeMin);\n        claimFeeBps = bps;\n        claimFeeRecipient = recipient;\n        emit ClaimFeeSet(bps, recipient);\n    }\n\n    /// @notice Where FF-denominated staked-share fee revenue is swept. Separate from\n    ///         `distributor` because the epoch distributor cannot pay FF out as a fee.\n    function setFFFeeSink(Currency[] calldata settleFirst, address sink) external restricted nonReentrant {\n        _settleSinks(settleFirst);\n        // The two addresses this sink exists to avoid, and the contract already holds both.\n        // Pointing it at the epoch distributor routes FF into the one place that can neither\n        // declare nor rescue it; pointing it at the hook leaves it as an unaccounted balance\n        // with no payout path. `setDistributor` spends a try/catch preventing the mirror\n        // mistake — and the sweep that would destroy the funds is permissionless, so the\n        // operator gets no window to notice.\n        if (sink == distributor || sink == address(this)) revert InvalidSink();\n        ffFeeSink = sink;\n        emit FFFeeSinkSet(sink);\n    }\n\n    /// @dev Pushes every named pot to its CURRENT destination before that destination changes.\n    ///      The pots are keyed by currency alone and the destination is resolved at sweep time,\n    ///      so rotating a sink silently re-pointed revenue that accrued entirely under the old\n    ///      one. The permissionless sweep was the old sink's only defence, and it is\n    ///      `whenNotPaused` while the setters are not — so a pause covering the rotation removed\n    ///      even that. Settling here makes the rotation deterministic, exactly as\n    ///      `FablesTreasurySplitter.setSplit` does for its own recipients.\n    function _settleSinks(Currency[] calldata currencies) internal {\n        for (uint256 i = 0; i < currencies.length; i++) {\n            _sweepDistributor(currencies[i]);\n            _sweepClaimFee(currencies[i]);\n        }\n    }\n\n    function setDistributor(Currency[] calldata settleFirst, address distributor_) external restricted nonReentrant {\n        _settleSinks(settleFirst);\n        // The sink guards (distributor may equal neither the FF sink nor the claim-fee recipient\n        // nor this hook — reachable in either call ordering, so both setters reject it) and the FF\n        // probe (a live distributor must name the protocol token so a later sweep can refuse FF)\n        // live in `LedgerLib.validateDistributor` (inlined). It returns\n        // the token to cache, or zero when clearing.\n        distributorFF = LedgerLib.validateDistributor(distributor_, ffFeeSink, claimFeeRecipient);\n        distributor = distributor_;\n        emit DistributorSet(distributor_);\n    }\n\n    /// @notice Pauses for `duration` seconds, or lifts the pause when `duration` is zero.\n    function setPaused(uint256 duration) external restricted {\n        if (duration > MAX_PAUSE) revert PauseTooLong();\n        pausedUntil = duration == 0 ? 0 : block.timestamp + duration;\n        emit PausedSet(pausedUntil);\n    }\n\n    /// @notice Freezes the ledger. Cannot unfreeze, and cannot shorten a freeze already running.\n    /// @dev A separate selector from `setPaused` so the fast key really is one-way. Binding the\n    ///      combined `setPaused` to a zero-delay role looked like an emergency stop but handed\n    ///      that same key the UNPAUSE — `setPaused(0)` clears the freeze — so a compromised\n    ///      guardian could lift the multisig's freeze every block. This entry point can only\n    ///      ever move `pausedUntil` forward, which is what makes it safe to run at zero delay,\n    ///      and `setPaused` stays on the delayed ADMIN_ROLE for lifting it.\n    function pause(uint256 duration) external restricted {\n        if (duration == 0 || duration > MAX_PAUSE) revert PauseTooLong();\n        uint256 until_ = block.timestamp + duration;\n        if (until_ <= pausedUntil) revert PauseTooLong(); // never shortens a running freeze\n        pausedUntil = until_;\n        emit PausedSet(until_);\n    }\n\n    /* ---------------------------------- internals: guards & sync ---------------------------------- */\n\n    /// @dev Rejects pools that are not this hook's, so `callerDelta - feesAccrued` really is\n    ///      principal (a foreign hook holding liquidity-delta flags would break that identity)\n    ///      and receipts can only ever be minted for vetted pools.\n    function _checkKey(PoolKey calldata key) internal view {\n        if (address(key.hooks) != address(this) || maxFee[key.toId()] == 0) revert PoolNotConfigured();\n        // Mirrors `beforeInitialize`: a native pool can only exist behind a hook whose\n        // `_nativeAllowed` override ships the payable/settlement machinery, so on such a hook the\n        // ledger paths must accept it; on every other hook the pool cannot have been initialized,\n        // and this guard keeps receipts unmintable for a key that never passed the gate.\n        if (key.currency0.isAddressZero() && !_nativeAllowed()) revert NativeNotSupported();\n    }\n\n    /// @dev Collect-only touch: materializes v4's lazily-accrued fees into the range's\n    ///      accumulators BEFORE any share or stake mutation, so fees are always split at the\n    ///      state that earned them. No-op for empty or unknown ranges.\n    function _syncRange(uint256 id) internal {\n        RangeKey memory descriptor = _rangeKeys[id];\n        if (!descriptor.set || _ranges[id].totalShares == 0) {\n            // A range with nothing in it has no backlog to mis-price, so this is the one moment\n            // its rate can be set forward rather than backward. Without it a brand-new range\n            // would carry a zero snapshot into its first real accrual and pay nothing.\n            claimFeeSyncIndex[id] = uint64(_claimFeeHistory.length);\n            return;\n        }\n        // A zero delta moves no principal, so the bounds are irrelevant here and `_checkBound`\n        // exempts a zero delta outright; passing the widest value states that plainly.\n        _modifyMem(\n            descriptor.key,\n            descriptor.tickLower,\n            descriptor.tickUpper,\n            0,\n            address(this),\n            type(uint128).max,\n            type(uint128).max\n        );\n    }\n\n    /* ---------------------------------- actions ---------------------------------- */\n\n    /// @notice Deposits `liquidity` units into the hook-owned position for the given range and\n    ///         mints receipts 1:1. Caller must have approved this contract for both tokens.\n    /// @param amount0Max The most currency0 the caller will pay for this liquidity.\n    /// @param amount1Max The most currency1 the caller will pay for this liquidity.\n    /// @param deadline Latest block timestamp at which this deposit may execute.\n    /// @dev The bounds are NOT optional ceremony. `liquidity` says nothing about what it costs: the\n    ///      token amounts fall out of the pool's live price inside `modifyLiquidity`, and whatever v4\n    ///      asks for is pulled from the caller. Without a ceiling, the only limit was the caller's own\n    ///      ERC-20 allowance, so a price move between signing and execution bought the whole position\n    ///      one-sided at a price nobody agreed to. See `LedgerLib._checkBound`.\n    /// @dev Payable for the native-capable variant only. On an ERC20 pool any attached value\n    ///      reverts — accepting it would strand ETH on a contract with no path back out. On a\n    ///      native pool the caller must attach AT LEAST `amount0Max`: the actual amount owed is\n    ///      only learned inside the unlock callback, `_checkBound` caps it at `amount0Max`, so\n    ///      prepaying the ceiling guarantees settlement can never under-fund — and the unspent\n    ///      remainder is refunded in full at the end (see `_refundNative`).\n    function deposit(\n        PoolKey calldata key,\n        int24 tickLower,\n        int24 tickUpper,\n        uint128 liquidity,\n        uint128 amount0Max,\n        uint128 amount1Max,\n        uint256 deadline\n    ) external payable nonReentrant whenNotPaused {\n        if (liquidity == 0) revert ZeroLiquidity();\n        // forge-lint: disable-next-line(block-timestamp)\n        if (block.timestamp > deadline) revert DeadlineExpired();\n        _checkKey(key);\n        if (key.currency0.isAddressZero()) {\n            if (msg.value < amount0Max) revert InvalidMsgValue();\n        } else if (msg.value != 0) {\n            revert InvalidMsgValue();\n        }\n\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        if (!_rangeKeys[id].set) {\n            _rangeKeys[id] = RangeKey({key: key, tickLower: tickLower, tickUpper: tickUpper, set: true});\n        }\n        // Collect pending fees at PRE-mint totals (no token call: fees settle as claims), then\n        // finish all bookkeeping, and only then touch the pool. The pool touch is the only\n        // step that can hand control to a token, so by the time it can, `totalShares` and the\n        // position's liquidity already agree — nothing observes a torn state.\n        _syncRange(id);\n        _settleUser(id, msg.sender);\n        // Crossing UP from zero (re)creates the v4 position, so its ticks re-initialize and its\n        // `feeGrowthInside` re-bases. Bumped BEFORE the pool touch so the collection it may trigger\n        // carries the new value (H2).\n        bool recreated = _ranges[id].totalShares == 0;\n        if (recreated) _ranges[id].resetSeq += 1;\n        _ranges[id].totalShares += liquidity;\n        _mint(msg.sender, id, liquidity);\n        _modify(key, tickLower, tickUpper, int256(uint256(liquidity)), msg.sender, amount0Max, amount1Max);\n        // AFTER the pool touch, which is the first instant the fresh base is readable: emit the\n        // zero-fee collection that anchors it. Every re-base is thereby bracketed — the exit's own\n        // sync collected everything in the old base, nothing accrues while empty, and this baseline\n        // opens the new base — so settlement never meets two growth readings it cannot compare, and\n        // the epoch a backlog is credited to can never depend on when a stranger forces a collection.\n        if (recreated) LedgerLib.emitRebaseBaseline(_ranges, _rangeKeys, poolManager, id);\n        emit Deposited(msg.sender, id, liquidity);\n        // LAST, after every state write and event (unlike the AlphixETH precedent, which refunded\n        // mid-function): the refund hands control to the caller, and by now there is nothing left\n        // for reentrant code to observe torn — and `nonReentrant` (transient) blocks re-entry into\n        // every ledger door regardless.\n        if (key.currency0.isAddressZero()) _refundNative();\n    }\n\n    /// @dev Returns the hook's ENTIRE native balance to the caller, not `msg.value - spent`: the\n    ///      hook never holds ETH between transactions (deposits are the only pay-in and they end\n    ///      here; sweeps wrap-and-forward within their own call), so the whole balance IS this\n    ///      deposit's unspent remainder — plus any dust a stranger force-sent, which this returns\n    ///      to circulation instead of stranding. Full-gas call, hard revert on failure: a caller\n    ///      that cannot receive ETH must not be able to leave it behind.\n    function _refundNative() internal {\n        uint256 balance = address(this).balance;\n        if (balance == 0) return;\n        (bool success,) = msg.sender.call{value: balance}(\"\");\n        if (!success) revert RefundFailed();\n    }\n\n    /// @notice Burns receipts and removes the corresponding liquidity to the caller. Reads no\n    ///         admin state; auto-unstakes if the unstaked balance is insufficient.\n    /// @dev Fees are collected first via `_syncRange` — a claims-only touch that makes no\n    ///      token call — so the withdrawer still receives their cut at pre-burn totals. Shares\n    ///      are burned before the pool touch that pays principal, so the only step that can\n    ///      hand control to a token sees `totalShares` and position liquidity already in\n    ///      agreement. Over-withdrawing still reverts, now at `_burn`, before anything moves.\n    /// @param to Where the principal lands. `claimFees` already takes one so a holder can route\n    ///        around a token that blocks their own address; `withdraw` hardcoded `msg.sender`,\n    ///        which meant a blocklist on the LP froze their principal in BOTH currencies — and\n    ///        the documented escape (transfer the receipt to a clean address) is pausable, so a\n    ///        pause concurrent with a blocklist closed every exit. That contradicted this\n    ///        contract's headline guarantee that withdrawals are unconditional.\n    /// @param amount0Min The least currency0 the caller will accept back for this liquidity.\n    /// @param amount1Min The least currency1 the caller will accept back for this liquidity.\n    /// @param deadline Latest block timestamp at which this withdrawal may execute.\n    /// @dev The mirror of `deposit`'s ceiling. A liquidity figure does not say what mix it returns —\n    ///      the price decides — so an exit during a moved market handed back a lopsided pair the LP\n    ///      never consented to. Deliberately still NOT pausable: a bound the caller chose is not a\n    ///      reason to trap them, and passing zeroes remains a valid \"any mix will do\".\n    function withdraw(\n        PoolKey calldata key,\n        int24 tickLower,\n        int24 tickUpper,\n        uint128 liquidity,\n        address to,\n        uint128 amount0Min,\n        uint128 amount1Min,\n        uint256 deadline\n    ) external nonReentrant {\n        if (liquidity == 0) revert ZeroLiquidity();\n        if (to == address(0)) revert ZeroAddress();\n        // forge-lint: disable-next-line(block-timestamp)\n        if (block.timestamp > deadline) revert DeadlineExpired();\n        _checkKey(key);\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n\n        _syncRange(id);\n        _settleUser(id, msg.sender);\n\n        UserPosition storage position = _positions[id][msg.sender];\n        // balances are sums of uint128 liquidity mints, bounded by pool max liquidity\n        // forge-lint: disable-next-line(unsafe-typecast)\n        uint128 unstaked = uint128(balanceOf[msg.sender][id]) - position.staked;\n        if (unstaked < liquidity) {\n            uint128 fromStaked = liquidity - unstaked;\n            position.staked -= fromStaked; // reverts on underflow: not enough total shares\n            _ranges[id].totalStaked -= fromStaked;\n            emit Unstaked(msg.sender, id, fromStaked);\n        }\n        _burn(msg.sender, id, liquidity);\n        _ranges[id].totalShares -= liquidity;\n        // Crossing DOWN to zero empties the position, clearing its ticks and re-basing\n        // `feeGrowthInside`. Bumped BEFORE the pool touch so the collection it may trigger carries\n        // the new value (H2), pairing with the up-crossing bump in `deposit`. No baseline emission\n        // here, deliberately: the ticks are about to be cleared, so a reading taken now describes a\n        // base no future collection will ever be in — the anchor worth having is the refill's, and\n        // `deposit` emits it. Nothing accrues while the position is empty, so the seam carries no value.\n        if (_ranges[id].totalShares == 0) _ranges[id].resetSeq += 1;\n        _modify(key, tickLower, tickUpper, -int256(uint256(liquidity)), to, amount0Min, amount1Min);\n        emit Withdrawn(msg.sender, id, liquidity);\n    }\n\n    /// @notice Syncs the range's fees from the pool and pays the caller's accrued share, minus\n    ///         the claim fee (fees only — principal is never touched).\n    /// @param to Recipient of the fees; lets a holder route around a token that blocks their\n    ///        own address without stranding the other currency.\n    function claimFees(PoolKey calldata key, int24 tickLower, int24 tickUpper, address to, uint16 maxFeeBps)\n        external\n        nonReentrant\n        whenNotPaused\n    {\n        // The rate the caller is willing to pay. Uniswap v4 accrues fees lazily, so the hook\n        // only learns of them when a ledger operation syncs the range — which means the rate\n        // applied is whatever stands at sync time, and an LP whose range has been quiet since\n        // before a `setClaimFee` would otherwise pay the new rate on the whole backlog. Taking\n        // the cut at accrual bounds that window to the last sync; this bounds it to consent.\n        // Checks the rate this call will actually charge — the range's snapshot — not the live\n        // rate. Comparing against `claimFeeBps` once the charge moved to the snapshot made the\n        // guard read one variable and the skim another, so it permitted exactly the skims it was\n        // meant to block (snapshot high, live zero) and reverted claims that would have cost\n        // nothing (snapshot zero, live high).\n        _checkKey(key);\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        if (_effectiveClaimFee(id) > maxFeeBps) revert ClaimFeeAboveMax();\n        // Third free-sync door, same shape as the zero-amount ones closed on stake/unstake and\n        // transfer: an address with no position here still reached `_syncRange` before hitting\n        // the `owed == 0` exit, letting a stranger force a range's rate snapshot forward. A\n        // holder who has withdrawn but still has unclaimed fees must remain able to claim, so\n        // the test is \"has shares OR is owed something\", not \"has shares\".\n        UserPosition storage claimant = _positions[id][msg.sender];\n        if (balanceOf[msg.sender][id] == 0 && claimant.owed0 == 0 && claimant.owed1 == 0) {\n            revert NothingToClaim();\n        }\n        _syncRange(id);\n        _settleUser(id, msg.sender);\n\n        UserPosition storage position = _positions[id][msg.sender];\n        (uint256 amount0, uint256 amount1) = (position.owed0, position.owed1);\n        if (amount0 == 0 && amount1 == 0) return;\n        (position.owed0, position.owed1) = (0, 0);\n\n        // No cut here: it was already taken at accrual, at the rate in force when the range was\n        // last synced, so a later change cannot reach back into what is already owed.\n        _payout(key.currency0, key.currency1, amount0, amount1, to);\n        emit FeesClaimed(msg.sender, id, amount0, amount1);\n    }\n\n    /// @notice Stakes receipts: their future fee accrual routes to the distributor.\n    function stake(PoolKey calldata key, int24 tickLower, int24 tickUpper, uint128 shares)\n        external\n        nonReentrant\n        whenNotPaused\n    {\n        if (shares == 0) revert ZeroShares();\n        _checkKey(key);\n        // A desk that is not a LIVE gauge — killed, retired, or never added at all — has no voters\n        // and earns no emissions, so forgoing fees to it buys nothing and strands the money: it\n        // reaches the distributor with nobody entitled to claim it and sits there until the release\n        // window 26 weeks later. `isGaugeLive` folds the class check together with the kill/retire\n        // state: a never-gauged pool reads class NONE while `isGaugeKilled` alone returns false (the\n        // LIVE default of an empty history), so the kill check by itself lets a stake strand into a\n        // pool that was configured on the hook but never gauged — the exact gap FablesBribes closes\n        // with `gaugeClass != NONE`. Staking is the only side that closes — unstaking, withdrawing,\n        // claiming and ordinary LPing all stay open, because a wind-down must never trap anyone.\n        // `isGaugeEarning`, not `isGaugeLive`. The comment above states the condition this guard is\n        // for — \"has no voters and earns no emissions, so forgoing fees to it buys nothing and\n        // strands the money\" — and `isGaugeLive` never tested the voters half of it: it is class +\n        // kill state only. A LIVE, never-killed desk with no ballot pointed at it earns `_shareOf`\n        // exactly zero while its stakers' fees are still swept to the distributor and booked to the\n        // treasury, silently and indefinitely. `isGaugeEarning` adds the missing term.\n        // FAILS CLOSED. An unset `ballotGate` used to make this guard a no-op, which is not only a\n        // genesis condition: `ballotGate` is per-LEDGER, so every hook added to a running protocol\n        // has its own, and between the new pool becoming depositable (`initialize` is permissionless)\n        // and `setBallotGate` landing behind its config delay, staking was accepted on a desk with no\n        // gauge at all. Fees swept, nothing earned, nobody told. Staking before the gate is wired\n        // could never earn anyway — `_shareOf` needs a gauge — so refusing costs nothing real and\n        // removes a window whose length is set by a multisig delay.\n        address gate = ballotGate;\n        if (gate == address(0) || !IBallotGate(gate).isGaugeEarning(key.toId())) revert DeskRetired();\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        _syncRange(id); // fees earned before this stake stay with their earner\n        _settleUser(id, msg.sender);\n        UserPosition storage position = _positions[id][msg.sender];\n        if (uint128(balanceOf[msg.sender][id]) - position.staked < shares) revert InsufficientUnstakedShares();\n        position.staked += shares;\n        _ranges[id].totalStaked += shares;\n        emit Staked(msg.sender, id, shares);\n    }\n\n    /// @notice Unstakes receipts; permissionless, instant, dependency-free.\n    /// @dev Deliberately NOT pausable, unlike `stake`. Unstaking only ever SHRINKS what the\n    ///      distributor is owed and makes no external call, so it cannot be an exploit vector —\n    ///      while pausing it would mean an LP cannot stop routing their fees to a distributor\n    ///      the admin also chooses. Freezing the exit from a revenue assignment is not an\n    ///      exploit response, it is the exploit.\n    function unstake(PoolKey calldata key, int24 tickLower, int24 tickUpper, uint128 shares) external nonReentrant {\n        // A zero-share call did real work: it forced a full fee sync for free, from any address,\n        // with no balance and no approval, and is not pausable. That was the cheapest trigger for\n        // the claim-fee raid, and it also let anyone spam the Staked/Unstaked stream the\n        // settlement indexer reads.\n        if (shares == 0) revert ZeroShares();\n        _checkKey(key);\n        uint256 id = rangeId(key.toId(), tickLower, tickUpper);\n        _syncRange(id); // fees owed to the distributor are banked before the stake shrinks\n        _settleUser(id, msg.sender);\n        UserPosition storage position = _positions[id][msg.sender];\n        position.staked -= shares; // reverts on underflow\n        _ranges[id].totalStaked -= shares;\n        emit Unstaked(msg.sender, id, shares);\n    }\n\n    /// @notice Pushes accumulated staked-share fees to the distributor. Callable by anyone.\n    function sweepDistributor(Currency currency) external nonReentrant whenNotPaused {\n        _sweepDistributor(currency);\n    }\n\n    /// @dev A thin wrapper over `LedgerLib.sweepDistributor` (inlined).\n    ///      FF-denominated staked-fee revenue does NOT go to the epoch distributor — which treats\n    ///      every FF it holds as the emission tranche, where fee revenue would strand — but to the\n    ///      dedicated `ffFeeSink`; both destinations are resolved inside the library, and an unset\n    ///      one simply keeps the accrual waiting. Virtual because the distributor speaks only\n    ///      ERC20: the native-capable hook overrides the NATIVE currency's sweep to wrap into WETH\n    ///      at this boundary, so everything downstream stays ERC20-pure.\n    function _sweepDistributor(Currency currency) internal virtual {\n        LedgerLib.sweepDistributor(distributorOwed, poolManager, currency, distributor, distributorFF, ffFeeSink);\n    }\n\n    /* ---------------------------------- transfers ---------------------------------- */\n\n    /// @dev Staked shares are locked: only the unstaked balance is transferable.\n    function transfer(address receiver, uint256 id, uint256 amount)\n        public\n        override\n        nonReentrant\n        whenNotPaused\n        returns (bool)\n    {\n        // Same free, permissionless fee-sync primitive that was closed on stake/unstake: a\n        // zero-amount transfer needs no balance and no approval, moves nothing, and still forces\n        // a full unlock + modifyLiquidity round trip against any range.\n        if (amount == 0) revert ZeroShares();\n        _checkTransferable(msg.sender, id, amount);\n        _syncRange(id); // the sender keeps the fees their shares already earned\n        _settleUser(id, msg.sender);\n        _settleUser(id, receiver);\n        return super.transfer(receiver, id, amount);\n    }\n\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount)\n        public\n        override\n        nonReentrant\n        whenNotPaused\n        returns (bool)\n    {\n        // Same free, permissionless fee-sync primitive that was closed on stake/unstake: a\n        // zero-amount transfer needs no balance and no approval, moves nothing, and still forces\n        // a full unlock + modifyLiquidity round trip against any range.\n        if (amount == 0) revert ZeroShares();\n        _checkTransferable(sender, id, amount);\n        _syncRange(id); // the sender keeps the fees their shares already earned\n        _settleUser(id, sender);\n        _settleUser(id, receiver);\n        return super.transferFrom(sender, receiver, id, amount);\n    }\n\n    function _checkTransferable(address owner, uint256 id, uint256 amount) internal view {\n        if (balanceOf[owner][id] - _positions[id][owner].staked < amount) revert InsufficientUnstakedShares();\n    }\n\n    /* ---------------------------------- internals ---------------------------------- */\n\n    // `Action`, `CallbackData` and `PayoutData` now live in `LedgerTypes.sol` (shared with\n    // `LedgerLib.onUnlock`, which holds the unlock-callback body).\n\n    function _modify(\n        PoolKey calldata key,\n        int24 tickLower,\n        int24 tickUpper,\n        int256 liquidityDelta,\n        address user,\n        uint128 amount0Limit,\n        uint128 amount1Limit\n    ) internal {\n        _modifyMem(key, tickLower, tickUpper, liquidityDelta, user, amount0Limit, amount1Limit);\n    }\n\n    function _modifyMem(\n        PoolKey memory key,\n        int24 tickLower,\n        int24 tickUpper,\n        int256 liquidityDelta,\n        address user,\n        uint128 amount0Limit,\n        uint128 amount1Limit\n    ) internal {\n        poolManager.unlock(\n            abi.encode(\n                Action.MODIFY,\n                abi.encode(CallbackData(key, tickLower, tickUpper, liquidityDelta, user, amount0Limit, amount1Limit))\n            )\n        );\n    }\n\n    /// @dev Burns the ledger's claims and pays `to` in real tokens, via `LedgerLib.payout`\n    ///      (inlined). A failure here (paused or blocklisted token, blocked recipient) affects\n    ///      only this claim, never principal.\n    function _payout(Currency currency0, Currency currency1, uint256 amount0, uint256 amount1, address to) internal {\n        LedgerLib.payout(poolManager, currency0, currency1, amount0, amount1, to);\n    }\n\n    /// @inheritdoc IUnlockCallback\n    /// @dev A thin shell: it checks the caller and hands the whole callback body to\n    ///      `LedgerLib.onUnlock` (inlined), which decodes the action, applies a liquidity\n    ///      modify or a payout, and settles fees and principal.\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        return LedgerLib.onUnlock(\n            _ranges,\n            _rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            _claimFeeHistory,\n            poolManager,\n            LedgerLib.ClaimFeeState({bps: claimFeeBps, allTimeMin: claimFeeAllTimeMin, recipient: claimFeeRecipient}),\n            rawData\n        );\n    }\n\n    /// @dev The whole fee collection — claim-fee rate roll-forward, the claim mints, the staked /\n    ///      unstaked split, the claim-fee skim and the `FeesCollected` emit — lives in\n    ///      `LedgerLib.creditFees` (inlined), which mutates this contract's own storage\n    ///      (mappings passed by reference). Behaviour is identical.\n    function _creditFees(uint256 id, PoolKey memory key, uint128 fee0, uint128 fee1) internal {\n        LedgerLib.creditFees(\n            _ranges,\n            _rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            _claimFeeHistory,\n            poolManager,\n            LedgerLib.CreditParams({\n                id: id,\n                key: key,\n                fee0: fee0,\n                fee1: fee1,\n                claimFeeBps: claimFeeBps,\n                claimFeeAllTimeMin: claimFeeAllTimeMin,\n                claimFeeRecipient: claimFeeRecipient\n            })\n        );\n    }\n\n    /// @notice Realizes v4's lazily-accrued fees for a list of ranges, splitting each between\n    ///         its unstaked holders and the voters' pot. Permissionless, unpausable, and it\n    ///         moves no tokens out of this contract — it only turns fees the pool already holds\n    ///         into balances this ledger has attributed.\n    /// @dev Settlement needs this. v4 pays nothing until a position is touched, and a `rangeId`\n    ///      is `(pool, tickLower, tickUpper)`, so an LP on bespoke bounds is the ONLY party who\n    ///      can touch their range. Staked shares give their fees up to voters, which left\n    ///      voters' revenue hostage to whether the LP who forgoes it ever felt like syncing —\n    ///      and left each epoch's emission split guessing at fees that had not been booked yet.\n    ///      Ops calls this over the staked ranges at each epoch boundary, which is also what\n    ///      makes the `FeesCollected` accumulator levels line up with epoch boundaries so the\n    ///      week's forgone fees are attributable exactly.\n    /// @dev It takes the claim fee like every other door, and it must. An earlier version skipped\n    ///      the skim here on the grounds that \"the protocol forgoes its claim fee on syncs it did\n    ///      not initiate — it still collects on every owner-driven path\". The second clause was\n    ///      false. v4 pays nothing until a position is touched, so an owner-driven sync can only\n    ///      ever skim fees accrued SINCE THE LAST TOUCH — and a free door that collects the whole\n    ///      backlog sets that to nothing. Whoever touches a range last wins, so any voter of the\n    ///      pool could hold the protocol's revenue on every staked range in it at zero forever,\n    ///      for gas, by sweeping just before each owner claim. Charging uniformly is the only\n    ///      shape with no door to arbitrage between.\n    ///\n    ///      It costs the caller nothing they are owed: the skim is taken from the UNSTAKED\n    ///      residue, after `stakedCut` has already been set aside for the voters' pot. A voter\n    ///      syncing to fund their own claim is not paying for the privilege.\n    ///\n    ///      The rate is still `min(live, snapshot)`, so a raise can never reach back over a\n    ///      backlog earned under the old rate — which was the other thing the exemption was\n    ///      protecting, and is protected here by `_effectiveClaimFee` instead of by a hole.\n    function syncRanges(uint256 tokenId, uint256[] calldata ids) external nonReentrant {\n        address gate = ballotGate;\n        if (gate == address(0)) revert BallotGateUnset();\n        for (uint256 i = 0; i < ids.length; i++) {\n            uint256 id = ids[i];\n            // Staked ranges only. A range with nothing staked owes the voters nothing.\n            if (_ranges[id].totalStaked == 0) continue;\n            // And only a voter of THIS pool, on the strength of a lock they own. Collecting is\n            // already harmless to principal — `_syncRange` passes `liquidityDelta == 0`, so it\n            // can never move a position, and it merely books an unstaked holder's share into an\n            // accumulator only they can draw down. The gate is not there to stop theft; it is\n            // there because fees are attributed to the week they are COLLECTED in, so whoever\n            // chooses the moment chooses the epoch. That choice belongs to the people the money\n            // is owed to, not to whoever is watching.\n            if (!IBallotGate(gate).ballotBacks(msg.sender, tokenId, _rangeKeys[id].key.toId())) {\n                revert NotAVoterOfThisPool();\n            }\n            _syncRange(id);\n        }\n    }\n\n    /// @notice Points the sync gate at the Voter. Until it is set, nothing can be synced through\n    ///         this door at all — a closed door being the safe default for one that decides who\n    ///         may reach into someone else's position.\n    /// @dev Probed, not merely stored. `setDistributor` spends a `try/catch` on its counterpart\n    ///      for exactly this reason and this setter did not, so an EOA or a wrong-ABI contract\n    ///      made `syncRanges` revert on `abi.decode` for every staked range — permanently\n    ///      unusable, with no on-chain signal. `address(0)` stays explicitly allowed: a closed\n    ///      door is the safe default for one that decides who may reach into someone else's\n    ///      position, and `syncRanges` refuses outright while the gate is unset.\n    function setBallotGate(address gate) external restricted {\n        if (gate != address(0)) {\n            // Explicit, because `try/catch` alone does NOT cover this. Since solc 0.8.10 a\n            // high-level call expecting return data skips the extcodesize check and lets the ABI\n            // decoder revert instead — and that revert happens in the SUCCESS branch, so `catch`\n            // never sees it. An EOA here would have produced a bare revert indistinguishable\n            // from out-of-gas: the very \"no on-chain signal\" this setter is guarding against.\n            if (gate.code.length == 0) revert InvalidBallotGate();\n            try IBallotGate(gate).ballotBacks(address(this), 0, PoolId.wrap(bytes32(0))) returns (bool) {}\n            catch {\n                revert InvalidBallotGate();\n            }\n            // BOTH members, not just the one this contract happens to call first. `stake` calls\n            // `isGaugeEarning`, so a gate implementing only `ballotBacks` passed this setter and\n            // then made `stake` revert on the ABI decode for every pool at once — with no\n            // on-chain signal, which is the exact failure the probe above exists to prevent. The\n            // probe must track the member `stake` actually calls: it was `isGaugeLive` before the\n            // guard moved to `isGaugeEarning`, and staying on the old member reopened the gap.\n            try IBallotGate(gate).isGaugeEarning(PoolId.wrap(bytes32(0))) returns (bool) {}\n            catch {\n                revert InvalidBallotGate();\n            }\n        }\n        ballotGate = gate;\n        emit BallotGateSet(gate);\n    }\n\n    /// @dev The rate a sync of `id` will ACTUALLY charge: the range's snapshot, capped by the\n    ///      policy standing now. A reduction binds immediately, so the snapshot is an upper\n    ///      bound rather than a figure that can outlive the policy it came from; only an\n    ///      increase waits for the range's next sync, which is what stops a raise reaching back\n    ///      over a backlog earned entirely under the old rate.\n    /// @dev Both the skim and `claimFees`'s consent guard read this one function. They used to\n    ///      compute it separately, and drifted apart twice: the guard read the live rate while\n    ///      the skim charged the snapshot, then the guard read the snapshot while the skim\n    ///      charged the minimum. Each time the two disagreed the guard rejected claims that\n    ///      would have cost nothing, or waved through skims it existed to block. One definition\n    ///      is the only shape that cannot drift again.\n    function _effectiveClaimFee(uint256 id) internal view returns (uint16) {\n        return claimFeeFor(claimFeeSyncIndex[id]);\n    }\n\n    /// @notice The rate a backlog that opened at history index `sinceIndex` will actually be\n    ///         charged: the LOWEST rate that stood at any point from then until now.\n    /// @dev The minimum, and not a time-weighted average, because a time-weighted average is not\n    ///      computable here and pretending otherwise would be a guess dressed as arithmetic. v4\n    ///      hands over one lump for the whole window and says nothing about WHEN inside it the\n    ///      fees were earned — a week's backlog might all have accrued in one busy hour. Any\n    ///      apportionment would be invented.\n    ///\n    ///      Given that, the minimum is the only defensible answer, for two reasons that matter\n    ///      more than the revenue:\n    ///\n    ///        - It can never charge an LP a rate the protocol was not actually advertising while\n    ///          their fees were accruing. Every other rule can.\n    ///        - It bounds the timing game, though it does not remove it. Anyone can force a range\n    ///          to realize its fees (`deposit` of one unit does it), so a third party picks the\n    ///          moment a backlog is priced. Waiting can only ever LOWER the rate — so there is\n    ///          nothing to gain by delaying. But a scheduled cut is public before it lands, and\n    ///          collecting just BEFORE it closes the window at the old rate. An earlier version\n    ///          of this comment claimed there was nothing to front-run; that is false, and the\n    ///          exposure is bounded only by `MAX_CLAIM_FEE_BPS` and by the rate shipping at zero.\n    ///\n    ///      The cost is that ops must treat a dip as retroactive. Lowering the rate for an hour\n    ///      applies that hour's rate to every backlog spanning it, however long. That is a real\n    ///      constraint on the lever, and the right way round: it makes a cut generous rather than\n    ///      a raise reaching backwards.\n    function claimFeeFor(uint64 sinceIndex) public view returns (uint16) {\n        return LedgerLib.claimFeeFor(_claimFeeHistory, sinceIndex, claimFeeRecipient, claimFeeBps, claimFeeAllTimeMin);\n    }\n\n    /// @notice Number of recorded claim-fee changes.\n    function claimFeeHistoryLength() external view returns (uint256) {\n        return _claimFeeHistory.length;\n    }\n\n    /// @notice One recorded claim-fee change.\n    function claimFeeChangeAt(uint256 index) external view returns (ClaimFeeChange memory) {\n        return _claimFeeHistory[index];\n    }\n\n    /// @notice The rate a range's current backlog will be charged if it is synced now.\n    function effectiveClaimFee(uint256 id) external view returns (uint16) {\n        return _effectiveClaimFee(id);\n    }\n\n    // `_creditFees` emits `FeesCollected` from inside `LedgerLib.creditFees` (inlined), which\n    // also reads the range's live `feeGrowthInside` there; both used to be `_emitCollected` /\n    // `_growthOf` here, factored into `LedgerLib` for organization.\n\n    /// @dev A thin wrapper over `LedgerLib.settleUser` (inlined), so the per-holder fee and\n    ///      emission-weight checkpoint math — this contract's other `FullMath.mulDiv` cluster —\n    ///      lives in `LedgerLib`. Called from nine paths, all of which are cheap internal jumps.\n    function _settleUser(uint256 id, address owner) internal {\n        LedgerLib.settleUser(_ranges[id], _positions[id][owner], balanceOf[owner][id], owner, id);\n    }\n\n    /// @notice Pushes accrued claim-fee revenue to the recipient. Callable by anyone.\n    function sweepClaimFee(Currency currency) external nonReentrant whenNotPaused {\n        _sweepClaimFee(currency);\n    }\n\n    /// @dev A thin wrapper over `LedgerLib.sweepClaimFee` (inlined).\n    function _sweepClaimFee(Currency currency) internal {\n        LedgerLib.sweepClaimFee(claimFeeOwed, poolManager, currency, claimFeeRecipient);\n    }\n}\n"},"lib/v4-core/src/ERC6909.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC6909Claims} from \"./interfaces/external/IERC6909Claims.sol\";\n\n/// @notice Minimalist and gas efficient standard ERC6909 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC6909.sol)\n/// @dev Copied from the commit at 4b47a19038b798b4a33d9749d25e570443520647\n/// @dev This contract has been modified from the implementation at the above link.\nabstract contract ERC6909 is IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                             ERC6909 STORAGE\n    //////////////////////////////////////////////////////////////*/\n\n    mapping(address owner => mapping(address operator => bool isOperator)) public isOperator;\n\n    mapping(address owner => mapping(uint256 id => uint256 balance)) public balanceOf;\n\n    mapping(address owner => mapping(address spender => mapping(uint256 id => uint256 amount))) public allowance;\n\n    /*//////////////////////////////////////////////////////////////\n                              ERC6909 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function transfer(address receiver, uint256 id, uint256 amount) public virtual returns (bool) {\n        balanceOf[msg.sender][id] -= amount;\n\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, msg.sender, receiver, id, amount);\n\n        return true;\n    }\n\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) public virtual returns (bool) {\n        if (msg.sender != sender && !isOperator[sender][msg.sender]) {\n            uint256 allowed = allowance[sender][msg.sender][id];\n            if (allowed != type(uint256).max) allowance[sender][msg.sender][id] = allowed - amount;\n        }\n\n        balanceOf[sender][id] -= amount;\n\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, sender, receiver, id, amount);\n\n        return true;\n    }\n\n    function approve(address spender, uint256 id, uint256 amount) public virtual returns (bool) {\n        allowance[msg.sender][spender][id] = amount;\n\n        emit Approval(msg.sender, spender, id, amount);\n\n        return true;\n    }\n\n    function setOperator(address operator, bool approved) public virtual returns (bool) {\n        isOperator[msg.sender][operator] = approved;\n\n        emit OperatorSet(msg.sender, operator, approved);\n\n        return true;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                              ERC165 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n            || interfaceId == 0x0f632fb3; // ERC165 Interface ID for ERC6909\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        INTERNAL MINT/BURN LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function _mint(address receiver, uint256 id, uint256 amount) internal virtual {\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, address(0), receiver, id, amount);\n    }\n\n    function _burn(address sender, uint256 id, uint256 amount) internal virtual {\n        balanceOf[sender][id] -= amount;\n\n        emit Transfer(msg.sender, sender, address(0), id, amount);\n    }\n}\n"},"src/base/FablesBaseHook.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"v4-core/src/libraries/LPFeeLibrary.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {PoolId, PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"v4-core/src/types/BeforeSwapDelta.sol\";\nimport {AccessManaged} from \"@openzeppelin/contracts/access/manager/AccessManaged.sol\";\n\n/// @title FablesBaseHook\n/// @notice Singleton dynamic-fee hook base: per-pool fee caps, an autonomous per-pool fee\n///         supplied by the inheriting contract, and a TTL-bounded poked override on top.\n/// @dev The fee resolves as: poked fee while fresh, otherwise the autonomous fee; always\n///      clamped to the pool's cap. The poke fully replaces the autonomous fee (it can lower\n///      as well as raise) and expires on its own, so the system never depends on an operator\n///      but can always be corrected by one. Uses only the fee-override return of\n///      `beforeSwap` — no delta flags.\nabstract contract FablesBaseHook is AccessManaged {\n    using LPFeeLibrary for uint24;\n    using PoolIdLibrary for PoolKey;\n\n    error NotPoolManager();\n    error NotDynamicFeePool();\n    error NativeNotSupported();\n    error PoolNotConfigured();\n    error FeeAboveCap();\n    error InvalidTtl();\n    error InvalidMaxFee();\n    error FeeBelowFloor();\n\n    event FeePoked(PoolId indexed poolId, uint24 fee, uint40 expiry);\n    event PokeCleared(PoolId indexed poolId);\n\n    struct Poke {\n        uint24 fee;\n        uint40 expiry;\n    }\n\n    /// @notice Longest a poked fee can outlive its transaction.\n    uint40 public constant MAX_POKE_TTL = 72 hours;\n\n    /// @notice Hard ceiling on any pool's fee cap, fixed at deployment. No role can configure\n    ///         or poke a fee above it; changing it means deploying a new singleton.\n    uint24 public immutable ABSOLUTE_MAX_FEE;\n\n    IPoolManager public immutable poolManager;\n\n    /// @notice Per-pool fee cap in pips; zero means the pool is not configured.\n    mapping(PoolId poolId => uint24 cap) public maxFee;\n    /// @notice Most of the live autonomous fee a poke may cut away. A poke is for reacting\n    ///         fast, not for switching the curve off; a mis-classified market day is corrected\n    ///         through the calendar overlay, which is what that overlay exists for.\n    uint16 public constant MAX_POKE_DISCOUNT_BPS = 5000;\n\n    /// @notice Cheapest fee any pool may be configured to charge, fixed in bytecode.\n    uint24 public constant MIN_POOL_FEE = 100; // 0.01%, Uniswap's smallest standard tier\n\n    /// @notice Cheapest fee each pool can charge autonomously — the lower bound on a poke.\n    mapping(PoolId poolId => uint24 floor) public pokeFloor;\n\n    /// @notice Active poked override per pool; ignored once expired.\n    mapping(PoolId poolId => Poke poke) public pokeOf;\n\n    modifier onlyPoolManager() {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        _;\n    }\n\n    constructor(IPoolManager poolManager_, address authority_, uint24 absoluteMaxFee_) AccessManaged(authority_) {\n        if (absoluteMaxFee_ == 0 || absoluteMaxFee_ > LPFeeLibrary.MAX_LP_FEE) revert InvalidMaxFee();\n        ABSOLUTE_MAX_FEE = absoluteMaxFee_;\n        poolManager = poolManager_;\n        Hooks.validateHookPermissions(IHooks(address(this)), _hookPermissions());\n    }\n\n    /// @notice Callback set this hook uses; never includes delta flags.\n    function _hookPermissions() internal pure virtual returns (Hooks.Permissions memory permissions) {\n        permissions.beforeInitialize = true;\n        permissions.beforeSwap = true;\n    }\n\n    /// @notice Whether this hook accepts pools whose currency0 is native ETH. False here and in\n    ///         every ERC20-only hook; a native-capable variant (e.g. `FablesRampETH`) overrides it\n    ///         to true AND carries the payable/settlement machinery that makes native pools work.\n    ///         The flag and the machinery must travel together — flipping this alone would create\n    ///         pools the ledger cannot settle deposits for.\n    function _nativeAllowed() internal pure virtual returns (bool) {\n        return false;\n    }\n\n    /// @notice Pools must use the dynamic-fee flag and be configured before initialization.\n    function beforeInitialize(address, PoolKey calldata key, uint160) external view onlyPoolManager returns (bytes4) {\n        if (!key.fee.isDynamicFee()) revert NotDynamicFeePool();\n        if (maxFee[key.toId()] == 0) revert PoolNotConfigured();\n        // `_checkKey` refuses native currency0, but that guard sits on the ledger paths, not on\n        // the gate that creates the pool — so a native pool could be configured, initialized and\n        // traded with dynamic fees while every deposit, withdraw, stake and claim reverted. A\n        // pool no LP can ever hold a position in should not exist at all. Native-capable variants\n        // opt out via `_nativeAllowed`, whose override is coupled to the settlement machinery.\n        if (key.currency0.isAddressZero() && !_nativeAllowed()) revert NativeNotSupported();\n        return IHooks.beforeInitialize.selector;\n    }\n\n    /// @notice Returns the per-swap fee override; never touches swap deltas.\n    function beforeSwap(address, PoolKey calldata key, IPoolManager.SwapParams calldata params, bytes calldata)\n        external\n        view\n        onlyPoolManager\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        uint24 fee = _resolveFee(key.toId(), params);\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, fee | LPFeeLibrary.OVERRIDE_FEE_FLAG);\n    }\n\n    /// @notice Fee the pool would charge a swap in the given direction right now, in pips.\n    /// @dev Uses a zero-amount probe, so size-dependent components read as zero here.\n    function currentFee(PoolId poolId, bool zeroForOne) external view returns (uint24) {\n        return _resolveFee(\n            poolId, IPoolManager.SwapParams({zeroForOne: zeroForOne, amountSpecified: 0, sqrtPriceLimitX96: 0})\n        );\n    }\n\n    /// @notice Temporarily replaces the autonomous fee for a pool. Expires on its own.\n    /// @dev Bounded on BOTH sides. The ceiling is the pool cap; the floor is the cheapest fee\n    ///      the pool is configured to charge autonomously, so ops can still correct a fee that\n    ///      is wrongly high (a mis-classified market day, say) but cannot go anywhere the pool\n    ///      would not have gone by itself. This role is the one hot key in the system, granted\n    ///      with no execution delay because reacting fast is its whole purpose — which makes it\n    ///      the likeliest to be compromised. Without a floor, whoever held it could set every\n    ///      pool to zero for 72 hours and renew for the price of gas, so LPs earn nothing while\n    ///      arbitrageurs take the pool apart for free. A ceiling alone bounds the wrong end.\n    function pokeFee(PoolId poolId, uint24 fee, uint40 ttl) external restricted {\n        uint24 cap = maxFee[poolId];\n        if (cap == 0) revert PoolNotConfigured();\n        if (fee > cap) revert FeeAboveCap();\n        if (fee < pokeFloor[poolId]) revert FeeBelowFloor();\n        if (ttl == 0 || ttl > MAX_POKE_TTL) revert InvalidTtl();\n        uint40 expiry = uint40(block.timestamp) + ttl;\n        pokeOf[poolId] = Poke({fee: fee, expiry: expiry});\n        emit FeePoked(poolId, fee, expiry);\n    }\n\n    /// @notice Clears an active poke, returning the pool to its autonomous fee.\n    function clearPoke(PoolId poolId) external restricted {\n        delete pokeOf[poolId];\n        emit PokeCleared(poolId);\n    }\n\n    /// @notice Autonomous per-pool fee in pips for a swap, before poke and cap are applied.\n    function _autonomousFee(PoolId poolId, IPoolManager.SwapParams memory params)\n        internal\n        view\n        virtual\n        returns (uint256);\n\n    function _resolveFee(PoolId poolId, IPoolManager.SwapParams memory params) internal view returns (uint24) {\n        uint256 autonomous = _autonomousFee(poolId, params);\n        uint256 fee = autonomous;\n        Poke memory poke = pokeOf[poolId];\n        // second-level timestamp drift is immaterial against a >=1h TTL\n        // forge-lint: disable-next-line(block-timestamp)\n        if (poke.expiry > block.timestamp) {\n            fee = poke.fee;\n            // The poke's bounds are enforced at RESOLUTION, not only when it was set. Checking\n            // once at `pokeFee` left two holes: raising a pool's floor afterwards left a live\n            // poke charging under the new floor for up to 72h, and the static floor said nothing\n            // about the pool's CURRENT fee — so the hot key could pin a pool that its own curve\n            // had ramped to 400bps back down to its 100bps configured floor, renewably, handing\n            // a permanent subsidy to exactly the toxic flow the curve exists to price.\n            uint256 floor_ = pokeFloor[poolId];\n            uint256 discountFloor = (autonomous * (10_000 - MAX_POKE_DISCOUNT_BPS)) / 10_000;\n            if (floor_ < discountFloor) floor_ = discountFloor;\n            if (fee < floor_) fee = floor_;\n        }\n        uint256 cap = maxFee[poolId];\n        if (fee > cap) fee = cap;\n        // casting to 'uint24' is safe: fee is clamped to cap, which _setPoolBounds bounds to MAX_LP_FEE < 2^24\n        // forge-lint: disable-next-line(unsafe-typecast)\n        return uint24(fee);\n    }\n\n    /// @dev Records the pool's bounds. `floor` is the cheapest fee its own curve can produce;\n    ///      it is what a poke may not undercut. Each hook computes it from its own config.\n    function _setPoolBounds(PoolId poolId, uint24 floor, uint24 cap) internal {\n        if (cap == 0 || cap > ABSOLUTE_MAX_FEE) revert InvalidMaxFee();\n        // A lower bound on the CONFIG, not just on the poke. `pokeFee` was carefully bounded on\n        // both sides while the config path — which sets the very floor the poke is measured\n        // against — could be driven to 1 pip on a live pool, draining LPs by the same route the\n        // poke floor exists to block.\n        if (floor < MIN_POOL_FEE || floor > cap) revert InvalidMaxFee();\n        maxFee[poolId] = cap;\n        pokeFloor[poolId] = floor;\n    }\n}\n"},"src/libraries/LedgerLib.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.26;\n\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {PoolIdLibrary} from \"v4-core/src/types/PoolId.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {FullMath} from \"v4-core/src/libraries/FullMath.sol\";\nimport {StateLibrary} from \"v4-core/src/libraries/StateLibrary.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {\n    RangeState,\n    UserPosition,\n    RangeKey,\n    ClaimFeeChange,\n    Action,\n    CallbackData,\n    PayoutData,\n    FeesForgone,\n    FeesCollected,\n    DistributorSwept,\n    ClaimFeeSwept\n} from \"../base/LedgerTypes.sol\";\n\n/// @dev The slice of the distributor the ledger probes when wiring it: the protocol token it must\n///      cache to later refuse. Declared here so `validateDistributor` can run the probe.\ninterface IDistributorFF {\n    function ff() external view returns (address);\n}\n\n/// @title LedgerLib\n/// @notice The fee-collection split for `FablesLedger`. `FablesLedger` is inherited by every hook,\n///         so this cluster (three `FullMath.mulDiv` sites and the staked/claim split) is compiled\n///         into each one. Kept a separate unit purely for organization.\n/// @dev An `internal`-function library, so its code is INLINED into the calling hook (a JUMP, not a\n///      DELEGATECALL). It runs in the hook's own context — `address(this)` is the hook,\n///      `poolManager.mint` mints to the hook, and every write lands in the hook's storage — and the\n///      storage handles it needs are passed by reference. The target chain's ~98,304-byte runtime\n///      limit makes the old EIP-170 delegatecall split unnecessary.\nlibrary LedgerLib {\n    /// @notice A deposit's settled principal exceeded the caller's stated ceiling for that currency.\n    error PrincipalAboveMax(uint256 paid, uint256 max);\n    /// @notice A withdrawal's settled principal fell short of the caller's stated floor.\n    error PrincipalBelowMin(uint256 received, uint256 min);\n\n    using CurrencyLibrary for Currency;\n    using PoolIdLibrary for PoolKey;\n    using SafeERC20 for IERC20;\n\n    /// @dev The ledger's live claim-fee policy, bundled so the unlock callback passes it in one\n    ///      argument. `bps` is the current rate, `allTimeMin` the walk's floor, `recipient` zero\n    ///      when no claim fee is taken.\n    struct ClaimFeeState {\n        uint16 bps;\n        uint16 allTimeMin;\n        address recipient;\n    }\n\n    /// @dev How far back a sync walks the claim-fee rate history; must equal the ledger's own\n    ///      `MAX_CLAIM_FEE_WALK`. Beyond it the all-time minimum is used, which can only charge LESS.\n    uint256 private constant MAX_CLAIM_FEE_WALK = 32;\n    /// @dev Must equal the ledger's own `MAX_CLAIM_FEE_BPS`.\n    uint16 private constant MAX_CLAIM_FEE_BPS = 2000;\n\n    error InvalidClaimFee();\n    error InvalidSink();\n    error DistributorNotFFAware();\n\n    /// @param id The range id being credited (the `FeesCollected` topic).\n    /// @param key The pool key of the range being credited (for the claim mints and currencies).\n    /// @param fee0 Fees realized on currency0 this collection.\n    /// @param fee1 Fees realized on currency1 this collection.\n    /// @param claimFeeBps The ledger's current claim-fee rate (an UPPER bound on what the backlog pays).\n    /// @param claimFeeAllTimeMin The lowest rate the ledger has ever stood at (the walk's fallback).\n    /// @param claimFeeRecipient Zero means no claim fee is taken at all.\n    struct CreditParams {\n        uint256 id;\n        PoolKey key;\n        uint128 fee0;\n        uint128 fee1;\n        uint16 claimFeeBps;\n        uint16 claimFeeAllTimeMin;\n        address claimFeeRecipient;\n    }\n\n    /// @notice The whole fee collection for one range: rolls the claim-fee rate forward, mints the\n    ///         fee claims, splits them between the distributor (voter) bucket and the unstaked\n    ///         accumulators, skims the claim fee, and emits `FeesCollected`. Behaviour is\n    ///         byte-for-byte what lived in the ledger's `_creditFees`.\n    /// @dev Inlined into the hook (internal), so `address(this)` is the hook, `poolManager.mint`\n    ///      mints to the hook, and the passed mappings/array ARE the hook's own storage. Fee tokens\n    ///      are settled as PoolManager claims (never token transfers), so this cannot revert on a\n    ///      hostile token and take a withdrawal down with it.\n    function creditFees(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        mapping(uint256 => uint64) storage claimFeeSyncIndex,\n        ClaimFeeChange[] storage claimFeeHistory,\n        IPoolManager poolManager,\n        CreditParams memory p\n    ) internal {\n        // Roll the range's agreed rate forward FIRST, above every early return: the rate a backlog\n        // is charged is the rate that stood when it started accruing, and this is where that is\n        // knowable. The effective rate is read at the OLD index, then the index moves to the head.\n        uint16 feeBps = claimFeeFor(\n            claimFeeHistory, claimFeeSyncIndex[p.id], p.claimFeeRecipient, p.claimFeeBps, p.claimFeeAllTimeMin\n        );\n        claimFeeSyncIndex[p.id] = uint64(claimFeeHistory.length);\n        if (p.fee0 == 0 && p.fee1 == 0) return;\n        // The mints, split and emit are in `_split` so this frame does not carry the eight storage\n        // handles alongside the split's own locals — the legacy pipeline's stack-too-deep.\n        _split(ranges[p.id], rangeKeys[p.id], distributorOwed, claimFeeOwed, poolManager, p, feeBps);\n    }\n\n    /// @dev The claim mints, the staked/unstaked split and the `FeesCollected` emit for one range\n    ///      with fees. Split off `creditFees` so its frame holds only the two owed mappings it\n    ///      writes, not all eight ledger handles.\n    function _split(\n        RangeState storage range,\n        RangeKey storage descriptor,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        IPoolManager poolManager,\n        CreditParams memory p,\n        uint16 feeBps\n    ) private {\n        // Settle fees as PoolManager claims: exact by construction (immune to a token that later\n        // turns on transfer fees) and, critically, no token contract is called, so this cannot\n        // revert and take the withdraw path down with it. It must happen on every path with fees,\n        // because these claims are how the fee half of `callerDelta` gets resolved.\n        if (p.fee0 > 0) poolManager.mint(address(this), p.key.currency0.toId(), p.fee0);\n        if (p.fee1 > 0) poolManager.mint(address(this), p.key.currency1.toId(), p.fee1);\n\n        uint256 total = range.totalShares;\n        if (total == 0) {\n            // Unreachable: fees imply a position, and a position implies shares. If it ever did\n            // happen the claims are already minted and there is no shareholder to raise an\n            // accumulator for, so the fees go to the voter pot rather than sitting unattributed.\n            distributorOwed[p.key.currency0] += p.fee0;\n            distributorOwed[p.key.currency1] += p.fee1;\n            _emitCollected(range, descriptor, poolManager, EmitArgs(p.id, p.fee0, p.fee1, p.fee0, p.fee1));\n            return;\n        }\n\n        // Carrying the remainder is load-bearing, not tidiness. `_syncRange` is permissionless and\n        // reachable from seven entry points, so ANY party chooses how many windows an epoch's fees\n        // are split across — and a plain floor division contributes exactly zero whenever\n        // `fee * totalStaked < totalShares`. Splitting one accrual into enough windows therefore\n        // drove both the voters' revenue and the staker's emission weight to zero for a few dollars\n        // of gas. The unstaked side was never exposed to this because it is credited in Q128.\n        uint256 stakedCut0 = _takeStakedCut(range, p.fee0, total, true);\n        uint256 stakedCut1 = _takeStakedCut(range, p.fee1, total, false);\n        if (stakedCut0 > 0) distributorOwed[p.key.currency0] += stakedCut0;\n        if (stakedCut1 > 0) distributorOwed[p.key.currency1] += stakedCut1;\n        _creditStaked(range, stakedCut0, stakedCut1);\n\n        uint256 unstakedTotal = total - range.totalStaked;\n        if (unstakedTotal == 0) {\n            // everything is staked: remainder (rounding dust) also goes to the distributor\n            distributorOwed[p.key.currency0] += p.fee0 - stakedCut0;\n            distributorOwed[p.key.currency1] += p.fee1 - stakedCut1;\n            _creditStaked(range, p.fee0 - stakedCut0, p.fee1 - stakedCut1); // the rounding remainder too\n            _emitCollected(range, descriptor, poolManager, EmitArgs(p.id, p.fee0, p.fee1, p.fee0, p.fee1));\n            return;\n        }\n\n        // The claim fee is taken HERE, at the rate in force while these fees were earned, and never\n        // again at claim time. Charging it on withdrawal instead made it retroactive: a single\n        // `setClaimFee` could reach back and take a share of everything every LP had already\n        // accrued under a lower rate. The skim comes off the UNSTAKED residue, after the staked\n        // cut has been set aside, so a voter syncing to fund their own claim never pays for it.\n        uint256 net0 = p.fee0 - stakedCut0;\n        uint256 net1 = p.fee1 - stakedCut1;\n        if (feeBps != 0 && p.claimFeeRecipient != address(0)) {\n            uint256 c0 = (net0 * feeBps) / 10_000;\n            uint256 c1 = (net1 * feeBps) / 10_000;\n            if (c0 > 0) claimFeeOwed[p.key.currency0] += c0;\n            if (c1 > 0) claimFeeOwed[p.key.currency1] += c1;\n            net0 -= c0;\n            net1 -= c1;\n        }\n        range.accFee0X128 += FullMath.mulDiv(net0, 1 << 128, unstakedTotal);\n        range.accFee1X128 += FullMath.mulDiv(net1, 1 << 128, unstakedTotal);\n        _emitCollected(range, descriptor, poolManager, EmitArgs(p.id, p.fee0, p.fee1, stakedCut0, stakedCut1));\n    }\n\n    /// @notice The rate a backlog that opened at history index `sinceIndex` is charged: the LOWEST\n    ///         rate that stood from then until now, capped by the current policy. Held here so both\n    ///         `creditFees` and the hook's consent guard read one definition that cannot drift.\n    /// @dev The minimum (not a time-weighted average, which is not computable from v4's single lump)\n    ///      can never charge an LP a rate the protocol was not advertising while their fees accrued,\n    ///      and it bounds the timing game: waiting can only ever LOWER the rate. Beyond\n    ///      `MAX_CLAIM_FEE_WALK` entries it falls back to the all-time minimum, which cannot\n    ///      overcharge — the direction an approximation here must fail in.\n    function claimFeeFor(\n        ClaimFeeChange[] storage claimFeeHistory,\n        uint64 sinceIndex,\n        address claimFeeRecipient,\n        uint16 claimFeeBps,\n        uint16 claimFeeAllTimeMin\n    ) internal view returns (uint16) {\n        // The backlog opened before this ledger had a claim fee at all, and the rate then was zero.\n        if (sinceIndex == 0) return 0;\n\n        uint16 rate = claimFeeRecipient == address(0) ? 0 : claimFeeBps;\n        uint256 start = uint256(sinceIndex) - 1; // the entry in force when the backlog opened\n        uint256 i = claimFeeHistory.length;\n        uint256 walked = 0;\n        while (i > start && walked < MAX_CLAIM_FEE_WALK) {\n            ClaimFeeChange storage change = claimFeeHistory[i - 1];\n            if (change.bps < rate) rate = change.bps;\n            i--;\n            walked++;\n        }\n        if (i == start) return rate; // the whole window was covered exactly\n\n        // Truncated by the cap. Fall back to the all-time minimum: bounded by definition, and it\n        // CANNOT overcharge — the direction an approximation here has to fail in.\n        uint16 floor_ = claimFeeAllTimeMin;\n        return floor_ < rate ? floor_ : rate;\n    }\n\n    /// @notice Validates a new claim-fee rate, appends it to the history, and returns the updated\n    ///         all-time minimum. The hook writes the `claimFeeBps`/`claimFeeRecipient` value-vars\n    ///         around this call.\n    /// @dev A non-zero rate needs a recipient. The recipient may be neither this hook (the\n    ///      permissionless sweep `take`s to it, so naming the hook destroys the revenue) nor the\n    ///      distributor (which cannot pay FF out as a fee — the same shape `setFFFeeSink` refuses).\n    function recordClaimFee(\n        ClaimFeeChange[] storage claimFeeHistory,\n        uint16 bps,\n        address recipient,\n        address distributor,\n        uint16 currentAllTimeMin\n    ) internal returns (uint16 newAllTimeMin) {\n        if (bps > MAX_CLAIM_FEE_BPS) revert InvalidClaimFee();\n        if (bps != 0 && recipient == address(0)) revert InvalidClaimFee();\n        if (recipient == address(this)) revert InvalidClaimFee();\n        if (recipient != address(0) && recipient == distributor) revert InvalidClaimFee();\n\n        uint256 length = claimFeeHistory.length;\n        uint16 effective = recipient == address(0) ? 0 : bps;\n        // week-granular history; block.timestamp is the ordering key, not a precise clock\n        // forge-lint: disable-next-line(block-timestamp)\n        claimFeeHistory.push(ClaimFeeChange({fromTs: uint64(block.timestamp), bps: effective}));\n        newAllTimeMin = (length == 0 || effective < currentAllTimeMin) ? effective : currentAllTimeMin;\n    }\n\n    /// @notice Validates a new distributor against the FF and claim-fee sinks (a forbidden pairing\n    ///         is reachable in EITHER call ordering, so both setters must reject it), probes it for\n    ///         the protocol token, and returns that token to cache.\n    /// @dev Zero clears the distributor and its cached FF. A live distributor must name the protocol\n    ///      token (so a later sweep can refuse FF): a probe that reverts or answers zero is refused,\n    ///      because a distributor this ledger cannot recognise FF for is one it must not feed.\n    function validateDistributor(address distributor_, address ffFeeSink, address claimFeeRecipient)\n        internal\n        view\n        returns (address distributorFF)\n    {\n        if (distributor_ == address(0)) return address(0);\n        if (distributor_ == ffFeeSink) revert InvalidSink();\n        if (distributor_ == claimFeeRecipient) revert InvalidSink();\n        if (distributor_ == address(this)) revert InvalidSink();\n        try IDistributorFF(distributor_).ff() returns (address ffToken) {\n            if (ffToken == address(0)) revert DistributorNotFFAware();\n            return ffToken;\n        } catch {\n            revert DistributorNotFFAware();\n        }\n    }\n\n    /// @dev The value fields of one `FeesCollected` emit, grouped into memory so the 13-field emit\n    ///      does not carry them all as stack slots (the legacy pipeline's stack-too-deep, the reason\n    ///      this was a separate function in the ledger too).\n    struct EmitArgs {\n        uint256 id;\n        uint256 fee0;\n        uint256 fee1;\n        uint256 cut0;\n        uint256 cut1;\n    }\n\n    /// @notice Emits the zero-fee collection that BRACKETS a liquidity re-base, so settlement always\n    ///         holds a `feeGrowthInside` reading in the fresh base.\n    /// @dev Called by `deposit` right after the pool touch that (re)creates the v4 position — the\n    ///      first instant the new base is readable. Without it, the seam between \"position emptied\"\n    ///      and \"first collection with fees\" carried NO reading in the new base: the next collection\n    ///      compared its growth against a carry still in the OLD base, the split across the re-base\n    ///      was unknowable, and settlement could only credit the whole interval to the epoch the\n    ///      collection landed in — an epoch whichever address forced the collection got to choose\n    ///      (`_syncRange` is reachable from `deposit` with one wei). Emitting the baseline here makes\n    ///      every value-bearing interval same-base by construction: no fees can accrue while the\n    ///      position is empty, and the exit's own sync collected everything before it, so this log\n    ///      carries zero value and exists purely to anchor the base. It consumes a `collectionSeq`\n    ///      like any emission, which is what makes DROPPING it detectable as a sequence gap.\n    function emitRebaseBaseline(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        IPoolManager poolManager,\n        uint256 id\n    ) internal {\n        _emitCollected(ranges[id], rangeKeys[id], poolManager, EmitArgs(id, 0, 0, 0, 0));\n    }\n\n    /// @dev Bumps the collection sequence (H6) and reads v4's live `feeGrowthInside` for the range\n    ///      at the instant of collection, then hands off to `_log`. The growth read and the emit are\n    ///      split into separate frames so the wide 13-field log does not tip the legacy pipeline into\n    ///      stack-too-deep (the reason the ledger split them too).\n    function _emitCollected(\n        RangeState storage range,\n        RangeKey storage descriptor,\n        IPoolManager poolManager,\n        EmitArgs memory e\n    ) private {\n        range.collectionSeq += 1;\n        (uint256 growth0, uint256 growth1) = _growthOf(descriptor, poolManager);\n        _log(e.id, e.fee0, e.fee1, e.cut0, e.cut1, growth0, growth1, range);\n    }\n\n    /// @dev v4's `feeGrowthInside` for a range descriptor, in its own frame so its intermediates do\n    ///      not coexist with the wide emit.\n    function _growthOf(RangeKey storage descriptor, IPoolManager poolManager) private view returns (uint256, uint256) {\n        return\n            StateLibrary.getFeeGrowthInside(\n                poolManager, descriptor.key.toId(), descriptor.tickLower, descriptor.tickUpper\n            );\n    }\n\n    /// @dev The wide emit alone. The value fields arrive as stack params and the range — read six\n    ///      times for its accumulator LEVELS, share totals and sequence anchors — is the LAST param,\n    ///      so it sits shallowest on the stack; that is the eight-slot frame the ledger's own\n    ///      `_emitCollected` used to schedule the 13-field log.\n    function _log(\n        uint256 id,\n        uint256 fee0,\n        uint256 fee1,\n        uint256 cut0,\n        uint256 cut1,\n        uint256 growth0,\n        uint256 growth1,\n        RangeState storage range\n    ) private {\n        emit FeesCollected(\n            id,\n            fee0,\n            fee1,\n            cut0,\n            cut1,\n            range.accStaked0X128,\n            range.accStaked1X128,\n            growth0,\n            growth1,\n            range.totalShares,\n            range.totalStaked,\n            range.collectionSeq,\n            range.resetSeq\n        );\n    }\n\n    /// @dev `fee * staked / total`, plus whatever previous windows could not express. `mulmod`\n    ///      gives the exact remainder without the overflow a plain `fee * staked` would risk. The\n    ///      remainder is carried as a FRACTION of one fee unit (Q128), never as the raw numerator\n    ///      `carried % total`: `total` is `totalShares`, which every withdraw shrinks, so a\n    ///      numerator written under a large denominator would later be spent under a small one and\n    ///      break `cut <= fee`. A fraction of one unit means the same at every denominator, so the\n    ///      carry survives arbitrary share movement and `cut <= fee` holds unconditionally.\n    function _takeStakedCut(RangeState storage range, uint128 fee, uint256 total, bool isToken0)\n        private\n        returns (uint256 cut)\n    {\n        uint128 staked = range.totalStaked;\n        uint256 carried = uint256(isToken0 ? range.stakedResidual0 : range.stakedResidual1)\n            + FullMath.mulDiv(mulmod(fee, staked, total), 1 << 128, total);\n        cut = FullMath.mulDiv(fee, staked, total) + (carried >> 128);\n        // masked to the low 128 bits by construction: `carried < 2^129` and the whole unit, if\n        // any, was just flushed into `cut` on the line above\n        // forge-lint: disable-next-line(unsafe-typecast)\n        uint128 keep = uint128(carried);\n        if (isToken0) range.stakedResidual0 = keep;\n        else range.stakedResidual1 = keep;\n    }\n\n    /// @dev Raises the per-staked-share accumulators by the fees staked shares just forwent.\n    function _creditStaked(RangeState storage range, uint256 cut0, uint256 cut1) private {\n        uint128 staked = range.totalStaked;\n        if (staked == 0) return;\n        if (cut0 > 0) range.accStaked0X128 += FullMath.mulDiv(cut0, 1 << 128, staked);\n        if (cut1 > 0) range.accStaked1X128 += FullMath.mulDiv(cut1, 1 << 128, staked);\n    }\n\n    /// @notice Checkpoints one holder's accrued fees and emission weight against the range's\n    ///         current accumulator levels. Called on every path that changes a holder's share\n    ///         count, so the accrual is always taken at the levels in force before the change.\n    /// @dev The hook's other `FullMath.mulDiv` cluster, kept alongside `creditFees` for organization.\n    ///      `balance` is the holder's ERC-6909 balance, passed by value; the position is mutated in\n    ///      place and `FeesForgone` is emitted with its `LedgerTypes` signature, so the settlement\n    ///      indexer sees the identical event whether the ledger or the library ran it.\n    function settleUser(\n        RangeState storage range,\n        UserPosition storage position,\n        uint256 balance,\n        address owner,\n        uint256 id\n    ) internal {\n        uint256 unstaked = balance - position.staked;\n        if (unstaked != 0) {\n            position.owed0 += uint128(FullMath.mulDiv(unstaked, range.accFee0X128 - position.checkpoint0X128, 1 << 128));\n            position.owed1 += uint128(FullMath.mulDiv(unstaked, range.accFee1X128 - position.checkpoint1X128, 1 << 128));\n        }\n        position.checkpoint0X128 = range.accFee0X128;\n        position.checkpoint1X128 = range.accFee1X128;\n\n        // Emission weight. Staked shares earn nothing here in tokens — they gave these fees to the\n        // voters — but what they gave up is exactly what they are paid emissions for, so it has to\n        // be measured per holder and not merely per range. An out-of-range position accrues zero,\n        // so it can never farm emissions for free.\n        uint128 staked = position.staked;\n        if (staked != 0) {\n            uint256 d0 = FullMath.mulDiv(staked, range.accStaked0X128 - position.stakedCheckpoint0X128, 1 << 128);\n            uint256 d1 = FullMath.mulDiv(staked, range.accStaked1X128 - position.stakedCheckpoint1X128, 1 << 128);\n            if (d0 != 0 || d1 != 0) {\n                position.forgone0 += d0;\n                position.forgone1 += d1;\n                emit FeesForgone(owner, id, d0, d1);\n            }\n        }\n        position.stakedCheckpoint0X128 = range.accStaked0X128;\n        position.stakedCheckpoint1X128 = range.accStaked1X128;\n    }\n\n    /// @notice The PoolManager unlock callback body: a PAYOUT redeems held claims into real tokens,\n    ///         and a MODIFY applies the liquidity delta then settles fees (into the ledger's\n    ///         accumulators) and principal (to/from the user). The hook's `unlockCallback` is a thin\n    ///         shell that checks the caller and calls this; it is inlined, so `address(this)` is the\n    ///         hook throughout and every write lands in the hook's storage.\n    function onUnlock(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        mapping(uint256 => uint64) storage claimFeeSyncIndex,\n        ClaimFeeChange[] storage claimFeeHistory,\n        IPoolManager poolManager,\n        ClaimFeeState memory cf,\n        bytes calldata rawData\n    ) internal returns (bytes memory) {\n        (Action action, bytes memory payload) = abi.decode(rawData, (Action, bytes));\n        if (action == Action.PAYOUT) {\n            PayoutData memory pd = abi.decode(payload, (PayoutData));\n            _redeem(poolManager, pd.currency0, pd.amount0, pd.to);\n            _redeem(poolManager, pd.currency1, pd.amount1, pd.to);\n            return \"\";\n        }\n        _onModify(\n            ranges,\n            rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            claimFeeHistory,\n            poolManager,\n            cf,\n            payload\n        );\n        return \"\";\n    }\n\n    /// @dev The MODIFY arm, in its own frame so the two balance deltas, the fee pair and the\n    ///      principal pair do not coexist with the eight ledger handles.\n    function _onModify(\n        mapping(uint256 => RangeState) storage ranges,\n        mapping(uint256 => RangeKey) storage rangeKeys,\n        mapping(Currency => uint256) storage distributorOwed,\n        mapping(Currency => uint256) storage claimFeeOwed,\n        mapping(uint256 => uint64) storage claimFeeSyncIndex,\n        ClaimFeeChange[] storage claimFeeHistory,\n        IPoolManager poolManager,\n        ClaimFeeState memory cf,\n        bytes memory payload\n    ) private {\n        CallbackData memory data = abi.decode(payload, (CallbackData));\n        (BalanceDelta callerDelta, BalanceDelta feesAccrued) = poolManager.modifyLiquidity(\n            data.key,\n            IPoolManager.ModifyLiquidityParams({\n                tickLower: data.tickLower,\n                tickUpper: data.tickUpper,\n                liquidityDelta: data.liquidityDelta,\n                salt: bytes32(0)\n            }),\n            \"\"\n        );\n\n        // Fees always come to the ledger and are credited using the share totals as they stand\n        // BEFORE this action's mint/burn (callers order it so). Fee amounts are non-negative credits,\n        // computed inline so no extra locals weigh on this frame's stack.\n        creditFees(\n            ranges,\n            rangeKeys,\n            distributorOwed,\n            claimFeeOwed,\n            claimFeeSyncIndex,\n            claimFeeHistory,\n            poolManager,\n            CreditParams({\n                id: uint256(keccak256(abi.encode(data.key.toId(), data.tickLower, data.tickUpper))),\n                key: data.key,\n                // fee deltas are always non-negative credits\n                // forge-lint: disable-next-line(unsafe-typecast)\n                fee0: uint128(uint256(int256(feesAccrued.amount0()))),\n                // forge-lint: disable-next-line(unsafe-typecast)\n                fee1: uint128(uint256(int256(feesAccrued.amount1()))),\n                claimFeeBps: cf.bps,\n                claimFeeAllTimeMin: cf.allTimeMin,\n                claimFeeRecipient: cf.recipient\n            })\n        );\n\n        // Principal = callerDelta minus fees, settled in its own frame so the two deltas do not\n        // coexist with the credit call above.\n        _settlePrincipal(\n            poolManager,\n            data.key,\n            callerDelta,\n            feesAccrued,\n            data.user,\n            data.liquidityDelta,\n            data.amount0Limit,\n            data.amount1Limit\n        );\n    }\n\n    /// @dev Settles both currencies' principal for a modify: `callerDelta - feesAccrued` per side,\n    ///      after checking each side against the caller's stated bound.\n    function _settlePrincipal(\n        IPoolManager poolManager,\n        PoolKey memory key,\n        BalanceDelta callerDelta,\n        BalanceDelta feesAccrued,\n        address user,\n        int256 liquidityDelta,\n        uint128 amount0Limit,\n        uint128 amount1Limit\n    ) private {\n        int128 principal0 = callerDelta.amount0() - feesAccrued.amount0();\n        int128 principal1 = callerDelta.amount1() - feesAccrued.amount1();\n        _checkBound(principal0, liquidityDelta, amount0Limit);\n        _checkBound(principal1, liquidityDelta, amount1Limit);\n        _resolvePrincipal(poolManager, key.currency0, principal0, user);\n        _resolvePrincipal(poolManager, key.currency1, principal1, user);\n    }\n\n    /// @dev The caller's consent, checked against what the price actually decided.\n    ///\n    ///      A `liquidity` figure is not a price: the same liquidity costs `L*(1/sqrt(Pa) -\n    ///      1/sqrt(Pb))` of currency0 with the price at or below the range and `L*(sqrt(Pb) -\n    ///      sqrt(Pa))` of currency1 at or above it, against a roughly even split mid-range. So a\n    ///      price move between signing and execution silently converts the whole position into one\n    ///      leg at a price nobody agreed to — and the pull was previously bounded only by the\n    ///      caller's ERC-20 allowance. Worst on a freshly initialized pool, where there is no\n    ///      liquidity to cross, so walking the price to any target consumes no input and pays no\n    ///      fee: the manipulation is free, not merely cheap, which makes the FIRST deposit into a\n    ///      new pool the highest-value target in the system.\n    ///\n    ///      Checked per currency, in the direction the action moves value:\n    ///        - adding liquidity, the caller PAYS, so the bound is a ceiling;\n    ///        - removing it, the caller RECEIVES, so the bound is a floor.\n    ///      A zero delta is an internal fee sync that moves no principal, and is exempt.\n    function _checkBound(int128 principal, int256 liquidityDelta, uint128 limit) private pure {\n        if (liquidityDelta > 0) {\n            // widen before negating: -int128 panics on type(int128).min\n            // negating a NEGATIVE int128 inside int256 is always positive, so the uint256 cast is exact\n            // forge-lint: disable-next-line(unsafe-typecast)\n            uint256 paid = principal < 0 ? uint256(-int256(principal)) : 0;\n            if (paid > limit) revert PrincipalAboveMax(paid, limit);\n        } else if (liquidityDelta < 0) {\n            // guarded positive on the same line, so the uint256 cast is exact\n            // forge-lint: disable-next-line(unsafe-typecast)\n            uint256 received = principal > 0 ? uint256(int256(principal)) : 0;\n            if (received < limit) revert PrincipalBelowMin(received, limit);\n        }\n    }\n\n    /// @dev Redeems held claims into real tokens for `to`. Kept off the withdraw path.\n    function _redeem(IPoolManager poolManager, Currency currency, uint256 amount, address to) private {\n        if (amount == 0) return;\n        poolManager.burn(address(this), currency.toId(), amount);\n        poolManager.take(currency, to, amount);\n    }\n\n    /// @notice Burns the ledger's claims and pays `to` in real tokens, via a PAYOUT unlock. A\n    ///         failure here (paused/blocklisted token, blocked recipient) affects only this claim,\n    ///         never principal. The hook's `_payout` is a one-line call into this.\n    function payout(\n        IPoolManager poolManager,\n        Currency currency0,\n        Currency currency1,\n        uint256 amount0,\n        uint256 amount1,\n        address to\n    ) internal {\n        if (amount0 == 0 && amount1 == 0) return;\n        poolManager.unlock(\n            abi.encode(Action.PAYOUT, abi.encode(PayoutData(currency0, currency1, amount0, amount1, to)))\n        );\n    }\n\n    /// @notice Pushes a currency's accrued staked-share revenue to the distributor — or, for the\n    ///         protocol token, to the dedicated FF sink, since the epoch distributor treats every FF\n    ///         it holds as the emission tranche and would strand fee revenue arriving there.\n    function sweepDistributor(\n        mapping(Currency => uint256) storage distributorOwed,\n        IPoolManager poolManager,\n        Currency currency,\n        address distributor,\n        address distributorFF,\n        address ffFeeSink\n    ) internal {\n        uint256 amount = distributorOwed[currency];\n        if (amount == 0) return;\n        address to = Currency.unwrap(currency) == distributorFF ? ffFeeSink : distributor;\n        if (to == address(0)) return; // unset sink: the accrual simply keeps waiting\n        distributorOwed[currency] = 0;\n        payout(poolManager, currency, currency, amount, 0, to);\n        emit DistributorSwept(currency, to, amount);\n    }\n\n    /// @notice Pushes a currency's accrued claim-fee revenue to the recipient. Pull-shaped: a\n    ///         blocked recipient cannot wedge anyone else's sweep.\n    function sweepClaimFee(\n        mapping(Currency => uint256) storage claimFeeOwed,\n        IPoolManager poolManager,\n        Currency currency,\n        address claimFeeRecipient\n    ) internal {\n        uint256 amount = claimFeeOwed[currency];\n        if (claimFeeRecipient == address(0) || amount == 0) return;\n        claimFeeOwed[currency] = 0;\n        payout(poolManager, currency, currency, amount, 0, claimFeeRecipient);\n        emit ClaimFeeSwept(currency, claimFeeRecipient, amount);\n    }\n\n    /// @dev Settles one currency's principal: a negative delta is owed BY the user (pulled and\n    ///      settled to the pool manager), a positive delta is paid TO the user.\n    function _resolvePrincipal(IPoolManager poolManager, Currency currency, int128 amount, address user) private {\n        if (amount < 0) {\n            // widen before negating: -int128 panics on type(int128).min; the negation of a negative\n            // int128 is always a positive int256, so the uint256 cast is exact\n            // forge-lint: disable-next-line(unsafe-typecast)\n            uint256 owed = uint256(-int256(amount));\n            // Sync FIRST for both branches — the CurrencySettler-canonical order. For native it\n            // clears the synced-currency slot so `settle` reads the attached value; skipping it\n            // and relying on \"no ERC20 was synced yet this unlock\" would make correctness hinge\n            // on resolution ORDER (native leg before ERC20 leg), a coupling nobody would see.\n            poolManager.sync(currency);\n            if (currency.isAddressZero()) {\n                // The hook prepaid: `deposit` requires `msg.value >= amount0Max` and `_checkBound`\n                // caps `owed` at `amount0Max`, so the balance this spends from can never be short.\n                // Only a native-capable hook can reach here — every other hook's `_checkKey`\n                // refuses native pools before an unlock is ever taken.\n                poolManager.settle{value: owed}();\n            } else {\n                IERC20(Currency.unwrap(currency)).safeTransferFrom(user, address(poolManager), owed);\n                poolManager.settle();\n            }\n        } else if (amount > 0) {\n            // `take` moves native and ERC20 alike — the PoolManager itself pays the recipient.\n            // forge-lint: disable-next-line(unsafe-typecast)\n            poolManager.take(currency, user, uint256(uint128(amount)));\n        }\n    }\n}\n"},"lib/v4-core/src/types/PoolId.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"./PoolKey.sol\";\n\ntype PoolId is bytes32;\n\n/// @notice Library for computing the ID of a pool\nlibrary PoolIdLibrary {\n    /// @notice Returns value equal to keccak256(abi.encode(poolKey))\n    function toId(PoolKey memory poolKey) internal pure returns (PoolId poolId) {\n        assembly (\"memory-safe\") {\n            // 0xa0 represents the total size of the poolKey struct (5 slots of 32 bytes)\n            poolId := keccak256(poolKey, 0xa0)\n        }\n    }\n}\n"},"lib/v4-core/src/types/PoolKey.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"./Currency.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {PoolIdLibrary} from \"./PoolId.sol\";\n\nusing PoolIdLibrary for PoolKey global;\n\n/// @notice Returns the key for identifying a pool\nstruct PoolKey {\n    /// @notice The lower currency of the pool, sorted numerically\n    Currency currency0;\n    /// @notice The higher currency of the pool, sorted numerically\n    Currency currency1;\n    /// @notice The pool LP fee, capped at 1_000_000. If the highest bit is 1, the pool has a dynamic fee and must be exactly equal to 0x800000\n    uint24 fee;\n    /// @notice Ticks that involve positions must be a multiple of tick spacing\n    int24 tickSpacing;\n    /// @notice The hooks of the pool\n    IHooks hooks;\n}\n"},"lib/v4-core/src/types/Currency.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\nimport {CustomRevert} from \"../libraries/CustomRevert.sol\";\n\ntype Currency is address;\n\nusing {greaterThan as >, lessThan as <, greaterThanOrEqualTo as >=, equals as ==} for Currency global;\nusing CurrencyLibrary for Currency global;\n\nfunction equals(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) == Currency.unwrap(other);\n}\n\nfunction greaterThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) > Currency.unwrap(other);\n}\n\nfunction lessThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) < Currency.unwrap(other);\n}\n\nfunction greaterThanOrEqualTo(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) >= Currency.unwrap(other);\n}\n\n/// @title CurrencyLibrary\n/// @dev This library allows for transferring and holding native tokens and ERC20 tokens\nlibrary CurrencyLibrary {\n    /// @notice Additional context for ERC-7751 wrapped error when a native transfer fails\n    error NativeTransferFailed();\n\n    /// @notice Additional context for ERC-7751 wrapped error when an ERC20 transfer fails\n    error ERC20TransferFailed();\n\n    /// @notice A constant to represent the native currency\n    Currency public constant ADDRESS_ZERO = Currency.wrap(address(0));\n\n    function transfer(Currency currency, address to, uint256 amount) internal {\n        // altered from https://github.com/transmissions11/solmate/blob/44a9963d4c78111f77caa0e65d677b8b46d6f2e6/src/utils/SafeTransferLib.sol\n        // modified custom error selectors\n\n        bool success;\n        if (currency.isAddressZero()) {\n            assembly (\"memory-safe\") {\n                // Transfer the ETH and revert if it fails.\n                success := call(gas(), to, amount, 0, 0, 0, 0)\n            }\n            // revert with NativeTransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(to, bytes4(0), NativeTransferFailed.selector);\n            }\n        } else {\n            assembly (\"memory-safe\") {\n                // Get a pointer to some free memory.\n                let fmp := mload(0x40)\n\n                // Write the abi-encoded calldata into memory, beginning with the function selector.\n                mstore(fmp, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n                mstore(add(fmp, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the \"to\" argument.\n                mstore(add(fmp, 36), amount) // Append the \"amount\" argument. Masking not required as it's a full 32 byte type.\n\n                success :=\n                    and(\n                        // Set success to whether the call reverted, if not we check it either\n                        // returned exactly 1 (can't just be non-zero data), or had no return data.\n                        or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n                        // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n                        // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n                        // Counterintuitively, this call must be positioned second to the or() call in the\n                        // surrounding and() call or else returndatasize() will be zero during the computation.\n                        call(gas(), currency, 0, fmp, 68, 0, 32)\n                    )\n\n                // Now clean the memory we used\n                mstore(fmp, 0) // 4 byte `selector` and 28 bytes of `to` were stored here\n                mstore(add(fmp, 0x20), 0) // 4 bytes of `to` and 28 bytes of `amount` were stored here\n                mstore(add(fmp, 0x40), 0) // 4 bytes of `amount` were stored here\n            }\n            // revert with ERC20TransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(\n                    Currency.unwrap(currency), IERC20Minimal.transfer.selector, ERC20TransferFailed.selector\n                );\n            }\n        }\n    }\n\n    function balanceOfSelf(Currency currency) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return address(this).balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(address(this));\n        }\n    }\n\n    function balanceOf(Currency currency, address owner) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return owner.balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(owner);\n        }\n    }\n\n    function isAddressZero(Currency currency) internal pure returns (bool) {\n        return Currency.unwrap(currency) == Currency.unwrap(ADDRESS_ZERO);\n    }\n\n    function toId(Currency currency) internal pure returns (uint256) {\n        return uint160(Currency.unwrap(currency));\n    }\n\n    // If the upper 12 bytes are non-zero, they will be zero-ed out\n    // Therefore, fromId() and toId() are not inverses of each other\n    function fromId(uint256 id) internal pure returns (Currency) {\n        return Currency.wrap(address(uint160(id)));\n    }\n}\n"},"lib/v4-core/src/libraries/Hooks.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\nimport {LPFeeLibrary} from \"./LPFeeLibrary.sol\";\nimport {BalanceDelta, toBalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ParseBytes} from \"./ParseBytes.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\nlibrary Hooks {\n    using LPFeeLibrary for uint24;\n    using Hooks for IHooks;\n    using SafeCast for int256;\n    using BeforeSwapDeltaLibrary for BeforeSwapDelta;\n    using ParseBytes for bytes;\n    using CustomRevert for bytes4;\n\n    uint160 internal constant ALL_HOOK_MASK = uint160((1 << 14) - 1);\n\n    uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;\n    uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;\n\n    uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;\n\n    uint160 internal constant BEFORE_REMOVE_LIQUIDITY_FLAG = 1 << 9;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_FLAG = 1 << 8;\n\n    uint160 internal constant BEFORE_SWAP_FLAG = 1 << 7;\n    uint160 internal constant AFTER_SWAP_FLAG = 1 << 6;\n\n    uint160 internal constant BEFORE_DONATE_FLAG = 1 << 5;\n    uint160 internal constant AFTER_DONATE_FLAG = 1 << 4;\n\n    uint160 internal constant BEFORE_SWAP_RETURNS_DELTA_FLAG = 1 << 3;\n    uint160 internal constant AFTER_SWAP_RETURNS_DELTA_FLAG = 1 << 2;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 1;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 0;\n\n    struct Permissions {\n        bool beforeInitialize;\n        bool afterInitialize;\n        bool beforeAddLiquidity;\n        bool afterAddLiquidity;\n        bool beforeRemoveLiquidity;\n        bool afterRemoveLiquidity;\n        bool beforeSwap;\n        bool afterSwap;\n        bool beforeDonate;\n        bool afterDonate;\n        bool beforeSwapReturnDelta;\n        bool afterSwapReturnDelta;\n        bool afterAddLiquidityReturnDelta;\n        bool afterRemoveLiquidityReturnDelta;\n    }\n\n    /// @notice Thrown if the address will not lead to the specified hook calls being called\n    /// @param hooks The address of the hooks contract\n    error HookAddressNotValid(address hooks);\n\n    /// @notice Hook did not return its selector\n    error InvalidHookResponse();\n\n    /// @notice Additional context for ERC-7751 wrapped error when a hook call fails\n    error HookCallFailed();\n\n    /// @notice The hook's delta changed the swap from exactIn to exactOut or vice versa\n    error HookDeltaExceedsSwapAmount();\n\n    /// @notice Utility function intended to be used in hook constructors to ensure\n    /// the deployed hooks address causes the intended hooks to be called\n    /// @param permissions The hooks that are intended to be called\n    /// @dev permissions param is memory as the function will be called from constructors\n    function validateHookPermissions(IHooks self, Permissions memory permissions) internal pure {\n        if (\n            permissions.beforeInitialize != self.hasPermission(BEFORE_INITIALIZE_FLAG)\n                || permissions.afterInitialize != self.hasPermission(AFTER_INITIALIZE_FLAG)\n                || permissions.beforeAddLiquidity != self.hasPermission(BEFORE_ADD_LIQUIDITY_FLAG)\n                || permissions.afterAddLiquidity != self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG)\n                || permissions.beforeRemoveLiquidity != self.hasPermission(BEFORE_REMOVE_LIQUIDITY_FLAG)\n                || permissions.afterRemoveLiquidity != self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)\n                || permissions.beforeSwap != self.hasPermission(BEFORE_SWAP_FLAG)\n                || permissions.afterSwap != self.hasPermission(AFTER_SWAP_FLAG)\n                || permissions.beforeDonate != self.hasPermission(BEFORE_DONATE_FLAG)\n                || permissions.afterDonate != self.hasPermission(AFTER_DONATE_FLAG)\n                || permissions.beforeSwapReturnDelta != self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)\n                || permissions.afterSwapReturnDelta != self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)\n                || permissions.afterAddLiquidityReturnDelta != self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)\n                || permissions.afterRemoveLiquidityReturnDelta\n                    != self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n        ) {\n            HookAddressNotValid.selector.revertWith(address(self));\n        }\n    }\n\n    /// @notice Ensures that the hook address includes at least one hook flag or dynamic fees, or is the 0 address\n    /// @param self The hook to verify\n    /// @param fee The fee of the pool the hook is used with\n    /// @return bool True if the hook address is valid\n    function isValidHookAddress(IHooks self, uint24 fee) internal pure returns (bool) {\n        // The hook can only have a flag to return a hook delta on an action if it also has the corresponding action flag\n        if (!self.hasPermission(BEFORE_SWAP_FLAG) && self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)) return false;\n        if (!self.hasPermission(AFTER_SWAP_FLAG) && self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)) return false;\n        if (!self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG) && self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG))\n        {\n            return false;\n        }\n        if (\n            !self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)\n                && self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n        ) return false;\n\n        // If there is no hook contract set, then fee cannot be dynamic\n        // If a hook contract is set, it must have at least 1 flag set, or have a dynamic fee\n        return address(self) == address(0)\n            ? !fee.isDynamicFee()\n            : (uint160(address(self)) & ALL_HOOK_MASK > 0 || fee.isDynamicFee());\n    }\n\n    /// @notice performs a hook call using the given calldata on the given hook that doesn't return a delta\n    /// @return result The complete data returned by the hook\n    function callHook(IHooks self, bytes memory data) internal returns (bytes memory result) {\n        bool success;\n        assembly (\"memory-safe\") {\n            success := call(gas(), self, 0, add(data, 0x20), mload(data), 0, 0)\n        }\n        // Revert with FailedHookCall, containing any error message to bubble up\n        if (!success) CustomRevert.bubbleUpAndRevertWith(address(self), bytes4(data), HookCallFailed.selector);\n\n        // The call was successful, fetch the returned data\n        assembly (\"memory-safe\") {\n            // allocate result byte array from the free memory pointer\n            result := mload(0x40)\n            // store new free memory pointer at the end of the array padded to 32 bytes\n            mstore(0x40, add(result, and(add(returndatasize(), 0x3f), not(0x1f))))\n            // store length in memory\n            mstore(result, returndatasize())\n            // copy return data to result\n            returndatacopy(add(result, 0x20), 0, returndatasize())\n        }\n\n        // Length must be at least 32 to contain the selector. Check expected selector and returned selector match.\n        if (result.length < 32 || result.parseSelector() != data.parseSelector()) {\n            InvalidHookResponse.selector.revertWith();\n        }\n    }\n\n    /// @notice performs a hook call using the given calldata on the given hook\n    /// @return int256 The delta returned by the hook\n    function callHookWithReturnDelta(IHooks self, bytes memory data, bool parseReturn) internal returns (int256) {\n        bytes memory result = callHook(self, data);\n\n        // If this hook wasn't meant to return something, default to 0 delta\n        if (!parseReturn) return 0;\n\n        // A length of 64 bytes is required to return a bytes4, and a 32 byte delta\n        if (result.length != 64) InvalidHookResponse.selector.revertWith();\n        return result.parseReturnDelta();\n    }\n\n    /// @notice modifier to prevent calling a hook if they initiated the action\n    modifier noSelfCall(IHooks self) {\n        if (msg.sender != address(self)) {\n            _;\n        }\n    }\n\n    /// @notice calls beforeInitialize hook if permissioned and validates return value\n    function beforeInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96) internal noSelfCall(self) {\n        if (self.hasPermission(BEFORE_INITIALIZE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeInitialize, (msg.sender, key, sqrtPriceX96)));\n        }\n    }\n\n    /// @notice calls afterInitialize hook if permissioned and validates return value\n    function afterInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96, int24 tick)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(AFTER_INITIALIZE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.afterInitialize, (msg.sender, key, sqrtPriceX96, tick)));\n        }\n    }\n\n    /// @notice calls beforeModifyLiquidity hook if permissioned and validates return value\n    function beforeModifyLiquidity(\n        IHooks self,\n        PoolKey memory key,\n        IPoolManager.ModifyLiquidityParams memory params,\n        bytes calldata hookData\n    ) internal noSelfCall(self) {\n        if (params.liquidityDelta > 0 && self.hasPermission(BEFORE_ADD_LIQUIDITY_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeAddLiquidity, (msg.sender, key, params, hookData)));\n        } else if (params.liquidityDelta <= 0 && self.hasPermission(BEFORE_REMOVE_LIQUIDITY_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeRemoveLiquidity, (msg.sender, key, params, hookData)));\n        }\n    }\n\n    /// @notice calls afterModifyLiquidity hook if permissioned and validates return value\n    function afterModifyLiquidity(\n        IHooks self,\n        PoolKey memory key,\n        IPoolManager.ModifyLiquidityParams memory params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) internal returns (BalanceDelta callerDelta, BalanceDelta hookDelta) {\n        if (msg.sender == address(self)) return (delta, BalanceDeltaLibrary.ZERO_DELTA);\n\n        callerDelta = delta;\n        if (params.liquidityDelta > 0) {\n            if (self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG)) {\n                hookDelta = BalanceDelta.wrap(\n                    self.callHookWithReturnDelta(\n                        abi.encodeCall(\n                            IHooks.afterAddLiquidity, (msg.sender, key, params, delta, feesAccrued, hookData)\n                        ),\n                        self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)\n                    )\n                );\n                callerDelta = callerDelta - hookDelta;\n            }\n        } else {\n            if (self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)) {\n                hookDelta = BalanceDelta.wrap(\n                    self.callHookWithReturnDelta(\n                        abi.encodeCall(\n                            IHooks.afterRemoveLiquidity, (msg.sender, key, params, delta, feesAccrued, hookData)\n                        ),\n                        self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n                    )\n                );\n                callerDelta = callerDelta - hookDelta;\n            }\n        }\n    }\n\n    /// @notice calls beforeSwap hook if permissioned and validates return value\n    function beforeSwap(IHooks self, PoolKey memory key, IPoolManager.SwapParams memory params, bytes calldata hookData)\n        internal\n        returns (int256 amountToSwap, BeforeSwapDelta hookReturn, uint24 lpFeeOverride)\n    {\n        amountToSwap = params.amountSpecified;\n        if (msg.sender == address(self)) return (amountToSwap, BeforeSwapDeltaLibrary.ZERO_DELTA, lpFeeOverride);\n\n        if (self.hasPermission(BEFORE_SWAP_FLAG)) {\n            bytes memory result = callHook(self, abi.encodeCall(IHooks.beforeSwap, (msg.sender, key, params, hookData)));\n\n            // A length of 96 bytes is required to return a bytes4, a 32 byte delta, and an LP fee\n            if (result.length != 96) InvalidHookResponse.selector.revertWith();\n\n            // dynamic fee pools that want to override the cache fee, return a valid fee with the override flag. If override flag\n            // is set but an invalid fee is returned, the transaction will revert. Otherwise the current LP fee will be used\n            if (key.fee.isDynamicFee()) lpFeeOverride = result.parseFee();\n\n            // skip this logic for the case where the hook return is 0\n            if (self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)) {\n                hookReturn = BeforeSwapDelta.wrap(result.parseReturnDelta());\n\n                // any return in unspecified is passed to the afterSwap hook for handling\n                int128 hookDeltaSpecified = hookReturn.getSpecifiedDelta();\n\n                // Update the swap amount according to the hook's return, and check that the swap type doesn't change (exact input/output)\n                if (hookDeltaSpecified != 0) {\n                    bool exactInput = amountToSwap < 0;\n                    amountToSwap += hookDeltaSpecified;\n                    if (exactInput ? amountToSwap > 0 : amountToSwap < 0) {\n                        HookDeltaExceedsSwapAmount.selector.revertWith();\n                    }\n                }\n            }\n        }\n    }\n\n    /// @notice calls afterSwap hook if permissioned and validates return value\n    function afterSwap(\n        IHooks self,\n        PoolKey memory key,\n        IPoolManager.SwapParams memory params,\n        BalanceDelta swapDelta,\n        bytes calldata hookData,\n        BeforeSwapDelta beforeSwapHookReturn\n    ) internal returns (BalanceDelta, BalanceDelta) {\n        if (msg.sender == address(self)) return (swapDelta, BalanceDeltaLibrary.ZERO_DELTA);\n\n        int128 hookDeltaSpecified = beforeSwapHookReturn.getSpecifiedDelta();\n        int128 hookDeltaUnspecified = beforeSwapHookReturn.getUnspecifiedDelta();\n\n        if (self.hasPermission(AFTER_SWAP_FLAG)) {\n            hookDeltaUnspecified += self.callHookWithReturnDelta(\n                abi.encodeCall(IHooks.afterSwap, (msg.sender, key, params, swapDelta, hookData)),\n                self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)\n            ).toInt128();\n        }\n\n        BalanceDelta hookDelta;\n        if (hookDeltaUnspecified != 0 || hookDeltaSpecified != 0) {\n            hookDelta = (params.amountSpecified < 0 == params.zeroForOne)\n                ? toBalanceDelta(hookDeltaSpecified, hookDeltaUnspecified)\n                : toBalanceDelta(hookDeltaUnspecified, hookDeltaSpecified);\n\n            // the caller has to pay for (or receive) the hook's delta\n            swapDelta = swapDelta - hookDelta;\n        }\n        return (swapDelta, hookDelta);\n    }\n\n    /// @notice calls beforeDonate hook if permissioned and validates return value\n    function beforeDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(BEFORE_DONATE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeDonate, (msg.sender, key, amount0, amount1, hookData)));\n        }\n    }\n\n    /// @notice calls afterDonate hook if permissioned and validates return value\n    function afterDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(AFTER_DONATE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.afterDonate, (msg.sender, key, amount0, amount1, hookData)));\n        }\n    }\n\n    function hasPermission(IHooks self, uint160 flag) internal pure returns (bool) {\n        return uint160(address(self)) & flag != 0;\n    }\n}\n"},"lib/v4-core/src/interfaces/IHooks.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {IPoolManager} from \"./IPoolManager.sol\";\nimport {BeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\n/// See the Hooks library for the full spec.\n/// @dev Should only be callable by the v4 PoolManager.\ninterface IHooks {\n    /// @notice The hook called before the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @return bytes4 The function selector for the hook\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96) external returns (bytes4);\n\n    /// @notice The hook called after the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @param tick The current tick after the state of a pool is initialized\n    /// @return bytes4 The function selector for the hook\n    function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n        external\n        returns (bytes4);\n\n    /// @notice The hook called before liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param delta The caller's balance delta after adding liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param delta The caller's balance delta after removing liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BeforeSwapDelta The hook's delta in specified and unspecified currencies. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    /// @return uint24 Optionally override the lp fee, only used if three conditions are met: 1. the Pool has a dynamic fee, 2. the value's 2nd highest bit is set (23rd bit, 0x400000), and 3. the value is less than or equal to the maximum fee (1 million)\n    function beforeSwap(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.SwapParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4, BeforeSwapDelta, uint24);\n\n    /// @notice The hook called after a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param delta The amount owed to the caller (positive) or owed to the pool (negative)\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return int128 The hook's delta in unspecified currency. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        IPoolManager.SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external returns (bytes4, int128);\n\n    /// @notice The hook called before donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function afterDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n}\n"},"lib/v4-core/src/libraries/FullMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n    function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = a * b\n            // Compute the product mod 2**256 and mod 2**256 - 1\n            // then use the Chinese Remainder Theorem to reconstruct\n            // the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2**256 + prod0\n            uint256 prod0 = a * b; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly (\"memory-safe\") {\n                let mm := mulmod(a, b, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Make sure the result is less than 2**256.\n            // Also prevents denominator == 0\n            require(denominator > prod1);\n\n            // Handle non-overflow cases, 256 by 256 division\n            if (prod1 == 0) {\n                assembly (\"memory-safe\") {\n                    result := div(prod0, denominator)\n                }\n                return result;\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0]\n            // Compute remainder using mulmod\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                remainder := mulmod(a, b, denominator)\n            }\n            // Subtract 256 bit number from 512 bit number\n            assembly (\"memory-safe\") {\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator\n            // Compute largest power of two divisor of denominator.\n            // Always >= 1.\n            uint256 twos = (0 - denominator) & denominator;\n            // Divide denominator by power of two\n            assembly (\"memory-safe\") {\n                denominator := div(denominator, twos)\n            }\n\n            // Divide [prod1 prod0] by the factors of two\n            assembly (\"memory-safe\") {\n                prod0 := div(prod0, twos)\n            }\n            // Shift in bits from prod1 into prod0. For this we need\n            // to flip `twos` such that it is 2**256 / twos.\n            // If twos is zero, then it becomes one\n            assembly (\"memory-safe\") {\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2**256\n            // Now that denominator is an odd number, it has an inverse\n            // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n            // Compute the inverse by starting with a seed that is correct\n            // correct for four bits. That is, denominator * inv = 1 mod 2**4\n            uint256 inv = (3 * denominator) ^ 2;\n            // Now use Newton-Raphson iteration to improve the precision.\n            // Thanks to Hensel's lifting lemma, this also works in modular\n            // arithmetic, doubling the correct bits in each step.\n            inv *= 2 - denominator * inv; // inverse mod 2**8\n            inv *= 2 - denominator * inv; // inverse mod 2**16\n            inv *= 2 - denominator * inv; // inverse mod 2**32\n            inv *= 2 - denominator * inv; // inverse mod 2**64\n            inv *= 2 - denominator * inv; // inverse mod 2**128\n            inv *= 2 - denominator * inv; // inverse mod 2**256\n\n            // Because the division is now exact we can divide by multiplying\n            // with the modular inverse of denominator. This will give us the\n            // correct result modulo 2**256. Since the preconditions guarantee\n            // that the outcome is less than 2**256, this is the final result.\n            // We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inv;\n            return result;\n        }\n    }\n\n    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            result = mulDiv(a, b, denominator);\n            if (mulmod(a, b, denominator) != 0) {\n                require(++result > 0);\n            }\n        }\n    }\n}\n"},"lib/v4-core/src/libraries/Position.sol":{"content":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {FixedPoint128} from \"./FixedPoint128.sol\";\nimport {LiquidityMath} from \"./LiquidityMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n    using CustomRevert for bytes4;\n\n    /// @notice Cannot update a position with no liquidity\n    error CannotUpdateEmptyPosition();\n\n    // info stored for each user's position\n    struct State {\n        // the amount of liquidity owned by this position\n        uint128 liquidity;\n        // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n        uint256 feeGrowthInside0LastX128;\n        uint256 feeGrowthInside1LastX128;\n    }\n\n    /// @notice Returns the State struct of a position, given an owner and position boundaries\n    /// @param self The mapping containing all user positions\n    /// @param owner The address of the position owner\n    /// @param tickLower The lower tick boundary of the position\n    /// @param tickUpper The upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range\n    /// @return position The position info struct of the given owners' position\n    function get(mapping(bytes32 => State) storage self, address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        view\n        returns (State storage position)\n    {\n        bytes32 positionKey = calculatePositionKey(owner, tickLower, tickUpper, salt);\n        position = self[positionKey];\n    }\n\n    /// @notice A helper function to calculate the position key\n    /// @param owner The address of the position owner\n    /// @param tickLower the lower tick boundary of the position\n    /// @param tickUpper the upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range, by the same owner. Passed in by the caller.\n    function calculatePositionKey(address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        pure\n        returns (bytes32 positionKey)\n    {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(add(fmp, 0x26), salt) // [0x26, 0x46)\n            mstore(add(fmp, 0x06), tickUpper) // [0x23, 0x26)\n            mstore(add(fmp, 0x03), tickLower) // [0x20, 0x23)\n            mstore(fmp, owner) // [0x0c, 0x20)\n            positionKey := keccak256(add(fmp, 0x0c), 0x3a) // len is 58 bytes\n\n            // now clean the memory we used\n            mstore(add(fmp, 0x40), 0) // fmp+0x40 held salt\n            mstore(add(fmp, 0x20), 0) // fmp+0x20 held tickLower, tickUpper, salt\n            mstore(fmp, 0) // fmp held owner\n        }\n    }\n\n    /// @notice Credits accumulated fees to a user's position\n    /// @param self The individual position to update\n    /// @param liquidityDelta The change in pool liquidity as a result of the position update\n    /// @param feeGrowthInside0X128 The all-time fee growth in currency0, per unit of liquidity, inside the position's tick boundaries\n    /// @param feeGrowthInside1X128 The all-time fee growth in currency1, per unit of liquidity, inside the position's tick boundaries\n    /// @return feesOwed0 The amount of currency0 owed to the position owner\n    /// @return feesOwed1 The amount of currency1 owed to the position owner\n    function update(\n        State storage self,\n        int128 liquidityDelta,\n        uint256 feeGrowthInside0X128,\n        uint256 feeGrowthInside1X128\n    ) internal returns (uint256 feesOwed0, uint256 feesOwed1) {\n        uint128 liquidity = self.liquidity;\n\n        if (liquidityDelta == 0) {\n            // disallow pokes for 0 liquidity positions\n            if (liquidity == 0) CannotUpdateEmptyPosition.selector.revertWith();\n        } else {\n            self.liquidity = LiquidityMath.addDelta(liquidity, liquidityDelta);\n        }\n\n        // calculate accumulated fees. overflow in the subtraction of fee growth is expected\n        unchecked {\n            feesOwed0 =\n                FullMath.mulDiv(feeGrowthInside0X128 - self.feeGrowthInside0LastX128, liquidity, FixedPoint128.Q128);\n            feesOwed1 =\n                FullMath.mulDiv(feeGrowthInside1X128 - self.feeGrowthInside1LastX128, liquidity, FixedPoint128.Q128);\n        }\n\n        // update the position\n        self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n        self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    }\n}\n"},"lib/v4-core/src/libraries/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n    using CustomRevert for bytes4;\n\n    error SafeCastOverflow();\n\n    /// @notice Cast a uint256 to a uint160, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint160\n    function toUint160(uint256 x) internal pure returns (uint160 y) {\n        y = uint160(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a uint128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint128\n    function toUint128(uint256 x) internal pure returns (uint128 y) {\n        y = uint128(x);\n        if (x != y) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a int128 to a uint128, revert on overflow or underflow\n    /// @param x The int128 to be casted\n    /// @return y The casted integer, now type uint128\n    function toUint128(int128 x) internal pure returns (uint128 y) {\n        if (x < 0) SafeCastOverflow.selector.revertWith();\n        y = uint128(x);\n    }\n\n    /// @notice Cast a int256 to a int128, revert on overflow or underflow\n    /// @param x The int256 to be downcasted\n    /// @return y The downcasted integer, now type int128\n    function toInt128(int256 x) internal pure returns (int128 y) {\n        y = int128(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int256, revert on overflow\n    /// @param x The uint256 to be casted\n    /// @return y The casted integer, now type int256\n    function toInt256(uint256 x) internal pure returns (int256 y) {\n        y = int256(x);\n        if (y < 0) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return The downcasted integer, now type int128\n    function toInt128(uint256 x) internal pure returns (int128) {\n        if (x >= 1 << 127) SafeCastOverflow.selector.revertWith();\n        return int128(int256(x));\n    }\n}\n"},"lib/v4-core/src/types/BalanceDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\n\n/// @dev Two `int128` values packed into a single `int256` where the upper 128 bits represent the amount0\n/// and the lower 128 bits represent the amount1.\ntype BalanceDelta is int256;\n\nusing {add as +, sub as -, eq as ==, neq as !=} for BalanceDelta global;\nusing BalanceDeltaLibrary for BalanceDelta global;\nusing SafeCast for int256;\n\nfunction toBalanceDelta(int128 _amount0, int128 _amount1) pure returns (BalanceDelta balanceDelta) {\n    assembly (\"memory-safe\") {\n        balanceDelta := or(shl(128, _amount0), and(sub(shl(128, 1), 1), _amount1))\n    }\n}\n\nfunction add(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := add(a0, b0)\n        res1 := add(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction sub(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := sub(a0, b0)\n        res1 := sub(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction eq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) == BalanceDelta.unwrap(b);\n}\n\nfunction neq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) != BalanceDelta.unwrap(b);\n}\n\n/// @notice Library for getting the amount0 and amount1 deltas from the BalanceDelta type\nlibrary BalanceDeltaLibrary {\n    /// @notice A BalanceDelta of 0\n    BalanceDelta public constant ZERO_DELTA = BalanceDelta.wrap(0);\n\n    function amount0(BalanceDelta balanceDelta) internal pure returns (int128 _amount0) {\n        assembly (\"memory-safe\") {\n            _amount0 := sar(128, balanceDelta)\n        }\n    }\n\n    function amount1(BalanceDelta balanceDelta) internal pure returns (int128 _amount1) {\n        assembly (\"memory-safe\") {\n            _amount1 := signextend(15, balanceDelta)\n        }\n    }\n}\n"},"lib/v4-core/src/interfaces/IExtsload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for functions to access any storage slot in a contract\ninterface IExtsload {\n    /// @notice Called by external contracts to access granular pool state\n    /// @param slot Key of slot to sload\n    /// @return value The value of the slot as bytes32\n    function extsload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access granular pool state\n    /// @param startSlot Key of slot to start sloading from\n    /// @param nSlots Number of slots to load into return value\n    /// @return values List of loaded values.\n    function extsload(bytes32 startSlot, uint256 nSlots) external view returns (bytes32[] memory values);\n\n    /// @notice Called by external contracts to access sparse pool state\n    /// @param slots List of slots to SLOAD from.\n    /// @return values List of loaded values.\n    function extsload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"lib/v4-core/src/interfaces/IExttload.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/// @notice Interface for functions to access any transient storage slot in a contract\ninterface IExttload {\n    /// @notice Called by external contracts to access transient storage of the contract\n    /// @param slot Key of slot to tload\n    /// @return value The value of the slot as bytes32\n    function exttload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access sparse transient pool state\n    /// @param slots List of slots to tload\n    /// @return values List of loaded values\n    function exttload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"},"lib/v4-core/src/libraries/ParseBytes.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @notice Parses bytes returned from hooks and the byte selector used to check return selectors from hooks.\n/// @dev parseSelector also is used to parse the expected selector\n/// For parsing hook returns, note that all hooks return either bytes4 or (bytes4, 32-byte-delta) or (bytes4, 32-byte-delta, uint24).\nlibrary ParseBytes {\n    function parseSelector(bytes memory result) internal pure returns (bytes4 selector) {\n        // equivalent: (selector,) = abi.decode(result, (bytes4, int256));\n        assembly (\"memory-safe\") {\n            selector := mload(add(result, 0x20))\n        }\n    }\n\n    function parseFee(bytes memory result) internal pure returns (uint24 lpFee) {\n        // equivalent: (,, lpFee) = abi.decode(result, (bytes4, int256, uint24));\n        assembly (\"memory-safe\") {\n            lpFee := mload(add(result, 0x60))\n        }\n    }\n\n    function parseReturnDelta(bytes memory result) internal pure returns (int256 hookReturn) {\n        // equivalent: (, hookReturnDelta) = abi.decode(result, (bytes4, int256));\n        assembly (\"memory-safe\") {\n            hookReturn := mload(add(result, 0x40))\n        }\n    }\n}\n"},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Return type of the beforeSwap hook.\n// Upper 128 bits is the delta in specified tokens. Lower 128 bits is delta in unspecified tokens (to match the afterSwap hook)\ntype BeforeSwapDelta is int256;\n\n// Creates a BeforeSwapDelta from specified and unspecified\nfunction toBeforeSwapDelta(int128 deltaSpecified, int128 deltaUnspecified)\n    pure\n    returns (BeforeSwapDelta beforeSwapDelta)\n{\n    assembly (\"memory-safe\") {\n        beforeSwapDelta := or(shl(128, deltaSpecified), and(sub(shl(128, 1), 1), deltaUnspecified))\n    }\n}\n\n/// @notice Library for getting the specified and unspecified deltas from the BeforeSwapDelta type\nlibrary BeforeSwapDeltaLibrary {\n    /// @notice A BeforeSwapDelta of 0\n    BeforeSwapDelta public constant ZERO_DELTA = BeforeSwapDelta.wrap(0);\n\n    /// extracts int128 from the upper 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap\n    function getSpecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaSpecified) {\n        assembly (\"memory-safe\") {\n            deltaSpecified := sar(128, delta)\n        }\n    }\n\n    /// extracts int128 from the lower 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap and afterSwap\n    function getUnspecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaUnspecified) {\n        assembly (\"memory-safe\") {\n            deltaUnspecified := signextend(15, delta)\n        }\n    }\n}\n"},"lib/v4-core/src/libraries/CustomRevert.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Library for reverting with custom errors efficiently\n/// @notice Contains functions for reverting with custom errors with different argument types efficiently\n/// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with\n/// `CustomError.selector.revertWith()`\n/// @dev The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\nlibrary CustomRevert {\n    /// @dev ERC-7751 error for wrapping bubbled up reverts\n    error WrappedError(address target, bytes4 selector, bytes reason, bytes details);\n\n    /// @dev Reverts with the selector of a custom error in the scratch space\n    function revertWith(bytes4 selector) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            revert(0, 0x04)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an address argument in the scratch space\n    function revertWith(bytes4 selector, address addr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an int24 argument in the scratch space\n    function revertWith(bytes4 selector, int24 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, signextend(2, value))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with a uint160 argument in the scratch space\n    function revertWith(bytes4 selector, uint160 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two int24 arguments\n    function revertWith(bytes4 selector, int24 value1, int24 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), signextend(2, value1))\n            mstore(add(fmp, 0x24), signextend(2, value2))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two uint160 arguments\n    function revertWith(bytes4 selector, uint160 value1, uint160 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two address arguments\n    function revertWith(bytes4 selector, address value1, address value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @notice bubble up the revert message returned by a call and revert with a wrapped ERC-7751 error\n    /// @dev this method can be vulnerable to revert data bombs\n    function bubbleUpAndRevertWith(\n        address revertingContract,\n        bytes4 revertingFunctionSelector,\n        bytes4 additionalContext\n    ) internal pure {\n        bytes4 wrappedErrorSelector = WrappedError.selector;\n        assembly (\"memory-safe\") {\n            // Ensure the size of the revert data is a multiple of 32 bytes\n            let encodedDataSize := mul(div(add(returndatasize(), 31), 32), 32)\n\n            let fmp := mload(0x40)\n\n            // Encode wrapped error selector, address, function selector, offset, additional context, size, revert reason\n            mstore(fmp, wrappedErrorSelector)\n            mstore(add(fmp, 0x04), and(revertingContract, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(\n                add(fmp, 0x24),\n                and(revertingFunctionSelector, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            // offset revert reason\n            mstore(add(fmp, 0x44), 0x80)\n            // offset additional context\n            mstore(add(fmp, 0x64), add(0xa0, encodedDataSize))\n            // size revert reason\n            mstore(add(fmp, 0x84), returndatasize())\n            // revert reason\n            returndatacopy(add(fmp, 0xa4), 0, returndatasize())\n            // size additional context\n            mstore(add(fmp, add(0xa4, encodedDataSize)), 0x04)\n            // additional context\n            mstore(\n                add(fmp, add(0xc4, encodedDataSize)),\n                and(additionalContext, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            revert(fmp, add(0xe4, encodedDataSize))\n        }\n    }\n}\n"},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice Library of helper functions for a pools LP fee\nlibrary LPFeeLibrary {\n    using LPFeeLibrary for uint24;\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the static or dynamic fee on a pool exceeds 100%.\n    error LPFeeTooLarge(uint24 fee);\n\n    /// @notice An lp fee of exactly 0b1000000... signals a dynamic fee pool. This isn't a valid static fee as it is > MAX_LP_FEE\n    uint24 public constant DYNAMIC_FEE_FLAG = 0x800000;\n\n    /// @notice the second bit of the fee returned by beforeSwap is used to signal if the stored LP fee should be overridden in this swap\n    // only dynamic-fee pools can return a fee via the beforeSwap hook\n    uint24 public constant OVERRIDE_FEE_FLAG = 0x400000;\n\n    /// @notice mask to remove the override fee flag from a fee returned by the beforeSwaphook\n    uint24 public constant REMOVE_OVERRIDE_MASK = 0xBFFFFF;\n\n    /// @notice the lp fee is represented in hundredths of a bip, so the max is 100%\n    uint24 public constant MAX_LP_FEE = 1000000;\n\n    /// @notice returns true if a pool's LP fee signals that the pool has a dynamic fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is dynamic\n    function isDynamicFee(uint24 self) internal pure returns (bool) {\n        return self == DYNAMIC_FEE_FLAG;\n    }\n\n    /// @notice returns true if an LP fee is valid, aka not above the maximum permitted fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is valid\n    function isValid(uint24 self) internal pure returns (bool) {\n        return self <= MAX_LP_FEE;\n    }\n\n    /// @notice validates whether an LP fee is larger than the maximum, and reverts if invalid\n    /// @param self The fee to validate\n    function validate(uint24 self) internal pure {\n        if (!self.isValid()) LPFeeTooLarge.selector.revertWith(self);\n    }\n\n    /// @notice gets and validates the initial LP fee for a pool. Dynamic fee pools have an initial fee of 0.\n    /// @dev if a dynamic fee pool wants a non-0 initial fee, it should call `updateDynamicLPFee` in the afterInitialize hook\n    /// @param self The fee to get the initial LP from\n    /// @return initialFee 0 if the fee is dynamic, otherwise the fee (if valid)\n    function getInitialLPFee(uint24 self) internal pure returns (uint24) {\n        // the initial fee for a dynamic fee pool is 0\n        if (self.isDynamicFee()) return 0;\n        self.validate();\n        return self;\n    }\n\n    /// @notice returns true if the fee has the override flag set (2nd highest bit of the uint24)\n    /// @param self The fee to check\n    /// @return bool True of the fee has the override flag set\n    function isOverride(uint24 self) internal pure returns (bool) {\n        return self & OVERRIDE_FEE_FLAG != 0;\n    }\n\n    /// @notice returns a fee with the override flag removed\n    /// @param self The fee to remove the override flag from\n    /// @return fee The fee without the override flag set\n    function removeOverrideFlag(uint24 self) internal pure returns (uint24) {\n        return self & REMOVE_OVERRIDE_MASK;\n    }\n\n    /// @notice Removes the override flag and validates the fee (reverts if the fee is too large)\n    /// @param self The fee to remove the override flag from, and then validate\n    /// @return fee The fee without the override flag set (if valid)\n    function removeOverrideFlagAndValidate(uint24 self) internal pure returns (uint24 fee) {\n        fee = self.removeOverrideFlag();\n        fee.validate();\n    }\n}\n"},"lib/v4-core/src/libraries/StateLibrary.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Position} from \"./Position.sol\";\n\n/// @notice A helper library to provide state getters that use extsload\nlibrary StateLibrary {\n    /// @notice index of pools mapping in the PoolManager\n    bytes32 public constant POOLS_SLOT = bytes32(uint256(6));\n\n    /// @notice index of feeGrowthGlobal0X128 in Pool.State\n    uint256 public constant FEE_GROWTH_GLOBAL0_OFFSET = 1;\n\n    // feeGrowthGlobal1X128 offset in Pool.State = 2\n\n    /// @notice index of liquidity in Pool.State\n    uint256 public constant LIQUIDITY_OFFSET = 3;\n\n    /// @notice index of TicksInfo mapping in Pool.State: mapping(int24 => TickInfo) ticks;\n    uint256 public constant TICKS_OFFSET = 4;\n\n    /// @notice index of tickBitmap mapping in Pool.State\n    uint256 public constant TICK_BITMAP_OFFSET = 5;\n\n    /// @notice index of Position.State mapping in Pool.State: mapping(bytes32 => Position.State) positions;\n    uint256 public constant POSITIONS_OFFSET = 6;\n\n    /**\n     * @notice Get Slot0 of the pool: sqrtPriceX96, tick, protocolFee, lpFee\n     * @dev Corresponds to pools[poolId].slot0\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return sqrtPriceX96 The square root of the price of the pool, in Q96 precision.\n     * @return tick The current tick of the pool.\n     * @return protocolFee The protocol fee of the pool.\n     * @return lpFee The swap fee of the pool.\n     */\n    function getSlot0(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        bytes32 data = manager.extsload(stateSlot);\n\n        //   24 bits  |24bits|24bits      |24 bits|160 bits\n        // 0x000000   |000bb8|000000      |ffff75 |0000000000000000fe3aa841ba359daa0ea9eff7\n        // ---------- | fee  |protocolfee | tick  | sqrtPriceX96\n        assembly (\"memory-safe\") {\n            // bottom 160 bits of data\n            sqrtPriceX96 := and(data, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            // next 24 bits of data\n            tick := signextend(2, shr(160, data))\n            // next 24 bits of data\n            protocolFee := and(shr(184, data), 0xFFFFFF)\n            // last 24 bits of data\n            lpFee := and(shr(208, data), 0xFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the tick information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve information for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickInfo(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (\n            uint128 liquidityGross,\n            int128 liquidityNet,\n            uint256 feeGrowthOutside0X128,\n            uint256 feeGrowthOutside1X128\n        )\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // read all 3 words of the TickInfo struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n        assembly (\"memory-safe\") {\n            let firstWord := mload(add(data, 32))\n            liquidityNet := sar(128, firstWord)\n            liquidityGross := and(firstWord, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            feeGrowthOutside0X128 := mload(add(data, 64))\n            feeGrowthOutside1X128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick].liquidityGross and pools[poolId].ticks[tick].liquidityNet. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve liquidity for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     */\n    function getTickLiquidity(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint128 liquidityGross, int128 liquidityNet)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        bytes32 value = manager.extsload(slot);\n        assembly (\"memory-safe\") {\n            liquidityNet := sar(128, value)\n            liquidityGross := and(value, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the fee growth outside a tick range of a pool\n     * @dev Corresponds to pools[poolId].ticks[tick].feeGrowthOutside0X128 and pools[poolId].ticks[tick].feeGrowthOutside1X128. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve fee growth for.\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickFeeGrowthOutside(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // offset by 1 word, since the first word is liquidityGross + liquidityNet\n        bytes32[] memory data = manager.extsload(bytes32(uint256(slot) + 1), 2);\n        assembly (\"memory-safe\") {\n            feeGrowthOutside0X128 := mload(add(data, 32))\n            feeGrowthOutside1X128 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves the global fee growth of a pool.\n     * @dev Corresponds to pools[poolId].feeGrowthGlobal0X128 and pools[poolId].feeGrowthGlobal1X128\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return feeGrowthGlobal0 The global fee growth for token0.\n     * @return feeGrowthGlobal1 The global fee growth for token1.\n     * @dev Note that feeGrowthGlobal can be artificially inflated\n     * For pools with a single liquidity position, actors can donate to themselves to freely inflate feeGrowthGlobal\n     * atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n     */\n    function getFeeGrowthGlobals(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State, `uint256 feeGrowthGlobal0X128`\n        bytes32 slot_feeGrowthGlobal0X128 = bytes32(uint256(stateSlot) + FEE_GROWTH_GLOBAL0_OFFSET);\n\n        // read the 2 words of feeGrowthGlobal\n        bytes32[] memory data = manager.extsload(slot_feeGrowthGlobal0X128, 2);\n        assembly (\"memory-safe\") {\n            feeGrowthGlobal0 := mload(add(data, 32))\n            feeGrowthGlobal1 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves total the liquidity of a pool.\n     * @dev Corresponds to pools[poolId].liquidity\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return liquidity The liquidity of the pool.\n     */\n    function getLiquidity(IPoolManager manager, PoolId poolId) internal view returns (uint128 liquidity) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `uint128 liquidity`\n        bytes32 slot = bytes32(uint256(stateSlot) + LIQUIDITY_OFFSET);\n\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Retrieves the tick bitmap of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].tickBitmap[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve the bitmap for.\n     * @return tickBitmap The bitmap of the tick.\n     */\n    function getTickBitmap(IPoolManager manager, PoolId poolId, int16 tick)\n        internal\n        view\n        returns (uint256 tickBitmap)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int16 => uint256) tickBitmap;`\n        bytes32 tickBitmapMapping = bytes32(uint256(stateSlot) + TICK_BITMAP_OFFSET);\n\n        // slot id of the mapping key: `pools[poolId].tickBitmap[tick]\n        bytes32 slot = keccak256(abi.encodePacked(int256(tick), tickBitmapMapping));\n\n        tickBitmap = uint256(manager.extsload(slot));\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool without needing to calculate the `positionId`.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param poolId The ID of the pool.\n     * @param owner The owner of the liquidity position.\n     * @param tickLower The lower tick of the liquidity range.\n     * @param tickUpper The upper tick of the liquidity range.\n     * @param salt The bytes32 randomness to further distinguish position state.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(\n        IPoolManager manager,\n        PoolId poolId,\n        address owner,\n        int24 tickLower,\n        int24 tickUpper,\n        bytes32 salt\n    ) internal view returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128) {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        bytes32 positionKey = Position.calculatePositionKey(owner, tickLower, tickUpper, salt);\n\n        (liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128) = getPositionInfo(manager, poolId, positionKey);\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool at a specific position ID.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n\n        // read all 3 words of the Position.State struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n\n        assembly (\"memory-safe\") {\n            liquidity := mload(add(data, 32))\n            feeGrowthInside0LastX128 := mload(add(data, 64))\n            feeGrowthInside1LastX128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity of a position.\n     * @dev Corresponds to pools[poolId].positions[positionId].liquidity. More gas efficient for just retrieiving liquidity as compared to getPositionInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     */\n    function getPositionLiquidity(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Calculate the fee growth inside a tick range of a pool\n     * @dev pools[poolId].feeGrowthInside0LastX128 in Position.State is cached and can become stale. This function will calculate the up to date feeGrowthInside\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tickLower The lower tick of the range.\n     * @param tickUpper The upper tick of the range.\n     * @return feeGrowthInside0X128 The fee growth inside the tick range for token0.\n     * @return feeGrowthInside1X128 The fee growth inside the tick range for token1.\n     */\n    function getFeeGrowthInside(IPoolManager manager, PoolId poolId, int24 tickLower, int24 tickUpper)\n        internal\n        view\n        returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)\n    {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = getFeeGrowthGlobals(manager, poolId);\n\n        (uint256 lowerFeeGrowthOutside0X128, uint256 lowerFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickLower);\n        (uint256 upperFeeGrowthOutside0X128, uint256 upperFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickUpper);\n        (, int24 tickCurrent,,) = getSlot0(manager, poolId);\n        unchecked {\n            if (tickCurrent < tickLower) {\n                feeGrowthInside0X128 = lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            } else if (tickCurrent >= tickUpper) {\n                feeGrowthInside0X128 = upperFeeGrowthOutside0X128 - lowerFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = upperFeeGrowthOutside1X128 - lowerFeeGrowthOutside1X128;\n            } else {\n                feeGrowthInside0X128 = feeGrowthGlobal0X128 - lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = feeGrowthGlobal1X128 - lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            }\n        }\n    }\n\n    function _getPoolStateSlot(PoolId poolId) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(PoolId.unwrap(poolId), POOLS_SLOT));\n    }\n\n    function _getTickInfoSlot(PoolId poolId, int24 tick) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int24 => TickInfo) ticks`\n        bytes32 ticksMappingSlot = bytes32(uint256(stateSlot) + TICKS_OFFSET);\n\n        // slot key of the tick key: `pools[poolId].ticks[tick]\n        return keccak256(abi.encodePacked(int256(tick), ticksMappingSlot));\n    }\n\n    function _getPositionInfoSlot(PoolId poolId, bytes32 positionId) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(bytes32 => Position.State) positions;`\n        bytes32 positionMapping = bytes32(uint256(stateSlot) + POSITIONS_OFFSET);\n\n        // slot of the mapping key: `pools[poolId].positions[positionId]\n        return keccak256(abi.encodePacked(positionId, positionMapping));\n    }\n}\n"},"lib/v4-core/src/interfaces/IPoolManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"./IHooks.sol\";\nimport {IERC6909Claims} from \"./external/IERC6909Claims.sol\";\nimport {IProtocolFees} from \"./IProtocolFees.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IExtsload} from \"./IExtsload.sol\";\nimport {IExttload} from \"./IExttload.sol\";\n\n/// @notice Interface for the PoolManager\ninterface IPoolManager is IProtocolFees, IERC6909Claims, IExtsload, IExttload {\n    /// @notice Thrown when a currency is not netted out after the contract is unlocked\n    error CurrencyNotSettled();\n\n    /// @notice Thrown when trying to interact with a non-initialized pool\n    error PoolNotInitialized();\n\n    /// @notice Thrown when unlock is called, but the contract is already unlocked\n    error AlreadyUnlocked();\n\n    /// @notice Thrown when a function is called that requires the contract to be unlocked, but it is not\n    error ManagerLocked();\n\n    /// @notice Pools are limited to type(int16).max tickSpacing in #initialize, to prevent overflow\n    error TickSpacingTooLarge(int24 tickSpacing);\n\n    /// @notice Pools must have a positive non-zero tickSpacing passed to #initialize\n    error TickSpacingTooSmall(int24 tickSpacing);\n\n    /// @notice PoolKey must have currencies where address(currency0) < address(currency1)\n    error CurrenciesOutOfOrderOrEqual(address currency0, address currency1);\n\n    /// @notice Thrown when a call to updateDynamicLPFee is made by an address that is not the hook,\n    /// or on a pool that does not have a dynamic swap fee.\n    error UnauthorizedDynamicLPFeeUpdate();\n\n    /// @notice Thrown when trying to swap amount of 0\n    error SwapAmountCannotBeZero();\n\n    ///@notice Thrown when native currency is passed to a non native settlement\n    error NonzeroNativeValue();\n\n    /// @notice Thrown when `clear` is called with an amount that is not exactly equal to the open currency delta.\n    error MustClearExactPositiveDelta();\n\n    /// @notice Emitted when a new pool is initialized\n    /// @param id The abi encoded hash of the pool key struct for the new pool\n    /// @param currency0 The first currency of the pool by address sort order\n    /// @param currency1 The second currency of the pool by address sort order\n    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip\n    /// @param tickSpacing The minimum number of ticks between initialized ticks\n    /// @param hooks The hooks contract address for the pool, or address(0) if none\n    /// @param sqrtPriceX96 The price of the pool on initialization\n    /// @param tick The initial tick of the pool corresponding to the initialized price\n    event Initialize(\n        PoolId indexed id,\n        Currency indexed currency0,\n        Currency indexed currency1,\n        uint24 fee,\n        int24 tickSpacing,\n        IHooks hooks,\n        uint160 sqrtPriceX96,\n        int24 tick\n    );\n\n    /// @notice Emitted when a liquidity position is modified\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that modified the pool\n    /// @param tickLower The lower tick of the position\n    /// @param tickUpper The upper tick of the position\n    /// @param liquidityDelta The amount of liquidity that was added or removed\n    /// @param salt The extra data to make positions unique\n    event ModifyLiquidity(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Emitted for swaps between currency0 and currency1\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that initiated the swap call, and that received the callback\n    /// @param amount0 The delta of the currency0 balance of the pool\n    /// @param amount1 The delta of the currency1 balance of the pool\n    /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n    /// @param liquidity The liquidity of the pool after the swap\n    /// @param tick The log base 1.0001 of the price of the pool after the swap\n    /// @param fee The swap fee in hundredths of a bip\n    event Swap(\n        PoolId indexed id,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    /// @notice Emitted for donations\n    /// @param id The abi encoded hash of the pool key struct for the pool that was donated to\n    /// @param sender The address that initiated the donate call\n    /// @param amount0 The amount donated in currency0\n    /// @param amount1 The amount donated in currency1\n    event Donate(PoolId indexed id, address indexed sender, uint256 amount0, uint256 amount1);\n\n    /// @notice All interactions on the contract that account deltas require unlocking. A caller that calls `unlock` must implement\n    /// `IUnlockCallback(msg.sender).unlockCallback(data)`, where they interact with the remaining functions on this contract.\n    /// @dev The only functions callable without an unlocking are `initialize` and `updateDynamicLPFee`\n    /// @param data Any data to pass to the callback, via `IUnlockCallback(msg.sender).unlockCallback(data)`\n    /// @return The data returned by the call to `IUnlockCallback(msg.sender).unlockCallback(data)`\n    function unlock(bytes calldata data) external returns (bytes memory);\n\n    /// @notice Initialize the state for a given pool ID\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The pool key for the pool to initialize\n    /// @param sqrtPriceX96 The initial square root price\n    /// @return tick The initial tick of the pool\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external returns (int24 tick);\n\n    struct ModifyLiquidityParams {\n        // the lower and upper tick of the position\n        int24 tickLower;\n        int24 tickUpper;\n        // how to modify the liquidity\n        int256 liquidityDelta;\n        // a value to set if you want unique liquidity positions at the same range\n        bytes32 salt;\n    }\n\n    /// @notice Modify the liquidity for the given pool\n    /// @dev Poke by calling with a zero liquidityDelta\n    /// @param key The pool to modify liquidity in\n    /// @param params The parameters for modifying the liquidity\n    /// @param hookData The data to pass through to the add/removeLiquidity hooks\n    /// @return callerDelta The balance delta of the caller of modifyLiquidity. This is the total of both principal, fee deltas, and hook deltas if applicable\n    /// @return feesAccrued The balance delta of the fees generated in the liquidity range. Returned for informational purposes\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious actor and integrators should be careful using the value\n    /// For pools with a single liquidity position, actors can donate to themselves to inflate feeGrowthGlobal (and consequently feesAccrued)\n    /// atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued);\n\n    struct SwapParams {\n        /// Whether to swap token0 for token1 or vice versa\n        bool zeroForOne;\n        /// The desired input amount if negative (exactIn), or the desired output amount if positive (exactOut)\n        int256 amountSpecified;\n        /// The sqrt price at which, if reached, the swap will stop executing\n        uint160 sqrtPriceLimitX96;\n    }\n\n    /// @notice Swap against the given pool\n    /// @param key The pool to swap in\n    /// @param params The parameters for swapping\n    /// @param hookData The data to pass through to the swap hooks\n    /// @return swapDelta The balance delta of the address swapping\n    /// @dev Swapping on low liquidity pools may cause unexpected swap amounts when liquidity available is less than amountSpecified.\n    /// Additionally note that if interacting with hooks that have the BEFORE_SWAP_RETURNS_DELTA_FLAG or AFTER_SWAP_RETURNS_DELTA_FLAG\n    /// the hook may alter the swap input/output. Integrators should perform checks on the returned swapDelta.\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta swapDelta);\n\n    /// @notice Donate the given currency amounts to the in-range liquidity providers of a pool\n    /// @dev Calls to donate can be frontrun adding just-in-time liquidity, with the aim of receiving a portion donated funds.\n    /// Donors should keep this in mind when designing donation mechanisms.\n    /// @dev This function donates to in-range LPs at slot0.tick. In certain edge-cases of the swap algorithm, the `sqrtPrice` of\n    /// a pool can be at the lower boundary of tick `n`, but the `slot0.tick` of the pool is already `n - 1`. In this case a call to\n    /// `donate` would donate to tick `n - 1` (slot0.tick) not tick `n` (getTickAtSqrtPrice(slot0.sqrtPriceX96)).\n    /// Read the comments in `Pool.swap()` for more information about this.\n    /// @param key The key of the pool to donate to\n    /// @param amount0 The amount of currency0 to donate\n    /// @param amount1 The amount of currency1 to donate\n    /// @param hookData The data to pass through to the donate hooks\n    /// @return BalanceDelta The delta of the caller after the donate\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        returns (BalanceDelta);\n\n    /// @notice Writes the current ERC20 balance of the specified currency to transient storage\n    /// This is used to checkpoint balances for the manager and derive deltas for the caller.\n    /// @dev This MUST be called before any ERC20 tokens are sent into the contract, but can be skipped\n    /// for native tokens because the amount to settle is determined by the sent value.\n    /// However, if an ERC20 token has been synced and not settled, and the caller instead wants to settle\n    /// native funds, this function can be called with the native currency to then be able to settle the native currency\n    function sync(Currency currency) external;\n\n    /// @notice Called by the user to net out some value owed to the user\n    /// @dev Will revert if the requested amount is not available, consider using `mint` instead\n    /// @dev Can also be used as a mechanism for free flash loans\n    /// @param currency The currency to withdraw from the pool manager\n    /// @param to The address to withdraw to\n    /// @param amount The amount of currency to withdraw\n    function take(Currency currency, address to, uint256 amount) external;\n\n    /// @notice Called by the user to pay what is owed\n    /// @return paid The amount of currency settled\n    function settle() external payable returns (uint256 paid);\n\n    /// @notice Called by the user to pay on behalf of another address\n    /// @param recipient The address to credit for the payment\n    /// @return paid The amount of currency settled\n    function settleFor(address recipient) external payable returns (uint256 paid);\n\n    /// @notice WARNING - Any currency that is cleared, will be non-retrievable, and locked in the contract permanently.\n    /// A call to clear will zero out a positive balance WITHOUT a corresponding transfer.\n    /// @dev This could be used to clear a balance that is considered dust.\n    /// Additionally, the amount must be the exact positive balance. This is to enforce that the caller is aware of the amount being cleared.\n    function clear(Currency currency, uint256 amount) external;\n\n    /// @notice Called by the user to move value into ERC6909 balance\n    /// @param to The address to mint the tokens to\n    /// @param id The currency address to mint to ERC6909s, as a uint256\n    /// @param amount The amount of currency to mint\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function mint(address to, uint256 id, uint256 amount) external;\n\n    /// @notice Called by the user to move value from ERC6909 balance\n    /// @param from The address to burn the tokens from\n    /// @param id The currency address to burn from ERC6909s, as a uint256\n    /// @param amount The amount of currency to burn\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function burn(address from, uint256 id, uint256 amount) external;\n\n    /// @notice Updates the pools lp fees for the a pool that has enabled dynamic lp fees.\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The key of the pool to update dynamic LP fees for\n    /// @param newDynamicLPFee The new dynamic pool LP fee\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external;\n}\n"},"lib/v4-core/src/libraries/FixedPoint128.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n    uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"},"lib/v4-core/src/libraries/LiquidityMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n    /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n    /// @param x The liquidity before change\n    /// @param y The delta by which liquidity should be changed\n    /// @return z The liquidity delta\n    function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n        assembly (\"memory-safe\") {\n            z := add(and(x, 0xffffffffffffffffffffffffffffffff), signextend(15, y))\n            if shr(128, z) {\n                // revert SafeCastOverflow()\n                mstore(0, 0x93dafdf1)\n                revert(0x1c, 0x04)\n            }\n        }\n    }\n}\n"},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\n\n/// @notice Interface for all protocol-fee related functions in the pool manager\ninterface IProtocolFees {\n    /// @notice Thrown when protocol fee is set too high\n    error ProtocolFeeTooLarge(uint24 fee);\n\n    /// @notice Thrown when collectProtocolFees or setProtocolFee is not called by the controller.\n    error InvalidCaller();\n\n    /// @notice Thrown when collectProtocolFees is attempted on a token that is synced.\n    error ProtocolFeeCurrencySynced();\n\n    /// @notice Emitted when the protocol fee controller address is updated in setProtocolFeeController.\n    event ProtocolFeeControllerUpdated(address indexed protocolFeeController);\n\n    /// @notice Emitted when the protocol fee is updated for a pool.\n    event ProtocolFeeUpdated(PoolId indexed id, uint24 protocolFee);\n\n    /// @notice Given a currency address, returns the protocol fees accrued in that currency\n    /// @param currency The currency to check\n    /// @return amount The amount of protocol fees accrued in the currency\n    function protocolFeesAccrued(Currency currency) external view returns (uint256 amount);\n\n    /// @notice Sets the protocol fee for the given pool\n    /// @param key The key of the pool to set a protocol fee for\n    /// @param newProtocolFee The fee to set\n    function setProtocolFee(PoolKey memory key, uint24 newProtocolFee) external;\n\n    /// @notice Sets the protocol fee controller\n    /// @param controller The new protocol fee controller\n    function setProtocolFeeController(address controller) external;\n\n    /// @notice Collects the protocol fees for a given recipient and currency, returning the amount collected\n    /// @dev This will revert if the contract is unlocked\n    /// @param recipient The address to receive the protocol fees\n    /// @param currency The currency to withdraw\n    /// @param amount The amount of currency to withdraw\n    /// @return amountCollected The amount of currency successfully withdrawn\n    function collectProtocolFees(address recipient, Currency currency, uint256 amount)\n        external\n        returns (uint256 amountCollected);\n\n    /// @notice Returns the current protocol fee controller address\n    /// @return address The current protocol fee controller address\n    function protocolFeeController() external view returns (address);\n}\n"},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Minimal ERC20 interface for Uniswap\n/// @notice Contains a subset of the full ERC20 interface that is used in Uniswap V3\ninterface IERC20Minimal {\n    /// @notice Returns an account's balance in the token\n    /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n    /// @return The number of tokens held by the account\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n    /// @param recipient The account that will receive the amount transferred\n    /// @param amount The number of tokens to send from the sender to the recipient\n    /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Returns the current allowance given to a spender by an owner\n    /// @param owner The account of the token owner\n    /// @param spender The account of the token spender\n    /// @return The current allowance granted by `owner` to `spender`\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n    /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n    /// @param amount The amount of tokens allowed to be used by `spender`\n    /// @return Returns true for a successful approval, false for unsuccessful\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n    /// @param sender The account from which the transfer will be initiated\n    /// @param recipient The recipient of the transfer\n    /// @param amount The amount of the transfer\n    /// @return Returns true for a successful transfer, false for unsuccessful\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n    /// @param from The account from which the tokens were sent, i.e. the balance decreased\n    /// @param to The account to which the tokens were sent, i.e. the balance increased\n    /// @param value The amount of tokens that were transferred\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n    /// @param owner The account that approved spending of its tokens\n    /// @param spender The account for which the spending allowance was modified\n    /// @param value The new allowance from the owner to the spender\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for claims over a contract balance, wrapped as a ERC6909\ninterface IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event OperatorSet(address indexed owner, address indexed operator, bool approved);\n\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);\n\n    event Transfer(address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount);\n\n    /*//////////////////////////////////////////////////////////////\n                                 FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice Owner balance of an id.\n    /// @param owner The address of the owner.\n    /// @param id The id of the token.\n    /// @return amount The balance of the token.\n    function balanceOf(address owner, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Spender allowance of an id.\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @return amount The allowance of the token.\n    function allowance(address owner, address spender, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Checks if a spender is approved by an owner as an operator\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @return approved The approval status.\n    function isOperator(address owner, address spender) external view returns (bool approved);\n\n    /// @notice Transfers an amount of an id from the caller to a receiver.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Transfers an amount of an id from a sender to a receiver.\n    /// @param sender The address of the sender.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Approves an amount of an id to a spender.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always\n    function approve(address spender, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Sets or removes an operator for the caller.\n    /// @param operator The address of the operator.\n    /// @param approved The approval status.\n    /// @return bool True, always\n    function setOperator(address operator, bool approved) external returns (bool);\n}\n"},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for the callback executed when an address unlocks the pool manager\ninterface IUnlockCallback {\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    /// @param data The data that was passed to the call to unlock\n    /// @return Any data that you want to be returned from the unlock call\n    function unlockCallback(bytes calldata data) external returns (bytes memory);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/TransientSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/TransientSlot.js.\n\npragma solidity ^0.8.24;\n\n/**\n * @dev Library for reading and writing value-types to specific transient storage slots.\n *\n * Transient slots are often used to store temporary values that are removed after the current transaction.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n *  * Example reading and writing values using transient storage:\n * ```solidity\n * contract Lock {\n *     using TransientSlot for *;\n *\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542;\n *\n *     modifier locked() {\n *         require(!_LOCK_SLOT.asBoolean().tload());\n *\n *         _LOCK_SLOT.asBoolean().tstore(true);\n *         _;\n *         _LOCK_SLOT.asBoolean().tstore(false);\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary TransientSlot {\n    /**\n     * @dev UDVT that represents a slot holding an address.\n     */\n    type AddressSlot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a AddressSlot.\n     */\n    function asAddress(bytes32 slot) internal pure returns (AddressSlot) {\n        return AddressSlot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a bool.\n     */\n    type BooleanSlot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a BooleanSlot.\n     */\n    function asBoolean(bytes32 slot) internal pure returns (BooleanSlot) {\n        return BooleanSlot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a bytes32.\n     */\n    type Bytes32Slot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a Bytes32Slot.\n     */\n    function asBytes32(bytes32 slot) internal pure returns (Bytes32Slot) {\n        return Bytes32Slot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a uint256.\n     */\n    type Uint256Slot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a Uint256Slot.\n     */\n    function asUint256(bytes32 slot) internal pure returns (Uint256Slot) {\n        return Uint256Slot.wrap(slot);\n    }\n\n    /**\n     * @dev UDVT that represents a slot holding a int256.\n     */\n    type Int256Slot is bytes32;\n\n    /**\n     * @dev Cast an arbitrary slot to a Int256Slot.\n     */\n    function asInt256(bytes32 slot) internal pure returns (Int256Slot) {\n        return Int256Slot.wrap(slot);\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(AddressSlot slot) internal view returns (address value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(AddressSlot slot, address value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(BooleanSlot slot) internal view returns (bool value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(BooleanSlot slot, bool value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(Bytes32Slot slot) internal view returns (bytes32 value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(Bytes32Slot slot, bytes32 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(Uint256Slot slot) internal view returns (uint256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(Uint256Slot slot, uint256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n\n    /**\n     * @dev Load the value held at location `slot` in transient storage.\n     */\n    function tload(Int256Slot slot) internal view returns (int256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(slot)\n        }\n    }\n\n    /**\n     * @dev Store `value` at location `slot` in transient storage.\n     */\n    function tstore(Int256Slot slot, int256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(slot, value)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/IAuthority.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Standard interface for permissioning originally defined in Dappsys.\n */\ninterface IAuthority {\n    /**\n     * @dev Returns true if the caller can invoke on a target the function identified by a function selector.\n     */\n    function canCall(address caller, address target, bytes4 selector) external view returns (bool allowed);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20Metadata} from \"../token/ERC20/extensions/IERC20Metadata.sol\";\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.7.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\nimport {IERC20Metadata} from \"../../../interfaces/IERC20Metadata.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        if (!_safeTransfer(token, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        if (!_safeTransferFrom(token, from, to, value, true)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _safeTransfer(token, to, value, false);\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _safeTransferFrom(token, from, to, value, false);\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        if (!_safeApprove(token, spender, value, false)) {\n            if (!_safeApprove(token, spender, 0, true)) revert SafeERC20FailedOperation(address(token));\n            if (!_safeApprove(token, spender, value, true)) revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that relies on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Oppositely, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /// @dev Attempts to fetch the token decimals. A return value of false indicates that the attempt failed in some way.\n    function tryGetDecimals(IERC20 token) internal view returns (bool success, uint8 decimals) {\n        bytes4 selector = IERC20Metadata.decimals.selector;\n        assembly (\"memory-safe\") {\n            mstore(0x00, selector)\n            success := staticcall(gas(), token, 0x00, 4, 0x00, 0x20)\n            success := and(and(success, gt(returndatasize(), 0x1f)), lt(mload(0x00), 0x100))\n            decimals := mul(success, mload(0x00))\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transfer(to, value)` call, relaxing the requirement on the return value: the\n     * return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransfer(IERC20 token, address to, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.transfer.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(to, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.transferFrom(from, to, value)` call, relaxing the requirement on the return\n     * value: the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param from The sender of the tokens\n     * @param to The recipient of the tokens\n     * @param value The amount of token to transfer\n     * @param bubble Behavior switch if the transfer call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value,\n        bool bubble\n    ) private returns (bool success) {\n        bytes4 selector = IERC20.transferFrom.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(from, shr(96, not(0))))\n            mstore(0x24, and(to, shr(96, not(0))))\n            mstore(0x44, value)\n            success := call(gas(), token, 0, 0x00, 0x64, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n            mstore(0x60, 0)\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity `token.approve(spender, value)` call, relaxing the requirement on the return value:\n     * the return value is optional (but if data is returned, it must not be false).\n     *\n     * @param token The token targeted by the call.\n     * @param spender The spender of the tokens\n     * @param value The amount of token to approve\n     * @param bubble Behavior switch if the approve call reverts: bubble the revert reason or return a false boolean.\n     */\n    function _safeApprove(IERC20 token, address spender, uint256 value, bool bubble) private returns (bool success) {\n        bytes4 selector = IERC20.approve.selector;\n\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(0x00, selector)\n            mstore(0x04, and(spender, shr(96, not(0))))\n            mstore(0x24, value)\n            success := call(gas(), token, 0, 0x00, 0x44, 0x00, 0x20)\n            // if call success and return is true, all is good.\n            // otherwise (not success or return is not true), we need to perform further checks\n            if iszero(and(success, eq(mload(0x00), 1))) {\n                // if the call was a failure and bubble is enabled, bubble the error\n                if and(iszero(success), bubble) {\n                    returndatacopy(fmp, 0x00, returndatasize())\n                    revert(fmp, returndatasize())\n                }\n                // if the return value is not true, then the call is only successful if:\n                // - the token address has code\n                // - the returndata is empty\n                success := and(success, and(iszero(returndatasize()), gt(extcodesize(token), 0)))\n            }\n            mstore(0x40, fmp)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/AccessManaged.sol)\n\npragma solidity ^0.8.20;\n\nimport {AuthorityUtils} from \"./AuthorityUtils.sol\";\nimport {IAccessManager} from \"./IAccessManager.sol\";\nimport {IAccessManaged} from \"./IAccessManaged.sol\";\nimport {Context} from \"../../utils/Context.sol\";\n\n/**\n * @dev This contract module makes available a {restricted} modifier. Functions decorated with this modifier will be\n * permissioned according to an \"authority\": a contract like {AccessManager} that follows the {IAuthority} interface,\n * implementing a policy that allows certain callers to access certain functions.\n *\n * IMPORTANT: The `restricted` modifier should never be used on `internal` functions, judiciously used in `public`\n * functions, and ideally only used in `external` functions. See {restricted}.\n */\nabstract contract AccessManaged is Context, IAccessManaged {\n    address private _authority;\n\n    bool private _consumingSchedule;\n\n    /**\n     * @dev Initializes the contract connected to an initial authority.\n     */\n    constructor(address initialAuthority) {\n        _setAuthority(initialAuthority);\n    }\n\n    /**\n     * @dev Restricts access to a function as defined by the connected Authority for this contract and the\n     * caller and selector of the function that entered the contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * In general, this modifier should only be used on `external` functions. It is okay to use it on `public`\n     * functions that are used as external entry points and are not called internally. Unless you know what you're\n     * doing, it should never be used on `internal` functions. Failure to follow these rules can have critical security\n     * implications! This is because the permissions are determined by the function that entered the contract, i.e. the\n     * function at the bottom of the call stack, and not the function where the modifier is visible in the source code.\n     * ====\n     *\n     * [WARNING]\n     * ====\n     * Avoid adding this modifier to the https://docs.soliditylang.org/en/v0.8.20/contracts.html#receive-ether-function[`receive()`]\n     * function or the https://docs.soliditylang.org/en/v0.8.20/contracts.html#fallback-function[`fallback()`]. These\n     * functions are the only execution paths where a function selector cannot be unambiguously determined from the calldata\n     * since the selector defaults to `0x00000000` in the `receive()` function and similarly in the `fallback()` function\n     * if no calldata is provided. (See {_checkCanCall}).\n     *\n     * The `receive()` function will always panic whereas the `fallback()` may panic depending on the calldata length.\n     * ====\n     */\n    modifier restricted() {\n        _checkCanCall(_msgSender(), _msgData());\n        _;\n    }\n\n    /// @inheritdoc IAccessManaged\n    function authority() public view virtual returns (address) {\n        return _authority;\n    }\n\n    /// @inheritdoc IAccessManaged\n    function setAuthority(address newAuthority) public virtual {\n        address caller = _msgSender();\n        if (caller != authority()) {\n            revert AccessManagedUnauthorized(caller);\n        }\n        if (newAuthority.code.length == 0) {\n            revert AccessManagedInvalidAuthority(newAuthority);\n        }\n        _setAuthority(newAuthority);\n    }\n\n    /// @inheritdoc IAccessManaged\n    function isConsumingScheduledOp() public view returns (bytes4) {\n        return _consumingSchedule ? this.isConsumingScheduledOp.selector : bytes4(0);\n    }\n\n    /**\n     * @dev Transfers control to a new authority. Internal function with no access restriction. Allows bypassing the\n     * permissions set by the current authority.\n     */\n    function _setAuthority(address newAuthority) internal virtual {\n        _authority = newAuthority;\n        emit AuthorityUpdated(newAuthority);\n    }\n\n    /**\n     * @dev Reverts if the caller is not allowed to call the function identified by a selector. Panics if the calldata\n     * is less than 4 bytes long.\n     */\n    function _checkCanCall(address caller, bytes calldata data) internal virtual {\n        (bool immediate, uint32 delay) = AuthorityUtils.canCallWithDelay(\n            authority(),\n            caller,\n            address(this),\n            bytes4(data[0:4])\n        );\n        if (!immediate) {\n            if (delay > 0) {\n                _consumingSchedule = true;\n                IAccessManager(authority()).consumeScheduledOp(caller, data);\n                _consumingSchedule = false;\n            } else {\n                revert AccessManagedUnauthorized(caller);\n            }\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (access/manager/AuthorityUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAuthority} from \"./IAuthority.sol\";\n\nlibrary AuthorityUtils {\n    /**\n     * @dev Since `AccessManager` implements an extended IAuthority interface, invoking `canCall` with backwards compatibility\n     * for the preexisting `IAuthority` interface requires special care to avoid reverting on insufficient return data.\n     * This helper function takes care of invoking `canCall` in a backwards compatible way without reverting.\n     */\n    function canCallWithDelay(\n        address authority,\n        address caller,\n        address target,\n        bytes4 selector\n    ) internal view returns (bool immediate, uint32 delay) {\n        bytes memory data = abi.encodeCall(IAuthority.canCall, (caller, target, selector));\n\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x00)\n            mstore(0x20, 0x00)\n\n            if staticcall(gas(), authority, add(data, 0x20), mload(data), 0x00, 0x40) {\n                immediate := mload(0x00)\n                delay := mload(0x20)\n\n                // If delay does not fit in a uint32, return 0 (no delay)\n                // equivalent to: if gt(delay, 0xFFFFFFFF) { delay := 0 }\n                delay := mul(delay, iszero(shr(32, delay)))\n            }\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/manager/IAccessManaged.sol)\n\npragma solidity >=0.8.4;\n\ninterface IAccessManaged {\n    /**\n     * @dev Authority that manages this contract was updated.\n     */\n    event AuthorityUpdated(address authority);\n\n    error AccessManagedUnauthorized(address caller);\n    error AccessManagedRequiredDelay(address caller, uint32 delay);\n    error AccessManagedInvalidAuthority(address authority);\n\n    /**\n     * @dev Returns the current authority.\n     */\n    function authority() external view returns (address);\n\n    /**\n     * @dev Transfers control to a new authority. The caller must be the current authority.\n     */\n    function setAuthority(address) external;\n\n    /**\n     * @dev Returns true only in the context of a delayed restricted call, at the moment that the scheduled operation is\n     * being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs\n     * attacker controlled calls.\n     */\n    function isConsumingScheduledOp() external view returns (bytes4);\n}\n"},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.7.0) (access/manager/IAccessManager.sol)\n\npragma solidity >=0.8.4;\n\ninterface IAccessManager {\n    /**\n     * @dev A delayed operation was scheduled.\n     */\n    event OperationScheduled(\n        bytes32 indexed operationId,\n        uint32 indexed nonce,\n        uint48 schedule,\n        address caller,\n        address target,\n        bytes data\n    );\n\n    /**\n     * @dev A scheduled operation was executed.\n     */\n    event OperationExecuted(bytes32 indexed operationId, uint32 indexed nonce);\n\n    /**\n     * @dev A scheduled operation was canceled.\n     */\n    event OperationCanceled(bytes32 indexed operationId, uint32 indexed nonce);\n\n    /**\n     * @dev Informational labelling for a roleId.\n     */\n    event RoleLabel(uint64 indexed roleId, string label);\n\n    /**\n     * @dev Emitted when `account` is granted `roleId`.\n     *\n     * NOTE: The meaning of the `since` argument depends on the `newMember` argument.\n     * If the role is granted to a new member, the `since` argument indicates when the account becomes a member of the role,\n     * otherwise it indicates the timestamp when the execution delay update takes effect for this account and roleId.\n     */\n    event RoleGranted(uint64 indexed roleId, address indexed account, uint32 delay, uint48 since, bool newMember);\n\n    /**\n     * @dev Emitted when `account` membership or `roleId` is revoked. Unlike granting, revoking is instantaneous.\n     */\n    event RoleRevoked(uint64 indexed roleId, address indexed account);\n\n    /**\n     * @dev Role acting as admin over a given `roleId` is updated.\n     */\n    event RoleAdminChanged(uint64 indexed roleId, uint64 indexed admin);\n\n    /**\n     * @dev Role acting as guardian over a given `roleId` is updated.\n     */\n    event RoleGuardianChanged(uint64 indexed roleId, uint64 indexed guardian);\n\n    /**\n     * @dev Grant delay for a given `roleId` will be updated to `delay` when `since` is reached.\n     */\n    event RoleGrantDelayChanged(uint64 indexed roleId, uint32 delay, uint48 since);\n\n    /**\n     * @dev Target mode is updated (true = closed, false = open).\n     */\n    event TargetClosed(address indexed target, bool closed);\n\n    /**\n     * @dev Role required to invoke `selector` on `target` is updated to `roleId`.\n     */\n    event TargetFunctionRoleUpdated(address indexed target, bytes4 selector, uint64 indexed roleId);\n\n    /**\n     * @dev Admin delay for a given `target` will be updated to `delay` when `since` is reached.\n     */\n    event TargetAdminDelayUpdated(address indexed target, uint32 delay, uint48 since);\n\n    error AccessManagerAlreadyScheduled(bytes32 operationId);\n    error AccessManagerNotScheduled(bytes32 operationId);\n    error AccessManagerNotReady(bytes32 operationId);\n    error AccessManagerExpired(bytes32 operationId);\n    error AccessManagerLockedRole(uint64 roleId);\n    error AccessManagerLockedFunction(bytes4 selector);\n    error AccessManagerBadConfirmation();\n    error AccessManagerUnauthorizedAccount(address msgsender, uint64 roleId);\n    error AccessManagerUnauthorizedCall(address caller, address target, bytes4 selector);\n    error AccessManagerUnauthorizedConsume(address target);\n    error AccessManagerUnauthorizedCancel(address msgsender, address caller, address target, bytes4 selector);\n    error AccessManagerInvalidInitialAdmin(address initialAdmin);\n\n    /**\n     * @dev Check if an address (`caller`) is authorised to call a given function on a given contract directly (with\n     * no restriction). Additionally, it returns the delay needed to perform the call indirectly through the {schedule}\n     * & {execute} workflow.\n     *\n     * This function is usually called by the targeted contract to control immediate execution of restricted functions.\n     * Therefore we only return true if the call can be performed without any delay. If the call is subject to a\n     * previously set delay (not zero), then the function should return false and the caller should schedule the operation\n     * for future execution.\n     *\n     * If `allowed` is true, the delay can be disregarded and the operation can be immediately executed, otherwise\n     * the operation can be executed if and only if delay is greater than 0.\n     *\n     * NOTE: The IAuthority interface does not include the `uint32` delay. This is an extension of that interface that\n     * is backward compatible. Some contracts may thus ignore the second return argument. In that case they will fail\n     * to identify the indirect workflow, and will consider calls that require a delay to be forbidden.\n     *\n     * NOTE: This function does not report the permissions of the admin functions in the manager itself. These are defined by the\n     * {AccessManager} documentation.\n     *\n     * NOTE: The `setAuthority(address)` selector is reserved on all targets (whether or not they are {AccessManaged}):\n     * it is gated to `ADMIN_ROLE` with a possible delay, and it cannot be reconfigured via {setTargetFunctionRole}.\n     * Any target function whose selector collides with `setAuthority(address)` inherits this restriction when routed\n     * through the manager.\n     */\n    function canCall(\n        address caller,\n        address target,\n        bytes4 selector\n    ) external view returns (bool allowed, uint32 delay);\n\n    /**\n     * @dev Expiration delay for scheduled proposals. Defaults to 1 week.\n     *\n     * IMPORTANT: Avoid overriding the expiration with 0. Otherwise every contract proposal will be expired immediately,\n     * disabling any scheduling usage.\n     */\n    function expiration() external view returns (uint32);\n\n    /**\n     * @dev Minimum setback for all delay updates, with the exception of execution delays. It\n     * can be increased without setback (and reset via {revokeRole} in the event of an\n     * accidental increase). Defaults to 5 days.\n     */\n    function minSetback() external view returns (uint32);\n\n    /**\n     * @dev Get whether the contract is closed disabling any access. Otherwise role permissions are applied.\n     *\n     * NOTE: When the manager itself is closed, admin functions are still accessible to avoid locking the contract.\n     */\n    function isTargetClosed(address target) external view returns (bool);\n\n    /**\n     * @dev Get the role required to call a function.\n     */\n    function getTargetFunctionRole(address target, bytes4 selector) external view returns (uint64);\n\n    /**\n     * @dev Get the admin delay for a target contract. Changes to contract configuration are subject to this delay.\n     */\n    function getTargetAdminDelay(address target) external view returns (uint32);\n\n    /**\n     * @dev Get the id of the role that acts as an admin for the given role.\n     *\n     * The admin permission is required to grant the role, revoke the role and update the execution delay to execute\n     * an operation that is restricted to this role.\n     */\n    function getRoleAdmin(uint64 roleId) external view returns (uint64);\n\n    /**\n     * @dev Get the role that acts as a guardian for a given role.\n     *\n     * The guardian permission allows canceling operations that have been scheduled under the role.\n     */\n    function getRoleGuardian(uint64 roleId) external view returns (uint64);\n\n    /**\n     * @dev Get the role current grant delay.\n     *\n     * Its value may change at any point without an event emitted following a call to {setGrantDelay}.\n     * Changes to this value, including effect timepoint are notified in advance by the {RoleGrantDelayChanged} event.\n     */\n    function getRoleGrantDelay(uint64 roleId) external view returns (uint32);\n\n    /**\n     * @dev Get the access details for a given account for a given role. These details include the timepoint at which\n     * membership becomes active, and the delay applied to all operations by this user that requires this permission\n     * level.\n     *\n     * Returns:\n     * [0] Timestamp at which the account membership becomes valid. 0 means role is not granted.\n     * [1] Current execution delay for the account.\n     * [2] Pending execution delay for the account.\n     * [3] Timestamp at which the pending execution delay will become active. 0 means no delay update is scheduled.\n     */\n    function getAccess(\n        uint64 roleId,\n        address account\n    ) external view returns (uint48 since, uint32 currentDelay, uint32 pendingDelay, uint48 effect);\n\n    /**\n     * @dev Check if a given account currently has the permission level corresponding to a given role. Note that this\n     * permission might be associated with an execution delay. {getAccess} can provide more details.\n     */\n    function hasRole(uint64 roleId, address account) external view returns (bool isMember, uint32 executionDelay);\n\n    /**\n     * @dev Give a label to a role, for improved role discoverability by UIs.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `ADMIN_ROLE` or `PUBLIC_ROLE`\n     *\n     * Emits a {RoleLabel} event.\n     */\n    function labelRole(uint64 roleId, string calldata label) external;\n\n    /**\n     * @dev Add `account` to `roleId`, or change its execution delay.\n     *\n     * This gives the account the authorization to call any function that is restricted to this role. An optional\n     * execution delay (in seconds) can be set. If that delay is non 0, the user is required to schedule any operation\n     * that is restricted to members of this role. The user will only be able to execute the operation after the delay has\n     * passed, before it has expired. During this period, admin and guardians can cancel the operation (see {cancel}).\n     *\n     * If the account has already been granted this role, the execution delay will be updated. This update is not\n     * immediate and follows the delay rules. For example, if a user currently has a delay of 3 hours, and this is\n     * called to reduce that delay to 1 hour, the new delay will take some time to take effect, enforcing that any\n     * operation executed in the 3 hours that follows this update was indeed scheduled before this update.\n     *\n     * Requirements:\n     *\n     * - the caller must be an admin for the role (see {getRoleAdmin})\n     * - granted role must not be the `PUBLIC_ROLE`\n     *\n     * Emits a {RoleGranted} event.\n     */\n    function grantRole(uint64 roleId, address account, uint32 executionDelay) external;\n\n    /**\n     * @dev Remove an account from a role, with immediate effect. If the account does not have the role, this call has\n     * no effect.\n     *\n     * Requirements:\n     *\n     * - the caller must be an admin for the role (see {getRoleAdmin})\n     * - revoked role must not be the `PUBLIC_ROLE`\n     *\n     * Emits a {RoleRevoked} event if the account had the role.\n     */\n    function revokeRole(uint64 roleId, address account) external;\n\n    /**\n     * @dev Renounce role permissions for the calling account with immediate effect. If the sender is not in\n     * the role this call has no effect.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * Emits a {RoleRevoked} event if the account had the role.\n     */\n    function renounceRole(uint64 roleId, address callerConfirmation) external;\n\n    /**\n     * @dev Change admin role for a given role.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `ADMIN_ROLE` or `PUBLIC_ROLE`\n     *\n     * Emits a {RoleAdminChanged} event\n     */\n    function setRoleAdmin(uint64 roleId, uint64 admin) external;\n\n    /**\n     * @dev Change guardian role for a given role.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `ADMIN_ROLE` or `PUBLIC_ROLE`\n     *\n     * Emits a {RoleGuardianChanged} event\n     */\n    function setRoleGuardian(uint64 roleId, uint64 guardian) external;\n\n    /**\n     * @dev Update the delay for granting a `roleId`.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `roleId` must not be the `PUBLIC_ROLE`\n     *\n     * Emits a {RoleGrantDelayChanged} event.\n     */\n    function setGrantDelay(uint64 roleId, uint32 newDelay) external;\n\n    /**\n     * @dev Set the role required to call functions identified by the `selectors` in the `target` contract.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     * - `selectors` must not contain the `setAuthority(address)` selector, which is reserved. See {canCall}.\n     *\n     * Emits a {TargetFunctionRoleUpdated} event per selector.\n     */\n    function setTargetFunctionRole(address target, bytes4[] calldata selectors, uint64 roleId) external;\n\n    /**\n     * @dev Set the delay for changing the configuration of a given target contract.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     *\n     * Emits a {TargetAdminDelayUpdated} event.\n     */\n    function setTargetAdminDelay(address target, uint32 newDelay) external;\n\n    /**\n     * @dev Set the closed flag for a contract.\n     *\n     * Closing the manager itself won't disable access to admin methods to avoid locking the contract.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     *\n     * Emits a {TargetClosed} event.\n     */\n    function setTargetClosed(address target, bool closed) external;\n\n    /**\n     * @dev Return the timepoint at which a scheduled operation will be ready for execution. This returns 0 if the\n     * operation is not yet scheduled, has expired, was executed, or was canceled.\n     */\n    function getSchedule(bytes32 id) external view returns (uint48);\n\n    /**\n     * @dev Return the nonce for the latest scheduled operation with a given id. Returns 0 if the operation has never\n     * been scheduled.\n     */\n    function getNonce(bytes32 id) external view returns (uint32);\n\n    /**\n     * @dev Schedule a delayed operation for future execution, and return the operation identifier. It is possible to\n     * choose the timestamp at which the operation becomes executable as long as it satisfies the execution delays\n     * required for the caller. The special value zero will automatically set the earliest possible time.\n     *\n     * Returns the `operationId` that was scheduled. Since this value is a hash of the parameters, it can reoccur when\n     * the same parameters are used; if this is relevant, the returned `nonce` can be used to uniquely identify this\n     * scheduled operation from other occurrences of the same `operationId` in invocations of {execute} and {cancel}.\n     *\n     * Emits a {OperationScheduled} event.\n     *\n     * NOTE: It is not possible to concurrently schedule more than one operation with the same `target` and `data`. If\n     * this is necessary, a random byte can be appended to `data` to act as a salt that will be ignored by the target\n     * contract if it is using standard Solidity ABI encoding.\n     */\n    function schedule(\n        address target,\n        bytes calldata data,\n        uint48 when\n    ) external returns (bytes32 operationId, uint32 nonce);\n\n    /**\n     * @dev Execute a function that is delay restricted, provided it was properly scheduled beforehand, or the\n     * execution delay is 0.\n     *\n     * Returns the nonce that identifies the previously scheduled operation that is executed, or 0 if the\n     * operation wasn't previously scheduled (if the caller doesn't have an execution delay).\n     *\n     * Emits an {OperationExecuted} event only if the call was scheduled and delayed.\n     */\n    function execute(address target, bytes calldata data) external payable returns (uint32);\n\n    /**\n     * @dev Cancel a scheduled (delayed) operation. Returns the nonce that identifies the previously scheduled\n     * operation that is cancelled.\n     *\n     * Requirements:\n     *\n     * - the caller must be the proposer, a guardian of the targeted function, or a global admin\n     *\n     * Emits a {OperationCanceled} event.\n     */\n    function cancel(address caller, address target, bytes calldata data) external returns (uint32);\n\n    /**\n     * @dev Consume a scheduled operation targeting the caller. If such an operation exists, mark it as consumed\n     * (emit an {OperationExecuted} event and clean the state). Otherwise, throw an error.\n     *\n     * This is useful for contracts that want to enforce that calls targeting them were scheduled on the manager,\n     * with all the verifications that it implies.\n     *\n     * Emit a {OperationExecuted} event.\n     */\n    function consumeScheduledOp(address caller, bytes calldata data) external;\n\n    /**\n     * @dev Hashing function for delayed operations.\n     */\n    function hashOperation(address caller, address target, bytes calldata data) external view returns (bytes32);\n\n    /**\n     * @dev Changes the authority of a target managed by this manager instance.\n     *\n     * Requirements:\n     *\n     * - the caller must be a global admin\n     */\n    function updateAuthority(address target, address newAuthority) external;\n}\n"},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.5.0) (utils/ReentrancyGuardTransient.sol)\n\npragma solidity ^0.8.24;\n\nimport {TransientSlot} from \"./TransientSlot.sol\";\n\n/**\n * @dev Variant of {ReentrancyGuard} that uses transient storage.\n *\n * NOTE: This variant only works on networks where EIP-1153 is available.\n *\n * _Available since v5.1._\n *\n * @custom:stateless\n */\nabstract contract ReentrancyGuardTransient {\n    using TransientSlot for *;\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ReentrancyGuard\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant REENTRANCY_GUARD_STORAGE =\n        0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    /**\n     * @dev A `view` only version of {nonReentrant}. Use to block view functions\n     * from being called, preventing reading from inconsistent contract state.\n     *\n     * CAUTION: This is a \"view\" modifier and does not change the reentrancy\n     * status. Use it only on view functions. For payable or non-payable functions,\n     * use the standard {nonReentrant} modifier instead.\n     */\n    modifier nonReentrantView() {\n        _nonReentrantBeforeView();\n        _;\n    }\n\n    function _nonReentrantBeforeView() private view {\n        if (_reentrancyGuardEntered()) {\n            revert ReentrancyGuardReentrantCall();\n        }\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, REENTRANCY_GUARD_STORAGE.asBoolean().tload() will be false\n        _nonReentrantBeforeView();\n\n        // Any calls to nonReentrant after this point will fail\n        _reentrancyGuardStorageSlot().asBoolean().tstore(true);\n    }\n\n    function _nonReentrantAfter() private {\n        _reentrancyGuardStorageSlot().asBoolean().tstore(false);\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _reentrancyGuardStorageSlot().asBoolean().tload();\n    }\n\n    function _reentrancyGuardStorageSlot() internal pure virtual returns (bytes32) {\n        return REENTRANCY_GUARD_STORAGE;\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"}},"language":"Solidity","settings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"none","useLiteralContent":false},"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"cancun","remappings":["forge-std/=lib/forge-std/src/","v4-core/=lib/v4-core/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","solmate/=lib/v4-core/lib/solmate/","@ensdomains/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/@ensdomains/","ds-test/=lib/v4-core/lib/solmate/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","hardhat/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/hardhat/","openzeppelin-contracts/=lib/openzeppelin-contracts/"]}},"stdJsonOutput":{"sources":{"src/FablesRamp.sol":{"id":40},"src/FablesRampETH.sol":{"id":41},"src/base/LedgerTypes.sol":{"id":44},"src/base/FablesLedger.sol":{"id":43},"lib/v4-core/src/ERC6909.sol":{"id":16},"src/base/FablesBaseHook.sol":{"id":42},"src/libraries/LedgerLib.sol":{"id":45},"lib/v4-core/src/types/PoolId.sol":{"id":38},"lib/v4-core/src/types/PoolKey.sol":{"id":39},"lib/v4-core/src/types/Currency.sol":{"id":37},"lib/v4-core/src/libraries/Hooks.sol":{"id":28},"lib/v4-core/src/interfaces/IHooks.sol":{"id":19},"lib/v4-core/src/libraries/FullMath.sol":{"id":27},"lib/v4-core/src/libraries/Position.sol":{"id":32},"lib/v4-core/src/libraries/SafeCast.sol":{"id":33},"lib/v4-core/src/types/BalanceDelta.sol":{"id":35},"lib/v4-core/src/interfaces/IExtsload.sol":{"id":17},"lib/v4-core/src/interfaces/IExttload.sol":{"id":18},"lib/v4-core/src/libraries/ParseBytes.sol":{"id":31},"lib/v4-core/src/types/BeforeSwapDelta.sol":{"id":36},"lib/v4-core/src/libraries/CustomRevert.sol":{"id":25},"lib/v4-core/src/libraries/LPFeeLibrary.sol":{"id":29},"lib/v4-core/src/libraries/StateLibrary.sol":{"id":34},"lib/v4-core/src/interfaces/IPoolManager.sol":{"id":20},"lib/v4-core/src/libraries/FixedPoint128.sol":{"id":26},"lib/v4-core/src/libraries/LiquidityMath.sol":{"id":30},"lib/v4-core/src/interfaces/IProtocolFees.sol":{"id":21},"lib/v4-core/src/interfaces/external/IERC20Minimal.sol":{"id":23},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":12},"lib/v4-core/src/interfaces/external/IERC6909Claims.sol":{"id":24},"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol":{"id":22},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":7},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":6},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":9},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":5},"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol":{"id":14},"lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol":{"id":4},"lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol":{"id":8},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":11},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":15},"lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol":{"id":0},"lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol":{"id":1},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol":{"id":2},"lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol":{"id":3},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol":{"id":13},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":10}},"contracts":{"src/FablesRampETH.sol":{"FablesRampETH":{"abi":[{"type":"constructor","inputs":[{"name":"poolManager_","type":"address","internalType":"contract IPoolManager"},{"name":"authority_","type":"address","internalType":"address"},{"name":"absoluteMaxFee_","type":"uint24","internalType":"uint24"},{"name":"weth_","type":"address","internalType":"contract IWETH9"}],"stateMutability":"nonpayable"},{"name":"AccessManagedInvalidAuthority","type":"error","inputs":[{"name":"authority","type":"address","internalType":"address"}]},{"name":"AccessManagedRequiredDelay","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"},{"name":"delay","type":"uint32","internalType":"uint32"}]},{"name":"AccessManagedUnauthorized","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"}]},{"name":"BallotGateUnset","type":"error","inputs":[]},{"name":"ClaimFeeAboveMax","type":"error","inputs":[]},{"name":"DeadlineExpired","type":"error","inputs":[]},{"name":"DeskRetired","type":"error","inputs":[]},{"name":"DistributorNotFFAware","type":"error","inputs":[]},{"name":"DistributorNotFFAware","type":"error","inputs":[]},{"name":"FeeAboveCap","type":"error","inputs":[]},{"name":"FeeBelowFloor","type":"error","inputs":[]},{"name":"InsufficientUnstakedShares","type":"error","inputs":[]},{"name":"InvalidBallotGate","type":"error","inputs":[]},{"name":"InvalidClaimFee","type":"error","inputs":[]},{"name":"InvalidClaimFee","type":"error","inputs":[]},{"name":"InvalidConfig","type":"error","inputs":[]},{"name":"InvalidMaxFee","type":"error","inputs":[]},{"name":"InvalidMsgValue","type":"error","inputs":[]},{"name":"InvalidSink","type":"error","inputs":[]},{"name":"InvalidSink","type":"error","inputs":[]},{"name":"InvalidTtl","type":"error","inputs":[]},{"name":"LedgerPaused","type":"error","inputs":[]},{"name":"NativeNotSupported","type":"error","inputs":[]},{"name":"NotAVoterOfThisPool","type":"error","inputs":[]},{"name":"NotDynamicFeePool","type":"error","inputs":[]},{"name":"NotPoolManager","type":"error","inputs":[]},{"name":"NothingToClaim","type":"error","inputs":[]},{"name":"PauseTooLong","type":"error","inputs":[]},{"name":"PoolNotConfigured","type":"error","inputs":[]},{"name":"PrincipalAboveMax","type":"error","inputs":[{"name":"paid","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"name":"PrincipalBelowMin","type":"error","inputs":[{"name":"received","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"}]},{"name":"ReentrancyGuardReentrantCall","type":"error","inputs":[]},{"name":"RefundFailed","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"UnauthorizedETHSender","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"ZeroLiquidity","type":"error","inputs":[]},{"name":"ZeroShares","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AuthorityUpdated","type":"event","inputs":[{"name":"authority","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"BallotGateSet","type":"event","inputs":[{"name":"gate","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"ClaimFeeSet","type":"event","inputs":[{"name":"bps","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"ClaimFeeSwept","type":"event","inputs":[{"name":"currency","type":"address","indexed":true,"internalType":"Currency"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Deposited","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"DistributorSet","type":"event","inputs":[{"name":"distributor","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"DistributorSwept","type":"event","inputs":[{"name":"currency","type":"address","indexed":true,"internalType":"Currency"},{"name":"distributor","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FFFeeSinkSet","type":"event","inputs":[{"name":"sink","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"FeePoked","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"fee","type":"uint24","indexed":false,"internalType":"uint24"},{"name":"expiry","type":"uint40","indexed":false,"internalType":"uint40"}],"anonymous":false},{"name":"FeesClaimed","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FeesCollected","type":"event","inputs":[{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"fee0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"fee1","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"stakedCut0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"stakedCut1","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"accStaked0X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"accStaked1X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeGrowthInside0X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeGrowthInside1X128","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalShares","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"totalStaked","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"collectionSeq","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"resetSeq","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"FeesForgone","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"NativeRevenueWrappedToWeth","type":"event","inputs":[{"name":"distributor","type":"address","indexed":true,"internalType":"address"},{"name":"weth","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OperatorSet","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"PausedSet","type":"event","inputs":[{"name":"pausedUntil","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PokeCleared","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"}],"anonymous":false},{"name":"PoolConfigured","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"PoolId"},{"name":"floorPips","type":"uint24","indexed":false,"internalType":"uint24"},{"name":"flatPips","type":"uint24","indexed":false,"internalType":"uint24"},{"name":"maxFee","type":"uint24","indexed":false,"internalType":"uint24"}],"anonymous":false},{"name":"Staked","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"caller","type":"address","indexed":false,"internalType":"address"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"id","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Unstaked","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"Withdrawn","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"rangeId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"ABSOLUTE_MAX_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"MAX_CLAIM_FEE_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"MAX_CLAIM_FEE_WALK","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PAUSE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_POKE_DISCOUNT_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"MAX_POKE_TTL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"MIN_POOL_FEE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"amount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"authority","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"balance","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ballotGate","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"beforeInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"","type":"uint160","internalType":"uint160"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"name":"beforeSwap","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct IPoolManager.SwapParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BeforeSwapDelta"},{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"claimFeeAllTimeMin","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"claimFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"claimFeeChangeAt","type":"function","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"fromTs","type":"uint64","internalType":"uint64"},{"name":"bps","type":"uint16","internalType":"uint16"}],"internalType":"struct ClaimFeeChange"}],"stateMutability":"view"},{"name":"claimFeeFor","type":"function","inputs":[{"name":"sinceIndex","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"claimFeeHistoryLength","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimFeeOwed","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[{"name":"owed","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimFeeRecipient","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"claimFeeSyncIndex","type":"function","inputs":[{"name":"rangeId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"index","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"name":"claimFees","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"to","type":"address","internalType":"address"},{"name":"maxFeeBps","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"clearPoke","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"currentFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"},{"name":"zeroForOne","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"deposit","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"amount0Max","type":"uint128","internalType":"uint128"},{"name":"amount1Max","type":"uint128","internalType":"uint128"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"distributor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"distributorFF","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"distributorOwed","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[{"name":"owed","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"effectiveClaimFee","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"ffFeeSink","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"flatFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"isConsumingScheduledOp","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"name":"isOperator","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"isOperator","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isSettling","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"cap","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"pausedUntil","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pokeFee","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"ttl","type":"uint40","internalType":"uint40"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"pokeFloor","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"floor","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"pokeOf","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"}],"outputs":[{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"expiry","type":"uint40","internalType":"uint40"}],"stateMutability":"view"},{"name":"poolManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPoolManager"}],"stateMutability":"view"},{"name":"rangeGrowth","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"growth0","type":"uint256","internalType":"uint256"},{"name":"growth1","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rangeId","type":"function","inputs":[{"name":"poolId","type":"bytes32","internalType":"PoolId"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"name":"rangeKey","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"set","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"rangeState","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"totalShares","type":"uint128","internalType":"uint128"},{"name":"totalStaked","type":"uint128","internalType":"uint128"},{"name":"accFee0X128","type":"uint256","internalType":"uint256"},{"name":"accFee1X128","type":"uint256","internalType":"uint256"},{"name":"accStaked0X128","type":"uint256","internalType":"uint256"},{"name":"accStaked1X128","type":"uint256","internalType":"uint256"},{"name":"stakedResidual0","type":"uint128","internalType":"uint128"},{"name":"stakedResidual1","type":"uint128","internalType":"uint128"},{"name":"collectionSeq","type":"uint64","internalType":"uint64"},{"name":"resetSeq","type":"uint64","internalType":"uint64"}],"internalType":"struct RangeState"}],"stateMutability":"view"},{"name":"setAuthority","type":"function","inputs":[{"name":"newAuthority","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setBallotGate","type":"function","inputs":[{"name":"gate","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setClaimFee","type":"function","inputs":[{"name":"settleFirst","type":"address[]","internalType":"Currency[]"},{"name":"bps","type":"uint16","internalType":"uint16"},{"name":"recipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setDistributor","type":"function","inputs":[{"name":"settleFirst","type":"address[]","internalType":"Currency[]"},{"name":"distributor_","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setFFFeeSink","type":"function","inputs":[{"name":"settleFirst","type":"address[]","internalType":"Currency[]"},{"name":"sink","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setOperator","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"setPaused","type":"function","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPoolConfig","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"floorPips","type":"uint24","internalType":"uint24"},{"name":"flatPips","type":"uint24","internalType":"uint24"},{"name":"cap","type":"uint24","internalType":"uint24"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stake","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"shares","type":"uint128","internalType":"uint128"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"sweepClaimFee","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sweepDistributor","type":"function","inputs":[{"name":"currency","type":"address","internalType":"Currency"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"syncRanges","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"ids","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transfer","type":"function","inputs":[{"name":"receiver","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"receiver","type":"address","internalType":"address"},{"name":"id","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"unlockCallback","type":"function","inputs":[{"name":"rawData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"name":"unstake","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"shares","type":"uint128","internalType":"uint128"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"userPosition","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"staked","type":"uint128","internalType":"uint128"},{"name":"owed0","type":"uint128","internalType":"uint128"},{"name":"owed1","type":"uint128","internalType":"uint128"},{"name":"checkpoint0X128","type":"uint256","internalType":"uint256"},{"name":"checkpoint1X128","type":"uint256","internalType":"uint256"},{"name":"stakedCheckpoint0X128","type":"uint256","internalType":"uint256"},{"name":"stakedCheckpoint1X128","type":"uint256","internalType":"uint256"},{"name":"forgone0","type":"uint256","internalType":"uint256"},{"name":"forgone1","type":"uint256","internalType":"uint256"}],"internalType":"struct UserPosition"}],"stateMutability":"view"},{"name":"weth","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWETH9"}],"stateMutability":"view"},{"name":"withdraw","type":"function","inputs":[{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"Currency"},{"name":"currency1","type":"address","internalType":"Currency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"contract IHooks"}],"internalType":"struct PoolKey"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"to","type":"address","internalType":"address"},{"name":"amount0Min","type":"uint128","internalType":"uint128"},{"name":"amount1Min","type":"uint128","internalType":"uint128"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"poolManager_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"authority_\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"absoluteMaxFee_\",\"type\":\"uint24\"},{\"internalType\":\"contract IWETH9\",\"name\":\"weth_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"authority\",\"type\":\"address\"}],\"name\":\"AccessManagedInvalidAuthority\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"}],\"name\":\"AccessManagedRequiredDelay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AccessManagedUnauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BallotGateUnset\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ClaimFeeAboveMax\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DeadlineExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DeskRetired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DistributorNotFFAware\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DistributorNotFFAware\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeeAboveCap\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeeBelowFloor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientUnstakedShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBallotGate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClaimFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClaimFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMaxFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTtl\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LedgerPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAVoterOfThisPool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotDynamicFeePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPoolManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PauseTooLong\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolNotConfigured\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"paid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"PrincipalAboveMax\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"}],\"name\":\"PrincipalBelowMin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RefundFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedETHSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroLiquidity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroShares\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"authority\",\"type\":\"address\"}],\"name\":\"AuthorityUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"gate\",\"type\":\"address\"}],\"name\":\"BallotGateSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"ClaimFeeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"Currency\",\"name\":\"currency\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimFeeSwept\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"distributor\",\"type\":\"address\"}],\"name\":\"DistributorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"Currency\",\"name\":\"currency\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"distributor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DistributorSwept\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sink\",\"type\":\"address\"}],\"name\":\"FFFeeSinkSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint40\",\"name\":\"expiry\",\"type\":\"uint40\"}],\"name\":\"FeePoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"name\":\"FeesClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee1\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakedCut0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakedCut1\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accStaked0X128\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accStaked1X128\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeGrowthInside0X128\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeGrowthInside1X128\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"totalShares\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"totalStaked\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"collectionSeq\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"resetSeq\",\"type\":\"uint64\"}],\"name\":\"FeesCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"name\":\"FeesForgone\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"distributor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"weth\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeRevenueWrappedToWeth\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"OperatorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pausedUntil\",\"type\":\"uint256\"}],\"name\":\"PausedSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"name\":\"PokeCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"floorPips\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"flatPips\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"maxFee\",\"type\":\"uint24\"}],\"name\":\"PoolConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"shares\",\"type\":\"uint128\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"shares\",\"type\":\"uint128\"}],\"name\":\"Unstaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ABSOLUTE_MAX_FEE\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CLAIM_FEE_BPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CLAIM_FEE_WALK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_PAUSE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_POKE_DISCOUNT_BPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_POKE_TTL\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_POOL_FEE\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"authority\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ballotGate\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"}],\"name\":\"beforeInitialize\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"}],\"internalType\":\"struct IPoolManager.SwapParams\",\"name\":\"params\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeSwap\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BeforeSwapDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFeeAllTimeMin\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFeeBps\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"claimFeeChangeAt\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"fromTs\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"}],\"internalType\":\"struct ClaimFeeChange\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sinceIndex\",\"type\":\"uint64\"}],\"name\":\"claimFeeFor\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFeeHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency\",\"name\":\"currency\",\"type\":\"address\"}],\"name\":\"claimFeeOwed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"owed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimFeeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"rangeId\",\"type\":\"uint256\"}],\"name\":\"claimFeeSyncIndex\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"index\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxFeeBps\",\"type\":\"uint16\"}],\"name\":\"claimFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"name\":\"clearPoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"}],\"name\":\"currentFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount0Max\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1Max\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributorFF\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency\",\"name\":\"currency\",\"type\":\"address\"}],\"name\":\"distributorOwed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"owed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"effectiveClaimFee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ffFeeSink\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"name\":\"flatFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isConsumingScheduledOp\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isOperator\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isSettling\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"name\":\"maxFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"cap\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pausedUntil\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint40\",\"name\":\"ttl\",\"type\":\"uint40\"}],\"name\":\"pokeFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"name\":\"pokeFloor\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"floor\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"}],\"name\":\"pokeOf\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint40\",\"name\":\"expiry\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolManager\",\"outputs\":[{\"internalType\":\"contract IPoolManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"rangeGrowth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"growth0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"growth1\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"PoolId\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"name\":\"rangeId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"rangeKey\",\"outputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"bool\",\"name\":\"set\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"rangeState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"totalShares\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"totalStaked\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"accFee0X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accFee1X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accStaked0X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accStaked1X128\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"stakedResidual0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"stakedResidual1\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"collectionSeq\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"resetSeq\",\"type\":\"uint64\"}],\"internalType\":\"struct RangeState\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAuthority\",\"type\":\"address\"}],\"name\":\"setAuthority\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"gate\",\"type\":\"address\"}],\"name\":\"setBallotGate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency[]\",\"name\":\"settleFirst\",\"type\":\"address[]\"},{\"internalType\":\"uint16\",\"name\":\"bps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"setClaimFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency[]\",\"name\":\"settleFirst\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"distributor_\",\"type\":\"address\"}],\"name\":\"setDistributor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency[]\",\"name\":\"settleFirst\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"sink\",\"type\":\"address\"}],\"name\":\"setFFFeeSink\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint24\",\"name\":\"floorPips\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"flatPips\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"cap\",\"type\":\"uint24\"}],\"name\":\"setPoolConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"shares\",\"type\":\"uint128\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency\",\"name\":\"currency\",\"type\":\"address\"}],\"name\":\"sweepClaimFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"Currency\",\"name\":\"currency\",\"type\":\"address\"}],\"name\":\"sweepDistributor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"syncRanges\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawData\",\"type\":\"bytes\"}],\"name\":\"unlockCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"shares\",\"type\":\"uint128\"}],\"name\":\"unstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"userPosition\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"staked\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"owed0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"owed1\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint0X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint1X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakedCheckpoint0X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakedCheckpoint1X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forgone0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forgone1\",\"type\":\"uint256\"}],\"internalType\":\"struct UserPosition\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"weth\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"Currency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"Currency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"contract IHooks\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct PoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"amount0Min\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1Min\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"WHAT NATIVE ACTUALLY TOUCHES. Uniswap v4 already moves native ETH itself on every payout      (`take` pays LPs' withdrawals and claims directly), and swappers settle with the      PoolManager, never with the hook. Exactly three seams remain, and they live in three      places:        1. pay-in — `LedgerLib._resolvePrincipal` settles a native deposit with           `settle{value:}` from the hook's balance, prepaid by the depositor           (`FablesLedger.deposit` is payable, requires `msg.value >= amount0Max`, and refunds           the unspent remainder in full at the end);        2. the gate — `_nativeAllowed()` is the coupled switch: overriding it to true is what           lets `beforeInitialize`/`_checkKey` admit native pools on THIS hook while every           ERC20-only hook keeps refusing them;        3. revenue — the epoch distributor speaks only ERC20, so the NATIVE currency's           staked-fee sweep wraps into WETH at this boundary (`_sweepDistributor` override) and           everything downstream (distributor, settlement indexer, merkle claims) stays           ERC20-pure. LP-facing money (withdraw, claimFees) stays native: LPs deposited ETH           and get ETH back.      WHAT THIS HOOK NEVER DOES: hold ETH between transactions. Deposits refund their whole      remaining balance in the same call; the sweep wraps and forwards within its own call. A      nonzero balance at rest is a stranger's forced transfer, and the next native deposit      returns it to circulation via the full-balance refund.      `receive()` is allowlisted to the PoolManager — the only counterparty that legitimately      pays this contract ETH (`take` during the wrap-sweep). WETH9 never sends ETH here      (`deposit` is a one-way wrap and nothing ever calls `withdraw`), and unsolicited transfers      are refused outright rather than silently absorbed.      ERC20 pools still work on this hook unchanged — `_nativeAllowed` ADDS native capability,      it does not require it. Whether to point ERC20 pools here or keep them on per-pool      `FablesRamp` instances is a deployment (blast-radius) decision, not a code one.\",\"errors\":{\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"AuthorityUpdated(address)\":{\"details\":\"Authority that manages this contract was updated.\"},\"ClaimFeeSwept(address,address,uint256)\":{\"details\":\"Mirrors `DistributorSwept` for the claim-fee sink. Its absence was a hole in the indexer's      reconstruction of the fee split, which is derived from logs alone.\"},\"DistributorSwept(address,address,uint256)\":{\"details\":\"Emitted when accrued staked-share revenue is pushed to the distributor (or the FF sink).      File-level so `LedgerLib.sweepDistributor` emits it with the identical      signature the settlement indexer reads.\"},\"FeesCollected(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint128,uint128,uint64,uint64)\":{\"details\":\"Emitted on every fee collection so the split between voters (staked) and holders      (unstaked) is reproducible from logs — the epoch-settlement trust model assumes exactly      that. File-level so `LedgerLib` emits it with the identical signature the      indexer reads.      Carries the per-staked-share accumulator LEVELS, which is what makes emission weight      attributable in time. `FeesForgone` fires when a holder is settled, and a settle can be      triggered by anyone (a dust transfer settles the receiver) at any block — so its timestamp      says when someone poked the position, not when the fees were earned. These levels move only      inside the collection itself, so integrating them against the Staked/Unstaked timeline      gives each holder's weight per epoch regardless of when anyone settles.      `feeGrowthInside0X128`/`1X128` are v4's own per-liquidity accumulator for the range, read at      the instant of collection: a week's forgone fees become a function of what the position      GENERATED rather than of when somebody collected it, so settlement can split a segment that      straddles a week boundary AT the boundary, identically for every holder. `totalShares`/      `totalStaked` carry the staked fraction rather than reconstructing it. `collectionSeq`      increments on EVERY emitted collection, so a DROPPED log is a visible gap and its epoch is      quarantined rather than under-paid (H6); `resetSeq` increments whenever the range's v4      position crosses zero liquidity in EITHER direction — the deterministic re-base signal that      replaced the indexer's steerable magnitude heuristic (H2).\"},\"FeesForgone(address,uint256,uint256,uint256)\":{\"details\":\"The emission weight, emitted per holder as it accrues. Settlement buckets these by      epoch to split a pool's vote-won emissions among the LPs who actually earned them.      File-level so `LedgerLib` emits it with the identical signature the      settlement indexer already reads.\"},\"NativeRevenueWrappedToWeth(address,address,uint256)\":{\"details\":\"Pairs with the `DistributorSwept(address(0), distributor, amount)` that fires alongside      it. The two describe one event from two sides, and BOTH are load-bearing for the      off-chain settlement indexer: the `DistributorSwept` clears the ledger's NATIVE      `distributorOwed` accrual (which is denominated in address(0), matching the      `FeesCollected` events that fed it), while THIS event states the delivered token —      the distributor speaks only ERC20 and receives `amount` of `weth`, never native ETH.      An indexer reconciling the distributor's on-chain token balances MUST credit WETH from      this event, not native ETH from the `DistributorSwept`, or native staked-fee revenue is      mis-attributed in the merkle. Making the conversion an explicit on-chain fact removes      the alternative — an undocumented `address(0) -> weth` convention the indexer had to      just know.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256,uint256)\":{\"params\":{\"amount\":\"The amount of the token.\",\"id\":\"The id of the token.\",\"spender\":\"The address of the spender.\"},\"returns\":{\"_0\":\"bool True, always\"}},\"authority()\":{\"details\":\"Returns the current authority.\"},\"claimFeeFor(uint64)\":{\"details\":\"The minimum, and not a time-weighted average, because a time-weighted average is not      computable here and pretending otherwise would be a guess dressed as arithmetic. v4      hands over one lump for the whole window and says nothing about WHEN inside it the      fees were earned — a week's backlog might all have accrued in one busy hour. Any      apportionment would be invented.      Given that, the minimum is the only defensible answer, for two reasons that matter      more than the revenue:        - It can never charge an LP a rate the protocol was not actually advertising while          their fees were accruing. Every other rule can.        - It bounds the timing game, though it does not remove it. Anyone can force a range          to realize its fees (`deposit` of one unit does it), so a third party picks the          moment a backlog is priced. Waiting can only ever LOWER the rate — so there is          nothing to gain by delaying. But a scheduled cut is public before it lands, and          collecting just BEFORE it closes the window at the old rate. An earlier version          of this comment claimed there was nothing to front-run; that is false, and the          exposure is bounded only by `MAX_CLAIM_FEE_BPS` and by the rate shipping at zero.      The cost is that ops must treat a dip as retroactive. Lowering the rate for an hour      applies that hour's rate to every backlog spanning it, however long. That is a real      constraint on the lever, and the right way round: it makes a cut generous rather than      a raise reaching backwards.\"},\"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)\":{\"params\":{\"to\":\"Recipient of the fees; lets a holder route around a token that blocks their        own address without stranding the other currency.\"}},\"currentFee(bytes32,bool)\":{\"details\":\"Uses a zero-amount probe, so size-dependent components read as zero here.\"},\"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)\":{\"details\":\"The bounds are NOT optional ceremony. `liquidity` says nothing about what it costs: the      token amounts fall out of the pool's live price inside `modifyLiquidity`, and whatever v4      asks for is pulled from the caller. Without a ceiling, the only limit was the caller's own      ERC-20 allowance, so a price move between signing and execution bought the whole position      one-sided at a price nobody agreed to. See `LedgerLib._checkBound`.Payable for the native-capable variant only. On an ERC20 pool any attached value      reverts — accepting it would strand ETH on a contract with no path back out. On a      native pool the caller must attach AT LEAST `amount0Max`: the actual amount owed is      only learned inside the unlock callback, `_checkBound` caps it at `amount0Max`, so      prepaying the ceiling guarantees settlement can never under-fund — and the unspent      remainder is refunded in full at the end (see `_refundNative`).\",\"params\":{\"amount0Max\":\"The most currency0 the caller will pay for this liquidity.\",\"amount1Max\":\"The most currency1 the caller will pay for this liquidity.\",\"deadline\":\"Latest block timestamp at which this deposit may execute.\"}},\"isConsumingScheduledOp()\":{\"details\":\"Returns true only in the context of a delayed restricted call, at the moment that the scheduled operation is being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs attacker controlled calls.\"},\"pause(uint256)\":{\"details\":\"A separate selector from `setPaused` so the fast key really is one-way. Binding the      combined `setPaused` to a zero-delay role looked like an emergency stop but handed      that same key the UNPAUSE — `setPaused(0)` clears the freeze — so a compromised      guardian could lift the multisig's freeze every block. This entry point can only      ever move `pausedUntil` forward, which is what makes it safe to run at zero delay,      and `setPaused` stays on the delayed ADMIN_ROLE for lifting it.\"},\"pokeFee(bytes32,uint24,uint40)\":{\"details\":\"Bounded on BOTH sides. The ceiling is the pool cap; the floor is the cheapest fee      the pool is configured to charge autonomously, so ops can still correct a fee that      is wrongly high (a mis-classified market day, say) but cannot go anywhere the pool      would not have gone by itself. This role is the one hot key in the system, granted      with no execution delay because reacting fast is its whole purpose — which makes it      the likeliest to be compromised. Without a floor, whoever held it could set every      pool to zero for 72 hours and renew for the price of gas, so LPs earn nothing while      arbitrageurs take the pool apart for free. A ceiling alone bounds the wrong end.\"},\"rangeGrowth(uint256)\":{\"details\":\"The read the boundary snapshotter is built on. Settlement attributes forgone fees to      the week they were GENERATED, so an interval of collection that straddles a week      boundary has to be split AT the boundary — and nothing happens on chain at a boundary      unless somebody syncs, so that one value cannot come from the log stream. It comes      from calling this at the boundary block instead.      A view rather than a stored snapshot, deliberately: reading it at a historical block      is exact, whereas a stored snapshot would be exact only if someone remembered to      write it in time — the punctuality dependency this whole change exists to remove.      IT IS NOT MONOTONIC ACROSS A LIQUIDITY RESET. An earlier version of this comment      claimed the accumulator \\\"moves only when a swap crosses the range\\\". It also moves      when a tick is initialised or cleared: v4 deletes `feeGrowthOutside` once the last      liquidity at a tick is removed and re-bases it against the current global on the next      deposit, so a range that empties and refills reads a fresh, unrelated baseline. Two      readings either side of that are not comparable, and settlement must treat a backwards      step as a reset rather than as a delta — which it does, loudly.\"},\"rangeKey(uint256)\":{\"details\":\"`rangeId` is a one-way hash, and the `Deposited`/`Staked`/`FeesCollected` events carry      only the id — so an off-chain settlement run seeing a `rangeId` cannot otherwise attribute      that range's fees to a pool/gauge without decoding deposit calldata. This exposes the      stored preimage so the mapping is available from the public ABI, first deposit onward.\"},\"setAuthority(address)\":{\"details\":\"Transfers control to a new authority. The caller must be the current authority.\"},\"setBallotGate(address)\":{\"details\":\"Probed, not merely stored. `setDistributor` spends a `try/catch` on its counterpart      for exactly this reason and this setter did not, so an EOA or a wrong-ABI contract      made `syncRanges` revert on `abi.decode` for every staked range — permanently      unusable, with no on-chain signal. `address(0)` stays explicitly allowed: a closed      door is the safe default for one that decides who may reach into someone else's      position, and `syncRanges` refuses outright while the gate is unset.\"},\"setOperator(address,bool)\":{\"params\":{\"approved\":\"The approval status.\",\"operator\":\"The address of the operator.\"},\"returns\":{\"_0\":\"bool True, always\"}},\"syncRanges(uint256,uint256[])\":{\"details\":\"Settlement needs this. v4 pays nothing until a position is touched, and a `rangeId`      is `(pool, tickLower, tickUpper)`, so an LP on bespoke bounds is the ONLY party who      can touch their range. Staked shares give their fees up to voters, which left      voters' revenue hostage to whether the LP who forgoes it ever felt like syncing —      and left each epoch's emission split guessing at fees that had not been booked yet.      Ops calls this over the staked ranges at each epoch boundary, which is also what      makes the `FeesCollected` accumulator levels line up with epoch boundaries so the      week's forgone fees are attributable exactly.It takes the claim fee like every other door, and it must. An earlier version skipped      the skim here on the grounds that \\\"the protocol forgoes its claim fee on syncs it did      not initiate — it still collects on every owner-driven path\\\". The second clause was      false. v4 pays nothing until a position is touched, so an owner-driven sync can only      ever skim fees accrued SINCE THE LAST TOUCH — and a free door that collects the whole      backlog sets that to nothing. Whoever touches a range last wins, so any voter of the      pool could hold the protocol's revenue on every staked range in it at zero forever,      for gas, by sweeping just before each owner claim. Charging uniformly is the only      shape with no door to arbitrage between.      It costs the caller nothing they are owed: the skim is taken from the UNSTAKED      residue, after `stakedCut` has already been set aside for the voters' pot. A voter      syncing to fund their own claim is not paying for the privilege.      The rate is still `min(live, snapshot)`, so a raise can never reach back over a      backlog earned under the old rate — which was the other thing the exemption was      protecting, and is protected here by `_effectiveClaimFee` instead of by a hole.\"},\"transfer(address,uint256,uint256)\":{\"details\":\"Staked shares are locked: only the unstaked balance is transferable.\"},\"transferFrom(address,address,uint256,uint256)\":{\"params\":{\"amount\":\"The amount of the token.\",\"id\":\"The id of the token.\",\"receiver\":\"The address of the receiver.\",\"sender\":\"The address of the sender.\"},\"returns\":{\"_0\":\"bool True, always, unless the function reverts\"}},\"unlockCallback(bytes)\":{\"details\":\"A thin shell: it checks the caller and hands the whole callback body to      `LedgerLib.onUnlock` (inlined), which decodes the action, applies a liquidity      modify or a payout, and settles fees and principal.\",\"params\":{\"data\":\"The data that was passed to the call to unlock\"},\"returns\":{\"_0\":\"Any data that you want to be returned from the unlock call\"}},\"unstake((address,address,uint24,int24,address),int24,int24,uint128)\":{\"details\":\"Deliberately NOT pausable, unlike `stake`. Unstaking only ever SHRINKS what the      distributor is owed and makes no external call, so it cannot be an exploit vector —      while pausing it would mean an LP cannot stop routing their fees to a distributor      the admin also chooses. Freezing the exit from a revenue assignment is not an      exploit response, it is the exploit.\"},\"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)\":{\"details\":\"Fees are collected first via `_syncRange` — a claims-only touch that makes no      token call — so the withdrawer still receives their cut at pre-burn totals. Shares      are burned before the pool touch that pays principal, so the only step that can      hand control to a token sees `totalShares` and position liquidity already in      agreement. Over-withdrawing still reverts, now at `_burn`, before anything moves.The mirror of `deposit`'s ceiling. A liquidity figure does not say what mix it returns —      the price decides — so an exit during a moved market handed back a lopsided pair the LP      never consented to. Deliberately still NOT pausable: a bound the caller chose is not a      reason to trap them, and passing zeroes remains a valid \\\"any mix will do\\\".\",\"params\":{\"amount0Min\":\"The least currency0 the caller will accept back for this liquidity.\",\"amount1Min\":\"The least currency1 the caller will accept back for this liquidity.\",\"deadline\":\"Latest block timestamp at which this withdrawal may execute.\",\"to\":\"Where the principal lands. `claimFees` already takes one so a holder can route        around a token that blocks their own address; `withdraw` hardcoded `msg.sender`,        which meant a blocklist on the LP froze their principal in BOTH currencies — and        the documented escape (transfer the receipt to a clean address) is pausable, so a        pause concurrent with a blocklist closed every exit. That contradicted this        contract's headline guarantee that withdrawals are unconditional.\"}}},\"title\":\"FablesRampETH\",\"version\":1},\"userdoc\":{\"errors\":{\"DeadlineExpired()\":[{\"notice\":\"The transaction was mined after the caller's stated deadline.\"}],\"PrincipalAboveMax(uint256,uint256)\":[{\"notice\":\"A deposit's settled principal exceeded the caller's stated ceiling for that currency.\"}],\"PrincipalBelowMin(uint256,uint256)\":[{\"notice\":\"A withdrawal's settled principal fell short of the caller's stated floor.\"}]},\"events\":{\"NativeRevenueWrappedToWeth(address,address,uint256)\":{\"notice\":\"Emitted when a NATIVE staked-fee sweep is delivered to the distributor as WETH.\"}},\"kind\":\"user\",\"methods\":{\"ABSOLUTE_MAX_FEE()\":{\"notice\":\"Hard ceiling on any pool's fee cap, fixed at deployment. No role can configure         or poke a fee above it; changing it means deploying a new singleton.\"},\"MAX_PAUSE()\":{\"notice\":\"Longest a single pause can last before it must be renewed on purpose.\"},\"MAX_POKE_DISCOUNT_BPS()\":{\"notice\":\"Most of the live autonomous fee a poke may cut away. A poke is for reacting         fast, not for switching the curve off; a mis-classified market day is corrected         through the calendar overlay, which is what that overlay exists for.\"},\"MAX_POKE_TTL()\":{\"notice\":\"Longest a poked fee can outlive its transaction.\"},\"MIN_POOL_FEE()\":{\"notice\":\"Cheapest fee any pool may be configured to charge, fixed in bytecode.\"},\"allowance(address,address,uint256)\":{\"notice\":\"Spender allowance of an id.\"},\"approve(address,uint256,uint256)\":{\"notice\":\"Approves an amount of an id to a spender.\"},\"balanceOf(address,uint256)\":{\"notice\":\"Owner balance of an id.\"},\"ballotGate()\":{\"notice\":\"The Voter, consulted to decide who may collect a staked range's fees.\"},\"beforeInitialize(address,(address,address,uint24,int24,address),uint160)\":{\"notice\":\"Pools must use the dynamic-fee flag and be configured before initialization.\"},\"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\":{\"notice\":\"Returns the per-swap fee override; never touches swap deltas.\"},\"claimFeeAllTimeMin()\":{\"notice\":\"The lowest rate this ledger has ever stood at. The fallback for a backlog older         than the bounded walk can reach.\"},\"claimFeeBps()\":{\"notice\":\"Admin levers. None of them is readable from the withdraw path.\"},\"claimFeeChangeAt(uint256)\":{\"notice\":\"One recorded claim-fee change.\"},\"claimFeeFor(uint64)\":{\"notice\":\"The rate a backlog that opened at history index `sinceIndex` will actually be         charged: the LOWEST rate that stood at any point from then until now.\"},\"claimFeeHistoryLength()\":{\"notice\":\"Number of recorded claim-fee changes.\"},\"claimFeeOwed(address)\":{\"notice\":\"Claim-fee cut accrued for the recipient. Pull, never push: a blocked or         paused recipient must not be able to block anyone else's claim.\"},\"claimFeeSyncIndex(uint256)\":{\"notice\":\"How many rate changes had been recorded when each range last realized its fees —         i.e. where in the history its current backlog opened.\"},\"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)\":{\"notice\":\"Syncs the range's fees from the pool and pays the caller's accrued share, minus         the claim fee (fees only — principal is never touched).\"},\"clearPoke(bytes32)\":{\"notice\":\"Clears an active poke, returning the pool to its autonomous fee.\"},\"currentFee(bytes32,bool)\":{\"notice\":\"Fee the pool would charge a swap in the given direction right now, in pips.\"},\"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)\":{\"notice\":\"Deposits `liquidity` units into the hook-owned position for the given range and         mints receipts 1:1. Caller must have approved this contract for both tokens.\"},\"distributorFF()\":{\"notice\":\"The protocol token, cached from the distributor. Refused by `sweepDistributor`.\"},\"effectiveClaimFee(uint256)\":{\"notice\":\"The rate a range's current backlog will be charged if it is synced now.\"},\"ffFeeSink()\":{\"notice\":\"Destination for FF-denominated staked-fee revenue. See `sweepDistributor`.\"},\"flatFee(bytes32)\":{\"notice\":\"The flat fee configured for a pool, in pips.\"},\"isOperator(address,address)\":{\"notice\":\"Checks if a spender is approved by an owner as an operator\"},\"isSettling()\":{\"notice\":\"True while a ledger operation is mid-flight. Always false to an external         caller; only a token callback fired from inside this contract can observe it         set. Integrators pricing receipts from within such a callback should refuse.\"},\"maxFee(bytes32)\":{\"notice\":\"Per-pool fee cap in pips; zero means the pool is not configured.\"},\"pause(uint256)\":{\"notice\":\"Freezes the ledger. Cannot unfreeze, and cannot shorten a freeze already running.\"},\"paused()\":{\"notice\":\"True while the ledger is paused.\"},\"pausedUntil()\":{\"notice\":\"Exploit-response switch: freezes deposits, claims, staking, transfers and         sweeps. Principal withdrawal and unstaking are deliberately NOT pausable, ever.\"},\"pokeFee(bytes32,uint24,uint40)\":{\"notice\":\"Temporarily replaces the autonomous fee for a pool. Expires on its own.\"},\"pokeFloor(bytes32)\":{\"notice\":\"Cheapest fee each pool can charge autonomously — the lower bound on a poke.\"},\"pokeOf(bytes32)\":{\"notice\":\"Active poked override per pool; ignored once expired.\"},\"rangeGrowth(uint256)\":{\"notice\":\"v4's per-liquidity fee accumulator for a range, right now.\"},\"rangeKey(uint256)\":{\"notice\":\"The pool key and tick range a `rangeId` was registered under. `set` is false for an         id that has never been deposited into.\"},\"setBallotGate(address)\":{\"notice\":\"Points the sync gate at the Voter. Until it is set, nothing can be synced through         this door at all — a closed door being the safe default for one that decides who         may reach into someone else's position.\"},\"setFFFeeSink(address[],address)\":{\"notice\":\"Where FF-denominated staked-share fee revenue is swept. Separate from         `distributor` because the epoch distributor cannot pay FF out as a fee.\"},\"setOperator(address,bool)\":{\"notice\":\"Sets or removes an operator for the caller.\"},\"setPaused(uint256)\":{\"notice\":\"Pauses for `duration` seconds, or lifts the pause when `duration` is zero.\"},\"setPoolConfig((address,address,uint24,int24,address),uint24,uint24,uint24)\":{\"notice\":\"Registers or updates a pool's flat fee and its poke bounds. `floorPips` is the         cheapest a poke may reach, `flatPips` the fee charged with no live poke, `cap` the         ceiling; a poke never escapes `[floorPips, cap]` and expires back to `flatPips`.\"},\"stake((address,address,uint24,int24,address),int24,int24,uint128)\":{\"notice\":\"Stakes receipts: their future fee accrual routes to the distributor.\"},\"sweepClaimFee(address)\":{\"notice\":\"Pushes accrued claim-fee revenue to the recipient. Callable by anyone.\"},\"sweepDistributor(address)\":{\"notice\":\"Pushes accumulated staked-share fees to the distributor. Callable by anyone.\"},\"syncRanges(uint256,uint256[])\":{\"notice\":\"Realizes v4's lazily-accrued fees for a list of ranges, splitting each between         its unstaked holders and the voters' pot. Permissionless, unpausable, and it         moves no tokens out of this contract — it only turns fees the pool already holds         into balances this ledger has attributed.\"},\"transferFrom(address,address,uint256,uint256)\":{\"notice\":\"Transfers an amount of an id from a sender to a receiver.\"},\"unlockCallback(bytes)\":{\"notice\":\"Called by the pool manager on `msg.sender` when the manager is unlocked\"},\"unstake((address,address,uint24,int24,address),int24,int24,uint128)\":{\"notice\":\"Unstakes receipts; permissionless, instant, dependency-free.\"},\"weth()\":{\"notice\":\"The canonical wrapped-ETH contract native revenue is wrapped into for the         ERC20-only distributor. Immutable: a mutable WETH would be a mutable custodian of         every future native sweep.\"},\"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)\":{\"notice\":\"Burns receipts and removes the corresponding liquidity to the caller. Reads no         admin state; auto-unstakes if the unstaked balance is insufficient.\"}},\"notice\":\"`FablesRamp` for pools whose currency0 is NATIVE ETH. Robinhood Chain's real ETH         liquidity is quoted in native ETH, not WETH — the WETH pools are dead — so an ETH desk         that wants the flow must speak native. Same flat-fee-plus-poke pricing, same ledger,         same roles; this contract adds only the machinery that native currency requires.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/FablesRampETH.sol\":\"FablesRampETH\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/@ensdomains/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/v4-core/lib/solmate/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":hardhat/=/Users/yanisberkani/alphix/code/fables/lib/v4-core/node_modules/hardhat/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solmate/=lib/v4-core/lib/solmate/\",\":v4-core/=lib/v4-core/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol\":{\"keccak256\":\"0x9a41463f69550175831e0868e65e2701658b32f0773ad9f319dacca6d5a43739\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://054247d4c7d0c68fa77efa361c9eee5b110b49df05518f016ba68f2c496dfe74\",\"dweb:/ipfs/QmeQQixquSPZtsHkQw7nruH7hXmLFHWfhN6AZwoLFMp5KS\"]},\"lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol\":{\"keccak256\":\"0x05fd06ae5bca9dc7470fb2dfae764315c81a84f591e86be6fec0c115474edc6c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://998ffed150fad3264d73c847f2ca35ee750d747ece382bb48885e8c8dce62941\",\"dweb:/ipfs/QmSjacwVExF2T9ZFysQQ3vVLJbDQ16G7zd81SDxPCfNFxe\"]},\"lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol\":{\"keccak256\":\"0x1121e070554cffc6d536f658332a1a3d65fb2ea5573cd774f4ecbd02a2fcf4b7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6913b339d10018d60322c56faa6d6455e707b3c46a15261b639389a710a42ff3\",\"dweb:/ipfs/QmXrKvfnS5hnXACEzu1Kd4DBBW2gJm2Tg2tFpLynhvuTUM\"]},\"lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol\":{\"keccak256\":\"0x18d11c7284c6ff8c378db95771175322b8bf360d1ed8d147838784f1fa042daa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ccb94094fd000bc31d4b6982008d9d6cb683027342f6153a5d62a27cd1b7ba1b\",\"dweb:/ipfs/QmdU5fQGidjCeixpgELbVnygAyD8pQz2UKSfbzMmq3dE5g\"]},\"lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol\":{\"keccak256\":\"0x9c9a58dd831b9bb4a0ea47d96b53c13ab9a6e4270a518ea395b1424092fd74dc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d806b0c87fbcaf0cb827b51203b27f8289b13743aeadb5867fbbe041fcf87a92\",\"dweb:/ipfs/QmfTEGiDGxKDaqBuBJ5wWJockGDrsEBZnW5S7UWrKhAxGc\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol\":{\"keccak256\":\"0xd735962e3d6660884153ba8a972b5f100dde4c482f2ff1c525ba7fdefb154cbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a264d17b093f585844b0d977e9f60555b8c8d6513b304fde863cdf652a0d336\",\"dweb:/ipfs/QmWXfaJisjVnrjTUjZGryZpMob9wKivvtbodLS3PTc1ttq\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e\",\"dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x318ea37780610ca7808852275651885d428669402b81488cb7434fde361e9704\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4aad80ad93cedad85619900fd7c2084c4d2f4b28f1dbda27e491c5f4fd31025d\",\"dweb:/ipfs/QmUyXtX7FUi2u1W5fs7ufka9XkRVb5ss2menQHTsrsSmqZ\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol\":{\"keccak256\":\"0x8b95459390767d84c984d18faee298ce913e69cf0be8d2fe7785e2ad487ffed8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b5949065ea24feded902e4b0586f547ae6360b4eda7572419d72fe9d5714d1b9\",\"dweb:/ipfs/Qme52ocDwVG8nt9Xvf3j4h9SU1WWk2PHSEk97nRD4sNvY4\"]},\"lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/v4-core/src/ERC6909.sol\":{\"keccak256\":\"0x22476a1c183be1b547a509b3e6906abaccb6408375f798fce805ff7877aca09f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e85580e1563ea0556705132fb6bd038ca4aa355749039923853ebcb76b7c84e6\",\"dweb:/ipfs/QmVoxPrbagRKpFdRWoaCSKmStYLZrhNFuedcuyGycSGR7q\"]},\"lib/v4-core/src/interfaces/IExtsload.sol\":{\"keccak256\":\"0x80b53ca4907d6f0088c3b931f2b72cad1dc4615a95094d96bd0fb8dff8d5ba43\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://375c69148622aab7a3537d5fd37d373a8e9731022c8d87bdaee46233b0a99fe1\",\"dweb:/ipfs/QmXFjdoYRxsA5B1kyuxEXgNf3FBoL1zPvy26Qy8EtpdFRN\"]},\"lib/v4-core/src/interfaces/IExttload.sol\":{\"keccak256\":\"0xc6b68283ebd8d1c789df536756726eed51c589134bb20821b236a0d22a135937\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://294394f72dfc219689209f4130d85601dfd0d63c8d47578050d312db70f9b6c8\",\"dweb:/ipfs/QmTDMQ3oxCGHgEBU48a3Lp4S1rRjc8vVCxkhE5ZNej1bsY\"]},\"lib/v4-core/src/interfaces/IHooks.sol\":{\"keccak256\":\"0x4c9571aed0c2b6ef11832545554fc11ffdb03746daaf5c73683c00600bfc7ec0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e78b34b58ce9de91b91943b4f3cc3ce121d0b151e123e8a600ac5ef64d91db6c\",\"dweb:/ipfs/QmRkaQnPCYwLrXgbpGujJTx32PaZK63KSPJJV1XmnQuCMb\"]},\"lib/v4-core/src/interfaces/IPoolManager.sol\":{\"keccak256\":\"0x3534f00531038e77ab8a7fc4d0a6e0993ee53fb7a396b1324ad917318ea46cea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0a4a7e771828dc40848485b568a1cf514f553ace6653f4f4d1ad3f3e9cdb6c27\",\"dweb:/ipfs/QmTjzQ7KVYnrEWtxPER2E4MXzycgcznfzSDsZtd5turk5V\"]},\"lib/v4-core/src/interfaces/IProtocolFees.sol\":{\"keccak256\":\"0x32a666e588a2f66334430357bb1e2424fe7eebeb98a3364b1dd16eb6ccca9848\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://85751d302125881f72e5f8af051c2d5d9b1f606ebaea8ca7d04fccdd27cc252d\",\"dweb:/ipfs/QmeRwomeh9NWm6A6fgNA4KZPQZHPpdKsPQyYsHSFmvud7J\"]},\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":{\"keccak256\":\"0x58c82f2bd9d7c097ed09bd0991fedc403b0ec270eb3d0158bfb095c06a03d719\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91168ca26a10980df2cdc3fbfe8ddf372c002b7ef19e3c59a0c9870d64198f1b\",\"dweb:/ipfs/QmUSpaM825vd1SwvF38esgbdLgYiPwefKaFERTWvUi6uSK\"]},\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":{\"keccak256\":\"0xeccadf1bf69ba2eb51f2fe4fa511bc7bb05bbd6b9f9a3cb8e5d83d9582613e0f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://118757369892687b99ef46ce28d6861f62c098285bd7687a4f17f7e44e5f81de\",\"dweb:/ipfs/QmUxqbYqQtcEwwFbb9e6BBMePEaSgN8C45v6RKubD4ib8d\"]},\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":{\"keccak256\":\"0xa586f345739e52b0488a0fe40b6e375cce67fdd25758408b0efcb5133ad96a48\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8c557b7e52abdbbd82e415a1acc27921446a7fd090b7d4877e52be72619547f\",\"dweb:/ipfs/QmXE2KNPbXmGX8BQF3ei6zhzRTnhoTQg39XmqMnkhbr6QK\"]},\"lib/v4-core/src/libraries/CustomRevert.sol\":{\"keccak256\":\"0x111ed3031b6990c80a93ae35dde6b6ac0b7e6af471388fdd7461e91edda9b7de\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c9ea883c98d6ae1829160d0977bb5195761cfd5bc81692d0a941f45717f594cd\",\"dweb:/ipfs/QmZPwxzaeMNv536wzrAMrMswu7vMHuqPVpjcqL3YvCMoxt\"]},\"lib/v4-core/src/libraries/FixedPoint128.sol\":{\"keccak256\":\"0xad236e10853f4b4b20a35a9bb52b857c4fc79874846b7e444e06ead7f2630542\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0de1f9a06520b1a689660943faa14fc0b8344ab41fab9e6012ea34bff4b9b3eb\",\"dweb:/ipfs/QmRNMPTyko7W6d6KxuTsnDBa9oZgDK4xiwRRq3H9ASTbwy\"]},\"lib/v4-core/src/libraries/FullMath.sol\":{\"keccak256\":\"0x4fc73a00817193fd3cac1cc03d8167d21af97d75f1815a070ee31a90c702b4c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3b2d66d36b1ad56b1ab6e2eb8a816740877b40b461c93f125e88621c8378e52\",\"dweb:/ipfs/QmPGvMZzKQvNiWKd8aRzzdW7oAizwrMgcMtnaworDkVHFC\"]},\"lib/v4-core/src/libraries/Hooks.sol\":{\"keccak256\":\"0x27b1c3b8aa3d07d8e3123970695745929315685a5ffaa7342c3ba3582f37fecb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fa3bb092dc205eaa1b9defc93e9bbad5f4c5c44e1c4aa531dfca2574c2aba9ba\",\"dweb:/ipfs/QmR1soxkepHNkbGxAMaK4XqhQ4VxWn69dewzGkQJNx5byM\"]},\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":{\"keccak256\":\"0xbf6914e01014e7c1044111feb7df7a3d96bb503b3da827ad8464b1955580d13b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33823c20a91882c9aacdcbb02f0558c05209f4d5954aa6dd4fa17c95664db475\",\"dweb:/ipfs/QmR7owkFgpfztpp1QUg3ut3nw9iPVQqLGP4hzgmZtRUQ2J\"]},\"lib/v4-core/src/libraries/LiquidityMath.sol\":{\"keccak256\":\"0x000ef2eadcc1eb7b2c18a77655f94e76e0e860f605783484657ef65fd6eda353\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a766b620a7a22798b43c6c1f23b5c6cff0ebf588deb89842bad05208d448cd99\",\"dweb:/ipfs/QmVKjaFJdzkqA3ey2Byum8iTCMssWVD8MmVC8rw62Tj5WD\"]},\"lib/v4-core/src/libraries/ParseBytes.sol\":{\"keccak256\":\"0x7533b13f53ee2c2c55500100b22ffd6e37e7523c27874edc98663d53a8672b15\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82449058634fde28a085f3c59a6a5f412550c02181590593fd84c3e8b329aa17\",\"dweb:/ipfs/Qmev4E9Au6SsE4wsArChCwfg94KhHc5gYsEsZUnjF5sRLa\"]},\"lib/v4-core/src/libraries/Position.sol\":{\"keccak256\":\"0xddab2a831f1befb6abf5567e77c4582169ca8156cf69eb4f22d8e87f7226a3f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c79fe61b50f3b70cff503abfa6f5643fcbefb9b794855bee1019b1e6d9c083b2\",\"dweb:/ipfs/QmbKmYNQesaMz8bo1b7TMHQcAwaDd3eDPrE5pAdPPZTtk5\"]},\"lib/v4-core/src/libraries/SafeCast.sol\":{\"keccak256\":\"0x42c4a24f996a14d358be397b71f7ec9d7daf666aaec78002c63315a6ee67aa86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c3db86e2ba3679105fc32edec656c70282e1fede6cab11217702443f6c26fa59\",\"dweb:/ipfs/QmX4yaaSPdKQzYNRsezjTvZKsubzS8JRTEGFD3fPpTTCcj\"]},\"lib/v4-core/src/libraries/StateLibrary.sol\":{\"keccak256\":\"0x96db333ee126a841dd959e38e452cc59d73583cb0437a1d48b2052e33a74f952\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8672bba1eb69608299b0904f4ff305238eb18479d371c26518f278c9ee184cd0\",\"dweb:/ipfs/QmTLu3s6ECvsEDHStQv8HTVHYtvkviBbdjPrFJd4SpVRFY\"]},\"lib/v4-core/src/types/BalanceDelta.sol\":{\"keccak256\":\"0xa719c8fe51e0a9524280178f19f6851bcc3b3b60e73618f3d60905d35ae5569f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7436928dc9de35c6c7c5c636cb51adaf295cfd590da83b19a004ae33cbec9ef9\",\"dweb:/ipfs/QmRJ9yZkUpzk4433GX3LgVVL8jwpbSYSUwXcucKisf3v4H\"]},\"lib/v4-core/src/types/BeforeSwapDelta.sol\":{\"keccak256\":\"0x2a774312d91285313d569da1a718c909655da5432310417692097a1d4dc83a78\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2c7a0379955cff9c17ab9e61f95e42909aa5947c22740f86ce940d09856f782\",\"dweb:/ipfs/QmaAuo8UBYXsGrVuKh8iRoAAdqwtg1jDq515cW1ZRP5m9K\"]},\"lib/v4-core/src/types/Currency.sol\":{\"keccak256\":\"0x4a0b84b282577ff6f8acf13ec9f4d32dbb9348748b49611d00e68bee96609c93\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://45f9d62ab3d51b52957279e353853ba1547c3182c9a1e3d1846ada4a90263b01\",\"dweb:/ipfs/QmS8NG84ccQS1yXVD8cv3eKX7J1UKxuJhbUfHTQR2opKF5\"]},\"lib/v4-core/src/types/PoolId.sol\":{\"keccak256\":\"0x308311916ea0f5c2fd878b6a2751eb223d170a69e33f601fae56dfe3c5d392af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://669c2cd7ac17690b5d8831e0bda72822376c3a04b36afed6d31df4d75fe60918\",\"dweb:/ipfs/QmT6EpkxqU8VF3WsgrZ66F3s1cCQRffR95z1HDYZz7ph6y\"]},\"lib/v4-core/src/types/PoolKey.sol\":{\"keccak256\":\"0xf89856e0580d7a4856d3187a76858377ccee9d59702d230c338d84388221b786\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f3118fa189025695c37fdf0bdd1190f085ad097484d3c88cf4c56d1db65f639\",\"dweb:/ipfs/QmamXpgtB8GV1CaFLvqefPWSoikLDhMk1yU4heBnVzU8gi\"]},\"src/FablesRamp.sol\":{\"keccak256\":\"0x702f66da05bed6bd4f44154a405e4a68cfa80b32155d6734ae17ebe06fd03819\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://0883350c59c5b9c8ea4928ce6cef60ca7feb9b4473ddbf2d5d8ebcf8dc611cf7\",\"dweb:/ipfs/QmTwMgLBaegfUKypMtB2wnVSZVUWiUW1CtkAVwHi4bXbNQ\"]},\"src/FablesRampETH.sol\":{\"keccak256\":\"0xe46b0cf72af83625f79ded2650ed878b3ff6dd8b97bf3b8535116246fba8c251\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://dd553ea617bb3f12db000b67ec1f4c2dc5496a10670121cb17cd9284e4fb60f8\",\"dweb:/ipfs/QmRhoHPWvskbf4Xrj9LDncvHTjR5CyHTAqBYe7oi1nmmaZ\"]},\"src/base/FablesBaseHook.sol\":{\"keccak256\":\"0x90d06d26d291ec26e1c958c0b36bdcb13728402e966f4c6040b2e6d7d3deb865\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://d6547b0a0d3ccc6184ccd58f6da49982d4a4f90a2d022dc46554d0213b3c5496\",\"dweb:/ipfs/QmdSq6RDVdUU4nLjKA1UQ8ThhZpatehRctnaNDrmBzNntc\"]},\"src/base/FablesLedger.sol\":{\"keccak256\":\"0xa87b312bef0ca67c6b0b36251438ea23c3dedf60e6fb657bd0a53937e88cb859\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://143a013b33d6c1e3b9dc62c1d04562780656ee7d7df5125b4de996814f6ea6e6\",\"dweb:/ipfs/QmdCW6fKPoRYiMDk1xcbPq4UTX5B2FDp4rs8x6mj4j47Lc\"]},\"src/base/LedgerTypes.sol\":{\"keccak256\":\"0x46c59557e69be54c6f621373a9b8f4fea65e08ee23a5fd2a184bf78d4c04ac86\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cea2667ce65c396876f3dfb9d7652b9134f802907fb7485585ae35560b04beed\",\"dweb:/ipfs/QmT8w49yjcpydED1x3dgmWGrbwDaiPMWUKpniVZB4NUyYr\"]},\"src/libraries/LedgerLib.sol\":{\"keccak256\":\"0x84dc36424753decff5ebac4476f8ba7029db5cc1aebc420817626469d7ffb9c6\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://66abbaf52c71a5c59999ff7ba3d0dbd210cff651a0aa1a482ea46a461d0820aa\",\"dweb:/ipfs/QmcMJhWSxfFJXTDHhfwnkZ8UhR3SwspA9y8uVy4SarZBeC\"]}},\"version\":1}","userdoc":{"kind":"user","errors":{"DeadlineExpired()":[{"notice":"The transaction was mined after the caller's stated deadline."}],"PrincipalAboveMax(uint256,uint256)":[{"notice":"A deposit's settled principal exceeded the caller's stated ceiling for that currency."}],"PrincipalBelowMin(uint256,uint256)":[{"notice":"A withdrawal's settled principal fell short of the caller's stated floor."}]},"events":{"NativeRevenueWrappedToWeth(address,address,uint256)":{"notice":"Emitted when a NATIVE staked-fee sweep is delivered to the distributor as WETH."}},"notice":"`FablesRamp` for pools whose currency0 is NATIVE ETH. Robinhood Chain's real ETH         liquidity is quoted in native ETH, not WETH — the WETH pools are dead — so an ETH desk         that wants the flow must speak native. Same flat-fee-plus-poke pricing, same ledger,         same roles; this contract adds only the machinery that native currency requires.","methods":{"weth()":{"notice":"The canonical wrapped-ETH contract native revenue is wrapped into for the         ERC20-only distributor. Immutable: a mutable WETH would be a mutable custodian of         every future native sweep."},"paused()":{"notice":"True while the ledger is paused."},"MAX_PAUSE()":{"notice":"Longest a single pause can last before it must be renewed on purpose."},"ffFeeSink()":{"notice":"Destination for FF-denominated staked-fee revenue. See `sweepDistributor`."},"ballotGate()":{"notice":"The Voter, consulted to decide who may collect a staked range's fees."},"isSettling()":{"notice":"True while a ledger operation is mid-flight. Always false to an external         caller; only a token callback fired from inside this contract can observe it         set. Integrators pricing receipts from within such a callback should refuse."},"claimFeeBps()":{"notice":"Admin levers. None of them is readable from the withdraw path."},"pausedUntil()":{"notice":"Exploit-response switch: freezes deposits, claims, staking, transfers and         sweeps. Principal withdrawal and unstaking are deliberately NOT pausable, ever."},"MAX_POKE_TTL()":{"notice":"Longest a poked fee can outlive its transaction."},"MIN_POOL_FEE()":{"notice":"Cheapest fee any pool may be configured to charge, fixed in bytecode."},"pause(uint256)":{"notice":"Freezes the ledger. Cannot unfreeze, and cannot shorten a freeze already running."},"distributorFF()":{"notice":"The protocol token, cached from the distributor. Refused by `sweepDistributor`."},"maxFee(bytes32)":{"notice":"Per-pool fee cap in pips; zero means the pool is not configured."},"pokeOf(bytes32)":{"notice":"Active poked override per pool; ignored once expired."},"flatFee(bytes32)":{"notice":"The flat fee configured for a pool, in pips."},"rangeKey(uint256)":{"notice":"The pool key and tick range a `rangeId` was registered under. `set` is false for an         id that has never been deposited into."},"ABSOLUTE_MAX_FEE()":{"notice":"Hard ceiling on any pool's fee cap, fixed at deployment. No role can configure         or poke a fee above it; changing it means deploying a new singleton."},"clearPoke(bytes32)":{"notice":"Clears an active poke, returning the pool to its autonomous fee."},"pokeFloor(bytes32)":{"notice":"Cheapest fee each pool can charge autonomously — the lower bound on a poke."},"setPaused(uint256)":{"notice":"Pauses for `duration` seconds, or lifts the pause when `duration` is zero."},"claimFeeFor(uint64)":{"notice":"The rate a backlog that opened at history index `sinceIndex` will actually be         charged: the LOWEST rate that stood at any point from then until now."},"claimFeeAllTimeMin()":{"notice":"The lowest rate this ledger has ever stood at. The fallback for a backlog older         than the bounded walk can reach."},"rangeGrowth(uint256)":{"notice":"v4's per-liquidity fee accumulator for a range, right now."},"claimFeeOwed(address)":{"notice":"Claim-fee cut accrued for the recipient. Pull, never push: a blocked or         paused recipient must not be able to block anyone else's claim."},"unlockCallback(bytes)":{"notice":"Called by the pool manager on `msg.sender` when the manager is unlocked"},"setBallotGate(address)":{"notice":"Points the sync gate at the Voter. Until it is set, nothing can be synced through         this door at all — a closed door being the safe default for one that decides who         may reach into someone else's position."},"sweepClaimFee(address)":{"notice":"Pushes accrued claim-fee revenue to the recipient. Callable by anyone."},"MAX_POKE_DISCOUNT_BPS()":{"notice":"Most of the live autonomous fee a poke may cut away. A poke is for reacting         fast, not for switching the curve off; a mis-classified market day is corrected         through the calendar overlay, which is what that overlay exists for."},"claimFeeHistoryLength()":{"notice":"Number of recorded claim-fee changes."},"currentFee(bytes32,bool)":{"notice":"Fee the pool would charge a swap in the given direction right now, in pips."},"claimFeeChangeAt(uint256)":{"notice":"One recorded claim-fee change."},"setOperator(address,bool)":{"notice":"Sets or removes an operator for the caller."},"sweepDistributor(address)":{"notice":"Pushes accumulated staked-share fees to the distributor. Callable by anyone."},"balanceOf(address,uint256)":{"notice":"Owner balance of an id."},"claimFeeSyncIndex(uint256)":{"notice":"How many rate changes had been recorded when each range last realized its fees —         i.e. where in the history its current backlog opened."},"effectiveClaimFee(uint256)":{"notice":"The rate a range's current backlog will be charged if it is synced now."},"isOperator(address,address)":{"notice":"Checks if a spender is approved by an owner as an operator"},"syncRanges(uint256,uint256[])":{"notice":"Realizes v4's lazily-accrued fees for a list of ranges, splitting each between         its unstaked holders and the voters' pot. Permissionless, unpausable, and it         moves no tokens out of this contract — it only turns fees the pool already holds         into balances this ledger has attributed."},"pokeFee(bytes32,uint24,uint40)":{"notice":"Temporarily replaces the autonomous fee for a pool. Expires on its own."},"setFFFeeSink(address[],address)":{"notice":"Where FF-denominated staked-share fee revenue is swept. Separate from         `distributor` because the epoch distributor cannot pay FF out as a fee."},"approve(address,uint256,uint256)":{"notice":"Approves an amount of an id to a spender."},"allowance(address,address,uint256)":{"notice":"Spender allowance of an id."},"transferFrom(address,address,uint256,uint256)":{"notice":"Transfers an amount of an id from a sender to a receiver."},"stake((address,address,uint24,int24,address),int24,int24,uint128)":{"notice":"Stakes receipts: their future fee accrual routes to the distributor."},"unstake((address,address,uint24,int24,address),int24,int24,uint128)":{"notice":"Unstakes receipts; permissionless, instant, dependency-free."},"beforeInitialize(address,(address,address,uint24,int24,address),uint160)":{"notice":"Pools must use the dynamic-fee flag and be configured before initialization."},"setPoolConfig((address,address,uint24,int24,address),uint24,uint24,uint24)":{"notice":"Registers or updates a pool's flat fee and its poke bounds. `floorPips` is the         cheapest a poke may reach, `flatPips` the fee charged with no live poke, `cap` the         ceiling; a poke never escapes `[floorPips, cap]` and expires back to `flatPips`."},"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)":{"notice":"Syncs the range's fees from the pool and pays the caller's accrued share, minus         the claim fee (fees only — principal is never touched)."},"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)":{"notice":"Returns the per-swap fee override; never touches swap deltas."},"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)":{"notice":"Deposits `liquidity` units into the hook-owned position for the given range and         mints receipts 1:1. Caller must have approved this contract for both tokens."},"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)":{"notice":"Burns receipts and removes the corresponding liquidity to the caller. Reads no         admin state; auto-unstakes if the unstaked balance is insufficient."}},"version":1},"devdoc":{"kind":"dev","title":"FablesRampETH","errors":{"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"AuthorityUpdated(address)":{"details":"Authority that manages this contract was updated."},"ClaimFeeSwept(address,address,uint256)":{"details":"Mirrors `DistributorSwept` for the claim-fee sink. Its absence was a hole in the indexer's      reconstruction of the fee split, which is derived from logs alone."},"DistributorSwept(address,address,uint256)":{"details":"Emitted when accrued staked-share revenue is pushed to the distributor (or the FF sink).      File-level so `LedgerLib.sweepDistributor` emits it with the identical      signature the settlement indexer reads."},"FeesForgone(address,uint256,uint256,uint256)":{"details":"The emission weight, emitted per holder as it accrues. Settlement buckets these by      epoch to split a pool's vote-won emissions among the LPs who actually earned them.      File-level so `LedgerLib` emits it with the identical signature the      settlement indexer already reads."},"NativeRevenueWrappedToWeth(address,address,uint256)":{"details":"Pairs with the `DistributorSwept(address(0), distributor, amount)` that fires alongside      it. The two describe one event from two sides, and BOTH are load-bearing for the      off-chain settlement indexer: the `DistributorSwept` clears the ledger's NATIVE      `distributorOwed` accrual (which is denominated in address(0), matching the      `FeesCollected` events that fed it), while THIS event states the delivered token —      the distributor speaks only ERC20 and receives `amount` of `weth`, never native ETH.      An indexer reconciling the distributor's on-chain token balances MUST credit WETH from      this event, not native ETH from the `DistributorSwept`, or native staked-fee revenue is      mis-attributed in the merkle. Making the conversion an explicit on-chain fact removes      the alternative — an undocumented `address(0) -> weth` convention the indexer had to      just know."},"FeesCollected(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint128,uint128,uint64,uint64)":{"details":"Emitted on every fee collection so the split between voters (staked) and holders      (unstaked) is reproducible from logs — the epoch-settlement trust model assumes exactly      that. File-level so `LedgerLib` emits it with the identical signature the      indexer reads.      Carries the per-staked-share accumulator LEVELS, which is what makes emission weight      attributable in time. `FeesForgone` fires when a holder is settled, and a settle can be      triggered by anyone (a dust transfer settles the receiver) at any block — so its timestamp      says when someone poked the position, not when the fees were earned. These levels move only      inside the collection itself, so integrating them against the Staked/Unstaked timeline      gives each holder's weight per epoch regardless of when anyone settles.      `feeGrowthInside0X128`/`1X128` are v4's own per-liquidity accumulator for the range, read at      the instant of collection: a week's forgone fees become a function of what the position      GENERATED rather than of when somebody collected it, so settlement can split a segment that      straddles a week boundary AT the boundary, identically for every holder. `totalShares`/      `totalStaked` carry the staked fraction rather than reconstructing it. `collectionSeq`      increments on EVERY emitted collection, so a DROPPED log is a visible gap and its epoch is      quarantined rather than under-paid (H6); `resetSeq` increments whenever the range's v4      position crosses zero liquidity in EITHER direction — the deterministic re-base signal that      replaced the indexer's steerable magnitude heuristic (H2)."}},"details":"WHAT NATIVE ACTUALLY TOUCHES. Uniswap v4 already moves native ETH itself on every payout      (`take` pays LPs' withdrawals and claims directly), and swappers settle with the      PoolManager, never with the hook. Exactly three seams remain, and they live in three      places:        1. pay-in — `LedgerLib._resolvePrincipal` settles a native deposit with           `settle{value:}` from the hook's balance, prepaid by the depositor           (`FablesLedger.deposit` is payable, requires `msg.value >= amount0Max`, and refunds           the unspent remainder in full at the end);        2. the gate — `_nativeAllowed()` is the coupled switch: overriding it to true is what           lets `beforeInitialize`/`_checkKey` admit native pools on THIS hook while every           ERC20-only hook keeps refusing them;        3. revenue — the epoch distributor speaks only ERC20, so the NATIVE currency's           staked-fee sweep wraps into WETH at this boundary (`_sweepDistributor` override) and           everything downstream (distributor, settlement indexer, merkle claims) stays           ERC20-pure. LP-facing money (withdraw, claimFees) stays native: LPs deposited ETH           and get ETH back.      WHAT THIS HOOK NEVER DOES: hold ETH between transactions. Deposits refund their whole      remaining balance in the same call; the sweep wraps and forwards within its own call. A      nonzero balance at rest is a stranger's forced transfer, and the next native deposit      returns it to circulation via the full-balance refund.      `receive()` is allowlisted to the PoolManager — the only counterparty that legitimately      pays this contract ETH (`take` during the wrap-sweep). WETH9 never sends ETH here      (`deposit` is a one-way wrap and nothing ever calls `withdraw`), and unsolicited transfers      are refused outright rather than silently absorbed.      ERC20 pools still work on this hook unchanged — `_nativeAllowed` ADDS native capability,      it does not require it. Whether to point ERC20 pools here or keep them on per-pool      `FablesRamp` instances is a deployment (blast-radius) decision, not a code one.","methods":{"authority()":{"details":"Returns the current authority."},"pause(uint256)":{"details":"A separate selector from `setPaused` so the fast key really is one-way. Binding the      combined `setPaused` to a zero-delay role looked like an emergency stop but handed      that same key the UNPAUSE — `setPaused(0)` clears the freeze — so a compromised      guardian could lift the multisig's freeze every block. This entry point can only      ever move `pausedUntil` forward, which is what makes it safe to run at zero delay,      and `setPaused` stays on the delayed ADMIN_ROLE for lifting it."},"rangeKey(uint256)":{"details":"`rangeId` is a one-way hash, and the `Deposited`/`Staked`/`FeesCollected` events carry      only the id — so an off-chain settlement run seeing a `rangeId` cannot otherwise attribute      that range's fees to a pool/gauge without decoding deposit calldata. This exposes the      stored preimage so the mapping is available from the public ABI, first deposit onward."},"claimFeeFor(uint64)":{"details":"The minimum, and not a time-weighted average, because a time-weighted average is not      computable here and pretending otherwise would be a guess dressed as arithmetic. v4      hands over one lump for the whole window and says nothing about WHEN inside it the      fees were earned — a week's backlog might all have accrued in one busy hour. Any      apportionment would be invented.      Given that, the minimum is the only defensible answer, for two reasons that matter      more than the revenue:        - It can never charge an LP a rate the protocol was not actually advertising while          their fees were accruing. Every other rule can.        - It bounds the timing game, though it does not remove it. Anyone can force a range          to realize its fees (`deposit` of one unit does it), so a third party picks the          moment a backlog is priced. Waiting can only ever LOWER the rate — so there is          nothing to gain by delaying. But a scheduled cut is public before it lands, and          collecting just BEFORE it closes the window at the old rate. An earlier version          of this comment claimed there was nothing to front-run; that is false, and the          exposure is bounded only by `MAX_CLAIM_FEE_BPS` and by the rate shipping at zero.      The cost is that ops must treat a dip as retroactive. Lowering the rate for an hour      applies that hour's rate to every backlog spanning it, however long. That is a real      constraint on the lever, and the right way round: it makes a cut generous rather than      a raise reaching backwards."},"rangeGrowth(uint256)":{"details":"The read the boundary snapshotter is built on. Settlement attributes forgone fees to      the week they were GENERATED, so an interval of collection that straddles a week      boundary has to be split AT the boundary — and nothing happens on chain at a boundary      unless somebody syncs, so that one value cannot come from the log stream. It comes      from calling this at the boundary block instead.      A view rather than a stored snapshot, deliberately: reading it at a historical block      is exact, whereas a stored snapshot would be exact only if someone remembered to      write it in time — the punctuality dependency this whole change exists to remove.      IT IS NOT MONOTONIC ACROSS A LIQUIDITY RESET. An earlier version of this comment      claimed the accumulator \"moves only when a swap crosses the range\". It also moves      when a tick is initialised or cleared: v4 deletes `feeGrowthOutside` once the last      liquidity at a tick is removed and re-bases it against the current global on the next      deposit, so a range that empties and refills reads a fresh, unrelated baseline. Two      readings either side of that are not comparable, and settlement must treat a backwards      step as a reset rather than as a delta — which it does, loudly."},"setAuthority(address)":{"details":"Transfers control to a new authority. The caller must be the current authority."},"unlockCallback(bytes)":{"params":{"data":"The data that was passed to the call to unlock"},"details":"A thin shell: it checks the caller and hands the whole callback body to      `LedgerLib.onUnlock` (inlined), which decodes the action, applies a liquidity      modify or a payout, and settles fees and principal.","returns":{"_0":"Any data that you want to be returned from the unlock call"}},"setBallotGate(address)":{"details":"Probed, not merely stored. `setDistributor` spends a `try/catch` on its counterpart      for exactly this reason and this setter did not, so an EOA or a wrong-ABI contract      made `syncRanges` revert on `abi.decode` for every staked range — permanently      unusable, with no on-chain signal. `address(0)` stays explicitly allowed: a closed      door is the safe default for one that decides who may reach into someone else's      position, and `syncRanges` refuses outright while the gate is unset."},"currentFee(bytes32,bool)":{"details":"Uses a zero-amount probe, so size-dependent components read as zero here."},"isConsumingScheduledOp()":{"details":"Returns true only in the context of a delayed restricted call, at the moment that the scheduled operation is being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs attacker controlled calls."},"setOperator(address,bool)":{"params":{"approved":"The approval status.","operator":"The address of the operator."},"returns":{"_0":"bool True, always"}},"syncRanges(uint256,uint256[])":{"details":"Settlement needs this. v4 pays nothing until a position is touched, and a `rangeId`      is `(pool, tickLower, tickUpper)`, so an LP on bespoke bounds is the ONLY party who      can touch their range. Staked shares give their fees up to voters, which left      voters' revenue hostage to whether the LP who forgoes it ever felt like syncing —      and left each epoch's emission split guessing at fees that had not been booked yet.      Ops calls this over the staked ranges at each epoch boundary, which is also what      makes the `FeesCollected` accumulator levels line up with epoch boundaries so the      week's forgone fees are attributable exactly.It takes the claim fee like every other door, and it must. An earlier version skipped      the skim here on the grounds that \"the protocol forgoes its claim fee on syncs it did      not initiate — it still collects on every owner-driven path\". The second clause was      false. v4 pays nothing until a position is touched, so an owner-driven sync can only      ever skim fees accrued SINCE THE LAST TOUCH — and a free door that collects the whole      backlog sets that to nothing. Whoever touches a range last wins, so any voter of the      pool could hold the protocol's revenue on every staked range in it at zero forever,      for gas, by sweeping just before each owner claim. Charging uniformly is the only      shape with no door to arbitrage between.      It costs the caller nothing they are owed: the skim is taken from the UNSTAKED      residue, after `stakedCut` has already been set aside for the voters' pot. A voter      syncing to fund their own claim is not paying for the privilege.      The rate is still `min(live, snapshot)`, so a raise can never reach back over a      backlog earned under the old rate — which was the other thing the exemption was      protecting, and is protected here by `_effectiveClaimFee` instead of by a hole."},"pokeFee(bytes32,uint24,uint40)":{"details":"Bounded on BOTH sides. The ceiling is the pool cap; the floor is the cheapest fee      the pool is configured to charge autonomously, so ops can still correct a fee that      is wrongly high (a mis-classified market day, say) but cannot go anywhere the pool      would not have gone by itself. This role is the one hot key in the system, granted      with no execution delay because reacting fast is its whole purpose — which makes it      the likeliest to be compromised. Without a floor, whoever held it could set every      pool to zero for 72 hours and renew for the price of gas, so LPs earn nothing while      arbitrageurs take the pool apart for free. A ceiling alone bounds the wrong end."},"approve(address,uint256,uint256)":{"params":{"id":"The id of the token.","amount":"The amount of the token.","spender":"The address of the spender."},"returns":{"_0":"bool True, always"}},"transfer(address,uint256,uint256)":{"details":"Staked shares are locked: only the unstaked balance is transferable."},"transferFrom(address,address,uint256,uint256)":{"params":{"id":"The id of the token.","amount":"The amount of the token.","sender":"The address of the sender.","receiver":"The address of the receiver."},"returns":{"_0":"bool True, always, unless the function reverts"}},"unstake((address,address,uint24,int24,address),int24,int24,uint128)":{"details":"Deliberately NOT pausable, unlike `stake`. Unstaking only ever SHRINKS what the      distributor is owed and makes no external call, so it cannot be an exploit vector —      while pausing it would mean an LP cannot stop routing their fees to a distributor      the admin also chooses. Freezing the exit from a revenue assignment is not an      exploit response, it is the exploit."},"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)":{"params":{"to":"Recipient of the fees; lets a holder route around a token that blocks their        own address without stranding the other currency."}},"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)":{"params":{"deadline":"Latest block timestamp at which this deposit may execute.","amount0Max":"The most currency0 the caller will pay for this liquidity.","amount1Max":"The most currency1 the caller will pay for this liquidity."},"details":"The bounds are NOT optional ceremony. `liquidity` says nothing about what it costs: the      token amounts fall out of the pool's live price inside `modifyLiquidity`, and whatever v4      asks for is pulled from the caller. Without a ceiling, the only limit was the caller's own      ERC-20 allowance, so a price move between signing and execution bought the whole position      one-sided at a price nobody agreed to. See `LedgerLib._checkBound`.Payable for the native-capable variant only. On an ERC20 pool any attached value      reverts — accepting it would strand ETH on a contract with no path back out. On a      native pool the caller must attach AT LEAST `amount0Max`: the actual amount owed is      only learned inside the unlock callback, `_checkBound` caps it at `amount0Max`, so      prepaying the ceiling guarantees settlement can never under-fund — and the unspent      remainder is refunded in full at the end (see `_refundNative`)."},"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)":{"params":{"to":"Where the principal lands. `claimFees` already takes one so a holder can route        around a token that blocks their own address; `withdraw` hardcoded `msg.sender`,        which meant a blocklist on the LP froze their principal in BOTH currencies — and        the documented escape (transfer the receipt to a clean address) is pausable, so a        pause concurrent with a blocklist closed every exit. That contradicted this        contract's headline guarantee that withdrawals are unconditional.","deadline":"Latest block timestamp at which this withdrawal may execute.","amount0Min":"The least currency0 the caller will accept back for this liquidity.","amount1Min":"The least currency1 the caller will accept back for this liquidity."},"details":"Fees are collected first via `_syncRange` — a claims-only touch that makes no      token call — so the withdrawer still receives their cut at pre-burn totals. Shares      are burned before the pool touch that pays principal, so the only step that can      hand control to a token sees `totalShares` and position liquidity already in      agreement. Over-withdrawing still reverts, now at `_burn`, before anything moves.The mirror of `deposit`'s ceiling. A liquidity figure does not say what mix it returns —      the price decides — so an exit during a moved market handed back a lopsided pair the LP      never consented to. Deliberately still NOT pausable: a bound the caller chose is not a      reason to trap them, and passing zeroes remains a valid \"any mix will do\"."}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_int24":{"label":"int24","encoding":"inplace","numberOfBytes":"3"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_uint24":{"label":"uint24","encoding":"inplace","numberOfBytes":"3"},"t_uint40":{"label":"uint40","encoding":"inplace","numberOfBytes":"5"},"t_uint64":{"label":"uint64","encoding":"inplace","numberOfBytes":"8"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint128":{"label":"uint128","encoding":"inplace","numberOfBytes":"16"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(IHooks)2261":{"label":"contract IHooks","encoding":"inplace","numberOfBytes":"20"},"t_struct(Poke)6485_storage":{"label":"struct FablesBaseHook.Poke","members":[{"slot":"0","type":"t_uint24","astId":6482,"label":"fee","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint40","astId":6484,"label":"expiry","offset":3,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint64)":{"key":"t_uint256","label":"mapping(uint256 => uint64)","value":"t_uint64","encoding":"mapping","numberOfBytes":"32"},"t_struct(PoolKey)6046_storage":{"label":"struct PoolKey","members":[{"slot":"0","type":"t_userDefinedValueType(Currency)5700","astId":6031,"label":"currency0","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_userDefinedValueType(Currency)5700","astId":6035,"label":"currency1","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_uint24","astId":6038,"label":"fee","offset":20,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_int24","astId":6041,"label":"tickSpacing","offset":23,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_contract(IHooks)2261","astId":6045,"label":"hooks","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"96"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(RangeKey)9243_storage":{"label":"struct RangeKey","members":[{"slot":"0","type":"t_struct(PoolKey)6046_storage","astId":9236,"label":"key","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_int24","astId":9238,"label":"tickLower","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_int24","astId":9240,"label":"tickUpper","offset":3,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_bool","astId":9242,"label":"set","offset":6,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"128"},"t_struct(RangeState)9140_storage":{"label":"struct RangeState","members":[{"slot":"0","type":"t_uint128","astId":9118,"label":"totalShares","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint128","astId":9120,"label":"totalStaked","offset":16,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_uint256","astId":9122,"label":"accFee0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_uint256","astId":9124,"label":"accFee1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_uint256","astId":9127,"label":"accStaked0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"4","type":"t_uint256","astId":9129,"label":"accStaked1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_uint128","astId":9132,"label":"stakedResidual0","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_uint128","astId":9134,"label":"stakedResidual1","offset":16,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_uint64","astId":9137,"label":"collectionSeq","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_uint64","astId":9139,"label":"resetSeq","offset":8,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"224"},"t_struct(UserPosition)9221_storage":{"label":"struct UserPosition","members":[{"slot":"0","type":"t_uint128","astId":9203,"label":"staked","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint128","astId":9205,"label":"owed0","offset":16,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_uint128","astId":9207,"label":"owed1","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_uint256","astId":9209,"label":"checkpoint0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_uint256","astId":9211,"label":"checkpoint1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"4","type":"t_uint256","astId":9213,"label":"stakedCheckpoint0X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_uint256","astId":9215,"label":"stakedCheckpoint1X128","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_uint256","astId":9218,"label":"forgone0","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"7","type":"t_uint256","astId":9220,"label":"forgone1","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"256"},"t_userDefinedValueType(PoolId)6000":{"label":"PoolId","encoding":"inplace","numberOfBytes":"32"},"t_struct(ClaimFeeChange)9146_storage":{"label":"struct ClaimFeeChange","members":[{"slot":"0","type":"t_uint64","astId":9143,"label":"fromTs","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_uint16","astId":9145,"label":"bps","offset":8,"contract":"src/FablesRampETH.sol:FablesRampETH"}],"encoding":"inplace","numberOfBytes":"32"},"t_userDefinedValueType(Currency)5700":{"label":"Currency","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_mapping(t_address,t_bool))":{"key":"t_address","label":"mapping(address => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_uint256,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(uint256 => uint256))","value":"t_mapping(t_uint256,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RangeKey)9243_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct RangeKey)","value":"t_struct(RangeKey)9243_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_struct(RangeState)9140_storage)":{"key":"t_uint256","label":"mapping(uint256 => struct RangeState)","value":"t_struct(RangeState)9140_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)":{"key":"t_userDefinedValueType(PoolId)6000","label":"mapping(PoolId => uint24)","value":"t_uint24","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_struct(UserPosition)9221_storage)":{"key":"t_address","label":"mapping(address => struct UserPosition)","value":"t_struct(UserPosition)9221_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(ClaimFeeChange)9146_storage)dyn_storage":{"base":"t_struct(ClaimFeeChange)9146_storage","label":"struct ClaimFeeChange[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_userDefinedValueType(Currency)5700,t_uint256)":{"key":"t_userDefinedValueType(Currency)5700","label":"mapping(Currency => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_uint256)))":{"key":"t_address","label":"mapping(address => mapping(address => mapping(uint256 => uint256)))","value":"t_mapping(t_address,t_mapping(t_uint256,t_uint256))","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_userDefinedValueType(PoolId)6000,t_struct(Poke)6485_storage)":{"key":"t_userDefinedValueType(PoolId)6000","label":"mapping(PoolId => struct FablesBaseHook.Poke)","value":"t_struct(Poke)6485_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_address,t_struct(UserPosition)9221_storage))":{"key":"t_uint256","label":"mapping(uint256 => mapping(address => struct UserPosition))","value":"t_mapping(t_address,t_struct(UserPosition)9221_storage)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_address","astId":16,"label":"_authority","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"0","type":"t_bool","astId":18,"label":"_consumingSchedule","offset":20,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"1","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)","astId":6501,"label":"maxFee","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"2","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)","astId":6515,"label":"pokeFloor","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"3","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_struct(Poke)6485_storage)","astId":6522,"label":"pokeOf","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"4","type":"t_mapping(t_address,t_mapping(t_address,t_bool))","astId":1728,"label":"isOperator","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"5","type":"t_mapping(t_address,t_mapping(t_uint256,t_uint256))","astId":1734,"label":"balanceOf","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"6","type":"t_mapping(t_address,t_mapping(t_address,t_mapping(t_uint256,t_uint256)))","astId":1742,"label":"allowance","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"7","type":"t_uint16","astId":7184,"label":"claimFeeBps","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"7","type":"t_address","astId":7186,"label":"claimFeeRecipient","offset":2,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"8","type":"t_address","astId":7188,"label":"distributor","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"9","type":"t_address","astId":7191,"label":"distributorFF","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"10","type":"t_address","astId":7194,"label":"ffFeeSink","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"11","type":"t_array(t_struct(ClaimFeeChange)9146_storage)dyn_storage","astId":7199,"label":"_claimFeeHistory","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"12","type":"t_uint16","astId":7202,"label":"claimFeeAllTimeMin","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"13","type":"t_mapping(t_uint256,t_uint64)","astId":7207,"label":"claimFeeSyncIndex","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"14","type":"t_uint256","astId":7210,"label":"pausedUntil","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"15","type":"t_address","astId":7213,"label":"ballotGate","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"16","type":"t_mapping(t_uint256,t_struct(RangeKey)9243_storage)","astId":7244,"label":"_rangeKeys","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"17","type":"t_mapping(t_uint256,t_struct(RangeState)9140_storage)","astId":7249,"label":"_ranges","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"18","type":"t_mapping(t_uint256,t_mapping(t_address,t_struct(UserPosition)9221_storage))","astId":7256,"label":"_positions","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"19","type":"t_mapping(t_userDefinedValueType(Currency)5700,t_uint256)","astId":7261,"label":"distributorOwed","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"20","type":"t_mapping(t_userDefinedValueType(Currency)5700,t_uint256)","astId":7267,"label":"claimFeeOwed","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"},{"slot":"21","type":"t_mapping(t_userDefinedValueType(PoolId)6000,t_uint24)","astId":6087,"label":"_flatPips","offset":0,"contract":"src/FablesRampETH.sol:FablesRampETH"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"60e060405234801561000f575f80fd5b5060405161723838038061723883398101604081905261002e9161031e565b8383838282828161003e8161014f565b5062ffffff811615806100585750620f424062ffffff8216115b156100765760405163a51d0c8160e01b815260040160405180910390fd5b62ffffff81166080526001600160a01b03831660a05261010b30610106604080516101c0810182525f60208201819052918101829052606081018290526080810182905260a0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152600180825260c082015290565b6101a2565b5050506001600160a01b038416925061013a9150505760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660c05250610381915050565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad9060200160405180910390a150565b80511515612000831615151415806101c65750602081015115156110008316151514155b806101dd5750604081015115156108008316151514155b806101f45750606081015115156104008316151514155b8061020b5750608081015115156102008316151514155b80610222575060a081015115156101008316151514155b80610238575060c0810151151560808316151514155b8061024e575060e0810151151560408316151514155b806102655750610100810151151560208316151514155b8061027c5750610120810151151560108316151514155b806102935750610140810151151560088316151514155b806102aa5750610160810151151560048316151514155b806102c15750610180810151151560028316151514155b806102d857506101a0810151151560018316151514155b156102ee576102ee630732d7b560e51b836102f2565b5050565b815f526001600160a01b03811660045260245ffd5b6001600160a01b038116811461031b575f80fd5b50565b5f805f8060808587031215610331575f80fd5b845161033c81610307565b602086015190945061034d81610307565b604086015190935062ffffff81168114610365575f80fd5b606086015190925061037681610307565b939692955090935050565b60805160a05160c051616e1d61041b5f395f81816106e501528181613c3b01528181613cb50152613d2f01525f81816103e601528181610ed80152818161169701528181611c700152818161239701528181612421015281816124d401528181612c9f0152818161391e01528181613b6001528181613c0d0152818161407b0152614b1901525f81816106b2015261383b0152616e1d5ff3fe6080604052600436106103d6575f3560e01c80637e445230116101ff578063bdde80c611610113578063daf58566116100a8578063e74c37f711610078578063e74c37f714610f38578063f4314f1d14610f57578063f69ec15814610f9e578063f8c543ce14610fb3578063fe99049a14610fc7575f80fd5b8063daf5856614610ea8578063dc4c90d314610ec7578063dc98354e14610efa578063df848a9f14610f19575f80fd5b8063d0ba2baa116100e3578063d0ba2baa14610e25578063d5a2472414610e44578063d677eaad14610e74578063da748b1014610e93575f80fd5b8063bdde80c614610dac578063bf7e214f14610dcb578063bfcb418514610de7578063bfe1092814610e06575f80fd5b8063999d55fb11610194578063a6acaacc11610164578063a6acaacc14610cf1578063ab9e5bfd14610d05578063ae4a578514610d24578063b11dcb2314610d43578063b6363cf214610d73575f80fd5b8063999d55fb14610c565780639d1712c514610c6c578063a23e4db514610cb8578063a2ba1fc814610cd2575f80fd5b806391dd7346116101cf57806391dd734614610b75578063936852d414610ba1578063966af35a14610bd557806396f25d4214610c36575f80fd5b80637e44523014610af55780637fa7b6ac14610b0a5780638aebf0c114610b295780638fb3603714610b48575f80fd5b80634dc4b5c9116102f65780635ca344691161028b57806370233ddd1161025b57806370233ddd14610a585780637339254914610a835780637a526f4e14610a975780637a9e5e4b14610ab15780637c5e62d014610ad0575f80fd5b80635ca34469146109be5780635cd04cf8146109dd5780635f4934a814610a0d57806363cb7bdf14610a2c575f80fd5b8063558a7297116102c6578063558a729714610903578063575e24b414610922578063598af9e71461096c5780635c975abb146109a8575f80fd5b80634dc4b5c91461087a5780634e8d0048146108995780634eb5c4fd146108b857806351789ea2146108e4575f80fd5b806326f5ef521161036c5780633fc8cef31161033c5780633fc8cef3146106d4578063412b82c81461071f57806341b69b2a1461073e578063426a84931461085b575f80fd5b806326f5ef521461058f5780632e32a3b0146105ae57806336a9ca1a1461068e5780633c2f373f146106a1575f80fd5b8063113b9ac4116103a7578063113b9ac4146104e0578063136439dd1461051257806315452022146105315780632384b55414610564575f80fd5b8062fdd58e1461042a57806301ffc9a714610473578063095bcdb6146104a257806309974324146104c1575f80fd5b3661042657336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042457604051632dc88d5b60e21b815260040160405180910390fd5b005b5f80fd5b348015610435575f80fd5b50610460610444366004615b9f565b600560209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561047e575f80fd5b5061049261048d366004615bc9565b610fe6565b604051901515815260200161046a565b3480156104ad575f80fd5b506104926104bc366004615bf0565b61101c565b3480156104cc575f80fd5b506104246104db366004615c78565b6110ac565b3480156104eb575f80fd5b506104ff6104fa366004615cda565b611177565b60405161ffff909116815260200161046a565b34801561051d575f80fd5b5061042461052c366004615d00565b6111a5565b34801561053c575f80fd5b5061055061054b366004615d24565b611246565b60405162ffffff909116815260200161046a565b34801561056f575f80fd5b5061046061057e366004615d52565b60146020525f908152604090205481565b34801561059a575f80fd5b506104246105a9366004615d6d565b611276565b3480156105b9575f80fd5b5061067e6105c8366004615d00565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152601060209081526040918290206003810154835160a08101855282546001600160a01b039081168252600184015480821695830195909552600160a01b850462ffffff1695820195909552600160b81b909304600290810b6060850152918201549093166080830152909282820b926301000000810490920b91600160301b900460ff1690565b60405161046a9493929190615e02565b61042461069c366004615e6c565b611332565b3480156106ac575f80fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b3480156106df575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161046a565b34801561072a575f80fd5b50600a54610707906001600160a01b031681565b348015610749575f80fd5b5061084e610758366004615d00565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152505f9081526011602090815260409182902082516101408101845281546001600160801b038082168352600160801b918290048116948301949094526001830154948201949094526002820154606082015260038201546080820152600482015460a0820152600582015480841660c08301529390930490911660e0830152600601546001600160401b03808216610100840152600160401b9091041661012082015290565b60405161046a9190615ef8565b348015610866575f80fd5b50610492610875366004615bf0565b61172c565b348015610885575f80fd5b50610424610894366004615fd3565b6117a2565b3480156108a4575f80fd5b506104246108b3366004616021565b61187d565b3480156108c3575f80fd5b506108d76108d236600461608b565b611a75565b60405161046a91906160ae565b3480156108ef575f80fd5b506104246108fe366004615d00565b611b73565b34801561090e575f80fd5b5061049261091d366004616135565b611bf3565b34801561092d575f80fd5b5061094161093c36600461619e565b611c62565b604080516001600160e01b03199094168452602084019290925262ffffff169082015260600161046a565b348015610977575f80fd5b5061046061098636600461621e565b600660209081525f938452604080852082529284528284209052825290205481565b3480156109b3575f80fd5b50600e544210610492565b3480156109c9575f80fd5b506104246109d836600461625c565b611cf8565b3480156109e8575f80fd5b506105506109f7366004615d00565b60026020525f908152604090205462ffffff1681565b348015610a18575f80fd5b50610424610a27366004615d00565b611f91565b348015610a37575f80fd5b50610a426203f48081565b60405164ffffffffff909116815260200161046a565b348015610a63575f80fd5b50610460610a72366004615d52565b60136020525f908152604090205481565b348015610a8e575f80fd5b50600b54610460565b348015610aa2575f80fd5b506007546104ff9061ffff1681565b348015610abc575f80fd5b50610424610acb366004615d52565b611fe0565b348015610adb575f80fd5b50600754610707906201000090046001600160a01b031681565b348015610b00575f80fd5b506104ff61138881565b348015610b15575f80fd5b50610424610b243660046162aa565b61205d565b348015610b34575f80fd5b50610424610b433660046162f1565b6121f3565b348015610b53575f80fd5b50610b5c612368565b6040516001600160e01b0319909116815260200161046a565b348015610b80575f80fd5b50610b94610b8f36600461632e565b61238a565b60405161046a919061639a565b348015610bac575f80fd5b50610bc0610bbb366004615d00565b612448565b6040805192835260208301919091520161046a565b348015610be0575f80fd5b50610c15610bef366004615d00565b60036020525f908152604090205462ffffff8116906301000000900464ffffffffff1682565b6040805162ffffff909316835264ffffffffff90911660208301520161046a565b348015610c41575f80fd5b505f80516020616df18339815191525c610492565b348015610c61575f80fd5b5061046062093a8081565b348015610c77575f80fd5b50610ca0610c86366004615d00565b600d6020525f90815260409020546001600160401b031681565b6040516001600160401b03909116815260200161046a565b348015610cc3575f80fd5b50600c546104ff9061ffff1681565b348015610cdd575f80fd5b50610424610cec3660046163ac565b612517565b348015610cfc575f80fd5b50610550606481565b348015610d10575f80fd5b50610424610d1f366004615d52565b612865565b348015610d2f575f80fd5b50610424610d3e366004615d52565b6128a4565b348015610d4e575f80fd5b50610550610d5d366004615d00565b60016020525f908152604090205462ffffff1681565b348015610d7e575f80fd5b50610492610d8d36600461644a565b600460209081525f928352604080842090915290825290205460ff1681565b348015610db7575f80fd5b50610424610dc6366004615d52565b612a3e565b348015610dd6575f80fd5b505f546001600160a01b0316610707565b348015610df2575f80fd5b50600954610707906001600160a01b031681565b348015610e11575f80fd5b50600854610707906001600160a01b031681565b348015610e30575f80fd5b50610424610e3f366004615d6d565b612a72565b348015610e4f575f80fd5b50610550610e5e366004615d00565b5f9081526015602052604090205462ffffff1690565b348015610e7f575f80fd5b506104ff610e8e366004615d00565b612b10565b348015610e9e575f80fd5b50610460600e5481565b348015610eb3575f80fd5b50610424610ec236600461625c565b612b1a565b348015610ed2575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b348015610f05575f80fd5b50610b5c610f14366004616476565b612c93565b348015610f24575f80fd5b50610460610f333660046164b2565b612db1565b348015610f43575f80fd5b50600f54610707906001600160a01b031681565b348015610f62575f80fd5b50610f76610f71366004615d00565b612dfc565b6040805182516001600160401b0316815260209283015161ffff16928101929092520161046a565b348015610fa9575f80fd5b506104ff6107d081565b348015610fbe575f80fd5b50610460602081565b348015610fd2575f80fd5b50610492610fe13660046164e6565b612e5d565b5f6301ffc9a760e01b6001600160e01b0319831614806110165750630f632fb360e01b6001600160e01b03198316145b92915050565b5f611025612eef565b600e544210156110485760405163b359f26960e01b815260040160405180910390fd5b815f0361106857604051639811e0c760e01b815260040160405180910390fd5b611073338484612f13565b61107c83612f7c565b6110868333613092565b6110908385613092565b61109b8484846130d7565b90506110a561316f565b9392505050565b6110b8335b5f36613186565b6110c0612eef565b6110ca8484613275565b600854600c546110f091600b91859185916001600160a01b039091169061ffff166132e5565b600c805461ffff191661ffff928316179055600780549184166001600160b01b03199092168217620100006001600160a01b038516908102919091179091556040805192835260208301919091527f0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87910160405180910390a161117161316f565b50505050565b600754600c545f9161101691600b9185916001600160a01b03620100008304169161ffff908116911661345d565b6111ae336110b1565b8015806111bd575062093a8081115b156111db576040516316873e3160e11b815260040160405180910390fd5b5f6111e6824261653d565b9050600e54811161120a576040516316873e3160e11b815260040160405180910390fd5b600e8190556040518181527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df9219060200160405180910390a15050565b5f6110a583604051806060016040528085151581526020015f81526020015f6001600160a01b031681525061356c565b61127f336110b1565b611287612eef565b6112918383613275565b6008546001600160a01b03828116911614806112b557506001600160a01b03811630145b156112d3576040516343c829db60e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834906020015b60405180910390a161132d61316f565b505050565b61133a612eef565b600e5442101561135d5760405163b359f26960e01b815260040160405180910390fd5b836001600160801b03165f0361138657604051630200e8a960e31b815260040160405180910390fd5b804211156113a757604051631ab7da6b60e01b815260040160405180910390fd5b6113b087613642565b6113cd6113c06020890189615d52565b6001600160a01b03161590565b1561140157826001600160801b03163410156113fc57604051631841b4e160e01b815260040160405180910390fd5b611420565b341561142057604051631841b4e160e01b815260040160405180910390fd5b5f61144461143d611436368b90038b018b6165de565b60a0902090565b8888612db1565b5f81815260106020526040902060030154909150600160301b900460ff166115885760405180608001604052808980360381019061148291906165de565b8152600289810b60208084019190915289820b604080850191909152600160609485018190525f878152601084528290208651805182546001600160a01b03199081166001600160a01b0392831617845582870151948401805484880151858c01519785166001600160b81b031990921691909117600160a01b62ffffff928316021762ffffff60b81b1916600160b81b978216979097029690961790556080909201519683018054909216961695909517909455918501516003909301805491860151959094015192821665ffffffffffff1990911617630100000094909116939093029290921766ff0000000000001916600160301b921515929092029190911790555b61159181612f7c565b61159b8133613092565b5f818152601160205260409020546001600160801b0316158015611612575f8281526011602052604090206006018054600191906008906115ed908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5f82815260116020526040812080548892906116389084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506116703383886001600160801b03166136e5565b611688898989896001600160801b0316338a8a613757565b80156116bc576116bc601160107f000000000000000000000000000000000000000000000000000000000000000085613774565b6040516001600160801b0387168152829033907f1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a9060200160405180910390a361170c6113c060208b018b615d52565b15611719576117196137ba565b505061172361316f565b50505050505050565b335f8181526006602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906117909087815260200190565b60405180910390a45060019392505050565b6117ab336110b1565b8262ffffff168262ffffff1610806117cc57508062ffffff168262ffffff16115b156117ea576040516306b7c75960e31b815260040160405180910390fd5b5f6117fd611436368790038701876165de565b5f818152601560205260409020805462ffffff191662ffffff8616179055905061182881858461382c565b6040805162ffffff8087168252808616602083015284169181019190915281907f0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5906060015b60405180910390a25050505050565b611885612eef565b600e544210156118a85760405163b359f26960e01b815260040160405180910390fd5b6118b185613642565b5f6118ce6118c7611436368990038901896165de565b8686612db1565b90508161ffff166118de826138f9565b61ffff1611156119015760405163663fffd960e01b815260040160405180910390fd5b5f8181526012602090815260408083203384528252808320600583528184208585529092529091205415801561194657508054600160801b90046001600160801b0316155b801561195d575060018101546001600160801b0316155b1561197b576040516312d37ee560e31b815260040160405180910390fd5b61198482612f7c565b61198e8233613092565b5f8281526012602090815260408083203384529091529020805460018201546001600160801b03600160801b90920482169116811580156119cd575080155b156119dc575050505050611a66565b6001830180546001600160801b031916905582546001600160801b03168355611a23611a0b60208c018c615d52565b611a1b60408d0160208e01615d52565b84848b613919565b6040805183815260208101839052869133917fd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77910160405180910390a350505050505b611a6e61316f565b5050505050565b611ad66040518061012001604052805f6001600160801b031681526020015f6001600160801b031681526020015f6001600160801b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b505f9182526012602090815260408084206001600160a01b039390931684529181529181902081516101208101835281546001600160801b038082168352600160801b9091048116948201949094526001820154909316918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e08301526007015461010082015290565b611b7c336110b1565b62093a80811115611ba0576040516316873e3160e11b815260040160405180910390fd5b8015611bb557611bb0814261653d565b611bb7565b5f5b600e8190556040519081527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f8080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611cae5760405163570c108560e11b815260040160405180910390fd5b5f611cd8611cc4611436368b90038b018b6165de565b611cd3368a90038a018a616696565b61356c565b6315d7892d60e21b94505f93506240000017915050955095509592505050565b611d00612eef565b600e54421015611d235760405163b359f26960e01b815260040160405180910390fd5b806001600160801b03165f03611d4c57604051639811e0c760e01b815260040160405180910390fd5b611d5584613642565b600f546001600160a01b0316801580611de957506001600160a01b038116637f55485b611d8a611436368990038901896165de565b6040518263ffffffff1660e01b8152600401611da891815260200190565b602060405180830381865afa158015611dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de791906166fe565b155b15611e0757604051630ac6deb160e31b815260040160405180910390fd5b5f611e1d6118c7611436368990038901896165de565b9050611e2881612f7c565b611e328133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529220546001600160801b0380871692611e7492911690616719565b6001600160801b03161015611e9c57604051631a61620360e01b815260040160405180910390fd5b8054849082905f90611eb89084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316611f119190616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a86604051611f7e91906001600160801b0391909116815260200190565b60405180910390a350505061117161316f565b611f9a336110b1565b5f81815260036020526040808220805467ffffffffffffffff191690555182917fb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb91a250565b5f5433906001600160a01b0316811461201b5760405162d1953b60e31b81526001600160a01b03821660048201526024015b60405180910390fd5b816001600160a01b03163b5f03612050576040516361798f2f60e11b81526001600160a01b0383166004820152602401612012565b61205982613947565b5050565b612065612eef565b600f546001600160a01b03168061208f57604051634e3fb44d60e01b815260040160405180910390fd5b5f5b828110156121e9575f8484838181106120ac576120ac616738565b602090810292909201355f81815260119093526040832054909350600160801b90046001600160801b031690910390506120e657506121e1565b5f81815260106020908152604091829020825160a0808201855282546001600160a01b03908116835260018401548082168487015262ffffff600160a01b82041684880152600160b81b9004600290810b606085015290930154831660808301529020835163181e22b360e01b8152336004820152602481018b9052604481019190915292519086169263181e22b39260648083019391928290030181865afa158015612195573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b991906166fe565b6121d657604051630c8563b360e41b815260040160405180910390fd5b6121df81612f7c565b505b600101612091565b505061132d61316f565b6121fc336110b1565b5f8381526001602052604081205462ffffff169081900361223057604051636b271baf60e11b815260040160405180910390fd5b8062ffffff168362ffffff16111561225b5760405163329429f760e11b815260040160405180910390fd5b5f8481526002602052604090205462ffffff9081169084161015612292576040516310dd5b7f60e31b815260040160405180910390fd5b64ffffffffff821615806122af57506203f48064ffffffffff8316115b156122cd57604051631ee3453360e11b815260040160405180910390fd5b5f6122d8834261674c565b60408051808201825262ffffff87811680835264ffffffffff85811660208086018281525f8e81526003835288902096518754915190941663010000000267ffffffffffffffff1990911693909516929092179390931790935583519081529182015291925086917fcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04910161186e565b5f8054600160a01b900460ff1661237e57505f90565b50638fb3603760e01b90565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123d55760405163570c108560e11b815260040160405180910390fd5b6040805160608101825260075461ffff8082168352600c541660208301526201000090046001600160a01b0316918101919091526110a590601190601090601390601490600d90600b907f0000000000000000000000000000000000000000000000000000000000000000908b8b613994565b5f8181526010602052604081206003810154829190600160301b900460ff1661247657505f93849350915050565b6040805160a0808201835283546001600160a01b03908116835260018501548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b606084015284015490921660808201522061250d907f0000000000000000000000000000000000000000000000000000000000000000906003840154600281810b9163010000009004900b613a54565b9250925050915091565b61251f612eef565b846001600160801b03165f0361254857604051630200e8a960e31b815260040160405180910390fd5b6001600160a01b03841661256f5760405163d92e233d60e01b815260040160405180910390fd5b8042111561259057604051631ab7da6b60e01b815260040160405180910390fd5b61259988613642565b5f6125b66125af611436368c90038c018c6165de565b8989612db1565b90506125c181612f7c565b6125cb8133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529083205490929161260e916001600160801b0390911690616719565b9050876001600160801b0316816001600160801b03161015612724575f612635828a616719565b8354909150819084905f906126549084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508060115f8681526020019081526020015f205f0160108282829054906101000a90046001600160801b03166126ad9190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b68360405161271a91906001600160801b0391909116815260200190565b60405180910390a3505b61273833848a6001600160801b0316613af0565b5f83815260116020526040812080548a929061275e9084906001600160801b0316616719565b82546101009290920a6001600160801b038181021990931691831602179091555f85815260116020526040812054909116900390506127f0575f8381526011602052604090206006018054600191906008906127cb908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b6128108b8b8b6128086001600160801b038d16616769565b8b8b8b613757565b6040516001600160801b0389168152839033907f07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a09060200160405180910390a350505061285b61316f565b5050505050505050565b61286d612eef565b600e544210156128905760405163b359f26960e01b815260040160405180910390fd5b61289981613b59565b6128a161316f565b50565b6128ad336110b1565b6001600160a01b038116156129f057806001600160a01b03163b5f036128e657604051638fadf87960e01b815260040160405180910390fd5b60405163181e22b360e01b81523060048201525f6024820181905260448201526001600160a01b0382169063181e22b390606401602060405180830381865afa925050508015612953575060408051601f3d908101601f19168201909252612950918101906166fe565b60015b61297057604051638fadf87960e01b815260040160405180910390fd5b50604051637f55485b60e01b81525f60048201526001600160a01b03821690637f55485b90602401602060405180830381865afa9250505080156129d1575060408051601f3d908101601f191682019092526129ce918101906166fe565b60015b6129ee57604051638fadf87960e01b815260040160405180910390fd5b505b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba90602001611be8565b612a46612eef565b600e54421015612a695760405163b359f26960e01b815260040160405180910390fd5b61289981613b9b565b612a7b336110b1565b612a83612eef565b612a8d8383613275565b600a54600754612ab29183916001600160a01b03918216916201000090910416613d9f565b600980546001600160a01b03199081166001600160a01b03938416179091556008805490911691831691821790556040519081527f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858869060200161131d565b5f611016826138f9565b612b22612eef565b806001600160801b03165f03612b4b57604051639811e0c760e01b815260040160405180910390fd5b612b5484613642565b5f612b71612b6a611436368890038801886165de565b8585612db1565b9050612b7c81612f7c565b612b868133613092565b5f8181526012602090815260408083203384529091528120805490918491839190612bbb9084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508260115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316612c149190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b685604051612c8191906001600160801b0391909116815260200190565b60405180910390a3505061117161316f565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cdd5760405163570c108560e11b815260040160405180910390fd5b612d02612cf06060850160408601616783565b62ffffff1662ffffff16628000001490565b612d1f576040516309a90e8160e01b815260040160405180910390fd5b60015f612d34611436368790038701876165de565b815260208101919091526040015f9081205462ffffff169003612d6a57604051636b271baf60e11b815260040160405180910390fd5b612d7a6113c06020850185615d52565b8015612d8357505f5b15612da157604051630a7287b560e01b815260040160405180910390fd5b50636e4c1aa760e11b9392505050565b5f838383604051602001612ddc93929190928352600291820b6020840152900b604082015260600190565b60408051601f198184030181529190528051602090910120949350505050565b604080518082019091525f8082526020820152600b8281548110612e2257612e22616738565b5f918252602091829020604080518082019091529101546001600160401b0381168252600160401b900461ffff169181019190915292915050565b5f612e66612eef565b600e54421015612e895760405163b359f26960e01b815260040160405180910390fd5b815f03612ea957604051639811e0c760e01b815260040160405180910390fd5b612eb4858484612f13565b612ebd83612f7c565b612ec78386613092565b612ed18385613092565b612edd85858585613ee7565b9050612ee761316f565b949350505050565b612ef7614045565b612f1160015f80516020616df18339815191525b90614072565b565b5f8281526012602090815260408083206001600160a01b038716845282528083205460058352818420868552909252909120548291612f5d916001600160801b039091169061679e565b101561132d57604051631a61620360e01b815260040160405180910390fd5b5f8181526010602090815260409182902082516101208101845281546001600160a01b0390811660808301908152600184015480831660a0850152600160a01b810462ffffff1660c0850152600160b81b9004600290810b60e085015280850154909216610100840152825260039092015480830b938201939093526301000000830490910b92810192909252600160301b900460ff1615801560608301528061303a57505f828152601160205260409020546001600160801b0316155b156130715750600b545f918252600d6020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b612059815f0151826020015183604001515f306001600160801b0380614079565b5f828152601160209081526040808320601283528184206001600160a01b03861685528352818420600584528285208786529093529220546120599291908486614198565b335f90815260056020908152604080832085845290915281208054839190839061310290849061679e565b90915550506001600160a01b0384165f9081526005602090815260408083208684529091528120805484929061313990849061653d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020616dd18339815191529101611790565b612f115f5f80516020616df1833981519152612f0b565b5f806131b961319c5f546001600160a01b031690565b86306131ab60045f898b6167b1565b6131b4916167d8565b614398565b9150915081611a6e5763ffffffff811615613252575f805460ff60a01b198116600160a01b17909155604051634a63ebf760e11b81526001600160a01b03909116906394c7d7ee906132139088908890889060040161680e565b5f604051808303815f87803b15801561322a575f80fd5b505af115801561323c573d5f803e3d5ffd5b50505f805460ff60a01b1916905550611a6e9050565b60405162d1953b60e31b81526001600160a01b0386166004820152602401612012565b5f5b8181101561132d576132ae83838381811061329457613294616738565b90506020020160208101906132a99190615d52565b613b9b565b6132dd8383838181106132c3576132c3616738565b90506020020160208101906132d89190615d52565b613b59565b600101613277565b5f6107d061ffff8616111561330d5760405163af2eb37360e01b815260040160405180910390fd5b61ffff85161580159061332757506001600160a01b038416155b156133455760405163af2eb37360e01b815260040160405180910390fd5b306001600160a01b0385160361336e5760405163af2eb37360e01b815260040160405180910390fd5b6001600160a01b038416158015906133975750826001600160a01b0316846001600160a01b0316145b156133b55760405163af2eb37360e01b815260040160405180910390fd5b85545f6001600160a01b038616156133cd57866133cf565b5f5b604080518082019091526001600160401b03428116825261ffff80841660208085019182528d54600181018f555f8f8152919091209451940180549151909216600160401b0269ffffffffffffffffffff199091169390921692909217179055905081158061344557508361ffff168161ffff16105b61344f5783613451565b805b98975050505050505050565b5f846001600160401b03165f0361347557505f613563565b5f6001600160a01b0385161561348b578361348d565b5f5b90505f6134a460016001600160401b03891661679e565b88549091505f5b82821180156134ba5750602081105b15613531575f8a6134cc60018561679e565b815481106134dc576134dc616738565b5f918252602090912001805490915061ffff808716600160401b909204161015613510578054600160401b900461ffff1694505b8261351a8161684d565b935050818061352890616862565b925050506134ab565b8282036135445783945050505050613563565b8561ffff80861690821610613559578461355b565b805b955050505050505b95945050505050565b5f828152601560209081526040808320546003835281842082518084019093525462ffffff8082168452630100000090910464ffffffffff1693830184905216918291904210156136185780515f8781526002602052604081205462ffffff9283169450909116906127106135e36113888261687a565b6135f19061ffff1687616894565b6135fb91906168bf565b905080821015613609578091505b81841015613615578193505b50505b5f8681526001602052604090205462ffffff1680831115613637578092505b509095945050505050565b3061365360a0830160808401615d52565b6001600160a01b0316141580613690575060015f613679611436368590038501856165de565b815260208101919091526040015f205462ffffff16155b156136ae57604051636b271baf60e11b815260040160405180910390fd5b6136be6113c06020830183615d52565b80156136c757505f5b156128a157604051630a7287b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526005602090815260408083208584529091528120805483929061371790849061653d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020616dd183398151915291015b60405180910390a4505050565b611723613769368990038901896165de565b878787878787614079565b5f81815260208581526040808320868352818420825160a0810184528681529384018590529183018490526060830184905260808301939093526111719291859061442a565b475f8190036137c65750565b6040515f90339083908381818185875af1925050503d805f8114613805576040519150601f19603f3d011682016040523d82523d5f602084013e61380a565b606091505b505090508061205957604051633c31275160e21b815260040160405180910390fd5b62ffffff8116158061386757507f000000000000000000000000000000000000000000000000000000000000000062ffffff168162ffffff16115b156138855760405163a51d0c8160e01b815260040160405180910390fd5b606462ffffff831610806138a257508062ffffff168262ffffff16115b156138c05760405163a51d0c8160e01b815260040160405180910390fd5b5f928352600160209081526040808520805462ffffff1990811662ffffff95861617909155600290925290932080549093169116179055565b5f818152600d6020526040812054611016906001600160401b0316611177565b611a6e7f000000000000000000000000000000000000000000000000000000000000000086868686866144a9565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602001611be8565b60605f806139a484860186616904565b909250905060018260018111156139bd576139bd616993565b03613a21575f818060200190518101906139d791906169b2565b90506139f088825f0151836040015184608001516145e5565b613a08888260200151836060015184608001516145e5565b60405180602001604052805f8152509350505050613a46565b613a328d8d8d8d8d8d8d8d896146d6565b60405180602001604052805f815250925050505b9a9950505050505050505050565b5f805f80613a6288886148a6565b915091505f80613a738a8a8a61494f565b915091505f80613a848c8c8b61494f565b915091505f613a938d8d6149a4565b50509150508a60020b8160020b1215613ab55782850398508184039750613ae0565b8960020b8160020b12613ad15784830398508382039750613ae0565b82858803039850818487030397505b5050505050505094509492505050565b6001600160a01b0383165f90815260056020908152604080832085845290915281208054839290613b2290849061679e565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020616dd1833981519152910161374a565b6128a160147f000000000000000000000000000000000000000000000000000000000000000083600760029054906101000a90046001600160a01b0316614a56565b6001600160a01b03811615613bb3576128a181614b07565b6001600160a01b0381165f9081526013602052604081205490819003613bd7575050565b6008546001600160a01b031680613bed57505050565b6001600160a01b0383165f908152601360205260408120819055613c39907f000000000000000000000000000000000000000000000000000000000000000090859081908690306144a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015613c92575f80fd5b505af1158015613ca4573d5f803e3d5ffd5b50613ce09350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915083905084614b50565b806001600160a01b0316836001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb884604051613d2591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03167fb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e84604051613d9291815260200190565b60405180910390a3505050565b5f6001600160a01b038416613db557505f6110a5565b826001600160a01b0316846001600160a01b031603613de7576040516343c829db60e01b815260040160405180910390fd5b816001600160a01b0316846001600160a01b031603613e19576040516343c829db60e01b815260040160405180910390fd5b306001600160a01b03851603613e42576040516343c829db60e01b815260040160405180910390fd5b836001600160a01b031663667d31686040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613e9c575060408051601f3d908101601f19168201909252613e9991810190616a0e565b60015b613eb95760405163281d5dd760e11b815260040160405180910390fd5b6001600160a01b038116613ee05760405163281d5dd760e11b815260040160405180910390fd5b90506110a5565b5f336001600160a01b03861614801590613f2457506001600160a01b0385165f90815260046020908152604080832033845290915290205460ff16155b15613f94576001600160a01b0385165f90815260066020908152604080832033845282528083208684529091529020545f198114613f9257613f66838261679e565b6001600160a01b0387165f90815260066020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260056020908152604080832086845290915281208054849290613fc690849061679e565b90915550506001600160a01b0384165f90815260056020908152604080832086845290915281208054849290613ffd90849061653d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020616dd1833981519152910160405180910390a4506001949350505050565b5f80516020616df18339815191525c15612f1157604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060e001604052808b81526020018a60020b81526020018960020b8152602001888152602001876001600160a01b03168152602001866001600160801b03168152602001856001600160801b031681525060405160200161410d9190616a29565b60408051601f198184030181529082905261412b9291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401614156919061639a565b5f604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285b9190810190616ad6565b83545f906141af906001600160801b03168561679e565b90508015614278576141d981866002015488600101546141cf919061679e565b600160801b614b85565b855486906010906141fb908490600160801b90046001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061423781866003015488600201546141cf919061679e565b6001860180545f906142539084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6001860154600280870191909155860154600386015584546001600160801b03168015614375575f6142c1826001600160801b031688600401548a600301546141cf919061679e565b90505f6142e5836001600160801b031689600501548b600401546141cf919061679e565b9050811515806142f457508015155b156143725781886006015f82825461430c919061653d565b9250508190555080886007015f828254614326919061653d565b9091555050604080518381526020810183905286916001600160a01b038916917f7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d910160405180910390a35b50505b866003015486600401819055508660040154866005018190555050505050505050565b6040516001600160a01b038085166024830152831660448201526001600160e01b0319821660648201525f908190819060840160408051601f19818403018152918152602080830180516001600160e01b031663b700961360e01b1781525f808052918290528351939450919290918a5afa15614420575f516020805191945081901c150291505b5094509492505050565b600684018054600191905f9061444a9084906001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505f8061447a8585614c21565b915091506144a1835f0151846020015185604001518660600151876080015187878d614ca8565b505050505050565b821580156144b5575081155b6144a157856001600160a01b03166348c8949160016040518060a00160405280896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001856001600160a01b031681525060405160200161455a919081516001600160a01b0390811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b60408051601f19818403018152908290526145789291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016145a3919061639a565b5f604051808303815f875af11580156145be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190616ad6565b811561117157836001600160a01b031663f5298aca30614614866001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b15801561465e575f80fd5b505af1158015614670573d5f803e3d5ffd5b5050604051630b0d9c0960e01b81526001600160a01b03868116600483015284811660248301526044820186905287169250630b0d9c0991506064015b5f604051808303815f87803b1580156146c4575f80fd5b505af115801561285b573d5f803e3d5ffd5b5f818060200190518101906146eb9190616b60565b90505f80856001600160a01b0316635a6bcfda845f01516040518060800160405280876020015160020b8152602001876040015160020b8152602001876060015181526020015f801b8152506040518363ffffffff1660e01b8152600401614754929190616c5d565b60408051808303815f875af115801561476f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147939190616cae565b915091506148758c8c8c8c8c8c8c6040518060e001604052806147ba8d5f015160a0902090565b8d602001518e604001516040516020016147eb93929190928352600291820b6020840152900b604082015260600190565b604051602081830303815290604052805190602001205f1c81526020018c5f0151815260200161481b8b60801d90565b6001600160801b031681526020016148338b600f0b90565b600f0b6001600160801b031681526020018e5f015161ffff1681526020018e6020015161ffff1681526020018e604001516001600160a01b0316815250614d6c565b61489886845f01518484876080015188606001518960a001518a60c00151614e3d565b505050505050505050505050565b5f805f6148b284614ec0565b90505f6148c060018361653d565b604051631afeb18d60e11b815260048101829052600260248201529091505f906001600160a01b038816906335fd631a906044015b5f60405180830381865afa15801561490f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526149369190810190616cd0565b6020810151604090910151909890975095505050505050565b5f805f61495c8585614efc565b90505f6001600160a01b0387166335fd631a61497984600161653d565b60405160e083901b6001600160e01b03191681526004810191909152600260248201526044016148f5565b5f805f805f6149b286614ec0565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156149fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1e9190616d7a565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6001600160a01b038083165f908152602086905260409020549082161580614a7c575080155b15614a875750611171565b6001600160a01b0383165f908152602086905260408120819055614ab3908590859081908590876144a9565b816001600160a01b0316836001600160a01b03167f8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e080866483604051614af891815260200190565b60405180910390a35050505050565b600854600954600a546128a1926013927f00000000000000000000000000000000000000000000000000000000000000009286926001600160a01b039081169281169116614f4f565b614b5d8383836001615031565b61132d57604051635274afe760e01b81526001600160a01b0384166004820152602401612012565b5f838302815f1985870982811083820303915050808411614ba4575f80fd5b805f03614bb6575082900490506110a5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6040805160a0808201835284546001600160a01b03908116835260018601548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b60608401528501549092166080820152205f908190614c9c9084906003870154600281810b9163010000009004900b613a54565b915091505b9250929050565b6003810154600482015482546006840154604080518c8152602081018c90529081018a905260608101899052608081019490945260a084019290925260c0830186905260e083018590526001600160801b03808216610100850152600160801b909104166101208301526001600160401b03808216610140840152600160401b9091041661016082015288907f9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309906101800160405180910390a25050505050505050565b80515f9081526020859052604081205460c0830151608084015160a0850151614da49388936001600160401b0390911692909161345d565b845483515f9081526020889052604090819020805467ffffffffffffffff19166001600160401b03909316929092179091558301519091506001600160801b0316158015614dfd575060608201516001600160801b0316155b15614e08575061285b565b81515f90815260208a8152604080832085518452918b9052909120614e3291908989878787615093565b505050505050505050565b5f614e488660801d90565b614e528860801d90565b614e5c9190616d91565b90505f614e6987600f0b90565b614e7389600f0b90565b614e7d9190616d91565b9050614e8a8286866156d7565b614e958186856156d7565b614ea48a8a5f01518489615797565b614eb48a8a602001518389615797565b50505050505050505050565b6040515f90614edf908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f80614f0784614ec0565b90505f614f1560048361653d565b60408051600287900b6020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6001600160a01b0384165f9081526020879052604081205490819003614f7557506144a1565b5f836001600160a01b0316866001600160a01b031614614f955784614f97565b825b90506001600160a01b038116614fae5750506144a1565b6001600160a01b0386165f908152602089905260408120819055614fda908890889081908690866144a9565b806001600160a01b0316866001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb88460405161501f91815260200190565b60405180910390a35050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661508757838315161561507b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60408201516001600160801b031615615126576020820151516040808401518151630ab714fb60e11b81523060048201526001600160a01b0393841660248201526001600160801b03909116604482015290519185169163156e29f6916064808201925f9290919082900301818387803b15801561510f575f80fd5b505af1158015615121573d5f803e3d5ffd5b505050505b60608201516001600160801b0316156151da57826001600160a01b031663156e29f63061516a8560200151602001516001600160a01b03166001600160a01b031690565b60608601516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526001600160801b031660448201526064015f604051808303815f87803b1580156151c3575f80fd5b505af11580156151d5573d5f803e3d5ffd5b505050505b86546001600160801b03165f8190036152f55782604001516001600160801b0316865f85602001515f01516001600160a01b03166001600160a01b031681526020019081526020015f205f828254615232919061653d565b9250508190555082606001516001600160801b0316865f8560200151602001516001600160a01b03166001600160a01b031681526020019081526020015f205f82825461527f919061653d565b925050819055506152ef8888866040518060a00160405280885f0151815260200188604001516001600160801b0316815260200188606001516001600160801b0316815260200188604001516001600160801b0316815260200188606001516001600160801b031681525061442a565b50611723565b5f61530789856040015184600161594f565b90505f61531a8a8660600151855f61594f565b9050811561535457602080860151516001600160a01b03165f9081529089905260408120805484929061534e90849061653d565b90915550505b801561538e576020808601518101516001600160a01b03165f9081529089905260408120805483929061538890849061653d565b90915550505b6153998a8383615a57565b89545f906153b790600160801b90046001600160801b03168561679e565b9050805f03615505578286604001516001600160801b03166153d9919061679e565b602080880151516001600160a01b03165f908152908b905260408120805490919061540590849061653d565b909155505060608601516154239083906001600160801b031661679e565b6020808801518101516001600160a01b03165f908152908b905260408120805490919061545190849061653d565b925050819055506154938b8488604001516001600160801b0316615475919061679e565b8489606001516001600160801b031661548e919061679e565b615a57565b6154fc8b8b896040518060a001604052808b5f015181526020018b604001516001600160801b031681526020018b606001516001600160801b031681526020018b604001516001600160801b031681526020018b606001516001600160801b031681525061442a565b50505050611723565b5f8387604001516001600160801b031661551f919061679e565b90505f8388606001516001600160801b031661553b919061679e565b905061ffff87161580159061555c575060c08801516001600160a01b031615155b1561562a575f61271061557361ffff8a1685616894565b61557d91906168bf565b90505f61271061559161ffff8b1685616894565b61559b91906168bf565b905081156155d5576020808b0151516001600160a01b03165f908152908d90526040812080548492906155cf90849061653d565b90915550505b801561560f576020808b01518101516001600160a01b03165f908152908d905260408120805483929061560990849061653d565b90915550505b615619828561679e565b9350615625818461679e565b925050505b61563982600160801b85614b85565b8d6001015f82825461564b919061653d565b90915550615660905081600160801b85614b85565b8d6002015f828254615672919061653d565b925050819055506156c88d8d8b6040518060a001604052808d5f015181526020018d604001516001600160801b031681526020018d606001516001600160801b031681526020018a81526020018981525061442a565b50505050505050505050505050565b5f82131561573b575f8084600f0b126156f0575f6156fd565b83600f0b6156fd90616769565b9050816001600160801b031681111561117157604051630f569baf60e01b8152600481018290526001600160801b0383166024820152604401612012565b5f82121561132d575f8084600f0b13615754575f615759565b83600f0b5b9050816001600160801b031681101561117157604051636741d67d60e11b8152600481018290526001600160801b0383166024820152604401612012565b5f82600f0b12156158ff575f82600f0b6157b090616769565b604051632961046560e21b81526001600160a01b0386811660048301529192509086169063a5841194906024015f604051808303815f87803b1580156157f4575f80fd5b505af1158015615806573d5f803e3d5ffd5b505050506001600160a01b03841661588157846001600160a01b03166311da60b4826040518263ffffffff1660e01b815260040160206040518083038185885af1158015615856573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061587b9190616d7a565b506158f9565b6158966001600160a01b038516838784615ae8565b846001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156158d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158f79190616d7a565b505b50611171565b5f82600f0b131561117157604051630b0d9c0960e01b81526001600160a01b03848116600483015282811660248301526001600160801b0384166044830152851690630b0d9c09906064016146ad565b83545f90600160801b90046001600160801b0316816159958580615975576159756168ab565b836001600160801b0316886001600160801b031609600160801b87614b85565b846159b4576005880154600160801b90046001600160801b03166159c3565b60058801546001600160801b03165b6001600160801b03166159d6919061653d565b9050608081901c6159fa876001600160801b0316846001600160801b031688614b85565b615a04919061653d565b9250808415615a2f576005880180546001600160801b0319166001600160801b038316179055615a4c565b6005880180546001600160801b03808416600160801b0291161790555b505050949350505050565b8254600160801b90046001600160801b03165f819003615a775750505050565b8215615aad57615a9583600160801b836001600160801b0316614b85565b846003015f828254615aa7919061653d565b90915550505b811561117157615acb82600160801b836001600160801b0316614b85565b846004015f828254615add919061653d565b909155505050505050565b615af6848484846001615b1e565b61117157604051635274afe760e01b81526001600160a01b0385166004820152602401612012565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316615b7a578383151615615b6e573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146128a1575f80fd5b5f8060408385031215615bb0575f80fd5b8235615bbb81615b8b565b946020939093013593505050565b5f60208284031215615bd9575f80fd5b81356001600160e01b0319811681146110a5575f80fd5b5f805f60608486031215615c02575f80fd5b8335615c0d81615b8b565b95602085013595506040909401359392505050565b5f8083601f840112615c32575f80fd5b5081356001600160401b03811115615c48575f80fd5b6020830191508360208260051b8501011115614ca1575f80fd5b803561ffff81168114615c73575f80fd5b919050565b5f805f8060608587031215615c8b575f80fd5b84356001600160401b03811115615ca0575f80fd5b615cac87828801615c22565b9095509350615cbf905060208601615c62565b91506040850135615ccf81615b8b565b939692955090935050565b5f60208284031215615cea575f80fd5b81356001600160401b03811681146110a5575f80fd5b5f60208284031215615d10575f80fd5b5035919050565b80151581146128a1575f80fd5b5f8060408385031215615d35575f80fd5b823591506020830135615d4781615d17565b809150509250929050565b5f60208284031215615d62575f80fd5b81356110a581615b8b565b5f805f60408486031215615d7f575f80fd5b83356001600160401b03811115615d94575f80fd5b615da086828701615c22565b9094509250506020840135615db481615b8b565b809150509250925092565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101008101615e118287615dbf565b8460020b60a08301528360020b60c083015282151560e083015295945050505050565b5f60a08284031215615e44575f80fd5b50919050565b8060020b81146128a1575f80fd5b6001600160801b03811681146128a1575f80fd5b5f805f805f805f610160888a031215615e83575f80fd5b615e8d8989615e34565b965060a0880135615e9d81615e4a565b955060c0880135615ead81615e4a565b945060e0880135615ebd81615e58565b9350610100880135615ece81615e58565b9250610120880135615edf81615e58565b9699959850939692959194919350506101409091013590565b81516001600160801b0316815261014081016020830151615f2460208401826001600160801b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151615f6760c08401826001600160801b03169052565b5060e0830151615f8260e08401826001600160801b03169052565b50610100830151615f9f6101008401826001600160401b03169052565b50610120830151615fbc6101208401826001600160401b03169052565b5092915050565b62ffffff811681146128a1575f80fd5b5f805f806101008587031215615fe7575f80fd5b615ff18686615e34565b935060a085013561600181615fc3565b925060c085013561601181615fc3565b915060e0850135615ccf81615fc3565b5f805f805f6101208688031215616036575f80fd5b6160408787615e34565b945060a086013561605081615e4a565b935060c086013561606081615e4a565b925060e086013561607081615b8b565b915061607f6101008701615c62565b90509295509295909350565b5f806040838503121561609c575f80fd5b823591506020830135615d4781615b8b565b5f610120820190506001600160801b0383511682526001600160801b03602084015116602083015260408301516160f060408401826001600160801b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b5f8060408385031215616146575f80fd5b823561615181615b8b565b91506020830135615d4781615d17565b5f8083601f840112616171575f80fd5b5081356001600160401b03811115616187575f80fd5b602083019150836020828501011115614ca1575f80fd5b5f805f805f8587036101408112156161b4575f80fd5b86356161bf81615b8b565b95506161ce8860208901615e34565b9450606060bf19820112156161e1575f80fd5b5060c0860192506101208601356001600160401b03811115616201575f80fd5b61620d88828901616161565b969995985093965092949392505050565b5f805f60608486031215616230575f80fd5b833561623b81615b8b565b9250602084013561624b81615b8b565b929592945050506040919091013590565b5f805f806101008587031215616270575f80fd5b61627a8686615e34565b935060a085013561628a81615e4a565b925060c085013561629a81615e4a565b915060e0850135615ccf81615e58565b5f805f604084860312156162bc575f80fd5b8335925060208401356001600160401b038111156162d8575f80fd5b6162e486828701615c22565b9497909650939450505050565b5f805f60608486031215616303575f80fd5b83359250602084013561631581615fc3565b9150604084013564ffffffffff81168114615db4575f80fd5b5f806020838503121561633f575f80fd5b82356001600160401b03811115616354575f80fd5b61636085828601616161565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a5602083018461636c565b5f805f805f805f80610180898b0312156163c4575f80fd5b6163ce8a8a615e34565b975060a08901356163de81615e4a565b965060c08901356163ee81615e4a565b955060e08901356163fe81615e58565b945061010089013561640f81615b8b565b935061012089013561642081615e58565b925061014089013561643181615e58565b979a969950949793969295919450919261016001359150565b5f806040838503121561645b575f80fd5b823561646681615b8b565b91506020830135615d4781615b8b565b5f805f60e08486031215616488575f80fd5b833561649381615b8b565b92506164a28560208601615e34565b915060c0840135615db481615b8b565b5f805f606084860312156164c4575f80fd5b8335925060208401356164d681615e4a565b91506040840135615db481615e4a565b5f805f80608085870312156164f9575f80fd5b843561650481615b8b565b9350602085013561651481615b8b565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561101657611016616529565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561658657616586616550565b60405290565b60405160e081016001600160401b038111828210171561658657616586616550565b604051601f8201601f191681016001600160401b03811182821017156165d6576165d6616550565b604052919050565b5f60a08284031280156165ef575f80fd5b506165f8616564565b823561660381615b8b565b8152602083013561661381615b8b565b6020820152604083013561662681615fc3565b6040820152606083013561663981615e4a565b6060820152608083013561664c81615b8b565b60808201529392505050565b6001600160401b03818116838216019081111561101657611016616529565b6001600160801b03818116838216019081111561101657611016616529565b5f60608284031280156166a7575f80fd5b50604051606081016001600160401b03811182821017156166ca576166ca616550565b60405282356166d881615d17565b81526020838101359082015260408301356166f281615b8b565b60408201529392505050565b5f6020828403121561670e575f80fd5b81516110a581615d17565b6001600160801b03828116828216039081111561101657611016616529565b634e487b7160e01b5f52603260045260245ffd5b64ffffffffff818116838216019081111561101657611016616529565b5f600160ff1b820161677d5761677d616529565b505f0390565b5f60208284031215616793575f80fd5b81356110a581615fc3565b8181038181111561101657611016616529565b5f80858511156167bf575f80fd5b838611156167cb575f80fd5b5050820193919092039150565b80356001600160e01b03198116906004841015615fbc576001600160e01b031960049490940360031b84901b1690921692915050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8161685b5761685b616529565b505f190190565b5f6001820161687357616873616529565b5060010190565b61ffff828116828216039081111561101657611016616529565b808202811582820484141761101657611016616529565b634e487b7160e01b5f52601260045260245ffd5b5f826168d957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b038211156168f6576168f6616550565b50601f01601f191660200190565b5f8060408385031215616915575f80fd5b823560028110616923575f80fd5b915060208301356001600160401b0381111561693d575f80fd5b8301601f8101851361694d575f80fd5b803561696061695b826168de565b6165ae565b818152866020838501011115616974575f80fd5b816020840160208301375f602083830101528093505050509250929050565b634e487b7160e01b5f52602160045260245ffd5b8051615c7381615b8b565b5f60a08284031280156169c3575f80fd5b506169cc616564565b82516169d781615b8b565b815260208301516169e781615b8b565b60208201526040838101519082015260608084015190820152608083015161664c81615b8b565b5f60208284031215616a1e575f80fd5b81516110a581615b8b565b5f61016082019050616a3c828451615dbf565b602083015160020b60a0830152604083015160020b60c0830152606083015160e083015260018060a01b036080840151166101008301526001600160801b0360a08401511661012083015260c0830151615fbc6101408401826001600160801b03169052565b5f60028410616abf57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152612ee7604083018461636c565b5f60208284031215616ae6575f80fd5b81516001600160401b03811115616afb575f80fd5b8201601f81018413616b0b575f80fd5b8051616b1961695b826168de565b818152856020838501011115616b2d575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b8051615c7381615e4a565b8051615c7381615e58565b5f81830361016081128015616b73575f80fd5b50616b7c61658c565b60a0821215616b89575f80fd5b616b91616564565b91508351616b9e81615b8b565b82526020840151616bae81615b8b565b60208301526040840151616bc181615fc3565b60408301526060840151616bd481615e4a565b60608301526080840151616be781615b8b565b6080830152818152616bfb60a08501616b4a565b6020820152616c0c60c08501616b4a565b604082015260e0840151606082018190529150616c2c61010085016169a7565b6080820152616c3e6101208501616b55565b60a0820152616c506101408501616b55565b60c0820152949350505050565b616c678184615dbf565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f8060408385031215616cbf575f80fd5b505080516020909101519092909150565b5f60208284031215616ce0575f80fd5b81516001600160401b03811115616cf5575f80fd5b8201601f81018413616d05575f80fd5b80516001600160401b03811115616d1e57616d1e616550565b8060051b616d2e602082016165ae565b91825260208184018101929081019087841115616d49575f80fd5b6020850194505b83851015616d6f57845180835260209586019590935090910190616d50565b979650505050505050565b5f60208284031215616d8a575f80fd5b5051919050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff1981126f7fffffffffffffffffffffffffffffff821317156110165761101661652956fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac7288599b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081a000a","sourceMap":"3553:4264:41:-:0;;;5170:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5286:12;5300:10;5312:15;5286:12;5300:10;5312:15;5300:10;1145:31:0;5300:10:41;1145:13:0;:31::i;:::-;-1:-1:-1;3396:20:42::1;::::0;::::1;::::0;;:65:::1;;-1:-1:-1::0;1111:7:29::1;3420:41:42;::::0;::::1;;3396:65;3392:93;;;3470:15;;-1:-1:-1::0;;;3470:15:42::1;;;;;;;;;;;3392:93;3495:34;::::0;::::1;;::::0;-1:-1:-1;;;;;3539:26:42;::::1;;::::0;3575:72:::1;3620:4;3628:18;3553:4264:41::0;;;;;;;;-1:-1:-1;3553:4264:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2780:4:40;2749:35;;;3553:4264:41;;;2794:29:40;3553:4264:41;2641:189:40;3628:18:42::1;3575:29;:72::i;:::-;-1:-1:-1::0;;;;;;;;5347:28:41;::::1;::::0;-1:-1:-1;5343:54:41::1;::::0;-1:-1:-1;;5343:54:41::1;5384:13;;-1:-1:-1::0;;;5384:13:41::1;;;;;;;;;;;5343:54;-1:-1:-1::0;;;;;5407:12:41::1;;::::0;-1:-1:-1;3553:4264:41;;-1:-1:-1;;3553:4264:41;3759:149:0;3831:10;:25;;-1:-1:-1;;;;;;3831:25:0;-1:-1:-1;;;;;3831:25:0;;;;;;;;3871:30;;1076:51:46;;;3871:30:0;;1064:2:46;1049:18;3871:30:0;;;;;;;3759:149;:::o;3532:1599:28:-;3651:28;;:74;;1319:7;16441:29;;:34;;3651:74;;;:166;;-1:-1:-1;3745:27:28;;;;:72;;1382:7;16441:29;;:34;;3745:72;;3651:166;:265;;;-1:-1:-1;3837:30:28;;;;:79;;1450:7;16441:29;;:34;;3837:79;;3651:265;:362;;;-1:-1:-1;3936:29:28;;;;:77;;1516:7;16441:29;;:34;;3936:77;;3651:362;:467;;;-1:-1:-1;4033:33:28;;;;:85;;1587:6;16441:29;;:34;;4033:85;;3651:467;:570;;;-1:-1:-1;4138:32:28;;;;:83;;1655:6;16441:29;;:34;;4138:83;;3651:570;:652;;;-1:-1:-1;4241:22:28;;;;:62;;1713:6;16441:29;;:34;;4241:62;;3651:652;:732;;;-1:-1:-1;4323:21:28;;;;:60;;1769:6;16441:29;;:34;;4323:60;;3651:732;:818;;;-1:-1:-1;4403:24:28;;;;:66;;1829:6;16441:29;;:34;;4403:66;;3651:818;:902;;;-1:-1:-1;4489:23:28;;;;:64;;1887:6;16441:29;;:34;;4489:64;;3651:902;:1009;;;-1:-1:-1;4573:33:28;;;;:87;;1959:6;16441:29;;:34;;4573:87;;3651:1009;:1114;;;-1:-1:-1;4680:32:28;;;;:85;;2029:6;16441:29;;:34;;4680:85;;3651:1114;:1236;;;-1:-1:-1;4785:40:28;;;;:102;;2108:6;16441:29;;:34;;4785:102;;3651:1236;:1384;;;-1:-1:-1;4907:43:28;;;;:128;;2190:6;16441:29;;:34;;4907:128;;3651:1384;3634:1491;;;5060:54;-1:-1:-1;;;5108:4:28;5060:39;:54::i;:::-;3532:1599;;:::o;1009:257:25:-;1133:8;1130:1;1123:19;-1:-1:-1;;;;;1172:4:25;1168:53;1162:4;1155:67;1245:4;1242:1;1235:15;14:145:46;-1:-1:-1;;;;;103:31:46;;93:42;;83:70;;149:1;146;139:12;83:70;14:145;:::o;164:761::-;296:6;304;312;320;373:3;361:9;352:7;348:23;344:33;341:53;;;390:1;387;380:12;341:53;422:9;416:16;441:45;480:5;441:45;:::i;:::-;555:2;540:18;;534:25;505:5;;-1:-1:-1;568:47:46;534:25;568:47;:::i;:::-;686:2;671:18;;665:25;634:7;;-1:-1:-1;734:8:46;721:22;;709:35;;699:63;;758:1;755;748:12;699:63;833:2;818:18;;812:25;781:7;;-1:-1:-1;846:47:46;812:25;846:47;:::i;:::-;164:761;;;;-1:-1:-1;164:761:46;;-1:-1:-1;;164:761:46:o;930:203::-;3553:4264:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"6080604052600436106103d6575f3560e01c80637e445230116101ff578063bdde80c611610113578063daf58566116100a8578063e74c37f711610078578063e74c37f714610f38578063f4314f1d14610f57578063f69ec15814610f9e578063f8c543ce14610fb3578063fe99049a14610fc7575f80fd5b8063daf5856614610ea8578063dc4c90d314610ec7578063dc98354e14610efa578063df848a9f14610f19575f80fd5b8063d0ba2baa116100e3578063d0ba2baa14610e25578063d5a2472414610e44578063d677eaad14610e74578063da748b1014610e93575f80fd5b8063bdde80c614610dac578063bf7e214f14610dcb578063bfcb418514610de7578063bfe1092814610e06575f80fd5b8063999d55fb11610194578063a6acaacc11610164578063a6acaacc14610cf1578063ab9e5bfd14610d05578063ae4a578514610d24578063b11dcb2314610d43578063b6363cf214610d73575f80fd5b8063999d55fb14610c565780639d1712c514610c6c578063a23e4db514610cb8578063a2ba1fc814610cd2575f80fd5b806391dd7346116101cf57806391dd734614610b75578063936852d414610ba1578063966af35a14610bd557806396f25d4214610c36575f80fd5b80637e44523014610af55780637fa7b6ac14610b0a5780638aebf0c114610b295780638fb3603714610b48575f80fd5b80634dc4b5c9116102f65780635ca344691161028b57806370233ddd1161025b57806370233ddd14610a585780637339254914610a835780637a526f4e14610a975780637a9e5e4b14610ab15780637c5e62d014610ad0575f80fd5b80635ca34469146109be5780635cd04cf8146109dd5780635f4934a814610a0d57806363cb7bdf14610a2c575f80fd5b8063558a7297116102c6578063558a729714610903578063575e24b414610922578063598af9e71461096c5780635c975abb146109a8575f80fd5b80634dc4b5c91461087a5780634e8d0048146108995780634eb5c4fd146108b857806351789ea2146108e4575f80fd5b806326f5ef521161036c5780633fc8cef31161033c5780633fc8cef3146106d4578063412b82c81461071f57806341b69b2a1461073e578063426a84931461085b575f80fd5b806326f5ef521461058f5780632e32a3b0146105ae57806336a9ca1a1461068e5780633c2f373f146106a1575f80fd5b8063113b9ac4116103a7578063113b9ac4146104e0578063136439dd1461051257806315452022146105315780632384b55414610564575f80fd5b8062fdd58e1461042a57806301ffc9a714610473578063095bcdb6146104a257806309974324146104c1575f80fd5b3661042657336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042457604051632dc88d5b60e21b815260040160405180910390fd5b005b5f80fd5b348015610435575f80fd5b50610460610444366004615b9f565b600560209081525f928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561047e575f80fd5b5061049261048d366004615bc9565b610fe6565b604051901515815260200161046a565b3480156104ad575f80fd5b506104926104bc366004615bf0565b61101c565b3480156104cc575f80fd5b506104246104db366004615c78565b6110ac565b3480156104eb575f80fd5b506104ff6104fa366004615cda565b611177565b60405161ffff909116815260200161046a565b34801561051d575f80fd5b5061042461052c366004615d00565b6111a5565b34801561053c575f80fd5b5061055061054b366004615d24565b611246565b60405162ffffff909116815260200161046a565b34801561056f575f80fd5b5061046061057e366004615d52565b60146020525f908152604090205481565b34801561059a575f80fd5b506104246105a9366004615d6d565b611276565b3480156105b9575f80fd5b5061067e6105c8366004615d00565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152505f908152601060209081526040918290206003810154835160a08101855282546001600160a01b039081168252600184015480821695830195909552600160a01b850462ffffff1695820195909552600160b81b909304600290810b6060850152918201549093166080830152909282820b926301000000810490920b91600160301b900460ff1690565b60405161046a9493929190615e02565b61042461069c366004615e6c565b611332565b3480156106ac575f80fd5b506105507f000000000000000000000000000000000000000000000000000000000000000081565b3480156106df575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161046a565b34801561072a575f80fd5b50600a54610707906001600160a01b031681565b348015610749575f80fd5b5061084e610758366004615d00565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152505f9081526011602090815260409182902082516101408101845281546001600160801b038082168352600160801b918290048116948301949094526001830154948201949094526002820154606082015260038201546080820152600482015460a0820152600582015480841660c08301529390930490911660e0830152600601546001600160401b03808216610100840152600160401b9091041661012082015290565b60405161046a9190615ef8565b348015610866575f80fd5b50610492610875366004615bf0565b61172c565b348015610885575f80fd5b50610424610894366004615fd3565b6117a2565b3480156108a4575f80fd5b506104246108b3366004616021565b61187d565b3480156108c3575f80fd5b506108d76108d236600461608b565b611a75565b60405161046a91906160ae565b3480156108ef575f80fd5b506104246108fe366004615d00565b611b73565b34801561090e575f80fd5b5061049261091d366004616135565b611bf3565b34801561092d575f80fd5b5061094161093c36600461619e565b611c62565b604080516001600160e01b03199094168452602084019290925262ffffff169082015260600161046a565b348015610977575f80fd5b5061046061098636600461621e565b600660209081525f938452604080852082529284528284209052825290205481565b3480156109b3575f80fd5b50600e544210610492565b3480156109c9575f80fd5b506104246109d836600461625c565b611cf8565b3480156109e8575f80fd5b506105506109f7366004615d00565b60026020525f908152604090205462ffffff1681565b348015610a18575f80fd5b50610424610a27366004615d00565b611f91565b348015610a37575f80fd5b50610a426203f48081565b60405164ffffffffff909116815260200161046a565b348015610a63575f80fd5b50610460610a72366004615d52565b60136020525f908152604090205481565b348015610a8e575f80fd5b50600b54610460565b348015610aa2575f80fd5b506007546104ff9061ffff1681565b348015610abc575f80fd5b50610424610acb366004615d52565b611fe0565b348015610adb575f80fd5b50600754610707906201000090046001600160a01b031681565b348015610b00575f80fd5b506104ff61138881565b348015610b15575f80fd5b50610424610b243660046162aa565b61205d565b348015610b34575f80fd5b50610424610b433660046162f1565b6121f3565b348015610b53575f80fd5b50610b5c612368565b6040516001600160e01b0319909116815260200161046a565b348015610b80575f80fd5b50610b94610b8f36600461632e565b61238a565b60405161046a919061639a565b348015610bac575f80fd5b50610bc0610bbb366004615d00565b612448565b6040805192835260208301919091520161046a565b348015610be0575f80fd5b50610c15610bef366004615d00565b60036020525f908152604090205462ffffff8116906301000000900464ffffffffff1682565b6040805162ffffff909316835264ffffffffff90911660208301520161046a565b348015610c41575f80fd5b505f80516020616df18339815191525c610492565b348015610c61575f80fd5b5061046062093a8081565b348015610c77575f80fd5b50610ca0610c86366004615d00565b600d6020525f90815260409020546001600160401b031681565b6040516001600160401b03909116815260200161046a565b348015610cc3575f80fd5b50600c546104ff9061ffff1681565b348015610cdd575f80fd5b50610424610cec3660046163ac565b612517565b348015610cfc575f80fd5b50610550606481565b348015610d10575f80fd5b50610424610d1f366004615d52565b612865565b348015610d2f575f80fd5b50610424610d3e366004615d52565b6128a4565b348015610d4e575f80fd5b50610550610d5d366004615d00565b60016020525f908152604090205462ffffff1681565b348015610d7e575f80fd5b50610492610d8d36600461644a565b600460209081525f928352604080842090915290825290205460ff1681565b348015610db7575f80fd5b50610424610dc6366004615d52565b612a3e565b348015610dd6575f80fd5b505f546001600160a01b0316610707565b348015610df2575f80fd5b50600954610707906001600160a01b031681565b348015610e11575f80fd5b50600854610707906001600160a01b031681565b348015610e30575f80fd5b50610424610e3f366004615d6d565b612a72565b348015610e4f575f80fd5b50610550610e5e366004615d00565b5f9081526015602052604090205462ffffff1690565b348015610e7f575f80fd5b506104ff610e8e366004615d00565b612b10565b348015610e9e575f80fd5b50610460600e5481565b348015610eb3575f80fd5b50610424610ec236600461625c565b612b1a565b348015610ed2575f80fd5b506107077f000000000000000000000000000000000000000000000000000000000000000081565b348015610f05575f80fd5b50610b5c610f14366004616476565b612c93565b348015610f24575f80fd5b50610460610f333660046164b2565b612db1565b348015610f43575f80fd5b50600f54610707906001600160a01b031681565b348015610f62575f80fd5b50610f76610f71366004615d00565b612dfc565b6040805182516001600160401b0316815260209283015161ffff16928101929092520161046a565b348015610fa9575f80fd5b506104ff6107d081565b348015610fbe575f80fd5b50610460602081565b348015610fd2575f80fd5b50610492610fe13660046164e6565b612e5d565b5f6301ffc9a760e01b6001600160e01b0319831614806110165750630f632fb360e01b6001600160e01b03198316145b92915050565b5f611025612eef565b600e544210156110485760405163b359f26960e01b815260040160405180910390fd5b815f0361106857604051639811e0c760e01b815260040160405180910390fd5b611073338484612f13565b61107c83612f7c565b6110868333613092565b6110908385613092565b61109b8484846130d7565b90506110a561316f565b9392505050565b6110b8335b5f36613186565b6110c0612eef565b6110ca8484613275565b600854600c546110f091600b91859185916001600160a01b039091169061ffff166132e5565b600c805461ffff191661ffff928316179055600780549184166001600160b01b03199092168217620100006001600160a01b038516908102919091179091556040805192835260208301919091527f0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87910160405180910390a161117161316f565b50505050565b600754600c545f9161101691600b9185916001600160a01b03620100008304169161ffff908116911661345d565b6111ae336110b1565b8015806111bd575062093a8081115b156111db576040516316873e3160e11b815260040160405180910390fd5b5f6111e6824261653d565b9050600e54811161120a576040516316873e3160e11b815260040160405180910390fd5b600e8190556040518181527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df9219060200160405180910390a15050565b5f6110a583604051806060016040528085151581526020015f81526020015f6001600160a01b031681525061356c565b61127f336110b1565b611287612eef565b6112918383613275565b6008546001600160a01b03828116911614806112b557506001600160a01b03811630145b156112d3576040516343c829db60e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834906020015b60405180910390a161132d61316f565b505050565b61133a612eef565b600e5442101561135d5760405163b359f26960e01b815260040160405180910390fd5b836001600160801b03165f0361138657604051630200e8a960e31b815260040160405180910390fd5b804211156113a757604051631ab7da6b60e01b815260040160405180910390fd5b6113b087613642565b6113cd6113c06020890189615d52565b6001600160a01b03161590565b1561140157826001600160801b03163410156113fc57604051631841b4e160e01b815260040160405180910390fd5b611420565b341561142057604051631841b4e160e01b815260040160405180910390fd5b5f61144461143d611436368b90038b018b6165de565b60a0902090565b8888612db1565b5f81815260106020526040902060030154909150600160301b900460ff166115885760405180608001604052808980360381019061148291906165de565b8152600289810b60208084019190915289820b604080850191909152600160609485018190525f878152601084528290208651805182546001600160a01b03199081166001600160a01b0392831617845582870151948401805484880151858c01519785166001600160b81b031990921691909117600160a01b62ffffff928316021762ffffff60b81b1916600160b81b978216979097029690961790556080909201519683018054909216961695909517909455918501516003909301805491860151959094015192821665ffffffffffff1990911617630100000094909116939093029290921766ff0000000000001916600160301b921515929092029190911790555b61159181612f7c565b61159b8133613092565b5f818152601160205260409020546001600160801b0316158015611612575f8281526011602052604090206006018054600191906008906115ed908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b5f82815260116020526040812080548892906116389084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055506116703383886001600160801b03166136e5565b611688898989896001600160801b0316338a8a613757565b80156116bc576116bc601160107f000000000000000000000000000000000000000000000000000000000000000085613774565b6040516001600160801b0387168152829033907f1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a9060200160405180910390a361170c6113c060208b018b615d52565b15611719576117196137ba565b505061172361316f565b50505050505050565b335f8181526006602090815260408083206001600160a01b03881680855290835281842087855290925280832085905551919285927fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7906117909087815260200190565b60405180910390a45060019392505050565b6117ab336110b1565b8262ffffff168262ffffff1610806117cc57508062ffffff168262ffffff16115b156117ea576040516306b7c75960e31b815260040160405180910390fd5b5f6117fd611436368790038701876165de565b5f818152601560205260409020805462ffffff191662ffffff8616179055905061182881858461382c565b6040805162ffffff8087168252808616602083015284169181019190915281907f0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5906060015b60405180910390a25050505050565b611885612eef565b600e544210156118a85760405163b359f26960e01b815260040160405180910390fd5b6118b185613642565b5f6118ce6118c7611436368990038901896165de565b8686612db1565b90508161ffff166118de826138f9565b61ffff1611156119015760405163663fffd960e01b815260040160405180910390fd5b5f8181526012602090815260408083203384528252808320600583528184208585529092529091205415801561194657508054600160801b90046001600160801b0316155b801561195d575060018101546001600160801b0316155b1561197b576040516312d37ee560e31b815260040160405180910390fd5b61198482612f7c565b61198e8233613092565b5f8281526012602090815260408083203384529091529020805460018201546001600160801b03600160801b90920482169116811580156119cd575080155b156119dc575050505050611a66565b6001830180546001600160801b031916905582546001600160801b03168355611a23611a0b60208c018c615d52565b611a1b60408d0160208e01615d52565b84848b613919565b6040805183815260208101839052869133917fd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77910160405180910390a350505050505b611a6e61316f565b5050505050565b611ad66040518061012001604052805f6001600160801b031681526020015f6001600160801b031681526020015f6001600160801b031681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b505f9182526012602090815260408084206001600160a01b039390931684529181529181902081516101208101835281546001600160801b038082168352600160801b9091048116948201949094526001820154909316918301919091526002810154606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e08301526007015461010082015290565b611b7c336110b1565b62093a80811115611ba0576040516316873e3160e11b815260040160405180910390fd5b8015611bb557611bb0814261653d565b611bb7565b5f5b600e8190556040519081527f18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921906020015b60405180910390a150565b335f8181526004602090815260408083206001600160a01b038716808552908352818420805460ff191687151590811790915591519182529293917fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267910160405180910390a350600192915050565b5f8080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611cae5760405163570c108560e11b815260040160405180910390fd5b5f611cd8611cc4611436368b90038b018b6165de565b611cd3368a90038a018a616696565b61356c565b6315d7892d60e21b94505f93506240000017915050955095509592505050565b611d00612eef565b600e54421015611d235760405163b359f26960e01b815260040160405180910390fd5b806001600160801b03165f03611d4c57604051639811e0c760e01b815260040160405180910390fd5b611d5584613642565b600f546001600160a01b0316801580611de957506001600160a01b038116637f55485b611d8a611436368990038901896165de565b6040518263ffffffff1660e01b8152600401611da891815260200190565b602060405180830381865afa158015611dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de791906166fe565b155b15611e0757604051630ac6deb160e31b815260040160405180910390fd5b5f611e1d6118c7611436368990038901896165de565b9050611e2881612f7c565b611e328133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529220546001600160801b0380871692611e7492911690616719565b6001600160801b03161015611e9c57604051631a61620360e01b815260040160405180910390fd5b8054849082905f90611eb89084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316611f119190616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a86604051611f7e91906001600160801b0391909116815260200190565b60405180910390a350505061117161316f565b611f9a336110b1565b5f81815260036020526040808220805467ffffffffffffffff191690555182917fb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb91a250565b5f5433906001600160a01b0316811461201b5760405162d1953b60e31b81526001600160a01b03821660048201526024015b60405180910390fd5b816001600160a01b03163b5f03612050576040516361798f2f60e11b81526001600160a01b0383166004820152602401612012565b61205982613947565b5050565b612065612eef565b600f546001600160a01b03168061208f57604051634e3fb44d60e01b815260040160405180910390fd5b5f5b828110156121e9575f8484838181106120ac576120ac616738565b602090810292909201355f81815260119093526040832054909350600160801b90046001600160801b031690910390506120e657506121e1565b5f81815260106020908152604091829020825160a0808201855282546001600160a01b03908116835260018401548082168487015262ffffff600160a01b82041684880152600160b81b9004600290810b606085015290930154831660808301529020835163181e22b360e01b8152336004820152602481018b9052604481019190915292519086169263181e22b39260648083019391928290030181865afa158015612195573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b991906166fe565b6121d657604051630c8563b360e41b815260040160405180910390fd5b6121df81612f7c565b505b600101612091565b505061132d61316f565b6121fc336110b1565b5f8381526001602052604081205462ffffff169081900361223057604051636b271baf60e11b815260040160405180910390fd5b8062ffffff168362ffffff16111561225b5760405163329429f760e11b815260040160405180910390fd5b5f8481526002602052604090205462ffffff9081169084161015612292576040516310dd5b7f60e31b815260040160405180910390fd5b64ffffffffff821615806122af57506203f48064ffffffffff8316115b156122cd57604051631ee3453360e11b815260040160405180910390fd5b5f6122d8834261674c565b60408051808201825262ffffff87811680835264ffffffffff85811660208086018281525f8e81526003835288902096518754915190941663010000000267ffffffffffffffff1990911693909516929092179390931790935583519081529182015291925086917fcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04910161186e565b5f8054600160a01b900460ff1661237e57505f90565b50638fb3603760e01b90565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123d55760405163570c108560e11b815260040160405180910390fd5b6040805160608101825260075461ffff8082168352600c541660208301526201000090046001600160a01b0316918101919091526110a590601190601090601390601490600d90600b907f0000000000000000000000000000000000000000000000000000000000000000908b8b613994565b5f8181526010602052604081206003810154829190600160301b900460ff1661247657505f93849350915050565b6040805160a0808201835283546001600160a01b03908116835260018501548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b606084015284015490921660808201522061250d907f0000000000000000000000000000000000000000000000000000000000000000906003840154600281810b9163010000009004900b613a54565b9250925050915091565b61251f612eef565b846001600160801b03165f0361254857604051630200e8a960e31b815260040160405180910390fd5b6001600160a01b03841661256f5760405163d92e233d60e01b815260040160405180910390fd5b8042111561259057604051631ab7da6b60e01b815260040160405180910390fd5b61259988613642565b5f6125b66125af611436368c90038c018c6165de565b8989612db1565b90506125c181612f7c565b6125cb8133613092565b5f81815260126020908152604080832033845282528083208054600584528285208686529093529083205490929161260e916001600160801b0390911690616719565b9050876001600160801b0316816001600160801b03161015612724575f612635828a616719565b8354909150819084905f906126549084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508060115f8681526020019081526020015f205f0160108282829054906101000a90046001600160801b03166126ad9190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b68360405161271a91906001600160801b0391909116815260200190565b60405180910390a3505b61273833848a6001600160801b0316613af0565b5f83815260116020526040812080548a929061275e9084906001600160801b0316616719565b82546101009290920a6001600160801b038181021990931691831602179091555f85815260116020526040812054909116900390506127f0575f8381526011602052604090206006018054600191906008906127cb908490600160401b90046001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b6128108b8b8b6128086001600160801b038d16616769565b8b8b8b613757565b6040516001600160801b0389168152839033907f07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a09060200160405180910390a350505061285b61316f565b5050505050505050565b61286d612eef565b600e544210156128905760405163b359f26960e01b815260040160405180910390fd5b61289981613b59565b6128a161316f565b50565b6128ad336110b1565b6001600160a01b038116156129f057806001600160a01b03163b5f036128e657604051638fadf87960e01b815260040160405180910390fd5b60405163181e22b360e01b81523060048201525f6024820181905260448201526001600160a01b0382169063181e22b390606401602060405180830381865afa925050508015612953575060408051601f3d908101601f19168201909252612950918101906166fe565b60015b61297057604051638fadf87960e01b815260040160405180910390fd5b50604051637f55485b60e01b81525f60048201526001600160a01b03821690637f55485b90602401602060405180830381865afa9250505080156129d1575060408051601f3d908101601f191682019092526129ce918101906166fe565b60015b6129ee57604051638fadf87960e01b815260040160405180910390fd5b505b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527fc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba90602001611be8565b612a46612eef565b600e54421015612a695760405163b359f26960e01b815260040160405180910390fd5b61289981613b9b565b612a7b336110b1565b612a83612eef565b612a8d8383613275565b600a54600754612ab29183916001600160a01b03918216916201000090910416613d9f565b600980546001600160a01b03199081166001600160a01b03938416179091556008805490911691831691821790556040519081527f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858869060200161131d565b5f611016826138f9565b612b22612eef565b806001600160801b03165f03612b4b57604051639811e0c760e01b815260040160405180910390fd5b612b5484613642565b5f612b71612b6a611436368890038801886165de565b8585612db1565b9050612b7c81612f7c565b612b868133613092565b5f8181526012602090815260408083203384529091528120805490918491839190612bbb9084906001600160801b0316616719565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508260115f8481526020019081526020015f205f0160108282829054906101000a90046001600160801b0316612c149190616719565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081336001600160a01b03167f3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b685604051612c8191906001600160801b0391909116815260200190565b60405180910390a3505061117161316f565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612cdd5760405163570c108560e11b815260040160405180910390fd5b612d02612cf06060850160408601616783565b62ffffff1662ffffff16628000001490565b612d1f576040516309a90e8160e01b815260040160405180910390fd5b60015f612d34611436368790038701876165de565b815260208101919091526040015f9081205462ffffff169003612d6a57604051636b271baf60e11b815260040160405180910390fd5b612d7a6113c06020850185615d52565b8015612d8357505f5b15612da157604051630a7287b560e01b815260040160405180910390fd5b50636e4c1aa760e11b9392505050565b5f838383604051602001612ddc93929190928352600291820b6020840152900b604082015260600190565b60408051601f198184030181529190528051602090910120949350505050565b604080518082019091525f8082526020820152600b8281548110612e2257612e22616738565b5f918252602091829020604080518082019091529101546001600160401b0381168252600160401b900461ffff169181019190915292915050565b5f612e66612eef565b600e54421015612e895760405163b359f26960e01b815260040160405180910390fd5b815f03612ea957604051639811e0c760e01b815260040160405180910390fd5b612eb4858484612f13565b612ebd83612f7c565b612ec78386613092565b612ed18385613092565b612edd85858585613ee7565b9050612ee761316f565b949350505050565b612ef7614045565b612f1160015f80516020616df18339815191525b90614072565b565b5f8281526012602090815260408083206001600160a01b038716845282528083205460058352818420868552909252909120548291612f5d916001600160801b039091169061679e565b101561132d57604051631a61620360e01b815260040160405180910390fd5b5f8181526010602090815260409182902082516101208101845281546001600160a01b0390811660808301908152600184015480831660a0850152600160a01b810462ffffff1660c0850152600160b81b9004600290810b60e085015280850154909216610100840152825260039092015480830b938201939093526301000000830490910b92810192909252600160301b900460ff1615801560608301528061303a57505f828152601160205260409020546001600160801b0316155b156130715750600b545f918252600d6020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b612059815f0151826020015183604001515f306001600160801b0380614079565b5f828152601160209081526040808320601283528184206001600160a01b03861685528352818420600584528285208786529093529220546120599291908486614198565b335f90815260056020908152604080832085845290915281208054839190839061310290849061679e565b90915550506001600160a01b0384165f9081526005602090815260408083208684529091528120805484929061313990849061653d565b909155505060408051338082526020820185905285926001600160a01b038816925f80516020616dd18339815191529101611790565b612f115f5f80516020616df1833981519152612f0b565b5f806131b961319c5f546001600160a01b031690565b86306131ab60045f898b6167b1565b6131b4916167d8565b614398565b9150915081611a6e5763ffffffff811615613252575f805460ff60a01b198116600160a01b17909155604051634a63ebf760e11b81526001600160a01b03909116906394c7d7ee906132139088908890889060040161680e565b5f604051808303815f87803b15801561322a575f80fd5b505af115801561323c573d5f803e3d5ffd5b50505f805460ff60a01b1916905550611a6e9050565b60405162d1953b60e31b81526001600160a01b0386166004820152602401612012565b5f5b8181101561132d576132ae83838381811061329457613294616738565b90506020020160208101906132a99190615d52565b613b9b565b6132dd8383838181106132c3576132c3616738565b90506020020160208101906132d89190615d52565b613b59565b600101613277565b5f6107d061ffff8616111561330d5760405163af2eb37360e01b815260040160405180910390fd5b61ffff85161580159061332757506001600160a01b038416155b156133455760405163af2eb37360e01b815260040160405180910390fd5b306001600160a01b0385160361336e5760405163af2eb37360e01b815260040160405180910390fd5b6001600160a01b038416158015906133975750826001600160a01b0316846001600160a01b0316145b156133b55760405163af2eb37360e01b815260040160405180910390fd5b85545f6001600160a01b038616156133cd57866133cf565b5f5b604080518082019091526001600160401b03428116825261ffff80841660208085019182528d54600181018f555f8f8152919091209451940180549151909216600160401b0269ffffffffffffffffffff199091169390921692909217179055905081158061344557508361ffff168161ffff16105b61344f5783613451565b805b98975050505050505050565b5f846001600160401b03165f0361347557505f613563565b5f6001600160a01b0385161561348b578361348d565b5f5b90505f6134a460016001600160401b03891661679e565b88549091505f5b82821180156134ba5750602081105b15613531575f8a6134cc60018561679e565b815481106134dc576134dc616738565b5f918252602090912001805490915061ffff808716600160401b909204161015613510578054600160401b900461ffff1694505b8261351a8161684d565b935050818061352890616862565b925050506134ab565b8282036135445783945050505050613563565b8561ffff80861690821610613559578461355b565b805b955050505050505b95945050505050565b5f828152601560209081526040808320546003835281842082518084019093525462ffffff8082168452630100000090910464ffffffffff1693830184905216918291904210156136185780515f8781526002602052604081205462ffffff9283169450909116906127106135e36113888261687a565b6135f19061ffff1687616894565b6135fb91906168bf565b905080821015613609578091505b81841015613615578193505b50505b5f8681526001602052604090205462ffffff1680831115613637578092505b509095945050505050565b3061365360a0830160808401615d52565b6001600160a01b0316141580613690575060015f613679611436368590038501856165de565b815260208101919091526040015f205462ffffff16155b156136ae57604051636b271baf60e11b815260040160405180910390fd5b6136be6113c06020830183615d52565b80156136c757505f5b156128a157604051630a7287b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526005602090815260408083208584529091528120805483929061371790849061653d565b9091555050604080513381526020810183905283916001600160a01b038616915f915f80516020616dd183398151915291015b60405180910390a4505050565b611723613769368990038901896165de565b878787878787614079565b5f81815260208581526040808320868352818420825160a0810184528681529384018590529183018490526060830184905260808301939093526111719291859061442a565b475f8190036137c65750565b6040515f90339083908381818185875af1925050503d805f8114613805576040519150601f19603f3d011682016040523d82523d5f602084013e61380a565b606091505b505090508061205957604051633c31275160e21b815260040160405180910390fd5b62ffffff8116158061386757507f000000000000000000000000000000000000000000000000000000000000000062ffffff168162ffffff16115b156138855760405163a51d0c8160e01b815260040160405180910390fd5b606462ffffff831610806138a257508062ffffff168262ffffff16115b156138c05760405163a51d0c8160e01b815260040160405180910390fd5b5f928352600160209081526040808520805462ffffff1990811662ffffff95861617909155600290925290932080549093169116179055565b5f818152600d6020526040812054611016906001600160401b0316611177565b611a6e7f000000000000000000000000000000000000000000000000000000000000000086868686866144a9565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602001611be8565b60605f806139a484860186616904565b909250905060018260018111156139bd576139bd616993565b03613a21575f818060200190518101906139d791906169b2565b90506139f088825f0151836040015184608001516145e5565b613a08888260200151836060015184608001516145e5565b60405180602001604052805f8152509350505050613a46565b613a328d8d8d8d8d8d8d8d896146d6565b60405180602001604052805f815250925050505b9a9950505050505050505050565b5f805f80613a6288886148a6565b915091505f80613a738a8a8a61494f565b915091505f80613a848c8c8b61494f565b915091505f613a938d8d6149a4565b50509150508a60020b8160020b1215613ab55782850398508184039750613ae0565b8960020b8160020b12613ad15784830398508382039750613ae0565b82858803039850818487030397505b5050505050505094509492505050565b6001600160a01b0383165f90815260056020908152604080832085845290915281208054839290613b2290849061679e565b9091555050604080513381526020810183905283915f916001600160a01b038716915f80516020616dd1833981519152910161374a565b6128a160147f000000000000000000000000000000000000000000000000000000000000000083600760029054906101000a90046001600160a01b0316614a56565b6001600160a01b03811615613bb3576128a181614b07565b6001600160a01b0381165f9081526013602052604081205490819003613bd7575050565b6008546001600160a01b031680613bed57505050565b6001600160a01b0383165f908152601360205260408120819055613c39907f000000000000000000000000000000000000000000000000000000000000000090859081908690306144a9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015613c92575f80fd5b505af1158015613ca4573d5f803e3d5ffd5b50613ce09350506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915083905084614b50565b806001600160a01b0316836001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb884604051613d2591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03167fb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e84604051613d9291815260200190565b60405180910390a3505050565b5f6001600160a01b038416613db557505f6110a5565b826001600160a01b0316846001600160a01b031603613de7576040516343c829db60e01b815260040160405180910390fd5b816001600160a01b0316846001600160a01b031603613e19576040516343c829db60e01b815260040160405180910390fd5b306001600160a01b03851603613e42576040516343c829db60e01b815260040160405180910390fd5b836001600160a01b031663667d31686040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613e9c575060408051601f3d908101601f19168201909252613e9991810190616a0e565b60015b613eb95760405163281d5dd760e11b815260040160405180910390fd5b6001600160a01b038116613ee05760405163281d5dd760e11b815260040160405180910390fd5b90506110a5565b5f336001600160a01b03861614801590613f2457506001600160a01b0385165f90815260046020908152604080832033845290915290205460ff16155b15613f94576001600160a01b0385165f90815260066020908152604080832033845282528083208684529091529020545f198114613f9257613f66838261679e565b6001600160a01b0387165f90815260066020908152604080832033845282528083208884529091529020555b505b6001600160a01b0385165f90815260056020908152604080832086845290915281208054849290613fc690849061679e565b90915550506001600160a01b0384165f90815260056020908152604080832086845290915281208054849290613ffd90849061653d565b9091555050604080513381526020810184905284916001600160a01b0380881692908916915f80516020616dd1833981519152910160405180910390a4506001949350505050565b5f80516020616df18339815191525c15612f1157604051633ee5aeb560e01b815260040160405180910390fd5b80825d5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060e001604052808b81526020018a60020b81526020018960020b8152602001888152602001876001600160a01b03168152602001866001600160801b03168152602001856001600160801b031681525060405160200161410d9190616a29565b60408051601f198184030181529082905261412b9291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401614156919061639a565b5f604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285b9190810190616ad6565b83545f906141af906001600160801b03168561679e565b90508015614278576141d981866002015488600101546141cf919061679e565b600160801b614b85565b855486906010906141fb908490600160801b90046001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555061423781866003015488600201546141cf919061679e565b6001860180545f906142539084906001600160801b0316616677565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6001860154600280870191909155860154600386015584546001600160801b03168015614375575f6142c1826001600160801b031688600401548a600301546141cf919061679e565b90505f6142e5836001600160801b031689600501548b600401546141cf919061679e565b9050811515806142f457508015155b156143725781886006015f82825461430c919061653d565b9250508190555080886007015f828254614326919061653d565b9091555050604080518381526020810183905286916001600160a01b038916917f7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d910160405180910390a35b50505b866003015486600401819055508660040154866005018190555050505050505050565b6040516001600160a01b038085166024830152831660448201526001600160e01b0319821660648201525f908190819060840160408051601f19818403018152918152602080830180516001600160e01b031663b700961360e01b1781525f808052918290528351939450919290918a5afa15614420575f516020805191945081901c150291505b5094509492505050565b600684018054600191905f9061444a9084906001600160401b0316616658565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505f8061447a8585614c21565b915091506144a1835f0151846020015185604001518660600151876080015187878d614ca8565b505050505050565b821580156144b5575081155b6144a157856001600160a01b03166348c8949160016040518060a00160405280896001600160a01b03168152602001886001600160a01b03168152602001878152602001868152602001856001600160a01b031681525060405160200161455a919081516001600160a01b0390811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b60408051601f19818403018152908290526145789291602001616aa2565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016145a3919061639a565b5f604051808303815f875af11580156145be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190616ad6565b811561117157836001600160a01b031663f5298aca30614614866001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b15801561465e575f80fd5b505af1158015614670573d5f803e3d5ffd5b5050604051630b0d9c0960e01b81526001600160a01b03868116600483015284811660248301526044820186905287169250630b0d9c0991506064015b5f604051808303815f87803b1580156146c4575f80fd5b505af115801561285b573d5f803e3d5ffd5b5f818060200190518101906146eb9190616b60565b90505f80856001600160a01b0316635a6bcfda845f01516040518060800160405280876020015160020b8152602001876040015160020b8152602001876060015181526020015f801b8152506040518363ffffffff1660e01b8152600401614754929190616c5d565b60408051808303815f875af115801561476f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147939190616cae565b915091506148758c8c8c8c8c8c8c6040518060e001604052806147ba8d5f015160a0902090565b8d602001518e604001516040516020016147eb93929190928352600291820b6020840152900b604082015260600190565b604051602081830303815290604052805190602001205f1c81526020018c5f0151815260200161481b8b60801d90565b6001600160801b031681526020016148338b600f0b90565b600f0b6001600160801b031681526020018e5f015161ffff1681526020018e6020015161ffff1681526020018e604001516001600160a01b0316815250614d6c565b61489886845f01518484876080015188606001518960a001518a60c00151614e3d565b505050505050505050505050565b5f805f6148b284614ec0565b90505f6148c060018361653d565b604051631afeb18d60e11b815260048101829052600260248201529091505f906001600160a01b038816906335fd631a906044015b5f60405180830381865afa15801561490f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526149369190810190616cd0565b6020810151604090910151909890975095505050505050565b5f805f61495c8585614efc565b90505f6001600160a01b0387166335fd631a61497984600161653d565b60405160e083901b6001600160e01b03191681526004810191909152600260248201526044016148f5565b5f805f805f6149b286614ec0565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156149fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1e9190616d7a565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6001600160a01b038083165f908152602086905260409020549082161580614a7c575080155b15614a875750611171565b6001600160a01b0383165f908152602086905260408120819055614ab3908590859081908590876144a9565b816001600160a01b0316836001600160a01b03167f8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e080866483604051614af891815260200190565b60405180910390a35050505050565b600854600954600a546128a1926013927f00000000000000000000000000000000000000000000000000000000000000009286926001600160a01b039081169281169116614f4f565b614b5d8383836001615031565b61132d57604051635274afe760e01b81526001600160a01b0384166004820152602401612012565b5f838302815f1985870982811083820303915050808411614ba4575f80fd5b805f03614bb6575082900490506110a5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6040805160a0808201835284546001600160a01b03908116835260018601548082166020850152600160a01b810462ffffff1694840194909452600160b81b909304600290810b60608401528501549092166080820152205f908190614c9c9084906003870154600281810b9163010000009004900b613a54565b915091505b9250929050565b6003810154600482015482546006840154604080518c8152602081018c90529081018a905260608101899052608081019490945260a084019290925260c0830186905260e083018590526001600160801b03808216610100850152600160801b909104166101208301526001600160401b03808216610140840152600160401b9091041661016082015288907f9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309906101800160405180910390a25050505050505050565b80515f9081526020859052604081205460c0830151608084015160a0850151614da49388936001600160401b0390911692909161345d565b845483515f9081526020889052604090819020805467ffffffffffffffff19166001600160401b03909316929092179091558301519091506001600160801b0316158015614dfd575060608201516001600160801b0316155b15614e08575061285b565b81515f90815260208a8152604080832085518452918b9052909120614e3291908989878787615093565b505050505050505050565b5f614e488660801d90565b614e528860801d90565b614e5c9190616d91565b90505f614e6987600f0b90565b614e7389600f0b90565b614e7d9190616d91565b9050614e8a8286866156d7565b614e958186856156d7565b614ea48a8a5f01518489615797565b614eb48a8a602001518389615797565b50505050505050505050565b6040515f90614edf908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f80614f0784614ec0565b90505f614f1560048361653d565b60408051600287900b6020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b6001600160a01b0384165f9081526020879052604081205490819003614f7557506144a1565b5f836001600160a01b0316866001600160a01b031614614f955784614f97565b825b90506001600160a01b038116614fae5750506144a1565b6001600160a01b0386165f908152602089905260408120819055614fda908890889081908690866144a9565b806001600160a01b0316866001600160a01b03167f3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb88460405161501f91815260200190565b60405180910390a35050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661508757838315161561507b573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60408201516001600160801b031615615126576020820151516040808401518151630ab714fb60e11b81523060048201526001600160a01b0393841660248201526001600160801b03909116604482015290519185169163156e29f6916064808201925f9290919082900301818387803b15801561510f575f80fd5b505af1158015615121573d5f803e3d5ffd5b505050505b60608201516001600160801b0316156151da57826001600160a01b031663156e29f63061516a8560200151602001516001600160a01b03166001600160a01b031690565b60608601516040516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091526001600160801b031660448201526064015f604051808303815f87803b1580156151c3575f80fd5b505af11580156151d5573d5f803e3d5ffd5b505050505b86546001600160801b03165f8190036152f55782604001516001600160801b0316865f85602001515f01516001600160a01b03166001600160a01b031681526020019081526020015f205f828254615232919061653d565b9250508190555082606001516001600160801b0316865f8560200151602001516001600160a01b03166001600160a01b031681526020019081526020015f205f82825461527f919061653d565b925050819055506152ef8888866040518060a00160405280885f0151815260200188604001516001600160801b0316815260200188606001516001600160801b0316815260200188604001516001600160801b0316815260200188606001516001600160801b031681525061442a565b50611723565b5f61530789856040015184600161594f565b90505f61531a8a8660600151855f61594f565b9050811561535457602080860151516001600160a01b03165f9081529089905260408120805484929061534e90849061653d565b90915550505b801561538e576020808601518101516001600160a01b03165f9081529089905260408120805483929061538890849061653d565b90915550505b6153998a8383615a57565b89545f906153b790600160801b90046001600160801b03168561679e565b9050805f03615505578286604001516001600160801b03166153d9919061679e565b602080880151516001600160a01b03165f908152908b905260408120805490919061540590849061653d565b909155505060608601516154239083906001600160801b031661679e565b6020808801518101516001600160a01b03165f908152908b905260408120805490919061545190849061653d565b925050819055506154938b8488604001516001600160801b0316615475919061679e565b8489606001516001600160801b031661548e919061679e565b615a57565b6154fc8b8b896040518060a001604052808b5f015181526020018b604001516001600160801b031681526020018b606001516001600160801b031681526020018b604001516001600160801b031681526020018b606001516001600160801b031681525061442a565b50505050611723565b5f8387604001516001600160801b031661551f919061679e565b90505f8388606001516001600160801b031661553b919061679e565b905061ffff87161580159061555c575060c08801516001600160a01b031615155b1561562a575f61271061557361ffff8a1685616894565b61557d91906168bf565b90505f61271061559161ffff8b1685616894565b61559b91906168bf565b905081156155d5576020808b0151516001600160a01b03165f908152908d90526040812080548492906155cf90849061653d565b90915550505b801561560f576020808b01518101516001600160a01b03165f908152908d905260408120805483929061560990849061653d565b90915550505b615619828561679e565b9350615625818461679e565b925050505b61563982600160801b85614b85565b8d6001015f82825461564b919061653d565b90915550615660905081600160801b85614b85565b8d6002015f828254615672919061653d565b925050819055506156c88d8d8b6040518060a001604052808d5f015181526020018d604001516001600160801b031681526020018d606001516001600160801b031681526020018a81526020018981525061442a565b50505050505050505050505050565b5f82131561573b575f8084600f0b126156f0575f6156fd565b83600f0b6156fd90616769565b9050816001600160801b031681111561117157604051630f569baf60e01b8152600481018290526001600160801b0383166024820152604401612012565b5f82121561132d575f8084600f0b13615754575f615759565b83600f0b5b9050816001600160801b031681101561117157604051636741d67d60e11b8152600481018290526001600160801b0383166024820152604401612012565b5f82600f0b12156158ff575f82600f0b6157b090616769565b604051632961046560e21b81526001600160a01b0386811660048301529192509086169063a5841194906024015f604051808303815f87803b1580156157f4575f80fd5b505af1158015615806573d5f803e3d5ffd5b505050506001600160a01b03841661588157846001600160a01b03166311da60b4826040518263ffffffff1660e01b815260040160206040518083038185885af1158015615856573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061587b9190616d7a565b506158f9565b6158966001600160a01b038516838784615ae8565b846001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156158d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906158f79190616d7a565b505b50611171565b5f82600f0b131561117157604051630b0d9c0960e01b81526001600160a01b03848116600483015282811660248301526001600160801b0384166044830152851690630b0d9c09906064016146ad565b83545f90600160801b90046001600160801b0316816159958580615975576159756168ab565b836001600160801b0316886001600160801b031609600160801b87614b85565b846159b4576005880154600160801b90046001600160801b03166159c3565b60058801546001600160801b03165b6001600160801b03166159d6919061653d565b9050608081901c6159fa876001600160801b0316846001600160801b031688614b85565b615a04919061653d565b9250808415615a2f576005880180546001600160801b0319166001600160801b038316179055615a4c565b6005880180546001600160801b03808416600160801b0291161790555b505050949350505050565b8254600160801b90046001600160801b03165f819003615a775750505050565b8215615aad57615a9583600160801b836001600160801b0316614b85565b846003015f828254615aa7919061653d565b90915550505b811561117157615acb82600160801b836001600160801b0316614b85565b846004015f828254615add919061653d565b909155505050505050565b615af6848484846001615b1e565b61117157604051635274afe760e01b81526001600160a01b0385166004820152602401612012565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316615b7a578383151615615b6e573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146128a1575f80fd5b5f8060408385031215615bb0575f80fd5b8235615bbb81615b8b565b946020939093013593505050565b5f60208284031215615bd9575f80fd5b81356001600160e01b0319811681146110a5575f80fd5b5f805f60608486031215615c02575f80fd5b8335615c0d81615b8b565b95602085013595506040909401359392505050565b5f8083601f840112615c32575f80fd5b5081356001600160401b03811115615c48575f80fd5b6020830191508360208260051b8501011115614ca1575f80fd5b803561ffff81168114615c73575f80fd5b919050565b5f805f8060608587031215615c8b575f80fd5b84356001600160401b03811115615ca0575f80fd5b615cac87828801615c22565b9095509350615cbf905060208601615c62565b91506040850135615ccf81615b8b565b939692955090935050565b5f60208284031215615cea575f80fd5b81356001600160401b03811681146110a5575f80fd5b5f60208284031215615d10575f80fd5b5035919050565b80151581146128a1575f80fd5b5f8060408385031215615d35575f80fd5b823591506020830135615d4781615d17565b809150509250929050565b5f60208284031215615d62575f80fd5b81356110a581615b8b565b5f805f60408486031215615d7f575f80fd5b83356001600160401b03811115615d94575f80fd5b615da086828701615c22565b9094509250506020840135615db481615b8b565b809150509250925092565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101008101615e118287615dbf565b8460020b60a08301528360020b60c083015282151560e083015295945050505050565b5f60a08284031215615e44575f80fd5b50919050565b8060020b81146128a1575f80fd5b6001600160801b03811681146128a1575f80fd5b5f805f805f805f610160888a031215615e83575f80fd5b615e8d8989615e34565b965060a0880135615e9d81615e4a565b955060c0880135615ead81615e4a565b945060e0880135615ebd81615e58565b9350610100880135615ece81615e58565b9250610120880135615edf81615e58565b9699959850939692959194919350506101409091013590565b81516001600160801b0316815261014081016020830151615f2460208401826001600160801b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c0830151615f6760c08401826001600160801b03169052565b5060e0830151615f8260e08401826001600160801b03169052565b50610100830151615f9f6101008401826001600160401b03169052565b50610120830151615fbc6101208401826001600160401b03169052565b5092915050565b62ffffff811681146128a1575f80fd5b5f805f806101008587031215615fe7575f80fd5b615ff18686615e34565b935060a085013561600181615fc3565b925060c085013561601181615fc3565b915060e0850135615ccf81615fc3565b5f805f805f6101208688031215616036575f80fd5b6160408787615e34565b945060a086013561605081615e4a565b935060c086013561606081615e4a565b925060e086013561607081615b8b565b915061607f6101008701615c62565b90509295509295909350565b5f806040838503121561609c575f80fd5b823591506020830135615d4781615b8b565b5f610120820190506001600160801b0383511682526001600160801b03602084015116602083015260408301516160f060408401826001600160801b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b5f8060408385031215616146575f80fd5b823561615181615b8b565b91506020830135615d4781615d17565b5f8083601f840112616171575f80fd5b5081356001600160401b03811115616187575f80fd5b602083019150836020828501011115614ca1575f80fd5b5f805f805f8587036101408112156161b4575f80fd5b86356161bf81615b8b565b95506161ce8860208901615e34565b9450606060bf19820112156161e1575f80fd5b5060c0860192506101208601356001600160401b03811115616201575f80fd5b61620d88828901616161565b969995985093965092949392505050565b5f805f60608486031215616230575f80fd5b833561623b81615b8b565b9250602084013561624b81615b8b565b929592945050506040919091013590565b5f805f806101008587031215616270575f80fd5b61627a8686615e34565b935060a085013561628a81615e4a565b925060c085013561629a81615e4a565b915060e0850135615ccf81615e58565b5f805f604084860312156162bc575f80fd5b8335925060208401356001600160401b038111156162d8575f80fd5b6162e486828701615c22565b9497909650939450505050565b5f805f60608486031215616303575f80fd5b83359250602084013561631581615fc3565b9150604084013564ffffffffff81168114615db4575f80fd5b5f806020838503121561633f575f80fd5b82356001600160401b03811115616354575f80fd5b61636085828601616161565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a5602083018461636c565b5f805f805f805f80610180898b0312156163c4575f80fd5b6163ce8a8a615e34565b975060a08901356163de81615e4a565b965060c08901356163ee81615e4a565b955060e08901356163fe81615e58565b945061010089013561640f81615b8b565b935061012089013561642081615e58565b925061014089013561643181615e58565b979a969950949793969295919450919261016001359150565b5f806040838503121561645b575f80fd5b823561646681615b8b565b91506020830135615d4781615b8b565b5f805f60e08486031215616488575f80fd5b833561649381615b8b565b92506164a28560208601615e34565b915060c0840135615db481615b8b565b5f805f606084860312156164c4575f80fd5b8335925060208401356164d681615e4a565b91506040840135615db481615e4a565b5f805f80608085870312156164f9575f80fd5b843561650481615b8b565b9350602085013561651481615b8b565b93969395505050506040820135916060013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561101657611016616529565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561658657616586616550565b60405290565b60405160e081016001600160401b038111828210171561658657616586616550565b604051601f8201601f191681016001600160401b03811182821017156165d6576165d6616550565b604052919050565b5f60a08284031280156165ef575f80fd5b506165f8616564565b823561660381615b8b565b8152602083013561661381615b8b565b6020820152604083013561662681615fc3565b6040820152606083013561663981615e4a565b6060820152608083013561664c81615b8b565b60808201529392505050565b6001600160401b03818116838216019081111561101657611016616529565b6001600160801b03818116838216019081111561101657611016616529565b5f60608284031280156166a7575f80fd5b50604051606081016001600160401b03811182821017156166ca576166ca616550565b60405282356166d881615d17565b81526020838101359082015260408301356166f281615b8b565b60408201529392505050565b5f6020828403121561670e575f80fd5b81516110a581615d17565b6001600160801b03828116828216039081111561101657611016616529565b634e487b7160e01b5f52603260045260245ffd5b64ffffffffff818116838216019081111561101657611016616529565b5f600160ff1b820161677d5761677d616529565b505f0390565b5f60208284031215616793575f80fd5b81356110a581615fc3565b8181038181111561101657611016616529565b5f80858511156167bf575f80fd5b838611156167cb575f80fd5b5050820193919092039150565b80356001600160e01b03198116906004841015615fbc576001600160e01b031960049490940360031b84901b1690921692915050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8161685b5761685b616529565b505f190190565b5f6001820161687357616873616529565b5060010190565b61ffff828116828216039081111561101657611016616529565b808202811582820484141761101657611016616529565b634e487b7160e01b5f52601260045260245ffd5b5f826168d957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b038211156168f6576168f6616550565b50601f01601f191660200190565b5f8060408385031215616915575f80fd5b823560028110616923575f80fd5b915060208301356001600160401b0381111561693d575f80fd5b8301601f8101851361694d575f80fd5b803561696061695b826168de565b6165ae565b818152866020838501011115616974575f80fd5b816020840160208301375f602083830101528093505050509250929050565b634e487b7160e01b5f52602160045260245ffd5b8051615c7381615b8b565b5f60a08284031280156169c3575f80fd5b506169cc616564565b82516169d781615b8b565b815260208301516169e781615b8b565b60208201526040838101519082015260608084015190820152608083015161664c81615b8b565b5f60208284031215616a1e575f80fd5b81516110a581615b8b565b5f61016082019050616a3c828451615dbf565b602083015160020b60a0830152604083015160020b60c0830152606083015160e083015260018060a01b036080840151166101008301526001600160801b0360a08401511661012083015260c0830151615fbc6101408401826001600160801b03169052565b5f60028410616abf57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152612ee7604083018461636c565b5f60208284031215616ae6575f80fd5b81516001600160401b03811115616afb575f80fd5b8201601f81018413616b0b575f80fd5b8051616b1961695b826168de565b818152856020838501011115616b2d575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b8051615c7381615e4a565b8051615c7381615e58565b5f81830361016081128015616b73575f80fd5b50616b7c61658c565b60a0821215616b89575f80fd5b616b91616564565b91508351616b9e81615b8b565b82526020840151616bae81615b8b565b60208301526040840151616bc181615fc3565b60408301526060840151616bd481615e4a565b60608301526080840151616be781615b8b565b6080830152818152616bfb60a08501616b4a565b6020820152616c0c60c08501616b4a565b604082015260e0840151606082018190529150616c2c61010085016169a7565b6080820152616c3e6101208501616b55565b60a0820152616c506101408501616b55565b60c0820152949350505050565b616c678184615dbf565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f8060408385031215616cbf575f80fd5b505080516020909101519092909150565b5f60208284031215616ce0575f80fd5b81516001600160401b03811115616cf5575f80fd5b8201601f81018413616d05575f80fd5b80516001600160401b03811115616d1e57616d1e616550565b8060051b616d2e602082016165ae565b91825260208184018101929081019087841115616d49575f80fd5b6020850194505b83851015616d6f57845180835260209586019590935090910190616d50565b979650505050505050565b5f60208284031215616d8a575f80fd5b5051919050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff1981126f7fffffffffffffffffffffffffffffff821317156110165761101661652956fe1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac7288599b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081a000a","sourceMap":"3553:4264:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5952:10;-1:-1:-1;;;;;5974:11:41;5952:34;;5948:70;;5995:23;;-1:-1:-1;;;5995:23:41;;;;;;;;;;;5948:70;3553:4264;;;;;792:81:16;;;;;;;;;;-1:-1:-1;792:81:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;668:25:46;;;656:2;641:18;792:81:16;;;;;;;;2663:241;;;;;;;;;;-1:-1:-1;2663:241:16;;;;;:::i;:::-;;:::i;:::-;;;1160:14:46;;1153:22;1135:41;;1123:2;1108:18;2663:241:16;995:187:46;39200:740:43;;;;;;;;;;-1:-1:-1;39200:740:43;;;;;:::i;:::-;;:::i;14234:856::-;;;;;;;;;;-1:-1:-1;14234:856:43;;;;;:::i;:::-;;:::i;53463:196::-;;;;;;;;;;-1:-1:-1;53463:196:43;;;;;:::i;:::-;;:::i;:::-;;;3400:6:46;3388:19;;;3370:38;;3358:2;3343:18;53463:196:43;3226:188:46;18678:342:43;;;;;;;;;;-1:-1:-1;18678:342:43;;;;;:::i;:::-;;:::i;6119:241:42:-;;;;;;;;;;-1:-1:-1;6119:241:42;;;;;:::i;:::-;;:::i;:::-;;;4340:8:46;4328:21;;;4310:40;;4298:2;4283:18;6119:241:42;4166:190:46;10438:62:43;;;;;;;;;;-1:-1:-1;10438:62:43;;;;;:::i;:::-;;;;;;;;;;;;;;15270:792;;;;;;;;;;-1:-1:-1;15270:792:43;;;;;:::i;:::-;;:::i;11721:299::-;;;;;;;;;;-1:-1:-1;11721:299:43;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11818:15:43;11906:14;;;:10;:14;;;;;;;;;11954:20;;;;11930:83;;;;;;;;;-1:-1:-1;;;;;11930:83:43;;;;;11954:20;11930:83;;;;;;;;;;;;;-1:-1:-1;;;11930:83:43;;;;;;;;;;;-1:-1:-1;;;11930:83:43;;;11954:20;11930:83;;;;;;;;;;;;;;;;;;;;11954:20;;;;11976;;;;;;;-1:-1:-1;;;11998:14:43;;;;;11721:299;;;;;;;;;;;:::i;22828:2887::-;;;;;;:::i;:::-;;:::i;2127:40:42:-;;;;;;;;;;;;;;;5135:28:41;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7874:32:46;;;7856:51;;7844:2;7829:18;5135:28:41;7695:218:46;6592:24:43;;;;;;;;;;-1:-1:-1;6592:24:43;;;;-1:-1:-1;;;;;6592:24:43;;;13888:109;;;;;;;;;;-1:-1:-1;13888:109:43;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13979:11:43;;;;:7;:11;;;;;;;;;13972:18;;;;;;;;;-1:-1:-1;;;;;13972:18:43;;;;;-1:-1:-1;;;13972:18:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13972:18:43;;;;;;;-1:-1:-1;;;13972:18:43;;;;;;;;;13888:109;;;;;;;;:::i;2013:231:16:-;;;;;;;;;;-1:-1:-1;2013:231:16;;;;;:::i;:::-;;:::i;3298:471:40:-;;;;;;;;;;-1:-1:-1;3298:471:40;;;;;:::i;:::-;;:::i;30875:2536:43:-;;;;;;;;;;-1:-1:-1;30875:2536:43;;;;;:::i;:::-;;:::i;14003:138::-;;;;;;;;;;-1:-1:-1;14003:138:43;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17789:228::-;;;;;;;;;;-1:-1:-1;17789:228:43;;;;;:::i;:::-;;:::i;2250:225:16:-;;;;;;;;;;-1:-1:-1;2250:225:16;;;;;:::i;:::-;;:::i;5539:395:42:-;;;;;;;;;;-1:-1:-1;5539:395:42;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;14073:33:46;;;14055:52;;14138:2;14123:18;;14116:34;;;;14198:8;14186:21;14166:18;;;14159:49;14043:2;14028:18;5539:395:42;13822:392:46;880:108:16;;;;;;;;;;-1:-1:-1;880:108:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9460:218:43;;;;;;;;;;-1:-1:-1;9642:11:43;;9656:15;-1:-1:-1;9460:218:43;;33502:3026;;;;;;;;;;-1:-1:-1;33502:3026:43;;;;;:::i;:::-;;:::i;2961:55:42:-;;;;;;;;;;-1:-1:-1;2961:55:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;7808:126;;;;;;;;;;-1:-1:-1;7808:126:42;;;;;:::i;:::-;;:::i;1894:46::-;;;;;;;;;;;;1932:8;1894:46;;;;;15820:12:46;15808:25;;;15790:44;;15778:2;15763:18;1894:46:42;15646:194:46;10198:65:43;;;;;;;;;;-1:-1:-1;10198:65:43;;;;;:::i;:::-;;;;;;;;;;;;;;53719:112;;;;;;;;;;-1:-1:-1;53801:16:43;:23;53719:112;;6270:25;;;;;;;;;;-1:-1:-1;6270:25:43;;;;;;;;3012:362:0;;;;;;;;;;-1:-1:-1;3012:362:0;;;;;:::i;:::-;;:::i;6301:32:43:-;;;;;;;;;;-1:-1:-1;6301:32:43;;;;;;;-1:-1:-1;;;;;6301:32:43;;;2632:51:42;;;;;;;;;;;;2679:4;2632:51;;46697:1240:43;;;;;;;;;;-1:-1:-1;46697:1240:43;;;;;:::i;:::-;;:::i;7222:499:42:-;;;;;;;;;;-1:-1:-1;7222:499:42;;;;;:::i;:::-;;:::i;3415:156:0:-;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;;17408:33:46;;;17390:52;;17378:2;17363:18;3415:156:0;17246:202:46;42697:531:43;;;;;;;;;;-1:-1:-1;42697:531:43;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;13517:365::-;;;;;;;;;;-1:-1:-1;13517:365:43;;;;;:::i;:::-;;:::i;:::-;;;;18556:25:46;;;18612:2;18597:18;;18590:34;;;;18529:18;13517:365:43;18382:248:46;3093:49:42;;;;;;;;;;-1:-1:-1;3093:49:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18835:8:46;18823:21;;;18805:40;;18893:12;18881:25;;;18876:2;18861:18;;18854:53;18778:18;3093:49:42;18635:278:46;10869:100:43;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;3375:11:14;10869:100:43;3415:156:0;9362:42:43;;;;;;;;;;;;9398:6;9362:42;;8303:65;;;;;;;;;;-1:-1:-1;8303:65:43;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;8303:65:43;;;;;;-1:-1:-1;;;;;19080:31:46;;;19062:50;;19050:2;19035:18;8303:65:43;18918:200:46;7667:32:43;;;;;;;;;;-1:-1:-1;7667:32:43;;;;;;;;28400:2140;;;;;;;;;;-1:-1:-1;28400:2140:43;;;;;:::i;:::-;;:::i;2776:41:42:-;;;;;;;;;;;;2814:3;2776:41;;55042:119:43;;;;;;;;;;-1:-1:-1;55042:119:43;;;;;:::i;:::-;;:::i;48753:1651::-;;;;;;;;;;-1:-1:-1;48753:1651:43;;;;;:::i;:::-;;:::i;2303:50:42:-;;;;;;;;;;-1:-1:-1;2303:50:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;697:88:16;;;;;;;;;;-1:-1:-1;697:88:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;38060:125:43;;;;;;;;;;-1:-1:-1;38060:125:43;;;;;:::i;:::-;;:::i;2878:93:0:-;;;;;;;;;;-1:-1:-1;2928:7:0;2954:10;-1:-1:-1;;;;;2954:10:0;2878:93;;6467:28:43;;;;;;;;;;-1:-1:-1;6467:28:43;;;;-1:-1:-1;;;;;6467:28:43;;;6339:26;;;;;;;;;;-1:-1:-1;6339:26:43;;;;-1:-1:-1;;;;;6339:26:43;;;16935:757;;;;;;;;;;-1:-1:-1;16935:757:43;;;;;:::i;:::-;;:::i;2897:104:40:-;;;;;;;;;;-1:-1:-1;2897:104:40;;;;;:::i;:::-;2952:6;2977:17;;;:9;:17;;;;;;;;;2897:104;54112:116:43;;;;;;;;;;-1:-1:-1;54112:116:43;;;;;:::i;:::-;;:::i;9125:26::-;;;;;;;;;;;;;;;;37039:922;;;;;;;;;;-1:-1:-1;37039:922:43;;;;;:::i;:::-;;:::i;2174:41:42:-;;;;;;;;;;;;;;;4576:879;;;;;;;;;;-1:-1:-1;4576:879:42;;;;;:::i;:::-;;:::i;10975:180:43:-;;;;;;;;;;-1:-1:-1;10975:180:43;;;;;:::i;:::-;;:::i;9244:25::-;;;;;;;;;;-1:-1:-1;9244:25:43;;;;-1:-1:-1;;;;;9244:25:43;;;53884:134;;;;;;;;;;-1:-1:-1;53884:134:43;;;;;:::i;:::-;;:::i;:::-;;;;22233:13:46;;-1:-1:-1;;;;;22229:38:46;22211:57;;22328:4;22316:17;;;22310:24;22336:6;22306:37;22284:20;;;22277:67;;;;22184:18;53884:134:43;22001:349:46;5312:47:43;;;;;;;;;;;;5355:4;5312:47;;5835;;;;;;;;;;;;5880:2;5835:47;;39946:764;;;;;;;;;;-1:-1:-1;39946:764:43;;;;;:::i;:::-;;:::i;2663:241:16:-;2739:4;-1:-1:-1;;;;;;;;;2762:25:16;;;;:100;;-1:-1:-1;;;;;;;;;;2837:25:16;;;2762:100;2755:107;2663:241;-1:-1:-1;;2663:241:16:o;39200:740:43:-;39356:4;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;39643:6:::2;39653:1;39643:11:::0;39639:36:::2;;39663:12;;-1:-1:-1::0;;;39663:12:43::2;;;;;;;;;;;39639:36;39685:42;39704:10;39716:2;39720:6;39685:18;:42::i;:::-;39737:14;39748:2;39737:10;:14::i;:::-;39818:27;39830:2;39834:10;39818:11;:27::i;:::-;39855:25;39867:2;39871:8;39855:11;:25::i;:::-;39897:36;39912:8;39922:2;39926:6;39897:14;:36::i;:::-;39890:43;;1281:20:13::0;:18;:20::i;:::-;39200:740:43;;;;;:::o;14234:856::-;2780:39:0;735:10:12;2794:12:0;809:14:12;;2780:13:0;:39::i;:::-;1239:21:13::1;:19;:21::i;:::-;14390:25:43::2;14403:11;;14390:12;:25::i;:::-;14943:11;::::0;14956:18:::2;::::0;14884:91:::2;::::0;14909:16:::2;::::0;14927:3;;14932:9;;-1:-1:-1;;;;;14943:11:43;;::::2;::::0;14956:18:::2;;14884:24;:91::i;:::-;14863:18;:112:::0;;-1:-1:-1;;14863:112:43::2;;::::0;;::::2;;::::0;;14985:11:::2;:17:::0;;;;::::2;-1:-1:-1::0;;;;;;15012:29:43;;;;;;-1:-1:-1;;;;;15012:29:43;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;15056:27:::2;::::0;;23161:38:46;;;23230:2;23215:18;;23208:60;;;;15056:27:43::2;::::0;23134:18:46;15056:27:43::2;;;;;;;1281:20:13::1;:18;:20::i;:::-;14234:856:43::0;;;;:::o;53463:196::-;53601:17;;53633:18;;53524:6;;53549:103;;53571:16;;53589:10;;-1:-1:-1;;;;;53601:17:43;;;;;53620:11;;;;;53633:18;53549:21;:103::i;18678:342::-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;18745:13:43;;;:37:::1;;;9398:6;18762:8;:20;18745:37;18741:64;;;18791:14;;-1:-1:-1::0;;;18791:14:43::1;;;;;;;;;;;18741:64;18815:14;18832:26;18850:8:::0;18832:15:::1;:26;:::i;:::-;18815:43;;18882:11;;18872:6;:21;18868:48;;18902:14;;-1:-1:-1::0;;;18902:14:43::1;;;;;;;;;;;18868:48;18961:11;:20:::0;;;18996:17:::1;::::0;668:25:46;;;18996:17:43::1;::::0;656:2:46;641:18;18996:17:43::1;;;;;;;18731:289;18678:342:::0;:::o;6119:241:42:-;6194:6;6219:134;6244:6;6252:91;;;;;;;;6289:10;6252:91;;;;;;6318:1;6252:91;;;;6340:1;-1:-1:-1;;;;;6252:91:42;;;;6219:11;:134::i;15270:792:43:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;1239:21:13::1;:19;:21::i;:::-;15382:25:43::2;15395:11;;15382:12;:25::i;:::-;15938:11;::::0;-1:-1:-1;;;;;15930:19:43;;::::2;15938:11:::0;::::2;15930:19;::::0;:44:::2;;-1:-1:-1::0;;;;;;15953:21:43;::::2;15969:4;15953:21;15930:44;15926:70;;;15983:13;;-1:-1:-1::0;;;15983:13:43::2;;;;;;;;;;;15926:70;16006:9;:16:::0;;-1:-1:-1;;;;;;16006:16:43::2;-1:-1:-1::0;;;;;16006:16:43;::::2;::::0;;::::2;::::0;;;16037:18:::2;::::0;7856:51:46;;;16037:18:43::2;::::0;7844:2:46;7829:18;16037::43::2;;;;;;;;1281:20:13::1;:18;:20::i;:::-;15270:792:43::0;;;:::o;22828:2887::-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;23098:9:::2;-1:-1:-1::0;;;;;23098:14:43::2;23111:1;23098:14:::0;23094:42:::2;;23121:15;;-1:-1:-1::0;;;23121:15:43::2;;;;;;;;;;;23094:42;23226:8;23208:15;:26;23204:56;;;23243:17;;-1:-1:-1::0;;;23243:17:43::2;;;;;;;;;;;23204:56;23270:14;23280:3;23270:9;:14::i;:::-;23298:29;:13;;::::0;::::2;:3:::0;:13:::2;:::i;:::-;-1:-1:-1::0;;;;;23298:27:43::2;4998:58:37::0;;4910:153;23298:29:43::2;23294:187;;;23359:10;-1:-1:-1::0;;;;;23347:22:43::2;:9;:22;23343:52;;;23378:17;;-1:-1:-1::0;;;23378:17:43::2;;;;;;;;;;;23343:52;23294:187;;;23416:9;:14:::0;23412:69:::2;;23453:17;;-1:-1:-1::0;;;23453:17:43::2;;;;;;;;;;;23412:69;23491:10;23504:41;23512:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;:::-;515:4:38::0;496:24;;;271:265;23512:10:43::2;23524:9;23535;23504:7;:41::i;:::-;23560:14;::::0;;;:10:::2;:14;::::0;;;;:18:::2;;::::0;:14;;-1:-1:-1;;;;23560:18:43;::::2;;;23555:142;;23611:75;;;;;;;;23626:3;23611:75;;;;;;;;;;:::i;:::-;::::0;;::::2;::::0;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;23680:4:::2;23611:75:::0;;;;;;;-1:-1:-1;23594:14:43;;;:10:::2;:14:::0;;;;;:92;;;;;;-1:-1:-1;;;;;;23594:92:43;;::::2;-1:-1:-1::0;;;;;23594:92:43;;::::2;;::::0;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;-1:-1:-1::0;;;;;;23594:92:43;;;;;;;-1:-1:-1;;;23594:92:43::2;::::0;;::::2;;;-1:-1:-1::0;;;;23594:92:43::2;-1:-1:-1::0;;;23594:92:43;;;;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;;;-1:-1:-1;;23594:92:43;;;;;;;;;;;;::::2;::::0;;;::::2;-1:-1:-1::0;;23594:92:43::2;-1:-1:-1::0;;;23594:92:43;::::2;;::::0;;;::::2;::::0;;;::::2;::::0;;23555:142:::2;24070:14;24081:2;24070:10;:14::i;:::-;24094:27;24106:2;24110:10;24094:11;:27::i;:::-;24368:14;24385:11:::0;;;:7:::2;:11;::::0;;;;:23;-1:-1:-1;;;;;24385:23:43::2;:28:::0;24423:40;::::2;;;24438:11;::::0;;;:7:::2;:11;::::0;;;;:20:::2;;:25:::0;;24462:1:::2;::::0;24438:20;::::2;::::0;:25:::2;::::0;24462:1;;-1:-1:-1;;;24438:25:43;::::2;-1:-1:-1::0;;;;;24438:25:43::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;24438:25:43::2;;;;;-1:-1:-1::0;;;;;24438:25:43::2;;;;;;24423:40;24473:11;::::0;;;:7:::2;:11;::::0;;;;:36;;24500:9;;24473:11;:36:::2;::::0;24500:9;;-1:-1:-1;;;;;24473:36:43::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;24473:36:43::2;;;;;-1:-1:-1::0;;;;;24473:36:43::2;;;;;;24519:32;24525:10;24537:2;24541:9;-1:-1:-1::0;;;;;24519:32:43::2;:5;:32::i;:::-;24561:98;24569:3;24574:9;24585;24611;-1:-1:-1::0;;;;;24603:18:43::2;24624:10;24636;24648;24561:7;:98::i;:::-;25179:9;25175:81;;;25190:66;25219:7;25228:10;25240:11;25253:2;25190:28;:66::i;:::-;25271:36;::::0;-1:-1:-1;;;;;26018:47:46;;26000:66;;25293:2:43;;25281:10:::2;::::0;25271:36:::2;::::0;25988:2:46;25973:18;25271:36:43::2;;;;;;;25662:29;:13;;::::0;::::2;:3:::0;:13:::2;:::i;:29::-;25658:50;;;25693:15;:13;:15::i;:::-;23084:2631;;1281:20:13::0;:18;:20::i;:::-;22828:2887:43;;;;;;;:::o;2013:231:16:-;2125:10;2099:4;2115:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;2115:30:16;;;;;;;;;;;:34;;;;;;;;;:43;;;2174:41;2099:4;;2146:2;;2174:41;;;;2152:6;668:25:46;;656:2;641:18;;522:177;2174:41:16;;;;;;;;-1:-1:-1;2233:4:16;2013:231;;;;;:::o;3298:471:40:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;3435:9:40::1;3424:20;;:8;:20;;;:38;;;;3459:3;3448:14;;:8;:14;;;3424:38;3420:66;;;3471:15;;-1:-1:-1::0;;;3471:15:40::1;;;;;;;;;;;3420:66;3496:13;3512:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;3532:17;::::0;;;:9:::1;:17;::::0;;;;:28;;-1:-1:-1;;3532:28:40::1;;::::0;::::1;;::::0;;:17;-1:-1:-1;3661:38:40::1;3532:17:::0;3684:9;3695:3;3661:14:::1;:38::i;:::-;3714:48;::::0;;26303:8:46;26291:21;;;26273:40;;26349:21;;;26344:2;26329:18;;26322:49;26407:21;;26387:18;;;26380:49;;;;3729:6:40;;3714:48:::1;::::0;26261:2:46;26246:18;3714:48:40::1;;;;;;;;3410:359;3298:471:::0;;;;:::o;30875:2536:43:-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;31964:14:::2;31974:3;31964:9;:14::i;:::-;31988:10;32001:41;32009:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;:10::-;32021:9;32032;32001:7;:41::i;:::-;31988:54;;32081:9;32056:34;;:22;32075:2;32056:18;:22::i;:::-;:34;;;32052:65;;;32099:18;;-1:-1:-1::0;;;32099:18:43::2;;;;;;;;;;;32052:65;32583:29;32615:14:::0;;;:10:::2;:14;::::0;;;;;;;32630:10:::2;32615:26:::0;;;;;;;32655:9:::2;:21:::0;;;;;:25;;;;;;;;;;:30;:53;::::2;;;-1:-1:-1::0;32689:14:43;;-1:-1:-1;;;32689:14:43;::::2;-1:-1:-1::0;;;;;32689:14:43::2;:19:::0;32655:53:::2;:76;;;;-1:-1:-1::0;32712:14:43::2;::::0;::::2;::::0;-1:-1:-1;;;;;32712:14:43::2;:19:::0;32655:76:::2;32651:130;;;32754:16;;-1:-1:-1::0;;;32754:16:43::2;;;;;;;;;;;32651:130;32790:14;32801:2;32790:10;:14::i;:::-;32814:27;32826:2;32830:10;32814:11;:27::i;:::-;32852:29;32884:14:::0;;;:10:::2;:14;::::0;;;;;;;32899:10:::2;32884:26:::0;;;;;;;32958:14;;32974::::2;::::0;::::2;::::0;-1:-1:-1;;;;;;;;32958:14:43;;::::2;::::0;::::2;::::0;32974::::2;33003:12:::0;;:28;::::2;;;-1:-1:-1::0;33019:12:43;;33003:28:::2;32999:41;;;33033:7;;;;;;;32999:41;33066:14;::::0;::::2;33049:41:::0;;-1:-1:-1;;;;;;33049:41:43::2;::::0;;;;-1:-1:-1;;;;;33049:41:43::2;::::0;;33285:59:::2;33293:13;;::::0;::::2;:3:::0;:13:::2;:::i;:::-;33308;::::0;;;::::2;::::0;::::2;;:::i;:::-;33323:7;33332;33341:2;33285:7;:59::i;:::-;33359:45;::::0;;18556:25:46;;;18612:2;18597:18;;18590:34;;;33383:2:43;;33371:10:::2;::::0;33359:45:::2;::::0;18529:18:46;33359:45:43::2;;;;;;;31044:2367;;;;;9764:1;1281:20:13::0;:18;:20::i;:::-;30875:2536:43;;;;;:::o;14003:138::-;14075:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14075:19:43;-1:-1:-1;14113:14:43;;;;:10;:14;;;;;;;;-1:-1:-1;;;;;14113:21:43;;;;;;;;;;;;;14106:28;;;;;;;;;-1:-1:-1;;;;;14106:28:43;;;;;-1:-1:-1;;;14106:28:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14003:138::o;17789:228::-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;9398:6:43::1;17860:8;:20;17856:47;;;17889:14;;-1:-1:-1::0;;;17889:14:43::1;;;;;;;;;;;17856:47;17927:13:::0;;:46:::1;;17947:26;17965:8:::0;17947:15:::1;:26;:::i;:::-;17927:46;;;17943:1;17927:46;17913:11;:60:::0;;;17988:22:::1;::::0;668:25:46;;;17988:22:43::1;::::0;656:2:46;641:18;17988:22:43::1;;;;;;;;17789:228:::0;:::o;2250:225:16:-;2355:10;2328:4;2344:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;2344:32:16;;;;;;;;;;;:43;;-1:-1:-1;;2344:43:16;;;;;;;;;;2403;;1135:41:46;;;2328:4:16;;2355:10;2403:43;;1108:18:46;2403:43:16;;;;;;;-1:-1:-1;2464:4:16;2250:225;;;;:::o;5539:395:42:-;5718:6;;;3190:10;-1:-1:-1;;;;;3212:11:42;3190:34;;3186:63;;3233:16;;-1:-1:-1;;;3233:16:42;;;;;;;;;;;3186:63;5765:10:::1;5778:31;5790:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;5778:31;;::::0;;::::1;::::0;::::1;5802:6:::0;5778:31:::1;:::i;:::-;:11;:31::i;:::-;-1:-1:-1::0;;;5827:26:42;-1:-1:-1;830:1:36::1;::::0;-1:-1:-1;819:8:29::1;5890:36:42;::::0;-1:-1:-1;;5539:395:42;;;;;;;;;:::o;33502:3026:43:-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;33667:6:::2;-1:-1:-1::0;;;;;33667:11:43::2;33677:1;33667:11:::0;33663:36:::2;;33687:12;;-1:-1:-1::0;;;33687:12:43::2;;;;;;;;;;;33663:36;33709:14;33719:3;33709:9;:14::i;:::-;35924:10;::::0;-1:-1:-1;;;;;35924:10:43::2;35948:18:::0;;;:67:::2;;-1:-1:-1::0;;;;;;35971:32:43;::::2;;36004:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;:10::-;35971:44;;;;;;;;;;;;;668:25:46::0;;656:2;641:18;;522:177;35971:44:43::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35970:45;35948:67;35944:93;;;36024:13;;-1:-1:-1::0;;;36024:13:43::2;;;;;;;;;;;35944:93;36047:10;36060:41;36068:10;:8;;::::0;;::::2;::::0;::::2;:3:::0;:8:::2;:::i;36060:41::-;36047:54;;36111:14;36122:2;36111:10;:14::i;:::-;36191:27;36203:2;36207:10;36191:11;:27::i;:::-;36228:29;36260:14:::0;;;:10:::2;:14;::::0;;;;;;;36275:10:::2;36260:26:::0;;;;;;;36337:15;;36308:9:::2;:21:::0;;;;;:25;;;;;;;;;-1:-1:-1;;;;;36300:61:43;;::::2;::::0;:52:::2;::::0;36337:15;::::2;::::0;36300:52:::2;:::i;:::-;-1:-1:-1::0;;;;;36300:61:43::2;;36296:102;;;36370:28;;-1:-1:-1::0;;;36370:28:43::2;;;;;;;;;;;36296:102;36408:25:::0;;36427:6;;36408:8;;:15:::2;::::0;:25:::2;::::0;36427:6;;-1:-1:-1;;;;;36408:25:43::2;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;36408:25:43::2;;;;;-1:-1:-1::0;;;;;36408:25:43::2;;;;;;36470:6;36443:7;:11;36451:2;36443:11;;;;;;;;;;;:23;;;:33;;;;;;;;;;-1:-1:-1::0;;;;;36443:33:43::2;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;36443:33:43::2;;;;;-1:-1:-1::0;;;;;36443:33:43::2;;;;;;36510:2;36498:10;-1:-1:-1::0;;;;;36491:30:43::2;;36514:6;36491:30;;;;;-1:-1:-1::0;;;;;26018:47:46;;;;26000:66;;25988:2;25973:18;;25854:218;36491:30:43::2;;;;;;;;33653:2875;;;1281:20:13::0;:18;:20::i;7808:126:42:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;7879:14:42::1;::::0;;;:6:::1;:14;::::0;;;;;7872:21;;-1:-1:-1;;7872:21:42;;;7908:19;7886:6;;7908:19:::1;::::0;::::1;7808:126:::0;:::o;3012:362:0:-;3081:14;2954:10;735::12;;-1:-1:-1;;;;;2954:10:0;3124:21;;3120:92;;3168:33;;-1:-1:-1;;;3168:33:0;;-1:-1:-1;;;;;7874:32:46;;3168:33:0;;;7856:51:46;7829:18;;3168:33:0;;;;;;;;3120:92;3225:12;-1:-1:-1;;;;;3225:24:0;;3253:1;3225:29;3221:110;;3277:43;;-1:-1:-1;;;3277:43:0;;-1:-1:-1;;;;;7874:32:46;;3277:43:0;;;7856:51:46;7829:18;;3277:43:0;7695:218:46;3221:110:0;3340:27;3354:12;3340:13;:27::i;:::-;3071:303;3012:362;:::o;46697:1240:43:-;1239:21:13;:19;:21::i;:::-;46805:10:43::1;::::0;-1:-1:-1;;;;;46805:10:43::1;::::0;46825:48:::1;;46856:17;;-1:-1:-1::0;;;46856:17:43::1;;;;;;;;;;;46825:48;46888:9;46883:1048;46903:14:::0;;::::1;46883:1048;;;46938:10;46951:3;;46955:1;46951:6;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;47063:11;::::0;;;:7:::1;:11:::0;;;;;;:23;46951:6;;-1:-1:-1;;;;47063:23:43;::::1;-1:-1:-1::0;;;;;47063:23:43::1;:28:::0;;;;-1:-1:-1;47059:42:43::1;;47093:8;;;47059:42;47804:14;::::0;;;:10:::1;:14;::::0;;;;;;;;:23;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;47804:23:43;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;47804:23:43;::::1;;::::0;;;;-1:-1:-1;;;47804:23:43;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;496:24:38;;47753:77:43;;-1:-1:-1;;;47753:77:43;;47783:10:::1;47753:77;::::0;::::1;28280:51:46::0;28347:18;;;28340:34;;;28390:18;;;28383:34;;;;47753:77:43;;:29;;::::1;::::0;::::1;::::0;28253:18:46;;;;;47804:14:43;;47753:77;;;;;:29;:77:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47748:145;;47857:21;;-1:-1:-1::0;;;47857:21:43::1;;;;;;;;;;;47748:145;47906:14;47917:2;47906:10;:14::i;:::-;46924:1007;46883:1048;46919:3;;46883:1048;;;;46780:1157;1281:20:13::0;:18;:20::i;7222:499:42:-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;7308:10:42::1;7321:14:::0;;;:6:::1;:14;::::0;;;;;::::1;;::::0;7349:8;;;7345:40:::1;;7366:19;;-1:-1:-1::0;;;7366:19:42::1;;;;;;;;;;;7345:40;7405:3;7399:9;;:3;:9;;;7395:35;;;7417:13;;-1:-1:-1::0;;;7417:13:42::1;;;;;;;;;;;7395:35;7450:17;::::0;;;:9:::1;:17;::::0;;;;;::::1;::::0;;::::1;7444:23:::0;;::::1;;7440:51;;;7476:15;;-1:-1:-1::0;;;7476:15:42::1;;;;;;;;;;;7440:51;7505:8;::::0;::::1;::::0;;:30:::1;;-1:-1:-1::0;1932:8:42::1;7517:18;::::0;::::1;;7505:30;7501:55;;;7544:12;;-1:-1:-1::0;;;7544:12:42::1;;;;;;;;;;;7501:55;7566:13;7582:29;7608:3:::0;7589:15:::1;7582:29;:::i;:::-;7638:32;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;7621:14:42;;;:6:::1;:14:::0;;;;;:49;;;;;;;;::::1;::::0;::::1;-1:-1:-1::0;;7621:49:42;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;7685:29;;18805:40:46;;;18861:18;;;18854:53;7638:32:42;;-1:-1:-1;7621:14:42;;7685:29:::1;::::0;18778:18:46;7685:29:42::1;18635:278:46::0;3415:156:0;3470:6;3495:18;;-1:-1:-1;;;3495:18:0;;;;:69;;-1:-1:-1;3562:1:0;;3415:156::o;3495:69::-;-1:-1:-1;;;;3516:36:0;3415:156::o;42697:531:43:-;42763:12;42791:10;-1:-1:-1;;;;;42813:11:43;42791:34;;42787:63;;42834:16;;-1:-1:-1;;;42834:16:43;;;;;;;;;;;42787:63;43085:105;;;;;;;;43115:11;;;;;;43085:105;;43140:18;;;43085:105;;;;43171:17;;;-1:-1:-1;;;;;43171:17:43;43085:105;;;;;;;42867:354;;42899:7;;42920:10;;42944:15;;42973:12;;42999:17;;43030:16;;43060:11;;43204:7;;42867:18;:354::i;13517:365::-;13573:15;13647:14;;;:10;:14;;;;;13676;;;;13573:15;;13647:14;-1:-1:-1;;;13676:14:43;;;;13671:34;;-1:-1:-1;13700:1:43;;;;-1:-1:-1;13517:365:43;-1:-1:-1;;13517:365:43:o;13671:34::-;13796:19;;;;;;;;;;;-1:-1:-1;;;;;13796:19:43;;;;;;;;;;;;;;;;-1:-1:-1;;;13796:19:43;;;;;;;;;;;-1:-1:-1;;;13796:19:43;;;;;;;;;;;;;;;;;;;;;496:24:38;13734:141:43;;13783:11;;13819:20;;;;;;;;;13841;;;;;13734:31;:141::i;:::-;13715:160;;;;;13517:365;;;:::o;28400:2140::-;1239:21:13;:19;:21::i;:::-;28669:9:43::1;-1:-1:-1::0;;;;;28669:14:43::1;28682:1;28669:14:::0;28665:42:::1;;28692:15;;-1:-1:-1::0;;;28692:15:43::1;;;;;;;;;;;28665:42;-1:-1:-1::0;;;;;28721:16:43;::::1;28717:42;;28746:13;;-1:-1:-1::0;;;28746:13:43::1;;;;;;;;;;;28717:42;28849:8;28831:15;:26;28827:56;;;28866:17;;-1:-1:-1::0;;;28866:17:43::1;;;;;;;;;;;28827:56;28893:14;28903:3;28893:9;:14::i;:::-;28917:10;28930:41;28938:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;28950:9;28961;28930:7;:41::i;:::-;28917:54;;28982:14;28993:2;28982:10;:14::i;:::-;29006:27;29018:2;29022:10;29006:11;:27::i;:::-;29044:29;29076:14:::0;;;:10:::1;:14;::::0;;;;;;;29091:10:::1;29076:26:::0;;;;;;;29313:15;;29284:9:::1;:21:::0;;;;;:25;;;;;;;;;;29076:26;;29044:29;29276:52:::1;::::0;-1:-1:-1;;;;;29313:15:43;;::::1;::::0;29276:52:::1;:::i;:::-;29257:71;;29353:9;-1:-1:-1::0;;;;;29342:20:43::1;:8;-1:-1:-1::0;;;;;29342:20:43::1;;29338:290;;;29378:18;29399:20;29411:8:::0;29399:9;:20:::1;:::i;:::-;29433:29:::0;;29378:41;;-1:-1:-1;29378:41:43;;29433:8;;:15:::1;::::0;:29:::1;::::0;29378:41;;-1:-1:-1;;;;;29433:29:43::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;29433:29:43::1;;;;;-1:-1:-1::0;;;;;29433:29:43::1;;;;;;29552:10;29525:7;:11;29533:2;29525:11;;;;;;;;;;;:23;;;:37;;;;;;;;;;-1:-1:-1::0;;;;;29525:37:43::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;29525:37:43::1;;;;;-1:-1:-1::0;;;;;29525:37:43::1;;;;;;29602:2;29590:10;-1:-1:-1::0;;;;;29581:36:43::1;;29606:10;29581:36;;;;;-1:-1:-1::0;;;;;26018:47:46;;;;26000:66;;25988:2;25973:18;;25854:218;29581:36:43::1;;;;;;;;29364:264;29338:290;29637:32;29643:10;29655:2;29659:9;-1:-1:-1::0;;;;;29637:32:43::1;:5;:32::i;:::-;29679:11;::::0;;;:7:::1;:11;::::0;;;;:36;;29706:9;;29679:11;:36:::1;::::0;29706:9;;-1:-1:-1;;;;;29679:36:43::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;29679:36:43;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;30326:11:43;;;:7:::1;:11;::::0;;;;:23;;;::::1;:28:::0;;;-1:-1:-1;30322:59:43::1;;30356:11;::::0;;;:7:::1;:11;::::0;;;;:20:::1;;:25:::0;;30380:1:::1;::::0;30356:20;::::1;::::0;:25:::1;::::0;30380:1;;-1:-1:-1;;;30356:25:43;::::1;-1:-1:-1::0;;;;;30356:25:43::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;30356:25:43::1;;;;;-1:-1:-1::0;;;;;30356:25:43::1;;;;;;30322:59;30391:91;30399:3:::0;30404:9;30415;30426:27:::1;-1:-1:-1::0;;;;;30434:18:43;::::1;30426:27;:::i;:::-;30455:2;30459:10;30471;30391:7;:91::i;:::-;30497:36;::::0;-1:-1:-1;;;;;26018:47:46;;26000:66;;30519:2:43;;30507:10:::1;::::0;30497:36:::1;::::0;25988:2:46;25973:18;30497:36:43::1;;;;;;;28655:1885;;;1281:20:13::0;:18;:20::i;:::-;28400:2140:43;;;;;;;;:::o;55042:119::-;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;55130:24:::2;55145:8;55130:14;:24::i;:::-;1281:20:13::0;:18;:20::i;:::-;55042:119:43;:::o;48753:1651::-;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;-1:-1:-1;;;;;48824:18:43;::::1;::::0;48820:1517:::1;;49341:4;-1:-1:-1::0;;;;;49341:16:43::1;;49361:1;49341:21:::0;49337:53:::1;;49371:19;;-1:-1:-1::0;;;49371:19:43::1;;;;;;;;;;;49337:53;49408:72;::::0;-1:-1:-1;;;49408:72:43;;49446:4:::1;49408:72;::::0;::::1;28280:51:46::0;49453:1:43::1;28347:18:46::0;;;28340:34;;;28390:18;;;28383:34;-1:-1:-1;;;;;49408:29:43;::::1;::::0;::::1;::::0;28253:18:46;;49408:72:43::1;;;;;;;;;;;;;;;;;;-1:-1:-1::0;49408:72:43::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;49408:72:43::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;49404:172;;49542:19;;-1:-1:-1::0;;;49542:19:43::1;;;;;;;;;;;49404:172;-1:-1:-1::0;50174:57:43::1;::::0;-1:-1:-1;;;50174:57:43;;50227:1:::1;50174:57;::::0;::::1;668:25:46::0;-1:-1:-1;;;;;50174:32:43;::::1;::::0;::::1;::::0;641:18:46;;50174:57:43::1;;;;;;;;;;;;;;;;;;-1:-1:-1::0;50174:57:43::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;50174:57:43::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;50170:157;;50293:19;;-1:-1:-1::0;;;50293:19:43::1;;;;;;;;;;;50170:157;50232:17;50170:157;50346:10;:17:::0;;-1:-1:-1;;;;;;50346:17:43::1;-1:-1:-1::0;;;;;50346:17:43;::::1;::::0;;::::1;::::0;;;50378:19:::1;::::0;7856:51:46;;;50378:19:43::1;::::0;7844:2:46;7829:18;50378:19:43::1;7695:218:46::0;38060:125:43;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;38151:27:::2;38169:8;38151:17;:27::i;16935:757::-:0;2780:39:0;735:10:12;2794:12:0;656:96:12;2780:39:0;1239:21:13::1;:19;:21::i;:::-;17057:25:43::2;17070:11;;17057:12;:25::i;:::-;17577:9;::::0;17588:17:::2;::::0;17533:73:::2;::::0;17563:12;;-1:-1:-1;;;;;17577:9:43;;::::2;::::0;17588:17;;;::::2;;17533:29;:73::i;:::-;17517:13;:89:::0;;-1:-1:-1;;;;;;17517:89:43;;::::2;-1:-1:-1::0;;;;;17517:89:43;;::::2;;::::0;;;17616:11:::2;:26:::0;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;17657:28:::2;::::0;7856:51:46;;;17657:28:43::2;::::0;7844:2:46;7829:18;17657:28:43::2;7695:218:46::0;54112:116:43;54174:6;54199:22;54218:2;54199:18;:22::i;37039:922::-;1239:21:13;:19;:21::i;:::-;37488:6:43::1;-1:-1:-1::0;;;;;37488:11:43::1;37498:1;37488:11:::0;37484:36:::1;;37508:12;;-1:-1:-1::0;;;37508:12:43::1;;;;;;;;;;;37484:36;37530:14;37540:3;37530:9;:14::i;:::-;37554:10;37567:41;37575:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;37587:9;37598;37567:7;:41::i;:::-;37554:54;;37618:14;37629:2;37618:10;:14::i;:::-;37710:27;37722:2;37726:10;37710:11;:27::i;:::-;37747:29;37779:14:::0;;;:10:::1;:14;::::0;;;;;;;37794:10:::1;37779:26:::0;;;;;;;37815:25;;37779:26;;37834:6;;37779:26;;37747:29;37815:25:::1;::::0;37834:6;;-1:-1:-1;;;;;37815:25:43::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;37815:25:43::1;;;;;-1:-1:-1::0;;;;;37815:25:43::1;;;;;;37901:6;37874:7;:11;37882:2;37874:11;;;;;;;;;;;:23;;;:33;;;;;;;;;;-1:-1:-1::0;;;;;37874:33:43::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;37874:33:43::1;;;;;-1:-1:-1::0;;;;;37874:33:43::1;;;;;;37943:2;37931:10;-1:-1:-1::0;;;;;37922:32:43::1;;37947:6;37922:32;;;;;-1:-1:-1::0;;;;;26018:47:46;;;;26000:66;;25988:2;25973:18;;25854:218;37922:32:43::1;;;;;;;;37150:811;;1281:20:13::0;:18;:20::i;4576:879:42:-;4681:6;3190:10;-1:-1:-1;;;;;3212:11:42;3190:34;;3186:63;;3233:16;;-1:-1:-1;;;3233:16:42;;;;;;;;;;;3186:63;4704:22:::1;:7;::::0;;;::::1;::::0;::::1;;:::i;:::-;:20;;1379:24:29::0;;552:8;1379:24;;1298:112;4704:22:42::1;4699:55;;4735:19;;-1:-1:-1::0;;;4735:19:42::1;;;;;;;;;;;4699:55;4768:6;:18;4775:10;:8;;::::0;;::::1;::::0;::::1;:3:::0;:8:::1;:::i;:10::-;4768:18:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;4768:18:42;;;;::::1;;:23:::0;;4764:55:::1;;4800:19;;-1:-1:-1::0;;;4800:19:42::1;;;;;;;;;;;4764:55;5320:29;:13;;::::0;::::1;:3:::0;:13:::1;:::i;:29::-;:50;;;;-1:-1:-1::0;5353:17:42;5320:50:::1;5316:83;;;5379:20;;-1:-1:-1::0;;;5379:20:42::1;;;;;;;;;;;5316:83;-1:-1:-1::0;;;;4576:879:42;;;;;:::o;10975:180:43:-;11062:7;11117:6;11125:9;11136;11106:40;;;;;;;;;29603:25:46;;;29675:1;29664:21;;;29659:2;29644:18;;29637:49;29722:21;;29717:2;29702:18;;29695:49;29591:2;29576:18;;29382:368;11106:40:43;;;;-1:-1:-1;;11106:40:43;;;;;;;;;11096:51;;11106:40;11096:51;;;;;10975:180;-1:-1:-1;;;;10975:180:43:o;53884:134::-;-1:-1:-1;;;;;;;;;;;;;;;;;53988:16:43;54005:5;53988:23;;;;;;;;:::i;:::-;;;;;;;;;;53981:30;;;;;;;;;53988:23;;53981:30;-1:-1:-1;;;;;53981:30:43;;;;-1:-1:-1;;;53981:30:43;;;;;;;;;;;;;-1:-1:-1;;53884:134:43:o;39946:764::-;40122:4;1239:21:13;:19;:21::i;:::-;9642:11:43;;9656:15;-1:-1:-1;9719:35:43::1;;;9740:14;;-1:-1:-1::0;;;9740:14:43::1;;;;;;;;;;;9719:35;40409:6:::2;40419:1;40409:11:::0;40405:36:::2;;40429:12;;-1:-1:-1::0;;;40429:12:43::2;;;;;;;;;;;40405:36;40451:38;40470:6;40478:2;40482:6;40451:18;:38::i;:::-;40499:14;40510:2;40499:10;:14::i;:::-;40580:23;40592:2;40596:6;40580:11;:23::i;:::-;40613:25;40625:2;40629:8;40613:11;:25::i;:::-;40655:48;40674:6;40682:8;40692:2;40696:6;40655:18;:48::i;:::-;40648:55;;1281:20:13::0;:18;:20::i;:::-;39946:764:43;;;;;;:::o;1965:315:13:-;2119:25;:23;:25::i;:::-;2219:54;2268:4;-1:-1:-1;;;;;;;;;;;2219:41:13;:48;;:54::i;:::-;1965:315::o;40716:203:43:-;40838:14;;;;:10;:14;;;;;;;;-1:-1:-1;;;;;40838:21:43;;;;;;;;;:28;40815:9;:16;;;;;:20;;;;;;;;;;40869:6;;40815:51;;-1:-1:-1;;;;;40838:28:43;;;;40815:51;:::i;:::-;:60;40811:101;;;40884:28;;-1:-1:-1;;;40884:28:43;;;;;;;;;;;20285:956;20336:26;20365:14;;;:10;:14;;;;;;;;;20336:43;;;;;;;;;-1:-1:-1;;;;;20336:43:43;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20336:43:43;;;;;;;;-1:-1:-1;;;20336:43:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20336:43:43;;;;;;;-1:-1:-1;20336:43:43;;;;20393:47;;-1:-1:-1;20412:11:43;;;;:7;:11;;;;;:23;-1:-1:-1;;;;;20412:23:43;:28;20393:47;20389:432;;;-1:-1:-1;20766:16:43;:23;20735:21;;;;:17;:21;;;;;;:55;;-1:-1:-1;;20735:55:43;-1:-1:-1;;;;;20735:55:43;;;;;;;;;20285:956::o;20389:432::-;21014:220;21038:10;:14;;;21066:10;:20;;;21100:10;:20;;;21134:1;21157:4;-1:-1:-1;;;;;21207:17:43;21014:10;:220::i;54786:163::-;54874:11;;;;:7;:11;;;;;;;;54887:10;:14;;;;;-1:-1:-1;;;;;54887:21:43;;;;;;;;;54910:9;:16;;;;;:20;;;;;;;;;54853:89;;54874:11;54887:21;54902:5;54882:2;54853:20;:89::i;1178:282:16:-;1292:10;1266:4;1282:21;;;:9;:21;;;;;;;;:25;;;;;;;;:35;;1311:6;;1282:25;1266:4;;1282:35;;1311:6;;1282:35;:::i;:::-;;;;-1:-1:-1;;;;;;;1328:19:16;;;;;;:9;:19;;;;;;;;:23;;;;;;;;:33;;1355:6;;1328:19;:33;;1355:6;;1328:33;:::i;:::-;;;;-1:-1:-1;;1377:54:16;;;1398:10;30062:51:46;;;30144:2;30129:18;;30122:34;;;1420:2:16;;-1:-1:-1;;;;;1377:54:16;;;-1:-1:-1;;;;;;;;;;;1377:54:16;30035:18:46;1377:54:16;29888:274:46;2286:110:13;2334:55;2383:5;-1:-1:-1;;;;;;;;;;;2334:41:13;1666:115:14;4083:594:0;4171:14;4187:12;4203:144;4248:11;2928:7;2954:10;-1:-1:-1;;;;;2954:10:0;;2878:93;4248:11;4273:6;4301:4;4327:9;4334:1;4332;4327:4;;:9;:::i;:::-;4320:17;;;:::i;:::-;4203:31;:144::i;:::-;4170:177;;;;4362:9;4357:314;;4391:9;;;;4387:274;;4420:18;:25;;-1:-1:-1;;;;4420:25:0;;-1:-1:-1;;;4420:25:0;;;;4463:60;;-1:-1:-1;;;4463:60:0;;-1:-1:-1;;;;;2954:10:0;;;;4463:46;;:60;;4510:6;;4518:4;;;;4463:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4562:5:0;4541:26;;-1:-1:-1;;;;4541:26:0;;;-1:-1:-1;4387:274:0;;-1:-1:-1;4387:274:0;;4613:33;;-1:-1:-1;;;4613:33:0;;-1:-1:-1;;;;;7874:32:46;;4613:33:0;;;7856:51:46;7829:18;;4613:33:0;7695:218:46;16702:227:43;16780:9;16775:148;16795:21;;;16775:148;;;16837:32;16855:10;;16866:1;16855:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16837:17;:32::i;:::-;16883:29;16898:10;;16909:1;16898:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16883:14;:29::i;:::-;16818:3;;16775:148;;12944:994:45;13152:20;3078:4;13188:23;;;;13184:53;;;13220:17;;-1:-1:-1;;;13220:17:45;;;;;;;;;;;13184:53;13251:8;;;;;;;:35;;-1:-1:-1;;;;;;13263:23:45;;;13251:35;13247:65;;;13295:17;;-1:-1:-1;;;13295:17:45;;;;;;;;;;;13247:65;13347:4;-1:-1:-1;;;;;13326:26:45;;;13322:56;;13361:17;;-1:-1:-1;;;13361:17:45;;;;;;;;;;;13322:56;-1:-1:-1;;;;;13392:23:45;;;;;;:51;;;13432:11;-1:-1:-1;;;;;13419:24:45;:9;-1:-1:-1;;;;;13419:24:45;;13392:51;13388:81;;;13452:17;;-1:-1:-1;;;13452:17:45;;;;;;;;;;;13388:81;13497:22;;13480:14;-1:-1:-1;;;;;13548:23:45;;;:33;;13578:3;13548:33;;;13574:1;13548:33;13761:65;;;;;;;;;-1:-1:-1;;;;;13792:15:45;13761:65;;;;;;;;;;;;;;;13740:87;;;;;;;-1:-1:-1;13740:87:45;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13740:87:45;-1:-1:-1;;13740:87:45;;;;;;;;;;;;;;13529:52;-1:-1:-1;13854:11:45;;;:44;;;13881:17;13869:29;;:9;:29;;;13854:44;13853:78;;13914:17;13853:78;;;13902:9;13853:78;13837:94;12944:994;-1:-1:-1;;;;;;;;12944:994:45:o;11211:1202::-;11436:6;11559:10;-1:-1:-1;;;;;11559:15:45;11573:1;11559:15;11555:29;;-1:-1:-1;11583:1:45;11576:8;;11555:29;11595:11;-1:-1:-1;;;;;11609:31:45;;;:49;;11647:11;11609:49;;;11643:1;11609:49;11595:63;-1:-1:-1;11668:13:45;11684:23;11706:1;-1:-1:-1;;;;;11684:19:45;;:23;:::i;:::-;11775:22;;11668:39;;-1:-1:-1;11763:9:45;11835:221;11846:5;11842:1;:9;:40;;;;;2964:2;11855:6;:27;11842:40;11835:221;;;11898:29;11930:15;11946:5;11950:1;11946;:5;:::i;:::-;11930:22;;;;;;;;:::i;:::-;;;;;;;;;;11970:10;;11930:22;;-1:-1:-1;11970:17:45;;;;-1:-1:-1;;;11970:10:45;;;;:17;11966:40;;;11996:10;;-1:-1:-1;;;11996:10:45;;;;;-1:-1:-1;11966:40:45;12020:3;;;;:::i;:::-;;;;12037:8;;;;;:::i;:::-;;;;11884:172;11835:221;;;12074:5;12069:1;:10;12065:27;;12088:4;12081:11;;;;;;;;12065:27;12342:18;12377:13;;;;;;;;:29;;12402:4;12377:29;;;12393:6;12377:29;12370:36;;;;;;;11211:1202;;;;;;;;:::o;8189:1558:42:-;8287:6;4051:17:40;;;:9;:17;;;;;;;;;8419:6:42;:14;;;;;8400:33;;;;;;;;;4051:17:40;8400:33:42;;;;;;;;;;;;;;;;;4051:17:40;;;;8400:33:42;8592:15;-1:-1:-1;8574:897:42;;;8629:8;;;9241:17;;;:9;:17;;;;;;8623:14;;;;;-1:-1:-1;9241:17:42;;;;9346:6;9311:30;2679:4;9346:6;9311:30;:::i;:::-;9297:45;;;;:10;:45;:::i;:::-;9296:56;;;;:::i;:::-;9272:80;;9379:13;9370:6;:22;9366:50;;;9403:13;9394:22;;9366:50;9440:6;9434:3;:12;9430:30;;;9454:6;9448:12;;9430:30;8609:862;;8574:897;9480:11;9494:14;;;:6;:14;;;;;;;;9522:9;;;9518:24;;;9539:3;9533:9;;9518:24;-1:-1:-1;9736:3:42;;8189:1558;-1:-1:-1;;;;;8189:1558:42:o;19390:635:43:-;19489:4;19467:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19459:35:43;;;:62;;;-1:-1:-1;19498:6:43;:18;19505:10;:8;;;;;;;:3;:8;:::i;:10::-;19498:18;;;;;;;;;;;-1:-1:-1;19498:18:43;;;;:23;19459:62;19455:94;;;19530:19;;-1:-1:-1;;;19530:19:43;;;;;;;;;;;19455:94;19939:29;:13;;;;:3;:13;:::i;:29::-;:50;;;;-1:-1:-1;19972:17:43;19939:50;19935:83;;;19998:20;;-1:-1:-1;;;19998:20:43;;;;;;;;;;;3098:198:16;-1:-1:-1;;;;;3186:19:16;;;;;;:9;:19;;;;;;;;:23;;;;;;;;:33;;3213:6;;3186:19;:33;;3213:6;;3186:33;:::i;:::-;;;;-1:-1:-1;;3235:54:16;;;3244:10;30062:51:46;;30144:2;30129:18;;30122:34;;;3278:2:16;;-1:-1:-1;;;;;3235:54:16;;;3264:1;;-1:-1:-1;;;;;;;;;;;3235:54:16;30035:18:46;3235:54:16;;;;;;;;3098:198;;;:::o;41177:329:43:-;41412:87;;;;;;;;41423:3;41412:87;:::i;:::-;41428:9;41439;41450:14;41466:4;41472:12;41486;41412:10;:87::i;16868:305:45:-;17101:10;;;;;;;;;;;;17113:13;;;;;;17141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17086:80;;17101:10;17128:11;;17086:14;:80::i;26286:232:43:-;26348:21;26330:15;26383:12;;;26379:25;;26397:7;26286:232::o;26379:25::-;26431:35;;26414:12;;26431:10;;26454:7;;26414:12;26431:35;26414:12;26431:35;26454:7;26431:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26413:53;;;26481:7;26476:35;;26497:14;;-1:-1:-1;;;26497:14:43;;;;;;;;;;;9940:621:42;10028:8;;;;;:34;;;10046:16;10040:22;;:3;:22;;;10028:34;10024:62;;;10071:15;;-1:-1:-1;;;10071:15:42;;;;;;;;;;;10024:62;2814:3;10430:20;;;;;:35;;;10462:3;10454:11;;:5;:11;;;10430:35;10426:63;;;10474:15;;-1:-1:-1;;;10474:15:42;;;;;;;;;;;10426:63;10499:14;;;;:6;:14;;;;;;;;:20;;-1:-1:-1;;10499:20:42;;;;;;;;;;;10529:9;:17;;;;;;:25;;;;;;;;;;9940:621::o;51379:129:43:-;51442:6;51479:21;;;:17;:21;;;;;;51467:34;;-1:-1:-1;;;;;51479:21:43;51467:11;:34::i;42212:202::-;42334:73;42351:11;42364:9;42375;42386:7;42395;42404:2;42334:16;:73::i;3759:149:0:-;3831:10;:25;;-1:-1:-1;;;;;;3831:25:0;-1:-1:-1;;;;;3831:25:0;;;;;;;;3871:30;;7856:51:46;;;3871:30:0;;7844:2:46;7829:18;3871:30:0;7695:218:46;24005:1136:45;24490:12;24515:13;;24554:36;;;;24565:7;24554:36;:::i;:::-;24514:76;;-1:-1:-1;24514:76:45;-1:-1:-1;24614:13:45;24604:6;:23;;;;;;;;:::i;:::-;;24600:267;;24643:20;24677:7;24666:33;;;;;;;;;;;;:::i;:::-;24643:56;;24713:53;24721:11;24734:2;:12;;;24748:2;:10;;;24760:2;:5;;;24713:7;:53::i;:::-;24780;24788:11;24801:2;:12;;;24815:2;:10;;;24827:2;:5;;;24780:7;:53::i;:::-;24847:9;;;;;;;;;;;;;;;;;;;24600:267;24876:239;24899:6;24919:9;24942:15;24971:12;24997:17;25028:15;25057:11;25082:2;25098:7;24876:9;:239::i;:::-;25125:9;;;;;;;;;;;;;;;;24005:1136;;;;;;;;;;;;;:::o;13381:1465:34:-;13527:28;13557;13602;13632;13664:36;13684:7;13693:6;13664:19;:36::i;:::-;13601:99;;;;13712:34;13748;13798:51;13822:7;13831:6;13839:9;13798:23;:51::i;:::-;13711:138;;;;13860:34;13896;13946:51;13970:7;13979:6;13987:9;13946:23;:51::i;:::-;13859:138;;;;14010:17;14033:25;14042:7;14051:6;14033:8;:25::i;:::-;14007:51;;;;;14110:9;14096:23;;:11;:23;;;14092:738;;;14191:26;14162;:55;14139:78;;14287:26;14258;:55;14235:78;;14092:738;;;14353:9;14338:24;;:11;:24;;;14334:496;;14434:26;14405;:55;14382:78;;14530:26;14501;:55;14478:78;;14334:496;;;14670:26;14641;14618:20;:49;:78;14595:101;;14789:26;14760;14737:20;:49;:78;14714:101;;14334:496;13591:1255;;;;;;;13381:1465;;;;;;;:::o;3302:192:16:-;-1:-1:-1;;;;;3388:17:16;;;;;;:9;:17;;;;;;;;:21;;;;;;;;:31;;3413:6;;3388:17;:31;;3413:6;;3388:31;:::i;:::-;;;;-1:-1:-1;;3435:52:16;;;3444:10;30062:51:46;;30144:2;30129:18;;30122:34;;;3476:2:16;;3472:1;;-1:-1:-1;;;;;3435:52:16;;;-1:-1:-1;;;;;;;;;;;3435:52:16;30035:18:46;3435:52:16;29888:274:46;55237:148:43;55299:79;55323:12;55337:11;55350:8;55360:17;;;;;;;;;-1:-1:-1;;;;;55360:17:43;55299:23;:79::i;6648:1167:41:-;-1:-1:-1;;;;;6727:22:41;;4998:58:37;6722:109:41;;6767:33;6791:8;6767:23;:33::i;6722:109::-;-1:-1:-1;;;;;6857:25:41;;6840:14;6857:25;;;:15;:25;;;;;;;6896:11;;;6892:24;;6909:7;6648:1167;:::o;6892:24::-;6938:11;;-1:-1:-1;;;;;6938:11:41;;6959:29;;6981:7;;6648:1167;:::o;6959:29::-;-1:-1:-1;;;;;7045:25:41;;7073:1;7045:25;;;:15;:25;;;;;:29;;;7238:75;;7255:11;;7061:8;;;;7288:6;;7307:4;7238:16;:75::i;:::-;7323:4;-1:-1:-1;;;;;7323:12:41;;7343:6;7323:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7362:46:41;;-1:-1:-1;;;;;;;7377:4:41;7362:34;;-1:-1:-1;7397:2:41;;-1:-1:-1;7401:6:41;7362:34;:46::i;:::-;7729:2;-1:-1:-1;;;;;7702:38:41;7719:8;-1:-1:-1;;;;;7702:38:41;;7733:6;7702:38;;;;668:25:46;;656:2;641:18;;522:177;7702:38:41;;;;;;;;7794:4;-1:-1:-1;;;;;7755:53:41;7782:2;-1:-1:-1;;;;;7755:53:41;;7801:6;7755:53;;;;668:25:46;;656:2;641:18;;522:177;7755:53:41;;;;;;;;6712:1103;;6648:1167;:::o;14514:677:45:-;14658:21;-1:-1:-1;;;;;14699:26:45;;14695:49;;-1:-1:-1;14742:1:45;14727:17;;14695:49;14774:9;-1:-1:-1;;;;;14758:25:45;:12;-1:-1:-1;;;;;14758:25:45;;14754:51;;14792:13;;-1:-1:-1;;;14792:13:45;;;;;;;;;;;14754:51;14835:17;-1:-1:-1;;;;;14819:33:45;:12;-1:-1:-1;;;;;14819:33:45;;14815:59;;14861:13;;-1:-1:-1;;;14861:13:45;;;;;;;;;;;14815:59;14912:4;-1:-1:-1;;;;;14888:29:45;;;14884:55;;14926:13;;-1:-1:-1;;;14926:13:45;;;;;;;;;;;14884:55;14968:12;-1:-1:-1;;;;;14953:31:45;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14953:33:45;;;;;;;;-1:-1:-1;;14953:33:45;;;;;;;;;;;;:::i;:::-;;;14949:236;;15151:23;;-1:-1:-1;;;15151:23:45;;;;;;;;;;;14949:236;-1:-1:-1;;;;;15031:21:45;;15027:57;;15061:23;;-1:-1:-1;;;15061:23:45;;;;;;;;;;;15027:57;15105:7;-1:-1:-1;15098:14:45;;1466:541:16;1574:4;1594:10;-1:-1:-1;;;;;1594:20:16;;;;;;:55;;-1:-1:-1;;;;;;1619:18:16;;;;;;:10;:18;;;;;;;;1638:10;1619:30;;;;;;;;;;1618:31;1594:55;1590:237;;;-1:-1:-1;;;;;1683:17:16;;1665:15;1683:17;;;:9;:17;;;;;;;;1701:10;1683:29;;;;;;;:33;;;;;;;;;-1:-1:-1;;1734:28:16;;1730:86;;1800:16;1810:6;1800:7;:16;:::i;:::-;-1:-1:-1;;;;;1764:17:16;;;;;;:9;:17;;;;;;;;1782:10;1764:29;;;;;;;:33;;;;;;;;:52;1730:86;1651:176;1590:237;-1:-1:-1;;;;;1837:17:16;;;;;;:9;:17;;;;;;;;:21;;;;;;;;:31;;1862:6;;1837:17;:31;;1862:6;;1837:31;:::i;:::-;;;;-1:-1:-1;;;;;;;1879:19:16;;;;;;:9;:19;;;;;;;;:23;;;;;;;;:33;;1906:6;;1879:19;:33;;1906:6;;1879:33;:::i;:::-;;;;-1:-1:-1;;1928:50:16;;;1937:10;30062:51:46;;30144:2;30129:18;;30122:34;;;1967:2:16;;-1:-1:-1;;;;;1928:50:16;;;;;;;;-1:-1:-1;;;;;;;;;;;1928:50:16;30035:18:46;1928:50:16;;;;;;;-1:-1:-1;1996:4:16;1466:541;;;;;;:::o;1802:157:13:-;-1:-1:-1;;;;;;;;;;;3375:11:14;1860:93:13;;;1912:30;;-1:-1:-1;;;1912:30:13;;;;;;;;;;;3491:139:14;3608:5;3602:4;3595:19;3491:139;;:::o;41512:459:43:-;41748:11;-1:-1:-1;;;;;41748:18:43;;41808:13;41850:89;;;;;;;;41863:3;41850:89;;;;41868:9;41850:89;;;;;;41879:9;41850:89;;;;;;41890:14;41850:89;;;;41906:4;-1:-1:-1;;;;;41850:89:43;;;;;41912:12;-1:-1:-1;;;;;41850:89:43;;;;;41926:12;-1:-1:-1;;;;;41850:89:43;;;;41839:101;;;;;;;;:::i;:::-;;;;-1:-1:-1;;41839:101:43;;;;;;;;;;41780:174;;;41839:101;41780:174;;:::i;:::-;;;;;;;;;;;;;41748:216;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41748:216:43;;;;;;;;;;;;:::i;21917:1606:45:-;22132:15;;22103:16;;22122:25;;-1:-1:-1;;;;;22132:15:45;22122:7;:25;:::i;:::-;22103:44;-1:-1:-1;22161:13:45;;22157:274;;22216:81;22232:8;22262;:24;;;22242:5;:17;;;:44;;;;:::i;:::-;-1:-1:-1;;;22216:15:45;:81::i;:::-;22190:108;;;;:14;;:108;;;;-1:-1:-1;;;22190:108:45;;-1:-1:-1;;;;;22190:108:45;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;22190:108:45;;;;;-1:-1:-1;;;;;22190:108:45;;;;;;22338:81;22354:8;22384;:24;;;22364:5;:17;;;:44;;;;:::i;22338:81::-;22312:14;;;:108;;:14;;:108;;;;-1:-1:-1;;;;;22312:108:45;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;22312:108:45;;;;;-1:-1:-1;;;;;22312:108:45;;;;;;22157:274;22467:17;;;;22440:24;;;;:44;;;;22521:17;;;22494:24;;;:44;22921:15;;-1:-1:-1;;;;;22921:15:45;22950:11;;22946:445;;22977:10;22990:88;23006:6;-1:-1:-1;;;;;22990:88:45;23037:8;:30;;;23014:5;:20;;;:53;;;;:::i;22990:88::-;22977:101;;23092:10;23105:88;23121:6;-1:-1:-1;;;;;23105:88:45;23152:8;:30;;;23129:5;:20;;;:53;;;;:::i;23105:88::-;23092:101;-1:-1:-1;23211:7:45;;;;:18;;-1:-1:-1;23222:7:45;;;23211:18;23207:174;;;23270:2;23249:8;:17;;;:23;;;;;;;:::i;:::-;;;;;;;;23311:2;23290:8;:17;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;23336:30:45;;;18556:25:46;;;18612:2;18597:18;;18590:34;;;23355:2:45;;-1:-1:-1;;;;;23336:30:45;;;;;18529:18:46;23336:30:45;;;;;;;23207:174;22963:428;;22946:445;23433:5;:20;;;23400:8;:30;;:53;;;;23496:5;:20;;;23463:8;:30;;:53;;;;22093:1430;;21917:1606;;;;;:::o;591:782:1:-;806:62;;-1:-1:-1;;;;;37434:32:46;;;806:62:1;;;37416:51:46;37503:32;;37483:18;;;37476:60;-1:-1:-1;;;;;;37572:33:46;;37552:18;;;37545:61;746:14:1;;;;;;37389:18:46;;806:62:1;;;-1:-1:-1;;806:62:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;806:62:1;-1:-1:-1;;;806:62:1;;;-1:-1:-1;918:18:1;;;949;;;;1030:11;;806:62;;-1:-1:-1;806:62:1;;-1:-1:-1;;1002:9:1;995:5;984:70;981:376;;;1092:4;1086:11;1129:4;1123:11;;1086;;-1:-1:-1;1327:14:1;;;1320:22;1309:34;;-1:-1:-1;981:376:1;904:463;591:782;;;;;;;:::o;17552:369:45:-;17732:19;;;:24;;17755:1;;17732:19;;;:24;;17755:1;;-1:-1:-1;;;;;17732:24:45;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;17732:24:45;;;;;-1:-1:-1;;;;;17732:24:45;;;;;;17767:15;17784;17803:34;17813:10;17825:11;17803:9;:34::i;:::-;17766:71;;;;17847:67;17852:1;:4;;;17858:1;:6;;;17866:1;:6;;;17874:1;:6;;;17882:1;:6;;;17890:7;17899;17908:5;17847:4;:67::i;:::-;17722:199;;17552:369;;;;:::o;31425:393::-;31630:12;;:28;;;;-1:-1:-1;31646:12:45;;31630:28;31660:7;31626:41;31676:11;-1:-1:-1;;;;;31676:18:45;;31719:13;31745:54;;;;;;;;31756:9;-1:-1:-1;;;;;31745:54:45;;;;;31767:9;-1:-1:-1;;;;;31745:54:45;;;;;31778:7;31745:54;;;;31787:7;31745:54;;;;31796:2;-1:-1:-1;;;;;31745:54:45;;;;31734:66;;;;;;;37842:13:46;;-1:-1:-1;;;;;37838:39:46;;;37820:58;;37938:4;37926:17;;;37920:24;37916:50;;37894:20;;;37887:80;38023:4;38011:17;;;38005:24;37983:20;;;37976:54;38086:4;38074:17;;;38068:24;38046:20;;;38039:54;38153:4;38141:17;;;38135:24;38131:50;38109:20;;;38102:80;;;;37807:3;37792:19;;37617:571;31734:66:45;;;;-1:-1:-1;;31734:66:45;;;;;;;;;;31708:93;;;31734:66;31708:93;;:::i;:::-;;;;;;;;;;;;;31676:135;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31676:135:45;;;;;;;;;;;;:::i;30888:252::-;30996:24;;31013:7;30996:24;31029:11;-1:-1:-1;;;;;31029:16:45;;31054:4;31061:15;:8;-1:-1:-1;;;;;31061:13:45;-1:-1:-1;;;;;5144:41:37;;5069:123;31061:15:45;31029:56;;-1:-1:-1;;;;;;31029:56:45;;;;;;;-1:-1:-1;;;;;28298:32:46;;;31029:56:45;;;28280:51:46;28347:18;;;28340:34;28390:18;;;28383:34;;;28253:18;;31029:56:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31095:38:45;;-1:-1:-1;;;31095:38:45;;-1:-1:-1;;;;;38792:32:46;;;31095:38:45;;;38774:51:46;38861:32;;;38841:18;;;38834:60;38910:18;;;38903:34;;;31095:16:45;;;-1:-1:-1;31095:16:45;;-1:-1:-1;38747:18:46;;31095:38:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25315:2461;25799:24;25837:7;25826:35;;;;;;;;;;;;:::i;:::-;25799:62;;25872:24;25898;25926:11;-1:-1:-1;;;;;25926:27:45;;25967:4;:8;;;25989:223;;;;;;;;26053:4;:14;;;25989:223;;;;;;26096:4;:14;;;25989:223;;;;;;26144:4;:19;;;25989:223;;;;26195:1;26187:10;;25989:223;;;25926:312;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25871:367;;;;26523:850;26547:6;26567:9;26590:15;26619:12;26645:17;26676:15;26705:11;26730:633;;;;;;;;26794:15;:4;:8;;;515:4:38;496:24;;;271:265;26794:15:45;26811:4;:14;;;26827:4;:14;;;26783:59;;;;;;;;;29603:25:46;;;29675:1;29664:21;;;29659:2;29644:18;;29637:49;29722:21;;29717:2;29702:18;;29695:49;29591:2;29576:18;;29382:368;26783:59:45;;;;;;;;;;;;;26773:70;;;;;;26765:79;;26730:633;;;;26867:4;:8;;;26730:633;;;;27050:21;:11;2107:3:35;2103:22;;1958:183;27050:21:45;-1:-1:-1;;;;;26730:633:45;;;;;27187:21;:11;2303:2:35;2292:28;;2147:189;27187:21:45;27180:29;;-1:-1:-1;;;;;26730:633:45;;;;;27242:2;:6;;;26730:633;;;;;;27286:2;:13;;;26730:633;;;;;;27336:2;:12;;;-1:-1:-1;;;;;26730:633:45;;;;26523:10;:850::i;:::-;27528:241;27558:11;27583:4;:8;;;27605:11;27630;27655:4;:9;;;27678:4;:19;;;27711:4;:17;;;27742:4;:17;;;27528:16;:241::i;:::-;25789:1987;;;25315:2461;;;;;;;;;:::o;7189:723:34:-;7302:24;7328;7425:17;7445:25;7463:6;7445:17;:25::i;:::-;7425:45;-1:-1:-1;7535:33:34;7579:46;536:1;7425:45;7579:46;:::i;:::-;7708;;-1:-1:-1;;;7708:46:34;;;;;18556:25:46;;;7752:1:34;18597:18:46;;;18590:34;7571:55:34;;-1:-1:-1;7571:55:34;;-1:-1:-1;;;;;7708:16:34;;;;;18529:18:46;;7708:46:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7708:46:34;;;;;;;;;;;;:::i;:::-;7839:2;7829:13;;7823:20;7892:2;7882:13;;;7876:20;7823;;7876;;-1:-1:-1;7189:723:34;-1:-1:-1;;;;;;7189:723:34:o;5904:583::-;6033:29;6064;6109:12;6124:30;6141:6;6149:4;6124:16;:30::i;:::-;6109:45;-1:-1:-1;6248:21:34;-1:-1:-1;;;;;6272:16:34;;;6297:17;6109:45;6313:1;6297:17;:::i;:::-;6272:47;;;;;;-1:-1:-1;;;;;;6272:47:34;;;;;;18556:25:46;;;;6317:1:34;18597:18:46;;;18590:34;18529:18;;6272:47:34;18382:248:46;1580:996:34;1682:20;1704:10;1716:18;1736:12;1821:17;1841:25;1859:6;1841:17;:25::i;:::-;1892:27;;-1:-1:-1;;;1892:27:34;;;;;668:25:46;;;1821:45:34;;-1:-1:-1;1877:12:34;;-1:-1:-1;;;;;1892:16:34;;;;;641:18:46;;1892:27:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1877:42;;-1:-1:-1;;;;;2245:4:34;2241:53;2225:69;;2374:4;2369:3;2365:14;2362:1;2351:29;2343:37;;2464:8;2457:4;2452:3;2448:14;2444:29;2429:44;;2551:8;2544:4;2539:3;2535:14;2531:29;2522:38;;2172:398;;1580:996;;;;;;;:::o;32965:497:45:-;-1:-1:-1;;;;;33185:22:45;;;33168:14;33185:22;;;;;;;;;;;;33221:31;;;;:46;;-1:-1:-1;33256:11:45;;33221:46;33217:59;;;33269:7;;;33217:59;-1:-1:-1;;;;;33285:22:45;;33310:1;33285:22;;;;;;;;;;:26;;;33321:69;;33328:11;;33298:8;;;;33361:6;;33372:17;33321:6;:69::i;:::-;33429:17;-1:-1:-1;;;;;33405:50:45;33419:8;-1:-1:-1;;;;;33405:50:45;;33448:6;33405:50;;;;668:25:46;;656:2;641:18;;522:177;33405:50:45;;;;;;;;33158:304;32965:497;;;;:::o;38836:185:43:-;38976:11;;38989:13;;39004:9;;38909:105;;38936:15;;38953:11;;38966:8;;-1:-1:-1;;;;;38976:11:43;;;;38989:13;;;39004:9;38909:26;:105::i;1290:204:11:-;1377:37;1391:5;1398:2;1402:5;1409:4;1377:13;:37::i;:::-;1372:116;;1437:40;;-1:-1:-1;;;1437:40:11;;-1:-1:-1;;;;;7874:32:46;;1437:40:11;;;7856:51:46;7829:18;;1437:40:11;7695:218:46;741:4141:27;823:14;1212:5;;;823:14;-1:-1:-1;;1216:1:27;1212;1400:20;1473:5;1469:2;1466:13;1458:5;1454:2;1450:14;1446:34;1437:43;;;1633:5;1619:11;:19;1611:28;;;;;;1720:5;1729:1;1720:10;1716:177;;-1:-1:-1;1807:23:27;;;;-1:-1:-1;1865:13:27;;1716:177;2193:17;2293:11;2290:1;2287;2280:25;2701:12;2717:15;;;2716:31;;2869:22;;;;;3776:1;3757;:15;;3756:21;;4019:17;;;4015:21;;4008:28;4081:17;;;4077:21;;4070:28;4144:17;;;4140:21;;4133:28;4207:17;;;4203:21;;4196:28;4270:17;;;4266:21;;4259:28;4334:17;;;4330:21;;;4323:28;3313:12;;;;3309:23;;;3334:1;3305:31;2454:20;;;2443:32;;;3372:12;;;;2501:21;;;;3029:16;;;;3363:21;;;;4827:11;;;;;-1:-1:-1;;741:4141:27;;;;;:::o;18073:291:45:-;18278:19;;;;;;;;;;;-1:-1:-1;;;;;18278:19:45;;;;;;;;;;;;;;;;-1:-1:-1;;;18278:19:45;;;;;;;;;;;-1:-1:-1;;;18278:19:45;;;;;;;;;;;;;;;;;;;;;496:24:38;-1:-1:-1;;;;18216:141:45;;18265:11;;18301:20;;;;;;;;;18323;;;;;18216:31;:141::i;:::-;18197:160;;;;18073:291;;;;;;:::o;18735:586::-;19085:20;;;;19119;;;;19195:17;;19257:19;;;;18970:344;;;44191:25:46;;;44247:2;44232:18;;44225:34;;;44275:18;;;44268:34;;;44333:2;44318:18;;44311:34;;;44376:3;44361:19;;44354:35;;;;44420:3;44405:19;;44398:35;;;;44464:3;44449:19;;44442:35;;;44508:3;44493:19;;44486:35;;;-1:-1:-1;;;;;19195:17:45;;;44552:3:46;44537:19;;44530:76;-1:-1:-1;;;19226:17:45;;;;44637:3:46;44622:19;;44615:76;-1:-1:-1;;;;;19257:19:45;;;44722:3:46;44707:19;;44700:61;-1:-1:-1;;;19290:14:45;;;;44792:3:46;44777:19;;44770:61;18997:2:45;;18970:344;;44178:3:46;44163:19;18970:344:45;;;;;;;18735:586;;;;;;;;:::o;4698:1317::-;5525:4;;5449:13;5507:23;;;;;;;;;;;5532:19;;;;5553:13;;;;5568:20;;;;5465:133;;5490:15;;-1:-1:-1;;;;;5507:23:45;;;;5532:19;;5465:11;:133::i;:::-;5641:22;;5626:4;;5608:23;;;;;;;;;;;;;:56;;-1:-1:-1;;5608:56:45;-1:-1:-1;;;;;5608:56:45;;;;;;;;;;5678:6;;;5449:149;;-1:-1:-1;;;;;;5678:11:45;;:26;;;;-1:-1:-1;5693:6:45;;;;-1:-1:-1;;;;;5693:11:45;;5678:26;5674:39;;;5706:7;;;5674:39;5930:4;;5923:12;;;;;;;;;;;;5947:4;;5937:15;;;;;;;;;5916:92;;5923:12;5954:15;5971:12;5985:11;5930:1;6001:6;5916;:92::i;:::-;5142:873;4698:1317;;;;;;;;:::o;27955:712::-;28248:17;28292:21;:11;2107:3:35;2103:22;;1958:183;28292:21:45;28268;:11;2107:3:35;2103:22;;1958:183;28268:21:45;:45;;;;:::i;:::-;28248:65;;28323:17;28367:21;:11;2303:2:35;2292:28;;2147:189;28367:21:45;28343;:11;2303:2:35;2292:28;;2147:189;28343:21:45;:45;;;;:::i;:::-;28323:65;;28398:53;28410:10;28422:14;28438:12;28398:11;:53::i;:::-;28461;28473:10;28485:14;28501:12;28461:11;:53::i;:::-;28524:63;28542:11;28555:3;:13;;;28570:10;28582:4;28524:17;:63::i;:::-;28597;28615:11;28628:3;:13;;;28643:10;28655:4;28597:17;:63::i;:::-;28238:429;;27955:712;;;;;;;;:::o;14852:160:34:-;14953:51;;14917:7;;14953:51;;14984:6;;414:1;;14953:51;;45253:19:46;;;45297:2;45288:12;;45281:28;45334:2;45325:12;;45096:247;14953:51:34;;;;;;;;;;;;;14943:62;;;;;;14936:69;;14852:160;;;:::o;15018:483::-;15094:7;15170:17;15190:25;15208:6;15190:17;:25::i;:::-;15170:45;-1:-1:-1;15284:24:34;15319:33;829:1;15170:45;15319:33;:::i;:::-;15445:48;;;15462:12;;;;15445:48;;;45253:19:46;45288:12;;;45281:28;;;15311:42:34;;-1:-1:-1;45325:12:46;;15445:48:34;;;;;;;;;;;;15435:59;;;;;;15428:66;;;;15018:483;;;;:::o;32120:676:45:-;-1:-1:-1;;;;;32398:25:45;;32381:14;32398:25;;;;;;;;;;;;32437:11;;;32433:24;;32450:7;;;32433:24;32466:10;32508:13;-1:-1:-1;;;;;32479:42:45;32495:8;-1:-1:-1;;;;;32479:42:45;;:68;;32536:11;32479:68;;;32524:9;32479:68;32466:81;-1:-1:-1;;;;;;32561:16:45;;32557:29;;32579:7;;;;32557:29;-1:-1:-1;;;;;32643:25:45;;32671:1;32643:25;;;;;;;;;;:29;;;32682:54;;32689:11;;32659:8;;;;32722:6;;32733:2;32682:6;:54::i;:::-;32778:2;-1:-1:-1;;;;;32751:38:45;32768:8;-1:-1:-1;;;;;32751:38:45;;32782:6;32751:38;;;;668:25:46;;656:2;641:18;;522:177;32751:38:45;;;;;;;;32371:425;;32120:676;;;;;;:::o;9022:1244:11:-;9249:4;9243:11;-1:-1:-1;;;9116:12:11;9267:22;;;-1:-1:-1;;;;;9315:24:11;;9309:4;9302:38;9360:4;9353:19;;;9116:12;9436:4;9116:12;9424:4;9116:12;;9408:5;9401;9396:45;9385:56;;9653:1;9646:4;9640:11;9637:18;9628:7;9624:32;9614:606;;9785:6;9775:7;9768:15;9764:28;9761:165;;;9841:16;9835:4;9830:3;9815:43;9891:16;9886:3;9879:29;9761:165;10202:1;10194:5;10182:18;10179:25;10160:16;10153:24;10149:56;10140:7;10136:70;10125:81;;9614:606;10240:4;10233:17;-1:-1:-1;9022:1244:11;;-1:-1:-1;;;;9022:1244:11:o;6267:4175:45:-;6969:6;;;;-1:-1:-1;;;;;6969:10:45;;6965:79;;7013:5;;;;:15;7037:6;;;;;6981:63;;-1:-1:-1;;;6981:63:45;;7006:4;6981:63;;;45800:51:46;-1:-1:-1;;;;;7013:20:45;;;45867:18:46;;;45860:34;-1:-1:-1;;;;;45930:47:46;;;45910:18;;;45903:75;6981:63:45;;:16;;;;;;45773:18:46;;;;;-1:-1:-1;;6981:63:45;;;;;;;;-1:-1:-1;6981:16:45;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6965:79;7058:6;;;;-1:-1:-1;;;;;7058:10:45;;7054:79;;7070:11;-1:-1:-1;;;;;7070:16:45;;7095:4;7102:22;:1;:5;;;:15;;;-1:-1:-1;;;;;7102:20:45;-1:-1:-1;;;;;5144:41:37;;5069:123;7102:22:45;7126:6;;;;7070:63;;-1:-1:-1;;;;;;7070:63:45;;;;;;;-1:-1:-1;;;;;45818:32:46;;;7070:63:45;;;45800:51:46;45867:18;;;45860:34;;;;-1:-1:-1;;;;;45930:47:46;45910:18;;;45903:75;45773:18;;7070:63:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7054:79;7160:17;;-1:-1:-1;;;;;7160:17:45;7144:13;7191:10;;;7187:554;;7540:1;:6;;;-1:-1:-1;;;;;7504:42:45;:15;:32;7520:1;:5;;;:15;;;-1:-1:-1;;;;;7504:32:45;-1:-1:-1;;;;;7504:32:45;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;7596:1;:6;;;-1:-1:-1;;;;;7560:42:45;:15;:32;7576:1;:5;;;:15;;;-1:-1:-1;;;;;7560:32:45;-1:-1:-1;;;;;7560:32:45;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;7616:94;7631:5;7638:10;7650:11;7663:46;;;;;;;;7672:1;:4;;;7663:46;;;;7678:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;;7686:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;;7694:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;;7702:1;:6;;;-1:-1:-1;;;;;7663:46:45;;;;7616:14;:94::i;:::-;7724:7;;;7187:554;8338:18;8359:42;8374:5;8381:1;:6;;;8389:5;8396:4;8359:14;:42::i;:::-;8338:63;;8411:18;8432:43;8447:5;8454:1;:6;;;8462:5;8469;8432:14;:43::i;:::-;8411:64;-1:-1:-1;8489:14:45;;8485:66;;8521:5;;;;;:15;-1:-1:-1;;;;;8505:32:45;;;;;;;;;;;;:46;;8541:10;;8505:32;:46;;8541:10;;8505:46;:::i;:::-;;;;-1:-1:-1;;8485:66:45;8565:14;;8561:66;;8597:5;;;;;:15;;;-1:-1:-1;;;;;8581:32:45;;;;;;;;;;;;:46;;8617:10;;8581:32;:46;;8617:10;;8581:46;:::i;:::-;;;;-1:-1:-1;;8561:66:45;8637:44;8651:5;8658:10;8670;8637:13;:44::i;:::-;8724:17;;8692:21;;8716:25;;-1:-1:-1;;;8724:17:45;;-1:-1:-1;;;;;8724:17:45;8716:5;:25;:::i;:::-;8692:49;;8755:13;8772:1;8755:18;8751:499;;8926:10;8917:1;:6;;;-1:-1:-1;;;;;8917:19:45;;;;;:::i;:::-;8897:5;;;;;:15;-1:-1:-1;;;;;8881:32:45;;;;;;;;;;;;:55;;:32;;;:55;;;;;:::i;:::-;;;;-1:-1:-1;;8986:6:45;;;;:19;;8995:10;;-1:-1:-1;;;;;8986:19:45;;:::i;:::-;8966:5;;;;;:15;;;-1:-1:-1;;;;;8950:32:45;;;;;;;;;;;;:55;;:32;;;:55;;;;;:::i;:::-;;;;;;;;9019:62;9033:5;9049:10;9040:1;:6;;;-1:-1:-1;;;;;9040:19:45;;;;;:::i;:::-;9070:10;9061:1;:6;;;-1:-1:-1;;;;;9061:19:45;;;;;:::i;:::-;9019:13;:62::i;:::-;9125:94;9140:5;9147:10;9159:11;9172:46;;;;;;;;9181:1;:4;;;9172:46;;;;9187:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;;9195:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;;9203:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;;9211:1;:6;;;-1:-1:-1;;;;;9172:46:45;;;;9125:14;:94::i;:::-;9233:7;;;;;;8751:499;9745:12;9769:10;9760:1;:6;;;-1:-1:-1;;;;;9760:19:45;;;;;:::i;:::-;9745:34;;9789:12;9813:10;9804:1;:6;;;-1:-1:-1;;;;;9804:19:45;;;;;:::i;:::-;9789:34;-1:-1:-1;9837:11:45;;;;;;;:48;;-1:-1:-1;9852:19:45;;;;-1:-1:-1;;;;;9852:33:45;;;9837:48;9833:337;;;9901:10;9932:6;9915:13;;;;:4;:13;:::i;:::-;9914:24;;;;:::i;:::-;9901:37;-1:-1:-1;9952:10:45;9983:6;9966:13;;;;:4;:13;:::i;:::-;9965:24;;;;:::i;:::-;9952:37;-1:-1:-1;10007:6:45;;10003:47;;10028:5;;;;;:15;-1:-1:-1;;;;;10015:29:45;;;;;;;;;;;;:35;;10048:2;;10015:29;:35;;10048:2;;10015:35;:::i;:::-;;;;-1:-1:-1;;10003:47:45;10068:6;;10064:47;;10089:5;;;;;:15;;;-1:-1:-1;;;;;10076:29:45;;;;;;;;;;;;:35;;10109:2;;10076:29;:35;;10109:2;;10076:35;:::i;:::-;;;;-1:-1:-1;;10064:47:45;10125:10;10133:2;10125:10;;:::i;:::-;;-1:-1:-1;10149:10:45;10157:2;10149:10;;:::i;:::-;;;9887:283;;9833:337;10200:46;10216:4;-1:-1:-1;;;10232:13:45;10200:15;:46::i;:::-;10179:5;:17;;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;10277:46:45;;-1:-1:-1;10293:4:45;-1:-1:-1;;;10309:13:45;10277:15;:46::i;:::-;10256:5;:17;;;:67;;;;;;;:::i;:::-;;;;;;;;10333:102;10348:5;10355:10;10367:11;10380:54;;;;;;;;10389:1;:4;;;10380:54;;;;10395:1;:6;;;-1:-1:-1;;;;;10380:54:45;;;;;10403:1;:6;;;-1:-1:-1;;;;;10380:54:45;;;;;10411:10;10380:54;;;;10423:10;10380:54;;;10333:14;:102::i;:::-;6577:3865;;;;;;6267:4175;;;;;;;:::o;29930:864::-;30051:1;30034:14;:18;30030:758;;;30308:12;30335:1;30323:9;:13;;;:47;;30369:1;30323:47;;;30355:9;30348:17;;30347:18;;;:::i;:::-;30308:62;;30395:5;-1:-1:-1;;;;;30388:12:45;:4;:12;30384:55;;;30409:30;;-1:-1:-1;;;30409:30:45;;;;;46163:25:46;;;-1:-1:-1;;;;;46224:47:46;;46204:18;;;46197:75;46136:18;;30409:30:45;45989:289:46;30030:758:45;30477:1;30460:14;:18;30456:332;;;30635:16;30666:1;30654:9;:13;;;:46;;30699:1;30654:46;;;30685:9;30678:17;;30654:46;30635:65;;30729:5;-1:-1:-1;;;;;30718:16:45;:8;:16;30714:63;;;30743:34;;-1:-1:-1;;;30743:34:45;;;;;46163:25:46;;;-1:-1:-1;;;;;46224:47:46;;46204:18;;;46197:75;46136:18;;30743:34:45;45989:289:46;33645:1779:45;33777:1;33768:6;:10;;;33764:1654;;;34037:12;34068:6;34061:14;;34060:15;;;:::i;:::-;34478:26;;-1:-1:-1;;;34478:26:45;;-1:-1:-1;;;;;7874:32:46;;;34478:26:45;;;7856:51:46;34037:39:45;;-1:-1:-1;34478:16:45;;;;;;7829:18:46;;34478:26:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;34522:22:45;;34518:625;;34934:11;-1:-1:-1;;;;;34934:18:45;;34960:4;34934:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34518:625;;;35006:84;-1:-1:-1;;;;;35006:50:45;;35057:4;35071:11;35085:4;35006:50;:84::i;:::-;35108:11;-1:-1:-1;;;;;35108:18:45;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34518:625;33780:1373;33764:1654;;;35172:1;35163:6;:10;;;35159:259;;;35349:58;;-1:-1:-1;;;35349:58:45;;-1:-1:-1;;;;;38792:32:46;;;35349:58:45;;;38774:51:46;38861:32;;;38841:18;;;38834:60;-1:-1:-1;;;;;35382:24:45;;38910:18:46;;;38903:34;35349:16:45;;;;;38747:18:46;;35349:58:45;38543:400:46;20007:784:45;20177:17;;20133:11;;-1:-1:-1;;;20177:17:45;;-1:-1:-1;;;;;20177:17:45;20133:11;20302:60;20338:5;;20318:26;;;;:::i;:::-;20330:6;-1:-1:-1;;;;;20318:26:45;20325:3;-1:-1:-1;;;;;20318:26:45;;-1:-1:-1;;;20356:5:45;20302:15;:60::i;:::-;20230:8;:56;;20265:21;;;;-1:-1:-1;;;20265:21:45;;-1:-1:-1;;;;;20265:21:45;20230:56;;;20241:21;;;;-1:-1:-1;;;;;20241:21:45;20230:56;-1:-1:-1;;;;;20222:65:45;:140;;;;:::i;:::-;20204:158;;20428:3;20417:7;:14;;20378:35;20394:3;-1:-1:-1;;;;;20378:35:45;20399:6;-1:-1:-1;;;;;20378:35:45;20407:5;20378:15;:35::i;:::-;:54;;;;:::i;:::-;20372:60;-1:-1:-1;20681:7:45;20699:85;;;;20713:21;;;:28;;-1:-1:-1;;;;;;20713:28:45;-1:-1:-1;;;;;20713:28:45;;;;;20699:85;;;20756:21;;;:28;;-1:-1:-1;;;;;20756:28:45;;;-1:-1:-1;;;20756:28:45;;;;;;20699:85;20150:641;;;20007:784;;;;;;:::o;20891:343::-;21003:17;;-1:-1:-1;;;21003:17:45;;-1:-1:-1;;;;;21003:17:45;20986:14;21034:11;;;21030:24;;21047:7;20891:343;;;:::o;21030:24::-;21067:8;;21063:77;;21101:39;21117:4;-1:-1:-1;;;21133:6:45;-1:-1:-1;;;;;21101:39:45;:15;:39::i;:::-;21077:5;:20;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;21063:77:45;21154:8;;21150:77;;21188:39;21204:4;-1:-1:-1;;;21220:6:45;-1:-1:-1;;;;;21188:39:45;:15;:39::i;:::-;21164:5;:20;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;20976:258:45;20891:343;;;:::o;1733:232:11:-;1838:47;1856:5;1863:4;1869:2;1873:5;1880:4;1838:17;:47::i;:::-;1833:126;;1908:40;;-1:-1:-1;;;1908:40:11;;-1:-1:-1;;;;;7874:32:46;;1908:40:11;;;7856:51:46;7829:18;;1908:40:11;7695:218:46;10814:1393:11;11109:4;11103:11;-1:-1:-1;;;10972:12:11;11127:22;;;-1:-1:-1;;;;;11175:26:11;;;11169:4;11162:40;11228:24;;11222:4;11215:38;11273:4;11266:19;;;10972:12;11349:4;10972:12;11337:4;10972:12;;11321:5;11314;11309:45;11298:56;;11566:1;11559:4;11553:11;11550:18;11541:7;11537:32;11527:606;;11698:6;11688:7;11681:15;11677:28;11674:165;;;11754:16;11748:4;11743:3;11728:43;11804:16;11799:3;11792:29;11674:165;12115:1;12107:5;12095:18;12092:25;12073:16;12066:24;12062:56;12053:7;12049:70;12038:81;;11527:606;12153:4;12146:17;-1:-1:-1;12189:1:11;12183:4;12176:15;10814:1393;;-1:-1:-1;;;;;10814:1393:11:o;14:131:46:-;-1:-1:-1;;;;;89:31:46;;79:42;;69:70;;135:1;132;125:12;150:367;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;481:2;466:18;;;;453:32;;-1:-1:-1;;;150:367:46:o;704:286::-;762:6;815:2;803:9;794:7;790:23;786:32;783:52;;;831:1;828;821:12;783:52;857:23;;-1:-1:-1;;;;;;909:32:46;;899:43;;889:71;;956:1;953;946:12;1187:487;1264:6;1272;1280;1333:2;1321:9;1312:7;1308:23;1304:32;1301:52;;;1349:1;1346;1339:12;1301:52;1388:9;1375:23;1407:31;1432:5;1407:31;:::i;:::-;1457:5;1535:2;1520:18;;1507:32;;-1:-1:-1;1638:2:46;1623:18;;;1610:32;;1187:487;-1:-1:-1;;;1187:487:46:o;1679:389::-;1764:8;1774:6;1828:3;1821:4;1813:6;1809:17;1805:27;1795:55;;1846:1;1843;1836:12;1795:55;-1:-1:-1;1869:20:46;;-1:-1:-1;;;;;1901:30:46;;1898:50;;;1944:1;1941;1934:12;1898:50;1981:4;1973:6;1969:17;1957:29;;2041:3;2034:4;2024:6;2021:1;2017:14;2009:6;2005:27;2001:38;1998:47;1995:67;;;2058:1;2055;2048:12;2073:159;2140:20;;2200:6;2189:18;;2179:29;;2169:57;;2222:1;2219;2212:12;2169:57;2073:159;;;:::o;2237:695::-;2369:6;2377;2385;2393;2446:2;2434:9;2425:7;2421:23;2417:32;2414:52;;;2462:1;2459;2452:12;2414:52;2502:9;2489:23;-1:-1:-1;;;;;2527:6:46;2524:30;2521:50;;;2567:1;2564;2557:12;2521:50;2606:92;2690:7;2681:6;2670:9;2666:22;2606:92;:::i;:::-;2717:8;;-1:-1:-1;2580:118:46;-1:-1:-1;2771:37:46;;-1:-1:-1;2804:2:46;2789:18;;2771:37;:::i;:::-;2761:47;;2858:2;2847:9;2843:18;2830:32;2871:31;2896:5;2871:31;:::i;:::-;2237:695;;;;-1:-1:-1;2237:695:46;;-1:-1:-1;;2237:695:46:o;2937:284::-;2995:6;3048:2;3036:9;3027:7;3023:23;3019:32;3016:52;;;3064:1;3061;3054:12;3016:52;3103:9;3090:23;-1:-1:-1;;;;;3146:5:46;3142:30;3135:5;3132:41;3122:69;;3187:1;3184;3177:12;3419:226;3478:6;3531:2;3519:9;3510:7;3506:23;3502:32;3499:52;;;3547:1;3544;3537:12;3499:52;-1:-1:-1;3592:23:46;;3419:226;-1:-1:-1;3419:226:46:o;3650:118::-;3736:5;3729:13;3722:21;3715:5;3712:32;3702:60;;3758:1;3755;3748:12;3773:388;3865:6;3873;3926:2;3914:9;3905:7;3901:23;3897:32;3894:52;;;3942:1;3939;3932:12;3894:52;3987:23;;;-1:-1:-1;4086:2:46;4071:18;;4058:32;4099:30;4058:32;4099:30;:::i;:::-;4148:7;4138:17;;;3773:388;;;;;:::o;4361:276::-;4449:6;4502:2;4490:9;4481:7;4477:23;4473:32;4470:52;;;4518:1;4515;4508:12;4470:52;4557:9;4544:23;4576:31;4601:5;4576:31;:::i;4642:623::-;4766:6;4774;4782;4835:2;4823:9;4814:7;4810:23;4806:32;4803:52;;;4851:1;4848;4841:12;4803:52;4891:9;4878:23;-1:-1:-1;;;;;4916:6:46;4913:30;4910:50;;;4956:1;4953;4946:12;4910:50;4995:92;5079:7;5070:6;5059:9;5055:22;4995:92;:::i;:::-;5106:8;;-1:-1:-1;4969:118:46;-1:-1:-1;;5191:2:46;5176:18;;5163:32;5204:31;5163:32;5204:31;:::i;:::-;5254:5;5244:15;;;4642:623;;;;;:::o;5270:424::-;5347:12;;-1:-1:-1;;;;;5343:38:46;;;5331:51;;5435:4;5424:16;;;5418:23;5414:49;;5398:14;;;5391:73;5517:4;5506:16;;;5500:23;5525:8;5496:38;5480:14;;;5473:62;5598:4;5587:16;;;5581:23;5578:1;5567:38;5551:14;;;5544:62;5659:4;5648:16;;;5642:23;5638:49;5622:14;;5615:73;5270:424::o;5699:495::-;5953:3;5938:19;;5966:44;5942:9;5992:6;5966:44;:::i;:::-;6061:6;6058:1;6047:21;6041:3;6030:9;6026:19;6019:50;6120:6;6117:1;6106:21;6100:3;6089:9;6085:19;6078:50;6179:6;6172:14;6165:22;6159:3;6148:9;6144:19;6137:51;5699:495;;;;;;;:::o;6199:156::-;6259:5;6304:3;6295:6;6290:3;6286:16;6282:26;6279:46;;;6321:1;6318;6311:12;6279:46;-1:-1:-1;6343:6:46;6199:156;-1:-1:-1;6199:156:46:o;6360:118::-;6447:5;6444:1;6433:20;6426:5;6423:31;6413:59;;6468:1;6465;6458:12;6483:146;-1:-1:-1;;;;;6562:5:46;6558:46;6551:5;6548:57;6538:85;;6619:1;6616;6609:12;6634:1056;6770:6;6778;6786;6794;6802;6810;6818;6871:3;6859:9;6850:7;6846:23;6842:33;6839:53;;;6888:1;6885;6878:12;6839:53;6911:54;6957:7;6946:9;6911:54;:::i;:::-;6901:64;;7015:3;7004:9;7000:19;6987:33;7029:29;7052:5;7029:29;:::i;:::-;7077:5;-1:-1:-1;7134:3:46;7119:19;;7106:33;7148:31;7106:33;7148:31;:::i;:::-;7198:7;-1:-1:-1;7257:3:46;7242:19;;7229:33;7271;7229;7271;:::i;:::-;7323:7;-1:-1:-1;7382:3:46;7367:19;;7354:33;7396;7354;7396;:::i;:::-;7448:7;-1:-1:-1;7507:3:46;7492:19;;7479:33;7521;7479;7521;:::i;:::-;6634:1056;;;;-1:-1:-1;6634:1056:46;;;;;;;;-1:-1:-1;;7653:3:46;7638:19;;;7625:33;;6634:1056::o;8357:1107::-;8579:13;;-1:-1:-1;;;;;8192:46:46;8180:59;;8547:3;8532:19;;8651:4;8643:6;8639:17;8633:24;8666:54;8714:4;8703:9;8699:20;8685:12;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;8666:54;;8776:4;8768:6;8764:17;8758:24;8751:4;8740:9;8736:20;8729:54;8839:4;8831:6;8827:17;8821:24;8814:4;8803:9;8799:20;8792:54;8902:4;8894:6;8890:17;8884:24;8877:4;8866:9;8862:20;8855:54;8965:4;8957:6;8953:17;8947:24;8940:4;8929:9;8925:20;8918:54;9021:4;9013:6;9009:17;9003:24;9036:56;9086:4;9075:9;9071:20;9055:14;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;9036:56;;9141:4;9133:6;9129:17;9123:24;9156:56;9206:4;9195:9;9191:20;9175:14;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;9156:56;;9261:6;9253;9249:19;9243:26;9278:57;9327:6;9316:9;9312:22;9296:14;-1:-1:-1;;;;;8315:30:46;8303:43;;8250:102;9278:57;;9384:6;9376;9372:19;9366:26;9401:57;9450:6;9439:9;9435:22;9419:14;-1:-1:-1;;;;;8315:30:46;8303:43;;8250:102;9401:57;;8357:1107;;;;:::o;9469:119::-;9554:8;9547:5;9543:20;9536:5;9533:31;9523:59;;9578:1;9575;9568:12;9593:653;9703:6;9711;9719;9727;9780:3;9768:9;9759:7;9755:23;9751:33;9748:53;;;9797:1;9794;9787:12;9748:53;9820:54;9866:7;9855:9;9820:54;:::i;:::-;9810:64;;9924:3;9913:9;9909:19;9896:33;9938:30;9962:5;9938:30;:::i;:::-;9987:5;-1:-1:-1;10044:3:46;10029:19;;10016:33;10058:32;10016:33;10058:32;:::i;:::-;10109:7;-1:-1:-1;10168:3:46;10153:19;;10140:33;10182:32;10140:33;10182:32;:::i;10251:724::-;10368:6;10376;10384;10392;10400;10453:3;10441:9;10432:7;10428:23;10424:33;10421:53;;;10470:1;10467;10460:12;10421:53;10493:54;10539:7;10528:9;10493:54;:::i;:::-;10483:64;;10597:3;10586:9;10582:19;10569:33;10611:29;10634:5;10611:29;:::i;:::-;10659:5;-1:-1:-1;10716:3:46;10701:19;;10688:33;10730:31;10688:33;10730:31;:::i;:::-;10780:7;-1:-1:-1;10839:3:46;10824:19;;10811:33;10853;10811;10853;:::i;:::-;10905:7;-1:-1:-1;10931:38:46;10964:3;10949:19;;10931:38;:::i;:::-;10921:48;;10251:724;;;;;;;;:::o;10980:367::-;11048:6;11056;11109:2;11097:9;11088:7;11084:23;11080:32;11077:52;;;11125:1;11122;11115:12;11077:52;11170:23;;;-1:-1:-1;11269:2:46;11254:18;;11241:32;11282:33;11241:32;11282:33;:::i;11352:888::-;11504:4;11546:3;11535:9;11531:19;11523:27;;-1:-1:-1;;;;;11587:6:46;11581:13;11577:54;11566:9;11559:73;-1:-1:-1;;;;;11692:4:46;11684:6;11680:17;11674:24;11670:65;11663:4;11652:9;11648:20;11641:95;11783:4;11775:6;11771:17;11765:24;11798:54;11846:4;11835:9;11831:20;11817:12;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;11798:54;;11908:4;11900:6;11896:17;11890:24;11883:4;11872:9;11868:20;11861:54;11971:4;11963:6;11959:17;11953:24;11946:4;11935:9;11931:20;11924:54;12034:4;12026:6;12022:17;12016:24;12009:4;11998:9;11994:20;11987:54;12097:4;12089:6;12085:17;12079:24;12072:4;12061:9;12057:20;12050:54;12160:4;12152:6;12148:17;12142:24;12135:4;12124:9;12120:20;12113:54;12225:6;12217;12213:19;12207:26;12198:6;12187:9;12183:22;12176:58;11352:888;;;;:::o;12245:382::-;12310:6;12318;12371:2;12359:9;12350:7;12346:23;12342:32;12339:52;;;12387:1;12384;12377:12;12339:52;12426:9;12413:23;12445:31;12470:5;12445:31;:::i;:::-;12495:5;-1:-1:-1;12552:2:46;12537:18;;12524:32;12565:30;12524:32;12565:30;:::i;12632:347::-;12683:8;12693:6;12747:3;12740:4;12732:6;12728:17;12724:27;12714:55;;12765:1;12762;12755:12;12714:55;-1:-1:-1;12788:20:46;;-1:-1:-1;;;;;12820:30:46;;12817:50;;;12863:1;12860;12853:12;12817:50;12900:4;12892:6;12888:17;12876:29;;12952:3;12945:4;12936:6;12928;12924:19;12920:30;12917:39;12914:59;;;12969:1;12966;12959:12;12984:833;13138:6;13146;13154;13162;13170;13214:9;13205:7;13201:23;13244:3;13240:2;13236:12;13233:32;;;13261:1;13258;13251:12;13233:32;13300:9;13287:23;13319:31;13344:5;13319:31;:::i;:::-;13369:5;-1:-1:-1;13393:63:46;13448:7;13443:2;13428:18;;13393:63;:::i;:::-;13383:73;-1:-1:-1;13491:2:46;-1:-1:-1;;13472:17:46;;13468:26;13465:46;;;13507:1;13504;13497:12;13465:46;;13545:3;13534:9;13530:19;13520:29;;13600:3;13589:9;13585:19;13572:33;-1:-1:-1;;;;;13620:6:46;13617:30;13614:50;;;13660:1;13657;13650:12;13614:50;13699:58;13749:7;13740:6;13729:9;13725:22;13699:58;:::i;:::-;12984:833;;;;-1:-1:-1;12984:833:46;;-1:-1:-1;13776:8:46;;13673:84;12984:833;-1:-1:-1;;;12984:833:46:o;14219:508::-;14296:6;14304;14312;14365:2;14353:9;14344:7;14340:23;14336:32;14333:52;;;14381:1;14378;14371:12;14333:52;14420:9;14407:23;14439:31;14464:5;14439:31;:::i;:::-;14489:5;-1:-1:-1;14546:2:46;14531:18;;14518:32;14559:33;14518:32;14559:33;:::i;:::-;14219:508;;14611:7;;-1:-1:-1;;;14691:2:46;14676:18;;;;14663:32;;14219:508::o;14732:651::-;14841:6;14849;14857;14865;14918:3;14906:9;14897:7;14893:23;14889:33;14886:53;;;14935:1;14932;14925:12;14886:53;14958:54;15004:7;14993:9;14958:54;:::i;:::-;14948:64;;15062:3;15051:9;15047:19;15034:33;15076:29;15099:5;15076:29;:::i;:::-;15124:5;-1:-1:-1;15181:3:46;15166:19;;15153:33;15195:31;15153:33;15195:31;:::i;:::-;15245:7;-1:-1:-1;15304:3:46;15289:19;;15276:33;15318;15276;15318;:::i;16097:573::-;16192:6;16200;16208;16261:2;16249:9;16240:7;16236:23;16232:32;16229:52;;;16277:1;16274;16267:12;16229:52;16322:23;;;-1:-1:-1;16420:2:46;16405:18;;16392:32;-1:-1:-1;;;;;16436:30:46;;16433:50;;;16479:1;16476;16469:12;16433:50;16518:92;16602:7;16593:6;16582:9;16578:22;16518:92;:::i;:::-;16097:573;;16629:8;;-1:-1:-1;16492:118:46;;-1:-1:-1;;;;16097:573:46:o;16675:566::-;16777:6;16785;16793;16846:2;16834:9;16825:7;16821:23;16817:32;16814:52;;;16862:1;16859;16852:12;16814:52;16907:23;;;-1:-1:-1;17006:2:46;16991:18;;16978:32;17019;16978;17019;:::i;:::-;17070:7;-1:-1:-1;17129:2:46;17114:18;;17101:32;17177:12;17164:26;;17152:39;;17142:67;;17205:1;17202;17195:12;17453:409;17523:6;17531;17584:2;17572:9;17563:7;17559:23;17555:32;17552:52;;;17600:1;17597;17590:12;17552:52;17640:9;17627:23;-1:-1:-1;;;;;17665:6:46;17662:30;17659:50;;;17705:1;17702;17695:12;17659:50;17744:58;17794:7;17785:6;17774:9;17770:22;17744:58;:::i;:::-;17821:8;;17718:84;;-1:-1:-1;17453:409:46;-1:-1:-1;;;;17453:409:46:o;17867:288::-;17908:3;17946:5;17940:12;17973:6;17968:3;17961:19;18029:6;18022:4;18015:5;18011:16;18004:4;17999:3;17995:14;17989:47;18081:1;18074:4;18065:6;18060:3;18056:16;18052:27;18045:38;18144:4;18137:2;18133:7;18128:2;18120:6;18116:15;18112:29;18107:3;18103:39;18099:50;18092:57;;;17867:288;;;;:::o;18160:217::-;18307:2;18296:9;18289:21;18270:4;18327:44;18367:2;18356:9;18352:18;18344:6;18327:44;:::i;19123:1198::-;19268:6;19276;19284;19292;19300;19308;19316;19324;19377:3;19365:9;19356:7;19352:23;19348:33;19345:53;;;19394:1;19391;19384:12;19345:53;19417:54;19463:7;19452:9;19417:54;:::i;:::-;19407:64;;19521:3;19510:9;19506:19;19493:33;19535:29;19558:5;19535:29;:::i;:::-;19583:5;-1:-1:-1;19640:3:46;19625:19;;19612:33;19654:31;19612:33;19654:31;:::i;:::-;19704:7;-1:-1:-1;19763:3:46;19748:19;;19735:33;19777;19735;19777;:::i;:::-;19829:7;-1:-1:-1;19888:3:46;19873:19;;19860:33;19902;19860;19902;:::i;:::-;19954:7;-1:-1:-1;20013:3:46;19998:19;;19985:33;20027;19985;20027;:::i;:::-;20079:7;-1:-1:-1;20138:3:46;20123:19;;20110:33;20152;20110;20152;:::i;:::-;19123:1198;;;;-1:-1:-1;19123:1198:46;;;;;;;;-1:-1:-1;20204:7:46;;20284:3;20269:19;20256:33;;-1:-1:-1;19123:1198:46:o;20326:388::-;20394:6;20402;20455:2;20443:9;20434:7;20430:23;20426:32;20423:52;;;20471:1;20468;20461:12;20423:52;20510:9;20497:23;20529:31;20554:5;20529:31;:::i;:::-;20579:5;-1:-1:-1;20636:2:46;20621:18;;20608:32;20649:33;20608:32;20649:33;:::i;20948:516::-;21052:6;21060;21068;21121:3;21109:9;21100:7;21096:23;21092:33;21089:53;;;21138:1;21135;21128:12;21089:53;21177:9;21164:23;21196:31;21221:5;21196:31;:::i;:::-;21246:5;-1:-1:-1;21270:63:46;21325:7;21320:2;21305:18;;21270:63;:::i;:::-;21260:73;;21385:3;21374:9;21370:19;21357:33;21399;21424:7;21399:33;:::i;21469:527::-;21569:6;21577;21585;21638:2;21626:9;21617:7;21613:23;21609:32;21606:52;;;21654:1;21651;21644:12;21606:52;21699:23;;;-1:-1:-1;21798:2:46;21783:18;;21770:32;21811:31;21770:32;21811:31;:::i;:::-;21861:7;-1:-1:-1;21920:2:46;21905:18;;21892:32;21933:31;21892:32;21933:31;:::i;22355:629::-;22441:6;22449;22457;22465;22518:3;22506:9;22497:7;22493:23;22489:33;22486:53;;;22535:1;22532;22525:12;22486:53;22574:9;22561:23;22593:31;22618:5;22593:31;:::i;:::-;22643:5;-1:-1:-1;22700:2:46;22685:18;;22672:32;22713:33;22672:32;22713:33;:::i;:::-;22355:629;;22765:7;;-1:-1:-1;;;;22845:2:46;22830:18;;22817:32;;22948:2;22933:18;22920:32;;22355:629::o;23279:127::-;23340:10;23335:3;23331:20;23328:1;23321:31;23371:4;23368:1;23361:15;23395:4;23392:1;23385:15;23411:125;23476:9;;;23497:10;;;23494:36;;;23510:18;;:::i;23541:127::-;23602:10;23597:3;23593:20;23590:1;23583:31;23633:4;23630:1;23623:15;23657:4;23654:1;23647:15;23673:252;23745:2;23739:9;23787:3;23775:16;;-1:-1:-1;;;;;23806:34:46;;23842:22;;;23803:62;23800:88;;;23868:18;;:::i;:::-;23904:2;23897:22;23673:252;:::o;23930:253::-;24002:2;23996:9;24044:4;24032:17;;-1:-1:-1;;;;;24064:34:46;;24100:22;;;24061:62;24058:88;;;24126:18;;:::i;24188:275::-;24259:2;24253:9;24324:2;24305:13;;-1:-1:-1;;24301:27:46;24289:40;;-1:-1:-1;;;;;24344:34:46;;24380:22;;;24341:62;24338:88;;;24406:18;;:::i;:::-;24442:2;24435:22;24188:275;;-1:-1:-1;24188:275:46:o;24468:940::-;24552:6;24612:3;24600:9;24591:7;24587:23;24583:33;24628:2;24625:22;;;24643:1;24640;24633:12;24625:22;-1:-1:-1;24685:22:46;;:::i;:::-;24744:9;24731:23;24763:33;24788:7;24763:33;:::i;:::-;24805:22;;24879:2;24864:18;;24851:32;24892:33;24851:32;24892:33;:::i;:::-;24952:2;24941:14;;24934:31;25017:2;25002:18;;24989:32;25030;24989;25030;:::i;:::-;25089:2;25078:14;;25071:31;25154:2;25139:18;;25126:32;25167:31;25126:32;25167:31;:::i;:::-;25225:2;25214:14;;25207:31;25290:3;25275:19;;25262:33;25304;25262;25304;:::i;:::-;25364:3;25353:15;;25346:32;25357:5;24468:940;-1:-1:-1;;;24468:940:46:o;25413:191::-;-1:-1:-1;;;;;25481:26:46;;;25509;;;25477:59;;25548:27;;25545:53;;;25578:18;;:::i;25609:240::-;-1:-1:-1;;;;;25678:42:46;;;25722;;;25674:91;;25777:43;;25774:69;;;25823:18;;:::i;26440:767::-;26527:6;26587:2;26575:9;26566:7;26562:23;26558:32;26602:2;26599:22;;;26617:1;26614;26607:12;26599:22;-1:-1:-1;26686:2:46;26680:9;26728:2;26716:15;;-1:-1:-1;;;;;26746:34:46;;26782:22;;;26743:62;26740:88;;;26808:18;;:::i;:::-;26844:2;26837:22;26881:23;;26913:28;26881:23;26913:28;:::i;:::-;26950:21;;27032:2;27017:18;;;27004:32;26987:15;;;26980:57;27089:2;27074:18;;27061:32;27102:33;27061:32;27102:33;:::i;:::-;27163:2;27151:15;;27144:32;27155:6;26440:767;-1:-1:-1;;;26440:767:46:o;27421:245::-;27488:6;27541:2;27529:9;27520:7;27516:23;27512:32;27509:52;;;27557:1;27554;27547:12;27509:52;27589:9;27583:16;27608:28;27630:5;27608:28;:::i;27671:243::-;-1:-1:-1;;;;;27786:42:46;;;27742;;;27738:91;;27841:44;;27838:70;;;27888:18;;:::i;27919:127::-;27980:10;27975:3;27971:20;27968:1;27961:31;28011:4;28008:1;28001:15;28035:4;28032:1;28025:15;28428:173;28525:12;28496:20;;;28518;;;28492:47;;28551:21;;28548:47;;;28575:18;;:::i;28606:136::-;28641:3;-1:-1:-1;;;28662:22:46;;28659:48;;28687:18;;:::i;:::-;-1:-1:-1;28727:1:46;28723:13;;28606:136::o;29132:245::-;29190:6;29243:2;29231:9;29222:7;29218:23;29214:32;29211:52;;;29259:1;29256;29249:12;29211:52;29298:9;29285:23;29317:30;29341:5;29317:30;:::i;29755:128::-;29822:9;;;29843:11;;;29840:37;;;29857:18;;:::i;30167:331::-;30272:9;30283;30325:8;30313:10;30310:24;30307:44;;;30347:1;30344;30337:12;30307:44;30376:6;30366:8;30363:20;30360:40;;;30396:1;30393;30386:12;30360:40;-1:-1:-1;;30422:23:46;;;30467:25;;;;;-1:-1:-1;30167:331:46:o;30503:338::-;30623:19;;-1:-1:-1;;;;;;30660:29:46;;;30709:1;30701:10;;30698:137;;;-1:-1:-1;;;;;;30770:1:46;30766:11;;;;30763:1;30759:19;30755:46;;;30747:55;30743:82;;;;30503:338;-1:-1:-1;;30503:338:46:o;30846:485::-;-1:-1:-1;;;;;31031:32:46;;31013:51;;31100:2;31095;31080:18;;31073:30;;;31119:18;;31112:34;;;31139:6;31188;31183:2;31168:18;;31155:48;31252:1;31223:22;;;31247:2;31219:31;;;31212:42;;;;31315:2;31294:15;;;-1:-1:-1;;31290:29:46;31275:45;31271:54;;30846:485;-1:-1:-1;;30846:485:46:o;31336:136::-;31375:3;31403:5;31393:39;;31412:18;;:::i;:::-;-1:-1:-1;;;31448:18:46;;31336:136::o;31477:135::-;31516:3;31537:17;;;31534:43;;31557:18;;:::i;:::-;-1:-1:-1;31604:1:46;31593:13;;31477:135::o;31617:158::-;31710:6;31703:14;;;31687;;;31683:35;;31730:16;;31727:42;;;31749:18;;:::i;31780:168::-;31853:9;;;31884;;31901:15;;;31895:22;;31881:37;31871:71;;31922:18;;:::i;31953:127::-;32014:10;32009:3;32005:20;32002:1;31995:31;32045:4;32042:1;32035:15;32069:4;32066:1;32059:15;32085:217;32125:1;32151;32141:132;;32195:10;32190:3;32186:20;32183:1;32176:31;32230:4;32227:1;32220:15;32258:4;32255:1;32248:15;32141:132;-1:-1:-1;32287:9:46;;32085:217::o;32784:186::-;32832:4;-1:-1:-1;;;;;32857:6:46;32854:30;32851:56;;;32887:18;;:::i;:::-;-1:-1:-1;32953:2:46;32932:15;-1:-1:-1;;32928:29:46;32959:4;32924:40;;32784:186::o;32975:850::-;33063:6;33071;33124:2;33112:9;33103:7;33099:23;33095:32;33092:52;;;33140:1;33137;33130:12;33092:52;33179:9;33166:23;33218:1;33211:5;33208:12;33198:40;;33234:1;33231;33224:12;33198:40;33257:5;-1:-1:-1;33313:2:46;33298:18;;33285:32;-1:-1:-1;;;;;33329:30:46;;33326:50;;;33372:1;33369;33362:12;33326:50;33395:22;;33448:4;33440:13;;33436:27;-1:-1:-1;33426:55:46;;33477:1;33474;33467:12;33426:55;33517:2;33504:16;33542:52;33558:35;33586:6;33558:35;:::i;:::-;33542:52;:::i;:::-;33617:6;33610:5;33603:21;33665:7;33660:2;33651:6;33647:2;33643:15;33639:24;33636:37;33633:57;;;33686:1;33683;33676:12;33633:57;33741:6;33736:2;33732;33728:11;33723:2;33716:5;33712:14;33699:49;33793:1;33788:2;33779:6;33772:5;33768:18;33764:27;33757:38;33814:5;33804:15;;;;;32975:850;;;;;:::o;33830:127::-;33891:10;33886:3;33882:20;33879:1;33872:31;33922:4;33919:1;33912:15;33946:4;33943:1;33936:15;33962:160;34063:13;;34085:31;34063:13;34085:31;:::i;34127:880::-;34225:6;34285:3;34273:9;34264:7;34260:23;34256:33;34301:2;34298:22;;;34316:1;34313;34306:12;34298:22;-1:-1:-1;34358:22:46;;:::i;:::-;34410:9;34404:16;34429:33;34454:7;34429:33;:::i;:::-;34471:22;;34538:2;34523:18;;34517:25;34551:33;34517:25;34551:33;:::i;:::-;34611:2;34600:14;;34593:31;34690:2;34675:18;;;34669:25;34710:14;;;34703:31;34800:2;34785:18;;;34779:25;34820:14;;;34813:31;34889:3;34874:19;;34868:26;34903:33;34868:26;34903:33;:::i;35012:251::-;35082:6;35135:2;35123:9;35114:7;35110:23;35106:32;35103:52;;;35151:1;35148;35141:12;35103:52;35183:9;35177:16;35202:31;35227:5;35202:31;:::i;35268:798::-;35420:4;35462:3;35451:9;35447:19;35439:27;;35475:51;35516:9;35507:6;35501:13;35475:51;:::i;:::-;35596:4;35588:6;35584:17;35578:24;35575:1;35564:39;35557:4;35546:9;35542:20;35535:69;35674:4;35666:6;35662:17;35656:24;35653:1;35642:39;35635:4;35624:9;35620:20;35613:69;35738:4;35730:6;35726:17;35720:24;35713:4;35702:9;35698:20;35691:54;35832:1;35828;35823:3;35819:11;35815:19;35807:4;35799:6;35795:17;35789:24;35785:50;35776:6;35765:9;35761:22;35754:82;-1:-1:-1;;;;;35898:4:46;35890:6;35886:17;35880:24;35876:65;35867:6;35856:9;35852:22;35845:97;35989:4;35981:6;35977:17;35971:24;36004:56;36052:6;36041:9;36037:22;36023:12;-1:-1:-1;;;;;8192:46:46;8180:59;;8126:119;36071:450;36218:4;36258:1;36250:6;36247:13;36237:144;;36303:10;36298:3;36294:20;36291:1;36284:31;36338:4;36335:1;36328:15;36366:4;36363:1;36356:15;36237:144;36408:6;36397:9;36390:25;36451:2;36446;36435:9;36431:18;36424:30;36471:44;36511:2;36500:9;36496:18;36488:6;36471:44;:::i;36526:685::-;36605:6;36658:2;36646:9;36637:7;36633:23;36629:32;36626:52;;;36674:1;36671;36664:12;36626:52;36707:9;36701:16;-1:-1:-1;;;;;36732:6:46;36729:30;36726:50;;;36772:1;36769;36762:12;36726:50;36795:22;;36848:4;36840:13;;36836:27;-1:-1:-1;36826:55:46;;36877:1;36874;36867:12;36826:55;36910:2;36904:9;36935:52;36951:35;36979:6;36951:35;:::i;36935:52::-;37010:6;37003:5;36996:21;37058:7;37053:2;37044:6;37040:2;37036:15;37032:24;37029:37;37026:57;;;37079:1;37076;37069:12;37026:57;37127:6;37122:2;37118;37114:11;37109:2;37102:5;37098:14;37092:42;37179:1;37154:18;;;37174:2;37150:27;37143:38;;;;37158:5;36526:685;-1:-1:-1;;;;36526:685:46:o;38948:134::-;39025:13;;39047:29;39025:13;39047:29;:::i;39087:138::-;39166:13;;39188:31;39166:13;39188:31;:::i;39230:1621::-;39330:6;39374:9;39365:7;39361:23;39411:3;39407:2;39403:12;39427:2;39424:22;;;39442:1;39439;39432:12;39424:22;-1:-1:-1;39484:22:46;;:::i;:::-;39526:4;39522:2;39518:13;39515:33;;;39544:1;39541;39534:12;39515:33;39572:22;;:::i;:::-;39557:37;;39624:9;39618:16;39643:33;39668:7;39643:33;:::i;:::-;39685:24;;39754:2;39739:18;;39733:25;39767:33;39733:25;39767:33;:::i;:::-;39829:2;39816:16;;39809:33;39887:2;39872:18;;39866:25;39900:32;39866:25;39900:32;:::i;:::-;39961:2;39948:16;;39941:33;40019:2;40004:18;;39998:25;40032:31;39998:25;40032:31;:::i;:::-;40092:2;40079:16;;40072:33;40150:3;40135:19;;40129:26;40164:33;40129:26;40164:33;:::i;:::-;40226:3;40213:17;;40206:34;40249:22;;;40303:49;40346:4;40331:20;;40303:49;:::i;:::-;40298:2;40291:5;40287:14;40280:73;40385:48;40428:3;40417:9;40413:19;40385:48;:::i;:::-;40380:2;40369:14;;40362:72;40500:4;40485:20;;40479:27;40533:2;40522:14;;40515:31;;;40479:27;-1:-1:-1;40579:72:46;40646:3;40631:19;;40579:72;:::i;:::-;40573:3;40566:5;40562:15;40555:97;40686:50;40731:3;40720:9;40716:19;40686:50;:::i;:::-;40679:4;40672:5;40668:16;40661:76;40770:50;40815:3;40804:9;40800:19;40770:50;:::i;:::-;40764:3;40753:15;;40746:75;40757:5;39230:1621;-1:-1:-1;;;;39230:1621:46:o;40856:800::-;41223:44;41257:9;41249:6;41223:44;:::i;:::-;41318:13;;41315:1;41304:28;;;41298:3;41283:19;;41276:57;41402:4;41390:17;;41384:24;41370:39;;41364:3;41349:19;;41342:68;41465:4;41453:17;;41447:24;41441:3;41426:19;;41419:53;41527:4;41515:17;;;41509:24;41503:3;41488:19;;41481:53;41571:3;41565;41550:19;;41543:32;;;-1:-1:-1;41591:19:46;;;41584:30;41646:3;41631:19;;40856:800;-1:-1:-1;40856:800:46:o;41661:409::-;41806:6;41814;41867:2;41855:9;41846:7;41842:23;41838:32;41835:52;;;41883:1;41880;41873:12;41835:52;-1:-1:-1;;41928:16:46;;42034:2;42019:18;;;42013:25;41928:16;;42013:25;;-1:-1:-1;41661:409:46:o;42336:980::-;42431:6;42484:2;42472:9;42463:7;42459:23;42455:32;42452:52;;;42500:1;42497;42490:12;42452:52;42533:9;42527:16;-1:-1:-1;;;;;42558:6:46;42555:30;42552:50;;;42598:1;42595;42588:12;42552:50;42621:22;;42674:4;42666:13;;42662:27;-1:-1:-1;42652:55:46;;42703:1;42700;42693:12;42652:55;42736:2;42730:9;-1:-1:-1;;;;;42754:6:46;42751:30;42748:56;;;42784:18;;:::i;:::-;42830:6;42827:1;42823:14;42857:28;42881:2;42877;42873:11;42857:28;:::i;:::-;42919:19;;;42963:2;42993:11;;;42989:20;;;42954:12;;;;43021:19;;;43018:39;;;43053:1;43050;43043:12;43018:39;43085:2;43081;43077:11;43066:22;;43097:189;43113:6;43108:3;43105:15;43097:189;;;43203:10;;43226:18;;;43273:2;43130:12;;;;43203:10;;-1:-1:-1;43264:12:46;;;;43097:189;;;43305:5;42336:980;-1:-1:-1;;;;;;;42336:980:46:o;43503:230::-;43573:6;43626:2;43614:9;43605:7;43601:23;43597:32;43594:52;;;43642:1;43639;43632:12;43594:52;-1:-1:-1;43687:16:46;;43503:230;-1:-1:-1;43503:230:46:o;44842:249::-;44942:2;44931:17;;;44912;;;;44908:41;-1:-1:-1;;44964:50:46;;45026:34;45016:45;;44961:101;44958:127;;;45065:18;;:::i","linkReferences":{},"immutableReferences":{"6257":[{"start":1765,"length":32},{"start":15419,"length":32},{"start":15541,"length":32},{"start":15663,"length":32}],"6492":[{"start":1714,"length":32},{"start":14395,"length":32}],"6495":[{"start":998,"length":32},{"start":3800,"length":32},{"start":5783,"length":32},{"start":7280,"length":32},{"start":9111,"length":32},{"start":9249,"length":32},{"start":9428,"length":32},{"start":11423,"length":32},{"start":14622,"length":32},{"start":15200,"length":32},{"start":15373,"length":32},{"start":16507,"length":32},{"start":19225,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"ABSOLUTE_MAX_FEE()","signatureHash4":"0x3c2f373f","signatureHash32":"0x3c2f373f76150372ee3ab59900a33f1041c9767d6409696f28a13537a16104b7"},{"signature":"allowance(address,address,uint256)","signatureHash4":"0x598af9e7","signatureHash32":"0x598af9e790663e2ec4a910f5dc1004d5ec88d554e4f7184c3ed634ba7b371805"},{"signature":"approve(address,uint256,uint256)","signatureHash4":"0x426a8493","signatureHash32":"0x426a84935784c86892dc96a3146f2fd6c33e2458fd4351b418ad4b7ed492e93a"},{"signature":"authority()","signatureHash4":"0xbf7e214f","signatureHash32":"0xbf7e214f31a3f38fe9f4a469084b43f7ba2b08baeee33415b5739f90405e315f"},{"signature":"balanceOf(address,uint256)","signatureHash4":"0x00fdd58e","signatureHash32":"0x00fdd58ea0325fd79f486f8008ad3fad17dcb1cd2ee8474215c114771d87863e"},{"signature":"ballotGate()","signatureHash4":"0xe74c37f7","signatureHash32":"0xe74c37f7e17989786555ee12742f5ee8d25867bc66a8dbd72b74b4ed705cec8a"},{"signature":"beforeInitialize(address,(address,address,uint24,int24,address),uint160)","signatureHash4":"0xdc98354e","signatureHash32":"0xdc98354e711e2be5d28eff54c09e2e61c5b15fb066d17daaa5b71151b4ae5c5a"},{"signature":"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)","signatureHash4":"0x575e24b4","signatureHash32":"0x575e24b486f1b1168e84028b6b7338846844275788c5ca5249def3be2dfc2c03"},{"signature":"claimFeeAllTimeMin()","signatureHash4":"0xa23e4db5","signatureHash32":"0xa23e4db5f94724b8945baf911c09665e3818366dacc6037c4e3cbc1b0b17648e"},{"signature":"claimFeeBps()","signatureHash4":"0x7a526f4e","signatureHash32":"0x7a526f4ea31a42ee139529629fd283a67fb91a39d9058c48829ea911055e148c"},{"signature":"claimFeeChangeAt(uint256)","signatureHash4":"0xf4314f1d","signatureHash32":"0xf4314f1dcee325f083cfd8a16a2fdd9bcdf7311e27bccc96658529571057fcdb"},{"signature":"claimFeeFor(uint64)","signatureHash4":"0x113b9ac4","signatureHash32":"0x113b9ac44043ff44294332f0647a2fed91f0a8af2d883b57fbdb756c4227fa85"},{"signature":"claimFeeHistoryLength()","signatureHash4":"0x73392549","signatureHash32":"0x733925496690fe37d8e972421457e18b89dc6c5cda4ed38cc032799c1f3f9c27"},{"signature":"claimFeeOwed(address)","signatureHash4":"0x2384b554","signatureHash32":"0x2384b554563f3744afe76799235168fe9be926fb5e202c409d69b82142e82b61"},{"signature":"claimFeeRecipient()","signatureHash4":"0x7c5e62d0","signatureHash32":"0x7c5e62d05ca48c3d982c5779f2b9cdd514c1e50dce9f8dd68ab6cb2929e5f868"},{"signature":"claimFees((address,address,uint24,int24,address),int24,int24,address,uint16)","signatureHash4":"0x4e8d0048","signatureHash32":"0x4e8d0048ceabb29ac70fc54ef711d077cfe6efd4cf8b985af64a67f241e38459"},{"signature":"claimFeeSyncIndex(uint256)","signatureHash4":"0x9d1712c5","signatureHash32":"0x9d1712c557688a09ed9471abb5733c0d4c04f15fe2d51471ba0a0336d318421f"},{"signature":"clearPoke(bytes32)","signatureHash4":"0x5f4934a8","signatureHash32":"0x5f4934a8994c8f90265924a598c6977340b632b233f289ea8991c3a40ffff459"},{"signature":"currentFee(bytes32,bool)","signatureHash4":"0x15452022","signatureHash32":"0x15452022f86a87731a0a577462fcab1575bca830a782f730a7e4b1c064f5fcb3"},{"signature":"deposit((address,address,uint24,int24,address),int24,int24,uint128,uint128,uint128,uint256)","signatureHash4":"0x36a9ca1a","signatureHash32":"0x36a9ca1ac7b0931d5f7d7df818e8e287b38d3890ea0d47fc9e477fb88be9ef43"},{"signature":"distributor()","signatureHash4":"0xbfe10928","signatureHash32":"0xbfe1092824a473d6c8d0da813d5d1139666721be5f2404d5390f6f40141c93b5"},{"signature":"distributorFF()","signatureHash4":"0xbfcb4185","signatureHash32":"0xbfcb41853d4f3a540b3d1d19a13a4eb0cb7fac4d00a46f83a0477d9992006e79"},{"signature":"distributorOwed(address)","signatureHash4":"0x70233ddd","signatureHash32":"0x70233ddd81809d3cc647812e73b4ac8f6219703ae341e0f9d04e947db8e8df6b"},{"signature":"effectiveClaimFee(uint256)","signatureHash4":"0xd677eaad","signatureHash32":"0xd677eaad3961990fce8e27464c61f4396c1419c6d8218aec5abc201cc465c043"},{"signature":"ffFeeSink()","signatureHash4":"0x412b82c8","signatureHash32":"0x412b82c8b01407ca8a633e9693b9ab9f3f244ce3a73abc0cd153ad5545807745"},{"signature":"flatFee(bytes32)","signatureHash4":"0xd5a24724","signatureHash32":"0xd5a247245a2ed7af8133cc039f12d34f147faef55b054971bcfbee3b92a297a7"},{"signature":"isConsumingScheduledOp()","signatureHash4":"0x8fb36037","signatureHash32":"0x8fb360371b4a91c52d4438e929079942d9e7a4a71ec4811fe18ecb85a02bdb76"},{"signature":"isOperator(address,address)","signatureHash4":"0xb6363cf2","signatureHash32":"0xb6363cf22a903ddb0252d3040be13c800f50968777d79e703cc14d831ed9690c"},{"signature":"isSettling()","signatureHash4":"0x96f25d42","signatureHash32":"0x96f25d429f24a35204ce91cfa3410bfc162dfb4370a35de993bd32d16e0d88fa"},{"signature":"MAX_CLAIM_FEE_BPS()","signatureHash4":"0xf69ec158","signatureHash32":"0xf69ec158075f2b426b351489d01fa650a973881278abc3d17b4387d93f0a4235"},{"signature":"MAX_CLAIM_FEE_WALK()","signatureHash4":"0xf8c543ce","signatureHash32":"0xf8c543ce94e9c5857ff36219196c7db9982f277e7e23a9322dd8dbde0ca24daa"},{"signature":"maxFee(bytes32)","signatureHash4":"0xb11dcb23","signatureHash32":"0xb11dcb23e1b34aa3b91d4f321bc840298a221e770fab467c3cd192088d6439a2"},{"signature":"MAX_PAUSE()","signatureHash4":"0x999d55fb","signatureHash32":"0x999d55fbcf4b99e0f3c4c0bf0238cc6ca7e4601c2c2c8ddd4819099c432f58ad"},{"signature":"MAX_POKE_DISCOUNT_BPS()","signatureHash4":"0x7e445230","signatureHash32":"0x7e4452300c547e1f59634b10a1379325b95918d268cce54d1f3913f809644280"},{"signature":"MAX_POKE_TTL()","signatureHash4":"0x63cb7bdf","signatureHash32":"0x63cb7bdf5db4a9bedf89986670c1f4ca1af10c6de7db52ee4c82a6f734ebee1d"},{"signature":"MIN_POOL_FEE()","signatureHash4":"0xa6acaacc","signatureHash32":"0xa6acaacc69019135ab3c6f11ad0a17aa0bb698867576232fc73fb0f17107b46a"},{"signature":"paused()","signatureHash4":"0x5c975abb","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2"},{"signature":"pausedUntil()","signatureHash4":"0xda748b10","signatureHash32":"0xda748b10ab7e0cf81ee5adb800ea3a8dd117fcb279016b578860d4a9aab9e3c7"},{"signature":"pause(uint256)","signatureHash4":"0x136439dd","signatureHash32":"0x136439dd367a2279ad5b98410f8653eaedd33f0a9a15a74a0fa7d27dbb7b778b"},{"signature":"pokeFee(bytes32,uint24,uint40)","signatureHash4":"0x8aebf0c1","signatureHash32":"0x8aebf0c190db55cbd0ee22229d23fd38fb55001736fc98c8c756e5c10dce447f"},{"signature":"pokeFloor(bytes32)","signatureHash4":"0x5cd04cf8","signatureHash32":"0x5cd04cf83166192fdd02ad6788c0d3185e37f4176631f4a3280ac3951cf4914d"},{"signature":"pokeOf(bytes32)","signatureHash4":"0x966af35a","signatureHash32":"0x966af35af6241bcc8c043083a051089156d5a1048fd3ad27c75fa7d816330d89"},{"signature":"poolManager()","signatureHash4":"0xdc4c90d3","signatureHash32":"0xdc4c90d3c2342c5afe26871a21a4ecf482fcb45ae1ac8294d1dcff7a134352c0"},{"signature":"rangeGrowth(uint256)","signatureHash4":"0x936852d4","signatureHash32":"0x936852d4ddbf71e93603754de7c8e8f7007c938ae22323b0d4996071caeb36e8"},{"signature":"rangeId(bytes32,int24,int24)","signatureHash4":"0xdf848a9f","signatureHash32":"0xdf848a9fcf2e497bd0e468ea4ae0cf938cfa5e28d6323cb7e0a2db11e6f79bcc"},{"signature":"rangeKey(uint256)","signatureHash4":"0x2e32a3b0","signatureHash32":"0x2e32a3b02be8c0af994b24adf22ac1bab531a53102855e60eeffc045704c2f19"},{"signature":"rangeState(uint256)","signatureHash4":"0x41b69b2a","signatureHash32":"0x41b69b2acbf66081c405cb633ec7d7e8be8648d37fdab6d72651dd1be9ddbd1b"},{"signature":"setAuthority(address)","signatureHash4":"0x7a9e5e4b","signatureHash32":"0x7a9e5e4b0fcd5d26f54a5ddb833b014450a2d8c913fa9b2622bbd5aad903cdf4"},{"signature":"setBallotGate(address)","signatureHash4":"0xae4a5785","signatureHash32":"0xae4a57852221512b9d9228d8667e79a7e9f5f33f8ba1ef5a1fe1be56b7d876ab"},{"signature":"setClaimFee(address[],uint16,address)","signatureHash4":"0x09974324","signatureHash32":"0x09974324e7c4ba486c79810d9767600ba709d3fa93c7127a65d899305015da17"},{"signature":"setDistributor(address[],address)","signatureHash4":"0xd0ba2baa","signatureHash32":"0xd0ba2baa7e043af2a0b26eb9a4a9bd94b7ee8fe880c31a778191fe41e2772c4d"},{"signature":"setFFFeeSink(address[],address)","signatureHash4":"0x26f5ef52","signatureHash32":"0x26f5ef52778c81798dc9540d8bb54c702cb760a17e62ab35e97b53ce3a72882d"},{"signature":"setOperator(address,bool)","signatureHash4":"0x558a7297","signatureHash32":"0x558a7297e60ce7d5583faecd6aae4a6ab582122664c6d398de0fd446fc6bd50c"},{"signature":"setPaused(uint256)","signatureHash4":"0x51789ea2","signatureHash32":"0x51789ea2dbd858488e0169e25c832e65fa9ca1daf76324681b2625bf7cabad4a"},{"signature":"setPoolConfig((address,address,uint24,int24,address),uint24,uint24,uint24)","signatureHash4":"0x4dc4b5c9","signatureHash32":"0x4dc4b5c9bbb799889ab6a81790ada4818ec0d5fe8d2f76d82373936f0d27bc91"},{"signature":"stake((address,address,uint24,int24,address),int24,int24,uint128)","signatureHash4":"0x5ca34469","signatureHash32":"0x5ca344694d874a5c198c0fca56f88a7cf7fe204def3fe94019dd143de13ff844"},{"signature":"supportsInterface(bytes4)","signatureHash4":"0x01ffc9a7","signatureHash32":"0x01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2"},{"signature":"sweepClaimFee(address)","signatureHash4":"0xab9e5bfd","signatureHash32":"0xab9e5bfde0274fe7f7724eb6f7af5113299edfe0e6abe0d7716d2afcb3236853"},{"signature":"sweepDistributor(address)","signatureHash4":"0xbdde80c6","signatureHash32":"0xbdde80c6faf6e0f41164c64541bb69a4701110b2c7ba892ecdc6420425036fa4"},{"signature":"syncRanges(uint256,uint256[])","signatureHash4":"0x7fa7b6ac","signatureHash32":"0x7fa7b6ac1d41c675678fa665c0a41d2fc2e3e443324ca727134c1081eefb6beb"},{"signature":"transfer(address,uint256,uint256)","signatureHash4":"0x095bcdb6","signatureHash32":"0x095bcdb627e21ee89c38dc5069f89166d365b3cd89be90dff87796149e866e2f"},{"signature":"transferFrom(address,address,uint256,uint256)","signatureHash4":"0xfe99049a","signatureHash32":"0xfe99049a9a891a3a7b948d65ebb3fcf78f9e719f4934b6a4d22f78fc9c099d20"},{"signature":"unlockCallback(bytes)","signatureHash4":"0x91dd7346","signatureHash32":"0x91dd7346410d7d3e1561ab65859d8ebbee84f666c7eb10ddc6d9424bc35ec2ee"},{"signature":"unstake((address,address,uint24,int24,address),int24,int24,uint128)","signatureHash4":"0xdaf58566","signatureHash32":"0xdaf5856655d39deac404361dbccfd8610e835680a75509add2df6f4f988ba7ca"},{"signature":"userPosition(uint256,address)","signatureHash4":"0x4eb5c4fd","signatureHash32":"0x4eb5c4fd6c0e47f0db1c8b05be594ee42c0f150a4e45171381f91ee7bf546b1f"},{"signature":"weth()","signatureHash4":"0x3fc8cef3","signatureHash32":"0x3fc8cef3584510d52761a06b1790c486c391517f6e5b3918a42917c24e69d082"},{"signature":"withdraw((address,address,uint24,int24,address),int24,int24,uint128,address,uint128,uint128,uint256)","signatureHash4":"0xa2ba1fc8","signatureHash32":"0xa2ba1fc8d7ab7a6c5b73f183bcb72c070776c09dd670a6ab37535e459fbe17f4"}],"event":[{"signature":"Approval(address,address,uint256,uint256)","signatureHash4":"0xb3fd5071","signatureHash32":"0xb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a7"},{"signature":"AuthorityUpdated(address)","signatureHash4":"0x2f658b44","signatureHash32":"0x2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad"},{"signature":"BallotGateSet(address)","signatureHash4":"0xc80643d3","signatureHash32":"0xc80643d3134fd859c3f5fd2eccd8829c819d3d91c4fe8b44fd79a1b549b2f6ba"},{"signature":"ClaimFeeSet(uint16,address)","signatureHash4":"0x0b65005d","signatureHash32":"0x0b65005dca60b48350109d190e3b76d743e84c39c00cc378a5a9af1770570c87"},{"signature":"ClaimFeeSwept(address,address,uint256)","signatureHash4":"0x8433fc39","signatureHash32":"0x8433fc399fe390949e8c0e579efdbdbe6d00502e208f6aaa46e22036e0808664"},{"signature":"Deposited(address,uint256,uint128)","signatureHash4":"0x1101ae99","signatureHash32":"0x1101ae99036692e99100b857ab62c3fcdac65cfdc42b08739812e2e2bbaec38a"},{"signature":"DistributorSet(address)","signatureHash4":"0x86719c51","signatureHash32":"0x86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a9485886"},{"signature":"DistributorSwept(address,address,uint256)","signatureHash4":"0x3f9fbb29","signatureHash32":"0x3f9fbb29ea290941cbe721706cd11b2bc9fc665269cf4d992c1cdd0168a82cb8"},{"signature":"FeePoked(bytes32,uint24,uint40)","signatureHash4":"0xcb123ffc","signatureHash32":"0xcb123ffca193ebeb3d5c30d267785371dd417ff0084b636bff5d03f87a2c8e04"},{"signature":"FeesClaimed(address,uint256,uint256,uint256)","signatureHash4":"0xd49b3288","signatureHash32":"0xd49b328847f240dd41d9f8a97b5334cb8d06f55e51ce78bacd364d5c62136d77"},{"signature":"FeesCollected(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint128,uint128,uint64,uint64)","signatureHash4":"0x9e834ab6","signatureHash32":"0x9e834ab6101f9c499217a2a750235dc43735a65c69369e5f54810a468df96309"},{"signature":"FeesForgone(address,uint256,uint256,uint256)","signatureHash4":"0x7f46856f","signatureHash32":"0x7f46856fb5c40ab4d199da368381e12a4f3f4a36b31979b75fb0857d75d5ea7d"},{"signature":"FFFeeSinkSet(address)","signatureHash4":"0x479dc00e","signatureHash32":"0x479dc00e1bc56599c64530e9d4b65a83aeec94a50320dcc036d4e6c656d06834"},{"signature":"NativeRevenueWrappedToWeth(address,address,uint256)","signatureHash4":"0xb915276e","signatureHash32":"0xb915276e16976fd3b4e49e091fe1539cab0a415c09ff28c734fb2170badc546e"},{"signature":"OperatorSet(address,address,bool)","signatureHash4":"0xceb576d9","signatureHash32":"0xceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa267"},{"signature":"PausedSet(uint256)","signatureHash4":"0x18cc7643","signatureHash32":"0x18cc76435a425170cbce2e796e856f6d0e03afce7351c7cad2368098d79df921"},{"signature":"PokeCleared(bytes32)","signatureHash4":"0xb8fae5f4","signatureHash32":"0xb8fae5f44b3e1ea6cb10a6d677d5a9441301da4f60509c3ecccf8c67d34a50cb"},{"signature":"PoolConfigured(bytes32,uint24,uint24,uint24)","signatureHash4":"0x0cd5d077","signatureHash32":"0x0cd5d07754e72da6a4377b10c0e71af087f26ee3d83fe1477267deb81b4a9fd5"},{"signature":"Staked(address,uint256,uint128)","signatureHash4":"0x5f1526e1","signatureHash32":"0x5f1526e127c2ae64abea3117909f2c3ba68d66b293ec1256c0c0025cf7ade21a"},{"signature":"Transfer(address,address,address,uint256,uint256)","signatureHash4":"0x1b3d7edb","signatureHash32":"0x1b3d7edb2e9c0b0e7c525b20aaaef0f5940d2ed71663c7d39266ecafac728859"},{"signature":"Unstaked(address,uint256,uint128)","signatureHash4":"0x3f58555a","signatureHash32":"0x3f58555a19e04d0ac05f036e483136cdab4628e29210be59809a5184983057b6"},{"signature":"Withdrawn(address,uint256,uint128)","signatureHash4":"0x07b03e31","signatureHash32":"0x07b03e311473c1939a1fefecdf08517eedbe848e20a7d5f4ac265ec4bae8c7a0"}],"error":[{"signature":"AccessManagedInvalidAuthority(address)","signatureHash4":"0xc2f31e5e","signatureHash32":"0xc2f31e5ee06c96eddd5864bf58d26da15afa7233cb6f74e000aa686fca7a7a0b"},{"signature":"AccessManagedRequiredDelay(address,uint32)","signatureHash4":"0xaf77169d","signatureHash32":"0xaf77169dad650be42a753d4bbd4f4ad0d10be80053e495da3bb1525746eda4e4"},{"signature":"AccessManagedUnauthorized(address)","signatureHash4":"0x068ca9d8","signatureHash32":"0x068ca9d827f779c08fd30d7fda45faef5f2a6b2e57f8b809b3c6bbed99f5fb1f"},{"signature":"BallotGateUnset()","signatureHash4":"0x4e3fb44d","signatureHash32":"0x4e3fb44dec5c2b44e688a16aef3b0091f8abb1cef5fde630111426b8e333fede"},{"signature":"ClaimFeeAboveMax()","signatureHash4":"0x663fffd9","signatureHash32":"0x663fffd933ff87a3ada90b16bb3c5c69052ba5b7e8333c5c5f91829c0c782444"},{"signature":"DeadlineExpired()","signatureHash4":"0x1ab7da6b","signatureHash32":"0x1ab7da6b04cf80fcc6534c1f63ce7b24fd7488ab40444b4e5271ccc1c7f64567"},{"signature":"DeskRetired()","signatureHash4":"0x5636f588","signatureHash32":"0x5636f5883d4ce2e29ad41e2be63b9247ef78195bc75566b41d45a60fa565fd6c"},{"signature":"DistributorNotFFAware()","signatureHash4":"0x503abbae","signatureHash32":"0x503abbaec42c9caf757aa1ace2729c53fc710a765a1c8e580e4f7114c9dd0f0d"},{"signature":"FeeAboveCap()","signatureHash4":"0x652853ee","signatureHash32":"0x652853ee57d97798ec046582f17a2745ea6da5ebbb96f1e99f22f7744cc5f405"},{"signature":"FeeBelowFloor()","signatureHash4":"0x86eadbf8","signatureHash32":"0x86eadbf81fc0d5caccef06030bc80bb99523966ee6692be06f54d3a10a6527a0"},{"signature":"InsufficientUnstakedShares()","signatureHash4":"0x1a616203","signatureHash32":"0x1a616203b51b18faee60e62c7ec0d722259c97fe3743684617ed93eab80af5e0"},{"signature":"InvalidBallotGate()","signatureHash4":"0x8fadf879","signatureHash32":"0x8fadf879609380d107c901662344fede92c986771406c82467e67b6b5ca49a41"},{"signature":"InvalidClaimFee()","signatureHash4":"0xaf2eb373","signatureHash32":"0xaf2eb3733f0b01fdcf8a85dbba818ccea108b89500fa53d2d020dfa005a3b56d"},{"signature":"InvalidConfig()","signatureHash4":"0x35be3ac8","signatureHash32":"0x35be3ac88eaaf385e6b33d44d849a44bdc3ae215676d5d7e0194dfe20d80c66e"},{"signature":"InvalidMaxFee()","signatureHash4":"0xa51d0c81","signatureHash32":"0xa51d0c8172d729a90ee960cbf8546f6888ce71357c84704f7160eae53385e4ac"},{"signature":"InvalidMsgValue()","signatureHash4":"0x1841b4e1","signatureHash32":"0x1841b4e1b5bc2b6ee2d929f61c1a6d695028c1b47aa99b13e72b417bfaebc3cd"},{"signature":"InvalidSink()","signatureHash4":"0x43c829db","signatureHash32":"0x43c829dbdfb9b08e1f1c8e321f4e742bbec917382c6517381ac008d814b5216a"},{"signature":"InvalidTtl()","signatureHash4":"0x3dc68a66","signatureHash32":"0x3dc68a66f9649c3dbcd304b2fa6aec4489735fb568cb9bdb5600628fc8ff8422"},{"signature":"LedgerPaused()","signatureHash4":"0xb359f269","signatureHash32":"0xb359f2697d31ae2a1ee461994fb769d48a38c28e1e3f85a7462af90d07cae4c1"},{"signature":"NativeNotSupported()","signatureHash4":"0x0a7287b5","signatureHash32":"0x0a7287b53700eec7b0c6d116e2238d1f17007514dc6f8df8082cef415d9aab88"},{"signature":"NotAVoterOfThisPool()","signatureHash4":"0xc8563b30","signatureHash32":"0xc8563b30d404fe0c60616a66b72c3e36b91da1248c1b8659a7cab2e18d75cc9d"},{"signature":"NotDynamicFeePool()","signatureHash4":"0x09a90e81","signatureHash32":"0x09a90e816b87f2cfca523a8bbfe5ae780d49e3606e7a0d3dcd323401fc851a78"},{"signature":"NothingToClaim()","signatureHash4":"0x969bf728","signatureHash32":"0x969bf7288f744225521096ebffff657851af77dd4c63700d76b8d1cf6481d1f1"},{"signature":"NotPoolManager()","signatureHash4":"0xae18210a","signatureHash32":"0xae18210ab62e9620e84799499bafdb3202a30943ba8cb533c4bac9cdc8ced60b"},{"signature":"PauseTooLong()","signatureHash4":"0x2d0e7c62","signatureHash32":"0x2d0e7c62c3004e23a0e6cfb9523d8d9d3ef4f7dd22c0e54fbcc0499aa7fa4998"},{"signature":"PoolNotConfigured()","signatureHash4":"0xd64e375e","signatureHash32":"0xd64e375efadad4ef47fb8523a2c1fd859026c68de6ac6c9e154bc74f08794702"},{"signature":"PrincipalAboveMax(uint256,uint256)","signatureHash4":"0x0f569baf","signatureHash32":"0x0f569bafa9acd9735503aa760f42c2fc84bfb4d4136a2d9340b03628646ed017"},{"signature":"PrincipalBelowMin(uint256,uint256)","signatureHash4":"0xce83acfa","signatureHash32":"0xce83acfa0a1dfdff43552176bbfd7b27ab02bd7f08333fd019a28976a929f462"},{"signature":"ReentrancyGuardReentrantCall()","signatureHash4":"0x3ee5aeb5","signatureHash32":"0x3ee5aeb571de7fc460830b4d0017439a1ca56fb0bc39062227ade4fe4a24c1ca"},{"signature":"RefundFailed()","signatureHash4":"0xf0c49d44","signatureHash32":"0xf0c49d4437f0028ece28fc9bff21e443212a27b39a47d2faf9bc1138111d9460"},{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"},{"signature":"UnauthorizedETHSender()","signatureHash4":"0xb722356c","signatureHash32":"0xb722356c270d702056034a1d0ef7dc22b6618a4f531462d4992fd3989809792a"},{"signature":"ZeroAddress()","signatureHash4":"0xd92e233d","signatureHash32":"0xd92e233df2717d4a40030e20904abd27b68fcbeede117eaaccbbdac9618c8c73"},{"signature":"ZeroLiquidity()","signatureHash4":"0x10074548","signatureHash32":"0x100745484141de1668a86d92bc9492f0aa44f9945862280657cd34aacf118cd5"},{"signature":"ZeroShares()","signatureHash4":"0x9811e0c7","signatureHash32":"0x9811e0c7eeca2ee0fa751e2e19d78682ad689ea04816cfe0cf1c5863234abd3f"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"4663","address":"0x06a889870C8f83640D6816319f72e2aA579b6080"}