{"matchId":"43132191","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-07-31T18:38:14Z","creationBytecode":{"onchainBytecode":"0x60803461010257601f6134a338819003918201601f19168301916001600160401b0383118484101761010657808492604094855283398101031261010257805160ff81160361010257602001516001600160a01b03811603610102575f5160206134835f395f51905f525460ff8160401c166100f3576002600160401b03196001600160401b0382160161009d575b604051613368908161011b8239f35b6001600160401b0319166001600160401b039081175f5160206134835f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61008e565b63f92ee8a960e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461230c578063095ea7b31461227d57806313007d551461225657806318160ddd1461222657806323b872dd146121f7578063313ce567146121dc5780633644e515146121545780633abc107914611ddf5780633b6f743b14611c825780633f4ba83a14611ba857806340c10f19146119a557806342966c68146119405780634904ac8f1461188857806353735f37146118595780635c975abb1461182b5780635e280f11146117a95780636c2eb350146116ef57806370a08231146116ab57806379cc6790146116395780637ecebe0014611607578063804d4ffc146114675780638456cb591461136b578063857749b01461135057806395d89b411461126257806397e2b9af146112365780639f68b9641461121c578063a781a3fd146111f1578063a850e02414611138578063a9059cbb14611107578063b84c824614610f59578063c47f002714610d6a578063c7c7f5b3146109a8578063d4ec137a14610961578063d505accf1461079b578063d5abeb0114610781578063d8ddf18f14610752578063db0ed6a0146102cc578063dd62ed3e14610298578063f0b7db4e14610264578063f5eb42dc14610232578063fc0c546a146102185763fe575a87146101e7575f80fd5b3461021457602036600319011261021457602061020a610205612351565b612b6b565b6040519015158152f35b5f80fd5b34610214575f366003190112610214576020604051308152f35b346102145760203660031901126102145761024b612351565b6387a211a2600c525f52602080600c2054604051908152f35b34610214575f366003190112610214575f5160206132e85f395f51905f52546040516001600160a01b039091168152602090f35b346102145760403660031901126102145760206102c46102b6612351565b6102be612367565b90612b2e565b604051908152f35b346102145760a0366003190112610214576004356001600160401b038111610214576102fc903690600401612492565b6024356001600160401b0381116102145761031b903690600401612492565b906044356001600160a01b0381169081810361021457610339612393565b9261034261237d565b505f5160206133285f395f51905f5254936001600160401b0360ff8660401c161595168015908161074a575b6001149081610740575b159081610737575b50610728578460016001600160401b03195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556106f3575b6001600160a01b03169283156106e457156106e4578051156106d5578451156106c6578051906001600160401b0382116106175761040a826104055f5160206133485f395f51905f52546124e7565b61298a565b602090601f831160011461062b5761043992915f918361058b575b50508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b83516001600160401b03811161061757610479816104745f5160206132a85f395f51905f52546124e7565b61292e565b6020601f82116001146105965790806104ac926104c09596975f9261058b5750508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f52556127cc565b5f5160206132c85f395f51905f5280546fffffffffffffffffffffffffffffffff1916670de0b6b3a76400001790555f5160206132e85f395f51905f5280546001600160a01b03191682179055610515613224565b6bffffffffffffffffffffffff60a01b5f5416175f55610533613224565b61053957005b60ff60401b195f5160206133285f395f51905f5254165f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508780610425565b601f198216955f5160206132a85f395f51905f525f52815f20965f5b8181106105ff5750916104c0959697918460019594106105e7575b505050811b015f5160206132a85f395f51905f52556127cc565b01515f1960f88460031b161c191690558680806105cd565b838301518955600190980197602093840193016105b2565b634e487b7160e01b5f52604160045260245ffd5b90601f198316915f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372925f5b8181106106ae5750908460019594939210610696575b505050811b015f5160206133485f395f51905f5255610449565b01515f1960f88460031b161c1916905586808061067c565b92936020600181928786015181550195019301610666565b63010466f160e21b5f5260045ffd5b63430f13b360e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6801000000000000000060ff60401b195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556103b6565b63f92ee8a960e01b5f5260045ffd5b90501587610380565b303b159150610378565b86915061036e565b346102145760203660031901126102145760206102c46001600160801b03610778612900565b16600435613026565b34610214575f3660031901126102145760206102c46129e6565b346102145760e0366003190112610214576107b4612351565b6107bc612367565b604435916064356084359260ff84168403610214576001600160a01b0316936e22d473030f116ddee9f6b43ac78ba385188119151715610954576107fe61251f565b6020815191012090824211610947576040519360018060a01b03169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361093a577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b34610214575f366003190112610214577f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185802546040516001600160a01b039091168152602090f35b6080366003190112610214576004356001600160401b0381116102145760e081600401916003199036030112610214576040366023190112610214576109ec612393565b6109f4612637565b506109fd61261f565b50610a06612d3a565b610a0f33612d61565b610a17612637565b50610a2061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b81526001600160a01b0390911691602082600481865afa918215610bf8576004926020915f91610d3d575b50604051631c2eb17b60e31b815293849182906001600160a01b03165afa8015610bf8575f90610cf8575b60c092506001600160a01b031680151580610ced575b610c03575b5060405192838080936362385ce160e11b825233600483015260a06024830152610ad960a48301896126e2565b906024356044840152604435606484015260018060a01b03166084830152039134905af1918215610bf8575f915f93610b72575b50815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b0390f35b9150915060c03d60c011610bf1575b610b8b8183612471565b81019080820360c08112610214576080136102145760405191610bad83612456565b8151835260208201516001600160401b038116810361021457610bea926080916020860152610bdf8360408301612669565b604086015201612669565b9183610b0d565b503d610b81565b6040513d5f823e3d90fd5b602435610c406040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b8361324f565b60205f604051928284019063095ea7b360e01b8252886024860152604485015260448452610c6f606485612471565b83519082865af15f513d82610cd1575b505015610c8d575b50610aac565b610cca91610cc560405163095ea7b360e01b60208201528760248201525f604482015260448152610cbf606482612471565b8261324f565b61324f565b8480610c87565b909150610ce55750813b15155b8780610c7f565b600114610cde565b506024351515610aa7565b50906020813d602011610d35575b81610d1360209383612471565b810103126102145751906001600160a01b03821682036102145760c091610a91565b3d9150610d06565b610d5d9150823d8411610d63575b610d558183612471565b81019061282c565b86610a66565b503d610d4b565b3461021457610d78366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610dc4915f91610f2a575b5061278d565b6001600160401b03821161061757610ded826104055f5160206133485f395f51905f52546124e7565b5f91601f8111600114610e7257610e3b81807f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf955f91610e67575b508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b610e626040519283926020845260208401916126c2565b0390a1005b905084013586610e28565b601f198116925f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372905f5b858110610f125750827f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf9510610ef9575b5050600181811b015f5160206133485f395f51905f5255610e4b565b8301355f19600384901b60f8161c191690558380610edd565b90916020600181928588013581550193019101610eac565b610f4c915060203d602011610f52575b610f448183612471565b810190612775565b84610dbe565b503d610f3a565b3461021457610f67366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610fb2915f91610f2a575061278d565b6001600160401b03821161061757610fdb826104745f5160206132a85f395f51905f52546124e7565b5f91601f811160011461104e5761102881807f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99955f91610e6757508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f5255610e626040519283926020845260208401916126c2565b5f5160206132a85f395f51905f525f908152601f198216937f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc915b8581106110ef5750827f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c9995106110d6575b5050600181811b015f5160206132a85f395f51905f5255610e4b565b8301355f19600384901b60f8161c1916905583806110ba565b90916020600181928588013581550193019101611089565b346102145760403660031901126102145761112d611123612351565b6024359033612c10565b602060405160018152f35b34610214576020366003190112610214576004356001600160801b03811690818103610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576111a6915f91610f2a575061278d565b81156111e2577f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13916111d960209261284b565b604051908152a1005b637c946ed760e01b5f5260045ffd5b34610214575f36600319011261021457602061120b612900565b6001600160801b0360405191168152f35b34610214575f3660031901126102145760206040515f8152f35b3461021457604036600319011261021457602061020a611254612351565b61125c612367565b9061287f565b34610214575f366003190112610214576040515f5f5160206132a85f395f51905f525461128e816124e7565b808452906001811690811561132c57506001146112c2575b610b6e836112b681850382612471565b60405191829182612327565b5f5160206132a85f395f51905f525f9081527f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc939250905b808210611312575090915081016020016112b66112a6565b9192600181602092548385880101520191019092916112fa565b60ff191660208086019190915291151560051b840190910191506112b690506112a6565b34610214575f36600319011261021457602060405160098152f35b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576113c3915f91611448575061278d565b6113cb612d3a565b600160ff195f5160206133085f395f51905f525416175f5160206133085f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a16040514281527fba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd660203092a2005b611461915060203d602011610f5257610f448183612471565b82610dbe565b34610214576040366003190112610214575f546040516395a8c58d60e01b8152336004808301919091526002602480840191909152359290359190602090829060449082906001600160a01b03165afa8015610bf8576114cd915f91610f2a575061278d565b6114d5613149565b801515806115fe575b156115ef575f5160206132c85f395f51905f52546001600160801b0316806115e157506001600160801b03670de0b6b3a76400005b1661151f838383613171565b926001600160801b0384116115c95792608092917f8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b946115676001600160801b03841661284b565b7f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf136020604051858152a1604051938452602084015260408301526060820152a160206001600160801b035f5160206132c85f395f51905f525416604051908152f35b836306dfcc6560e41b5f52608060045260245260445ffd5b6001600160801b0390611513565b631d94864560e11b5f5260045ffd5b508115156114de565b3461021457602036600319011261021457611620612351565b6338377508600c525f52602080600c2054604051908152f35b3461021457604036600319011261021457611652612351565b5f546040516395a8c58d60e01b8152336004820152600260248201529190602090839060449082906001600160a01b03165afa918215610bf8576116a9926116a0915f91610f2a575061278d565b60243590612e53565b005b34610214576020366003190112610214576116c4612351565b6387a211a2600c525f5260206102c481600c20546001600160801b036116e8612900565b1690612f9f565b34610214575f366003190112610214575f5160206133285f395f51905f525460ff8160401c16908115611794575b50610728575f5160206133285f395f51905f52805468ffffffffffffffffff1916680100000000000000048117909155600417611758613224565b5f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160048152a1005b600491506001600160401b031610158161171d565b34610214575f366003190112610214575f5160206132e85f395f51905f5254604051635e280f1160e01b815290602090829060049082906001600160a01b03165afa8015610bf8576020915f9161180e575b506040516001600160a01b039091168152f35b6118259150823d8411610d6357610d558183612471565b826117fb565b34610214575f36600319011261021457602060ff5f5160206133085f395f51905f5254166040519015158152f35b346102145760203660031901126102145760206102c46001600160801b0361187f612900565b16600435612f9f565b34610214576020366003190112610214576118a1612351565b5f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576118e9915f91611921575061278d565b6118f2816127cc565b6001600160a01b03167fc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea45f80a2005b61193a915060203d602011610f5257610f448183612471565b83610dbe565b34610214576020366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611999915f91611448575061278d565b6116a960043533612e53565b34610214576040366003190112610214576119be612351565b5f546040516395a8c58d60e01b81523360048201526002602480830191909152359291602090829060449082906001600160a01b03165afa8015610bf857611a0c915f91610f2a575061278d565b6001600160a01b03811680156106e4575f5160206132e85f395f51905f52546001600160a01b031690611a3e33612bcb565b15611b27575b50506805345cdf77eb68f44c5490611a6c6001600160801b03611a65612900565b1684613026565b91828101908110611b02576001600160801b03611a87612900565b16670de0b6b3a7640000611a9c8183856130c3565b918309611b11575b611aac6129e6565b10611b02576805345cdf77eb68f44c556387a211a2600c525f526020600c20908154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3005b63e5cfe95760e01b5f5260045ffd5b60010180611aa4575b63ae47f7025f526004601cfd5b8115611b99576020906044604051809481936383609b0f60e01b83525f600484015260248301525afa908115610bf8575f91611b7a575b5015611b6b578280611a44565b6315df7de160e31b5f5260045ffd5b611b93915060203d602011610f5257610f448183612471565b83611b5e565b630588ca9560e01b5f5260045ffd5b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611c00915f91611448575061278d565b611c08613149565b60ff195f5160206133085f395f51905f5254165f5160206133085f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a16040514281527fcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de60203092a2005b34610214576040366003190112610214576004356001600160401b0381116102145760e06003198236030112610214576024359081151580920361021457611cc861261f565b505f5160206132e85f395f51905f525460405163f99e156960e01b81523060048201526001600160a01b0390911690602081602481855afa908115610bf8575f91611daa575b5090604092611d43928451958694859384936315efa6af60e11b855260048501526060602485015260648401906004016126e2565b90604483015203915afa8015610bf8575f90611d6f575b60409060208251918051835201516020820152f35b5060403d604011611da3575b611d858183612471565b81019060408183031261021457604091611d9e91612669565b611d5a565b503d611d7b565b9190506020823d602011611dd7575b81611dc660209383612471565b810103126102145790516040611d0e565b3d9150611db9565b60a0366003190112610214576004356001600160401b03811161021457806004019060e0600319823603011261021457611e17612367565b604036604319011261021457611e2b61237d565b91611e34612637565b50611e3d61261f565b50611e46612d3a565b611e4f82612d61565b611e5833612bcb565b1561210b575b50611e67612637565b50611e7061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b815291906001600160a01b0316602083600481845afa928315610bf8576004936020915f916120ee575b50604051631c2eb17b60e31b815294859182906001600160a01b03165afa8015610bf8575f906120a9575b60c093506001600160a01b03168015158061209e575b611fc5575b5060405180809581946362385ce160e11b835260018060a01b0316600483015260a06024830152611f2f60a48301896126e2565b604480359084015260648035908401526001600160a01b039091166084830152039134905af1918215610bf8575f915f93610b725750815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b604435611ffc6040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b60205f604051928284019063095ea7b360e01b825286602486015260448501526044845261202b606485612471565b83519082865af15f513d82612082575b505015612049575b50611efb565b61207b91610cc560405163095ea7b360e01b60208201528560248201525f604482015260448152610cbf606482612471565b8580612043565b9091506120965750813b15155b888061203b565b60011461208f565b506044351515611ef6565b50916020813d6020116120e6575b816120c460209383612471565b810103126102145751916001600160a01b03831683036102145760c092611ee0565b3d91506120b7565b6121059150823d8411610d6357610d558183612471565b87611eb5565b6044633b9aca0091013504633b9aca00810290808204633b9aca0014901517156121405761213a903383612df5565b83611e5e565b634e487b7160e01b5f52601160045260245ffd5b34610214575f36600319011261021457602060a061217061251f565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b34610214575f36600319011261021457602060405160128152f35b3461021457606036600319011261021457602061020a612215612351565b61221d612367565b604435916125ee565b34610214575f3660031901126102145760206102c46805345cdf77eb68f44c546001600160801b036116e8612900565b34610214575f366003190112610214575f546040516001600160a01b039091168152602090f35b3461021457604036600319011261021457612296612351565b602435906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba318821915171561095457602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b34610214575f36600319011261021457610b6e6112b661251f565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361021457565b602435906001600160a01b038216820361021457565b608435906001600160a01b038216820361021457565b606435906001600160a01b038216820361021457565b909291602060a09181604060c0860197805187526001600160401b0383820151168388015201518051604087015201516060850152805160808501520151910152565b906020600319830112610214576004356001600160401b0381116102145782602382011215610214578060040135926001600160401b0384116102145760248483010111610214576024019190565b604081019081106001600160401b0382111761061757604052565b606081019081106001600160401b0382111761061757604052565b90601f801991011681019081106001600160401b0382111761061757604052565b81601f82011215610214578035906001600160401b03821161061757604051926124c6601f8401601f191660200185612471565b8284526020838301011161021457815f926020809301838601378301015290565b90600182811c92168015612515575b602083101461250157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916124f6565b604051905f825f5160206133485f395f51905f52549161253e836124e7565b80835292600181169081156125cf5750600114612564575b61256292500383612471565b565b505f5160206133485f395f51905f525f90815290917ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea750093725b8183106125b357505090602061256292820101612556565b602091935080600191548385890101520191019091849261259b565b6020925061256294915060ff191682840152151560051b820101612556565b91906125f933612bcb565b612616576126119261260c833383612df5565b612c10565b600190565b61261192612c10565b6040519061262c8261243b565b5f6020838281520152565b6040519061264482612456565b815f81525f6020820152604080519161265c8361243b565b5f83525f60208401520152565b9190826040910312610214576040516126818161243b565b6020808294805184520151910152565b9035601e19823603018112156102145701602081359101916001600160401b03821161021457813603831361021457565b908060209392818452848401375f828201840152601f01601f1916010190565b80359163ffffffff83168093036102145761277292815260208201356020820152604082013560408201526060820135606082015261276461275961273e61272d6080860186612691565b60e0608087015260e08601916126c2565b61274b60a0860186612691565b9085830360a08701526126c2565b9260c0810190612691565b9160c08185039101526126c2565b90565b90816020910312610214575180151581036102145790565b1561279457565b60405162461bcd60e51b815260206004820152601060248201526f1050ce881d5b985d5d1a1bdc9a5e995960821b6044820152606490fd5b60018060a01b03166bffffffffffffffffffffffff60a01b7f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858025416177f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f18580255565b9081602091031261021457516001600160a01b03811681036102145790565b6001600160801b03166001600160801b03195f5160206132c85f395f51905f525416175f5160206132c85f395f51905f5255565b5f5160206132e85f395f51905f52546001600160a01b03169182156128f9576040516383609b0f60e01b81526001600160a01b0392831660048201529116602482015290602090829060449082905afa908115610bf8575f916128e0575090565b612772915060203d602011610f5257610f448183612471565b5050505f90565b6001600160801b035f5160206132c85f395f51905f52541680156129215790565b50670de0b6b3a764000090565b601f811161293a575050565b5f5160206132a85f395f51905f525f5260205f20906020601f840160051c83019310612980575b601f0160051c01905b818110612975575050565b5f815560010161296a565b9091508190612961565b601f8111612996575050565b5f5160206133485f395f51905f525f5260205f20906020601f840160051c830193106129dc575b601f0160051c01905b8181106129d1575050565b5f81556001016129c6565b90915081906129bd565b6129ee612900565b6001600160801b03811690670de0b6b3a7640000821015612a8f5750805f0390670de0b6b3a7640000815f198404140215612a325750670de0b6b3a7640000900490565b670de0b6b3a76400005f1982810983811084019003915f19099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a76400008111612aa65750505f1990565b670de0b6b3a763ffff1991670de0b6b3a763fffe196001600160801b0383670de0b6b3a76400005f190992845f03161692815f03811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211015f0302170290565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612b6457602052637f5e9f20600c525f526034600c205490565b50505f1990565b5f5160206132e85f395f51905f52546001600160a01b0316908115612bc55760405163fe575a8760e01b81526001600160a01b03909116600482015290602090829060249082905afa908115610bf8575f916128e0575090565b50505f90565b5f546040516395a8c58d60e01b81526001600160a01b039283166004820152600260248201529160209183916044918391165afa908115610bf8575f916128e0575090565b5f5160206132e85f395f51905f5254909291906001600160a01b0316612c3533612bcb565b15612cca575b50612c566001600160801b03612c4f612900565b1683613026565b906387a211a28460601b17600c526020600c208054808411612cbd5783900390555f526020600c20908154019055602052600c5160601c9060018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63f4d678b85f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b0385811660048301528316602482015290602090829060449082905afa908115610bf8575f91612d1b575b5015611b6b575f612c3b565b612d34915060203d602011610f5257610f448183612471565b5f612d0f565b60ff5f5160206133085f395f51905f525416612d5257565b63d93c066560e01b5f5260045ffd5b5f5160206132e85f395f51905f52546001600160a01b03168015612df157612d8833612bcb565b612df1576040516383609b0f60e01b81526001600160a01b039290921660048301525f6024830152602090829060449082905afa908115610bf8575f91612dd2575b5015611b6b57565b612deb915060203d602011610f5257610f448183612471565b5f612dca565b5050565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612e4e57602052637f5e9f20600c525f526034600c209081548019612e3557505050565b808211612e4157039055565b6313be252b5f526004601cfd5b505050565b5f5160206132e85f395f51905f52546001600160a01b0316612e7433612bcb565b15612f31575b506001600160801b03612e8b612900565b1691612ea083670de0b6b3a7640000836130c3565b92670de0b6b3a76400008209612f1a575b6387a211a2600c52815f526020600c2092835493848211612cbd57815f950390556805345cdf77eb68f44c54036805345cdf77eb68f44c55825260018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3565b916001019182612eb15763ae47f7025f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b03831660048201525f602482015290602090829060449082905afa908115610bf8575f91612f80575b5015611b6b575f612e7a565b612f99915060203d602011610f5257610f448183612471565b5f612f74565b81810291670de0b6b3a764000081838504148315170215612fca575050670de0b6b3a7640000900490565b670de0b6b3a7640000905f198184098481108501900392099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a764000082029181670de0b6b3a76400008285041482151702156130505750900490565b81670de0b6b3a76400005f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b818102929181158285048214178302156130de575050900490565b82905f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b60ff5f5160206133085f395f51905f5254161561316257565b638dfc202b60e01b5f5260045ffd5b90915f19838309928083029283808610950394808603951461320257848311156131ea5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613210570490565b634e487b7160e01b5f52601260045260245ffd5b60ff5f5160206133285f395f51905f525460401c161561324057565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af115610bf8575f513d61329e57506001600160a01b0381163b155b61327e5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561327756fe7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858017315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858037315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185804cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a007315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0000000000000000000000000000000000000000000000000000000000000000120000000000000000000000001a44076050125825900e736c501f859c50fe728c","recompiledBytecode":"0x60803461010257601f6134a338819003918201601f19168301916001600160401b0383118484101761010657808492604094855283398101031261010257805160ff81160361010257602001516001600160a01b03811603610102575f5160206134835f395f51905f525460ff8160401c166100f3576002600160401b03196001600160401b0382160161009d575b604051613368908161011b8239f35b6001600160401b0319166001600160401b039081175f5160206134835f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61008e565b63f92ee8a960e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461230c578063095ea7b31461227d57806313007d551461225657806318160ddd1461222657806323b872dd146121f7578063313ce567146121dc5780633644e515146121545780633abc107914611ddf5780633b6f743b14611c825780633f4ba83a14611ba857806340c10f19146119a557806342966c68146119405780634904ac8f1461188857806353735f37146118595780635c975abb1461182b5780635e280f11146117a95780636c2eb350146116ef57806370a08231146116ab57806379cc6790146116395780637ecebe0014611607578063804d4ffc146114675780638456cb591461136b578063857749b01461135057806395d89b411461126257806397e2b9af146112365780639f68b9641461121c578063a781a3fd146111f1578063a850e02414611138578063a9059cbb14611107578063b84c824614610f59578063c47f002714610d6a578063c7c7f5b3146109a8578063d4ec137a14610961578063d505accf1461079b578063d5abeb0114610781578063d8ddf18f14610752578063db0ed6a0146102cc578063dd62ed3e14610298578063f0b7db4e14610264578063f5eb42dc14610232578063fc0c546a146102185763fe575a87146101e7575f80fd5b3461021457602036600319011261021457602061020a610205612351565b612b6b565b6040519015158152f35b5f80fd5b34610214575f366003190112610214576020604051308152f35b346102145760203660031901126102145761024b612351565b6387a211a2600c525f52602080600c2054604051908152f35b34610214575f366003190112610214575f5160206132e85f395f51905f52546040516001600160a01b039091168152602090f35b346102145760403660031901126102145760206102c46102b6612351565b6102be612367565b90612b2e565b604051908152f35b346102145760a0366003190112610214576004356001600160401b038111610214576102fc903690600401612492565b6024356001600160401b0381116102145761031b903690600401612492565b906044356001600160a01b0381169081810361021457610339612393565b9261034261237d565b505f5160206133285f395f51905f5254936001600160401b0360ff8660401c161595168015908161074a575b6001149081610740575b159081610737575b50610728578460016001600160401b03195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556106f3575b6001600160a01b03169283156106e457156106e4578051156106d5578451156106c6578051906001600160401b0382116106175761040a826104055f5160206133485f395f51905f52546124e7565b61298a565b602090601f831160011461062b5761043992915f918361058b575b50508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b83516001600160401b03811161061757610479816104745f5160206132a85f395f51905f52546124e7565b61292e565b6020601f82116001146105965790806104ac926104c09596975f9261058b5750508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f52556127cc565b5f5160206132c85f395f51905f5280546fffffffffffffffffffffffffffffffff1916670de0b6b3a76400001790555f5160206132e85f395f51905f5280546001600160a01b03191682179055610515613224565b6bffffffffffffffffffffffff60a01b5f5416175f55610533613224565b61053957005b60ff60401b195f5160206133285f395f51905f5254165f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508780610425565b601f198216955f5160206132a85f395f51905f525f52815f20965f5b8181106105ff5750916104c0959697918460019594106105e7575b505050811b015f5160206132a85f395f51905f52556127cc565b01515f1960f88460031b161c191690558680806105cd565b838301518955600190980197602093840193016105b2565b634e487b7160e01b5f52604160045260245ffd5b90601f198316915f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372925f5b8181106106ae5750908460019594939210610696575b505050811b015f5160206133485f395f51905f5255610449565b01515f1960f88460031b161c1916905586808061067c565b92936020600181928786015181550195019301610666565b63010466f160e21b5f5260045ffd5b63430f13b360e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6801000000000000000060ff60401b195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556103b6565b63f92ee8a960e01b5f5260045ffd5b90501587610380565b303b159150610378565b86915061036e565b346102145760203660031901126102145760206102c46001600160801b03610778612900565b16600435613026565b34610214575f3660031901126102145760206102c46129e6565b346102145760e0366003190112610214576107b4612351565b6107bc612367565b604435916064356084359260ff84168403610214576001600160a01b0316936e22d473030f116ddee9f6b43ac78ba385188119151715610954576107fe61251f565b6020815191012090824211610947576040519360018060a01b03169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361093a577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b34610214575f366003190112610214577f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185802546040516001600160a01b039091168152602090f35b6080366003190112610214576004356001600160401b0381116102145760e081600401916003199036030112610214576040366023190112610214576109ec612393565b6109f4612637565b506109fd61261f565b50610a06612d3a565b610a0f33612d61565b610a17612637565b50610a2061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b81526001600160a01b0390911691602082600481865afa918215610bf8576004926020915f91610d3d575b50604051631c2eb17b60e31b815293849182906001600160a01b03165afa8015610bf8575f90610cf8575b60c092506001600160a01b031680151580610ced575b610c03575b5060405192838080936362385ce160e11b825233600483015260a06024830152610ad960a48301896126e2565b906024356044840152604435606484015260018060a01b03166084830152039134905af1918215610bf8575f915f93610b72575b50815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b0390f35b9150915060c03d60c011610bf1575b610b8b8183612471565b81019080820360c08112610214576080136102145760405191610bad83612456565b8151835260208201516001600160401b038116810361021457610bea926080916020860152610bdf8360408301612669565b604086015201612669565b9183610b0d565b503d610b81565b6040513d5f823e3d90fd5b602435610c406040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b8361324f565b60205f604051928284019063095ea7b360e01b8252886024860152604485015260448452610c6f606485612471565b83519082865af15f513d82610cd1575b505015610c8d575b50610aac565b610cca91610cc560405163095ea7b360e01b60208201528760248201525f604482015260448152610cbf606482612471565b8261324f565b61324f565b8480610c87565b909150610ce55750813b15155b8780610c7f565b600114610cde565b506024351515610aa7565b50906020813d602011610d35575b81610d1360209383612471565b810103126102145751906001600160a01b03821682036102145760c091610a91565b3d9150610d06565b610d5d9150823d8411610d63575b610d558183612471565b81019061282c565b86610a66565b503d610d4b565b3461021457610d78366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610dc4915f91610f2a575b5061278d565b6001600160401b03821161061757610ded826104055f5160206133485f395f51905f52546124e7565b5f91601f8111600114610e7257610e3b81807f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf955f91610e67575b508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b610e626040519283926020845260208401916126c2565b0390a1005b905084013586610e28565b601f198116925f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372905f5b858110610f125750827f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf9510610ef9575b5050600181811b015f5160206133485f395f51905f5255610e4b565b8301355f19600384901b60f8161c191690558380610edd565b90916020600181928588013581550193019101610eac565b610f4c915060203d602011610f52575b610f448183612471565b810190612775565b84610dbe565b503d610f3a565b3461021457610f67366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610fb2915f91610f2a575061278d565b6001600160401b03821161061757610fdb826104745f5160206132a85f395f51905f52546124e7565b5f91601f811160011461104e5761102881807f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99955f91610e6757508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f5255610e626040519283926020845260208401916126c2565b5f5160206132a85f395f51905f525f908152601f198216937f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc915b8581106110ef5750827f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c9995106110d6575b5050600181811b015f5160206132a85f395f51905f5255610e4b565b8301355f19600384901b60f8161c1916905583806110ba565b90916020600181928588013581550193019101611089565b346102145760403660031901126102145761112d611123612351565b6024359033612c10565b602060405160018152f35b34610214576020366003190112610214576004356001600160801b03811690818103610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576111a6915f91610f2a575061278d565b81156111e2577f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13916111d960209261284b565b604051908152a1005b637c946ed760e01b5f5260045ffd5b34610214575f36600319011261021457602061120b612900565b6001600160801b0360405191168152f35b34610214575f3660031901126102145760206040515f8152f35b3461021457604036600319011261021457602061020a611254612351565b61125c612367565b9061287f565b34610214575f366003190112610214576040515f5f5160206132a85f395f51905f525461128e816124e7565b808452906001811690811561132c57506001146112c2575b610b6e836112b681850382612471565b60405191829182612327565b5f5160206132a85f395f51905f525f9081527f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc939250905b808210611312575090915081016020016112b66112a6565b9192600181602092548385880101520191019092916112fa565b60ff191660208086019190915291151560051b840190910191506112b690506112a6565b34610214575f36600319011261021457602060405160098152f35b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576113c3915f91611448575061278d565b6113cb612d3a565b600160ff195f5160206133085f395f51905f525416175f5160206133085f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a16040514281527fba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd660203092a2005b611461915060203d602011610f5257610f448183612471565b82610dbe565b34610214576040366003190112610214575f546040516395a8c58d60e01b8152336004808301919091526002602480840191909152359290359190602090829060449082906001600160a01b03165afa8015610bf8576114cd915f91610f2a575061278d565b6114d5613149565b801515806115fe575b156115ef575f5160206132c85f395f51905f52546001600160801b0316806115e157506001600160801b03670de0b6b3a76400005b1661151f838383613171565b926001600160801b0384116115c95792608092917f8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b946115676001600160801b03841661284b565b7f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf136020604051858152a1604051938452602084015260408301526060820152a160206001600160801b035f5160206132c85f395f51905f525416604051908152f35b836306dfcc6560e41b5f52608060045260245260445ffd5b6001600160801b0390611513565b631d94864560e11b5f5260045ffd5b508115156114de565b3461021457602036600319011261021457611620612351565b6338377508600c525f52602080600c2054604051908152f35b3461021457604036600319011261021457611652612351565b5f546040516395a8c58d60e01b8152336004820152600260248201529190602090839060449082906001600160a01b03165afa918215610bf8576116a9926116a0915f91610f2a575061278d565b60243590612e53565b005b34610214576020366003190112610214576116c4612351565b6387a211a2600c525f5260206102c481600c20546001600160801b036116e8612900565b1690612f9f565b34610214575f366003190112610214575f5160206133285f395f51905f525460ff8160401c16908115611794575b50610728575f5160206133285f395f51905f52805468ffffffffffffffffff1916680100000000000000048117909155600417611758613224565b5f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160048152a1005b600491506001600160401b031610158161171d565b34610214575f366003190112610214575f5160206132e85f395f51905f5254604051635e280f1160e01b815290602090829060049082906001600160a01b03165afa8015610bf8576020915f9161180e575b506040516001600160a01b039091168152f35b6118259150823d8411610d6357610d558183612471565b826117fb565b34610214575f36600319011261021457602060ff5f5160206133085f395f51905f5254166040519015158152f35b346102145760203660031901126102145760206102c46001600160801b0361187f612900565b16600435612f9f565b34610214576020366003190112610214576118a1612351565b5f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576118e9915f91611921575061278d565b6118f2816127cc565b6001600160a01b03167fc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea45f80a2005b61193a915060203d602011610f5257610f448183612471565b83610dbe565b34610214576020366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611999915f91611448575061278d565b6116a960043533612e53565b34610214576040366003190112610214576119be612351565b5f546040516395a8c58d60e01b81523360048201526002602480830191909152359291602090829060449082906001600160a01b03165afa8015610bf857611a0c915f91610f2a575061278d565b6001600160a01b03811680156106e4575f5160206132e85f395f51905f52546001600160a01b031690611a3e33612bcb565b15611b27575b50506805345cdf77eb68f44c5490611a6c6001600160801b03611a65612900565b1684613026565b91828101908110611b02576001600160801b03611a87612900565b16670de0b6b3a7640000611a9c8183856130c3565b918309611b11575b611aac6129e6565b10611b02576805345cdf77eb68f44c556387a211a2600c525f526020600c20908154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3005b63e5cfe95760e01b5f5260045ffd5b60010180611aa4575b63ae47f7025f526004601cfd5b8115611b99576020906044604051809481936383609b0f60e01b83525f600484015260248301525afa908115610bf8575f91611b7a575b5015611b6b578280611a44565b6315df7de160e31b5f5260045ffd5b611b93915060203d602011610f5257610f448183612471565b83611b5e565b630588ca9560e01b5f5260045ffd5b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611c00915f91611448575061278d565b611c08613149565b60ff195f5160206133085f395f51905f5254165f5160206133085f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a16040514281527fcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de60203092a2005b34610214576040366003190112610214576004356001600160401b0381116102145760e06003198236030112610214576024359081151580920361021457611cc861261f565b505f5160206132e85f395f51905f525460405163f99e156960e01b81523060048201526001600160a01b0390911690602081602481855afa908115610bf8575f91611daa575b5090604092611d43928451958694859384936315efa6af60e11b855260048501526060602485015260648401906004016126e2565b90604483015203915afa8015610bf8575f90611d6f575b60409060208251918051835201516020820152f35b5060403d604011611da3575b611d858183612471565b81019060408183031261021457604091611d9e91612669565b611d5a565b503d611d7b565b9190506020823d602011611dd7575b81611dc660209383612471565b810103126102145790516040611d0e565b3d9150611db9565b60a0366003190112610214576004356001600160401b03811161021457806004019060e0600319823603011261021457611e17612367565b604036604319011261021457611e2b61237d565b91611e34612637565b50611e3d61261f565b50611e46612d3a565b611e4f82612d61565b611e5833612bcb565b1561210b575b50611e67612637565b50611e7061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b815291906001600160a01b0316602083600481845afa928315610bf8576004936020915f916120ee575b50604051631c2eb17b60e31b815294859182906001600160a01b03165afa8015610bf8575f906120a9575b60c093506001600160a01b03168015158061209e575b611fc5575b5060405180809581946362385ce160e11b835260018060a01b0316600483015260a06024830152611f2f60a48301896126e2565b604480359084015260648035908401526001600160a01b039091166084830152039134905af1918215610bf8575f915f93610b725750815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b604435611ffc6040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b60205f604051928284019063095ea7b360e01b825286602486015260448501526044845261202b606485612471565b83519082865af15f513d82612082575b505015612049575b50611efb565b61207b91610cc560405163095ea7b360e01b60208201528560248201525f604482015260448152610cbf606482612471565b8580612043565b9091506120965750813b15155b888061203b565b60011461208f565b506044351515611ef6565b50916020813d6020116120e6575b816120c460209383612471565b810103126102145751916001600160a01b03831683036102145760c092611ee0565b3d91506120b7565b6121059150823d8411610d6357610d558183612471565b87611eb5565b6044633b9aca0091013504633b9aca00810290808204633b9aca0014901517156121405761213a903383612df5565b83611e5e565b634e487b7160e01b5f52601160045260245ffd5b34610214575f36600319011261021457602060a061217061251f565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b34610214575f36600319011261021457602060405160128152f35b3461021457606036600319011261021457602061020a612215612351565b61221d612367565b604435916125ee565b34610214575f3660031901126102145760206102c46805345cdf77eb68f44c546001600160801b036116e8612900565b34610214575f366003190112610214575f546040516001600160a01b039091168152602090f35b3461021457604036600319011261021457612296612351565b602435906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba318821915171561095457602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b34610214575f36600319011261021457610b6e6112b661251f565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361021457565b602435906001600160a01b038216820361021457565b608435906001600160a01b038216820361021457565b606435906001600160a01b038216820361021457565b909291602060a09181604060c0860197805187526001600160401b0383820151168388015201518051604087015201516060850152805160808501520151910152565b906020600319830112610214576004356001600160401b0381116102145782602382011215610214578060040135926001600160401b0384116102145760248483010111610214576024019190565b604081019081106001600160401b0382111761061757604052565b606081019081106001600160401b0382111761061757604052565b90601f801991011681019081106001600160401b0382111761061757604052565b81601f82011215610214578035906001600160401b03821161061757604051926124c6601f8401601f191660200185612471565b8284526020838301011161021457815f926020809301838601378301015290565b90600182811c92168015612515575b602083101461250157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916124f6565b604051905f825f5160206133485f395f51905f52549161253e836124e7565b80835292600181169081156125cf5750600114612564575b61256292500383612471565b565b505f5160206133485f395f51905f525f90815290917ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea750093725b8183106125b357505090602061256292820101612556565b602091935080600191548385890101520191019091849261259b565b6020925061256294915060ff191682840152151560051b820101612556565b91906125f933612bcb565b612616576126119261260c833383612df5565b612c10565b600190565b61261192612c10565b6040519061262c8261243b565b5f6020838281520152565b6040519061264482612456565b815f81525f6020820152604080519161265c8361243b565b5f83525f60208401520152565b9190826040910312610214576040516126818161243b565b6020808294805184520151910152565b9035601e19823603018112156102145701602081359101916001600160401b03821161021457813603831361021457565b908060209392818452848401375f828201840152601f01601f1916010190565b80359163ffffffff83168093036102145761277292815260208201356020820152604082013560408201526060820135606082015261276461275961273e61272d6080860186612691565b60e0608087015260e08601916126c2565b61274b60a0860186612691565b9085830360a08701526126c2565b9260c0810190612691565b9160c08185039101526126c2565b90565b90816020910312610214575180151581036102145790565b1561279457565b60405162461bcd60e51b815260206004820152601060248201526f1050ce881d5b985d5d1a1bdc9a5e995960821b6044820152606490fd5b60018060a01b03166bffffffffffffffffffffffff60a01b7f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858025416177f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f18580255565b9081602091031261021457516001600160a01b03811681036102145790565b6001600160801b03166001600160801b03195f5160206132c85f395f51905f525416175f5160206132c85f395f51905f5255565b5f5160206132e85f395f51905f52546001600160a01b03169182156128f9576040516383609b0f60e01b81526001600160a01b0392831660048201529116602482015290602090829060449082905afa908115610bf8575f916128e0575090565b612772915060203d602011610f5257610f448183612471565b5050505f90565b6001600160801b035f5160206132c85f395f51905f52541680156129215790565b50670de0b6b3a764000090565b601f811161293a575050565b5f5160206132a85f395f51905f525f5260205f20906020601f840160051c83019310612980575b601f0160051c01905b818110612975575050565b5f815560010161296a565b9091508190612961565b601f8111612996575050565b5f5160206133485f395f51905f525f5260205f20906020601f840160051c830193106129dc575b601f0160051c01905b8181106129d1575050565b5f81556001016129c6565b90915081906129bd565b6129ee612900565b6001600160801b03811690670de0b6b3a7640000821015612a8f5750805f0390670de0b6b3a7640000815f198404140215612a325750670de0b6b3a7640000900490565b670de0b6b3a76400005f1982810983811084019003915f19099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a76400008111612aa65750505f1990565b670de0b6b3a763ffff1991670de0b6b3a763fffe196001600160801b0383670de0b6b3a76400005f190992845f03161692815f03811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211015f0302170290565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612b6457602052637f5e9f20600c525f526034600c205490565b50505f1990565b5f5160206132e85f395f51905f52546001600160a01b0316908115612bc55760405163fe575a8760e01b81526001600160a01b03909116600482015290602090829060249082905afa908115610bf8575f916128e0575090565b50505f90565b5f546040516395a8c58d60e01b81526001600160a01b039283166004820152600260248201529160209183916044918391165afa908115610bf8575f916128e0575090565b5f5160206132e85f395f51905f5254909291906001600160a01b0316612c3533612bcb565b15612cca575b50612c566001600160801b03612c4f612900565b1683613026565b906387a211a28460601b17600c526020600c208054808411612cbd5783900390555f526020600c20908154019055602052600c5160601c9060018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63f4d678b85f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b0385811660048301528316602482015290602090829060449082905afa908115610bf8575f91612d1b575b5015611b6b575f612c3b565b612d34915060203d602011610f5257610f448183612471565b5f612d0f565b60ff5f5160206133085f395f51905f525416612d5257565b63d93c066560e01b5f5260045ffd5b5f5160206132e85f395f51905f52546001600160a01b03168015612df157612d8833612bcb565b612df1576040516383609b0f60e01b81526001600160a01b039290921660048301525f6024830152602090829060449082905afa908115610bf8575f91612dd2575b5015611b6b57565b612deb915060203d602011610f5257610f448183612471565b5f612dca565b5050565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612e4e57602052637f5e9f20600c525f526034600c209081548019612e3557505050565b808211612e4157039055565b6313be252b5f526004601cfd5b505050565b5f5160206132e85f395f51905f52546001600160a01b0316612e7433612bcb565b15612f31575b506001600160801b03612e8b612900565b1691612ea083670de0b6b3a7640000836130c3565b92670de0b6b3a76400008209612f1a575b6387a211a2600c52815f526020600c2092835493848211612cbd57815f950390556805345cdf77eb68f44c54036805345cdf77eb68f44c55825260018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3565b916001019182612eb15763ae47f7025f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b03831660048201525f602482015290602090829060449082905afa908115610bf8575f91612f80575b5015611b6b575f612e7a565b612f99915060203d602011610f5257610f448183612471565b5f612f74565b81810291670de0b6b3a764000081838504148315170215612fca575050670de0b6b3a7640000900490565b670de0b6b3a7640000905f198184098481108501900392099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a764000082029181670de0b6b3a76400008285041482151702156130505750900490565b81670de0b6b3a76400005f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b818102929181158285048214178302156130de575050900490565b82905f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b60ff5f5160206133085f395f51905f5254161561316257565b638dfc202b60e01b5f5260045ffd5b90915f19838309928083029283808610950394808603951461320257848311156131ea5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613210570490565b634e487b7160e01b5f52601260045260245ffd5b60ff5f5160206133285f395f51905f525460401c161561324057565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af115610bf8575f513d61329e57506001600160a01b0381163b155b61327e5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561327756fe7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858017315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858037315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185804cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a007315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00","sourceMap":"1512:13340:36:-:0;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;7894:76:9;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;7983:34:9;7979:146;;-1:-1:-1;1512:13340:36;;;;;;;;;7979:146:9;-1:-1:-1;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;8085:29:9;;1512:13340:36;;8085:29:9;7979:146;;;7894:76;7936:23;;;-1:-1:-1;7936:23:9;;-1:-1:-1;7936:23:9;1512:13340:36;-1:-1:-1;1512:13340:36;;;;;;-1:-1:-1;1512:13340:36;;;;;-1:-1:-1;1512:13340:36","linkReferences":{},"cborAuxdata":{},"transformations":[{"type":"insert","offset":13475,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x00000000000000000000000000000000000000000000000000000000000000120000000000000000000000001a44076050125825900e736c501f859c50fe728c"}},"runtimeBytecode":{"onchainBytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461230c578063095ea7b31461227d57806313007d551461225657806318160ddd1461222657806323b872dd146121f7578063313ce567146121dc5780633644e515146121545780633abc107914611ddf5780633b6f743b14611c825780633f4ba83a14611ba857806340c10f19146119a557806342966c68146119405780634904ac8f1461188857806353735f37146118595780635c975abb1461182b5780635e280f11146117a95780636c2eb350146116ef57806370a08231146116ab57806379cc6790146116395780637ecebe0014611607578063804d4ffc146114675780638456cb591461136b578063857749b01461135057806395d89b411461126257806397e2b9af146112365780639f68b9641461121c578063a781a3fd146111f1578063a850e02414611138578063a9059cbb14611107578063b84c824614610f59578063c47f002714610d6a578063c7c7f5b3146109a8578063d4ec137a14610961578063d505accf1461079b578063d5abeb0114610781578063d8ddf18f14610752578063db0ed6a0146102cc578063dd62ed3e14610298578063f0b7db4e14610264578063f5eb42dc14610232578063fc0c546a146102185763fe575a87146101e7575f80fd5b3461021457602036600319011261021457602061020a610205612351565b612b6b565b6040519015158152f35b5f80fd5b34610214575f366003190112610214576020604051308152f35b346102145760203660031901126102145761024b612351565b6387a211a2600c525f52602080600c2054604051908152f35b34610214575f366003190112610214575f5160206132e85f395f51905f52546040516001600160a01b039091168152602090f35b346102145760403660031901126102145760206102c46102b6612351565b6102be612367565b90612b2e565b604051908152f35b346102145760a0366003190112610214576004356001600160401b038111610214576102fc903690600401612492565b6024356001600160401b0381116102145761031b903690600401612492565b906044356001600160a01b0381169081810361021457610339612393565b9261034261237d565b505f5160206133285f395f51905f5254936001600160401b0360ff8660401c161595168015908161074a575b6001149081610740575b159081610737575b50610728578460016001600160401b03195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556106f3575b6001600160a01b03169283156106e457156106e4578051156106d5578451156106c6578051906001600160401b0382116106175761040a826104055f5160206133485f395f51905f52546124e7565b61298a565b602090601f831160011461062b5761043992915f918361058b575b50508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b83516001600160401b03811161061757610479816104745f5160206132a85f395f51905f52546124e7565b61292e565b6020601f82116001146105965790806104ac926104c09596975f9261058b5750508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f52556127cc565b5f5160206132c85f395f51905f5280546fffffffffffffffffffffffffffffffff1916670de0b6b3a76400001790555f5160206132e85f395f51905f5280546001600160a01b03191682179055610515613224565b6bffffffffffffffffffffffff60a01b5f5416175f55610533613224565b61053957005b60ff60401b195f5160206133285f395f51905f5254165f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508780610425565b601f198216955f5160206132a85f395f51905f525f52815f20965f5b8181106105ff5750916104c0959697918460019594106105e7575b505050811b015f5160206132a85f395f51905f52556127cc565b01515f1960f88460031b161c191690558680806105cd565b838301518955600190980197602093840193016105b2565b634e487b7160e01b5f52604160045260245ffd5b90601f198316915f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372925f5b8181106106ae5750908460019594939210610696575b505050811b015f5160206133485f395f51905f5255610449565b01515f1960f88460031b161c1916905586808061067c565b92936020600181928786015181550195019301610666565b63010466f160e21b5f5260045ffd5b63430f13b360e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6801000000000000000060ff60401b195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556103b6565b63f92ee8a960e01b5f5260045ffd5b90501587610380565b303b159150610378565b86915061036e565b346102145760203660031901126102145760206102c46001600160801b03610778612900565b16600435613026565b34610214575f3660031901126102145760206102c46129e6565b346102145760e0366003190112610214576107b4612351565b6107bc612367565b604435916064356084359260ff84168403610214576001600160a01b0316936e22d473030f116ddee9f6b43ac78ba385188119151715610954576107fe61251f565b6020815191012090824211610947576040519360018060a01b03169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361093a577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b34610214575f366003190112610214577f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185802546040516001600160a01b039091168152602090f35b6080366003190112610214576004356001600160401b0381116102145760e081600401916003199036030112610214576040366023190112610214576109ec612393565b6109f4612637565b506109fd61261f565b50610a06612d3a565b610a0f33612d61565b610a17612637565b50610a2061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b81526001600160a01b0390911691602082600481865afa918215610bf8576004926020915f91610d3d575b50604051631c2eb17b60e31b815293849182906001600160a01b03165afa8015610bf8575f90610cf8575b60c092506001600160a01b031680151580610ced575b610c03575b5060405192838080936362385ce160e11b825233600483015260a06024830152610ad960a48301896126e2565b906024356044840152604435606484015260018060a01b03166084830152039134905af1918215610bf8575f915f93610b72575b50815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b0390f35b9150915060c03d60c011610bf1575b610b8b8183612471565b81019080820360c08112610214576080136102145760405191610bad83612456565b8151835260208201516001600160401b038116810361021457610bea926080916020860152610bdf8360408301612669565b604086015201612669565b9183610b0d565b503d610b81565b6040513d5f823e3d90fd5b602435610c406040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b8361324f565b60205f604051928284019063095ea7b360e01b8252886024860152604485015260448452610c6f606485612471565b83519082865af15f513d82610cd1575b505015610c8d575b50610aac565b610cca91610cc560405163095ea7b360e01b60208201528760248201525f604482015260448152610cbf606482612471565b8261324f565b61324f565b8480610c87565b909150610ce55750813b15155b8780610c7f565b600114610cde565b506024351515610aa7565b50906020813d602011610d35575b81610d1360209383612471565b810103126102145751906001600160a01b03821682036102145760c091610a91565b3d9150610d06565b610d5d9150823d8411610d63575b610d558183612471565b81019061282c565b86610a66565b503d610d4b565b3461021457610d78366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610dc4915f91610f2a575b5061278d565b6001600160401b03821161061757610ded826104055f5160206133485f395f51905f52546124e7565b5f91601f8111600114610e7257610e3b81807f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf955f91610e67575b508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b610e626040519283926020845260208401916126c2565b0390a1005b905084013586610e28565b601f198116925f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372905f5b858110610f125750827f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf9510610ef9575b5050600181811b015f5160206133485f395f51905f5255610e4b565b8301355f19600384901b60f8161c191690558380610edd565b90916020600181928588013581550193019101610eac565b610f4c915060203d602011610f52575b610f448183612471565b810190612775565b84610dbe565b503d610f3a565b3461021457610f67366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610fb2915f91610f2a575061278d565b6001600160401b03821161061757610fdb826104745f5160206132a85f395f51905f52546124e7565b5f91601f811160011461104e5761102881807f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99955f91610e6757508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f5255610e626040519283926020845260208401916126c2565b5f5160206132a85f395f51905f525f908152601f198216937f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc915b8581106110ef5750827f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c9995106110d6575b5050600181811b015f5160206132a85f395f51905f5255610e4b565b8301355f19600384901b60f8161c1916905583806110ba565b90916020600181928588013581550193019101611089565b346102145760403660031901126102145761112d611123612351565b6024359033612c10565b602060405160018152f35b34610214576020366003190112610214576004356001600160801b03811690818103610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576111a6915f91610f2a575061278d565b81156111e2577f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13916111d960209261284b565b604051908152a1005b637c946ed760e01b5f5260045ffd5b34610214575f36600319011261021457602061120b612900565b6001600160801b0360405191168152f35b34610214575f3660031901126102145760206040515f8152f35b3461021457604036600319011261021457602061020a611254612351565b61125c612367565b9061287f565b34610214575f366003190112610214576040515f5f5160206132a85f395f51905f525461128e816124e7565b808452906001811690811561132c57506001146112c2575b610b6e836112b681850382612471565b60405191829182612327565b5f5160206132a85f395f51905f525f9081527f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc939250905b808210611312575090915081016020016112b66112a6565b9192600181602092548385880101520191019092916112fa565b60ff191660208086019190915291151560051b840190910191506112b690506112a6565b34610214575f36600319011261021457602060405160098152f35b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576113c3915f91611448575061278d565b6113cb612d3a565b600160ff195f5160206133085f395f51905f525416175f5160206133085f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a16040514281527fba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd660203092a2005b611461915060203d602011610f5257610f448183612471565b82610dbe565b34610214576040366003190112610214575f546040516395a8c58d60e01b8152336004808301919091526002602480840191909152359290359190602090829060449082906001600160a01b03165afa8015610bf8576114cd915f91610f2a575061278d565b6114d5613149565b801515806115fe575b156115ef575f5160206132c85f395f51905f52546001600160801b0316806115e157506001600160801b03670de0b6b3a76400005b1661151f838383613171565b926001600160801b0384116115c95792608092917f8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b946115676001600160801b03841661284b565b7f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf136020604051858152a1604051938452602084015260408301526060820152a160206001600160801b035f5160206132c85f395f51905f525416604051908152f35b836306dfcc6560e41b5f52608060045260245260445ffd5b6001600160801b0390611513565b631d94864560e11b5f5260045ffd5b508115156114de565b3461021457602036600319011261021457611620612351565b6338377508600c525f52602080600c2054604051908152f35b3461021457604036600319011261021457611652612351565b5f546040516395a8c58d60e01b8152336004820152600260248201529190602090839060449082906001600160a01b03165afa918215610bf8576116a9926116a0915f91610f2a575061278d565b60243590612e53565b005b34610214576020366003190112610214576116c4612351565b6387a211a2600c525f5260206102c481600c20546001600160801b036116e8612900565b1690612f9f565b34610214575f366003190112610214575f5160206133285f395f51905f525460ff8160401c16908115611794575b50610728575f5160206133285f395f51905f52805468ffffffffffffffffff1916680100000000000000048117909155600417611758613224565b5f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160048152a1005b600491506001600160401b031610158161171d565b34610214575f366003190112610214575f5160206132e85f395f51905f5254604051635e280f1160e01b815290602090829060049082906001600160a01b03165afa8015610bf8576020915f9161180e575b506040516001600160a01b039091168152f35b6118259150823d8411610d6357610d558183612471565b826117fb565b34610214575f36600319011261021457602060ff5f5160206133085f395f51905f5254166040519015158152f35b346102145760203660031901126102145760206102c46001600160801b0361187f612900565b16600435612f9f565b34610214576020366003190112610214576118a1612351565b5f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576118e9915f91611921575061278d565b6118f2816127cc565b6001600160a01b03167fc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea45f80a2005b61193a915060203d602011610f5257610f448183612471565b83610dbe565b34610214576020366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611999915f91611448575061278d565b6116a960043533612e53565b34610214576040366003190112610214576119be612351565b5f546040516395a8c58d60e01b81523360048201526002602480830191909152359291602090829060449082906001600160a01b03165afa8015610bf857611a0c915f91610f2a575061278d565b6001600160a01b03811680156106e4575f5160206132e85f395f51905f52546001600160a01b031690611a3e33612bcb565b15611b27575b50506805345cdf77eb68f44c5490611a6c6001600160801b03611a65612900565b1684613026565b91828101908110611b02576001600160801b03611a87612900565b16670de0b6b3a7640000611a9c8183856130c3565b918309611b11575b611aac6129e6565b10611b02576805345cdf77eb68f44c556387a211a2600c525f526020600c20908154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3005b63e5cfe95760e01b5f5260045ffd5b60010180611aa4575b63ae47f7025f526004601cfd5b8115611b99576020906044604051809481936383609b0f60e01b83525f600484015260248301525afa908115610bf8575f91611b7a575b5015611b6b578280611a44565b6315df7de160e31b5f5260045ffd5b611b93915060203d602011610f5257610f448183612471565b83611b5e565b630588ca9560e01b5f5260045ffd5b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611c00915f91611448575061278d565b611c08613149565b60ff195f5160206133085f395f51905f5254165f5160206133085f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a16040514281527fcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de60203092a2005b34610214576040366003190112610214576004356001600160401b0381116102145760e06003198236030112610214576024359081151580920361021457611cc861261f565b505f5160206132e85f395f51905f525460405163f99e156960e01b81523060048201526001600160a01b0390911690602081602481855afa908115610bf8575f91611daa575b5090604092611d43928451958694859384936315efa6af60e11b855260048501526060602485015260648401906004016126e2565b90604483015203915afa8015610bf8575f90611d6f575b60409060208251918051835201516020820152f35b5060403d604011611da3575b611d858183612471565b81019060408183031261021457604091611d9e91612669565b611d5a565b503d611d7b565b9190506020823d602011611dd7575b81611dc660209383612471565b810103126102145790516040611d0e565b3d9150611db9565b60a0366003190112610214576004356001600160401b03811161021457806004019060e0600319823603011261021457611e17612367565b604036604319011261021457611e2b61237d565b91611e34612637565b50611e3d61261f565b50611e46612d3a565b611e4f82612d61565b611e5833612bcb565b1561210b575b50611e67612637565b50611e7061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b815291906001600160a01b0316602083600481845afa928315610bf8576004936020915f916120ee575b50604051631c2eb17b60e31b815294859182906001600160a01b03165afa8015610bf8575f906120a9575b60c093506001600160a01b03168015158061209e575b611fc5575b5060405180809581946362385ce160e11b835260018060a01b0316600483015260a06024830152611f2f60a48301896126e2565b604480359084015260648035908401526001600160a01b039091166084830152039134905af1918215610bf8575f915f93610b725750815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b604435611ffc6040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b60205f604051928284019063095ea7b360e01b825286602486015260448501526044845261202b606485612471565b83519082865af15f513d82612082575b505015612049575b50611efb565b61207b91610cc560405163095ea7b360e01b60208201528560248201525f604482015260448152610cbf606482612471565b8580612043565b9091506120965750813b15155b888061203b565b60011461208f565b506044351515611ef6565b50916020813d6020116120e6575b816120c460209383612471565b810103126102145751916001600160a01b03831683036102145760c092611ee0565b3d91506120b7565b6121059150823d8411610d6357610d558183612471565b87611eb5565b6044633b9aca0091013504633b9aca00810290808204633b9aca0014901517156121405761213a903383612df5565b83611e5e565b634e487b7160e01b5f52601160045260245ffd5b34610214575f36600319011261021457602060a061217061251f565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b34610214575f36600319011261021457602060405160128152f35b3461021457606036600319011261021457602061020a612215612351565b61221d612367565b604435916125ee565b34610214575f3660031901126102145760206102c46805345cdf77eb68f44c546001600160801b036116e8612900565b34610214575f366003190112610214575f546040516001600160a01b039091168152602090f35b3461021457604036600319011261021457612296612351565b602435906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba318821915171561095457602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b34610214575f36600319011261021457610b6e6112b661251f565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361021457565b602435906001600160a01b038216820361021457565b608435906001600160a01b038216820361021457565b606435906001600160a01b038216820361021457565b909291602060a09181604060c0860197805187526001600160401b0383820151168388015201518051604087015201516060850152805160808501520151910152565b906020600319830112610214576004356001600160401b0381116102145782602382011215610214578060040135926001600160401b0384116102145760248483010111610214576024019190565b604081019081106001600160401b0382111761061757604052565b606081019081106001600160401b0382111761061757604052565b90601f801991011681019081106001600160401b0382111761061757604052565b81601f82011215610214578035906001600160401b03821161061757604051926124c6601f8401601f191660200185612471565b8284526020838301011161021457815f926020809301838601378301015290565b90600182811c92168015612515575b602083101461250157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916124f6565b604051905f825f5160206133485f395f51905f52549161253e836124e7565b80835292600181169081156125cf5750600114612564575b61256292500383612471565b565b505f5160206133485f395f51905f525f90815290917ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea750093725b8183106125b357505090602061256292820101612556565b602091935080600191548385890101520191019091849261259b565b6020925061256294915060ff191682840152151560051b820101612556565b91906125f933612bcb565b612616576126119261260c833383612df5565b612c10565b600190565b61261192612c10565b6040519061262c8261243b565b5f6020838281520152565b6040519061264482612456565b815f81525f6020820152604080519161265c8361243b565b5f83525f60208401520152565b9190826040910312610214576040516126818161243b565b6020808294805184520151910152565b9035601e19823603018112156102145701602081359101916001600160401b03821161021457813603831361021457565b908060209392818452848401375f828201840152601f01601f1916010190565b80359163ffffffff83168093036102145761277292815260208201356020820152604082013560408201526060820135606082015261276461275961273e61272d6080860186612691565b60e0608087015260e08601916126c2565b61274b60a0860186612691565b9085830360a08701526126c2565b9260c0810190612691565b9160c08185039101526126c2565b90565b90816020910312610214575180151581036102145790565b1561279457565b60405162461bcd60e51b815260206004820152601060248201526f1050ce881d5b985d5d1a1bdc9a5e995960821b6044820152606490fd5b60018060a01b03166bffffffffffffffffffffffff60a01b7f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858025416177f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f18580255565b9081602091031261021457516001600160a01b03811681036102145790565b6001600160801b03166001600160801b03195f5160206132c85f395f51905f525416175f5160206132c85f395f51905f5255565b5f5160206132e85f395f51905f52546001600160a01b03169182156128f9576040516383609b0f60e01b81526001600160a01b0392831660048201529116602482015290602090829060449082905afa908115610bf8575f916128e0575090565b612772915060203d602011610f5257610f448183612471565b5050505f90565b6001600160801b035f5160206132c85f395f51905f52541680156129215790565b50670de0b6b3a764000090565b601f811161293a575050565b5f5160206132a85f395f51905f525f5260205f20906020601f840160051c83019310612980575b601f0160051c01905b818110612975575050565b5f815560010161296a565b9091508190612961565b601f8111612996575050565b5f5160206133485f395f51905f525f5260205f20906020601f840160051c830193106129dc575b601f0160051c01905b8181106129d1575050565b5f81556001016129c6565b90915081906129bd565b6129ee612900565b6001600160801b03811690670de0b6b3a7640000821015612a8f5750805f0390670de0b6b3a7640000815f198404140215612a325750670de0b6b3a7640000900490565b670de0b6b3a76400005f1982810983811084019003915f19099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a76400008111612aa65750505f1990565b670de0b6b3a763ffff1991670de0b6b3a763fffe196001600160801b0383670de0b6b3a76400005f190992845f03161692815f03811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211015f0302170290565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612b6457602052637f5e9f20600c525f526034600c205490565b50505f1990565b5f5160206132e85f395f51905f52546001600160a01b0316908115612bc55760405163fe575a8760e01b81526001600160a01b03909116600482015290602090829060249082905afa908115610bf8575f916128e0575090565b50505f90565b5f546040516395a8c58d60e01b81526001600160a01b039283166004820152600260248201529160209183916044918391165afa908115610bf8575f916128e0575090565b5f5160206132e85f395f51905f5254909291906001600160a01b0316612c3533612bcb565b15612cca575b50612c566001600160801b03612c4f612900565b1683613026565b906387a211a28460601b17600c526020600c208054808411612cbd5783900390555f526020600c20908154019055602052600c5160601c9060018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63f4d678b85f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b0385811660048301528316602482015290602090829060449082905afa908115610bf8575f91612d1b575b5015611b6b575f612c3b565b612d34915060203d602011610f5257610f448183612471565b5f612d0f565b60ff5f5160206133085f395f51905f525416612d5257565b63d93c066560e01b5f5260045ffd5b5f5160206132e85f395f51905f52546001600160a01b03168015612df157612d8833612bcb565b612df1576040516383609b0f60e01b81526001600160a01b039290921660048301525f6024830152602090829060449082905afa908115610bf8575f91612dd2575b5015611b6b57565b612deb915060203d602011610f5257610f448183612471565b5f612dca565b5050565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612e4e57602052637f5e9f20600c525f526034600c209081548019612e3557505050565b808211612e4157039055565b6313be252b5f526004601cfd5b505050565b5f5160206132e85f395f51905f52546001600160a01b0316612e7433612bcb565b15612f31575b506001600160801b03612e8b612900565b1691612ea083670de0b6b3a7640000836130c3565b92670de0b6b3a76400008209612f1a575b6387a211a2600c52815f526020600c2092835493848211612cbd57815f950390556805345cdf77eb68f44c54036805345cdf77eb68f44c55825260018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3565b916001019182612eb15763ae47f7025f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b03831660048201525f602482015290602090829060449082905afa908115610bf8575f91612f80575b5015611b6b575f612e7a565b612f99915060203d602011610f5257610f448183612471565b5f612f74565b81810291670de0b6b3a764000081838504148315170215612fca575050670de0b6b3a7640000900490565b670de0b6b3a7640000905f198184098481108501900392099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a764000082029181670de0b6b3a76400008285041482151702156130505750900490565b81670de0b6b3a76400005f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b818102929181158285048214178302156130de575050900490565b82905f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b60ff5f5160206133085f395f51905f5254161561316257565b638dfc202b60e01b5f5260045ffd5b90915f19838309928083029283808610950394808603951461320257848311156131ea5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613210570490565b634e487b7160e01b5f52601260045260245ffd5b60ff5f5160206133285f395f51905f525460401c161561324057565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af115610bf8575f513d61329e57506001600160a01b0381163b155b61327e5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561327756fe7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858017315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858037315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185804cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a007315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800","recompiledBytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461230c578063095ea7b31461227d57806313007d551461225657806318160ddd1461222657806323b872dd146121f7578063313ce567146121dc5780633644e515146121545780633abc107914611ddf5780633b6f743b14611c825780633f4ba83a14611ba857806340c10f19146119a557806342966c68146119405780634904ac8f1461188857806353735f37146118595780635c975abb1461182b5780635e280f11146117a95780636c2eb350146116ef57806370a08231146116ab57806379cc6790146116395780637ecebe0014611607578063804d4ffc146114675780638456cb591461136b578063857749b01461135057806395d89b411461126257806397e2b9af146112365780639f68b9641461121c578063a781a3fd146111f1578063a850e02414611138578063a9059cbb14611107578063b84c824614610f59578063c47f002714610d6a578063c7c7f5b3146109a8578063d4ec137a14610961578063d505accf1461079b578063d5abeb0114610781578063d8ddf18f14610752578063db0ed6a0146102cc578063dd62ed3e14610298578063f0b7db4e14610264578063f5eb42dc14610232578063fc0c546a146102185763fe575a87146101e7575f80fd5b3461021457602036600319011261021457602061020a610205612351565b612b6b565b6040519015158152f35b5f80fd5b34610214575f366003190112610214576020604051308152f35b346102145760203660031901126102145761024b612351565b6387a211a2600c525f52602080600c2054604051908152f35b34610214575f366003190112610214575f5160206132e85f395f51905f52546040516001600160a01b039091168152602090f35b346102145760403660031901126102145760206102c46102b6612351565b6102be612367565b90612b2e565b604051908152f35b346102145760a0366003190112610214576004356001600160401b038111610214576102fc903690600401612492565b6024356001600160401b0381116102145761031b903690600401612492565b906044356001600160a01b0381169081810361021457610339612393565b9261034261237d565b505f5160206133285f395f51905f5254936001600160401b0360ff8660401c161595168015908161074a575b6001149081610740575b159081610737575b50610728578460016001600160401b03195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556106f3575b6001600160a01b03169283156106e457156106e4578051156106d5578451156106c6578051906001600160401b0382116106175761040a826104055f5160206133485f395f51905f52546124e7565b61298a565b602090601f831160011461062b5761043992915f918361058b575b50508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b83516001600160401b03811161061757610479816104745f5160206132a85f395f51905f52546124e7565b61292e565b6020601f82116001146105965790806104ac926104c09596975f9261058b5750508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f52556127cc565b5f5160206132c85f395f51905f5280546fffffffffffffffffffffffffffffffff1916670de0b6b3a76400001790555f5160206132e85f395f51905f5280546001600160a01b03191682179055610515613224565b6bffffffffffffffffffffffff60a01b5f5416175f55610533613224565b61053957005b60ff60401b195f5160206133285f395f51905f5254165f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508780610425565b601f198216955f5160206132a85f395f51905f525f52815f20965f5b8181106105ff5750916104c0959697918460019594106105e7575b505050811b015f5160206132a85f395f51905f52556127cc565b01515f1960f88460031b161c191690558680806105cd565b838301518955600190980197602093840193016105b2565b634e487b7160e01b5f52604160045260245ffd5b90601f198316915f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372925f5b8181106106ae5750908460019594939210610696575b505050811b015f5160206133485f395f51905f5255610449565b01515f1960f88460031b161c1916905586808061067c565b92936020600181928786015181550195019301610666565b63010466f160e21b5f5260045ffd5b63430f13b360e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6801000000000000000060ff60401b195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556103b6565b63f92ee8a960e01b5f5260045ffd5b90501587610380565b303b159150610378565b86915061036e565b346102145760203660031901126102145760206102c46001600160801b03610778612900565b16600435613026565b34610214575f3660031901126102145760206102c46129e6565b346102145760e0366003190112610214576107b4612351565b6107bc612367565b604435916064356084359260ff84168403610214576001600160a01b0316936e22d473030f116ddee9f6b43ac78ba385188119151715610954576107fe61251f565b6020815191012090824211610947576040519360018060a01b03169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361093a577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b34610214575f366003190112610214577f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185802546040516001600160a01b039091168152602090f35b6080366003190112610214576004356001600160401b0381116102145760e081600401916003199036030112610214576040366023190112610214576109ec612393565b6109f4612637565b506109fd61261f565b50610a06612d3a565b610a0f33612d61565b610a17612637565b50610a2061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b81526001600160a01b0390911691602082600481865afa918215610bf8576004926020915f91610d3d575b50604051631c2eb17b60e31b815293849182906001600160a01b03165afa8015610bf8575f90610cf8575b60c092506001600160a01b031680151580610ced575b610c03575b5060405192838080936362385ce160e11b825233600483015260a06024830152610ad960a48301896126e2565b906024356044840152604435606484015260018060a01b03166084830152039134905af1918215610bf8575f915f93610b72575b50815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b0390f35b9150915060c03d60c011610bf1575b610b8b8183612471565b81019080820360c08112610214576080136102145760405191610bad83612456565b8151835260208201516001600160401b038116810361021457610bea926080916020860152610bdf8360408301612669565b604086015201612669565b9183610b0d565b503d610b81565b6040513d5f823e3d90fd5b602435610c406040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b8361324f565b60205f604051928284019063095ea7b360e01b8252886024860152604485015260448452610c6f606485612471565b83519082865af15f513d82610cd1575b505015610c8d575b50610aac565b610cca91610cc560405163095ea7b360e01b60208201528760248201525f604482015260448152610cbf606482612471565b8261324f565b61324f565b8480610c87565b909150610ce55750813b15155b8780610c7f565b600114610cde565b506024351515610aa7565b50906020813d602011610d35575b81610d1360209383612471565b810103126102145751906001600160a01b03821682036102145760c091610a91565b3d9150610d06565b610d5d9150823d8411610d63575b610d558183612471565b81019061282c565b86610a66565b503d610d4b565b3461021457610d78366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610dc4915f91610f2a575b5061278d565b6001600160401b03821161061757610ded826104055f5160206133485f395f51905f52546124e7565b5f91601f8111600114610e7257610e3b81807f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf955f91610e67575b508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b610e626040519283926020845260208401916126c2565b0390a1005b905084013586610e28565b601f198116925f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372905f5b858110610f125750827f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf9510610ef9575b5050600181811b015f5160206133485f395f51905f5255610e4b565b8301355f19600384901b60f8161c191690558380610edd565b90916020600181928588013581550193019101610eac565b610f4c915060203d602011610f52575b610f448183612471565b810190612775565b84610dbe565b503d610f3a565b3461021457610f67366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610fb2915f91610f2a575061278d565b6001600160401b03821161061757610fdb826104745f5160206132a85f395f51905f52546124e7565b5f91601f811160011461104e5761102881807f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99955f91610e6757508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f5255610e626040519283926020845260208401916126c2565b5f5160206132a85f395f51905f525f908152601f198216937f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc915b8581106110ef5750827f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c9995106110d6575b5050600181811b015f5160206132a85f395f51905f5255610e4b565b8301355f19600384901b60f8161c1916905583806110ba565b90916020600181928588013581550193019101611089565b346102145760403660031901126102145761112d611123612351565b6024359033612c10565b602060405160018152f35b34610214576020366003190112610214576004356001600160801b03811690818103610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576111a6915f91610f2a575061278d565b81156111e2577f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13916111d960209261284b565b604051908152a1005b637c946ed760e01b5f5260045ffd5b34610214575f36600319011261021457602061120b612900565b6001600160801b0360405191168152f35b34610214575f3660031901126102145760206040515f8152f35b3461021457604036600319011261021457602061020a611254612351565b61125c612367565b9061287f565b34610214575f366003190112610214576040515f5f5160206132a85f395f51905f525461128e816124e7565b808452906001811690811561132c57506001146112c2575b610b6e836112b681850382612471565b60405191829182612327565b5f5160206132a85f395f51905f525f9081527f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc939250905b808210611312575090915081016020016112b66112a6565b9192600181602092548385880101520191019092916112fa565b60ff191660208086019190915291151560051b840190910191506112b690506112a6565b34610214575f36600319011261021457602060405160098152f35b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576113c3915f91611448575061278d565b6113cb612d3a565b600160ff195f5160206133085f395f51905f525416175f5160206133085f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a16040514281527fba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd660203092a2005b611461915060203d602011610f5257610f448183612471565b82610dbe565b34610214576040366003190112610214575f546040516395a8c58d60e01b8152336004808301919091526002602480840191909152359290359190602090829060449082906001600160a01b03165afa8015610bf8576114cd915f91610f2a575061278d565b6114d5613149565b801515806115fe575b156115ef575f5160206132c85f395f51905f52546001600160801b0316806115e157506001600160801b03670de0b6b3a76400005b1661151f838383613171565b926001600160801b0384116115c95792608092917f8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b946115676001600160801b03841661284b565b7f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf136020604051858152a1604051938452602084015260408301526060820152a160206001600160801b035f5160206132c85f395f51905f525416604051908152f35b836306dfcc6560e41b5f52608060045260245260445ffd5b6001600160801b0390611513565b631d94864560e11b5f5260045ffd5b508115156114de565b3461021457602036600319011261021457611620612351565b6338377508600c525f52602080600c2054604051908152f35b3461021457604036600319011261021457611652612351565b5f546040516395a8c58d60e01b8152336004820152600260248201529190602090839060449082906001600160a01b03165afa918215610bf8576116a9926116a0915f91610f2a575061278d565b60243590612e53565b005b34610214576020366003190112610214576116c4612351565b6387a211a2600c525f5260206102c481600c20546001600160801b036116e8612900565b1690612f9f565b34610214575f366003190112610214575f5160206133285f395f51905f525460ff8160401c16908115611794575b50610728575f5160206133285f395f51905f52805468ffffffffffffffffff1916680100000000000000048117909155600417611758613224565b5f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160048152a1005b600491506001600160401b031610158161171d565b34610214575f366003190112610214575f5160206132e85f395f51905f5254604051635e280f1160e01b815290602090829060049082906001600160a01b03165afa8015610bf8576020915f9161180e575b506040516001600160a01b039091168152f35b6118259150823d8411610d6357610d558183612471565b826117fb565b34610214575f36600319011261021457602060ff5f5160206133085f395f51905f5254166040519015158152f35b346102145760203660031901126102145760206102c46001600160801b0361187f612900565b16600435612f9f565b34610214576020366003190112610214576118a1612351565b5f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576118e9915f91611921575061278d565b6118f2816127cc565b6001600160a01b03167fc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea45f80a2005b61193a915060203d602011610f5257610f448183612471565b83610dbe565b34610214576020366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611999915f91611448575061278d565b6116a960043533612e53565b34610214576040366003190112610214576119be612351565b5f546040516395a8c58d60e01b81523360048201526002602480830191909152359291602090829060449082906001600160a01b03165afa8015610bf857611a0c915f91610f2a575061278d565b6001600160a01b03811680156106e4575f5160206132e85f395f51905f52546001600160a01b031690611a3e33612bcb565b15611b27575b50506805345cdf77eb68f44c5490611a6c6001600160801b03611a65612900565b1684613026565b91828101908110611b02576001600160801b03611a87612900565b16670de0b6b3a7640000611a9c8183856130c3565b918309611b11575b611aac6129e6565b10611b02576805345cdf77eb68f44c556387a211a2600c525f526020600c20908154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3005b63e5cfe95760e01b5f5260045ffd5b60010180611aa4575b63ae47f7025f526004601cfd5b8115611b99576020906044604051809481936383609b0f60e01b83525f600484015260248301525afa908115610bf8575f91611b7a575b5015611b6b578280611a44565b6315df7de160e31b5f5260045ffd5b611b93915060203d602011610f5257610f448183612471565b83611b5e565b630588ca9560e01b5f5260045ffd5b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611c00915f91611448575061278d565b611c08613149565b60ff195f5160206133085f395f51905f5254165f5160206133085f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a16040514281527fcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de60203092a2005b34610214576040366003190112610214576004356001600160401b0381116102145760e06003198236030112610214576024359081151580920361021457611cc861261f565b505f5160206132e85f395f51905f525460405163f99e156960e01b81523060048201526001600160a01b0390911690602081602481855afa908115610bf8575f91611daa575b5090604092611d43928451958694859384936315efa6af60e11b855260048501526060602485015260648401906004016126e2565b90604483015203915afa8015610bf8575f90611d6f575b60409060208251918051835201516020820152f35b5060403d604011611da3575b611d858183612471565b81019060408183031261021457604091611d9e91612669565b611d5a565b503d611d7b565b9190506020823d602011611dd7575b81611dc660209383612471565b810103126102145790516040611d0e565b3d9150611db9565b60a0366003190112610214576004356001600160401b03811161021457806004019060e0600319823603011261021457611e17612367565b604036604319011261021457611e2b61237d565b91611e34612637565b50611e3d61261f565b50611e46612d3a565b611e4f82612d61565b611e5833612bcb565b1561210b575b50611e67612637565b50611e7061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b815291906001600160a01b0316602083600481845afa928315610bf8576004936020915f916120ee575b50604051631c2eb17b60e31b815294859182906001600160a01b03165afa8015610bf8575f906120a9575b60c093506001600160a01b03168015158061209e575b611fc5575b5060405180809581946362385ce160e11b835260018060a01b0316600483015260a06024830152611f2f60a48301896126e2565b604480359084015260648035908401526001600160a01b039091166084830152039134905af1918215610bf8575f915f93610b725750815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b604435611ffc6040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b60205f604051928284019063095ea7b360e01b825286602486015260448501526044845261202b606485612471565b83519082865af15f513d82612082575b505015612049575b50611efb565b61207b91610cc560405163095ea7b360e01b60208201528560248201525f604482015260448152610cbf606482612471565b8580612043565b9091506120965750813b15155b888061203b565b60011461208f565b506044351515611ef6565b50916020813d6020116120e6575b816120c460209383612471565b810103126102145751916001600160a01b03831683036102145760c092611ee0565b3d91506120b7565b6121059150823d8411610d6357610d558183612471565b87611eb5565b6044633b9aca0091013504633b9aca00810290808204633b9aca0014901517156121405761213a903383612df5565b83611e5e565b634e487b7160e01b5f52601160045260245ffd5b34610214575f36600319011261021457602060a061217061251f565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b34610214575f36600319011261021457602060405160128152f35b3461021457606036600319011261021457602061020a612215612351565b61221d612367565b604435916125ee565b34610214575f3660031901126102145760206102c46805345cdf77eb68f44c546001600160801b036116e8612900565b34610214575f366003190112610214575f546040516001600160a01b039091168152602090f35b3461021457604036600319011261021457612296612351565b602435906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba318821915171561095457602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b34610214575f36600319011261021457610b6e6112b661251f565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361021457565b602435906001600160a01b038216820361021457565b608435906001600160a01b038216820361021457565b606435906001600160a01b038216820361021457565b909291602060a09181604060c0860197805187526001600160401b0383820151168388015201518051604087015201516060850152805160808501520151910152565b906020600319830112610214576004356001600160401b0381116102145782602382011215610214578060040135926001600160401b0384116102145760248483010111610214576024019190565b604081019081106001600160401b0382111761061757604052565b606081019081106001600160401b0382111761061757604052565b90601f801991011681019081106001600160401b0382111761061757604052565b81601f82011215610214578035906001600160401b03821161061757604051926124c6601f8401601f191660200185612471565b8284526020838301011161021457815f926020809301838601378301015290565b90600182811c92168015612515575b602083101461250157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916124f6565b604051905f825f5160206133485f395f51905f52549161253e836124e7565b80835292600181169081156125cf5750600114612564575b61256292500383612471565b565b505f5160206133485f395f51905f525f90815290917ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea750093725b8183106125b357505090602061256292820101612556565b602091935080600191548385890101520191019091849261259b565b6020925061256294915060ff191682840152151560051b820101612556565b91906125f933612bcb565b612616576126119261260c833383612df5565b612c10565b600190565b61261192612c10565b6040519061262c8261243b565b5f6020838281520152565b6040519061264482612456565b815f81525f6020820152604080519161265c8361243b565b5f83525f60208401520152565b9190826040910312610214576040516126818161243b565b6020808294805184520151910152565b9035601e19823603018112156102145701602081359101916001600160401b03821161021457813603831361021457565b908060209392818452848401375f828201840152601f01601f1916010190565b80359163ffffffff83168093036102145761277292815260208201356020820152604082013560408201526060820135606082015261276461275961273e61272d6080860186612691565b60e0608087015260e08601916126c2565b61274b60a0860186612691565b9085830360a08701526126c2565b9260c0810190612691565b9160c08185039101526126c2565b90565b90816020910312610214575180151581036102145790565b1561279457565b60405162461bcd60e51b815260206004820152601060248201526f1050ce881d5b985d5d1a1bdc9a5e995960821b6044820152606490fd5b60018060a01b03166bffffffffffffffffffffffff60a01b7f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858025416177f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f18580255565b9081602091031261021457516001600160a01b03811681036102145790565b6001600160801b03166001600160801b03195f5160206132c85f395f51905f525416175f5160206132c85f395f51905f5255565b5f5160206132e85f395f51905f52546001600160a01b03169182156128f9576040516383609b0f60e01b81526001600160a01b0392831660048201529116602482015290602090829060449082905afa908115610bf8575f916128e0575090565b612772915060203d602011610f5257610f448183612471565b5050505f90565b6001600160801b035f5160206132c85f395f51905f52541680156129215790565b50670de0b6b3a764000090565b601f811161293a575050565b5f5160206132a85f395f51905f525f5260205f20906020601f840160051c83019310612980575b601f0160051c01905b818110612975575050565b5f815560010161296a565b9091508190612961565b601f8111612996575050565b5f5160206133485f395f51905f525f5260205f20906020601f840160051c830193106129dc575b601f0160051c01905b8181106129d1575050565b5f81556001016129c6565b90915081906129bd565b6129ee612900565b6001600160801b03811690670de0b6b3a7640000821015612a8f5750805f0390670de0b6b3a7640000815f198404140215612a325750670de0b6b3a7640000900490565b670de0b6b3a76400005f1982810983811084019003915f19099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a76400008111612aa65750505f1990565b670de0b6b3a763ffff1991670de0b6b3a763fffe196001600160801b0383670de0b6b3a76400005f190992845f03161692815f03811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211015f0302170290565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612b6457602052637f5e9f20600c525f526034600c205490565b50505f1990565b5f5160206132e85f395f51905f52546001600160a01b0316908115612bc55760405163fe575a8760e01b81526001600160a01b03909116600482015290602090829060249082905afa908115610bf8575f916128e0575090565b50505f90565b5f546040516395a8c58d60e01b81526001600160a01b039283166004820152600260248201529160209183916044918391165afa908115610bf8575f916128e0575090565b5f5160206132e85f395f51905f5254909291906001600160a01b0316612c3533612bcb565b15612cca575b50612c566001600160801b03612c4f612900565b1683613026565b906387a211a28460601b17600c526020600c208054808411612cbd5783900390555f526020600c20908154019055602052600c5160601c9060018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63f4d678b85f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b0385811660048301528316602482015290602090829060449082905afa908115610bf8575f91612d1b575b5015611b6b575f612c3b565b612d34915060203d602011610f5257610f448183612471565b5f612d0f565b60ff5f5160206133085f395f51905f525416612d5257565b63d93c066560e01b5f5260045ffd5b5f5160206132e85f395f51905f52546001600160a01b03168015612df157612d8833612bcb565b612df1576040516383609b0f60e01b81526001600160a01b039290921660048301525f6024830152602090829060449082905afa908115610bf8575f91612dd2575b5015611b6b57565b612deb915060203d602011610f5257610f448183612471565b5f612dca565b5050565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612e4e57602052637f5e9f20600c525f526034600c209081548019612e3557505050565b808211612e4157039055565b6313be252b5f526004601cfd5b505050565b5f5160206132e85f395f51905f52546001600160a01b0316612e7433612bcb565b15612f31575b506001600160801b03612e8b612900565b1691612ea083670de0b6b3a7640000836130c3565b92670de0b6b3a76400008209612f1a575b6387a211a2600c52815f526020600c2092835493848211612cbd57815f950390556805345cdf77eb68f44c54036805345cdf77eb68f44c55825260018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3565b916001019182612eb15763ae47f7025f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b03831660048201525f602482015290602090829060449082905afa908115610bf8575f91612f80575b5015611b6b575f612e7a565b612f99915060203d602011610f5257610f448183612471565b5f612f74565b81810291670de0b6b3a764000081838504148315170215612fca575050670de0b6b3a7640000900490565b670de0b6b3a7640000905f198184098481108501900392099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a764000082029181670de0b6b3a76400008285041482151702156130505750900490565b81670de0b6b3a76400005f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b818102929181158285048214178302156130de575050900490565b82905f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b60ff5f5160206133085f395f51905f5254161561316257565b638dfc202b60e01b5f5260045ffd5b90915f19838309928083029283808610950394808603951461320257848311156131ea5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613210570490565b634e487b7160e01b5f52601260045260245ffd5b60ff5f5160206133285f395f51905f525460401c161561324057565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af115610bf8575f513d61329e57506001600160a01b0381163b155b61327e5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561327756fe7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858017315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858037315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185804cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a007315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800","sourceMap":"1512:13340:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11144:31;1512:13340;11144:31;;;1512:13340;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;10865:4;1512:13340;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;7321:148:23;;;1512:13340:36;7321:148:23;1512:13340:36;7321:148:23;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;1512:13340:36;;;;;4301:16:9;1512:13340:36;;4724:16:9;;:34;;;;1512:13340:36;4803:1:9;4788:16;:50;;;;1512:13340:36;4853:13:9;:30;;;;1512:13340:36;4849:91:9;;;1512:13340:36;4803:1:9;-1:-1:-1;;;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;4977:67:9;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;3501:28;;1512:13340;;3563:54;1512:13340;;;;3651:23;1512:13340;;;;3708:25;1512:13340;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;3871:43;1512:13340;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3871:43;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;1512:13340:36;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;;1512:13340:36;;;;;6891:76:9;;:::i;:::-;1512:13340:36;;;;;;;;;6891:76:9;;:::i;:::-;5064:101;;1512:13340:36;5064:101:9;-1:-1:-1;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;5140:14:9;1512:13340:36;;;4803:1:9;1512:13340:36;;5140:14:9;1512:13340:36;;;;;-1:-1:-1;1512:13340:36;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;3871:43;1512:13340;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3871:43;:::i;1512:13340::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4977:67:9;1512:13340:36;-1:-1:-1;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;4977:67:9;;4849:91;6496:23;;;1512:13340:36;4906:23:9;1512:13340:36;;4906:23:9;4853:30;4870:13;;;4853:30;;;4788:50;4816:4;4808:25;:30;;-1:-1:-1;4788:50:9;;4724:34;;;-1:-1:-1;4724:34:9;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;;1347:84:33;-1:-1:-1;;;;;1413:17:33;;:::i;:::-;1512:13340:36;;;1347:84:33;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17979:337:23;;;;;;;;;;;;1512:13340:36;;:::i;:::-;;;;;;18516:24:23;18639:2753;;;;;;1512:13340:36;18639:2753:23;8384:339;;;;;;18639:2753;;;;;;1512:13340:36;18639:2753:23;1512:13340:36;;18639:2753:23;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;1512:13340:36;18639:2753:23;;;5177:66;18639:2753;;;1512:13340:36;18639:2753:23;;;;;;;1512:13340:36;18639:2753:23;;;;;;1512:13340:36;18639:2753:23;;;;;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;;;;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;1512:13340:36;;;18639:2753:23;1512:13340:36;;;18639:2753:23;1512:13340:36;18639:2753:23;1512:13340:36;;;18639:2753:23;;;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;1512:13340:36;18639:2753:23;;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;;;;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;;17979:337;;1512:13340:36;17979:337:23;1512:13340:36;17979:337:23;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;4575:39;1512:13340;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;1944:72:11;;:::i;:::-;11443:10:36;;;:::i;:::-;1512:13340;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;13774:25:36;;-1:-1:-1;;;;;1512:13340:36;;;;13774:25;1512:13340;;;;13774:25;;;;;;;1512:13340;13774:25;;;1512:13340;13774:25;;;1512:13340;-1:-1:-1;1512:13340:36;;-1:-1:-1;;;13774:39:36;;1512:13340;;;;;-1:-1:-1;;;;;1512:13340:36;13774:39;;;;;;1512:13340;13774:39;;;1512:13340;14081:74;;-1:-1:-1;;;;;;1512:13340:36;13827:25;;;;:46;;1512:13340;13823:221;;1512:13340;;;;;;;;;;;;14081:74;;11443:10;1512:13340;14081:74;;1512:13340;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;8384:339:23;;;;;1512:13340:36;;;;;14081:74;14122:9;;14081:74;;;;;;;;1512:13340;;;14081:74;;;1512:13340;14054:101;1512:13340;;;;;;;;;;;;;;;13774:25;14462:27;;1512:13340;;;;;;;13774:25;1512:13340;;;;;;;14387:103;1512:13340;11443:10;14387:103;;1512:13340;;;;;;;;:::i;:::-;;;;14081:74;;;;;;;;;;;;;;;;:::i;:::-;;;1512:13340;;;;14081:74;1512:13340;;;;;-1:-1:-1;1512:13340:36;;;;;;;;:::i;:::-;;;;;13774:25;1512:13340;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;13774:25;1512:13340;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;14081:74;;;;;;;;;;1512:13340;;;;;;;;;13823:221;1512:13340;;1745:53:17;1512:13340:36;;;;;13774:25;1745:53:17;;;11443:10:36;1512:13340;1745:53:17;;1512:13340:36;13946:4;1512:13340;;;;;;;;;;1745:53:17;;;;;;:::i;:::-;;;:::i;:::-;13774:25:36;1512:13340;;;5199:47:17;;;;1512:13340:36;;;;5199:47:17;;;1512:13340:36;5199:47:17;;1512:13340:36;;;;;;5199:47:17;;;1512:13340:36;5199:47:17;;:::i;:::-;9770:199;;;;;;;1512:13340:36;9770:199:17;;9985:80;;;13823:221:36;5261:45:17;;;5257:201;;13823:221:36;;;;5257:201:17;5434:12;1512:13340:36;5349:43:17;1512:13340:36;;;;;13774:25;5349:43:17;;;;1512:13340:36;5349:43:17;;1512:13340:36;;;;;;;5349:43:17;;;1512:13340:36;5349:43:17;;:::i;:::-;;;:::i;:::-;5434:12;:::i;:::-;5257:201;;;;9985:80;9997:67;;-1:-1:-1;9997:15:17;;10015:26;;;:30;;9997:67;9985:80;;;;9997:67;1512:13340:36;10048:16:17;9997:67;;13827:46:36;1512:13340;;;13856:17;;13827:46;;13774:39;;;:25;:39;;:25;:39;;;;;;:25;:39;;;:::i;:::-;;;1512:13340;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;14081:74;13774:39;;;;;;-1:-1:-1;13774:39:36;;:25;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1512:13340;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;8384:339:23;;;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1512:13340:36;1686:68:25;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;;;;;;;;;;;;5952:16;1512:13340;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;1694:39:25;1512:13340:36;;1694:39:25;1512:13340:36;;;;:::i;:::-;5952:16;;;1512:13340;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;5952:16;1512:13340;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;;1694:39:25;1512:13340:36;;;;;;;;;;;;;;;;1694:39:25;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1512:13340:36;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;8384:339:23;;;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;;;;;;;;;;;;6248:20;1512:13340;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;1694:39:25;1512:13340:36;;1694:39:25;1512:13340:36;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;6248:20;1512:13340;;;;;;;6212:9;1512:13340;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;;1694:39:25;6212:9:36;1512:13340;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;3023:6:33;1512:13340:36;;:::i;:::-;;;3007:10:33;;3023:6;:::i;:::-;1512:13340:36;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;6511:20:36;;1512:13340;;6663:36;6611:37;;1512:13340;6611:37;;:::i;:::-;1512:13340;;;;;6663:36;1512:13340;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;11048:1;1512:13340;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;1944:72:11;;:::i;:::-;3300:4;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3319:20:11;1694:39:25;1512:13340:36;;1716:10:25;1512:13340:36;;3319:20:11;1512:13340:36;;14675:15;1512:13340;;14647:44;1694:39:25;14668:4:36;14647:44;;1512:13340;1694:39:25;;;;;;;;;;;;;;:::i;:::-;;;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;2194:66:11;;:::i;:::-;4759:7:36;;;:20;;;1512:13340;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;4877:23;1512:13340;;4877:97;-1:-1:-1;;;;;796:7:33;4877:97:36;1512:13340;5029:30;;;;;:::i;:::-;9344:25:22;-1:-1:-1;;;;;9344:25:22;;9340:105;;1512:13340:36;;;;5196:41;1512:13340;5070:40;-1:-1:-1;;;;;1512:13340:36;;5070:40;:::i;:::-;5154:27;1512:13340;;;;;;5154:27;1512:13340;;;;;;;;;;;;;;;;;5196:41;1512:13340;-1:-1:-1;;;;;;;;;;;;;;;;1512:13340:36;;;;;;;;9340:105:22;9392:42;;;;1512:13340:36;9392:42:22;9423:3;1512:13340:36;;;;;;9392:42:22;4877:97:36;-1:-1:-1;;;;;4877:97:36;;;1512:13340;;;;;;;;;4759:20;4770:9;;;;4759:20;;1512:13340;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;17287:205:23;;;1512:13340:36;17287:205:23;1512:13340:36;17287:205:23;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;;8040:5:36;1694:39:25;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;1512:13340:36;;8040:5;;:::i;:::-;1512:13340;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;7321:148:23;;;1512:13340:36;7321:148:23;1512:13340:36;1153:83:33;7321:148:23;;;;-1:-1:-1;;;;;1190:17:33;;:::i;:::-;1512:13340:36;1153:83:33;;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;6429:44:9;;;;;1512:13340:36;6425:105:9;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;1512:13340:36;;;;;;;;;6891:76:9;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;6654:20:9;1512:13340:36;;;;;;6654:20:9;1512:13340:36;6429:44:9;1512:13340:36;;;-1:-1:-1;;;;;1512:13340:36;6448:25:9;;6429:44;;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;11144:31:36;;1512:13340;11144:31;;1512:13340;;;;;;-1:-1:-1;;;;;1512:13340:36;11144:31;;;;;;;;1512:13340;11144:31;;;1512:13340;-1:-1:-1;1512:13340:36;;-1:-1:-1;;;;;1512:13340:36;;;;;;11144:31;;;;;;;;;;;;;;:::i;:::-;;;;1512:13340;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;1153:83:33;-1:-1:-1;;;;;1190:17:33;;:::i;:::-;1512:13340:36;;;1153:83:33;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;6967:37:36;;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;7019:36;1512:13340;;7019:36;1512:13340;1694:39:25;;;;1512:13340:36;1694:39:25;1512:13340:36;1694:39:25;;;;;;;:::i;:::-;;;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;7689:5:36;1512:13340;;1716:10:25;7689:5:36;:::i;1512:13340::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;7402:16;;1512:13340;;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;8786:42;1716:10:25;8786:42:36;:::i;:::-;8785:43;8781:537;;1512:13340;7049:68:23;;;;1413:17:33;1347:84;-1:-1:-1;;;;;1413:17:33;;:::i;:::-;1512:13340:36;1347:84:33;;:::i;:::-;1512:13340:36;;;;5284:36:33;;;5280:70;;-1:-1:-1;;;;;5566:17:33;;:::i;:::-;1512:13340:36;;25748:19:24;;;;;:::i;:::-;25820:256;;;;;1512:13340:36;5631:11:33;;:::i;:::-;-1:-1:-1;5500:181:33;;7049:68:23;5734:588:33;;;;1512:13340:36;5734:588:33;1512:13340:36;5734:588:33;;;;;;;;1512:13340:36;5734:588:33;;;;;1512:13340:36;5734:588:33;1512:13340:36;5734:588:33;;1512:13340:36;5500:181:33;5329:21;;;1512:13340:36;5660:21:33;1512:13340:36;;5660:21:33;25820:256:24;;;;;;;;1512:13340:36;25820:256:24;1512:13340:36;25820:256:24;;8781:537:36;8856:33;;1512:13340;;;;9091:95;1512:13340;;;;;;;;;9091:95;;1512:13340;;9091:95;;1512:13340;;;;;9091:95;;;;;;;1512:13340;9091:95;;;8781:537;1512:13340;;;;8781:537;;;;1512:13340;;;;;;;;;9091:95;;;;1512:13340;9091:95;1512:13340;9091:95;;;;;;;:::i;:::-;;;;1512:13340;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;2194:66:11;;:::i;:::-;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3627:22:11;1694:39:25;1512:13340:36;;1716:10:25;1512:13340:36;;3627:22:11;1512:13340:36;;14827:15;1512:13340;;14797:46;1694:39:25;14820:4:36;14797:46;;1512:13340;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;13353:53:36;;13400:4;1512:13340;13353:53;;1512:13340;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;13353:53;;;;;;;1512:13340;13353:53;;;1512:13340;;;;;;;;;;;;;;;;;;;13423:71;;1512:13340;13423:71;;1512:13340;;;;;;;;;;;;;:::i;:::-;;;;;;13423:71;;;;;;;;1512:13340;13423:71;;;1512:13340;;;;;;;;;;;;;;;;;;13423:71;;1512:13340;13423:71;1512:13340;13423:71;;;;;;;;:::i;:::-;;;1512:13340;;;;;;;;;;;;;:::i;:::-;13423:71;;;;;;;13353:53;;;;1512:13340;13353:53;;1512:13340;13353:53;;;;;;1512:13340;13353:53;;;:::i;:::-;;;1512:13340;;;;;;;13353:53;;;;;-1:-1:-1;13353:53:36;;1512:13340;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;1944:72:11;;:::i;:::-;11814:5:36;;;:::i;:::-;11835:42;966:10:10;11835:42:36;:::i;:::-;11834:43;11830:301;;1512:13340;12147:49;1512:13340;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;13774:25:36;;1512:13340;;-1:-1:-1;;;;;1512:13340:36;13774:25;1512:13340;;;;13774:25;;;;;;;1512:13340;13774:25;;;1512:13340;13774:25;;;1512:13340;-1:-1:-1;1512:13340:36;;-1:-1:-1;;;13774:39:36;;1512:13340;;;;;-1:-1:-1;;;;;1512:13340:36;13774:39;;;;;;1512:13340;13774:39;;;1512:13340;14081:74;;-1:-1:-1;;;;;;1512:13340:36;13827:25;;;;:46;;1512:13340;13823:221;;1512:13340;;;;;;;;;;;;14081:74;;8384:339:23;;;;;1512:13340:36;;14081:74;;1512:13340;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;14081:74;;14122:9;;14081:74;;;;;;;1512:13340;;;14081:74;;;14054:101;1512:13340;;;;;;;;;;;;;;;13774:25;14462:27;;1512:13340;;;;;;;13774:25;1512:13340;;;;;;;14387:103;1512:13340;966:10:10;14387:103:36;;1512:13340;;;;;;;;:::i;13823:221::-;1512:13340;;1745:53:17;1512:13340:36;;;;;13774:25;1745:53:17;;;966:10:10;1512:13340:36;1745:53:17;;1512:13340:36;13946:4;1512:13340;;;;;;;;;;1745:53:17;;;;;;:::i;:::-;13774:25:36;1512:13340;;;5199:47:17;;;;1512:13340:36;;;;5199:47:17;;;1512:13340:36;5199:47:17;;1512:13340:36;;;;;;5199:47:17;;;1512:13340:36;5199:47:17;;:::i;:::-;9770:199;;;;;;;1512:13340:36;9770:199:17;;9985:80;;;13823:221:36;5261:45:17;;;5257:201;;13823:221:36;;;;5257:201:17;5434:12;1512:13340:36;5349:43:17;1512:13340:36;;;;;13774:25;5349:43:17;;;;1512:13340:36;5349:43:17;;1512:13340:36;;;;;;;5349:43:17;;;1512:13340:36;5349:43:17;;:::i;5434:12::-;5257:201;;;;9985:80;9997:67;;-1:-1:-1;9997:15:17;;10015:26;;;:30;;9997:67;9985:80;;;;9997:67;1512:13340:36;10048:16:17;9997:67;;13827:46:36;1512:13340;;;13856:17;;13827:46;;13774:39;;;:25;:39;;:25;:39;;;;;;:25;:39;;;:::i;:::-;;;1512:13340;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;14081:74;13774:39;;;;;;-1:-1:-1;13774:39:36;;:25;;;;;;;;;;;;;;:::i;:::-;;;;11830:301;1512:13340;12109:3;12087:19;;1512:13340;;12109:3;1512:13340;;;;;;12109:3;1512:13340;;;;;;;12086:33;966:10:10;;12086:33:36;;:::i;:::-;11830:301;;;1512:13340;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;21866:344:23;1512:13340:36;;:::i;:::-;;;;;;21743:24:23;1512:13340:36;21866:344:23;;;;;;;;;5177:66;1512:13340:36;21866:344:23;;;;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;6574:2:23;1512:13340:36;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;1153:83:33;7049:68:23;;-1:-1:-1;;;;;1190:17:33;;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;8384:339:23;;;;;;;;;;;1512:13340:36;8785:413:23;;;;;1512:13340:36;8785:413:23;;;;;;1512:13340:36;8785:413:23;;;;;;;1512:13340:36;;8785:413:23;1512:13340:36;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1512:13340:36;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;-1:-1:-1;;;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8204:289;;;8313:42;966:10:10;8313:42:36;:::i;:::-;8309:125;;3248:6:33;966:10:10;3211:6:33;966:10:10;;3211:6:33;;:::i;:::-;3248;:::i;:::-;3272:4;8204:289:36;:::o;8309:125::-;8391:6;;;:::i;1512:13340::-;;;;;;;:::i;:::-;-1:-1:-1;1512:13340:36;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;:::i;:::-;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;;-1:-1:-1;;1512:13340:36;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;;1512:13340:36;;;;;;;;8384:339:23;;;;;1512:13340:36;;;;6967:21;1512:13340;;;6967:21;1512:13340;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;-1:-1:-1;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;:::o;9575:373::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;9782:33;;9778:51;;1512:13340;;-1:-1:-1;;;9846:95:36;;-1:-1:-1;;;;;1512:13340:36;;;9752:16;9846:95;;1512:13340;;;;;;;;9846:95;;1512:13340;;;;;;9846:95;;;;;;;1512:13340;9846:95;;;9839:102;9575:373;:::o;9846:95::-;;;;;;;;;;;;;;:::i;9778:51::-;9817:12;;;1512:13340;9817:12;:::o;5285:345::-;-1:-1:-1;;;;;;;;;;;;;;;;1512:13340:36;;5534:21;;5530:60;;5285:345;:::o;5530:60::-;5557:33;796:7:33;5557:33:36;:::o;1512:13340::-;;;;;;;;:::o;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;1512:13340:36;;;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;1512:13340:36;;;;;;;;;-1:-1:-1;1512:13340:36;;;;1810:805:33;2004:17;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;796:7:33;2035:45;;796:7;;;2196:93;21083:3141:24;1512:13340:36;21083:3141:24;;796:7:33;1512:13340:36;;;21083:3141:24;;;;;;;;796:7:33;21083:3141:24;;2189:100:33;:::o;21083:3141:24:-;796:7:33;-1:-1:-1;;1512:13340:36;;21083:3141:24;;;;;;;;;-1:-1:-1;;21083:3141:24;;;796:7:33;21083:3141:24;;;;;;;;;;;;;;;;;;;2189:100:33:o;2031:544::-;2310:45;796:7;2310:45;;2306:269;;2031:544;;1512:13340:36;;1810:805:33;:::o;2306:269::-;-1:-1:-1;;21083:3141:24;-1:-1:-1;;;;;;;1512:13340:36;796:7:33;-1:-1:-1;;21083:3141:24;;;1512:13340:36;21083:3141:24;;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1512:13340:36;21083:3141:24;;;;;;1512:13340:36;21083:3141:24;;;;2464:100:33;:::o;7570:495:23:-;;-1:-1:-1;;;;;1512:13340:36;;5890:42:23;7767:19;7763:49;;7875:184;;;;;1512:13340:36;7875:184:23;;;;;7570:495;:::o;7763:49::-;1512:13340:36;;;;7788:24:23;:::o;10179:333:36:-;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;10373:33;;10369:51;;1512:13340;;-1:-1:-1;;;10437:68:36;;-1:-1:-1;;;;;1512:13340:36;;;10343:16;10437:68;;1512:13340;;;;;;10437:68;;1512:13340;;10437:68;;;;;;;1512:13340;10437:68;;;10430:75;10179:333;:::o;10369:51::-;10408:12;;1512:13340;10408:12;:::o;1361:129:25:-;1450:13;1512:13340:36;;;-1:-1:-1;;;1450:33:25;;-1:-1:-1;;;;;1512:13340:36;;;1450:33:25;;;1512:13340:36;;;;;;;;;;;1450:33:25;;1512:13340:36;;;1450:33:25;;;;;;;:13;:33;;;1443:40;1361:129;:::o;3314:1455:33:-;-1:-1:-1;;;;;;;;;;;1512:13340:36;3314:1455:33;;;;-1:-1:-1;;;;;1512:13340:36;8786:42;966:10:10;8786:42:36;:::i;:::-;8785:43;8781:537;;3314:1455:33;1413:17;1347:84;-1:-1:-1;;;;;1413:17:33;;:::i;:::-;1512:13340:36;1347:84:33;;:::i;:::-;3552:1164;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3552:1164:33;;;;;;;;;;;;;;;;8384:339:23;;;;;;3552:1164:33;;;;;3314:1455::o;3552:1164::-;;-1:-1:-1;3552:1164:33;8755:16:36;3552:1164:33;;8781:537:36;8856:33;;1512:13340;;;;-1:-1:-1;;;9091:95:36;;-1:-1:-1;;;;;1512:13340:36;;;8755:16;9091:95;;1512:13340;;;;;;;;9091:95;;1512:13340;;;;;;9091:95;;;;;;;-1:-1:-1;9091:95:36;;;8781:537;1512:13340;;;;8781:537;;;9091:95;;;;;;;;;;;;;;:::i;:::-;;;;2709:128:11;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;2770:61:11;;2709:128::o;2770:61::-;2805:15;;;-1:-1:-1;2805:15:11;;-1:-1:-1;2805:15:11;12672:500:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;12825:33;;12821:46;;12880:42;966:10:10;12880:42:36;:::i;:::-;12876:55;;1512:13340;;-1:-1:-1;;;12961:103:36;;-1:-1:-1;;;;;1512:13340:36;;;;12777:34;12961:103;;1512:13340;-1:-1:-1;1512:13340:36;;;;12961:103;;1512:13340;;;;;;12961:103;;;;;;;-1:-1:-1;12961:103:36;;;12672:500;1512:13340;;;;12672:500::o;12961:103::-;;;;;;;;;;;;;;:::i;:::-;;;;12876:55;12924:7;;:::o;27435:1087:23:-;;-1:-1:-1;;;;;1512:13340:36;;5890:42:23;27590:19;27586:32;;27721:795;;;;;;;;;;;;;;;;;27435:1087;;;:::o;27721:795::-;;;;;;;;;27435:1087::o;27721:795::-;;;;;;;27586:32;27611:7;;;:::o;6412:1304:33:-;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;8786:42;966:10:10;8786:42:36;:::i;:::-;8785:43;8781:537;;6412:1304:33;6697:17;-1:-1:-1;;;;;6697:17:33;;:::i;:::-;1512:13340:36;6630:85:33;25748:19:24;;1512:13340:36;25748:19:24;;:::i;:::-;25820:256;1512:13340:36;25820:256:24;;;;6412:1304:33;6768:887;;;;6528:1;6768:887;;;;;;;;;;;;;;6528:1;6768:887;;;;;;;;;;;8384:339:23;;;;;6768:887:33;;;;;6412:1304::o;25820:256:24:-;;;;;;;;;6528:1:33;25820:256:24;8755:16:36;25820:256:24;;8781:537:36;8856:33;;1512:13340;;;;-1:-1:-1;;;9091:95:36;;-1:-1:-1;;;;;1512:13340:36;;8755:16;9091:95;;1512:13340;-1:-1:-1;1512:13340:36;;;;;9091:95;;1512:13340;;;;;;9091:95;;;;;;;6528:1:33;9091:95:36;;;8781:537;1512:13340;;;;8781:537;;;9091:95;;;;;;;;;;;;;;:::i;:::-;;;;20943:3287:24;21083:3141;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;1512:13340:36;21083:3141:24;;;20943:3287::o;21083:3141::-;1512:13340:36;;-1:-1:-1;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;20943:3287::o;:::-;;1512:13340:36;21083:3141:24;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;20943:3287::o;21083:3141::-;1512:13340:36;;-1:-1:-1;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:3287::o;:::-;21083:3141;;;;20943:3287;21083:3141;;;;;;;;;;;;;;;;;;20943:3287::o;21083:3141::-;1512:13340:36;;-1:-1:-1;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:3287::o;2909:126:11:-;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;2971:9:11;2967:62;;2909:126::o;2967:62::-;3003:15;;;-1:-1:-1;3003:15:11;;-1:-1:-1;3003:15:11;7242:3683:21;;;-1:-1:-1;;7242:3683:21;;1412:159;;;;;;;;;;;;;;;;7498:9;;7494:365;;7969:19;;;;7965:142;;8390:308;;;;940:4:19;1512:13340:36;940:4:19;8917:31:21;;8962:384;;;9800:1;940:4:19;9781:1:21;940:4:19;9780:21:21;940:4:19;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;8962:384:21;;;;1512:13340:36;8962:384:21;;;8390:308;;;;;;940:4:19;8390:308:21;;8962:384;9409:18;940:4:19;7242:3683:21;:::o;7965:142::-;1829:135:19;;1512:13340:36;1829:135:19;8028:16:21;5312:5;940:4:19;;5306:42:21;1829:135:19;;;;;7494:365:21;7827:17;;;;1512:13340:36;;;;;7820:24:21;:::o;1512:13340:36:-;;;;;;;;;;;;7082:141:9;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;7148:18:9;7144:73;;7082:141::o;7144:73::-;7189:17;;;-1:-1:-1;7189:17:9;;-1:-1:-1;7189:17:9;8370:720:17;;-1:-1:-1;8507:421:17;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:17;;8942:15;;-1:-1:-1;;;;;;1512:13340:36;;8960:26:17;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;-1:-1:-1;;;;9033:40:17;;;-1:-1:-1;;;;;1512:13340:36;;;;9033:40:17;1512:13340:36;;;9033:40:17;8942:68;9009:1;8994:16;;8942:68;","linkReferences":{},"cborAuxdata":{},"immutableReferences":{},"transformations":[],"transformationValues":{}},"deployment":{"transactionHash":"0xf58ced65b0af8904522b3c7a4d2d4d2c607aa935f705fcec76e5a4ea82892cdb","blockNumber":"485974985","transactionIndex":"3","deployer":"0x06B09f6008780771980BFE7D4BB821f5F1Aa60a3"},"sources":{"src/tokens/shares/retail/DShare.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControlledUpgradeable} from \"src/common/AccessControlledUpgradeable.sol\";\nimport {ITransferRestrictor} from \"src/tokens/shares/ITransferRestrictor.sol\";\nimport {ERC20Rebasing} from \"src/tokens/ERC20Rebasing.sol\";\nimport {SafeCast} from \"@openzeppelin/contracts/utils/math/SafeCast.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {TOKEN_OPERATOR_ROLE} from \"src/common/diamond/Constants.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport {IDShare} from \"src/tokens/shares/IDShare.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {\n    SendParam, MessagingFee, MessagingReceipt, OFTReceipt\n} from \"@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol\";\nimport {ILayerZeroEndpointV2} from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\nimport {IOAppCore} from \"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\";\nimport {ILZRouting} from \"src/common/diamond/facets/lz-routing/ILZRouting.sol\";\nimport {IAssetRegistry} from \"src/common/diamond/facets/asset-registry/IAssetRegistry.sol\";\nimport {\n    ITransferRestrictorFacet,\n    ITransferRestrictorFacetErrors\n} from \"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol\";\n\n/**\n * @title DShare (Retail)\n */\ncontract DShare is AccessControlledUpgradeable, ERC20Rebasing, IDShare, PausableUpgradeable {\n    using SafeCast for uint256;\n    using SafeERC20 for IERC20;\n\n    event OFTSent(\n        bytes32 indexed guid, uint32 dstEid, address indexed from, uint256 amountSentLD, uint256 amountReceivedLD\n    );\n\n    struct dShareStorage {\n        string _name;\n        string _symbol;\n        ITransferRestrictor _transferRestrictor;\n        uint128 _balancePerShare;\n        address _accessControl;\n    }\n\n    /// @dev keccak256(abi.encode(uint256(keccak256(\"dinaricrypto.storage.DShare\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant dShareStorageLocation = 0x7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800;\n\n    function _getdShareStorage() private pure returns (dShareStorage storage $) {\n        assembly {\n            $.slot := dShareStorageLocation\n        }\n    }\n\n    /// @dev Both constructor args are unused — kept for ABI compatibility with\n    ///      the existing `new DShare(18, endpoint)` call sites. The LZ endpoint\n    ///      is read from the diamond at runtime via `endpoint()` (single source\n    ///      of truth); the diamond is read from `_getdShareStorage()._accessControl`.\n    constructor(uint8 /* _localDecimals */, address /* _endpoint */) {\n        _disableInitializers();\n    }\n\n    /// @notice Returns the diamond hosting the LZ routing facet for this token.\n    function diamond() public view returns (address) {\n        return _getdShareStorage()._accessControl;\n    }\n\n    /// @notice Initializes a DShare token via beacon proxy.\n    /// @dev `delegate_` is accepted for ABI compatibility with the existing\n    ///      DShareFactoryFacet.createDShare call site but is no longer used.\n    function initialize(\n        string memory _name,\n        string memory _symbol,\n        ITransferRestrictor transferRestrictor_,\n        address accessControl_,\n        address /* delegate_ */\n    ) external initializer {\n        require(accessControl_ != address(0), ZeroAddress());\n        require(transferRestrictor_ != ITransferRestrictor(address(0)), ZeroAddress());\n        require(bytes(_name).length > 0, InvalidName());\n        require(bytes(_symbol).length > 0, InvalidSymbol());\n\n        dShareStorage storage $ = _getdShareStorage();\n        $._name = _name;\n        $._symbol = _symbol;\n        $._transferRestrictor = transferRestrictor_;\n        $._balancePerShare = _INITIAL_BALANCE_PER_SHARE;\n        $._accessControl = accessControl_;\n        __AccessControlled_init(accessControl_);\n        __Pausable_init();\n    }\n\n    function reinitialize() external reinitializer(4) {\n        __Pausable_init();\n    }\n\n    // ------------------ Getters ------------------ //\n\n    function name() public view override returns (string memory) {\n        return _getdShareStorage()._name;\n    }\n\n    function symbol() public view override returns (string memory) {\n        return _getdShareStorage()._symbol;\n    }\n\n    function transferRestrictor() public view returns (ITransferRestrictor) {\n        return _getdShareStorage()._transferRestrictor;\n    }\n\n    function applySplit(uint256 to, uint256 from) external onlyRole(TOKEN_OPERATOR_ROLE) whenPaused returns (uint128) {\n        require(to != 0 && from != 0, ZeroRatio());\n        dShareStorage storage $ = _getdShareStorage();\n\n        uint256 current = $._balancePerShare == 0\n            ? _INITIAL_BALANCE_PER_SHARE\n            : $._balancePerShare;\n\n        // Floor rounding\n        uint256 updated = Math.mulDiv(current, to, from);\n\n        $._balancePerShare = updated.toUint128(); // will revert if > uint128\n\n        emit BalancePerShareSet(updated);\n        emit SplitAdjusted(to, from, current, updated);\n        return $._balancePerShare;\n    }\n\n    function balancePerShare() public view override returns (uint128) {\n        dShareStorage storage $ = _getdShareStorage();\n        uint128 _balancePerShare = $._balancePerShare;\n        // Override with default if not set due to upgrade\n        if (_balancePerShare == 0) return _INITIAL_BALANCE_PER_SHARE;\n        return _balancePerShare;\n    }\n\n    /// ------------------ Setters ------------------ ///\n\n    /// @notice Set token name\n    /// @dev Only callable by owner or deployer\n    function setName(string calldata newName) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        dShareStorage storage $ = _getdShareStorage();\n        $._name = newName;\n        emit NameSet(newName);\n    }\n\n    /// @notice Set token symbol\n    /// @dev Only callable by owner or deployer\n    function setSymbol(string calldata newSymbol) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        dShareStorage storage $ = _getdShareStorage();\n        $._symbol = newSymbol;\n        emit SymbolSet(newSymbol);\n    }\n\n    /// @notice Update split factor\n    /// @dev Relies on offchain computation of aggregate splits and reverse splits\n    function setBalancePerShare(uint128 balancePerShare_) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        require(balancePerShare_ > 0, ZeroValue());\n\n        dShareStorage storage $ = _getdShareStorage();\n        $._balancePerShare = balancePerShare_;\n        emit BalancePerShareSet(balancePerShare_);\n    }\n\n    /// @notice Set transfer restrictor contract\n    /// @dev Only callable by owner\n    function setTransferRestrictor(ITransferRestrictor newRestrictor) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        dShareStorage storage $ = _getdShareStorage();\n        $._transferRestrictor = newRestrictor;\n        emit TransferRestrictorSet(newRestrictor);\n    }\n\n    /// ------------------ Minting and Burning ------------------ ///\n\n    /// @notice Mint tokens\n    /// @param to Address to mint tokens to\n    /// @param value Amount of tokens to mint\n    /// @dev Only callable by authorized admin\n    function mint(address to, uint256 value) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        require(to != address(0), ZeroAddress());\n        _mint(to, value);\n    }\n\n    /// @notice Burn tokens\n    /// @param value Amount of tokens to burn\n    /// @dev Only callable by approved burner\n    function burn(uint256 value) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _burn(msg.sender, value);\n    }\n\n    /// @notice Burn tokens from an account\n    /// @param account Address to burn tokens from\n    /// @param value Amount of tokens to burn\n    /// @dev TOKEN_OPERATOR_ROLE can bypass allowance, others need allowance\n    function burnFrom(address account, uint256 value) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _burn(account, value);\n    }\n\n    /// ------------------ Transfers ------------------ ///\n\n    /// @notice Override transferFrom to allow TOKEN_OPERATOR_ROLE bypass allowance\n    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {\n        if (hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) {\n            _transfer(from, to, amount);\n            return true;\n        }\n        return super.transferFrom(from, to, amount);\n    }\n\n    function _beforeTokenTransfer(address from, address to, uint256) internal view override {\n        // If transferRestrictor is not set, no restrictions are applied\n        dShareStorage storage $ = _getdShareStorage();\n        address _transferRestrictor = $._accessControl;\n        if (!hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) {\n                require(_transferRestrictor != address(0), ITransferRestrictorFacetErrors.TransferRestrictor_NotSet());\n                // Check transfer restrictions; revert if phase-2 rules disallow the transfer\n                require(\n                    ITransferRestrictorFacet(_transferRestrictor).TransferRestrictor_assertTransferPhase2(from, to),\n                    ITransferRestrictorFacetErrors.TransferRestrictor_TransferPhase2_NotAllowed()\n                );\n            }\n    }\n\n    /**\n     * @param from The address of the account\n     * @param to The address of the account\n     * @return Whether the transfer is allowed\n     * @dev Returns false if the restrictor is unset; otherwise defers to the phase-2 rules\n     */\n    function isTransferAllowed(address from, address to) external view returns (bool) {\n        dShareStorage storage $ = _getdShareStorage();\n        address _transferRestrictor = $._accessControl;\n        if (_transferRestrictor == address(0)) return false;\n        return ITransferRestrictorFacet(_transferRestrictor).TransferRestrictor_assertTransferPhase2(from, to);\n    }\n\n    /**\n     * @notice Checks if an account is blacklisted via the configured restrictor facet\n     * @param account The address to check\n     * @return True if the restrictor facet reports the account as blacklisted\n     */\n    function isBlacklisted(address account) external view returns (bool) {\n        dShareStorage storage $ = _getdShareStorage();\n        address _transferRestrictor = $._accessControl;\n        if (_transferRestrictor == address(0)) return false;\n        return ITransferRestrictorFacet(_transferRestrictor).isBlacklisted(account);\n    }\n\n    // ============== IOFT shim ==============\n    // Forwards to the diamond's LZRoutingFacet. See base DShare for the\n    // full design notes. The shim is identical between base and retail —\n    // alt vs native fee is detected at runtime via endpoint.nativeToken().\n\n    function token() external view returns (address) {\n        return address(this);\n    }\n\n    function approvalRequired() external pure returns (bool) {\n        return false;\n    }\n\n    function sharedDecimals() external pure returns (uint8) {\n        return 9;\n    }\n\n    function endpoint() external view returns (ILayerZeroEndpointV2) {\n        return IOAppCore(diamond()).endpoint();\n    }\n\n    function send(SendParam calldata _sendParam, MessagingFee calldata _fee, address _refundAddress)\n        external\n        payable\n        whenNotPaused\n        returns (MessagingReceipt memory, OFTReceipt memory)\n    {\n        _enforceTransferRestriction(msg.sender);\n        return _forward(msg.sender, _sendParam, _fee, _refundAddress);\n    }\n\n    function sendFrom(\n        SendParam calldata _sendParam,\n        address _from,\n        MessagingFee calldata _fee,\n        address _refundAddress\n    ) external payable whenNotPaused returns (MessagingReceipt memory, OFTReceipt memory) {\n        _enforceTransferRestriction(_from);\n        if (!hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) {\n            // Spend allowance on the dust-trimmed amount the hub actually burns\n            // (shared decimals = 9), so allowance-spent == amount-burned.\n            _spendAllowance(_from, _msgSender(), (_sendParam.amountLD / 1e9) * 1e9);\n        }\n        return _forward(_from, _sendParam, _fee, _refundAddress);\n    }\n\n    /// @dev Mirrors the phase-2 gate from _beforeTokenTransfer at the shim\n    ///      entry point. The actual burn is delegated to the diamond hub,\n    ///      whose msg.sender carries TOKEN_OPERATOR_ROLE and would otherwise\n    ///      bypass _beforeTokenTransfer's check. The bridge burns `from`\n    ///      (to == address(0)), so we assert the same (from, address(0)) rule.\n    ///      The phase-2 check also reverts when transfers are globally paused.\n    function _enforceTransferRestriction(address from) internal view {\n        address _transferRestrictor = _getdShareStorage()._accessControl;\n        if (_transferRestrictor == address(0)) return;\n        if (hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) return;\n        require(\n            ITransferRestrictorFacet(_transferRestrictor).TransferRestrictor_assertTransferPhase2(from, address(0)),\n            ITransferRestrictorFacetErrors.TransferRestrictor_TransferPhase2_NotAllowed()\n        );\n    }\n\n    function quoteSend(SendParam calldata _sendParam, bool _payInLzToken) external view returns (MessagingFee memory) {\n        address hub = diamond();\n        bytes32 assetId = IAssetRegistry(hub).AssetRegistry_idOf(address(this));\n        return ILZRouting(hub).LZRouting_quoteSend(assetId, _sendParam, _payInLzToken);\n    }\n\n    function _forward(address from, SendParam calldata sp, MessagingFee calldata fee, address refund)\n        internal\n        returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt)\n    {\n        address hub = diamond();\n        address altFeeToken = IOAppCore(hub).endpoint().nativeToken();\n        if (altFeeToken != address(0) && fee.nativeFee > 0) {\n            IERC20(altFeeToken).safeTransferFrom(msg.sender, address(this), fee.nativeFee);\n            IERC20(altFeeToken).forceApprove(hub, fee.nativeFee);\n        }\n\n        (msgReceipt, oftReceipt) = ILZRouting(hub).LZRouting_hubSend{value: msg.value}(from, sp, fee, refund);\n\n        // Match LayerZero OFTCoreUpgradeable._send: the indexed `from` topic\n        // is the caller (operator on sendFrom, user on send), not the burn\n        // target. Off-chain indexers filter by this address.\n        emit OFTSent(msgReceipt.guid, sp.dstEid, _msgSender(), oftReceipt.amountSentLD, oftReceipt.amountReceivedLD);\n    }\n\n    // ------------------ Pause ------------------ //\n\n    function pause() external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _pause();\n        emit DSharePaused(address(this), block.timestamp);\n    }\n\n    function unpause() external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _unpause();\n        emit DShareUnpaused(address(this), block.timestamp);\n    }\n}\n"},"src/common/AccessControlledUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\nimport {IAccessControl} from \"./diamond/facets/access-control/IAccessControl.sol\";\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\n/// @title AccessControlledUpgradeable\n/// @notice Upgradeable base contract for adding access control to non-facet contracts\n/// @dev Use this contract to add access control to upgradeable contracts that are NOT a facet behind a diamond.\n///      The diamond on each chain manages access control for all functions - including token functions.\nabstract contract AccessControlledUpgradeable is Initializable {\n    /// @notice Interface to the AccessControlFacet on the diamond\n    IAccessControl public accessControl;\n\n    /// @notice Initializes the access control system\n    /// @dev Can only be called during contract initialization\n    /// @param _accessControl Address of the AccessControlFacet\n    function __AccessControlled_init(address _accessControl) internal onlyInitializing {\n        require(_accessControl != address(0), \"AC: zero address\");\n        accessControl = IAccessControl(_accessControl);\n    }\n\n    /**\n     * @notice Checks whether a given user has a given role.\n     * @param user The user to check.\n     * @param role The role to check.\n     * @return Whether the user has the role.\n     */\n    function hasRole(address user, uint8 role) internal view returns (bool) {\n        return accessControl.hasRole(user, role);\n    }\n\n    /**\n     * @notice Restricts function access to callers with a specific role\n     * @param role The role required to execute the function\n     */\n    modifier onlyRole(uint8 role) {\n        require(accessControl.hasRole(msg.sender, role), \"AC: unauthorized\");\n        _;\n    }\n\n    /// @notice Restricts function access to authorized callers based on function signature\n    /// @dev Mirrors the facet's `onlyAuthorized` guard by checking if the caller can execute the function\n    modifier onlyAuthorized() {\n        require(accessControl.canCall(msg.sender, msg.sig), \"AC: unauthorized\");\n        _;\n    }\n}\n"},"src/tokens/shares/ITransferRestrictor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @title ITransferRestrictor\n/// @notice Interface for contracts that enforce transfer restrictions on DShares\n/// @dev Implements blacklist/whitelist functionality for regulatory compliance\n/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/ITransferRestrictor.sol)\ninterface ITransferRestrictor {\n    /// @notice Checks if an account is blacklisted and restricted from transfers\n    /// @param account The address to check\n    /// @return True if the account is blacklisted, false otherwise\n    function isBlacklisted(address account) external view returns (bool);\n\n    /// @notice Adds an account to the restriction list\n    /// @dev Admin only. Prevents the account from sending or receiving tokens\n    /// @param account The address to restrict\n    function restrict(address account) external;\n}"},"src/tokens/ERC20Rebasing.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity ^0.8.20;\n\nimport {ERC20} from \"@solady/src/tokens/ERC20.sol\";\nimport {NumberUtils} from \"src/common/utils/NumberUtils.sol\";\nimport {FixedPointMathLib} from \"@solady/src/utils/FixedPointMathLib.sol\";\n\n/// @notice Rebasing ERC20 token as an in-place upgrade to solady erc20\n/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/dShare.sol)\nabstract contract ERC20Rebasing is ERC20 {\n    uint256 private constant _TRANSFER_EVENT_SIGNATURE =\n        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;\n\n    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;\n    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;\n\n    uint128 internal constant _INITIAL_BALANCE_PER_SHARE = 1 ether;\n\n    /**\n     * @dev Returns the number of tokens an internal share amount represents.\n     * This amount is assumed to have 18 decimals and is divided by 10 **18 when applied.\n     */\n    function balancePerShare() public view virtual returns (uint128);\n\n    function sharesToBalance(uint256 shares) public view returns (uint256) {\n        return FixedPointMathLib.fullMulDiv(shares, balancePerShare(), _INITIAL_BALANCE_PER_SHARE); // floor\n    }\n\n    function balanceToShares(uint256 balance) public view returns (uint256) {\n        return FixedPointMathLib.fullMulDiv(balance, _INITIAL_BALANCE_PER_SHARE, balancePerShare()); // floor\n    }\n\n    /// ------------------ ERC20 ------------------\n\n    function totalSupply() public view virtual override returns (uint256) {\n        return sharesToBalance(super.totalSupply());\n    }\n\n    /// @notice Returns the maximum supply of the token in balance.\n    /// @dev Useful for sanity checks before minting since the total supply of shares can overflow.\n    function maxSupply() public view virtual returns (uint256) {\n        // Reduced maxSupply of shares to prevent overflow in balanceToShares and other functions\n        uint128 balancePerShare_ = balancePerShare();\n        if (balancePerShare_ < _INITIAL_BALANCE_PER_SHARE) {\n            // maxSupply = type(uint256).max * balancePerShare_ / _INITIAL_BALANCE_PER_SHARE\n            return FixedPointMathLib.fullMulDiv(type(uint256).max, balancePerShare_, _INITIAL_BALANCE_PER_SHARE);\n        } else if (balancePerShare_ > _INITIAL_BALANCE_PER_SHARE) {\n            // maxSupply = type(uint256).max * _INITIAL_BALANCE_PER_SHARE / balancePerShare_\n            return FixedPointMathLib.fullMulDiv(type(uint256).max, _INITIAL_BALANCE_PER_SHARE, balancePerShare_);\n        }\n        return type(uint256).max;\n    }\n\n    function balanceOf(address account) public view virtual override returns (uint256) {\n        return sharesToBalance(super.balanceOf(account));\n    }\n\n    function sharesOf(address account) public view virtual returns (uint256) {\n        return super.balanceOf(account);\n    }\n\n    function transfer(address to, uint256 amount) public virtual override returns (bool) {\n        _transfer(msg.sender, to, amount);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n        _spendAllowance(from, msg.sender, amount);\n        _transfer(from, to, amount);\n        return true;\n    }\n\n    // Convert to shares\n    function _transfer(address from, address to, uint256 amount) internal virtual override {\n        _beforeTokenTransfer(from, to, amount);\n        uint256 shares = balanceToShares(amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            let from_ := shl(96, from)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(shares, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, shares))\n            // Compute the balance slot of `to`.\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance of `to`.\n            // Will not overflow because the sum of all user balances\n            // cannot exceed the maximum uint256 value.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), shares))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(from, to, amount);\n    }\n\n    // Convert to shares\n    function _mint(address to, uint256 amount) internal virtual override {\n        _beforeTokenTransfer(address(0), to, amount);\n        uint256 totalSharesBefore = super.totalSupply();\n        // Floor the shares to mint\n        uint256 shares = balanceToShares(amount);\n        // Check the total supply limit for shares\n        uint256 totalSharesAfter = 0;\n        unchecked {\n            totalSharesAfter = totalSharesBefore + shares;\n        }\n        // Check overflow\n        if (totalSharesAfter < totalSharesBefore) revert TotalSupplyOverflow();\n        // Check total supply limit, can also revert with FullMulDivFailed in fullMulDivUp\n        // Round up for total supply limit check\n        if (\n            FixedPointMathLib.fullMulDivUp(totalSharesAfter, balancePerShare(), _INITIAL_BALANCE_PER_SHARE)\n                > maxSupply()\n        ) revert TotalSupplyOverflow();\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, totalSharesAfter)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), shares))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(address(0), to, amount);\n    }\n\n    // Convert to shares\n    function _burn(address from, uint256 amount) internal virtual override {\n        _beforeTokenTransfer(from, address(0), amount);\n        // Round up the shares to burn in favor of the contract\n        uint256 shares = FixedPointMathLib.fullMulDivUp(amount, _INITIAL_BALANCE_PER_SHARE, balancePerShare());\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, from)\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(shares, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, shares))\n            // Subtract and store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), shares))\n            // Emit the {Transfer} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)\n        }\n        _afterTokenTransfer(from, address(0), amount);\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev An uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n        for (uint256 i = 0; i < byteArray.length; ++i) {\n            if (byteArray[i] != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n}\n"},"src/common/diamond/Constants.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/// @dev Address used to identify a multi delegate call in a diamond cut.\naddress constant MULTI_INIT_ADDRESS = 0xD1a302d1A302d1A302d1A302d1A302D1A302D1a3;\n\n/// @dev Default admin role value.\nuint8 constant DEFAULT_ADMIN_ROLE = 0;\n\n/// @dev Role value for operating transfers.\nuint8 constant OPERATOR_ROLE = 1;\n\n/// @dev Role value for operating tokens.\nuint8 constant TOKEN_OPERATOR_ROLE = 2;\n\n/// @dev Role to restrict transfer\nuint8 constant RESTRICTOR_ROLE = 3;\n\n/// @dev Role to upgrade and deploy contracts\nuint8 constant DEPLOYER_ROLE = 4;\n\n/// @dev Role for corporate action operators (dividends, splits, etc.)\nuint8 constant CORPORATE_ACTION_ROLE = 5;\n\n/// @dev Basis points denominator\nuint16 constant BPS_DENOMINATOR = 10_000;\n\n/// @dev PRICE_PRECISION = 1e18\nuint256 constant PRICE_PRECISION = 1e18;\n\n/// @dev DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD\naddress constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;\n\n// Old AccessControlDefaultAdminRulesUpgradeable with bytes32 roles\nbytes32 constant OLD_UPGRADER_ROLE = keccak256(\"UPGRADER_ROLE\");\n\nbytes32 constant OLD_DEFAULT_ADMIN_ROLE = 0x00;\n\n"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n    /// @custom:storage-location erc7201:openzeppelin.storage.Pausable\n    struct PausableStorage {\n        bool _paused;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Pausable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;\n\n    function _getPausableStorage() private pure returns (PausableStorage storage $) {\n        assembly {\n            $.slot := PausableStorageLocation\n        }\n    }\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    function __Pausable_init() internal onlyInitializing {\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        PausableStorage storage $ = _getPausableStorage();\n        return $._paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $._paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $._paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},"src/tokens/shares/IDShare.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\nimport {ITransferRestrictor} from \"src/tokens/shares/ITransferRestrictor.sol\";\n\n/// @title IDShare\n/// @notice Core token contract interface for bridged real-world assets (DShares)\n/// @dev Provides minting, burning, transfer restrictions, and stock split functionality\n/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/IDShare.sol)\ninterface IDShareErrors {\n    /// @notice Thrown when attempting operations on a paused asset\n    error AssetPaused();\n    \n    /// @notice Thrown when funding asset is paused\n    error FundingAssetPaused();\n    \n    /// @notice Thrown when zero address is provided where not allowed\n    error ZeroAddress();\n    \n    /// @notice Thrown when token name is invalid\n    error InvalidName();\n    \n    /// @notice Thrown when token symbol is invalid\n    error InvalidSymbol();\n    \n    /// @notice Thrown when zero value is provided where not allowed\n    error ZeroValue();\n    \n    /// @notice Thrown when account is restricted from transfers\n    error TransferRestrictor_AccountRestricted();\n\n    /// @notice Thrown when zero ratio is provided where not allowed\n    error ZeroRatio();\n}\n\n/// @notice Events emitted by DShare contracts\ninterface IDShareEvent {\n    /// @notice Emitted when token name is updated\n    /// @param name The new token name\n    event NameSet(string name);\n    \n    /// @notice Emitted when token symbol is updated\n    /// @param symbol The new token symbol\n    event SymbolSet(string symbol);\n    \n    /// @notice Emitted when transfer restrictor contract is updated\n    /// @param transferRestrictor The new transfer restrictor address\n    event TransferRestrictorSet(ITransferRestrictor indexed transferRestrictor);\n    \n    /// @notice Emitted when balance per share multiplier is updated (for splits)\n    /// @param balancePerShare The new balance per share value\n    event BalancePerShareSet(uint256 balancePerShare);\n    \n    /// @notice Emitted when split factor is adjusted\n    /// @param num Numerator of the split ratio\n    /// @param den Denominator of the split ratio\n    /// @param balancePerShare Current balance per share\n    /// @param result Resulting balance per share after split\n    event SplitAdjusted(uint256 num, uint256 den, uint256 balancePerShare, uint256 result);\n    \n    /// @notice Emitted when DShare is paused\n    /// @param asset Address of the asset being paused\n    /// @param timestamp Time of pause\n    event DSharePaused(address indexed asset, uint256 timestamp);\n    \n    /// @notice Emitted when DShare is unpaused\n    /// @param asset Address of the asset being unpaused\n    /// @param timestamp Time of unpause\n    event DShareUnpaused(address indexed asset, uint256 timestamp);\n}\n\n/// @notice Main DShare interface combining errors and events\ninterface IDShare is IDShareErrors, IDShareEvent{\n    /// @notice Initializes a new DShare token\n    /// @param name_ Token name\n    /// @param symbol_ Token symbol\n    /// @param transferRestrictor_ Transfer restrictor contract\n    /// @param accessControl_ Access control contract\n    /// @param delegate_ Delegate address for LayerZero operations\n    function initialize(\n        string memory name_,\n        string memory symbol_,\n        ITransferRestrictor transferRestrictor_,\n        address accessControl_,\n        address delegate_\n    ) external;\n\n    /// @notice Reinitializes the contract (e.g. to add new functionality)\n    function reinitialize() external;\n\n    /// @notice Returns the transfer restrictor contract\n    /// @return The transfer restrictor implementation\n    function transferRestrictor() external view returns (ITransferRestrictor);\n    \n    /**\n     * @notice Checks if an account is blacklisted/restricted from transfers\n     * @param account The address to check\n     * @return True if the account is blacklisted or is the zero address\n     */\n    function isBlacklisted(address account) external view returns (bool);\n\n    /// @notice Applies a stock split to the token\n    /// @dev Updates the balance per share multiplier to reflect split ratio\n    /// @param to_ Numerator of the split ratio (new shares)\n    /// @param from_ Denominator of the split ratio (old shares)\n    /// @return The new balance per share value after split\n    function applySplit(uint256 to_, uint256 from_) external returns (uint128);\n\n    /// @notice Sets the balance per share multiplier directly\n    /// @dev Admin only. Used for initializing or adjusting split factors\n    /// @param balancePerShare_ The new balance per share value\n    function setBalancePerShare(uint128 balancePerShare_) external;\n\n    /// @notice Updates the transfer restrictor contract\n    /// @dev Admin only. Changes which contract enforces transfer restrictions\n    /// @param newRestrictor The new transfer restrictor implementation\n    function setTransferRestrictor(ITransferRestrictor newRestrictor) external;\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.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.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        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\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        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\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 _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\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 _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\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        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\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 rely 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 rely 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     * Opposedly, 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    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"lib/devtools/packages/oft-evm/contracts/interfaces/IOFT.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { MessagingReceipt, MessagingFee } from \"@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol\";\n\n/**\n * @dev Struct representing token parameters for the OFT send() operation.\n */\nstruct SendParam {\n    uint32 dstEid; // Destination endpoint ID.\n    bytes32 to; // Recipient address.\n    uint256 amountLD; // Amount to send in local decimals.\n    uint256 minAmountLD; // Minimum amount to send in local decimals.\n    bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.\n    bytes composeMsg; // The composed message for the send() operation.\n    bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations.\n}\n\n/**\n * @dev Struct representing OFT limit information.\n * @dev These amounts can change dynamically and are up the specific oft implementation.\n */\nstruct OFTLimit {\n    uint256 minAmountLD; // Minimum amount in local decimals that can be sent to the recipient.\n    uint256 maxAmountLD; // Maximum amount in local decimals that can be sent to the recipient.\n}\n\n/**\n * @dev Struct representing OFT receipt information.\n */\nstruct OFTReceipt {\n    uint256 amountSentLD; // Amount of tokens ACTUALLY debited from the sender in local decimals.\n    // @dev In non-default implementations, the amountReceivedLD COULD differ from this value.\n    uint256 amountReceivedLD; // Amount of tokens to be received on the remote side.\n}\n\n/**\n * @dev Struct representing OFT fee details.\n * @dev Future proof mechanism to provide a standardized way to communicate fees to things like a UI.\n */\nstruct OFTFeeDetail {\n    int256 feeAmountLD; // Amount of the fee in local decimals.\n    string description; // Description of the fee.\n}\n\n/**\n * @title IOFT\n * @dev Interface for the OftChain (OFT) token.\n * @dev Does not inherit ERC20 to accommodate usage by OFTAdapter as well.\n * @dev This specific interface ID is '0x02e49c2c'.\n */\ninterface IOFT {\n    // Custom error messages\n    error InvalidLocalDecimals();\n    error SlippageExceeded(uint256 amountLD, uint256 minAmountLD);\n    error AmountSDOverflowed(uint256 amountSD);\n\n    // Events\n    event OFTSent(\n        bytes32 indexed guid, // GUID of the OFT message.\n        uint32 dstEid, // Destination Endpoint ID.\n        address indexed fromAddress, // Address of the sender on the src chain.\n        uint256 amountSentLD, // Amount of tokens sent in local decimals.\n        uint256 amountReceivedLD // Amount of tokens received in local decimals.\n    );\n    event OFTReceived(\n        bytes32 indexed guid, // GUID of the OFT message.\n        uint32 srcEid, // Source Endpoint ID.\n        address indexed toAddress, // Address of the recipient on the dst chain.\n        uint256 amountReceivedLD // Amount of tokens received in local decimals.\n    );\n\n    /**\n     * @notice Retrieves interfaceID and the version of the OFT.\n     * @return interfaceId The interface ID.\n     * @return version The version.\n     *\n     * @dev interfaceId: This specific interface ID is '0x02e49c2c'.\n     * @dev version: Indicates a cross-chain compatible msg encoding with other OFTs.\n     * @dev If a new feature is added to the OFT cross-chain msg encoding, the version will be incremented.\n     * ie. localOFT version(x,1) CAN send messages to remoteOFT version(x,1)\n     */\n    function oftVersion() external view returns (bytes4 interfaceId, uint64 version);\n\n    /**\n     * @notice Retrieves the address of the token associated with the OFT.\n     * @return token The address of the ERC20 token implementation.\n     */\n    function token() external view returns (address);\n\n    /**\n     * @notice Indicates whether the OFT contract requires approval of the 'token()' to send.\n     * @return requiresApproval Needs approval of the underlying token implementation.\n     *\n     * @dev Allows things like wallet implementers to determine integration requirements,\n     * without understanding the underlying token implementation.\n     */\n    function approvalRequired() external view returns (bool);\n\n    /**\n     * @notice Retrieves the shared decimals of the OFT.\n     * @return sharedDecimals The shared decimals of the OFT.\n     */\n    function sharedDecimals() external view returns (uint8);\n\n    /**\n     * @notice Provides the fee breakdown and settings data for an OFT. Unused in the default implementation.\n     * @param _sendParam The parameters for the send operation.\n     * @return limit The OFT limit information.\n     * @return oftFeeDetails The details of OFT fees.\n     * @return receipt The OFT receipt information.\n     */\n    function quoteOFT(\n        SendParam calldata _sendParam\n    ) external view returns (OFTLimit memory, OFTFeeDetail[] memory oftFeeDetails, OFTReceipt memory);\n\n    /**\n     * @notice Provides a quote for the send() operation.\n     * @param _sendParam The parameters for the send() operation.\n     * @param _payInLzToken Flag indicating whether the caller is paying in the LZ token.\n     * @return fee The calculated LayerZero messaging fee from the send() operation.\n     *\n     * @dev MessagingFee: LayerZero msg fee\n     *  - nativeFee: The native fee.\n     *  - lzTokenFee: The lzToken fee.\n     */\n    function quoteSend(SendParam calldata _sendParam, bool _payInLzToken) external view returns (MessagingFee memory);\n\n    /**\n     * @notice Executes the send() operation.\n     * @param _sendParam The parameters for the send operation.\n     * @param _fee The fee information supplied by the caller.\n     *      - nativeFee: The native fee.\n     *      - lzTokenFee: The lzToken fee.\n     * @param _refundAddress The address to receive any excess funds from fees etc. on the src.\n     * @return receipt The LayerZero messaging receipt from the send() operation.\n     * @return oftReceipt The OFT receipt information.\n     *\n     * @dev MessagingReceipt: LayerZero msg receipt\n     *  - guid: The unique identifier for the sent message.\n     *  - nonce: The nonce of the sent message.\n     *  - fee: The LayerZero fee incurred for the message.\n     */\n    function send(\n        SendParam calldata _sendParam,\n        MessagingFee calldata _fee,\n        address _refundAddress\n    ) external payable returns (MessagingReceipt memory, OFTReceipt memory);\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nimport { IMessageLibManager } from \"./IMessageLibManager.sol\";\nimport { IMessagingComposer } from \"./IMessagingComposer.sol\";\nimport { IMessagingChannel } from \"./IMessagingChannel.sol\";\nimport { IMessagingContext } from \"./IMessagingContext.sol\";\n\nstruct MessagingParams {\n    uint32 dstEid;\n    bytes32 receiver;\n    bytes message;\n    bytes options;\n    bool payInLzToken;\n}\n\nstruct MessagingReceipt {\n    bytes32 guid;\n    uint64 nonce;\n    MessagingFee fee;\n}\n\nstruct MessagingFee {\n    uint256 nativeFee;\n    uint256 lzTokenFee;\n}\n\nstruct Origin {\n    uint32 srcEid;\n    bytes32 sender;\n    uint64 nonce;\n}\n\ninterface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {\n    event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);\n\n    event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);\n\n    event PacketDelivered(Origin origin, address receiver);\n\n    event LzReceiveAlert(\n        address indexed receiver,\n        address indexed executor,\n        Origin origin,\n        bytes32 guid,\n        uint256 gas,\n        uint256 value,\n        bytes message,\n        bytes extraData,\n        bytes reason\n    );\n\n    event LzTokenSet(address token);\n\n    event DelegateSet(address sender, address delegate);\n\n    function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);\n\n    function send(\n        MessagingParams calldata _params,\n        address _refundAddress\n    ) external payable returns (MessagingReceipt memory);\n\n    function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;\n\n    function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);\n\n    function initializable(Origin calldata _origin, address _receiver) external view returns (bool);\n\n    function lzReceive(\n        Origin calldata _origin,\n        address _receiver,\n        bytes32 _guid,\n        bytes calldata _message,\n        bytes calldata _extraData\n    ) external payable;\n\n    // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order\n    function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;\n\n    function setLzToken(address _lzToken) external;\n\n    function lzToken() external view returns (address);\n\n    function nativeToken() external view returns (address);\n\n    function setDelegate(address _delegate) external;\n}\n"},"lib/devtools/packages/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { ILayerZeroEndpointV2 } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\n\n/**\n * @title IOAppCore\n */\ninterface IOAppCore {\n    // Custom error messages\n    error OnlyPeer(uint32 eid, bytes32 sender);\n    error NoPeer(uint32 eid);\n    error InvalidEndpointCall();\n    error InvalidDelegate();\n\n    // Event emitted when a peer (OApp) is set for a corresponding endpoint\n    event PeerSet(uint32 eid, bytes32 peer);\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     */\n    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);\n\n    /**\n     * @notice Retrieves the LayerZero endpoint associated with the OApp.\n     * @return iEndpoint The LayerZero endpoint as an interface.\n     */\n    function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);\n\n    /**\n     * @notice Retrieves the peer (OApp) associated with a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @return peer The peer address (OApp instance) associated with the corresponding endpoint.\n     */\n    function peers(uint32 _eid) external view returns (bytes32 peer);\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     */\n    function setPeer(uint32 _eid, bytes32 _peer) external;\n\n    /**\n     * @notice Sets the delegate address for the OApp Core.\n     * @param _delegate The address of the delegate to be set.\n     */\n    function setDelegate(address _delegate) external;\n}\n"},"src/common/diamond/facets/lz-routing/ILZRouting.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\nimport {SendParam, MessagingFee, MessagingReceipt, OFTReceipt} from \"@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol\";\nimport {IOAppCore} from \"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\";\n\n/// @notice Events emitted by LZRoutingFacet.\ninterface ILZRoutingEvents {\n    event HubSent(bytes32 indexed assetId, address indexed from, uint32 indexed dstEid, uint256 amount, bytes32 guid);\n    event HubReceived(bytes32 indexed assetId, address indexed to, uint32 indexed srcEid, uint256 amount, bytes32 guid);\n}\n\n/// @notice Errors thrown by LZRoutingFacet.\ninterface ILZRoutingErrors {\n    error LZRouting_ZeroAddress();\n    error LZRouting_UnknownAsset();\n    error LZRouting_SenderNotRegistered();\n    error LZRouting_SlippageExceeded(uint256 amountReceivedLD, uint256 minAmountLD);\n    /// @dev Alt-fee chains pay in ERC20;\n    error LZRouting_UnexpectedNativeFee();\n}\n\n/**\n * @title ILZRouting\n * @notice Hub-routed cross-chain transfers for dShares on this diamond.\n * @dev Called by DShare IOFT shims. Inbound lzReceive comes through the\n *      parent OAppReceiverUpgradeable.\n *\n *      Amount semantics match DShare's existing OFT config: local decimals 18,\n *      shared decimals 9, so decimalConversionRate is 1e9. Amounts on the wire\n *      are uint64 SD; dust below 1e9 wei is stripped at send. minAmountLD is\n *      enforced for slippage.\n */\ninterface ILZRouting is IOAppCore, ILZRoutingEvents, ILZRoutingErrors {\n    /// @notice Sets the LayerZero delegate. Fixed for the life of the facet.\n    function LZRouting_init(address delegate) external;\n\n    /// @notice Sends a cross-chain transfer for the calling DShare.\n    /// @dev msg.sender is the DShare; we resolve its assetId via the registry,\n    ///      burn from `from` on the source token, encode the payload, lzSend.\n    function LZRouting_hubSend(address from, SendParam calldata sp, MessagingFee calldata fee, address refund)\n        external\n        payable\n        returns (MessagingReceipt memory, OFTReceipt memory);\n\n    /// @notice Quotes the messaging fee for the given asset and send params.\n    function LZRouting_quoteSend(bytes32 assetId, SendParam calldata sp, bool payInLzToken)\n        external\n        view\n        returns (MessagingFee memory fee);\n\n    /// @notice Rotates the LayerZero delegate for this OApp.\n    /// @dev Gated by the diamond's protected modifier\n    function LZRouting_setDelegateOperator(address delegate) external;\n\n    // setPeer / peers / endpoint come from IOAppCore. They must be inherited,\n    // not re-declared: OAppCore exposes `endpoint` as a public immutable, which\n    // can't be overridden, so a manual `endpoint()` here makes the facet\n    // uncompilable.\n}\n"},"src/common/diamond/facets/asset-registry/IAssetRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/**\n * @title IAssetRegistryEvents\n * @notice Events emitted by the AssetRegistry facet.\n */\ninterface IAssetRegistryEvents {\n    /// @dev Emitted by the admin overrides `setIdOf` and `setIdOfBatch` whenever\n    ///      the reverse mapping is written. Covers backfill of pre-existing\n    ///      dShares and recovery from a corrupted state. For first-time writes\n    ///      (backfill), `oldId` is `bytes32(0)`.\n    event AssetIdUpdated(address indexed token, bytes32 indexed oldId, bytes32 indexed newId);\n}\n\n/**\n * @title IAssetRegistryErrors\n * @notice Error definitions for AssetRegistry facet.\n */\ninterface IAssetRegistryErrors {\n    /// @dev Thrown when a zero address is provided where it is not allowed.\n    error AssetRegistry_ZeroAddress();\n    /// @dev Thrown when a token already has an assetId mapped to it.\n    error AssetRegistry_TokenAlreadyRegistered();\n}\n\n/**\n * @title IAssetRegistry\n * @notice Interface for the AssetRegistry facet. Provides bidirectional lookups\n *         between asset IDs and DShare token addresses on this chain.\n * @dev Forward direction (assetId => token) is sourced from the DShareFactory\n *      facet via `getDShareByAssetId`. Reverse direction (token => assetId) is\n *      owned by this facet and populated by the factory in the same call that\n *      creates a new DShare.\n *\n *      For new dShares the factory emits `DShareAdded(dshare, name, symbol, assetId, delegate)`,\n *      and that's the event indexers should watch for asset registration.\n *      The `AssetIdUpdated` event defined here covers only admin-driven writes:\n *      backfilling pre-existing dShares, or recovering from a corrupted mapping.\n *\n */\ninterface IAssetRegistry is IAssetRegistryEvents, IAssetRegistryErrors {\n    /**\n     * @notice A (token, assetId) pair for batched reverse-mapping writes.\n     * @dev Binding the two fields in one struct makes index misalignment and\n     *      length mismatch impossible by construction, unlike parallel\n     *      `address[]` / `bytes32[]` inputs.\n     * @param token   The DShare token address.\n     * @param assetId The asset identifier to associate.\n     */\n    struct AssetIdEntry {\n        address token;\n        bytes32 assetId;\n    }\n\n    /**\n     * @notice Resolves the DShare token address for a given asset ID.\n     * @param assetId The asset identifier to look up.\n     * @return The DShare token address, or address(0) if not registered.\n     */\n    function AssetRegistry_tokenOf(bytes32 assetId) external view returns (address);\n\n    /**\n     * @notice Resolves the asset ID for a given DShare token address.\n     * @dev Returns bytes32(0) both for unregistered tokens and for tokens\n     *      registered with assetId == 0. Use `AssetRegistry_isRegistered` to disambiguate.\n     */\n    function AssetRegistry_idOf(address token) external view returns (bytes32);\n\n    /// @notice Whether a token has been registered, independent of the assetId value.\n    function AssetRegistry_isRegistered(address token) external view returns (bool);\n\n    /**\n     * @notice Admin override: write the reverse mapping `token => assetId`.\n     * @dev Gated by the diamond's access control (`protected`). Used for\n     *      backfilling pre-existing dShares and for break-glass recovery.\n     *      Overwrites any existing entry. Emits `AssetIdUpdated`.\n     * @param token   The DShare token address.\n     * @param assetId The asset identifier to associate.\n     */\n    function AssetRegistry_setIdOf(address token, bytes32 assetId) external;\n\n    /**\n     * @notice Batched variant of `AssetRegistry_setIdOf`.\n     * @dev All entries succeed or none do. Emits `AssetIdUpdated` per entry.\n     * @param entries Array of (token, assetId) pairs to write.\n     */\n    function AssetRegistry_setIdOfBatch(AssetIdEntry[] calldata entries) external;\n}\n"},"src/common/diamond/facets/transfer-restrictor/UserAddressMetadataLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/**\n * @title UserAddressMetadataLib\n * @notice Owns the `UserAddressMetadata` struct and the pure jurisdiction\n *         classifiers used by the TransferRestrictor facet.\n * @dev Classifiers are pure and operate on a memory copy of the struct.\n *      Callers in the facet load metadata from storage once per address\n *      (a single SLOAD since the four bools pack into one slot) and then\n *      call into this library, so the predicates are cheap and trivially\n *      testable in isolation. The struct lives here as the single source\n *      of truth; `TransferRestrictorStorage` imports it for the diamond\n *      storage mapping.\n */\nlibrary UserAddressMetadataLib {\n    /// @notice Jurisdiction / status flags tracked per address.\n    /// @dev Mutually-exclusive classes are derived from these flags by the\n    ///      classifiers below; do not infer membership directly from the\n    ///      raw fields outside this library.\n    struct UserAddressMetadata {\n        bool isRegistered;\n        bool isRestricted;\n        bool isBlocked;\n        bool isWhitelisted;\n        address user;\n    }\n\n    /// @notice True if any phase-2 flag is set.\n    function isDFNUser(UserAddressMetadata memory m) internal pure returns (bool) {\n        return m.isRegistered || m.isRestricted || m.isBlocked || m.isWhitelisted;\n    }\n\n    /// @notice True if the address is a BrokerageAccountLocked user.\n    function isBrokerageAccountLocked(UserAddressMetadata memory m) internal pure returns (bool) {\n        return m.isRegistered && m.isRestricted;\n    }\n\n    /// @notice True if the address is a Baseline registered user.\n    function isBaselineRegistered(UserAddressMetadata memory m) internal pure returns (bool) {\n        return m.isRegistered && !m.isRestricted;\n    }\n\n    /// @notice True if no phase-2 flags are set.\n    /// @dev \"Unknown\" at the metadata layer only. A WrappedDShare contract\n    ///      also has empty metadata; callers that need to distinguish must\n    ///      combine this with the factory lookup.\n    function isUnknown(UserAddressMetadata memory m) internal pure returns (bool) {\n        return !m.isRegistered && !m.isRestricted && !m.isBlocked && !m.isWhitelisted;\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/devtools/packages/oapp-evm/contracts/oapp/OAppCore.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { IOAppCore, ILayerZeroEndpointV2 } from \"./interfaces/IOAppCore.sol\";\n\n/**\n * @title OAppCore\n * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.\n */\nabstract contract OAppCore is IOAppCore, Ownable {\n    // The LayerZero endpoint associated with the given OApp\n    ILayerZeroEndpointV2 public immutable endpoint;\n\n    // Mapping to store peers associated with corresponding endpoints\n    mapping(uint32 eid => bytes32 peer) public peers;\n\n    /**\n     * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.\n     * @param _endpoint The address of the LOCAL Layer Zero endpoint.\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\n     *\n     * @dev The delegate typically should be set as the owner of the contract.\n     */\n    constructor(address _endpoint, address _delegate) {\n        endpoint = ILayerZeroEndpointV2(_endpoint);\n\n        if (_delegate == address(0)) revert InvalidDelegate();\n        endpoint.setDelegate(_delegate);\n    }\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     *\n     * @dev Only the owner/admin of the OApp can call this function.\n     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.\n     * @dev Set this to bytes32(0) to remove the peer address.\n     * @dev Peer is a bytes32 to accommodate non-evm chains.\n     */\n    function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyOwner {\n        _setPeer(_eid, _peer);\n    }\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     *\n     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.\n     * @dev Set this to bytes32(0) to remove the peer address.\n     * @dev Peer is a bytes32 to accommodate non-evm chains.\n     */\n    function _setPeer(uint32 _eid, bytes32 _peer) internal virtual {\n        peers[_eid] = _peer;\n        emit PeerSet(_eid, _peer);\n    }\n\n    /**\n     * @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.\n     * ie. the peer is set to bytes32(0).\n     * @param _eid The endpoint ID.\n     * @return peer The address of the peer associated with the specified endpoint.\n     */\n    function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {\n        bytes32 peer = peers[_eid];\n        if (peer == bytes32(0)) revert NoPeer(_eid);\n        return peer;\n    }\n\n    /**\n     * @notice Sets the delegate address for the OApp.\n     * @param _delegate The address of the delegate to be set.\n     *\n     * @dev Only the owner/admin of the OApp can call this function.\n     * @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\n     */\n    function setDelegate(address _delegate) public onlyOwner {\n        endpoint.setDelegate(_delegate);\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/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\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"},"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\nimport {ITransferRestrictor} from \"src/tokens/shares/ITransferRestrictor.sol\";\nimport {UserAddressMetadataLib} from \"./UserAddressMetadataLib.sol\";\n\n/// @notice Events and errors emitted by the TransferRestrictor diamond facet\ninterface ITransferRestrictorFacetEvents {\n    /// @notice Emitted when an account is added to the blacklist\n    event Restricted(address indexed account);\n    /// @notice Emitted when an account is removed from the blacklist\n    event Unrestricted(address indexed account);\n\n    /// @notice Emitted when an account's phase-2 metadata flags are set\n    /// @param user The account whose metadata was changed\n    /// @param isRegistered Whether the address is known to the restrictor\n    /// @param isRestricted Whether the address is restricted (US-like)\n    /// @param isBlocked Whether the address is blocked (sanctioned)\n    /// @param isWhitelisted Whether the address is whitelisted\n    event TransferRestrictor__UserAddressMetadataSet(\n        address indexed user,\n        bool isRegistered,\n        bool isRestricted,\n        bool isBlocked,\n        bool isWhitelisted\n    );\n    /// @notice Emitted when `TransferRestrictor_pauseTransfers` is invoked\n    event TransferRestrictor__TransfersPausedSet(address indexed caller);\n    /// @notice Emitted when `TransferRestrictor_unpauseTransfers` is invoked\n    event TransferRestrictor_TransfersUnpausedSet(address indexed caller);\n    /// @notice Emitted when `TransferRestrictor_setLegacyDShareFactory` is invoked\n    event TransferRestrictor_LegacyDShareFactorySet(address indexed legacyDShareFactory);\n    /// @notice Emitted when `TransferRestrictor_pause` is invoked\n    event TransferRestrictor_PausedSet(address indexed caller);\n    /// @notice Emitted when `TransferRestrictor_unpause` is invoked\n    event TransferRestrictor_UnpausedSet(address indexed caller);\n\n}\n\ninterface ITransferRestrictorFacetErrors{\n    /// @notice Thrown when either side of a transfer is blacklisted\n    error TransferRestrictor_AccountRestricted();\n    /// @notice Thrown when either side of a transfer is blocked (sanction-style block)\n    error TransferRestrictor_AccountBlocked();\n    /// @notice Thrown when a transfer fails the phase-2 jurisdiction rules\n    error TransferRestrictor_TransferPhase2_NotAllowed();\n    /// @notice Thrown when a DFN-flagged user is also marked as a DFN address\n    error TransferRestrictor_TransferPhase2_Diamond_IsDFNUser();\n    /// @notice Thrown when a WrappedDShare check resolves to a DFN-flagged user\n    error TransferRestrictor_TransferPhase2_WrappedDShare_IsDFNUser();\n    error TransferRestrictor_TransfersPaused();\n    /// @notice Thrown when `TransferRestrictor_batchSetUserAddressMetadata` is called with arrays of differing length\n    error TransferRestrictor_Diamond_CannotSetSelfMetadata();\n\n    /// @notice Thrown when a zero address is provided\n    error TransferRestrictor_ZeroAddress();\n    /// @notice Thrown when `TransferRestrictor_pause` is invoked while paused\n    error TransferRestrictor_Paused();\n    /// @notice Thrown when Transfer Restrictor is not set and a transfer is attempted by a non-operator role\n    error TransferRestrictor_NotSet();\n}\n\n/// @title ITransferRestrictorFacet\n/// @notice Canonical interface for the TransferRestrictor diamond facet\n/// @dev Inherits ITransferRestrictor so external callers only need to import this interface\ninterface ITransferRestrictorFacet is ITransferRestrictor, ITransferRestrictorFacetEvents, ITransferRestrictorFacetErrors {\n    /// ------------------ Legacy Functions ------------------ ///\n\n    /// @notice Adds an account to the blacklist\n    /// @param account The address to restrict\n    function restrict(address account) external;\n\n    /// @notice Removes an account from the blacklist\n    /// @param account The address to unrestrict\n    function unrestrict(address account) external;\n\n    /// @notice Reverts with TransferRestrictor_AccountRestricted if either side of the transfer is blacklisted\n    /// @param from Sender address\n    /// @param to Recipient address\n    function requireNotRestricted(address from, address to) external view;\n\n    /// @notice Returns whether the account is on the legacy blacklist\n    /// @param account The address to check\n    /// @return True if blacklisted\n    function isBlacklisted(address account) external view returns (bool);\n\n    /// ------------------ Phase-2 Rules ------------------ ///\n\n    /// @notice Returns whether `from` -> `to` satisfies phase-2 transfer rules after base checks\n    ///         (blocks, DFN receiver bypass, and jurisdiction matrix)\n    /// @param from Sender address\n    /// @param to Recipient address\n    /// @return allowed True if the transfer is permitted under phase-2 rules\n    function TransferRestrictor_assertTransferPhase2(address from, address to) external view returns (bool allowed);\n\n    /// @notice Sets phase-2 metadata flags for an account (US / IsBaselineRegistered / blocked / whitelisted)\n    /// @dev Restricted to RESTRICTOR_ROLE via the diamond access control.\n    /// @param userAddressMetadata The address metadata to set\n    function TransferRestrictor_setUserAddressMetadata(\n        UserAddressMetadataLib.UserAddressMetadata memory userAddressMetadata\n    ) external;\n\n    /// @notice Returns the address metadata for an account\n    /// @dev This function is used to get the address metadata for an account\n    /// @param user The address to get the metadata for\n    /// @return UserAddressMetadataLib.UserAddressMetadata memory The address metadata\n    function TransferRestrictor_getUserAddressMetadata(address user) external view returns (UserAddressMetadataLib.UserAddressMetadata memory);\n\n    /// @notice Batch variant of `TransferRestrictor_getUserAddressMetadata`.\n    /// @dev This function is used to get the address metadata for multiple accounts at once.\n    /// @param users The addresses to get the metadata for\n    /// @return UserAddressMetadataLib.UserAddressMetadata[] memory The metadatas for the given addresses\n    function TransferRestrictor_batchGetUserAddressMetadata(address[] memory users) external view returns (UserAddressMetadataLib.UserAddressMetadata[] memory);\n\n    /// @notice Batch variant of `TransferRestrictor_setUserAddressMetadata`.\n    /// @dev Restricted to RESTRICTOR_ROLE via the diamond access control. Reverts on\n    ///      array-length mismatch (the index access into the shorter array panics).\n    /// @param addressMetadataArray Addresses whose metadata is being set\n    function TransferRestrictor_batchSetUserAddressMetadata(\n        UserAddressMetadataLib.UserAddressMetadata[] memory addressMetadataArray\n    ) external;\n\n    /// @notice Pauses restrictor mutations and phase-2 checks. Callable only by DEPLOYER_ROLE.\n    function TransferRestrictor_pause() external;\n\n    /// @notice Unpauses restrictor mutations and phase-2 checks. Callable only by DEPLOYER_ROLE.\n    function TransferRestrictor_unpause() external;\n\n    /// @notice Returns whether transfers are currently paused\n    function TransferRestrictor_transfersPaused() external view returns (bool);\n\n    /// @notice Pauses transfers\n    function TransferRestrictor_pauseTransfers() external;\n\n    /// @notice Unpauses transfers\n    function TransferRestrictor_unpauseTransfers() external;\n\n    ///@notice sets Legacy dshare factory \n    function TransferRestrictor_setLegacyDShareFactory(address legacyDShareFactory) external;\n}"},"src/common/diamond/facets/access-control/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/// @title IAccessControlBase\n/// @notice Base interface for role-based access control system\n/// @dev Defines events, errors, and structures for access control management\ninterface IAccessControlBase {\n    /// @notice Thrown when attempting to remove admin role access from access control functions\n    /// @dev Prevents system lockout by ensuring admin always has access to ACL functions\n    error AccessControl_CannotRemoveAdmin();\n\n    /// @notice Thrown when a user attempts to call a function they're not authorized for\n    error AccessControl_CallerIsNotAuthorized();\n\n    /**\n     * @notice Emitted when a user's role assignment changes\n     * @param user The address whose role is being updated\n     * @param role The role identifier being modified\n     * @param enabled True if the role is being granted, false if being revoked\n     */\n    event UserRoleUpdated(address indexed user, uint8 indexed role, bool enabled);\n\n    /**\n     * @notice Emitted when function access permissions change for a role\n     * @param functionSig The 4-byte function selector whose access is being modified\n     * @param role The role identifier whose access is being changed\n     * @param enabled True if access is being granted, false if being revoked\n     */\n    event FunctionAccessChanged(bytes4 indexed functionSig, uint8 indexed role, bool enabled);\n\n    /// @notice Configuration structure for batch role assignments\n    /// @param user The address to receive role assignments\n    /// @param roles Array of role identifiers to assign or revoke\n    /// @param enabled True to grant roles, false to revoke roles\n    struct RoleConfiguration {\n        address user;\n        uint8[] roles;\n        bool enabled;\n    }\n}\n\n/// @title IAccessControl\n/// @notice Interface for role-based access control in the diamond\n/// @dev Extends IAccessControlBase with function and role management capabilities\ninterface IAccessControl is IAccessControlBase {\n    /**\n     * @notice Configures whether a specific role can call a function\n     * @dev Only callable by authorized admins. Cannot remove admin access to ACL functions\n     * @param functionSig The 4-byte function selector to configure\n     * @param role The role identifier to grant or revoke access\n     * @param enabled True to grant access, false to revoke access\n     */\n    function setFunctionAccess(bytes4 functionSig, uint8 role, bool enabled) external;\n\n    /**\n     * @notice Grants or revokes a role for a user\n     * @dev Only callable by authorized admins\n     * @param user The address to modify role assignment for\n     * @param role The role identifier to grant or revoke\n     * @param enabled True to grant the role, false to revoke it\n     */\n    function setUserRole(address user, uint8 role, bool enabled) external;\n\n    /**\n     * @notice Grants or revokes multiple roles for a user in a single transaction\n     * @dev Only callable by authorized admins. More gas-efficient for bulk operations\n     * @param user The address to modify role assignments for\n     * @param roles Array of role identifiers to grant or revoke\n     * @param enabled True to grant all roles, false to revoke all roles\n     */\n    function setUserRoles(address user, uint8[] calldata roles, bool enabled) external;\n\n    /**\n     * @notice Configures roles for multiple users in a single transaction\n     * @dev Only callable by authorized admins. Most gas-efficient for bulk operations\n     * @param configs Array of role configurations, each specifying user, roles, and enabled state\n     */\n    function setUserRolesBatch(RoleConfiguration[] calldata configs) external;\n\n    /**\n     * @notice Checks if a user has permission to call a specific function\n     * @dev Returns true if user has any role with access, or has DEFAULT_ADMIN_ROLE\n     * @param user The address to check permissions for\n     * @param functionSig The 4-byte function selector to check\n     * @return True if the user can call the function, false otherwise\n     */\n    function canCall(address user, bytes4 functionSig) external view returns (bool);\n\n    /**\n     * @notice Retrieves all roles assigned to a user\n     * @dev Roles are bit-packed into a bytes32 value, where each bit represents a role\n     * @param user The address to query roles for\n     * @return Bitmap of assigned roles encoded as bytes32\n     */\n    function userRoles(address user) external view returns (bytes32);\n\n    /**\n     * @notice Retrieves all roles that have access to a function\n     * @dev Roles are bit-packed into a bytes32 value, where each bit represents a role\n     * @param functionSig The 4-byte function selector to query\n     * @return Bitmap of authorized roles encoded as bytes32\n     */\n    function functionRoles(bytes4 functionSig) external view returns (bytes32);\n\n    /**\n     * @notice Checks if a user has a specific role\n     * @param user The address to check\n     * @param role The role identifier to check for\n     * @return True if the user has the role, false otherwise\n     */\n    function hasRole(address user, uint8 role) external view returns (bool);\n\n    /**\n     * @notice Checks if a specific role has access to a function\n     * @param role The role identifier to check\n     * @param functionSig The 4-byte function selector to check\n     * @return True if the role has access, false otherwise\n     */\n    function roleHasAccess(uint8 role, bytes4 functionSig) external view returns (bool);\n}\n"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},"lib/solady/src/tokens/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Simple ERC20 + EIP-2612 implementation.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)\n///\n/// @dev Note:\n/// - The ERC20 standard allows minting and transferring to and from the zero address,\n///   minting and transferring zero tokens, as well as self-approvals.\n///   For performance, this implementation WILL NOT revert for such actions.\n///   Please add any checks with overrides if desired.\n/// - The `permit` function uses the ecrecover precompile (0x1).\n///\n/// If you are overriding:\n/// - NEVER violate the ERC20 invariant:\n///   the total sum of all balances must be equal to `totalSupply()`.\n/// - Check that the overridden function is actually used in the function you want to\n///   change the behavior of. Much of the code has been manually inlined for performance.\nabstract contract ERC20 {\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                       CUSTOM ERRORS                        */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The total supply has overflowed.\n    error TotalSupplyOverflow();\n\n    /// @dev The allowance has overflowed.\n    error AllowanceOverflow();\n\n    /// @dev The allowance has underflowed.\n    error AllowanceUnderflow();\n\n    /// @dev Insufficient balance.\n    error InsufficientBalance();\n\n    /// @dev Insufficient allowance.\n    error InsufficientAllowance();\n\n    /// @dev The permit is invalid.\n    error InvalidPermit();\n\n    /// @dev The permit has expired.\n    error PermitExpired();\n\n    /// @dev The allowance of Permit2 is fixed at infinity.\n    error Permit2AllowanceIsFixedAtInfinity();\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                           EVENTS                           */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Emitted when `amount` tokens is transferred from `from` to `to`.\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n    /// @dev `keccak256(bytes(\"Transfer(address,address,uint256)\"))`.\n    uint256 private constant _TRANSFER_EVENT_SIGNATURE =\n        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;\n\n    /// @dev `keccak256(bytes(\"Approval(address,address,uint256)\"))`.\n    uint256 private constant _APPROVAL_EVENT_SIGNATURE =\n        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                          STORAGE                           */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The storage slot for the total supply.\n    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;\n\n    /// @dev The balance slot of `owner` is given by:\n    /// ```\n    ///     mstore(0x0c, _BALANCE_SLOT_SEED)\n    ///     mstore(0x00, owner)\n    ///     let balanceSlot := keccak256(0x0c, 0x20)\n    /// ```\n    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;\n\n    /// @dev The allowance slot of (`owner`, `spender`) is given by:\n    /// ```\n    ///     mstore(0x20, spender)\n    ///     mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n    ///     mstore(0x00, owner)\n    ///     let allowanceSlot := keccak256(0x0c, 0x34)\n    /// ```\n    uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;\n\n    /// @dev The nonce slot of `owner` is given by:\n    /// ```\n    ///     mstore(0x0c, _NONCES_SLOT_SEED)\n    ///     mstore(0x00, owner)\n    ///     let nonceSlot := keccak256(0x0c, 0x20)\n    /// ```\n    uint256 private constant _NONCES_SLOT_SEED = 0x38377508;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                         CONSTANTS                          */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`.\n    uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901;\n\n    /// @dev `keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\")`.\n    bytes32 private constant _DOMAIN_TYPEHASH =\n        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n    /// @dev `keccak256(\"1\")`.\n    /// If you need to use a different version, override `_versionHash`.\n    bytes32 private constant _DEFAULT_VERSION_HASH =\n        0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;\n\n    /// @dev `keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\")`.\n    bytes32 private constant _PERMIT_TYPEHASH =\n        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n\n    /// @dev The canonical Permit2 address.\n    /// For signature-based allowance granting for single transaction ERC20 `transferFrom`.\n    /// Enabled by default. To disable, override `_givePermit2InfiniteAllowance()`.\n    /// [Github](https://github.com/Uniswap/permit2)\n    /// [Etherscan](https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3)\n    address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                       ERC20 METADATA                       */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns the name of the token.\n    function name() public view virtual returns (string memory);\n\n    /// @dev Returns the symbol of the token.\n    function symbol() public view virtual returns (string memory);\n\n    /// @dev Returns the decimals places of the token.\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                           ERC20                            */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns the amount of tokens in existence.\n    function totalSupply() public view virtual returns (uint256 result) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := sload(_TOTAL_SUPPLY_SLOT)\n        }\n    }\n\n    /// @dev Returns the amount of tokens owned by `owner`.\n    function balanceOf(address owner) public view virtual returns (uint256 result) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, owner)\n            result := sload(keccak256(0x0c, 0x20))\n        }\n    }\n\n    /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.\n    function allowance(address owner, address spender)\n        public\n        view\n        virtual\n        returns (uint256 result)\n    {\n        if (_givePermit2InfiniteAllowance()) {\n            if (spender == _PERMIT2) return type(uint256).max;\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            mstore(0x20, spender)\n            mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n            mstore(0x00, owner)\n            result := sload(keccak256(0x0c, 0x34))\n        }\n    }\n\n    /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n    ///\n    /// Emits a {Approval} event.\n    function approve(address spender, uint256 amount) public virtual returns (bool) {\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                // If `spender == _PERMIT2 && amount != type(uint256).max`.\n                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(amount)))) {\n                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the allowance slot and store the amount.\n            mstore(0x20, spender)\n            mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n            mstore(0x00, caller())\n            sstore(keccak256(0x0c, 0x34), amount)\n            // Emit the {Approval} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))\n        }\n        return true;\n    }\n\n    /// @dev Transfer `amount` tokens from the caller to `to`.\n    ///\n    /// Requirements:\n    /// - `from` must at least have `amount`.\n    ///\n    /// Emits a {Transfer} event.\n    function transfer(address to, uint256 amount) public virtual returns (bool) {\n        _beforeTokenTransfer(msg.sender, to, amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, caller())\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(amount, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, amount))\n            // Compute the balance slot of `to`.\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance of `to`.\n            // Will not overflow because the sum of all user balances\n            // cannot exceed the maximum uint256 value.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(msg.sender, to, amount);\n        return true;\n    }\n\n    /// @dev Transfers `amount` tokens from `from` to `to`.\n    ///\n    /// Note: Does not update the allowance if it is the maximum uint256 value.\n    ///\n    /// Requirements:\n    /// - `from` must at least have `amount`.\n    /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.\n    ///\n    /// Emits a {Transfer} event.\n    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {\n        _beforeTokenTransfer(from, to, amount);\n        // Code duplication is for zero-cost abstraction if possible.\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                let from_ := shl(96, from)\n                if iszero(eq(caller(), _PERMIT2)) {\n                    // Compute the allowance slot and load its value.\n                    mstore(0x20, caller())\n                    mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))\n                    let allowanceSlot := keccak256(0x0c, 0x34)\n                    let allowance_ := sload(allowanceSlot)\n                    // If the allowance is not the maximum uint256 value.\n                    if not(allowance_) {\n                        // Revert if the amount to be transferred exceeds the allowance.\n                        if gt(amount, allowance_) {\n                            mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.\n                            revert(0x1c, 0x04)\n                        }\n                        // Subtract and store the updated allowance.\n                        sstore(allowanceSlot, sub(allowance_, amount))\n                    }\n                }\n                // Compute the balance slot and load its value.\n                mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n                let fromBalanceSlot := keccak256(0x0c, 0x20)\n                let fromBalance := sload(fromBalanceSlot)\n                // Revert if insufficient balance.\n                if gt(amount, fromBalance) {\n                    mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                    revert(0x1c, 0x04)\n                }\n                // Subtract and store the updated balance.\n                sstore(fromBalanceSlot, sub(fromBalance, amount))\n                // Compute the balance slot of `to`.\n                mstore(0x00, to)\n                let toBalanceSlot := keccak256(0x0c, 0x20)\n                // Add and store the updated balance of `to`.\n                // Will not overflow because the sum of all user balances\n                // cannot exceed the maximum uint256 value.\n                sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n                // Emit the {Transfer} event.\n                mstore(0x20, amount)\n                log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n            }\n        } else {\n            /// @solidity memory-safe-assembly\n            assembly {\n                let from_ := shl(96, from)\n                // Compute the allowance slot and load its value.\n                mstore(0x20, caller())\n                mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))\n                let allowanceSlot := keccak256(0x0c, 0x34)\n                let allowance_ := sload(allowanceSlot)\n                // If the allowance is not the maximum uint256 value.\n                if not(allowance_) {\n                    // Revert if the amount to be transferred exceeds the allowance.\n                    if gt(amount, allowance_) {\n                        mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.\n                        revert(0x1c, 0x04)\n                    }\n                    // Subtract and store the updated allowance.\n                    sstore(allowanceSlot, sub(allowance_, amount))\n                }\n                // Compute the balance slot and load its value.\n                mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n                let fromBalanceSlot := keccak256(0x0c, 0x20)\n                let fromBalance := sload(fromBalanceSlot)\n                // Revert if insufficient balance.\n                if gt(amount, fromBalance) {\n                    mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                    revert(0x1c, 0x04)\n                }\n                // Subtract and store the updated balance.\n                sstore(fromBalanceSlot, sub(fromBalance, amount))\n                // Compute the balance slot of `to`.\n                mstore(0x00, to)\n                let toBalanceSlot := keccak256(0x0c, 0x20)\n                // Add and store the updated balance of `to`.\n                // Will not overflow because the sum of all user balances\n                // cannot exceed the maximum uint256 value.\n                sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n                // Emit the {Transfer} event.\n                mstore(0x20, amount)\n                log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n            }\n        }\n        _afterTokenTransfer(from, to, amount);\n        return true;\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                          EIP-2612                          */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev For more performance, override to return the constant value\n    /// of `keccak256(bytes(name()))` if `name()` will never change.\n    function _constantNameHash() internal view virtual returns (bytes32 result) {}\n\n    /// @dev If you need a different value, override this function.\n    function _versionHash() internal view virtual returns (bytes32 result) {\n        result = _DEFAULT_VERSION_HASH;\n    }\n\n    /// @dev For inheriting contracts to increment the nonce.\n    function _incrementNonce(address owner) internal virtual {\n        /// @solidity memory-safe-assembly\n        assembly {\n            mstore(0x0c, _NONCES_SLOT_SEED)\n            mstore(0x00, owner)\n            let nonceSlot := keccak256(0x0c, 0x20)\n            sstore(nonceSlot, add(1, sload(nonceSlot)))\n        }\n    }\n\n    /// @dev Returns the current nonce for `owner`.\n    /// This value is used to compute the signature for EIP-2612 permit.\n    function nonces(address owner) public view virtual returns (uint256 result) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the nonce slot and load its value.\n            mstore(0x0c, _NONCES_SLOT_SEED)\n            mstore(0x00, owner)\n            result := sload(keccak256(0x0c, 0x20))\n        }\n    }\n\n    /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`,\n    /// authorized by a signed approval by `owner`.\n    ///\n    /// Emits a {Approval} event.\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public virtual {\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                // If `spender == _PERMIT2 && value != type(uint256).max`.\n                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(value)))) {\n                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n        bytes32 nameHash = _constantNameHash();\n        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.\n        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));\n        bytes32 versionHash = _versionHash();\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Revert if the block timestamp is greater than `deadline`.\n            if gt(timestamp(), deadline) {\n                mstore(0x00, 0x1a15a3cc) // `PermitExpired()`.\n                revert(0x1c, 0x04)\n            }\n            let m := mload(0x40) // Grab the free memory pointer.\n            // Clean the upper 96 bits.\n            owner := shr(96, shl(96, owner))\n            spender := shr(96, shl(96, spender))\n            // Compute the nonce slot and load its value.\n            mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX)\n            mstore(0x00, owner)\n            let nonceSlot := keccak256(0x0c, 0x20)\n            let nonceValue := sload(nonceSlot)\n            // Prepare the domain separator.\n            mstore(m, _DOMAIN_TYPEHASH)\n            mstore(add(m, 0x20), nameHash)\n            mstore(add(m, 0x40), versionHash)\n            mstore(add(m, 0x60), chainid())\n            mstore(add(m, 0x80), address())\n            mstore(0x2e, keccak256(m, 0xa0))\n            // Prepare the struct hash.\n            mstore(m, _PERMIT_TYPEHASH)\n            mstore(add(m, 0x20), owner)\n            mstore(add(m, 0x40), spender)\n            mstore(add(m, 0x60), value)\n            mstore(add(m, 0x80), nonceValue)\n            mstore(add(m, 0xa0), deadline)\n            mstore(0x4e, keccak256(m, 0xc0))\n            // Prepare the ecrecover calldata.\n            mstore(0x00, keccak256(0x2c, 0x42))\n            mstore(0x20, and(0xff, v))\n            mstore(0x40, r)\n            mstore(0x60, s)\n            let t := staticcall(gas(), 1, 0x00, 0x80, 0x20, 0x20)\n            // If the ecrecover fails, the returndatasize will be 0x00,\n            // `owner` will be checked if it equals the hash at 0x00,\n            // which evaluates to false (i.e. 0), and we will revert.\n            // If the ecrecover succeeds, the returndatasize will be 0x20,\n            // `owner` will be compared against the returned address at 0x20.\n            if iszero(eq(mload(returndatasize()), owner)) {\n                mstore(0x00, 0xddafbaef) // `InvalidPermit()`.\n                revert(0x1c, 0x04)\n            }\n            // Increment and store the updated nonce.\n            sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds.\n            // Compute the allowance slot and store the value.\n            // The `owner` is already at slot 0x20.\n            mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender))\n            sstore(keccak256(0x2c, 0x34), value)\n            // Emit the {Approval} event.\n            log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender)\n            mstore(0x40, m) // Restore the free memory pointer.\n            mstore(0x60, 0) // Restore the zero pointer.\n        }\n    }\n\n    /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit.\n    function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) {\n        bytes32 nameHash = _constantNameHash();\n        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.\n        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));\n        bytes32 versionHash = _versionHash();\n        /// @solidity memory-safe-assembly\n        assembly {\n            let m := mload(0x40) // Grab the free memory pointer.\n            mstore(m, _DOMAIN_TYPEHASH)\n            mstore(add(m, 0x20), nameHash)\n            mstore(add(m, 0x40), versionHash)\n            mstore(add(m, 0x60), chainid())\n            mstore(add(m, 0x80), address())\n            result := keccak256(m, 0xa0)\n        }\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                  INTERNAL MINT FUNCTIONS                   */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Mints `amount` tokens to `to`, increasing the total supply.\n    ///\n    /// Emits a {Transfer} event.\n    function _mint(address to, uint256 amount) internal virtual {\n        _beforeTokenTransfer(address(0), to, amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)\n            let totalSupplyAfter := add(totalSupplyBefore, amount)\n            // Revert if the total supply overflows.\n            if lt(totalSupplyAfter, totalSupplyBefore) {\n                mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.\n                revert(0x1c, 0x04)\n            }\n            // Store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(address(0), to, amount);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                  INTERNAL BURN FUNCTIONS                   */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Burns `amount` tokens from `from`, reducing the total supply.\n    ///\n    /// Emits a {Transfer} event.\n    function _burn(address from, uint256 amount) internal virtual {\n        _beforeTokenTransfer(from, address(0), amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, from)\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(amount, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, amount))\n            // Subtract and store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount))\n            // Emit the {Transfer} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)\n        }\n        _afterTokenTransfer(from, address(0), amount);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                INTERNAL TRANSFER FUNCTIONS                 */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Moves `amount` of tokens from `from` to `to`.\n    function _transfer(address from, address to, uint256 amount) internal virtual {\n        _beforeTokenTransfer(from, to, amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            let from_ := shl(96, from)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(amount, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, amount))\n            // Compute the balance slot of `to`.\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance of `to`.\n            // Will not overflow because the sum of all user balances\n            // cannot exceed the maximum uint256 value.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(from, to, amount);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                INTERNAL ALLOWANCE FUNCTIONS                */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.\n    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n        if (_givePermit2InfiniteAllowance()) {\n            if (spender == _PERMIT2) return; // Do nothing, as allowance is infinite.\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the allowance slot and load its value.\n            mstore(0x20, spender)\n            mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n            mstore(0x00, owner)\n            let allowanceSlot := keccak256(0x0c, 0x34)\n            let allowance_ := sload(allowanceSlot)\n            // If the allowance is not the maximum uint256 value.\n            if not(allowance_) {\n                // Revert if the amount to be transferred exceeds the allowance.\n                if gt(amount, allowance_) {\n                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.\n                    revert(0x1c, 0x04)\n                }\n                // Subtract and store the updated allowance.\n                sstore(allowanceSlot, sub(allowance_, amount))\n            }\n        }\n    }\n\n    /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.\n    ///\n    /// Emits a {Approval} event.\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                // If `spender == _PERMIT2 && amount != type(uint256).max`.\n                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(amount)))) {\n                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            let owner_ := shl(96, owner)\n            // Compute the allowance slot and store the amount.\n            mstore(0x20, spender)\n            mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))\n            sstore(keccak256(0x0c, 0x34), amount)\n            // Emit the {Approval} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))\n        }\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                     HOOKS TO OVERRIDE                      */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Hook that is called before any transfer of tokens.\n    /// This includes minting and burning.\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n    /// @dev Hook that is called after any transfer of tokens.\n    /// This includes minting and burning.\n    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                          PERMIT2                           */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns whether to fix the Permit2 contract's allowance at infinity.\n    ///\n    /// This value should be kept constant after contract initialization,\n    /// or else the actual allowance values may not match with the {Approval} events.\n    /// For best performance, return a compile-time constant for zero-cost abstraction.\n    function _givePermit2InfiniteAllowance() internal view virtual returns (bool) {\n        return true;\n    }\n}\n"},"src/common/utils/NumberUtils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @title NumberUtils\n/// @notice Library providing arithmetic utility functions with overflow detection\n/// @dev Implements unchecked arithmetic with explicit overflow checks for gas optimization\nlibrary NumberUtils {\n    /// @notice Checks if adding two numbers would overflow\n    /// @dev Uses unchecked arithmetic and detects overflow by comparing result with inputs\n    /// @param a First operand\n    /// @param b Second operand\n    /// @return True if overflow would occur, false otherwise\n    function addCheckOverflow(uint256 a, uint256 b) internal pure returns (bool) {\n        uint256 c = 0;\n        unchecked {\n            c = a + b;\n        }\n        return c < a || c < b;\n    }\n\n    /// @notice Checks if multiplying two numbers would overflow\n    /// @dev Uses unchecked arithmetic and detects overflow by verifying c/a == b\n    /// @param a First operand\n    /// @param b Second operand\n    /// @return True if overflow would occur, false otherwise\n    function mulCheckOverflow(uint256 a, uint256 b) internal pure returns (bool) {\n        if (a == 0 || b == 0) {\n            return false;\n        }\n        uint256 c;\n        unchecked {\n            c = a * b;\n        }\n        return c / a != b;\n    }\n\n    /// @notice Checks if (a * b) / denominator would overflow\n    /// @dev Implements PRB-Math algorithm for high-precision mulDiv overflow detection\n    ///      Uses assembly to compute 512-bit intermediate product\n    /// @param a First operand\n    /// @param b Second operand\n    /// @param denominator Divisor (must be non-zero)\n    /// @return True if overflow would occur, false otherwise\n    function mulDivCheckOverflow(uint256 a, uint256 b, uint256 denominator) internal pure returns (bool) {\n        // Taken from prb-math\n        uint256 prod0; // 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            prod0 := mul(a, b)\n            prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n        }\n        return prod1 >= denominator;\n    }\n\n    /// @notice Computes the absolute difference between two unsigned integers\n    /// @dev Returns |a - b| without using signed arithmetic\n    /// @param a First value\n    /// @param b Second value\n    /// @return Absolute difference between a and b\n    function uintAbsDiff(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a >= b ? a - b : b - a;\n    }\n}\n"},"lib/solady/src/utils/FixedPointMathLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Arithmetic library with operations for fixed-point numbers.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)\nlibrary FixedPointMathLib {\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                       CUSTOM ERRORS                        */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The operation failed, as the output exceeds the maximum value of uint256.\n    error ExpOverflow();\n\n    /// @dev The operation failed, as the output exceeds the maximum value of uint256.\n    error FactorialOverflow();\n\n    /// @dev The operation failed, due to an overflow.\n    error RPowOverflow();\n\n    /// @dev The mantissa is too big to fit.\n    error MantissaOverflow();\n\n    /// @dev The operation failed, due to an multiplication overflow.\n    error MulWadFailed();\n\n    /// @dev The operation failed, due to an multiplication overflow.\n    error SMulWadFailed();\n\n    /// @dev The operation failed, either due to a multiplication overflow, or a division by a zero.\n    error DivWadFailed();\n\n    /// @dev The operation failed, either due to a multiplication overflow, or a division by a zero.\n    error SDivWadFailed();\n\n    /// @dev The operation failed, either due to a multiplication overflow, or a division by a zero.\n    error MulDivFailed();\n\n    /// @dev The division failed, as the denominator is zero.\n    error DivFailed();\n\n    /// @dev The full precision multiply-divide operation failed, either due\n    /// to the result being larger than 256 bits, or a division by a zero.\n    error FullMulDivFailed();\n\n    /// @dev The output is undefined, as the input is less-than-or-equal to zero.\n    error LnWadUndefined();\n\n    /// @dev The input outside the acceptable domain.\n    error OutOfDomain();\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                         CONSTANTS                          */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The scalar of ETH and most ERC20s.\n    uint256 internal constant WAD = 1e18;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*              SIMPLIFIED FIXED POINT OPERATIONS             */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down.\n    function mulWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Equivalent to `require(y == 0 || x <= type(uint256).max / y)`.\n            if gt(x, div(not(0), y)) {\n                if y {\n                    mstore(0x00, 0xbac65e5b) // `MulWadFailed()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n            z := div(mul(x, y), WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down.\n    function sMulWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require((x == 0 || z / x == y) && !(x == -1 && y == type(int256).min))`.\n            if iszero(gt(or(iszero(x), eq(sdiv(z, x), y)), lt(not(x), eq(y, shl(255, 1))))) {\n                mstore(0x00, 0xedcd4dd4) // `SMulWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := sdiv(z, WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down, but without overflow checks.\n    function rawMulWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := div(mul(x, y), WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down, but without overflow checks.\n    function rawSMulWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sdiv(mul(x, y), WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded up.\n    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require(y == 0 || x <= type(uint256).max / y)`.\n            if iszero(eq(div(z, y), x)) {\n                if y {\n                    mstore(0x00, 0xbac65e5b) // `MulWadFailed()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n            z := add(iszero(iszero(mod(z, WAD))), div(z, WAD))\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded up, but without overflow checks.\n    function rawMulWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(iszero(iszero(mod(mul(x, y), WAD))), div(mul(x, y), WAD))\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down.\n    function divWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Equivalent to `require(y != 0 && x <= type(uint256).max / WAD)`.\n            if iszero(mul(y, lt(x, add(1, div(not(0), WAD))))) {\n                mstore(0x00, 0x7c5f487d) // `DivWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := div(mul(x, WAD), y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down.\n    function sDivWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, WAD)\n            // Equivalent to `require(y != 0 && ((x * WAD) / WAD == x))`.\n            if iszero(mul(y, eq(sdiv(z, WAD), x))) {\n                mstore(0x00, 0x5c43740d) // `SDivWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := sdiv(z, y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down, but without overflow and divide by zero checks.\n    function rawDivWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := div(mul(x, WAD), y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down, but without overflow and divide by zero checks.\n    function rawSDivWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sdiv(mul(x, WAD), y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded up.\n    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Equivalent to `require(y != 0 && x <= type(uint256).max / WAD)`.\n            if iszero(mul(y, lt(x, add(1, div(not(0), WAD))))) {\n                mstore(0x00, 0x7c5f487d) // `DivWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := add(iszero(iszero(mod(mul(x, WAD), y))), div(mul(x, WAD), y))\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded up, but without overflow and divide by zero checks.\n    function rawDivWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(iszero(iszero(mod(mul(x, WAD), y))), div(mul(x, WAD), y))\n        }\n    }\n\n    /// @dev Equivalent to `x` to the power of `y`.\n    /// because `x ** y = (e ** ln(x)) ** y = e ** (ln(x) * y)`.\n    /// Note: This function is an approximation.\n    function powWad(int256 x, int256 y) internal pure returns (int256) {\n        // Using `ln(x)` means `x` must be greater than 0.\n        return expWad((lnWad(x) * y) / int256(WAD));\n    }\n\n    /// @dev Returns `exp(x)`, denominated in `WAD`.\n    /// Credit to Remco Bloemen under MIT license: https://2π.com/22/exp-ln\n    /// Note: This function is an approximation. Monotonically increasing.\n    function expWad(int256 x) internal pure returns (int256 r) {\n        unchecked {\n            // When the result is less than 0.5 we return zero.\n            // This happens when `x <= (log(1e-18) * 1e18) ~ -4.15e19`.\n            if (x <= -41446531673892822313) return r;\n\n            /// @solidity memory-safe-assembly\n            assembly {\n                // When the result is greater than `(2**255 - 1) / 1e18` we can not represent it as\n                // an int. This happens when `x >= floor(log((2**255 - 1) / 1e18) * 1e18) ≈ 135`.\n                if iszero(slt(x, 135305999368893231589)) {\n                    mstore(0x00, 0xa37bfec9) // `ExpOverflow()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n\n            // `x` is now in the range `(-42, 136) * 1e18`. Convert to `(-42, 136) * 2**96`\n            // for more intermediate precision and a binary basis. This base conversion\n            // is a multiplication by 1e18 / 2**96 = 5**18 / 2**78.\n            x = (x << 78) / 5 ** 18;\n\n            // Reduce range of x to (-½ ln 2, ½ ln 2) * 2**96 by factoring out powers\n            // of two such that exp(x) = exp(x') * 2**k, where k is an integer.\n            // Solving this gives k = round(x / log(2)) and x' = x - k * log(2).\n            int256 k = ((x << 96) / 54916777467707473351141471128 + 2 ** 95) >> 96;\n            x = x - k * 54916777467707473351141471128;\n\n            // `k` is in the range `[-61, 195]`.\n\n            // Evaluate using a (6, 7)-term rational approximation.\n            // `p` is made monic, we'll multiply by a scale factor later.\n            int256 y = x + 1346386616545796478920950773328;\n            y = ((y * x) >> 96) + 57155421227552351082224309758442;\n            int256 p = y + x - 94201549194550492254356042504812;\n            p = ((p * y) >> 96) + 28719021644029726153956944680412240;\n            p = p * x + (4385272521454847904659076985693276 << 96);\n\n            // We leave `p` in `2**192` basis so we don't need to scale it back up for the division.\n            int256 q = x - 2855989394907223263936484059900;\n            q = ((q * x) >> 96) + 50020603652535783019961831881945;\n            q = ((q * x) >> 96) - 533845033583426703283633433725380;\n            q = ((q * x) >> 96) + 3604857256930695427073651918091429;\n            q = ((q * x) >> 96) - 14423608567350463180887372962807573;\n            q = ((q * x) >> 96) + 26449188498355588339934803723976023;\n\n            /// @solidity memory-safe-assembly\n            assembly {\n                // Div in assembly because solidity adds a zero check despite the unchecked.\n                // The q polynomial won't have zeros in the domain as all its roots are complex.\n                // No scaling is necessary because p is already `2**96` too large.\n                r := sdiv(p, q)\n            }\n\n            // r should be in the range `(0.09, 0.25) * 2**96`.\n\n            // We now need to multiply r by:\n            // - The scale factor `s ≈ 6.031367120`.\n            // - The `2**k` factor from the range reduction.\n            // - The `1e18 / 2**96` factor for base conversion.\n            // We do this all at once, with an intermediate result in `2**213`\n            // basis, so the final right shift is always by a positive amount.\n            r = int256(\n                (uint256(r) * 3822833074963236453042738258902158003155416615667) >> uint256(195 - k)\n            );\n        }\n    }\n\n    /// @dev Returns `ln(x)`, denominated in `WAD`.\n    /// Credit to Remco Bloemen under MIT license: https://2π.com/22/exp-ln\n    /// Note: This function is an approximation. Monotonically increasing.\n    function lnWad(int256 x) internal pure returns (int256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // We want to convert `x` from `10**18` fixed point to `2**96` fixed point.\n            // We do this by multiplying by `2**96 / 10**18`. But since\n            // `ln(x * C) = ln(x) + ln(C)`, we can simply do nothing here\n            // and add `ln(2**96 / 10**18)` at the end.\n\n            // Compute `k = log2(x) - 96`, `r = 159 - k = 255 - log2(x) = 255 ^ log2(x)`.\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // We place the check here for more optimal stack operations.\n            if iszero(sgt(x, 0)) {\n                mstore(0x00, 0x1615e638) // `LnWadUndefined()`.\n                revert(0x1c, 0x04)\n            }\n            // forgefmt: disable-next-item\n            r := xor(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0xf8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff))\n\n            // Reduce range of x to (1, 2) * 2**96\n            // ln(2^k * x) = k * ln(2) + ln(x)\n            x := shr(159, shl(r, x))\n\n            // Evaluate using a (8, 8)-term rational approximation.\n            // `p` is made monic, we will multiply by a scale factor later.\n            // forgefmt: disable-next-item\n            let p := sub( // This heavily nested expression is to avoid stack-too-deep for via-ir.\n                sar(96, mul(add(43456485725739037958740375743393,\n                sar(96, mul(add(24828157081833163892658089445524,\n                sar(96, mul(add(3273285459638523848632254066296,\n                    x), x))), x))), x)), 11111509109440967052023855526967)\n            p := sub(sar(96, mul(p, x)), 45023709667254063763336534515857)\n            p := sub(sar(96, mul(p, x)), 14706773417378608786704636184526)\n            p := sub(mul(p, x), shl(96, 795164235651350426258249787498))\n            // We leave `p` in `2**192` basis so we don't need to scale it back up for the division.\n\n            // `q` is monic by convention.\n            let q := add(5573035233440673466300451813936, x)\n            q := add(71694874799317883764090561454958, sar(96, mul(x, q)))\n            q := add(283447036172924575727196451306956, sar(96, mul(x, q)))\n            q := add(401686690394027663651624208769553, sar(96, mul(x, q)))\n            q := add(204048457590392012362485061816622, sar(96, mul(x, q)))\n            q := add(31853899698501571402653359427138, sar(96, mul(x, q)))\n            q := add(909429971244387300277376558375, sar(96, mul(x, q)))\n\n            // `p / q` is in the range `(0, 0.125) * 2**96`.\n\n            // Finalization, we need to:\n            // - Multiply by the scale factor `s = 5.549…`.\n            // - Add `ln(2**96 / 10**18)`.\n            // - Add `k * ln(2)`.\n            // - Multiply by `10**18 / 2**96 = 5**18 >> 78`.\n\n            // The q polynomial is known not to have zeros in the domain.\n            // No scaling required because p is already `2**96` too large.\n            p := sdiv(p, q)\n            // Multiply by the scaling factor: `s * 5**18 * 2**96`, base is now `5**18 * 2**192`.\n            p := mul(1677202110996718588342820967067443963516166, p)\n            // Add `ln(2) * k * 5**18 * 2**192`.\n            // forgefmt: disable-next-item\n            p := add(mul(16597577552685614221487285958193947469193820559219878177908093499208371, sub(159, r)), p)\n            // Add `ln(2**96 / 10**18) * 5**18 * 2**192`.\n            p := add(600920179829731861736702779321621459595472258049074101567377883020018308, p)\n            // Base conversion: mul `2**18 / 2**192`.\n            r := sar(174, p)\n        }\n    }\n\n    /// @dev Returns `W_0(x)`, denominated in `WAD`.\n    /// See: https://en.wikipedia.org/wiki/Lambert_W_function\n    /// a.k.a. Product log function. This is an approximation of the principal branch.\n    /// Note: This function is an approximation. Monotonically increasing.\n    function lambertW0Wad(int256 x) internal pure returns (int256 w) {\n        // forgefmt: disable-next-item\n        unchecked {\n            if ((w = x) <= -367879441171442322) revert OutOfDomain(); // `x` less than `-1/e`.\n            (int256 wad, int256 p) = (int256(WAD), x);\n            uint256 c; // Whether we need to avoid catastrophic cancellation.\n            uint256 i = 4; // Number of iterations.\n            if (w <= 0x1ffffffffffff) {\n                if (-0x4000000000000 <= w) {\n                    i = 1; // Inputs near zero only take one step to converge.\n                } else if (w <= -0x3ffffffffffffff) {\n                    i = 32; // Inputs near `-1/e` take very long to converge.\n                }\n            } else if (uint256(w >> 63) == uint256(0)) {\n                /// @solidity memory-safe-assembly\n                assembly {\n                    // Inline log2 for more performance, since the range is small.\n                    let v := shr(49, w)\n                    let l := shl(3, lt(0xff, v))\n                    l := add(or(l, byte(and(0x1f, shr(shr(l, v), 0x8421084210842108cc6318c6db6d54be)),\n                        0x0706060506020504060203020504030106050205030304010505030400000000)), 49)\n                    w := sdiv(shl(l, 7), byte(sub(l, 31), 0x0303030303030303040506080c13))\n                    c := gt(l, 60)\n                    i := add(2, add(gt(l, 53), c))\n                }\n            } else {\n                int256 ll = lnWad(w = lnWad(w));\n                /// @solidity memory-safe-assembly\n                assembly {\n                    // `w = ln(x) - ln(ln(x)) + b * ln(ln(x)) / ln(x)`.\n                    w := add(sdiv(mul(ll, 1023715080943847266), w), sub(w, ll))\n                    i := add(3, iszero(shr(68, x)))\n                    c := iszero(shr(143, x))\n                }\n                if (c == uint256(0)) {\n                    do { // If `x` is big, use Newton's so that intermediate values won't overflow.\n                        int256 e = expWad(w);\n                        /// @solidity memory-safe-assembly\n                        assembly {\n                            let t := mul(w, div(e, wad))\n                            w := sub(w, sdiv(sub(t, x), div(add(e, t), wad)))\n                        }\n                        if (p <= w) break;\n                        p = w;\n                    } while (--i != uint256(0));\n                    /// @solidity memory-safe-assembly\n                    assembly {\n                        w := sub(w, sgt(w, 2))\n                    }\n                    return w;\n                }\n            }\n            do { // Otherwise, use Halley's for faster convergence.\n                int256 e = expWad(w);\n                /// @solidity memory-safe-assembly\n                assembly {\n                    let t := add(w, wad)\n                    let s := sub(mul(w, e), mul(x, wad))\n                    w := sub(w, sdiv(mul(s, wad), sub(mul(e, t), sdiv(mul(add(t, wad), s), add(t, t)))))\n                }\n                if (p <= w) break;\n                p = w;\n            } while (--i != c);\n            /// @solidity memory-safe-assembly\n            assembly {\n                w := sub(w, sgt(w, 2))\n            }\n            // For certain ranges of `x`, we'll use the quadratic-rate recursive formula of\n            // R. Iacono and J.P. Boyd for the last iteration, to avoid catastrophic cancellation.\n            if (c == uint256(0)) return w;\n            int256 t = w | 1;\n            /// @solidity memory-safe-assembly\n            assembly {\n                x := sdiv(mul(x, wad), t)\n            }\n            x = (t * (wad + lnWad(x)));\n            /// @solidity memory-safe-assembly\n            assembly {\n                w := sdiv(x, add(wad, t))\n            }\n        }\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                  GENERAL NUMBER UTILITIES                  */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns `a * b == x * y`, with full precision.\n    function fullMulEq(uint256 a, uint256 b, uint256 x, uint256 y)\n        internal\n        pure\n        returns (bool result)\n    {\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := and(eq(mul(a, b), mul(x, y)), eq(mulmod(x, y, not(0)), mulmod(a, b, not(0))))\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / d)` with full precision.\n    /// Throws if result overflows a uint256 or when `d` is zero.\n    /// Credit to Remco Bloemen under MIT license: https://2π.com/21/muldiv\n    function fullMulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // 512-bit multiply `[p1 p0] = x * y`.\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 = p1 * 2**256 + p0`.\n\n            // Temporarily use `z` as `p0` to save gas.\n            z := mul(x, y) // Lower 256 bits of `x * y`.\n            for {} 1 {} {\n                // If overflows.\n                if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {\n                    let mm := mulmod(x, y, not(0))\n                    let p1 := sub(mm, add(z, lt(mm, z))) // Upper 256 bits of `x * y`.\n\n                    /*------------------- 512 by 256 division --------------------*/\n\n                    // Make division exact by subtracting the remainder from `[p1 p0]`.\n                    let r := mulmod(x, y, d) // Compute remainder using mulmod.\n                    let t := and(d, sub(0, d)) // The least significant bit of `d`. `t >= 1`.\n                    // Make sure `z` is less than `2**256`. Also prevents `d == 0`.\n                    // Placing the check here seems to give more optimal stack operations.\n                    if iszero(gt(d, p1)) {\n                        mstore(0x00, 0xae47f702) // `FullMulDivFailed()`.\n                        revert(0x1c, 0x04)\n                    }\n                    d := div(d, t) // Divide `d` by `t`, which is a power of two.\n                    // Invert `d mod 2**256`\n                    // Now that `d` is an odd number, it has an inverse\n                    // modulo `2**256` such that `d * inv = 1 mod 2**256`.\n                    // Compute the inverse by starting with a seed that is correct\n                    // correct for four bits. That is, `d * inv = 1 mod 2**4`.\n                    let inv := xor(2, mul(3, d))\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 := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**8\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**16\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**32\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**64\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**128\n                    z :=\n                        mul(\n                            // Divide [p1 p0] by the factors of two.\n                            // Shift in bits from `p1` into `p0`. For this we need\n                            // to flip `t` such that it is `2**256 / t`.\n                            or(mul(sub(p1, gt(r, z)), add(div(sub(0, t), t), 1)), div(sub(z, r), t)),\n                            mul(sub(2, mul(d, inv)), inv) // inverse mod 2**256\n                        )\n                    break\n                }\n                z := div(z, d)\n                break\n            }\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / d)` with full precision.\n    /// Behavior is undefined if `d` is zero or the final result cannot fit in 256 bits.\n    /// Performs the full 512 bit calculation regardless.\n    function fullMulDivUnchecked(uint256 x, uint256 y, uint256 d)\n        internal\n        pure\n        returns (uint256 z)\n    {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            let mm := mulmod(x, y, not(0))\n            let p1 := sub(mm, add(z, lt(mm, z)))\n            let t := and(d, sub(0, d))\n            let r := mulmod(x, y, d)\n            d := div(d, t)\n            let inv := xor(2, mul(3, d))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            z :=\n                mul(\n                    or(mul(sub(p1, gt(r, z)), add(div(sub(0, t), t), 1)), div(sub(z, r), t)),\n                    mul(sub(2, mul(d, inv)), inv)\n                )\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / d)` with full precision, rounded up.\n    /// Throws if result overflows a uint256 or when `d` is zero.\n    /// Credit to Uniswap-v3-core under MIT license:\n    /// https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/FullMath.sol\n    function fullMulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        z = fullMulDiv(x, y, d);\n        /// @solidity memory-safe-assembly\n        assembly {\n            if mulmod(x, y, d) {\n                z := add(z, 1)\n                if iszero(z) {\n                    mstore(0x00, 0xae47f702) // `FullMulDivFailed()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / 2 ** n)` with full precision.\n    /// Throws if result overflows a uint256.\n    /// Credit to Philogy under MIT license:\n    /// https://github.com/SorellaLabs/angstrom/blob/main/contracts/src/libraries/X128MathLib.sol\n    function fullMulDivN(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Temporarily use `z` as `p0` to save gas.\n            z := mul(x, y) // Lower 256 bits of `x * y`. We'll call this `z`.\n            for {} 1 {} {\n                if iszero(or(iszero(x), eq(div(z, x), y))) {\n                    let k := and(n, 0xff) // `n`, cleaned.\n                    let mm := mulmod(x, y, not(0))\n                    let p1 := sub(mm, add(z, lt(mm, z))) // Upper 256 bits of `x * y`.\n                    //         |      p1     |      z     |\n                    // Before: | p1_0 ¦ p1_1 | z_0  ¦ z_1 |\n                    // Final:  |   0  ¦ p1_0 | p1_1 ¦ z_0 |\n                    // Check that final `z` doesn't overflow by checking that p1_0 = 0.\n                    if iszero(shr(k, p1)) {\n                        z := add(shl(sub(256, k), p1), shr(k, z))\n                        break\n                    }\n                    mstore(0x00, 0xae47f702) // `FullMulDivFailed()`.\n                    revert(0x1c, 0x04)\n                }\n                z := shr(and(n, 0xff), z)\n                break\n            }\n        }\n    }\n\n    /// @dev Returns `floor(x * y / d)`.\n    /// Reverts if `x * y` overflows, or `d` is zero.\n    function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require(d != 0 && (y == 0 || x <= type(uint256).max / y))`.\n            if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {\n                mstore(0x00, 0xad251c27) // `MulDivFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := div(z, d)\n        }\n    }\n\n    /// @dev Returns `ceil(x * y / d)`.\n    /// Reverts if `x * y` overflows, or `d` is zero.\n    function mulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require(d != 0 && (y == 0 || x <= type(uint256).max / y))`.\n            if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {\n                mstore(0x00, 0xad251c27) // `MulDivFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := add(iszero(iszero(mod(z, d))), div(z, d))\n        }\n    }\n\n    /// @dev Returns `x`, the modular multiplicative inverse of `a`, such that `(a * x) % n == 1`.\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256 x) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            let g := n\n            let r := mod(a, n)\n            for { let y := 1 } 1 {} {\n                let q := div(g, r)\n                let t := g\n                g := r\n                r := sub(t, mul(r, q))\n                let u := x\n                x := y\n                y := sub(u, mul(y, q))\n                if iszero(r) { break }\n            }\n            x := mul(eq(g, 1), add(x, mul(slt(x, 0), n)))\n        }\n    }\n\n    /// @dev Returns `ceil(x / d)`.\n    /// Reverts if `d` is zero.\n    function divUp(uint256 x, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            if iszero(d) {\n                mstore(0x00, 0x65244e4e) // `DivFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := add(iszero(iszero(mod(x, d))), div(x, d))\n        }\n    }\n\n    /// @dev Returns `max(0, x - y)`. Alias for `saturatingSub`.\n    function zeroFloorSub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(gt(x, y), sub(x, y))\n        }\n    }\n\n    /// @dev Returns `max(0, x - y)`.\n    function saturatingSub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(gt(x, y), sub(x, y))\n        }\n    }\n\n    /// @dev Returns `min(2 ** 256 - 1, x + y)`.\n    function saturatingAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(sub(0, lt(add(x, y), x)), add(x, y))\n        }\n    }\n\n    /// @dev Returns `min(2 ** 256 - 1, x * y)`.\n    function saturatingMul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(sub(or(iszero(x), eq(div(mul(x, y), x), y)), 1), mul(x, y))\n        }\n    }\n\n    /// @dev Returns `condition ? x : y`, without branching.\n    function ternary(bool condition, uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), iszero(condition)))\n        }\n    }\n\n    /// @dev Returns `condition ? x : y`, without branching.\n    function ternary(bool condition, bytes32 x, bytes32 y) internal pure returns (bytes32 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), iszero(condition)))\n        }\n    }\n\n    /// @dev Returns `condition ? x : y`, without branching.\n    function ternary(bool condition, address x, address y) internal pure returns (address z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), iszero(condition)))\n        }\n    }\n\n    /// @dev Returns `x != 0 ? x : y`, without branching.\n    function coalesce(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(x, mul(y, iszero(x)))\n        }\n    }\n\n    /// @dev Returns `x != bytes32(0) ? x : y`, without branching.\n    function coalesce(bytes32 x, bytes32 y) internal pure returns (bytes32 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(x, mul(y, iszero(x)))\n        }\n    }\n\n    /// @dev Returns `x != address(0) ? x : y`, without branching.\n    function coalesce(address x, address y) internal pure returns (address z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(x, mul(y, iszero(shl(96, x))))\n        }\n    }\n\n    /// @dev Exponentiate `x` to `y` by squaring, denominated in base `b`.\n    /// Reverts if the computation overflows.\n    function rpow(uint256 x, uint256 y, uint256 b) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(b, iszero(y)) // `0 ** 0 = 1`. Otherwise, `0 ** n = 0`.\n            if x {\n                z := xor(b, mul(xor(b, x), and(y, 1))) // `z = isEven(y) ? scale : x`\n                let half := shr(1, b) // Divide `b` by 2.\n                // Divide `y` by 2 every iteration.\n                for { y := shr(1, y) } y { y := shr(1, y) } {\n                    let xx := mul(x, x) // Store x squared.\n                    let xxRound := add(xx, half) // Round to the nearest number.\n                    // Revert if `xx + half` overflowed, or if `x ** 2` overflows.\n                    if or(lt(xxRound, xx), shr(128, x)) {\n                        mstore(0x00, 0x49f7642b) // `RPowOverflow()`.\n                        revert(0x1c, 0x04)\n                    }\n                    x := div(xxRound, b) // Set `x` to scaled `xxRound`.\n                    // If `y` is odd:\n                    if and(y, 1) {\n                        let zx := mul(z, x) // Compute `z * x`.\n                        let zxRound := add(zx, half) // Round to the nearest number.\n                        // If `z * x` overflowed or `zx + half` overflowed:\n                        if or(xor(div(zx, x), z), lt(zxRound, zx)) {\n                            // Revert if `x` is non-zero.\n                            if x {\n                                mstore(0x00, 0x49f7642b) // `RPowOverflow()`.\n                                revert(0x1c, 0x04)\n                            }\n                        }\n                        z := div(zxRound, b) // Return properly scaled `zxRound`.\n                    }\n                }\n            }\n        }\n    }\n\n    /// @dev Returns the square root of `x`, rounded down.\n    function sqrt(uint256 x) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // `floor(sqrt(2**15)) = 181`. `sqrt(2**15) - 181 = 2.84`.\n            z := 181 // The \"correct\" value is 1, but this saves a multiplication later.\n\n            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad\n            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.\n\n            // Let `y = x / 2**r`. We check `y >= 2**(k + 8)`\n            // but shift right by `k` bits to ensure that if `x >= 256`, then `y >= 256`.\n            let r := shl(7, lt(0xffffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffffff, shr(r, x))))\n            z := shl(shr(1, r), z)\n\n            // Goal was to get `z*z*y` within a small factor of `x`. More iterations could\n            // get y in a tighter range. Currently, we will have y in `[256, 256*(2**16))`.\n            // We ensured `y >= 256` so that the relative difference between `y` and `y+1` is small.\n            // That's not possible if `x < 256` but we can just verify those cases exhaustively.\n\n            // Now, `z*z*y <= x < z*z*(y+1)`, and `y <= 2**(16+8)`, and either `y >= 256`, or `x < 256`.\n            // Correctness can be checked exhaustively for `x < 256`, so we assume `y >= 256`.\n            // Then `z*sqrt(y)` is within `sqrt(257)/sqrt(256)` of `sqrt(x)`, or about 20bps.\n\n            // For `s` in the range `[1/256, 256]`, the estimate `f(s) = (181/1024) * (s+1)`\n            // is in the range `(1/2.84 * sqrt(s), 2.84 * sqrt(s))`,\n            // with largest error when `s = 1` and when `s = 256` or `1/256`.\n\n            // Since `y` is in `[256, 256*(2**16))`, let `a = y/65536`, so that `a` is in `[1/256, 256)`.\n            // Then we can estimate `sqrt(y)` using\n            // `sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2**18`.\n\n            // There is no overflow risk here since `y < 2**136` after the first branch above.\n            z := shr(18, mul(z, add(shr(r, x), 65536))) // A `mul()` is saved from starting `z` at 181.\n\n            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n\n            // If `x+1` is a perfect square, the Babylonian method cycles between\n            // `floor(sqrt(x))` and `ceil(sqrt(x))`. This statement ensures we return floor.\n            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division\n            z := sub(z, lt(div(x, z), z))\n        }\n    }\n\n    /// @dev Returns the cube root of `x`, rounded down.\n    /// Credit to bout3fiddy and pcaversaccio under AGPLv3 license:\n    /// https://github.com/pcaversaccio/snekmate/blob/main/src/snekmate/utils/math.vy\n    /// Formally verified by xuwinnie:\n    /// https://github.com/vectorized/solady/blob/main/audits/xuwinnie-solady-cbrt-proof.pdf\n    function cbrt(uint256 x) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            let r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // Makeshift lookup table to nudge the approximate log2 result.\n            z := div(shl(div(r, 3), shl(lt(0xf, shr(r, x)), 0xf)), xor(7, mod(r, 3)))\n            // Newton-Raphson's.\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            // Round down.\n            z := sub(z, lt(div(x, mul(z, z)), z))\n        }\n    }\n\n    /// @dev Returns the square root of `x`, denominated in `WAD`, rounded down.\n    function sqrtWad(uint256 x) internal pure returns (uint256 z) {\n        unchecked {\n            if (x <= type(uint256).max / 10 ** 18) return sqrt(x * 10 ** 18);\n            z = (1 + sqrt(x)) * 10 ** 9;\n            z = (fullMulDivUnchecked(x, 10 ** 18, z) + z) >> 1;\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sub(z, gt(999999999999999999, sub(mulmod(z, z, x), 1))) // Round down.\n        }\n    }\n\n    /// @dev Returns the cube root of `x`, denominated in `WAD`, rounded down.\n    /// Formally verified by xuwinnie:\n    /// https://github.com/vectorized/solady/blob/main/audits/xuwinnie-solady-cbrt-proof.pdf\n    function cbrtWad(uint256 x) internal pure returns (uint256 z) {\n        unchecked {\n            if (x <= type(uint256).max / 10 ** 36) return cbrt(x * 10 ** 36);\n            z = (1 + cbrt(x)) * 10 ** 12;\n            z = (fullMulDivUnchecked(x, 10 ** 36, z * z) + z + z) / 3;\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            let p := x\n            for {} 1 {} {\n                if iszero(shr(229, p)) {\n                    if iszero(shr(199, p)) {\n                        p := mul(p, 100000000000000000) // 10 ** 17.\n                        break\n                    }\n                    p := mul(p, 100000000) // 10 ** 8.\n                    break\n                }\n                if iszero(shr(249, p)) { p := mul(p, 100) }\n                break\n            }\n            let t := mulmod(mul(z, z), z, p)\n            z := sub(z, gt(lt(t, shr(1, p)), iszero(t))) // Round down.\n        }\n    }\n\n    /// @dev Returns the factorial of `x`.\n    function factorial(uint256 x) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := 1\n            if iszero(lt(x, 58)) {\n                mstore(0x00, 0xaba0f2a2) // `FactorialOverflow()`.\n                revert(0x1c, 0x04)\n            }\n            for {} x { x := sub(x, 1) } { z := mul(z, x) }\n        }\n    }\n\n    /// @dev Returns the log2 of `x`.\n    /// Equivalent to computing the index of the most significant bit (MSB) of `x`.\n    /// Returns 0 if `x` is zero.\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0x0706060506020504060203020504030106050205030304010505030400000000))\n        }\n    }\n\n    /// @dev Returns the log2 of `x`, rounded up.\n    /// Returns 0 if `x` is zero.\n    function log2Up(uint256 x) internal pure returns (uint256 r) {\n        r = log2(x);\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := add(r, lt(shl(r, 1), x))\n        }\n    }\n\n    /// @dev Returns the log10 of `x`.\n    /// Returns 0 if `x` is zero.\n    function log10(uint256 x) internal pure returns (uint256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            if iszero(lt(x, 100000000000000000000000000000000000000)) {\n                x := div(x, 100000000000000000000000000000000000000)\n                r := 38\n            }\n            if iszero(lt(x, 100000000000000000000)) {\n                x := div(x, 100000000000000000000)\n                r := add(r, 20)\n            }\n            if iszero(lt(x, 10000000000)) {\n                x := div(x, 10000000000)\n                r := add(r, 10)\n            }\n            if iszero(lt(x, 100000)) {\n                x := div(x, 100000)\n                r := add(r, 5)\n            }\n            r := add(r, add(gt(x, 9), add(gt(x, 99), add(gt(x, 999), gt(x, 9999)))))\n        }\n    }\n\n    /// @dev Returns the log10 of `x`, rounded up.\n    /// Returns 0 if `x` is zero.\n    function log10Up(uint256 x) internal pure returns (uint256 r) {\n        r = log10(x);\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := add(r, lt(exp(10, r), x))\n        }\n    }\n\n    /// @dev Returns the log256 of `x`.\n    /// Returns 0 if `x` is zero.\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(shr(3, r), lt(0xff, shr(r, x)))\n        }\n    }\n\n    /// @dev Returns the log256 of `x`, rounded up.\n    /// Returns 0 if `x` is zero.\n    function log256Up(uint256 x) internal pure returns (uint256 r) {\n        r = log256(x);\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := add(r, lt(shl(shl(3, r), 1), x))\n        }\n    }\n\n    /// @dev Returns the scientific notation format `mantissa * 10 ** exponent` of `x`.\n    /// Useful for compressing prices (e.g. using 25 bit mantissa and 7 bit exponent).\n    function sci(uint256 x) internal pure returns (uint256 mantissa, uint256 exponent) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            mantissa := x\n            if mantissa {\n                if iszero(mod(mantissa, 1000000000000000000000000000000000)) {\n                    mantissa := div(mantissa, 1000000000000000000000000000000000)\n                    exponent := 33\n                }\n                if iszero(mod(mantissa, 10000000000000000000)) {\n                    mantissa := div(mantissa, 10000000000000000000)\n                    exponent := add(exponent, 19)\n                }\n                if iszero(mod(mantissa, 1000000000000)) {\n                    mantissa := div(mantissa, 1000000000000)\n                    exponent := add(exponent, 12)\n                }\n                if iszero(mod(mantissa, 1000000)) {\n                    mantissa := div(mantissa, 1000000)\n                    exponent := add(exponent, 6)\n                }\n                if iszero(mod(mantissa, 10000)) {\n                    mantissa := div(mantissa, 10000)\n                    exponent := add(exponent, 4)\n                }\n                if iszero(mod(mantissa, 100)) {\n                    mantissa := div(mantissa, 100)\n                    exponent := add(exponent, 2)\n                }\n                if iszero(mod(mantissa, 10)) {\n                    mantissa := div(mantissa, 10)\n                    exponent := add(exponent, 1)\n                }\n            }\n        }\n    }\n\n    /// @dev Convenience function for packing `x` into a smaller number using `sci`.\n    /// The `mantissa` will be in bits [7..255] (the upper 249 bits).\n    /// The `exponent` will be in bits [0..6] (the lower 7 bits).\n    /// Use `SafeCastLib` to safely ensure that the `packed` number is small\n    /// enough to fit in the desired unsigned integer type:\n    /// ```\n    ///     uint32 packed = SafeCastLib.toUint32(FixedPointMathLib.packSci(777 ether));\n    /// ```\n    function packSci(uint256 x) internal pure returns (uint256 packed) {\n        (x, packed) = sci(x); // Reuse for `mantissa` and `exponent`.\n        /// @solidity memory-safe-assembly\n        assembly {\n            if shr(249, x) {\n                mstore(0x00, 0xce30380c) // `MantissaOverflow()`.\n                revert(0x1c, 0x04)\n            }\n            packed := or(shl(7, x), packed)\n        }\n    }\n\n    /// @dev Convenience function for unpacking a packed number from `packSci`.\n    function unpackSci(uint256 packed) internal pure returns (uint256 unpacked) {\n        unchecked {\n            unpacked = (packed >> 7) * 10 ** (packed & 0x7f);\n        }\n    }\n\n    /// @dev Returns the average of `x` and `y`. Rounds towards zero.\n    function avg(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = (x & y) + ((x ^ y) >> 1);\n        }\n    }\n\n    /// @dev Returns the average of `x` and `y`. Rounds towards negative infinity.\n    function avg(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = (x >> 1) + (y >> 1) + (x & y & 1);\n        }\n    }\n\n    /// @dev Returns the absolute value of `x`.\n    function abs(int256 x) internal pure returns (uint256 z) {\n        unchecked {\n            z = (uint256(x) + uint256(x >> 255)) ^ uint256(x >> 255);\n        }\n    }\n\n    /// @dev Returns the absolute distance between `x` and `y`.\n    function dist(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(xor(sub(0, gt(x, y)), sub(y, x)), gt(x, y))\n        }\n    }\n\n    /// @dev Returns the absolute distance between `x` and `y`.\n    function dist(int256 x, int256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(xor(sub(0, sgt(x, y)), sub(y, x)), sgt(x, y))\n        }\n    }\n\n    /// @dev Returns the minimum of `x` and `y`.\n    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), lt(y, x)))\n        }\n    }\n\n    /// @dev Returns the minimum of `x` and `y`.\n    function min(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), slt(y, x)))\n        }\n    }\n\n    /// @dev Returns the maximum of `x` and `y`.\n    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), gt(y, x)))\n        }\n    }\n\n    /// @dev Returns the maximum of `x` and `y`.\n    function max(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), sgt(y, x)))\n        }\n    }\n\n    /// @dev Returns `x`, bounded to `minValue` and `maxValue`.\n    function clamp(uint256 x, uint256 minValue, uint256 maxValue)\n        internal\n        pure\n        returns (uint256 z)\n    {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, minValue), gt(minValue, x)))\n            z := xor(z, mul(xor(z, maxValue), lt(maxValue, z)))\n        }\n    }\n\n    /// @dev Returns `x`, bounded to `minValue` and `maxValue`.\n    function clamp(int256 x, int256 minValue, int256 maxValue) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, minValue), sgt(minValue, x)))\n            z := xor(z, mul(xor(z, maxValue), slt(maxValue, z)))\n        }\n    }\n\n    /// @dev Returns greatest common divisor of `x` and `y`.\n    function gcd(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            for { z := x } y {} {\n                let t := y\n                y := mod(z, y)\n                z := t\n            }\n        }\n    }\n\n    /// @dev Returns `a + (b - a) * (t - begin) / (end - begin)`,\n    /// with `t` clamped between `begin` and `end` (inclusive).\n    /// Agnostic to the order of (`a`, `b`) and (`end`, `begin`).\n    /// If `begins == end`, returns `t <= begin ? a : b`.\n    function lerp(uint256 a, uint256 b, uint256 t, uint256 begin, uint256 end)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (begin > end) (t, begin, end) = (~t, ~begin, ~end);\n        if (t <= begin) return a;\n        if (t >= end) return b;\n        unchecked {\n            if (b >= a) return a + fullMulDiv(b - a, t - begin, end - begin);\n            return a - fullMulDiv(a - b, t - begin, end - begin);\n        }\n    }\n\n    /// @dev Returns `a + (b - a) * (t - begin) / (end - begin)`.\n    /// with `t` clamped between `begin` and `end` (inclusive).\n    /// Agnostic to the order of (`a`, `b`) and (`end`, `begin`).\n    /// If `begins == end`, returns `t <= begin ? a : b`.\n    function lerp(int256 a, int256 b, int256 t, int256 begin, int256 end)\n        internal\n        pure\n        returns (int256)\n    {\n        if (begin > end) (t, begin, end) = (~t, ~begin, ~end);\n        if (t <= begin) return a;\n        if (t >= end) return b;\n        // forgefmt: disable-next-item\n        unchecked {\n            if (b >= a) return int256(uint256(a) + fullMulDiv(uint256(b - a),\n                uint256(t - begin), uint256(end - begin)));\n            return int256(uint256(a) - fullMulDiv(uint256(a - b),\n                uint256(t - begin), uint256(end - begin)));\n        }\n    }\n\n    /// @dev Returns if `x` is an even number. Some people may need this.\n    function isEven(uint256 x) internal pure returns (bool) {\n        return x & uint256(1) == uint256(0);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                   RAW NUMBER OPERATIONS                    */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns `x + y`, without checking for overflow.\n    function rawAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x + y;\n        }\n    }\n\n    /// @dev Returns `x + y`, without checking for overflow.\n    function rawAdd(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = x + y;\n        }\n    }\n\n    /// @dev Returns `x - y`, without checking for underflow.\n    function rawSub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x - y;\n        }\n    }\n\n    /// @dev Returns `x - y`, without checking for underflow.\n    function rawSub(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = x - y;\n        }\n    }\n\n    /// @dev Returns `x * y`, without checking for overflow.\n    function rawMul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x * y;\n        }\n    }\n\n    /// @dev Returns `x * y`, without checking for overflow.\n    function rawMul(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = x * y;\n        }\n    }\n\n    /// @dev Returns `x / y`, returning 0 if `y` is zero.\n    function rawDiv(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := div(x, y)\n        }\n    }\n\n    /// @dev Returns `x / y`, returning 0 if `y` is zero.\n    function rawSDiv(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sdiv(x, y)\n        }\n    }\n\n    /// @dev Returns `x % y`, returning 0 if `y` is zero.\n    function rawMod(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mod(x, y)\n        }\n    }\n\n    /// @dev Returns `x % y`, returning 0 if `y` is zero.\n    function rawSMod(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := smod(x, y)\n        }\n    }\n\n    /// @dev Returns `(x + y) % d`, return 0 if `d` if zero.\n    function rawAddMod(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := addmod(x, y, d)\n        }\n    }\n\n    /// @dev Returns `(x * y) % d`, return 0 if `d` if zero.\n    function rawMulMod(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mulmod(x, y, d)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\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 ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\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/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/devtools/packages/oapp-evm/contracts/oapp/OAppSender.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { SafeERC20, IERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { MessagingParams, MessagingFee, MessagingReceipt } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\nimport { OAppCore } from \"./OAppCore.sol\";\n\n/**\n * @title OAppSender\n * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.\n */\nabstract contract OAppSender is OAppCore {\n    using SafeERC20 for IERC20;\n\n    // Custom error messages\n    error NotEnoughNative(uint256 msgValue);\n    error LzTokenUnavailable();\n\n    // @dev The version of the OAppSender implementation.\n    // @dev Version is bumped when changes are made to this contract.\n    uint64 internal constant SENDER_VERSION = 1;\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     *\n     * @dev Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented.\n     * ie. this is a SEND only OApp.\n     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions\n     */\n    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {\n        return (SENDER_VERSION, 0);\n    }\n\n    /**\n     * @dev Internal function to interact with the LayerZero EndpointV2.quote() for fee calculation.\n     * @param _dstEid The destination endpoint ID.\n     * @param _message The message payload.\n     * @param _options Additional options for the message.\n     * @param _payInLzToken Flag indicating whether to pay the fee in LZ tokens.\n     * @return fee The calculated MessagingFee for the message.\n     *      - nativeFee: The native fee for the message.\n     *      - lzTokenFee: The LZ token fee for the message.\n     */\n    function _quote(\n        uint32 _dstEid,\n        bytes memory _message,\n        bytes memory _options,\n        bool _payInLzToken\n    ) internal view virtual returns (MessagingFee memory fee) {\n        return\n            endpoint.quote(\n                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _payInLzToken),\n                address(this)\n            );\n    }\n\n    /**\n     * @dev Internal function to interact with the LayerZero EndpointV2.send() for sending a message.\n     * @param _dstEid The destination endpoint ID.\n     * @param _message The message payload.\n     * @param _options Additional options for the message.\n     * @param _fee The calculated LayerZero fee for the message.\n     *      - nativeFee: The native fee.\n     *      - lzTokenFee: The lzToken fee.\n     * @param _refundAddress The address to receive any excess fee values sent to the endpoint.\n     * @return receipt The receipt for the sent message.\n     *      - guid: The unique identifier for the sent message.\n     *      - nonce: The nonce of the sent message.\n     *      - fee: The LayerZero fee incurred for the message.\n     */\n    function _lzSend(\n        uint32 _dstEid,\n        bytes memory _message,\n        bytes memory _options,\n        MessagingFee memory _fee,\n        address _refundAddress\n    ) internal virtual returns (MessagingReceipt memory receipt) {\n        // @dev Push corresponding fees to the endpoint, any excess is sent back to the _refundAddress from the endpoint.\n        uint256 messageValue = _payNative(_fee.nativeFee);\n        if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);\n\n        return\n            // solhint-disable-next-line check-send-result\n            endpoint.send{ value: messageValue }(\n                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _fee.lzTokenFee > 0),\n                _refundAddress\n            );\n    }\n\n    /**\n     * @dev Internal function to pay the native fee associated with the message.\n     * @param _nativeFee The native fee to be paid.\n     * @return nativeFee The amount of native currency paid.\n     *\n     * @dev If the OApp needs to initiate MULTIPLE LayerZero messages in a single transaction,\n     * this will need to be overridden because msg.value would contain multiple lzFees.\n     * @dev Should be overridden in the event the LayerZero endpoint requires a different native currency.\n     * @dev Some EVMs use an ERC20 as a method for paying transactions/gasFees.\n     * @dev The endpoint is EITHER/OR, ie. it will NOT support both types of native payment at a time.\n     */\n    function _payNative(uint256 _nativeFee) internal virtual returns (uint256 nativeFee) {\n        if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);\n        return _nativeFee;\n    }\n\n    /**\n     * @dev Internal function to pay the LZ token fee associated with the message.\n     * @param _lzTokenFee The LZ token fee to be paid.\n     *\n     * @dev If the caller is trying to pay in the specified lzToken, then the lzTokenFee is passed to the endpoint.\n     * @dev Any excess sent, is passed back to the specified _refundAddress in the _lzSend().\n     */\n    function _payLzToken(uint256 _lzTokenFee) internal virtual {\n        // @dev Cannot cache the token because it is not immutable in the endpoint.\n        address lzToken = endpoint.lzToken();\n        if (lzToken == address(0)) revert LzTokenUnavailable();\n\n        // Pay LZ token fee by sending tokens to the endpoint.\n        IERC20(lzToken).safeTransferFrom(msg.sender, address(endpoint), _lzTokenFee);\n    }\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nstruct SetConfigParam {\n    uint32 eid;\n    uint32 configType;\n    bytes config;\n}\n\ninterface IMessageLibManager {\n    struct Timeout {\n        address lib;\n        uint256 expiry;\n    }\n\n    event LibraryRegistered(address newLib);\n    event DefaultSendLibrarySet(uint32 eid, address newLib);\n    event DefaultReceiveLibrarySet(uint32 eid, address newLib);\n    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);\n    event SendLibrarySet(address sender, uint32 eid, address newLib);\n    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);\n    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);\n\n    function registerLibrary(address _lib) external;\n\n    function isRegisteredLibrary(address _lib) external view returns (bool);\n\n    function getRegisteredLibraries() external view returns (address[] memory);\n\n    function setDefaultSendLibrary(uint32 _eid, address _newLib) external;\n\n    function defaultSendLibrary(uint32 _eid) external view returns (address);\n\n    function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _timeout) external;\n\n    function defaultReceiveLibrary(uint32 _eid) external view returns (address);\n\n    function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;\n\n    function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);\n\n    function isSupportedEid(uint32 _eid) external view returns (bool);\n\n    function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);\n\n    /// ------------------- OApp interfaces -------------------\n    function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;\n\n    function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);\n\n    function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);\n\n    function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;\n\n    function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);\n\n    function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _gracePeriod) external;\n\n    function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);\n\n    function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;\n\n    function getConfig(\n        address _oapp,\n        address _lib,\n        uint32 _eid,\n        uint32 _configType\n    ) external view returns (bytes memory config);\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingComposer {\n    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);\n    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);\n    event LzComposeAlert(\n        address indexed from,\n        address indexed to,\n        address indexed executor,\n        bytes32 guid,\n        uint16 index,\n        uint256 gas,\n        uint256 value,\n        bytes message,\n        bytes extraData,\n        bytes reason\n    );\n\n    function composeQueue(\n        address _from,\n        address _to,\n        bytes32 _guid,\n        uint16 _index\n    ) external view returns (bytes32 messageHash);\n\n    function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;\n\n    function lzCompose(\n        address _from,\n        address _to,\n        bytes32 _guid,\n        uint16 _index,\n        bytes calldata _message,\n        bytes calldata _extraData\n    ) external payable;\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingChannel {\n    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);\n    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\n    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\n\n    function eid() external view returns (uint32);\n\n    // this is an emergency function if a message cannot be verified for some reasons\n    // required to provide _nextNonce to avoid race condition\n    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;\n\n    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\n\n    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\n\n    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);\n\n    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\n\n    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);\n\n    function inboundPayloadHash(\n        address _receiver,\n        uint32 _srcEid,\n        bytes32 _sender,\n        uint64 _nonce\n    ) external view returns (bytes32);\n\n    function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingContext {\n    function isSendingMessage() external view returns (bool);\n\n    function getSendContext() external view returns (uint32 dstEid, address sender);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.30+commit.73712a01","compilerSettings":{"viaIR":true,"metadata":{"appendCBOR":false,"bytecodeHash":"none","useLiteralContent":false},"optimizer":{"runs":200,"enabled":true},"evmVersion":"cancun","remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@solady/=lib/solady/","@prb/test/=lib/prb-test/src/","forge-std/=lib/forge-std/src/","src/=src/","@permit2/=lib/permit2/src/","@permit2-oz/=lib/permit2/lib/openzeppelin-contracts/contracts/","@permit2-test/=lib/permit2/test/","@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/","@layerzerolabs/oft-evm-upgradeable/=lib/devtools/packages/oft-evm-upgradeable/","@layerzerolabs/oft-alt-evm/=lib/devtools/packages/oft-alt-evm/","@layerzerolabs/oapp-alt-evm/=lib/devtools/packages/oapp-alt-evm/","@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/","@layerzerolabs/oapp-evm-upgradeable/=lib/devtools/packages/oapp-evm-upgradeable/","@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/","@layerzerolabs/layerzero-v2-mock/=lib/devtools/packages/test-devtools-evm-foundry/","@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/","@layerzerolabs/lz-evm-v1-0.7/=lib/LayerZero-v1/","solidity-bytes-utils/=lib/solidity-bytes-utils/","@chainlink-evm/=lib/chainlink-evm/","LayerZero-v1/=lib/LayerZero-v1/contracts/","chainlink-evm/=lib/chainlink-evm/","devtools/=lib/devtools/packages/toolbox-foundry/src/","ds-test/=lib/permit2/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-gas-snapshot/=lib/permit2/lib/forge-gas-snapshot/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","layerzero-v2/=lib/layerzero-v2/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","permit2/=lib/permit2/","prb-math/=lib/prb-math/src/","prb-test/=lib/prb-test/src/","solady/=lib/solady/src/","solidity-examples/=lib/solidity-examples/contracts/","solmate/=lib/permit2/lib/solmate/"]},"name":"DShare","fullyQualifiedName":"src/tokens/shares/retail/DShare.sol:DShare"},"abi":[{"type":"constructor","inputs":[{"name":"","type":"uint8","internalType":"uint8"},{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AllowanceOverflow","type":"error","inputs":[]},{"name":"AllowanceUnderflow","type":"error","inputs":[]},{"name":"AssetPaused","type":"error","inputs":[]},{"name":"EnforcedPause","type":"error","inputs":[]},{"name":"ExpectedPause","type":"error","inputs":[]},{"name":"FundingAssetPaused","type":"error","inputs":[]},{"name":"InsufficientAllowance","type":"error","inputs":[]},{"name":"InsufficientBalance","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"InvalidName","type":"error","inputs":[]},{"name":"InvalidPermit","type":"error","inputs":[]},{"name":"InvalidSymbol","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"Permit2AllowanceIsFixedAtInfinity","type":"error","inputs":[]},{"name":"PermitExpired","type":"error","inputs":[]},{"name":"SafeCastOverflowedUintDowncast","type":"error","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"TotalSupplyOverflow","type":"error","inputs":[]},{"name":"TransferRestrictor_AccountRestricted","type":"error","inputs":[]},{"name":"TransferRestrictor_NotSet","type":"error","inputs":[]},{"name":"TransferRestrictor_TransferPhase2_NotAllowed","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"ZeroRatio","type":"error","inputs":[]},{"name":"ZeroValue","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":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BalancePerShareSet","type":"event","inputs":[{"name":"balancePerShare","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DSharePaused","type":"event","inputs":[{"name":"asset","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DShareUnpaused","type":"event","inputs":[{"name":"asset","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"NameSet","type":"event","inputs":[{"name":"name","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"OFTSent","type":"event","inputs":[{"name":"guid","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"dstEid","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"amountSentLD","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amountReceivedLD","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SplitAdjusted","type":"event","inputs":[{"name":"num","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"den","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"balancePerShare","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"result","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SymbolSet","type":"event","inputs":[{"name":"symbol","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"TransferRestrictorSet","type":"event","inputs":[{"name":"transferRestrictor","type":"address","indexed":true,"internalType":"contract ITransferRestrictor"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"DOMAIN_SEPARATOR","type":"function","inputs":[],"outputs":[{"name":"result","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"accessControl","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAccessControl"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"applySplit","type":"function","inputs":[{"name":"to","type":"uint256","internalType":"uint256"},{"name":"from","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"approvalRequired","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"balancePerShare","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"balanceToShares","type":"function","inputs":[{"name":"balance","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"burnFrom","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"diamond","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"endpoint","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ILayerZeroEndpointV2"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"},{"name":"transferRestrictor_","type":"address","internalType":"contract ITransferRestrictor"},{"name":"accessControl_","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isBlacklisted","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTransferAllowed","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nonces","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"permit","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"quoteSend","type":"function","inputs":[{"name":"_sendParam","type":"tuple","components":[{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"amountLD","type":"uint256","internalType":"uint256"},{"name":"minAmountLD","type":"uint256","internalType":"uint256"},{"name":"extraOptions","type":"bytes","internalType":"bytes"},{"name":"composeMsg","type":"bytes","internalType":"bytes"},{"name":"oftCmd","type":"bytes","internalType":"bytes"}],"internalType":"struct SendParam"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"}],"stateMutability":"view"},{"name":"reinitialize","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"send","type":"function","inputs":[{"name":"_sendParam","type":"tuple","components":[{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"amountLD","type":"uint256","internalType":"uint256"},{"name":"minAmountLD","type":"uint256","internalType":"uint256"},{"name":"extraOptions","type":"bytes","internalType":"bytes"},{"name":"composeMsg","type":"bytes","internalType":"bytes"},{"name":"oftCmd","type":"bytes","internalType":"bytes"}],"internalType":"struct SendParam"},{"name":"_fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"},{"name":"_refundAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"}],"internalType":"struct MessagingReceipt"},{"name":"","type":"tuple","components":[{"name":"amountSentLD","type":"uint256","internalType":"uint256"},{"name":"amountReceivedLD","type":"uint256","internalType":"uint256"}],"internalType":"struct OFTReceipt"}],"stateMutability":"payable"},{"name":"sendFrom","type":"function","inputs":[{"name":"_sendParam","type":"tuple","components":[{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"amountLD","type":"uint256","internalType":"uint256"},{"name":"minAmountLD","type":"uint256","internalType":"uint256"},{"name":"extraOptions","type":"bytes","internalType":"bytes"},{"name":"composeMsg","type":"bytes","internalType":"bytes"},{"name":"oftCmd","type":"bytes","internalType":"bytes"}],"internalType":"struct SendParam"},{"name":"_from","type":"address","internalType":"address"},{"name":"_fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"},{"name":"_refundAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"}],"internalType":"struct MessagingReceipt"},{"name":"","type":"tuple","components":[{"name":"amountSentLD","type":"uint256","internalType":"uint256"},{"name":"amountReceivedLD","type":"uint256","internalType":"uint256"}],"internalType":"struct OFTReceipt"}],"stateMutability":"payable"},{"name":"setBalancePerShare","type":"function","inputs":[{"name":"balancePerShare_","type":"uint128","internalType":"uint128"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setName","type":"function","inputs":[{"name":"newName","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setSymbol","type":"function","inputs":[{"name":"newSymbol","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setTransferRestrictor","type":"function","inputs":[{"name":"newRestrictor","type":"address","internalType":"contract ITransferRestrictor"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sharedDecimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"name":"sharesOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"sharesToBalance","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"token","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferRestrictor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ITransferRestrictor"}],"stateMutability":"view"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[],"name":"AssetPaused","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FundingAssetPaused","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidName","type":"error"},{"inputs":[],"name":"InvalidPermit","type":"error"},{"inputs":[],"name":"InvalidSymbol","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"Permit2AllowanceIsFixedAtInfinity","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"TransferRestrictor_AccountRestricted","type":"error"},{"inputs":[],"name":"TransferRestrictor_NotSet","type":"error"},{"inputs":[],"name":"TransferRestrictor_TransferPhase2_NotAllowed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroRatio","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balancePerShare","type":"uint256"}],"name":"BalancePerShareSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DSharePaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DShareUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"num","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"den","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balancePerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"result","type":"uint256"}],"name":"SplitAdjusted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"SymbolSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract ITransferRestrictor","name":"transferRestrictor","type":"address"}],"name":"TransferRestrictorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessControl","outputs":[{"internalType":"contract IAccessControl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"from","type":"uint256"}],"name":"applySplit","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balancePerShare","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"balanceToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"diamond","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract ITransferRestrictor","name":"transferRestrictor_","type":"address"},{"internalType":"address","name":"accessControl_","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"isTransferAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quoteSend","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"address","name":"_from","type":"address"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"sendFrom","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint128","name":"balancePerShare_","type":"uint128"}],"name":"setBalancePerShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITransferRestrictor","name":"newRestrictor","type":"address"}],"name":"setTransferRestrictor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"sharesToBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferRestrictor","outputs":[{"internalType":"contract ITransferRestrictor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"AllowanceOverflow()":[{"details":"The allowance has overflowed."}],"AllowanceUnderflow()":[{"details":"The allowance has underflowed."}],"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"InsufficientAllowance()":[{"details":"Insufficient allowance."}],"InsufficientBalance()":[{"details":"Insufficient balance."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"InvalidPermit()":[{"details":"The permit is invalid."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"Permit2AllowanceIsFixedAtInfinity()":[{"details":"The allowance of Permit2 is fixed at infinity."}],"PermitExpired()":[{"details":"The permit has expired."}],"SafeCastOverflowedUintDowncast(uint8,uint256)":[{"details":"Value doesn't fit in an uint of `bits` size."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"TotalSupplyOverflow()":[{"details":"The total supply has overflowed."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when `amount` tokens is approved by `owner` to be used by `spender`."},"BalancePerShareSet(uint256)":{"params":{"balancePerShare":"The new balance per share value"}},"DSharePaused(address,uint256)":{"params":{"asset":"Address of the asset being paused","timestamp":"Time of pause"}},"DShareUnpaused(address,uint256)":{"params":{"asset":"Address of the asset being unpaused","timestamp":"Time of unpause"}},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"NameSet(string)":{"params":{"name":"The new token name"}},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"SplitAdjusted(uint256,uint256,uint256,uint256)":{"params":{"balancePerShare":"Current balance per share","den":"Denominator of the split ratio","num":"Numerator of the split ratio","result":"Resulting balance per share after split"}},"SymbolSet(string)":{"params":{"symbol":"The new token symbol"}},"Transfer(address,address,uint256)":{"details":"Emitted when `amount` tokens is transferred from `from` to `to`."},"TransferRestrictorSet(address)":{"params":{"transferRestrictor":"The new transfer restrictor address"}},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."}},"kind":"dev","methods":{"DOMAIN_SEPARATOR()":{"details":"Returns the EIP-712 domain separator for the EIP-2612 permit."},"allowance(address,address)":{"details":"Returns the amount of tokens that `spender` can spend on behalf of `owner`."},"approve(address,uint256)":{"details":"Sets `amount` as the allowance of `spender` over the caller's tokens. Emits a {Approval} event."},"balancePerShare()":{"details":"Returns the number of tokens an internal share amount represents. This amount is assumed to have 18 decimals and is divided by 10 **18 when applied."},"burn(uint256)":{"details":"Only callable by approved burner","params":{"value":"Amount of tokens to burn"}},"burnFrom(address,uint256)":{"details":"TOKEN_OPERATOR_ROLE can bypass allowance, others need allowance","params":{"account":"Address to burn tokens from","value":"Amount of tokens to burn"}},"constructor":{"details":"Both constructor args are unused — kept for ABI compatibility with      the existing `new DShare(18, endpoint)` call sites. The LZ endpoint      is read from the diamond at runtime via `endpoint()` (single source      of truth); the diamond is read from `_getdShareStorage()._accessControl`."},"decimals()":{"details":"Returns the decimals places of the token."},"initialize(string,string,address,address,address)":{"details":"`delegate_` is accepted for ABI compatibility with the existing      DShareFactoryFacet.createDShare call site but is no longer used."},"isBlacklisted(address)":{"params":{"account":"The address to check"},"returns":{"_0":"True if the restrictor facet reports the account as blacklisted"}},"isTransferAllowed(address,address)":{"details":"Returns false if the restrictor is unset; otherwise defers to the phase-2 rules","params":{"from":"The address of the account","to":"The address of the account"},"returns":{"_0":"Whether the transfer is allowed"}},"maxSupply()":{"details":"Useful for sanity checks before minting since the total supply of shares can overflow."},"mint(address,uint256)":{"details":"Only callable by authorized admin","params":{"to":"Address to mint tokens to","value":"Amount of tokens to mint"}},"name()":{"details":"Returns the name of the token."},"nonces(address)":{"details":"Returns the current nonce for `owner`. This value is used to compute the signature for EIP-2612 permit."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Sets `value` as the allowance of `spender` over the tokens of `owner`, authorized by a signed approval by `owner`. Emits a {Approval} event."},"setBalancePerShare(uint128)":{"details":"Relies on offchain computation of aggregate splits and reverse splits"},"setName(string)":{"details":"Only callable by owner or deployer"},"setSymbol(string)":{"details":"Only callable by owner or deployer"},"setTransferRestrictor(address)":{"details":"Only callable by owner"},"symbol()":{"details":"Returns the symbol of the token."},"transfer(address,uint256)":{"details":"Transfer `amount` tokens from the caller to `to`. Requirements: - `from` must at least have `amount`. Emits a {Transfer} event."},"transferRestrictor()":{"returns":{"_0":"The transfer restrictor implementation"}}},"stateVariables":{"dShareStorageLocation":{"details":"keccak256(abi.encode(uint256(keccak256(\"dinaricrypto.storage.DShare\")) - 1)) & ~bytes32(uint256(0xff))"}},"title":"DShare (Retail)","version":1},"userdoc":{"errors":{"AssetPaused()":[{"notice":"Thrown when attempting operations on a paused asset"}],"FundingAssetPaused()":[{"notice":"Thrown when funding asset is paused"}],"InvalidName()":[{"notice":"Thrown when token name is invalid"}],"InvalidSymbol()":[{"notice":"Thrown when token symbol is invalid"}],"TransferRestrictor_AccountRestricted()":[{"notice":"Thrown when account is restricted from transfers"}],"TransferRestrictor_NotSet()":[{"notice":"Thrown when Transfer Restrictor is not set and a transfer is attempted by a non-operator role"}],"TransferRestrictor_TransferPhase2_NotAllowed()":[{"notice":"Thrown when a transfer fails the phase-2 jurisdiction rules"}],"ZeroAddress()":[{"notice":"Thrown when zero address is provided where not allowed"}],"ZeroRatio()":[{"notice":"Thrown when zero ratio is provided where not allowed"}],"ZeroValue()":[{"notice":"Thrown when zero value is provided where not allowed"}]},"events":{"BalancePerShareSet(uint256)":{"notice":"Emitted when balance per share multiplier is updated (for splits)"},"DSharePaused(address,uint256)":{"notice":"Emitted when DShare is paused"},"DShareUnpaused(address,uint256)":{"notice":"Emitted when DShare is unpaused"},"NameSet(string)":{"notice":"Emitted when token name is updated"},"SplitAdjusted(uint256,uint256,uint256,uint256)":{"notice":"Emitted when split factor is adjusted"},"SymbolSet(string)":{"notice":"Emitted when token symbol is updated"},"TransferRestrictorSet(address)":{"notice":"Emitted when transfer restrictor contract is updated"}},"kind":"user","methods":{"accessControl()":{"notice":"Interface to the AccessControlFacet on the diamond"},"burn(uint256)":{"notice":"Burn tokens"},"burnFrom(address,uint256)":{"notice":"Burn tokens from an account"},"diamond()":{"notice":"Returns the diamond hosting the LZ routing facet for this token."},"initialize(string,string,address,address,address)":{"notice":"Initializes a DShare token via beacon proxy."},"isBlacklisted(address)":{"notice":"Checks if an account is blacklisted via the configured restrictor facet"},"maxSupply()":{"notice":"Returns the maximum supply of the token in balance."},"mint(address,uint256)":{"notice":"Mint tokens"},"reinitialize()":{"notice":"Reinitializes the contract (e.g. to add new functionality)"},"setBalancePerShare(uint128)":{"notice":"Update split factor"},"setName(string)":{"notice":"Set token name"},"setSymbol(string)":{"notice":"Set token symbol"},"setTransferRestrictor(address)":{"notice":"Set transfer restrictor contract"},"totalSupply()":{"notice":"------------------ ERC20 ------------------"},"transferFrom(address,address,uint256)":{"notice":"Override transferFrom to allow TOKEN_OPERATOR_ROLE bypass allowance"},"transferRestrictor()":{"notice":"Returns the transfer restrictor contract"}},"version":1}},"settings":{"compilationTarget":{"src/tokens/shares/retail/DShare.sol":"DShare"},"evmVersion":"cancun","libraries":{},"metadata":{"appendCBOR":false,"bytecodeHash":"none"},"optimizer":{"enabled":true,"runs":200},"remappings":[":@chainlink-evm/=lib/chainlink-evm/",":@layerzerolabs/layerzero-v2-mock/=lib/devtools/packages/test-devtools-evm-foundry/",":@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/",":@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/",":@layerzerolabs/lz-evm-v1-0.7/=lib/LayerZero-v1/",":@layerzerolabs/oapp-alt-evm/=lib/devtools/packages/oapp-alt-evm/",":@layerzerolabs/oapp-evm-upgradeable/=lib/devtools/packages/oapp-evm-upgradeable/",":@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/",":@layerzerolabs/oft-alt-evm/=lib/devtools/packages/oft-alt-evm/",":@layerzerolabs/oft-evm-upgradeable/=lib/devtools/packages/oft-evm-upgradeable/",":@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/",":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":@permit2-oz/=lib/permit2/lib/openzeppelin-contracts/contracts/",":@permit2-test/=lib/permit2/test/",":@permit2/=lib/permit2/src/",":@prb/test/=lib/prb-test/src/",":@solady/=lib/solady/",":LayerZero-v1/=lib/LayerZero-v1/contracts/",":chainlink-evm/=lib/chainlink-evm/",":devtools/=lib/devtools/packages/toolbox-foundry/src/",":ds-test/=lib/permit2/lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",":forge-gas-snapshot/=lib/permit2/lib/forge-gas-snapshot/src/",":forge-std/=lib/forge-std/src/",":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",":layerzero-v2/=lib/layerzero-v2/",":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":permit2/=lib/permit2/",":prb-math/=lib/prb-math/src/",":prb-test/=lib/prb-test/src/",":solady/=lib/solady/src/",":solidity-bytes-utils/=lib/solidity-bytes-utils/",":solidity-examples/=lib/solidity-examples/contracts/",":solmate/=lib/permit2/lib/solmate/",":src/=src/"],"viaIR":true},"sources":{"lib/devtools/packages/oapp-evm/contracts/oapp/OAppCore.sol":{"keccak256":"0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc","license":"MIT","urls":["bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0","dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH"]},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppSender.sol":{"keccak256":"0x518cf4adca601923ed4baa6619846a253ea32b8d8775f8bc1faa3dfac7f67c20","license":"MIT","urls":["bzz-raw://d42b471418efadcc3577ef3fa9f8f504e8bed7db90c3b0c862038d8b29529eb2","dweb:/ipfs/QmZETDQiJN4U92fmLKo8T9ZbdDf7BNBUUvo9H7M7GqAyFU"]},"lib/devtools/packages/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol":{"keccak256":"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58","license":"MIT","urls":["bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd","dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv"]},"lib/devtools/packages/oft-evm/contracts/interfaces/IOFT.sol":{"keccak256":"0xc60c7b4374b3d89f33b8de982f463c92374a8548800c816fe776f0ec76351fb0","license":"MIT","urls":["bzz-raw://9e2ae9efc2a93373e822b148b3a3b50e3562c8c317f2e71d73cf4a11dede9d15","dweb:/ipfs/QmahCbqvqEcWLJpqE6EbHHTuSbnGWyo35ZBVqoyKv18BSF"]},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol":{"keccak256":"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3","license":"MIT","urls":["bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083","dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs"]},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol":{"keccak256":"0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b","license":"MIT","urls":["bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a","dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB"]},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol":{"keccak256":"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972","license":"MIT","urls":["bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927","dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S"]},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol":{"keccak256":"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901","license":"MIT","urls":["bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d","dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk"]},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol":{"keccak256":"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e","license":"MIT","urls":["bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6","dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D"]},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05","license":"MIT","urls":["bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08","dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q"]},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","license":"MIT","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"]},"lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol":{"keccak256":"0xa6bf6b7efe0e6625a9dcd30c5ddf52c4c24fe8372f37c7de9dbf5034746768d5","license":"MIT","urls":["bzz-raw://8c353ee3705bbf6fadb84c0fb10ef1b736e8ca3ca1867814349d1487ed207beb","dweb:/ipfs/QmcugaPssrzGGE8q4YZKm2ZhnD3kCijjcgdWWg76nWt3FY"]},"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"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/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","license":"MIT","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"]},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5","license":"MIT","urls":["bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508","dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB"]},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","license":"MIT","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"]},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","license":"MIT","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"]},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6","license":"MIT","urls":["bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3","dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB"]},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","license":"MIT","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"]},"lib/solady/src/tokens/ERC20.sol":{"keccak256":"0x19826a737039994947e9971d996e80c658f3c380705e30e7d1b5c40d35f454ac","license":"MIT","urls":["bzz-raw://d263a519a7c567c3af3ee7b6e223e3d37863ac35d8611131a98888b54e749141","dweb:/ipfs/QmUj8FZcJgx76YeFb13ZKgKBDCMwPkhycEJhZCpuEG6xUe"]},"lib/solady/src/utils/FixedPointMathLib.sol":{"keccak256":"0x1ed875fc4a88beb012f15cbe111e69b402517adda61e5da88c55c73faf76a90f","license":"MIT","urls":["bzz-raw://ce07f2ee0577806e6f7dba79ab5a01a9751e6e3bffc40218c5e80e68e6bf088e","dweb:/ipfs/QmVo7z5TDp1a6KVMYotNv37a5Xspcexum7Dx8h1qHLcAz8"]},"src/common/AccessControlledUpgradeable.sol":{"keccak256":"0x4f4ef7a5b24345a9b494ea42c2854506fe4800511fc40812348607a9a297175a","license":"MIT","urls":["bzz-raw://cf92881efade05e30cf92e4616b757eddb284854958205f356f6114559da0ded","dweb:/ipfs/QmQBYSm5LrbuCWdcPdZFb534njvkv5fJKH6wFuQ4hDgTkU"]},"src/common/diamond/Constants.sol":{"keccak256":"0xf86abecc157a5284ff6542d713f923ca241eeb17646a27ad849ba50b634bdb7d","license":"MIT","urls":["bzz-raw://f2b35912b677e8759259b2e33978d31d1a46ccf064bff335556beea1ac01d05b","dweb:/ipfs/QmcwW2nWBdgj1ybLP4bB1eBX1XkuTZ4g5eLrCUa1JXPx6S"]},"src/common/diamond/facets/access-control/IAccessControl.sol":{"keccak256":"0x4a25a5722142c8e261cbd4dbc4fa3a6c272a67ef650be4453a5fe20cdc330b86","license":"MIT","urls":["bzz-raw://0417500540e19a11afa6392f001ec3b841df178a7edaa59b34ebc6760c898d32","dweb:/ipfs/QmZRPnu5rrhik4DFh7ZaPr1UPUVurqpGnVhE6Wcma7xgrh"]},"src/common/diamond/facets/asset-registry/IAssetRegistry.sol":{"keccak256":"0x87c879720ea73781dc60404761b55554281700293d2baab77d9a7d0e900308b0","license":"MIT","urls":["bzz-raw://31283d6e4773dd8b8c85fa71fde02b96e03fbf9083d7f951d27bcf7829378c83","dweb:/ipfs/QmYh5y5jTDs46yekjqunfeQB79dzPS6KYUFdzoddNUsuWn"]},"src/common/diamond/facets/lz-routing/ILZRouting.sol":{"keccak256":"0xbfb95b5134d1e55ad67e8453d522c1a67c87756cfd1354057f6ba6e3e5c3a6e1","license":"MIT","urls":["bzz-raw://54c38ef88319718f6c61032bb1413cb28ea285af33ab64983f6cf47aac56a991","dweb:/ipfs/Qmf9jmQBdA6yvSuq4reSpvtuNtavqshNeTH7Yew6hmQSsE"]},"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol":{"keccak256":"0xb5d48caf3d3877627040bc8d6ef87605b46425ef9d489f91661130892158fee8","license":"MIT","urls":["bzz-raw://46b65b07812930f64fb8320bac37aed83f0b18eeba12f84c76b9e6da2c50647f","dweb:/ipfs/QmRk8C6BSDuZyyVVqox5xpLMUGLo8KHdNSToPJDN7FkCHX"]},"src/common/diamond/facets/transfer-restrictor/UserAddressMetadataLib.sol":{"keccak256":"0xc9ea453b405dcfeac9e676d82e23c6722462819682c1707ca3e19ff544aac4c1","license":"MIT","urls":["bzz-raw://f0db1d2a5706b8fb5fb1fc6afb9daffceab72a9a48bb5827d58bdfed2214efd5","dweb:/ipfs/QmX9XpScshM3wbGH4kjUm4ryUSSZpytBkrG3nBUV67vfFE"]},"src/common/utils/NumberUtils.sol":{"keccak256":"0x9261394513e7e2a231e977f187314216090619cc788aa81f77b2930382ca9fbe","license":"MIT","urls":["bzz-raw://32a4eb31bd2fb1f0c4924f9c4c6a476fb6f32a606408996cb9a4f2151ca7f6d2","dweb:/ipfs/QmTte8FdM1wVbJ6k5tQkaEsggujyGUi9iDJQzJtGfU9abo"]},"src/tokens/ERC20Rebasing.sol":{"keccak256":"0x3156c519e4f48a77b2d49ba35902f05f36e0d2cb6fc97359b008f167c1b7e332","license":"GPL-3.0-or-later","urls":["bzz-raw://a059d7f6aef1e2e396af7eff6812a71f8f6f188f9101c64525cbff73ae619846","dweb:/ipfs/QmTsdASmCYcB4Sp3PY18NvmmxPr2XsV33fhGeLKjo6cSLV"]},"src/tokens/shares/IDShare.sol":{"keccak256":"0x81764acd688d4ecf1b86f36b356dc4dd2bf0622450f7ad12c6d058b9164bfa69","license":"MIT","urls":["bzz-raw://447d985152ccfbc16530b5001c466c103844ca330da653235fbdf1c8559cc7c0","dweb:/ipfs/QmeTVQE3HMd15kjgD4RjduXzrg9Km4TtQQXLZp7yGW67ST"]},"src/tokens/shares/ITransferRestrictor.sol":{"keccak256":"0xbe4eed7f33e384a8a17e2cf8646b31befa004d46957a8b55eb7d7acf1e75cb36","license":"MIT","urls":["bzz-raw://c25825a26e4f9822e318bc8d30a49ee86a00231c4da5e7a18ac12ac6ee3315f8","dweb:/ipfs/QmbMgJoVcxs3QPNSjPzmDuVwjPVrHE9ek6xJpjCKauYZSB"]},"src/tokens/shares/retail/DShare.sol":{"keccak256":"0x20e5d83e6a566162d25790e69e3a857e098aa00eb594506045460b9cc84cc3e0","license":"MIT","urls":["bzz-raw://b55a3f0c599116743beb6b014e840de944850350bcbac445bcc44853a53218b8","dweb:/ipfs/QmPQVhbsRMaoktq95FB9MHPHQ6vNAm6CWNvT5BQssyjjb8"]}},"version":1},"storageLayout":{"types":{"t_contract(IAccessControl)8462":{"label":"contract IAccessControl","encoding":"inplace","numberOfBytes":"20"}},"storage":[{"slot":"0","type":"t_contract(IAccessControl)8462","astId":8210,"label":"accessControl","offset":0,"contract":"src/tokens/shares/retail/DShare.sol:DShare"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","errors":{"ZeroRatio()":[{"notice":"Thrown when zero ratio is provided where not allowed"}],"ZeroValue()":[{"notice":"Thrown when zero value is provided where not allowed"}],"AssetPaused()":[{"notice":"Thrown when attempting operations on a paused asset"}],"InvalidName()":[{"notice":"Thrown when token name is invalid"}],"ZeroAddress()":[{"notice":"Thrown when zero address is provided where not allowed"}],"InvalidSymbol()":[{"notice":"Thrown when token symbol is invalid"}],"FundingAssetPaused()":[{"notice":"Thrown when funding asset is paused"}],"TransferRestrictor_NotSet()":[{"notice":"Thrown when Transfer Restrictor is not set and a transfer is attempted by a non-operator role"}],"TransferRestrictor_AccountRestricted()":[{"notice":"Thrown when account is restricted from transfers"}],"TransferRestrictor_TransferPhase2_NotAllowed()":[{"notice":"Thrown when a transfer fails the phase-2 jurisdiction rules"}]},"events":{"NameSet(string)":{"notice":"Emitted when token name is updated"},"SymbolSet(string)":{"notice":"Emitted when token symbol is updated"},"BalancePerShareSet(uint256)":{"notice":"Emitted when balance per share multiplier is updated (for splits)"},"DSharePaused(address,uint256)":{"notice":"Emitted when DShare is paused"},"TransferRestrictorSet(address)":{"notice":"Emitted when transfer restrictor contract is updated"},"DShareUnpaused(address,uint256)":{"notice":"Emitted when DShare is unpaused"},"SplitAdjusted(uint256,uint256,uint256,uint256)":{"notice":"Emitted when split factor is adjusted"}},"methods":{"diamond()":{"notice":"Returns the diamond hosting the LZ routing facet for this token."},"maxSupply()":{"notice":"Returns the maximum supply of the token in balance."},"burn(uint256)":{"notice":"Burn tokens"},"totalSupply()":{"notice":"------------------ ERC20 ------------------"},"reinitialize()":{"notice":"Reinitializes the contract (e.g. to add new functionality)"},"accessControl()":{"notice":"Interface to the AccessControlFacet on the diamond"},"setName(string)":{"notice":"Set token name"},"setSymbol(string)":{"notice":"Set token symbol"},"transferRestrictor()":{"notice":"Returns the transfer restrictor contract"},"mint(address,uint256)":{"notice":"Mint tokens"},"isBlacklisted(address)":{"notice":"Checks if an account is blacklisted via the configured restrictor facet"},"burnFrom(address,uint256)":{"notice":"Burn tokens from an account"},"setBalancePerShare(uint128)":{"notice":"Update split factor"},"setTransferRestrictor(address)":{"notice":"Set transfer restrictor contract"},"transferFrom(address,address,uint256)":{"notice":"Override transferFrom to allow TOKEN_OPERATOR_ROLE bypass allowance"},"initialize(string,string,address,address,address)":{"notice":"Initializes a DShare token via beacon proxy."}},"version":1},"devdoc":{"kind":"dev","title":"DShare (Retail)","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"InvalidPermit()":[{"details":"The permit is invalid."}],"PermitExpired()":[{"details":"The permit has expired."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"AllowanceOverflow()":[{"details":"The allowance has overflowed."}],"AllowanceUnderflow()":[{"details":"The allowance has underflowed."}],"InsufficientBalance()":[{"details":"Insufficient balance."}],"TotalSupplyOverflow()":[{"details":"The total supply has overflowed."}],"InsufficientAllowance()":[{"details":"Insufficient allowance."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"Permit2AllowanceIsFixedAtInfinity()":[{"details":"The allowance of Permit2 is fixed at infinity."}],"SafeCastOverflowedUintDowncast(uint8,uint256)":[{"details":"Value doesn't fit in an uint of `bits` size."}]},"events":{"NameSet(string)":{"params":{"name":"The new token name"}},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"SymbolSet(string)":{"params":{"symbol":"The new token symbol"}},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"BalancePerShareSet(uint256)":{"params":{"balancePerShare":"The new balance per share value"}},"DSharePaused(address,uint256)":{"params":{"asset":"Address of the asset being paused","timestamp":"Time of pause"}},"TransferRestrictorSet(address)":{"params":{"transferRestrictor":"The new transfer restrictor address"}},"DShareUnpaused(address,uint256)":{"params":{"asset":"Address of the asset being unpaused","timestamp":"Time of unpause"}},"Approval(address,address,uint256)":{"details":"Emitted when `amount` tokens is approved by `owner` to be used by `spender`."},"Transfer(address,address,uint256)":{"details":"Emitted when `amount` tokens is transferred from `from` to `to`."},"SplitAdjusted(uint256,uint256,uint256,uint256)":{"params":{"den":"Denominator of the split ratio","num":"Numerator of the split ratio","result":"Resulting balance per share after split","balancePerShare":"Current balance per share"}}},"methods":{"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"symbol()":{"details":"Returns the symbol of the token."},"decimals()":{"details":"Returns the decimals places of the token."},"constructor":{"details":"Both constructor args are unused — kept for ABI compatibility with      the existing `new DShare(18, endpoint)` call sites. The LZ endpoint      is read from the diamond at runtime via `endpoint()` (single source      of truth); the diamond is read from `_getdShareStorage()._accessControl`."},"maxSupply()":{"details":"Useful for sanity checks before minting since the total supply of shares can overflow."},"burn(uint256)":{"params":{"value":"Amount of tokens to burn"},"details":"Only callable by approved burner"},"nonces(address)":{"details":"Returns the current nonce for `owner`. This value is used to compute the signature for EIP-2612 permit."},"setName(string)":{"details":"Only callable by owner or deployer"},"balancePerShare()":{"details":"Returns the number of tokens an internal share amount represents. This amount is assumed to have 18 decimals and is divided by 10 **18 when applied."},"setSymbol(string)":{"details":"Only callable by owner or deployer"},"DOMAIN_SEPARATOR()":{"details":"Returns the EIP-712 domain separator for the EIP-2612 permit."},"transferRestrictor()":{"returns":{"_0":"The transfer restrictor implementation"}},"mint(address,uint256)":{"params":{"to":"Address to mint tokens to","value":"Amount of tokens to mint"},"details":"Only callable by authorized admin"},"isBlacklisted(address)":{"params":{"account":"The address to check"},"returns":{"_0":"True if the restrictor facet reports the account as blacklisted"}},"approve(address,uint256)":{"details":"Sets `amount` as the allowance of `spender` over the caller's tokens. Emits a {Approval} event."},"burnFrom(address,uint256)":{"params":{"value":"Amount of tokens to burn","account":"Address to burn tokens from"},"details":"TOKEN_OPERATOR_ROLE can bypass allowance, others need allowance"},"transfer(address,uint256)":{"details":"Transfer `amount` tokens from the caller to `to`. Requirements: - `from` must at least have `amount`. Emits a {Transfer} event."},"allowance(address,address)":{"details":"Returns the amount of tokens that `spender` can spend on behalf of `owner`."},"setBalancePerShare(uint128)":{"details":"Relies on offchain computation of aggregate splits and reverse splits"},"setTransferRestrictor(address)":{"details":"Only callable by owner"},"isTransferAllowed(address,address)":{"params":{"to":"The address of the account","from":"The address of the account"},"details":"Returns false if the restrictor is unset; otherwise defers to the phase-2 rules","returns":{"_0":"Whether the transfer is allowed"}},"initialize(string,string,address,address,address)":{"details":"`delegate_` is accepted for ABI compatibility with the existing      DShareFactoryFacet.createDShare call site but is no longer used."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Sets `value` as the allowance of `spender` over the tokens of `owner`, authorized by a signed approval by `owner`. Emits a {Approval} event."}},"version":1,"stateVariables":{"dShareStorageLocation":{"details":"keccak256(abi.encode(uint256(keccak256(\"dinaricrypto.storage.DShare\")) - 1)) & ~bytes32(uint256(0xff))"}}},"sourceIds":{"src/tokens/ERC20Rebasing.sol":{"id":33},"src/tokens/shares/IDShare.sol":{"id":34},"lib/solady/src/tokens/ERC20.sol":{"id":23},"src/common/diamond/Constants.sol":{"id":26},"src/common/utils/NumberUtils.sol":{"id":32},"src/tokens/shares/retail/DShare.sol":{"id":36},"src/tokens/shares/ITransferRestrictor.sol":{"id":35},"lib/solady/src/utils/FixedPointMathLib.sol":{"id":24},"src/common/AccessControlledUpgradeable.sol":{"id":25},"src/common/diamond/facets/lz-routing/ILZRouting.sol":{"id":29},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"id":19},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":18},"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"id":12},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"id":21},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppCore.sol":{"id":0},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":15},"lib/devtools/packages/oft-evm/contracts/interfaces/IOFT.sol":{"id":3},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":14},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":16},"src/common/diamond/facets/access-control/IAccessControl.sol":{"id":27},"src/common/diamond/facets/asset-registry/IAssetRegistry.sol":{"id":28},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppSender.sol":{"id":1},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":13},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"id":22},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":17},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":20},"lib/devtools/packages/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol":{"id":2},"src/common/diamond/facets/transfer-restrictor/UserAddressMetadataLib.sol":{"id":31},"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol":{"id":30},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"id":10},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"id":9},"lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol":{"id":11},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol":{"id":6},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol":{"id":8},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol":{"id":5},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol":{"id":7},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol":{"id":4}},"additionalInput":null,"stdJsonInput":{"sources":{"src/tokens/ERC20Rebasing.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity ^0.8.20;\n\nimport {ERC20} from \"@solady/src/tokens/ERC20.sol\";\nimport {NumberUtils} from \"src/common/utils/NumberUtils.sol\";\nimport {FixedPointMathLib} from \"@solady/src/utils/FixedPointMathLib.sol\";\n\n/// @notice Rebasing ERC20 token as an in-place upgrade to solady erc20\n/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/dShare.sol)\nabstract contract ERC20Rebasing is ERC20 {\n    uint256 private constant _TRANSFER_EVENT_SIGNATURE =\n        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;\n\n    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;\n    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;\n\n    uint128 internal constant _INITIAL_BALANCE_PER_SHARE = 1 ether;\n\n    /**\n     * @dev Returns the number of tokens an internal share amount represents.\n     * This amount is assumed to have 18 decimals and is divided by 10 **18 when applied.\n     */\n    function balancePerShare() public view virtual returns (uint128);\n\n    function sharesToBalance(uint256 shares) public view returns (uint256) {\n        return FixedPointMathLib.fullMulDiv(shares, balancePerShare(), _INITIAL_BALANCE_PER_SHARE); // floor\n    }\n\n    function balanceToShares(uint256 balance) public view returns (uint256) {\n        return FixedPointMathLib.fullMulDiv(balance, _INITIAL_BALANCE_PER_SHARE, balancePerShare()); // floor\n    }\n\n    /// ------------------ ERC20 ------------------\n\n    function totalSupply() public view virtual override returns (uint256) {\n        return sharesToBalance(super.totalSupply());\n    }\n\n    /// @notice Returns the maximum supply of the token in balance.\n    /// @dev Useful for sanity checks before minting since the total supply of shares can overflow.\n    function maxSupply() public view virtual returns (uint256) {\n        // Reduced maxSupply of shares to prevent overflow in balanceToShares and other functions\n        uint128 balancePerShare_ = balancePerShare();\n        if (balancePerShare_ < _INITIAL_BALANCE_PER_SHARE) {\n            // maxSupply = type(uint256).max * balancePerShare_ / _INITIAL_BALANCE_PER_SHARE\n            return FixedPointMathLib.fullMulDiv(type(uint256).max, balancePerShare_, _INITIAL_BALANCE_PER_SHARE);\n        } else if (balancePerShare_ > _INITIAL_BALANCE_PER_SHARE) {\n            // maxSupply = type(uint256).max * _INITIAL_BALANCE_PER_SHARE / balancePerShare_\n            return FixedPointMathLib.fullMulDiv(type(uint256).max, _INITIAL_BALANCE_PER_SHARE, balancePerShare_);\n        }\n        return type(uint256).max;\n    }\n\n    function balanceOf(address account) public view virtual override returns (uint256) {\n        return sharesToBalance(super.balanceOf(account));\n    }\n\n    function sharesOf(address account) public view virtual returns (uint256) {\n        return super.balanceOf(account);\n    }\n\n    function transfer(address to, uint256 amount) public virtual override returns (bool) {\n        _transfer(msg.sender, to, amount);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n        _spendAllowance(from, msg.sender, amount);\n        _transfer(from, to, amount);\n        return true;\n    }\n\n    // Convert to shares\n    function _transfer(address from, address to, uint256 amount) internal virtual override {\n        _beforeTokenTransfer(from, to, amount);\n        uint256 shares = balanceToShares(amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            let from_ := shl(96, from)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(shares, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, shares))\n            // Compute the balance slot of `to`.\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance of `to`.\n            // Will not overflow because the sum of all user balances\n            // cannot exceed the maximum uint256 value.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), shares))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(from, to, amount);\n    }\n\n    // Convert to shares\n    function _mint(address to, uint256 amount) internal virtual override {\n        _beforeTokenTransfer(address(0), to, amount);\n        uint256 totalSharesBefore = super.totalSupply();\n        // Floor the shares to mint\n        uint256 shares = balanceToShares(amount);\n        // Check the total supply limit for shares\n        uint256 totalSharesAfter = 0;\n        unchecked {\n            totalSharesAfter = totalSharesBefore + shares;\n        }\n        // Check overflow\n        if (totalSharesAfter < totalSharesBefore) revert TotalSupplyOverflow();\n        // Check total supply limit, can also revert with FullMulDivFailed in fullMulDivUp\n        // Round up for total supply limit check\n        if (\n            FixedPointMathLib.fullMulDivUp(totalSharesAfter, balancePerShare(), _INITIAL_BALANCE_PER_SHARE)\n                > maxSupply()\n        ) revert TotalSupplyOverflow();\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, totalSharesAfter)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), shares))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(address(0), to, amount);\n    }\n\n    // Convert to shares\n    function _burn(address from, uint256 amount) internal virtual override {\n        _beforeTokenTransfer(from, address(0), amount);\n        // Round up the shares to burn in favor of the contract\n        uint256 shares = FixedPointMathLib.fullMulDivUp(amount, _INITIAL_BALANCE_PER_SHARE, balancePerShare());\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, from)\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(shares, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, shares))\n            // Subtract and store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), shares))\n            // Emit the {Transfer} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)\n        }\n        _afterTokenTransfer(from, address(0), amount);\n    }\n}\n"},"src/tokens/shares/IDShare.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\nimport {ITransferRestrictor} from \"src/tokens/shares/ITransferRestrictor.sol\";\n\n/// @title IDShare\n/// @notice Core token contract interface for bridged real-world assets (DShares)\n/// @dev Provides minting, burning, transfer restrictions, and stock split functionality\n/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/IDShare.sol)\ninterface IDShareErrors {\n    /// @notice Thrown when attempting operations on a paused asset\n    error AssetPaused();\n    \n    /// @notice Thrown when funding asset is paused\n    error FundingAssetPaused();\n    \n    /// @notice Thrown when zero address is provided where not allowed\n    error ZeroAddress();\n    \n    /// @notice Thrown when token name is invalid\n    error InvalidName();\n    \n    /// @notice Thrown when token symbol is invalid\n    error InvalidSymbol();\n    \n    /// @notice Thrown when zero value is provided where not allowed\n    error ZeroValue();\n    \n    /// @notice Thrown when account is restricted from transfers\n    error TransferRestrictor_AccountRestricted();\n\n    /// @notice Thrown when zero ratio is provided where not allowed\n    error ZeroRatio();\n}\n\n/// @notice Events emitted by DShare contracts\ninterface IDShareEvent {\n    /// @notice Emitted when token name is updated\n    /// @param name The new token name\n    event NameSet(string name);\n    \n    /// @notice Emitted when token symbol is updated\n    /// @param symbol The new token symbol\n    event SymbolSet(string symbol);\n    \n    /// @notice Emitted when transfer restrictor contract is updated\n    /// @param transferRestrictor The new transfer restrictor address\n    event TransferRestrictorSet(ITransferRestrictor indexed transferRestrictor);\n    \n    /// @notice Emitted when balance per share multiplier is updated (for splits)\n    /// @param balancePerShare The new balance per share value\n    event BalancePerShareSet(uint256 balancePerShare);\n    \n    /// @notice Emitted when split factor is adjusted\n    /// @param num Numerator of the split ratio\n    /// @param den Denominator of the split ratio\n    /// @param balancePerShare Current balance per share\n    /// @param result Resulting balance per share after split\n    event SplitAdjusted(uint256 num, uint256 den, uint256 balancePerShare, uint256 result);\n    \n    /// @notice Emitted when DShare is paused\n    /// @param asset Address of the asset being paused\n    /// @param timestamp Time of pause\n    event DSharePaused(address indexed asset, uint256 timestamp);\n    \n    /// @notice Emitted when DShare is unpaused\n    /// @param asset Address of the asset being unpaused\n    /// @param timestamp Time of unpause\n    event DShareUnpaused(address indexed asset, uint256 timestamp);\n}\n\n/// @notice Main DShare interface combining errors and events\ninterface IDShare is IDShareErrors, IDShareEvent{\n    /// @notice Initializes a new DShare token\n    /// @param name_ Token name\n    /// @param symbol_ Token symbol\n    /// @param transferRestrictor_ Transfer restrictor contract\n    /// @param accessControl_ Access control contract\n    /// @param delegate_ Delegate address for LayerZero operations\n    function initialize(\n        string memory name_,\n        string memory symbol_,\n        ITransferRestrictor transferRestrictor_,\n        address accessControl_,\n        address delegate_\n    ) external;\n\n    /// @notice Reinitializes the contract (e.g. to add new functionality)\n    function reinitialize() external;\n\n    /// @notice Returns the transfer restrictor contract\n    /// @return The transfer restrictor implementation\n    function transferRestrictor() external view returns (ITransferRestrictor);\n    \n    /**\n     * @notice Checks if an account is blacklisted/restricted from transfers\n     * @param account The address to check\n     * @return True if the account is blacklisted or is the zero address\n     */\n    function isBlacklisted(address account) external view returns (bool);\n\n    /// @notice Applies a stock split to the token\n    /// @dev Updates the balance per share multiplier to reflect split ratio\n    /// @param to_ Numerator of the split ratio (new shares)\n    /// @param from_ Denominator of the split ratio (old shares)\n    /// @return The new balance per share value after split\n    function applySplit(uint256 to_, uint256 from_) external returns (uint128);\n\n    /// @notice Sets the balance per share multiplier directly\n    /// @dev Admin only. Used for initializing or adjusting split factors\n    /// @param balancePerShare_ The new balance per share value\n    function setBalancePerShare(uint128 balancePerShare_) external;\n\n    /// @notice Updates the transfer restrictor contract\n    /// @dev Admin only. Changes which contract enforces transfer restrictions\n    /// @param newRestrictor The new transfer restrictor implementation\n    function setTransferRestrictor(ITransferRestrictor newRestrictor) external;\n\n}"},"lib/solady/src/tokens/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Simple ERC20 + EIP-2612 implementation.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)\n///\n/// @dev Note:\n/// - The ERC20 standard allows minting and transferring to and from the zero address,\n///   minting and transferring zero tokens, as well as self-approvals.\n///   For performance, this implementation WILL NOT revert for such actions.\n///   Please add any checks with overrides if desired.\n/// - The `permit` function uses the ecrecover precompile (0x1).\n///\n/// If you are overriding:\n/// - NEVER violate the ERC20 invariant:\n///   the total sum of all balances must be equal to `totalSupply()`.\n/// - Check that the overridden function is actually used in the function you want to\n///   change the behavior of. Much of the code has been manually inlined for performance.\nabstract contract ERC20 {\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                       CUSTOM ERRORS                        */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The total supply has overflowed.\n    error TotalSupplyOverflow();\n\n    /// @dev The allowance has overflowed.\n    error AllowanceOverflow();\n\n    /// @dev The allowance has underflowed.\n    error AllowanceUnderflow();\n\n    /// @dev Insufficient balance.\n    error InsufficientBalance();\n\n    /// @dev Insufficient allowance.\n    error InsufficientAllowance();\n\n    /// @dev The permit is invalid.\n    error InvalidPermit();\n\n    /// @dev The permit has expired.\n    error PermitExpired();\n\n    /// @dev The allowance of Permit2 is fixed at infinity.\n    error Permit2AllowanceIsFixedAtInfinity();\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                           EVENTS                           */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Emitted when `amount` tokens is transferred from `from` to `to`.\n    event Transfer(address indexed from, address indexed to, uint256 amount);\n\n    /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n    /// @dev `keccak256(bytes(\"Transfer(address,address,uint256)\"))`.\n    uint256 private constant _TRANSFER_EVENT_SIGNATURE =\n        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;\n\n    /// @dev `keccak256(bytes(\"Approval(address,address,uint256)\"))`.\n    uint256 private constant _APPROVAL_EVENT_SIGNATURE =\n        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                          STORAGE                           */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The storage slot for the total supply.\n    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;\n\n    /// @dev The balance slot of `owner` is given by:\n    /// ```\n    ///     mstore(0x0c, _BALANCE_SLOT_SEED)\n    ///     mstore(0x00, owner)\n    ///     let balanceSlot := keccak256(0x0c, 0x20)\n    /// ```\n    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;\n\n    /// @dev The allowance slot of (`owner`, `spender`) is given by:\n    /// ```\n    ///     mstore(0x20, spender)\n    ///     mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n    ///     mstore(0x00, owner)\n    ///     let allowanceSlot := keccak256(0x0c, 0x34)\n    /// ```\n    uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;\n\n    /// @dev The nonce slot of `owner` is given by:\n    /// ```\n    ///     mstore(0x0c, _NONCES_SLOT_SEED)\n    ///     mstore(0x00, owner)\n    ///     let nonceSlot := keccak256(0x0c, 0x20)\n    /// ```\n    uint256 private constant _NONCES_SLOT_SEED = 0x38377508;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                         CONSTANTS                          */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`.\n    uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901;\n\n    /// @dev `keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\")`.\n    bytes32 private constant _DOMAIN_TYPEHASH =\n        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n    /// @dev `keccak256(\"1\")`.\n    /// If you need to use a different version, override `_versionHash`.\n    bytes32 private constant _DEFAULT_VERSION_HASH =\n        0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;\n\n    /// @dev `keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\")`.\n    bytes32 private constant _PERMIT_TYPEHASH =\n        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n\n    /// @dev The canonical Permit2 address.\n    /// For signature-based allowance granting for single transaction ERC20 `transferFrom`.\n    /// Enabled by default. To disable, override `_givePermit2InfiniteAllowance()`.\n    /// [Github](https://github.com/Uniswap/permit2)\n    /// [Etherscan](https://etherscan.io/address/0x000000000022D473030F116dDEE9F6B43aC78BA3)\n    address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                       ERC20 METADATA                       */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns the name of the token.\n    function name() public view virtual returns (string memory);\n\n    /// @dev Returns the symbol of the token.\n    function symbol() public view virtual returns (string memory);\n\n    /// @dev Returns the decimals places of the token.\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                           ERC20                            */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns the amount of tokens in existence.\n    function totalSupply() public view virtual returns (uint256 result) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := sload(_TOTAL_SUPPLY_SLOT)\n        }\n    }\n\n    /// @dev Returns the amount of tokens owned by `owner`.\n    function balanceOf(address owner) public view virtual returns (uint256 result) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, owner)\n            result := sload(keccak256(0x0c, 0x20))\n        }\n    }\n\n    /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.\n    function allowance(address owner, address spender)\n        public\n        view\n        virtual\n        returns (uint256 result)\n    {\n        if (_givePermit2InfiniteAllowance()) {\n            if (spender == _PERMIT2) return type(uint256).max;\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            mstore(0x20, spender)\n            mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n            mstore(0x00, owner)\n            result := sload(keccak256(0x0c, 0x34))\n        }\n    }\n\n    /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n    ///\n    /// Emits a {Approval} event.\n    function approve(address spender, uint256 amount) public virtual returns (bool) {\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                // If `spender == _PERMIT2 && amount != type(uint256).max`.\n                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(amount)))) {\n                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the allowance slot and store the amount.\n            mstore(0x20, spender)\n            mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n            mstore(0x00, caller())\n            sstore(keccak256(0x0c, 0x34), amount)\n            // Emit the {Approval} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))\n        }\n        return true;\n    }\n\n    /// @dev Transfer `amount` tokens from the caller to `to`.\n    ///\n    /// Requirements:\n    /// - `from` must at least have `amount`.\n    ///\n    /// Emits a {Transfer} event.\n    function transfer(address to, uint256 amount) public virtual returns (bool) {\n        _beforeTokenTransfer(msg.sender, to, amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, caller())\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(amount, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, amount))\n            // Compute the balance slot of `to`.\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance of `to`.\n            // Will not overflow because the sum of all user balances\n            // cannot exceed the maximum uint256 value.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(msg.sender, to, amount);\n        return true;\n    }\n\n    /// @dev Transfers `amount` tokens from `from` to `to`.\n    ///\n    /// Note: Does not update the allowance if it is the maximum uint256 value.\n    ///\n    /// Requirements:\n    /// - `from` must at least have `amount`.\n    /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.\n    ///\n    /// Emits a {Transfer} event.\n    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {\n        _beforeTokenTransfer(from, to, amount);\n        // Code duplication is for zero-cost abstraction if possible.\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                let from_ := shl(96, from)\n                if iszero(eq(caller(), _PERMIT2)) {\n                    // Compute the allowance slot and load its value.\n                    mstore(0x20, caller())\n                    mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))\n                    let allowanceSlot := keccak256(0x0c, 0x34)\n                    let allowance_ := sload(allowanceSlot)\n                    // If the allowance is not the maximum uint256 value.\n                    if not(allowance_) {\n                        // Revert if the amount to be transferred exceeds the allowance.\n                        if gt(amount, allowance_) {\n                            mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.\n                            revert(0x1c, 0x04)\n                        }\n                        // Subtract and store the updated allowance.\n                        sstore(allowanceSlot, sub(allowance_, amount))\n                    }\n                }\n                // Compute the balance slot and load its value.\n                mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n                let fromBalanceSlot := keccak256(0x0c, 0x20)\n                let fromBalance := sload(fromBalanceSlot)\n                // Revert if insufficient balance.\n                if gt(amount, fromBalance) {\n                    mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                    revert(0x1c, 0x04)\n                }\n                // Subtract and store the updated balance.\n                sstore(fromBalanceSlot, sub(fromBalance, amount))\n                // Compute the balance slot of `to`.\n                mstore(0x00, to)\n                let toBalanceSlot := keccak256(0x0c, 0x20)\n                // Add and store the updated balance of `to`.\n                // Will not overflow because the sum of all user balances\n                // cannot exceed the maximum uint256 value.\n                sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n                // Emit the {Transfer} event.\n                mstore(0x20, amount)\n                log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n            }\n        } else {\n            /// @solidity memory-safe-assembly\n            assembly {\n                let from_ := shl(96, from)\n                // Compute the allowance slot and load its value.\n                mstore(0x20, caller())\n                mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))\n                let allowanceSlot := keccak256(0x0c, 0x34)\n                let allowance_ := sload(allowanceSlot)\n                // If the allowance is not the maximum uint256 value.\n                if not(allowance_) {\n                    // Revert if the amount to be transferred exceeds the allowance.\n                    if gt(amount, allowance_) {\n                        mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.\n                        revert(0x1c, 0x04)\n                    }\n                    // Subtract and store the updated allowance.\n                    sstore(allowanceSlot, sub(allowance_, amount))\n                }\n                // Compute the balance slot and load its value.\n                mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n                let fromBalanceSlot := keccak256(0x0c, 0x20)\n                let fromBalance := sload(fromBalanceSlot)\n                // Revert if insufficient balance.\n                if gt(amount, fromBalance) {\n                    mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                    revert(0x1c, 0x04)\n                }\n                // Subtract and store the updated balance.\n                sstore(fromBalanceSlot, sub(fromBalance, amount))\n                // Compute the balance slot of `to`.\n                mstore(0x00, to)\n                let toBalanceSlot := keccak256(0x0c, 0x20)\n                // Add and store the updated balance of `to`.\n                // Will not overflow because the sum of all user balances\n                // cannot exceed the maximum uint256 value.\n                sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n                // Emit the {Transfer} event.\n                mstore(0x20, amount)\n                log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n            }\n        }\n        _afterTokenTransfer(from, to, amount);\n        return true;\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                          EIP-2612                          */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev For more performance, override to return the constant value\n    /// of `keccak256(bytes(name()))` if `name()` will never change.\n    function _constantNameHash() internal view virtual returns (bytes32 result) {}\n\n    /// @dev If you need a different value, override this function.\n    function _versionHash() internal view virtual returns (bytes32 result) {\n        result = _DEFAULT_VERSION_HASH;\n    }\n\n    /// @dev For inheriting contracts to increment the nonce.\n    function _incrementNonce(address owner) internal virtual {\n        /// @solidity memory-safe-assembly\n        assembly {\n            mstore(0x0c, _NONCES_SLOT_SEED)\n            mstore(0x00, owner)\n            let nonceSlot := keccak256(0x0c, 0x20)\n            sstore(nonceSlot, add(1, sload(nonceSlot)))\n        }\n    }\n\n    /// @dev Returns the current nonce for `owner`.\n    /// This value is used to compute the signature for EIP-2612 permit.\n    function nonces(address owner) public view virtual returns (uint256 result) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the nonce slot and load its value.\n            mstore(0x0c, _NONCES_SLOT_SEED)\n            mstore(0x00, owner)\n            result := sload(keccak256(0x0c, 0x20))\n        }\n    }\n\n    /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`,\n    /// authorized by a signed approval by `owner`.\n    ///\n    /// Emits a {Approval} event.\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public virtual {\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                // If `spender == _PERMIT2 && value != type(uint256).max`.\n                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(value)))) {\n                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n        bytes32 nameHash = _constantNameHash();\n        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.\n        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));\n        bytes32 versionHash = _versionHash();\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Revert if the block timestamp is greater than `deadline`.\n            if gt(timestamp(), deadline) {\n                mstore(0x00, 0x1a15a3cc) // `PermitExpired()`.\n                revert(0x1c, 0x04)\n            }\n            let m := mload(0x40) // Grab the free memory pointer.\n            // Clean the upper 96 bits.\n            owner := shr(96, shl(96, owner))\n            spender := shr(96, shl(96, spender))\n            // Compute the nonce slot and load its value.\n            mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX)\n            mstore(0x00, owner)\n            let nonceSlot := keccak256(0x0c, 0x20)\n            let nonceValue := sload(nonceSlot)\n            // Prepare the domain separator.\n            mstore(m, _DOMAIN_TYPEHASH)\n            mstore(add(m, 0x20), nameHash)\n            mstore(add(m, 0x40), versionHash)\n            mstore(add(m, 0x60), chainid())\n            mstore(add(m, 0x80), address())\n            mstore(0x2e, keccak256(m, 0xa0))\n            // Prepare the struct hash.\n            mstore(m, _PERMIT_TYPEHASH)\n            mstore(add(m, 0x20), owner)\n            mstore(add(m, 0x40), spender)\n            mstore(add(m, 0x60), value)\n            mstore(add(m, 0x80), nonceValue)\n            mstore(add(m, 0xa0), deadline)\n            mstore(0x4e, keccak256(m, 0xc0))\n            // Prepare the ecrecover calldata.\n            mstore(0x00, keccak256(0x2c, 0x42))\n            mstore(0x20, and(0xff, v))\n            mstore(0x40, r)\n            mstore(0x60, s)\n            let t := staticcall(gas(), 1, 0x00, 0x80, 0x20, 0x20)\n            // If the ecrecover fails, the returndatasize will be 0x00,\n            // `owner` will be checked if it equals the hash at 0x00,\n            // which evaluates to false (i.e. 0), and we will revert.\n            // If the ecrecover succeeds, the returndatasize will be 0x20,\n            // `owner` will be compared against the returned address at 0x20.\n            if iszero(eq(mload(returndatasize()), owner)) {\n                mstore(0x00, 0xddafbaef) // `InvalidPermit()`.\n                revert(0x1c, 0x04)\n            }\n            // Increment and store the updated nonce.\n            sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds.\n            // Compute the allowance slot and store the value.\n            // The `owner` is already at slot 0x20.\n            mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender))\n            sstore(keccak256(0x2c, 0x34), value)\n            // Emit the {Approval} event.\n            log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender)\n            mstore(0x40, m) // Restore the free memory pointer.\n            mstore(0x60, 0) // Restore the zero pointer.\n        }\n    }\n\n    /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit.\n    function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) {\n        bytes32 nameHash = _constantNameHash();\n        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.\n        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));\n        bytes32 versionHash = _versionHash();\n        /// @solidity memory-safe-assembly\n        assembly {\n            let m := mload(0x40) // Grab the free memory pointer.\n            mstore(m, _DOMAIN_TYPEHASH)\n            mstore(add(m, 0x20), nameHash)\n            mstore(add(m, 0x40), versionHash)\n            mstore(add(m, 0x60), chainid())\n            mstore(add(m, 0x80), address())\n            result := keccak256(m, 0xa0)\n        }\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                  INTERNAL MINT FUNCTIONS                   */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Mints `amount` tokens to `to`, increasing the total supply.\n    ///\n    /// Emits a {Transfer} event.\n    function _mint(address to, uint256 amount) internal virtual {\n        _beforeTokenTransfer(address(0), to, amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)\n            let totalSupplyAfter := add(totalSupplyBefore, amount)\n            // Revert if the total supply overflows.\n            if lt(totalSupplyAfter, totalSupplyBefore) {\n                mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.\n                revert(0x1c, 0x04)\n            }\n            // Store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(address(0), to, amount);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                  INTERNAL BURN FUNCTIONS                   */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Burns `amount` tokens from `from`, reducing the total supply.\n    ///\n    /// Emits a {Transfer} event.\n    function _burn(address from, uint256 amount) internal virtual {\n        _beforeTokenTransfer(from, address(0), amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the balance slot and load its value.\n            mstore(0x0c, _BALANCE_SLOT_SEED)\n            mstore(0x00, from)\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(amount, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, amount))\n            // Subtract and store the updated total supply.\n            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount))\n            // Emit the {Transfer} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)\n        }\n        _afterTokenTransfer(from, address(0), amount);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                INTERNAL TRANSFER FUNCTIONS                 */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Moves `amount` of tokens from `from` to `to`.\n    function _transfer(address from, address to, uint256 amount) internal virtual {\n        _beforeTokenTransfer(from, to, amount);\n        /// @solidity memory-safe-assembly\n        assembly {\n            let from_ := shl(96, from)\n            // Compute the balance slot and load its value.\n            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))\n            let fromBalanceSlot := keccak256(0x0c, 0x20)\n            let fromBalance := sload(fromBalanceSlot)\n            // Revert if insufficient balance.\n            if gt(amount, fromBalance) {\n                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n                revert(0x1c, 0x04)\n            }\n            // Subtract and store the updated balance.\n            sstore(fromBalanceSlot, sub(fromBalance, amount))\n            // Compute the balance slot of `to`.\n            mstore(0x00, to)\n            let toBalanceSlot := keccak256(0x0c, 0x20)\n            // Add and store the updated balance of `to`.\n            // Will not overflow because the sum of all user balances\n            // cannot exceed the maximum uint256 value.\n            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))\n            // Emit the {Transfer} event.\n            mstore(0x20, amount)\n            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))\n        }\n        _afterTokenTransfer(from, to, amount);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                INTERNAL ALLOWANCE FUNCTIONS                */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.\n    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n        if (_givePermit2InfiniteAllowance()) {\n            if (spender == _PERMIT2) return; // Do nothing, as allowance is infinite.\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Compute the allowance slot and load its value.\n            mstore(0x20, spender)\n            mstore(0x0c, _ALLOWANCE_SLOT_SEED)\n            mstore(0x00, owner)\n            let allowanceSlot := keccak256(0x0c, 0x34)\n            let allowance_ := sload(allowanceSlot)\n            // If the allowance is not the maximum uint256 value.\n            if not(allowance_) {\n                // Revert if the amount to be transferred exceeds the allowance.\n                if gt(amount, allowance_) {\n                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.\n                    revert(0x1c, 0x04)\n                }\n                // Subtract and store the updated allowance.\n                sstore(allowanceSlot, sub(allowance_, amount))\n            }\n        }\n    }\n\n    /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.\n    ///\n    /// Emits a {Approval} event.\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\n        if (_givePermit2InfiniteAllowance()) {\n            /// @solidity memory-safe-assembly\n            assembly {\n                // If `spender == _PERMIT2 && amount != type(uint256).max`.\n                if iszero(or(xor(shr(96, shl(96, spender)), _PERMIT2), iszero(not(amount)))) {\n                    mstore(0x00, 0x3f68539a) // `Permit2AllowanceIsFixedAtInfinity()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            let owner_ := shl(96, owner)\n            // Compute the allowance slot and store the amount.\n            mstore(0x20, spender)\n            mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))\n            sstore(keccak256(0x0c, 0x34), amount)\n            // Emit the {Approval} event.\n            mstore(0x00, amount)\n            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))\n        }\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                     HOOKS TO OVERRIDE                      */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Hook that is called before any transfer of tokens.\n    /// This includes minting and burning.\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n    /// @dev Hook that is called after any transfer of tokens.\n    /// This includes minting and burning.\n    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                          PERMIT2                           */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns whether to fix the Permit2 contract's allowance at infinity.\n    ///\n    /// This value should be kept constant after contract initialization,\n    /// or else the actual allowance values may not match with the {Approval} events.\n    /// For best performance, return a compile-time constant for zero-cost abstraction.\n    function _givePermit2InfiniteAllowance() internal view virtual returns (bool) {\n        return true;\n    }\n}\n"},"src/common/diamond/Constants.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/// @dev Address used to identify a multi delegate call in a diamond cut.\naddress constant MULTI_INIT_ADDRESS = 0xD1a302d1A302d1A302d1A302d1A302D1A302D1a3;\n\n/// @dev Default admin role value.\nuint8 constant DEFAULT_ADMIN_ROLE = 0;\n\n/// @dev Role value for operating transfers.\nuint8 constant OPERATOR_ROLE = 1;\n\n/// @dev Role value for operating tokens.\nuint8 constant TOKEN_OPERATOR_ROLE = 2;\n\n/// @dev Role to restrict transfer\nuint8 constant RESTRICTOR_ROLE = 3;\n\n/// @dev Role to upgrade and deploy contracts\nuint8 constant DEPLOYER_ROLE = 4;\n\n/// @dev Role for corporate action operators (dividends, splits, etc.)\nuint8 constant CORPORATE_ACTION_ROLE = 5;\n\n/// @dev Basis points denominator\nuint16 constant BPS_DENOMINATOR = 10_000;\n\n/// @dev PRICE_PRECISION = 1e18\nuint256 constant PRICE_PRECISION = 1e18;\n\n/// @dev DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD\naddress constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;\n\n// Old AccessControlDefaultAdminRulesUpgradeable with bytes32 roles\nbytes32 constant OLD_UPGRADER_ROLE = keccak256(\"UPGRADER_ROLE\");\n\nbytes32 constant OLD_DEFAULT_ADMIN_ROLE = 0x00;\n\n"},"src/common/utils/NumberUtils.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @title NumberUtils\n/// @notice Library providing arithmetic utility functions with overflow detection\n/// @dev Implements unchecked arithmetic with explicit overflow checks for gas optimization\nlibrary NumberUtils {\n    /// @notice Checks if adding two numbers would overflow\n    /// @dev Uses unchecked arithmetic and detects overflow by comparing result with inputs\n    /// @param a First operand\n    /// @param b Second operand\n    /// @return True if overflow would occur, false otherwise\n    function addCheckOverflow(uint256 a, uint256 b) internal pure returns (bool) {\n        uint256 c = 0;\n        unchecked {\n            c = a + b;\n        }\n        return c < a || c < b;\n    }\n\n    /// @notice Checks if multiplying two numbers would overflow\n    /// @dev Uses unchecked arithmetic and detects overflow by verifying c/a == b\n    /// @param a First operand\n    /// @param b Second operand\n    /// @return True if overflow would occur, false otherwise\n    function mulCheckOverflow(uint256 a, uint256 b) internal pure returns (bool) {\n        if (a == 0 || b == 0) {\n            return false;\n        }\n        uint256 c;\n        unchecked {\n            c = a * b;\n        }\n        return c / a != b;\n    }\n\n    /// @notice Checks if (a * b) / denominator would overflow\n    /// @dev Implements PRB-Math algorithm for high-precision mulDiv overflow detection\n    ///      Uses assembly to compute 512-bit intermediate product\n    /// @param a First operand\n    /// @param b Second operand\n    /// @param denominator Divisor (must be non-zero)\n    /// @return True if overflow would occur, false otherwise\n    function mulDivCheckOverflow(uint256 a, uint256 b, uint256 denominator) internal pure returns (bool) {\n        // Taken from prb-math\n        uint256 prod0; // 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            prod0 := mul(a, b)\n            prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n        }\n        return prod1 >= denominator;\n    }\n\n    /// @notice Computes the absolute difference between two unsigned integers\n    /// @dev Returns |a - b| without using signed arithmetic\n    /// @param a First value\n    /// @param b Second value\n    /// @return Absolute difference between a and b\n    function uintAbsDiff(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a >= b ? a - b : b - a;\n    }\n}\n"},"src/tokens/shares/retail/DShare.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {AccessControlledUpgradeable} from \"src/common/AccessControlledUpgradeable.sol\";\nimport {ITransferRestrictor} from \"src/tokens/shares/ITransferRestrictor.sol\";\nimport {ERC20Rebasing} from \"src/tokens/ERC20Rebasing.sol\";\nimport {SafeCast} from \"@openzeppelin/contracts/utils/math/SafeCast.sol\";\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {TOKEN_OPERATOR_ROLE} from \"src/common/diamond/Constants.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport {IDShare} from \"src/tokens/shares/IDShare.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {\n    SendParam, MessagingFee, MessagingReceipt, OFTReceipt\n} from \"@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol\";\nimport {ILayerZeroEndpointV2} from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\nimport {IOAppCore} from \"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\";\nimport {ILZRouting} from \"src/common/diamond/facets/lz-routing/ILZRouting.sol\";\nimport {IAssetRegistry} from \"src/common/diamond/facets/asset-registry/IAssetRegistry.sol\";\nimport {\n    ITransferRestrictorFacet,\n    ITransferRestrictorFacetErrors\n} from \"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol\";\n\n/**\n * @title DShare (Retail)\n */\ncontract DShare is AccessControlledUpgradeable, ERC20Rebasing, IDShare, PausableUpgradeable {\n    using SafeCast for uint256;\n    using SafeERC20 for IERC20;\n\n    event OFTSent(\n        bytes32 indexed guid, uint32 dstEid, address indexed from, uint256 amountSentLD, uint256 amountReceivedLD\n    );\n\n    struct dShareStorage {\n        string _name;\n        string _symbol;\n        ITransferRestrictor _transferRestrictor;\n        uint128 _balancePerShare;\n        address _accessControl;\n    }\n\n    /// @dev keccak256(abi.encode(uint256(keccak256(\"dinaricrypto.storage.DShare\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant dShareStorageLocation = 0x7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800;\n\n    function _getdShareStorage() private pure returns (dShareStorage storage $) {\n        assembly {\n            $.slot := dShareStorageLocation\n        }\n    }\n\n    /// @dev Both constructor args are unused — kept for ABI compatibility with\n    ///      the existing `new DShare(18, endpoint)` call sites. The LZ endpoint\n    ///      is read from the diamond at runtime via `endpoint()` (single source\n    ///      of truth); the diamond is read from `_getdShareStorage()._accessControl`.\n    constructor(uint8 /* _localDecimals */, address /* _endpoint */) {\n        _disableInitializers();\n    }\n\n    /// @notice Returns the diamond hosting the LZ routing facet for this token.\n    function diamond() public view returns (address) {\n        return _getdShareStorage()._accessControl;\n    }\n\n    /// @notice Initializes a DShare token via beacon proxy.\n    /// @dev `delegate_` is accepted for ABI compatibility with the existing\n    ///      DShareFactoryFacet.createDShare call site but is no longer used.\n    function initialize(\n        string memory _name,\n        string memory _symbol,\n        ITransferRestrictor transferRestrictor_,\n        address accessControl_,\n        address /* delegate_ */\n    ) external initializer {\n        require(accessControl_ != address(0), ZeroAddress());\n        require(transferRestrictor_ != ITransferRestrictor(address(0)), ZeroAddress());\n        require(bytes(_name).length > 0, InvalidName());\n        require(bytes(_symbol).length > 0, InvalidSymbol());\n\n        dShareStorage storage $ = _getdShareStorage();\n        $._name = _name;\n        $._symbol = _symbol;\n        $._transferRestrictor = transferRestrictor_;\n        $._balancePerShare = _INITIAL_BALANCE_PER_SHARE;\n        $._accessControl = accessControl_;\n        __AccessControlled_init(accessControl_);\n        __Pausable_init();\n    }\n\n    function reinitialize() external reinitializer(4) {\n        __Pausable_init();\n    }\n\n    // ------------------ Getters ------------------ //\n\n    function name() public view override returns (string memory) {\n        return _getdShareStorage()._name;\n    }\n\n    function symbol() public view override returns (string memory) {\n        return _getdShareStorage()._symbol;\n    }\n\n    function transferRestrictor() public view returns (ITransferRestrictor) {\n        return _getdShareStorage()._transferRestrictor;\n    }\n\n    function applySplit(uint256 to, uint256 from) external onlyRole(TOKEN_OPERATOR_ROLE) whenPaused returns (uint128) {\n        require(to != 0 && from != 0, ZeroRatio());\n        dShareStorage storage $ = _getdShareStorage();\n\n        uint256 current = $._balancePerShare == 0\n            ? _INITIAL_BALANCE_PER_SHARE\n            : $._balancePerShare;\n\n        // Floor rounding\n        uint256 updated = Math.mulDiv(current, to, from);\n\n        $._balancePerShare = updated.toUint128(); // will revert if > uint128\n\n        emit BalancePerShareSet(updated);\n        emit SplitAdjusted(to, from, current, updated);\n        return $._balancePerShare;\n    }\n\n    function balancePerShare() public view override returns (uint128) {\n        dShareStorage storage $ = _getdShareStorage();\n        uint128 _balancePerShare = $._balancePerShare;\n        // Override with default if not set due to upgrade\n        if (_balancePerShare == 0) return _INITIAL_BALANCE_PER_SHARE;\n        return _balancePerShare;\n    }\n\n    /// ------------------ Setters ------------------ ///\n\n    /// @notice Set token name\n    /// @dev Only callable by owner or deployer\n    function setName(string calldata newName) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        dShareStorage storage $ = _getdShareStorage();\n        $._name = newName;\n        emit NameSet(newName);\n    }\n\n    /// @notice Set token symbol\n    /// @dev Only callable by owner or deployer\n    function setSymbol(string calldata newSymbol) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        dShareStorage storage $ = _getdShareStorage();\n        $._symbol = newSymbol;\n        emit SymbolSet(newSymbol);\n    }\n\n    /// @notice Update split factor\n    /// @dev Relies on offchain computation of aggregate splits and reverse splits\n    function setBalancePerShare(uint128 balancePerShare_) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        require(balancePerShare_ > 0, ZeroValue());\n\n        dShareStorage storage $ = _getdShareStorage();\n        $._balancePerShare = balancePerShare_;\n        emit BalancePerShareSet(balancePerShare_);\n    }\n\n    /// @notice Set transfer restrictor contract\n    /// @dev Only callable by owner\n    function setTransferRestrictor(ITransferRestrictor newRestrictor) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        dShareStorage storage $ = _getdShareStorage();\n        $._transferRestrictor = newRestrictor;\n        emit TransferRestrictorSet(newRestrictor);\n    }\n\n    /// ------------------ Minting and Burning ------------------ ///\n\n    /// @notice Mint tokens\n    /// @param to Address to mint tokens to\n    /// @param value Amount of tokens to mint\n    /// @dev Only callable by authorized admin\n    function mint(address to, uint256 value) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        require(to != address(0), ZeroAddress());\n        _mint(to, value);\n    }\n\n    /// @notice Burn tokens\n    /// @param value Amount of tokens to burn\n    /// @dev Only callable by approved burner\n    function burn(uint256 value) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _burn(msg.sender, value);\n    }\n\n    /// @notice Burn tokens from an account\n    /// @param account Address to burn tokens from\n    /// @param value Amount of tokens to burn\n    /// @dev TOKEN_OPERATOR_ROLE can bypass allowance, others need allowance\n    function burnFrom(address account, uint256 value) external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _burn(account, value);\n    }\n\n    /// ------------------ Transfers ------------------ ///\n\n    /// @notice Override transferFrom to allow TOKEN_OPERATOR_ROLE bypass allowance\n    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {\n        if (hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) {\n            _transfer(from, to, amount);\n            return true;\n        }\n        return super.transferFrom(from, to, amount);\n    }\n\n    function _beforeTokenTransfer(address from, address to, uint256) internal view override {\n        // If transferRestrictor is not set, no restrictions are applied\n        dShareStorage storage $ = _getdShareStorage();\n        address _transferRestrictor = $._accessControl;\n        if (!hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) {\n                require(_transferRestrictor != address(0), ITransferRestrictorFacetErrors.TransferRestrictor_NotSet());\n                // Check transfer restrictions; revert if phase-2 rules disallow the transfer\n                require(\n                    ITransferRestrictorFacet(_transferRestrictor).TransferRestrictor_assertTransferPhase2(from, to),\n                    ITransferRestrictorFacetErrors.TransferRestrictor_TransferPhase2_NotAllowed()\n                );\n            }\n    }\n\n    /**\n     * @param from The address of the account\n     * @param to The address of the account\n     * @return Whether the transfer is allowed\n     * @dev Returns false if the restrictor is unset; otherwise defers to the phase-2 rules\n     */\n    function isTransferAllowed(address from, address to) external view returns (bool) {\n        dShareStorage storage $ = _getdShareStorage();\n        address _transferRestrictor = $._accessControl;\n        if (_transferRestrictor == address(0)) return false;\n        return ITransferRestrictorFacet(_transferRestrictor).TransferRestrictor_assertTransferPhase2(from, to);\n    }\n\n    /**\n     * @notice Checks if an account is blacklisted via the configured restrictor facet\n     * @param account The address to check\n     * @return True if the restrictor facet reports the account as blacklisted\n     */\n    function isBlacklisted(address account) external view returns (bool) {\n        dShareStorage storage $ = _getdShareStorage();\n        address _transferRestrictor = $._accessControl;\n        if (_transferRestrictor == address(0)) return false;\n        return ITransferRestrictorFacet(_transferRestrictor).isBlacklisted(account);\n    }\n\n    // ============== IOFT shim ==============\n    // Forwards to the diamond's LZRoutingFacet. See base DShare for the\n    // full design notes. The shim is identical between base and retail —\n    // alt vs native fee is detected at runtime via endpoint.nativeToken().\n\n    function token() external view returns (address) {\n        return address(this);\n    }\n\n    function approvalRequired() external pure returns (bool) {\n        return false;\n    }\n\n    function sharedDecimals() external pure returns (uint8) {\n        return 9;\n    }\n\n    function endpoint() external view returns (ILayerZeroEndpointV2) {\n        return IOAppCore(diamond()).endpoint();\n    }\n\n    function send(SendParam calldata _sendParam, MessagingFee calldata _fee, address _refundAddress)\n        external\n        payable\n        whenNotPaused\n        returns (MessagingReceipt memory, OFTReceipt memory)\n    {\n        _enforceTransferRestriction(msg.sender);\n        return _forward(msg.sender, _sendParam, _fee, _refundAddress);\n    }\n\n    function sendFrom(\n        SendParam calldata _sendParam,\n        address _from,\n        MessagingFee calldata _fee,\n        address _refundAddress\n    ) external payable whenNotPaused returns (MessagingReceipt memory, OFTReceipt memory) {\n        _enforceTransferRestriction(_from);\n        if (!hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) {\n            // Spend allowance on the dust-trimmed amount the hub actually burns\n            // (shared decimals = 9), so allowance-spent == amount-burned.\n            _spendAllowance(_from, _msgSender(), (_sendParam.amountLD / 1e9) * 1e9);\n        }\n        return _forward(_from, _sendParam, _fee, _refundAddress);\n    }\n\n    /// @dev Mirrors the phase-2 gate from _beforeTokenTransfer at the shim\n    ///      entry point. The actual burn is delegated to the diamond hub,\n    ///      whose msg.sender carries TOKEN_OPERATOR_ROLE and would otherwise\n    ///      bypass _beforeTokenTransfer's check. The bridge burns `from`\n    ///      (to == address(0)), so we assert the same (from, address(0)) rule.\n    ///      The phase-2 check also reverts when transfers are globally paused.\n    function _enforceTransferRestriction(address from) internal view {\n        address _transferRestrictor = _getdShareStorage()._accessControl;\n        if (_transferRestrictor == address(0)) return;\n        if (hasRole(_msgSender(), TOKEN_OPERATOR_ROLE)) return;\n        require(\n            ITransferRestrictorFacet(_transferRestrictor).TransferRestrictor_assertTransferPhase2(from, address(0)),\n            ITransferRestrictorFacetErrors.TransferRestrictor_TransferPhase2_NotAllowed()\n        );\n    }\n\n    function quoteSend(SendParam calldata _sendParam, bool _payInLzToken) external view returns (MessagingFee memory) {\n        address hub = diamond();\n        bytes32 assetId = IAssetRegistry(hub).AssetRegistry_idOf(address(this));\n        return ILZRouting(hub).LZRouting_quoteSend(assetId, _sendParam, _payInLzToken);\n    }\n\n    function _forward(address from, SendParam calldata sp, MessagingFee calldata fee, address refund)\n        internal\n        returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt)\n    {\n        address hub = diamond();\n        address altFeeToken = IOAppCore(hub).endpoint().nativeToken();\n        if (altFeeToken != address(0) && fee.nativeFee > 0) {\n            IERC20(altFeeToken).safeTransferFrom(msg.sender, address(this), fee.nativeFee);\n            IERC20(altFeeToken).forceApprove(hub, fee.nativeFee);\n        }\n\n        (msgReceipt, oftReceipt) = ILZRouting(hub).LZRouting_hubSend{value: msg.value}(from, sp, fee, refund);\n\n        // Match LayerZero OFTCoreUpgradeable._send: the indexed `from` topic\n        // is the caller (operator on sendFrom, user on send), not the burn\n        // target. Off-chain indexers filter by this address.\n        emit OFTSent(msgReceipt.guid, sp.dstEid, _msgSender(), oftReceipt.amountSentLD, oftReceipt.amountReceivedLD);\n    }\n\n    // ------------------ Pause ------------------ //\n\n    function pause() external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _pause();\n        emit DSharePaused(address(this), block.timestamp);\n    }\n\n    function unpause() external onlyRole(TOKEN_OPERATOR_ROLE) {\n        _unpause();\n        emit DShareUnpaused(address(this), block.timestamp);\n    }\n}\n"},"src/tokens/shares/ITransferRestrictor.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/// @title ITransferRestrictor\n/// @notice Interface for contracts that enforce transfer restrictions on DShares\n/// @dev Implements blacklist/whitelist functionality for regulatory compliance\n/// @author Dinari (https://github.com/dinaricrypto/sbt-contracts/blob/main/src/ITransferRestrictor.sol)\ninterface ITransferRestrictor {\n    /// @notice Checks if an account is blacklisted and restricted from transfers\n    /// @param account The address to check\n    /// @return True if the account is blacklisted, false otherwise\n    function isBlacklisted(address account) external view returns (bool);\n\n    /// @notice Adds an account to the restriction list\n    /// @dev Admin only. Prevents the account from sending or receiving tokens\n    /// @param account The address to restrict\n    function restrict(address account) external;\n}"},"lib/solady/src/utils/FixedPointMathLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Arithmetic library with operations for fixed-point numbers.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)\nlibrary FixedPointMathLib {\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                       CUSTOM ERRORS                        */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The operation failed, as the output exceeds the maximum value of uint256.\n    error ExpOverflow();\n\n    /// @dev The operation failed, as the output exceeds the maximum value of uint256.\n    error FactorialOverflow();\n\n    /// @dev The operation failed, due to an overflow.\n    error RPowOverflow();\n\n    /// @dev The mantissa is too big to fit.\n    error MantissaOverflow();\n\n    /// @dev The operation failed, due to an multiplication overflow.\n    error MulWadFailed();\n\n    /// @dev The operation failed, due to an multiplication overflow.\n    error SMulWadFailed();\n\n    /// @dev The operation failed, either due to a multiplication overflow, or a division by a zero.\n    error DivWadFailed();\n\n    /// @dev The operation failed, either due to a multiplication overflow, or a division by a zero.\n    error SDivWadFailed();\n\n    /// @dev The operation failed, either due to a multiplication overflow, or a division by a zero.\n    error MulDivFailed();\n\n    /// @dev The division failed, as the denominator is zero.\n    error DivFailed();\n\n    /// @dev The full precision multiply-divide operation failed, either due\n    /// to the result being larger than 256 bits, or a division by a zero.\n    error FullMulDivFailed();\n\n    /// @dev The output is undefined, as the input is less-than-or-equal to zero.\n    error LnWadUndefined();\n\n    /// @dev The input outside the acceptable domain.\n    error OutOfDomain();\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                         CONSTANTS                          */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev The scalar of ETH and most ERC20s.\n    uint256 internal constant WAD = 1e18;\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*              SIMPLIFIED FIXED POINT OPERATIONS             */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down.\n    function mulWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Equivalent to `require(y == 0 || x <= type(uint256).max / y)`.\n            if gt(x, div(not(0), y)) {\n                if y {\n                    mstore(0x00, 0xbac65e5b) // `MulWadFailed()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n            z := div(mul(x, y), WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down.\n    function sMulWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require((x == 0 || z / x == y) && !(x == -1 && y == type(int256).min))`.\n            if iszero(gt(or(iszero(x), eq(sdiv(z, x), y)), lt(not(x), eq(y, shl(255, 1))))) {\n                mstore(0x00, 0xedcd4dd4) // `SMulWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := sdiv(z, WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down, but without overflow checks.\n    function rawMulWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := div(mul(x, y), WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded down, but without overflow checks.\n    function rawSMulWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sdiv(mul(x, y), WAD)\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded up.\n    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require(y == 0 || x <= type(uint256).max / y)`.\n            if iszero(eq(div(z, y), x)) {\n                if y {\n                    mstore(0x00, 0xbac65e5b) // `MulWadFailed()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n            z := add(iszero(iszero(mod(z, WAD))), div(z, WAD))\n        }\n    }\n\n    /// @dev Equivalent to `(x * y) / WAD` rounded up, but without overflow checks.\n    function rawMulWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(iszero(iszero(mod(mul(x, y), WAD))), div(mul(x, y), WAD))\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down.\n    function divWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Equivalent to `require(y != 0 && x <= type(uint256).max / WAD)`.\n            if iszero(mul(y, lt(x, add(1, div(not(0), WAD))))) {\n                mstore(0x00, 0x7c5f487d) // `DivWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := div(mul(x, WAD), y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down.\n    function sDivWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, WAD)\n            // Equivalent to `require(y != 0 && ((x * WAD) / WAD == x))`.\n            if iszero(mul(y, eq(sdiv(z, WAD), x))) {\n                mstore(0x00, 0x5c43740d) // `SDivWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := sdiv(z, y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down, but without overflow and divide by zero checks.\n    function rawDivWad(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := div(mul(x, WAD), y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded down, but without overflow and divide by zero checks.\n    function rawSDivWad(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sdiv(mul(x, WAD), y)\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded up.\n    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Equivalent to `require(y != 0 && x <= type(uint256).max / WAD)`.\n            if iszero(mul(y, lt(x, add(1, div(not(0), WAD))))) {\n                mstore(0x00, 0x7c5f487d) // `DivWadFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := add(iszero(iszero(mod(mul(x, WAD), y))), div(mul(x, WAD), y))\n        }\n    }\n\n    /// @dev Equivalent to `(x * WAD) / y` rounded up, but without overflow and divide by zero checks.\n    function rawDivWadUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(iszero(iszero(mod(mul(x, WAD), y))), div(mul(x, WAD), y))\n        }\n    }\n\n    /// @dev Equivalent to `x` to the power of `y`.\n    /// because `x ** y = (e ** ln(x)) ** y = e ** (ln(x) * y)`.\n    /// Note: This function is an approximation.\n    function powWad(int256 x, int256 y) internal pure returns (int256) {\n        // Using `ln(x)` means `x` must be greater than 0.\n        return expWad((lnWad(x) * y) / int256(WAD));\n    }\n\n    /// @dev Returns `exp(x)`, denominated in `WAD`.\n    /// Credit to Remco Bloemen under MIT license: https://2π.com/22/exp-ln\n    /// Note: This function is an approximation. Monotonically increasing.\n    function expWad(int256 x) internal pure returns (int256 r) {\n        unchecked {\n            // When the result is less than 0.5 we return zero.\n            // This happens when `x <= (log(1e-18) * 1e18) ~ -4.15e19`.\n            if (x <= -41446531673892822313) return r;\n\n            /// @solidity memory-safe-assembly\n            assembly {\n                // When the result is greater than `(2**255 - 1) / 1e18` we can not represent it as\n                // an int. This happens when `x >= floor(log((2**255 - 1) / 1e18) * 1e18) ≈ 135`.\n                if iszero(slt(x, 135305999368893231589)) {\n                    mstore(0x00, 0xa37bfec9) // `ExpOverflow()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n\n            // `x` is now in the range `(-42, 136) * 1e18`. Convert to `(-42, 136) * 2**96`\n            // for more intermediate precision and a binary basis. This base conversion\n            // is a multiplication by 1e18 / 2**96 = 5**18 / 2**78.\n            x = (x << 78) / 5 ** 18;\n\n            // Reduce range of x to (-½ ln 2, ½ ln 2) * 2**96 by factoring out powers\n            // of two such that exp(x) = exp(x') * 2**k, where k is an integer.\n            // Solving this gives k = round(x / log(2)) and x' = x - k * log(2).\n            int256 k = ((x << 96) / 54916777467707473351141471128 + 2 ** 95) >> 96;\n            x = x - k * 54916777467707473351141471128;\n\n            // `k` is in the range `[-61, 195]`.\n\n            // Evaluate using a (6, 7)-term rational approximation.\n            // `p` is made monic, we'll multiply by a scale factor later.\n            int256 y = x + 1346386616545796478920950773328;\n            y = ((y * x) >> 96) + 57155421227552351082224309758442;\n            int256 p = y + x - 94201549194550492254356042504812;\n            p = ((p * y) >> 96) + 28719021644029726153956944680412240;\n            p = p * x + (4385272521454847904659076985693276 << 96);\n\n            // We leave `p` in `2**192` basis so we don't need to scale it back up for the division.\n            int256 q = x - 2855989394907223263936484059900;\n            q = ((q * x) >> 96) + 50020603652535783019961831881945;\n            q = ((q * x) >> 96) - 533845033583426703283633433725380;\n            q = ((q * x) >> 96) + 3604857256930695427073651918091429;\n            q = ((q * x) >> 96) - 14423608567350463180887372962807573;\n            q = ((q * x) >> 96) + 26449188498355588339934803723976023;\n\n            /// @solidity memory-safe-assembly\n            assembly {\n                // Div in assembly because solidity adds a zero check despite the unchecked.\n                // The q polynomial won't have zeros in the domain as all its roots are complex.\n                // No scaling is necessary because p is already `2**96` too large.\n                r := sdiv(p, q)\n            }\n\n            // r should be in the range `(0.09, 0.25) * 2**96`.\n\n            // We now need to multiply r by:\n            // - The scale factor `s ≈ 6.031367120`.\n            // - The `2**k` factor from the range reduction.\n            // - The `1e18 / 2**96` factor for base conversion.\n            // We do this all at once, with an intermediate result in `2**213`\n            // basis, so the final right shift is always by a positive amount.\n            r = int256(\n                (uint256(r) * 3822833074963236453042738258902158003155416615667) >> uint256(195 - k)\n            );\n        }\n    }\n\n    /// @dev Returns `ln(x)`, denominated in `WAD`.\n    /// Credit to Remco Bloemen under MIT license: https://2π.com/22/exp-ln\n    /// Note: This function is an approximation. Monotonically increasing.\n    function lnWad(int256 x) internal pure returns (int256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // We want to convert `x` from `10**18` fixed point to `2**96` fixed point.\n            // We do this by multiplying by `2**96 / 10**18`. But since\n            // `ln(x * C) = ln(x) + ln(C)`, we can simply do nothing here\n            // and add `ln(2**96 / 10**18)` at the end.\n\n            // Compute `k = log2(x) - 96`, `r = 159 - k = 255 - log2(x) = 255 ^ log2(x)`.\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // We place the check here for more optimal stack operations.\n            if iszero(sgt(x, 0)) {\n                mstore(0x00, 0x1615e638) // `LnWadUndefined()`.\n                revert(0x1c, 0x04)\n            }\n            // forgefmt: disable-next-item\n            r := xor(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0xf8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff))\n\n            // Reduce range of x to (1, 2) * 2**96\n            // ln(2^k * x) = k * ln(2) + ln(x)\n            x := shr(159, shl(r, x))\n\n            // Evaluate using a (8, 8)-term rational approximation.\n            // `p` is made monic, we will multiply by a scale factor later.\n            // forgefmt: disable-next-item\n            let p := sub( // This heavily nested expression is to avoid stack-too-deep for via-ir.\n                sar(96, mul(add(43456485725739037958740375743393,\n                sar(96, mul(add(24828157081833163892658089445524,\n                sar(96, mul(add(3273285459638523848632254066296,\n                    x), x))), x))), x)), 11111509109440967052023855526967)\n            p := sub(sar(96, mul(p, x)), 45023709667254063763336534515857)\n            p := sub(sar(96, mul(p, x)), 14706773417378608786704636184526)\n            p := sub(mul(p, x), shl(96, 795164235651350426258249787498))\n            // We leave `p` in `2**192` basis so we don't need to scale it back up for the division.\n\n            // `q` is monic by convention.\n            let q := add(5573035233440673466300451813936, x)\n            q := add(71694874799317883764090561454958, sar(96, mul(x, q)))\n            q := add(283447036172924575727196451306956, sar(96, mul(x, q)))\n            q := add(401686690394027663651624208769553, sar(96, mul(x, q)))\n            q := add(204048457590392012362485061816622, sar(96, mul(x, q)))\n            q := add(31853899698501571402653359427138, sar(96, mul(x, q)))\n            q := add(909429971244387300277376558375, sar(96, mul(x, q)))\n\n            // `p / q` is in the range `(0, 0.125) * 2**96`.\n\n            // Finalization, we need to:\n            // - Multiply by the scale factor `s = 5.549…`.\n            // - Add `ln(2**96 / 10**18)`.\n            // - Add `k * ln(2)`.\n            // - Multiply by `10**18 / 2**96 = 5**18 >> 78`.\n\n            // The q polynomial is known not to have zeros in the domain.\n            // No scaling required because p is already `2**96` too large.\n            p := sdiv(p, q)\n            // Multiply by the scaling factor: `s * 5**18 * 2**96`, base is now `5**18 * 2**192`.\n            p := mul(1677202110996718588342820967067443963516166, p)\n            // Add `ln(2) * k * 5**18 * 2**192`.\n            // forgefmt: disable-next-item\n            p := add(mul(16597577552685614221487285958193947469193820559219878177908093499208371, sub(159, r)), p)\n            // Add `ln(2**96 / 10**18) * 5**18 * 2**192`.\n            p := add(600920179829731861736702779321621459595472258049074101567377883020018308, p)\n            // Base conversion: mul `2**18 / 2**192`.\n            r := sar(174, p)\n        }\n    }\n\n    /// @dev Returns `W_0(x)`, denominated in `WAD`.\n    /// See: https://en.wikipedia.org/wiki/Lambert_W_function\n    /// a.k.a. Product log function. This is an approximation of the principal branch.\n    /// Note: This function is an approximation. Monotonically increasing.\n    function lambertW0Wad(int256 x) internal pure returns (int256 w) {\n        // forgefmt: disable-next-item\n        unchecked {\n            if ((w = x) <= -367879441171442322) revert OutOfDomain(); // `x` less than `-1/e`.\n            (int256 wad, int256 p) = (int256(WAD), x);\n            uint256 c; // Whether we need to avoid catastrophic cancellation.\n            uint256 i = 4; // Number of iterations.\n            if (w <= 0x1ffffffffffff) {\n                if (-0x4000000000000 <= w) {\n                    i = 1; // Inputs near zero only take one step to converge.\n                } else if (w <= -0x3ffffffffffffff) {\n                    i = 32; // Inputs near `-1/e` take very long to converge.\n                }\n            } else if (uint256(w >> 63) == uint256(0)) {\n                /// @solidity memory-safe-assembly\n                assembly {\n                    // Inline log2 for more performance, since the range is small.\n                    let v := shr(49, w)\n                    let l := shl(3, lt(0xff, v))\n                    l := add(or(l, byte(and(0x1f, shr(shr(l, v), 0x8421084210842108cc6318c6db6d54be)),\n                        0x0706060506020504060203020504030106050205030304010505030400000000)), 49)\n                    w := sdiv(shl(l, 7), byte(sub(l, 31), 0x0303030303030303040506080c13))\n                    c := gt(l, 60)\n                    i := add(2, add(gt(l, 53), c))\n                }\n            } else {\n                int256 ll = lnWad(w = lnWad(w));\n                /// @solidity memory-safe-assembly\n                assembly {\n                    // `w = ln(x) - ln(ln(x)) + b * ln(ln(x)) / ln(x)`.\n                    w := add(sdiv(mul(ll, 1023715080943847266), w), sub(w, ll))\n                    i := add(3, iszero(shr(68, x)))\n                    c := iszero(shr(143, x))\n                }\n                if (c == uint256(0)) {\n                    do { // If `x` is big, use Newton's so that intermediate values won't overflow.\n                        int256 e = expWad(w);\n                        /// @solidity memory-safe-assembly\n                        assembly {\n                            let t := mul(w, div(e, wad))\n                            w := sub(w, sdiv(sub(t, x), div(add(e, t), wad)))\n                        }\n                        if (p <= w) break;\n                        p = w;\n                    } while (--i != uint256(0));\n                    /// @solidity memory-safe-assembly\n                    assembly {\n                        w := sub(w, sgt(w, 2))\n                    }\n                    return w;\n                }\n            }\n            do { // Otherwise, use Halley's for faster convergence.\n                int256 e = expWad(w);\n                /// @solidity memory-safe-assembly\n                assembly {\n                    let t := add(w, wad)\n                    let s := sub(mul(w, e), mul(x, wad))\n                    w := sub(w, sdiv(mul(s, wad), sub(mul(e, t), sdiv(mul(add(t, wad), s), add(t, t)))))\n                }\n                if (p <= w) break;\n                p = w;\n            } while (--i != c);\n            /// @solidity memory-safe-assembly\n            assembly {\n                w := sub(w, sgt(w, 2))\n            }\n            // For certain ranges of `x`, we'll use the quadratic-rate recursive formula of\n            // R. Iacono and J.P. Boyd for the last iteration, to avoid catastrophic cancellation.\n            if (c == uint256(0)) return w;\n            int256 t = w | 1;\n            /// @solidity memory-safe-assembly\n            assembly {\n                x := sdiv(mul(x, wad), t)\n            }\n            x = (t * (wad + lnWad(x)));\n            /// @solidity memory-safe-assembly\n            assembly {\n                w := sdiv(x, add(wad, t))\n            }\n        }\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                  GENERAL NUMBER UTILITIES                  */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns `a * b == x * y`, with full precision.\n    function fullMulEq(uint256 a, uint256 b, uint256 x, uint256 y)\n        internal\n        pure\n        returns (bool result)\n    {\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := and(eq(mul(a, b), mul(x, y)), eq(mulmod(x, y, not(0)), mulmod(a, b, not(0))))\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / d)` with full precision.\n    /// Throws if result overflows a uint256 or when `d` is zero.\n    /// Credit to Remco Bloemen under MIT license: https://2π.com/21/muldiv\n    function fullMulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // 512-bit multiply `[p1 p0] = x * y`.\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 = p1 * 2**256 + p0`.\n\n            // Temporarily use `z` as `p0` to save gas.\n            z := mul(x, y) // Lower 256 bits of `x * y`.\n            for {} 1 {} {\n                // If overflows.\n                if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {\n                    let mm := mulmod(x, y, not(0))\n                    let p1 := sub(mm, add(z, lt(mm, z))) // Upper 256 bits of `x * y`.\n\n                    /*------------------- 512 by 256 division --------------------*/\n\n                    // Make division exact by subtracting the remainder from `[p1 p0]`.\n                    let r := mulmod(x, y, d) // Compute remainder using mulmod.\n                    let t := and(d, sub(0, d)) // The least significant bit of `d`. `t >= 1`.\n                    // Make sure `z` is less than `2**256`. Also prevents `d == 0`.\n                    // Placing the check here seems to give more optimal stack operations.\n                    if iszero(gt(d, p1)) {\n                        mstore(0x00, 0xae47f702) // `FullMulDivFailed()`.\n                        revert(0x1c, 0x04)\n                    }\n                    d := div(d, t) // Divide `d` by `t`, which is a power of two.\n                    // Invert `d mod 2**256`\n                    // Now that `d` is an odd number, it has an inverse\n                    // modulo `2**256` such that `d * inv = 1 mod 2**256`.\n                    // Compute the inverse by starting with a seed that is correct\n                    // correct for four bits. That is, `d * inv = 1 mod 2**4`.\n                    let inv := xor(2, mul(3, d))\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 := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**8\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**16\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**32\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**64\n                    inv := mul(inv, sub(2, mul(d, inv))) // inverse mod 2**128\n                    z :=\n                        mul(\n                            // Divide [p1 p0] by the factors of two.\n                            // Shift in bits from `p1` into `p0`. For this we need\n                            // to flip `t` such that it is `2**256 / t`.\n                            or(mul(sub(p1, gt(r, z)), add(div(sub(0, t), t), 1)), div(sub(z, r), t)),\n                            mul(sub(2, mul(d, inv)), inv) // inverse mod 2**256\n                        )\n                    break\n                }\n                z := div(z, d)\n                break\n            }\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / d)` with full precision.\n    /// Behavior is undefined if `d` is zero or the final result cannot fit in 256 bits.\n    /// Performs the full 512 bit calculation regardless.\n    function fullMulDivUnchecked(uint256 x, uint256 y, uint256 d)\n        internal\n        pure\n        returns (uint256 z)\n    {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            let mm := mulmod(x, y, not(0))\n            let p1 := sub(mm, add(z, lt(mm, z)))\n            let t := and(d, sub(0, d))\n            let r := mulmod(x, y, d)\n            d := div(d, t)\n            let inv := xor(2, mul(3, d))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            inv := mul(inv, sub(2, mul(d, inv)))\n            z :=\n                mul(\n                    or(mul(sub(p1, gt(r, z)), add(div(sub(0, t), t), 1)), div(sub(z, r), t)),\n                    mul(sub(2, mul(d, inv)), inv)\n                )\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / d)` with full precision, rounded up.\n    /// Throws if result overflows a uint256 or when `d` is zero.\n    /// Credit to Uniswap-v3-core under MIT license:\n    /// https://github.com/Uniswap/v3-core/blob/main/contracts/libraries/FullMath.sol\n    function fullMulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        z = fullMulDiv(x, y, d);\n        /// @solidity memory-safe-assembly\n        assembly {\n            if mulmod(x, y, d) {\n                z := add(z, 1)\n                if iszero(z) {\n                    mstore(0x00, 0xae47f702) // `FullMulDivFailed()`.\n                    revert(0x1c, 0x04)\n                }\n            }\n        }\n    }\n\n    /// @dev Calculates `floor(x * y / 2 ** n)` with full precision.\n    /// Throws if result overflows a uint256.\n    /// Credit to Philogy under MIT license:\n    /// https://github.com/SorellaLabs/angstrom/blob/main/contracts/src/libraries/X128MathLib.sol\n    function fullMulDivN(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // Temporarily use `z` as `p0` to save gas.\n            z := mul(x, y) // Lower 256 bits of `x * y`. We'll call this `z`.\n            for {} 1 {} {\n                if iszero(or(iszero(x), eq(div(z, x), y))) {\n                    let k := and(n, 0xff) // `n`, cleaned.\n                    let mm := mulmod(x, y, not(0))\n                    let p1 := sub(mm, add(z, lt(mm, z))) // Upper 256 bits of `x * y`.\n                    //         |      p1     |      z     |\n                    // Before: | p1_0 ¦ p1_1 | z_0  ¦ z_1 |\n                    // Final:  |   0  ¦ p1_0 | p1_1 ¦ z_0 |\n                    // Check that final `z` doesn't overflow by checking that p1_0 = 0.\n                    if iszero(shr(k, p1)) {\n                        z := add(shl(sub(256, k), p1), shr(k, z))\n                        break\n                    }\n                    mstore(0x00, 0xae47f702) // `FullMulDivFailed()`.\n                    revert(0x1c, 0x04)\n                }\n                z := shr(and(n, 0xff), z)\n                break\n            }\n        }\n    }\n\n    /// @dev Returns `floor(x * y / d)`.\n    /// Reverts if `x * y` overflows, or `d` is zero.\n    function mulDiv(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require(d != 0 && (y == 0 || x <= type(uint256).max / y))`.\n            if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {\n                mstore(0x00, 0xad251c27) // `MulDivFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := div(z, d)\n        }\n    }\n\n    /// @dev Returns `ceil(x * y / d)`.\n    /// Reverts if `x * y` overflows, or `d` is zero.\n    function mulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(x, y)\n            // Equivalent to `require(d != 0 && (y == 0 || x <= type(uint256).max / y))`.\n            if iszero(mul(or(iszero(x), eq(div(z, x), y)), d)) {\n                mstore(0x00, 0xad251c27) // `MulDivFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := add(iszero(iszero(mod(z, d))), div(z, d))\n        }\n    }\n\n    /// @dev Returns `x`, the modular multiplicative inverse of `a`, such that `(a * x) % n == 1`.\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256 x) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            let g := n\n            let r := mod(a, n)\n            for { let y := 1 } 1 {} {\n                let q := div(g, r)\n                let t := g\n                g := r\n                r := sub(t, mul(r, q))\n                let u := x\n                x := y\n                y := sub(u, mul(y, q))\n                if iszero(r) { break }\n            }\n            x := mul(eq(g, 1), add(x, mul(slt(x, 0), n)))\n        }\n    }\n\n    /// @dev Returns `ceil(x / d)`.\n    /// Reverts if `d` is zero.\n    function divUp(uint256 x, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            if iszero(d) {\n                mstore(0x00, 0x65244e4e) // `DivFailed()`.\n                revert(0x1c, 0x04)\n            }\n            z := add(iszero(iszero(mod(x, d))), div(x, d))\n        }\n    }\n\n    /// @dev Returns `max(0, x - y)`. Alias for `saturatingSub`.\n    function zeroFloorSub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(gt(x, y), sub(x, y))\n        }\n    }\n\n    /// @dev Returns `max(0, x - y)`.\n    function saturatingSub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(gt(x, y), sub(x, y))\n        }\n    }\n\n    /// @dev Returns `min(2 ** 256 - 1, x + y)`.\n    function saturatingAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(sub(0, lt(add(x, y), x)), add(x, y))\n        }\n    }\n\n    /// @dev Returns `min(2 ** 256 - 1, x * y)`.\n    function saturatingMul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(sub(or(iszero(x), eq(div(mul(x, y), x), y)), 1), mul(x, y))\n        }\n    }\n\n    /// @dev Returns `condition ? x : y`, without branching.\n    function ternary(bool condition, uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), iszero(condition)))\n        }\n    }\n\n    /// @dev Returns `condition ? x : y`, without branching.\n    function ternary(bool condition, bytes32 x, bytes32 y) internal pure returns (bytes32 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), iszero(condition)))\n        }\n    }\n\n    /// @dev Returns `condition ? x : y`, without branching.\n    function ternary(bool condition, address x, address y) internal pure returns (address z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), iszero(condition)))\n        }\n    }\n\n    /// @dev Returns `x != 0 ? x : y`, without branching.\n    function coalesce(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(x, mul(y, iszero(x)))\n        }\n    }\n\n    /// @dev Returns `x != bytes32(0) ? x : y`, without branching.\n    function coalesce(bytes32 x, bytes32 y) internal pure returns (bytes32 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(x, mul(y, iszero(x)))\n        }\n    }\n\n    /// @dev Returns `x != address(0) ? x : y`, without branching.\n    function coalesce(address x, address y) internal pure returns (address z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := or(x, mul(y, iszero(shl(96, x))))\n        }\n    }\n\n    /// @dev Exponentiate `x` to `y` by squaring, denominated in base `b`.\n    /// Reverts if the computation overflows.\n    function rpow(uint256 x, uint256 y, uint256 b) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mul(b, iszero(y)) // `0 ** 0 = 1`. Otherwise, `0 ** n = 0`.\n            if x {\n                z := xor(b, mul(xor(b, x), and(y, 1))) // `z = isEven(y) ? scale : x`\n                let half := shr(1, b) // Divide `b` by 2.\n                // Divide `y` by 2 every iteration.\n                for { y := shr(1, y) } y { y := shr(1, y) } {\n                    let xx := mul(x, x) // Store x squared.\n                    let xxRound := add(xx, half) // Round to the nearest number.\n                    // Revert if `xx + half` overflowed, or if `x ** 2` overflows.\n                    if or(lt(xxRound, xx), shr(128, x)) {\n                        mstore(0x00, 0x49f7642b) // `RPowOverflow()`.\n                        revert(0x1c, 0x04)\n                    }\n                    x := div(xxRound, b) // Set `x` to scaled `xxRound`.\n                    // If `y` is odd:\n                    if and(y, 1) {\n                        let zx := mul(z, x) // Compute `z * x`.\n                        let zxRound := add(zx, half) // Round to the nearest number.\n                        // If `z * x` overflowed or `zx + half` overflowed:\n                        if or(xor(div(zx, x), z), lt(zxRound, zx)) {\n                            // Revert if `x` is non-zero.\n                            if x {\n                                mstore(0x00, 0x49f7642b) // `RPowOverflow()`.\n                                revert(0x1c, 0x04)\n                            }\n                        }\n                        z := div(zxRound, b) // Return properly scaled `zxRound`.\n                    }\n                }\n            }\n        }\n    }\n\n    /// @dev Returns the square root of `x`, rounded down.\n    function sqrt(uint256 x) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            // `floor(sqrt(2**15)) = 181`. `sqrt(2**15) - 181 = 2.84`.\n            z := 181 // The \"correct\" value is 1, but this saves a multiplication later.\n\n            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad\n            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.\n\n            // Let `y = x / 2**r`. We check `y >= 2**(k + 8)`\n            // but shift right by `k` bits to ensure that if `x >= 256`, then `y >= 256`.\n            let r := shl(7, lt(0xffffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffffff, shr(r, x))))\n            z := shl(shr(1, r), z)\n\n            // Goal was to get `z*z*y` within a small factor of `x`. More iterations could\n            // get y in a tighter range. Currently, we will have y in `[256, 256*(2**16))`.\n            // We ensured `y >= 256` so that the relative difference between `y` and `y+1` is small.\n            // That's not possible if `x < 256` but we can just verify those cases exhaustively.\n\n            // Now, `z*z*y <= x < z*z*(y+1)`, and `y <= 2**(16+8)`, and either `y >= 256`, or `x < 256`.\n            // Correctness can be checked exhaustively for `x < 256`, so we assume `y >= 256`.\n            // Then `z*sqrt(y)` is within `sqrt(257)/sqrt(256)` of `sqrt(x)`, or about 20bps.\n\n            // For `s` in the range `[1/256, 256]`, the estimate `f(s) = (181/1024) * (s+1)`\n            // is in the range `(1/2.84 * sqrt(s), 2.84 * sqrt(s))`,\n            // with largest error when `s = 1` and when `s = 256` or `1/256`.\n\n            // Since `y` is in `[256, 256*(2**16))`, let `a = y/65536`, so that `a` is in `[1/256, 256)`.\n            // Then we can estimate `sqrt(y)` using\n            // `sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2**18`.\n\n            // There is no overflow risk here since `y < 2**136` after the first branch above.\n            z := shr(18, mul(z, add(shr(r, x), 65536))) // A `mul()` is saved from starting `z` at 181.\n\n            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n            z := shr(1, add(z, div(x, z)))\n\n            // If `x+1` is a perfect square, the Babylonian method cycles between\n            // `floor(sqrt(x))` and `ceil(sqrt(x))`. This statement ensures we return floor.\n            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division\n            z := sub(z, lt(div(x, z), z))\n        }\n    }\n\n    /// @dev Returns the cube root of `x`, rounded down.\n    /// Credit to bout3fiddy and pcaversaccio under AGPLv3 license:\n    /// https://github.com/pcaversaccio/snekmate/blob/main/src/snekmate/utils/math.vy\n    /// Formally verified by xuwinnie:\n    /// https://github.com/vectorized/solady/blob/main/audits/xuwinnie-solady-cbrt-proof.pdf\n    function cbrt(uint256 x) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            let r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // Makeshift lookup table to nudge the approximate log2 result.\n            z := div(shl(div(r, 3), shl(lt(0xf, shr(r, x)), 0xf)), xor(7, mod(r, 3)))\n            // Newton-Raphson's.\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            z := div(add(add(div(x, mul(z, z)), z), z), 3)\n            // Round down.\n            z := sub(z, lt(div(x, mul(z, z)), z))\n        }\n    }\n\n    /// @dev Returns the square root of `x`, denominated in `WAD`, rounded down.\n    function sqrtWad(uint256 x) internal pure returns (uint256 z) {\n        unchecked {\n            if (x <= type(uint256).max / 10 ** 18) return sqrt(x * 10 ** 18);\n            z = (1 + sqrt(x)) * 10 ** 9;\n            z = (fullMulDivUnchecked(x, 10 ** 18, z) + z) >> 1;\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sub(z, gt(999999999999999999, sub(mulmod(z, z, x), 1))) // Round down.\n        }\n    }\n\n    /// @dev Returns the cube root of `x`, denominated in `WAD`, rounded down.\n    /// Formally verified by xuwinnie:\n    /// https://github.com/vectorized/solady/blob/main/audits/xuwinnie-solady-cbrt-proof.pdf\n    function cbrtWad(uint256 x) internal pure returns (uint256 z) {\n        unchecked {\n            if (x <= type(uint256).max / 10 ** 36) return cbrt(x * 10 ** 36);\n            z = (1 + cbrt(x)) * 10 ** 12;\n            z = (fullMulDivUnchecked(x, 10 ** 36, z * z) + z + z) / 3;\n        }\n        /// @solidity memory-safe-assembly\n        assembly {\n            let p := x\n            for {} 1 {} {\n                if iszero(shr(229, p)) {\n                    if iszero(shr(199, p)) {\n                        p := mul(p, 100000000000000000) // 10 ** 17.\n                        break\n                    }\n                    p := mul(p, 100000000) // 10 ** 8.\n                    break\n                }\n                if iszero(shr(249, p)) { p := mul(p, 100) }\n                break\n            }\n            let t := mulmod(mul(z, z), z, p)\n            z := sub(z, gt(lt(t, shr(1, p)), iszero(t))) // Round down.\n        }\n    }\n\n    /// @dev Returns the factorial of `x`.\n    function factorial(uint256 x) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := 1\n            if iszero(lt(x, 58)) {\n                mstore(0x00, 0xaba0f2a2) // `FactorialOverflow()`.\n                revert(0x1c, 0x04)\n            }\n            for {} x { x := sub(x, 1) } { z := mul(z, x) }\n        }\n    }\n\n    /// @dev Returns the log2 of `x`.\n    /// Equivalent to computing the index of the most significant bit (MSB) of `x`.\n    /// Returns 0 if `x` is zero.\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0x0706060506020504060203020504030106050205030304010505030400000000))\n        }\n    }\n\n    /// @dev Returns the log2 of `x`, rounded up.\n    /// Returns 0 if `x` is zero.\n    function log2Up(uint256 x) internal pure returns (uint256 r) {\n        r = log2(x);\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := add(r, lt(shl(r, 1), x))\n        }\n    }\n\n    /// @dev Returns the log10 of `x`.\n    /// Returns 0 if `x` is zero.\n    function log10(uint256 x) internal pure returns (uint256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            if iszero(lt(x, 100000000000000000000000000000000000000)) {\n                x := div(x, 100000000000000000000000000000000000000)\n                r := 38\n            }\n            if iszero(lt(x, 100000000000000000000)) {\n                x := div(x, 100000000000000000000)\n                r := add(r, 20)\n            }\n            if iszero(lt(x, 10000000000)) {\n                x := div(x, 10000000000)\n                r := add(r, 10)\n            }\n            if iszero(lt(x, 100000)) {\n                x := div(x, 100000)\n                r := add(r, 5)\n            }\n            r := add(r, add(gt(x, 9), add(gt(x, 99), add(gt(x, 999), gt(x, 9999)))))\n        }\n    }\n\n    /// @dev Returns the log10 of `x`, rounded up.\n    /// Returns 0 if `x` is zero.\n    function log10Up(uint256 x) internal pure returns (uint256 r) {\n        r = log10(x);\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := add(r, lt(exp(10, r), x))\n        }\n    }\n\n    /// @dev Returns the log256 of `x`.\n    /// Returns 0 if `x` is zero.\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(shr(3, r), lt(0xff, shr(r, x)))\n        }\n    }\n\n    /// @dev Returns the log256 of `x`, rounded up.\n    /// Returns 0 if `x` is zero.\n    function log256Up(uint256 x) internal pure returns (uint256 r) {\n        r = log256(x);\n        /// @solidity memory-safe-assembly\n        assembly {\n            r := add(r, lt(shl(shl(3, r), 1), x))\n        }\n    }\n\n    /// @dev Returns the scientific notation format `mantissa * 10 ** exponent` of `x`.\n    /// Useful for compressing prices (e.g. using 25 bit mantissa and 7 bit exponent).\n    function sci(uint256 x) internal pure returns (uint256 mantissa, uint256 exponent) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            mantissa := x\n            if mantissa {\n                if iszero(mod(mantissa, 1000000000000000000000000000000000)) {\n                    mantissa := div(mantissa, 1000000000000000000000000000000000)\n                    exponent := 33\n                }\n                if iszero(mod(mantissa, 10000000000000000000)) {\n                    mantissa := div(mantissa, 10000000000000000000)\n                    exponent := add(exponent, 19)\n                }\n                if iszero(mod(mantissa, 1000000000000)) {\n                    mantissa := div(mantissa, 1000000000000)\n                    exponent := add(exponent, 12)\n                }\n                if iszero(mod(mantissa, 1000000)) {\n                    mantissa := div(mantissa, 1000000)\n                    exponent := add(exponent, 6)\n                }\n                if iszero(mod(mantissa, 10000)) {\n                    mantissa := div(mantissa, 10000)\n                    exponent := add(exponent, 4)\n                }\n                if iszero(mod(mantissa, 100)) {\n                    mantissa := div(mantissa, 100)\n                    exponent := add(exponent, 2)\n                }\n                if iszero(mod(mantissa, 10)) {\n                    mantissa := div(mantissa, 10)\n                    exponent := add(exponent, 1)\n                }\n            }\n        }\n    }\n\n    /// @dev Convenience function for packing `x` into a smaller number using `sci`.\n    /// The `mantissa` will be in bits [7..255] (the upper 249 bits).\n    /// The `exponent` will be in bits [0..6] (the lower 7 bits).\n    /// Use `SafeCastLib` to safely ensure that the `packed` number is small\n    /// enough to fit in the desired unsigned integer type:\n    /// ```\n    ///     uint32 packed = SafeCastLib.toUint32(FixedPointMathLib.packSci(777 ether));\n    /// ```\n    function packSci(uint256 x) internal pure returns (uint256 packed) {\n        (x, packed) = sci(x); // Reuse for `mantissa` and `exponent`.\n        /// @solidity memory-safe-assembly\n        assembly {\n            if shr(249, x) {\n                mstore(0x00, 0xce30380c) // `MantissaOverflow()`.\n                revert(0x1c, 0x04)\n            }\n            packed := or(shl(7, x), packed)\n        }\n    }\n\n    /// @dev Convenience function for unpacking a packed number from `packSci`.\n    function unpackSci(uint256 packed) internal pure returns (uint256 unpacked) {\n        unchecked {\n            unpacked = (packed >> 7) * 10 ** (packed & 0x7f);\n        }\n    }\n\n    /// @dev Returns the average of `x` and `y`. Rounds towards zero.\n    function avg(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = (x & y) + ((x ^ y) >> 1);\n        }\n    }\n\n    /// @dev Returns the average of `x` and `y`. Rounds towards negative infinity.\n    function avg(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = (x >> 1) + (y >> 1) + (x & y & 1);\n        }\n    }\n\n    /// @dev Returns the absolute value of `x`.\n    function abs(int256 x) internal pure returns (uint256 z) {\n        unchecked {\n            z = (uint256(x) + uint256(x >> 255)) ^ uint256(x >> 255);\n        }\n    }\n\n    /// @dev Returns the absolute distance between `x` and `y`.\n    function dist(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(xor(sub(0, gt(x, y)), sub(y, x)), gt(x, y))\n        }\n    }\n\n    /// @dev Returns the absolute distance between `x` and `y`.\n    function dist(int256 x, int256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := add(xor(sub(0, sgt(x, y)), sub(y, x)), sgt(x, y))\n        }\n    }\n\n    /// @dev Returns the minimum of `x` and `y`.\n    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), lt(y, x)))\n        }\n    }\n\n    /// @dev Returns the minimum of `x` and `y`.\n    function min(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), slt(y, x)))\n        }\n    }\n\n    /// @dev Returns the maximum of `x` and `y`.\n    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), gt(y, x)))\n        }\n    }\n\n    /// @dev Returns the maximum of `x` and `y`.\n    function max(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, y), sgt(y, x)))\n        }\n    }\n\n    /// @dev Returns `x`, bounded to `minValue` and `maxValue`.\n    function clamp(uint256 x, uint256 minValue, uint256 maxValue)\n        internal\n        pure\n        returns (uint256 z)\n    {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, minValue), gt(minValue, x)))\n            z := xor(z, mul(xor(z, maxValue), lt(maxValue, z)))\n        }\n    }\n\n    /// @dev Returns `x`, bounded to `minValue` and `maxValue`.\n    function clamp(int256 x, int256 minValue, int256 maxValue) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := xor(x, mul(xor(x, minValue), sgt(minValue, x)))\n            z := xor(z, mul(xor(z, maxValue), slt(maxValue, z)))\n        }\n    }\n\n    /// @dev Returns greatest common divisor of `x` and `y`.\n    function gcd(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            for { z := x } y {} {\n                let t := y\n                y := mod(z, y)\n                z := t\n            }\n        }\n    }\n\n    /// @dev Returns `a + (b - a) * (t - begin) / (end - begin)`,\n    /// with `t` clamped between `begin` and `end` (inclusive).\n    /// Agnostic to the order of (`a`, `b`) and (`end`, `begin`).\n    /// If `begins == end`, returns `t <= begin ? a : b`.\n    function lerp(uint256 a, uint256 b, uint256 t, uint256 begin, uint256 end)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (begin > end) (t, begin, end) = (~t, ~begin, ~end);\n        if (t <= begin) return a;\n        if (t >= end) return b;\n        unchecked {\n            if (b >= a) return a + fullMulDiv(b - a, t - begin, end - begin);\n            return a - fullMulDiv(a - b, t - begin, end - begin);\n        }\n    }\n\n    /// @dev Returns `a + (b - a) * (t - begin) / (end - begin)`.\n    /// with `t` clamped between `begin` and `end` (inclusive).\n    /// Agnostic to the order of (`a`, `b`) and (`end`, `begin`).\n    /// If `begins == end`, returns `t <= begin ? a : b`.\n    function lerp(int256 a, int256 b, int256 t, int256 begin, int256 end)\n        internal\n        pure\n        returns (int256)\n    {\n        if (begin > end) (t, begin, end) = (~t, ~begin, ~end);\n        if (t <= begin) return a;\n        if (t >= end) return b;\n        // forgefmt: disable-next-item\n        unchecked {\n            if (b >= a) return int256(uint256(a) + fullMulDiv(uint256(b - a),\n                uint256(t - begin), uint256(end - begin)));\n            return int256(uint256(a) - fullMulDiv(uint256(a - b),\n                uint256(t - begin), uint256(end - begin)));\n        }\n    }\n\n    /// @dev Returns if `x` is an even number. Some people may need this.\n    function isEven(uint256 x) internal pure returns (bool) {\n        return x & uint256(1) == uint256(0);\n    }\n\n    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n    /*                   RAW NUMBER OPERATIONS                    */\n    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n    /// @dev Returns `x + y`, without checking for overflow.\n    function rawAdd(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x + y;\n        }\n    }\n\n    /// @dev Returns `x + y`, without checking for overflow.\n    function rawAdd(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = x + y;\n        }\n    }\n\n    /// @dev Returns `x - y`, without checking for underflow.\n    function rawSub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x - y;\n        }\n    }\n\n    /// @dev Returns `x - y`, without checking for underflow.\n    function rawSub(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = x - y;\n        }\n    }\n\n    /// @dev Returns `x * y`, without checking for overflow.\n    function rawMul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x * y;\n        }\n    }\n\n    /// @dev Returns `x * y`, without checking for overflow.\n    function rawMul(int256 x, int256 y) internal pure returns (int256 z) {\n        unchecked {\n            z = x * y;\n        }\n    }\n\n    /// @dev Returns `x / y`, returning 0 if `y` is zero.\n    function rawDiv(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := div(x, y)\n        }\n    }\n\n    /// @dev Returns `x / y`, returning 0 if `y` is zero.\n    function rawSDiv(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := sdiv(x, y)\n        }\n    }\n\n    /// @dev Returns `x % y`, returning 0 if `y` is zero.\n    function rawMod(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mod(x, y)\n        }\n    }\n\n    /// @dev Returns `x % y`, returning 0 if `y` is zero.\n    function rawSMod(int256 x, int256 y) internal pure returns (int256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := smod(x, y)\n        }\n    }\n\n    /// @dev Returns `(x + y) % d`, return 0 if `d` if zero.\n    function rawAddMod(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := addmod(x, y, d)\n        }\n    }\n\n    /// @dev Returns `(x * y) % d`, return 0 if `d` if zero.\n    function rawMulMod(uint256 x, uint256 y, uint256 d) internal pure returns (uint256 z) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            z := mulmod(x, y, d)\n        }\n    }\n}\n"},"src/common/AccessControlledUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\nimport {IAccessControl} from \"./diamond/facets/access-control/IAccessControl.sol\";\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\n/// @title AccessControlledUpgradeable\n/// @notice Upgradeable base contract for adding access control to non-facet contracts\n/// @dev Use this contract to add access control to upgradeable contracts that are NOT a facet behind a diamond.\n///      The diamond on each chain manages access control for all functions - including token functions.\nabstract contract AccessControlledUpgradeable is Initializable {\n    /// @notice Interface to the AccessControlFacet on the diamond\n    IAccessControl public accessControl;\n\n    /// @notice Initializes the access control system\n    /// @dev Can only be called during contract initialization\n    /// @param _accessControl Address of the AccessControlFacet\n    function __AccessControlled_init(address _accessControl) internal onlyInitializing {\n        require(_accessControl != address(0), \"AC: zero address\");\n        accessControl = IAccessControl(_accessControl);\n    }\n\n    /**\n     * @notice Checks whether a given user has a given role.\n     * @param user The user to check.\n     * @param role The role to check.\n     * @return Whether the user has the role.\n     */\n    function hasRole(address user, uint8 role) internal view returns (bool) {\n        return accessControl.hasRole(user, role);\n    }\n\n    /**\n     * @notice Restricts function access to callers with a specific role\n     * @param role The role required to execute the function\n     */\n    modifier onlyRole(uint8 role) {\n        require(accessControl.hasRole(msg.sender, role), \"AC: unauthorized\");\n        _;\n    }\n\n    /// @notice Restricts function access to authorized callers based on function signature\n    /// @dev Mirrors the facet's `onlyAuthorized` guard by checking if the caller can execute the function\n    modifier onlyAuthorized() {\n        require(accessControl.canCall(msg.sender, msg.sig), \"AC: unauthorized\");\n        _;\n    }\n}\n"},"src/common/diamond/facets/lz-routing/ILZRouting.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\nimport {SendParam, MessagingFee, MessagingReceipt, OFTReceipt} from \"@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol\";\nimport {IOAppCore} from \"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\";\n\n/// @notice Events emitted by LZRoutingFacet.\ninterface ILZRoutingEvents {\n    event HubSent(bytes32 indexed assetId, address indexed from, uint32 indexed dstEid, uint256 amount, bytes32 guid);\n    event HubReceived(bytes32 indexed assetId, address indexed to, uint32 indexed srcEid, uint256 amount, bytes32 guid);\n}\n\n/// @notice Errors thrown by LZRoutingFacet.\ninterface ILZRoutingErrors {\n    error LZRouting_ZeroAddress();\n    error LZRouting_UnknownAsset();\n    error LZRouting_SenderNotRegistered();\n    error LZRouting_SlippageExceeded(uint256 amountReceivedLD, uint256 minAmountLD);\n    /// @dev Alt-fee chains pay in ERC20;\n    error LZRouting_UnexpectedNativeFee();\n}\n\n/**\n * @title ILZRouting\n * @notice Hub-routed cross-chain transfers for dShares on this diamond.\n * @dev Called by DShare IOFT shims. Inbound lzReceive comes through the\n *      parent OAppReceiverUpgradeable.\n *\n *      Amount semantics match DShare's existing OFT config: local decimals 18,\n *      shared decimals 9, so decimalConversionRate is 1e9. Amounts on the wire\n *      are uint64 SD; dust below 1e9 wei is stripped at send. minAmountLD is\n *      enforced for slippage.\n */\ninterface ILZRouting is IOAppCore, ILZRoutingEvents, ILZRoutingErrors {\n    /// @notice Sets the LayerZero delegate. Fixed for the life of the facet.\n    function LZRouting_init(address delegate) external;\n\n    /// @notice Sends a cross-chain transfer for the calling DShare.\n    /// @dev msg.sender is the DShare; we resolve its assetId via the registry,\n    ///      burn from `from` on the source token, encode the payload, lzSend.\n    function LZRouting_hubSend(address from, SendParam calldata sp, MessagingFee calldata fee, address refund)\n        external\n        payable\n        returns (MessagingReceipt memory, OFTReceipt memory);\n\n    /// @notice Quotes the messaging fee for the given asset and send params.\n    function LZRouting_quoteSend(bytes32 assetId, SendParam calldata sp, bool payInLzToken)\n        external\n        view\n        returns (MessagingFee memory fee);\n\n    /// @notice Rotates the LayerZero delegate for this OApp.\n    /// @dev Gated by the diamond's protected modifier\n    function LZRouting_setDelegateOperator(address delegate) external;\n\n    // setPeer / peers / endpoint come from IOAppCore. They must be inherited,\n    // not re-declared: OAppCore exposes `endpoint` as a public immutable, which\n    // can't be overridden, so a manual `endpoint()` here makes the facet\n    // uncompilable.\n}\n"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\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/openzeppelin-contracts/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Return the 512-bit addition of two uint256.\n     *\n     * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n     */\n    function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        assembly (\"memory-safe\") {\n            low := add(a, b)\n            high := lt(low, a)\n        }\n    }\n\n    /**\n     * @dev Return the 512-bit multiplication of two uint256.\n     *\n     * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n     */\n    function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n        // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n        // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n        // variables such that product = high * 2²⁵⁶ + low.\n        assembly (\"memory-safe\") {\n            let mm := mulmod(a, b, not(0))\n            low := mul(a, b)\n            high := sub(sub(mm, low), lt(mm, low))\n        }\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            success = c >= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a - b;\n            success = c <= a;\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a * b;\n            assembly (\"memory-safe\") {\n                // Only true when the multiplication doesn't overflow\n                // (c / a == b) || (a == 0)\n                success := or(eq(div(c, a), b), iszero(a))\n            }\n            // equivalent to: success ? c : 0\n            result = c * SafeCast.toUint(success);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `DIV` opcode returns zero when the denominator is 0.\n                result := div(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            success = b > 0;\n            assembly (\"memory-safe\") {\n                // The `MOD` opcode returns zero when the denominator is 0.\n                result := mod(a, b)\n            }\n        }\n    }\n\n    /**\n     * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryAdd(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n     */\n    function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n        (, uint256 result) = trySub(a, b);\n        return result;\n    }\n\n    /**\n     * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n     */\n    function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n        (bool success, uint256 result) = tryMul(a, b);\n        return ternary(success, result, type(uint256).max);\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (high == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return low / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= high) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [high low].\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                high := sub(high, gt(remainder, low))\n                low := sub(low, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly (\"memory-safe\") {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [high low] by twos.\n                low := div(low, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from high into low.\n            low |= high * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n            // is no longer required.\n            result = low * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n        unchecked {\n            (uint256 high, uint256 low) = mul512(x, y);\n            if (high >= 1 << n) {\n                Panic.panic(Panic.UNDER_OVERFLOW);\n            }\n            return (high << (256 - n)) | (low >> n);\n        }\n    }\n\n    /**\n     * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n     */\n    function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n        return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n        for (uint256 i = 0; i < byteArray.length; ++i) {\n            if (byteArray[i] != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // If upper 8 bits of 16-bit half set, add 8 to result\n        r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n        // If upper 4 bits of 8-bit half set, add 4 to result\n        r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n        // Shifts value right by the current result and use it as an index into this lookup table:\n        //\n        // | x (4 bits) |  index  | table[index] = MSB position |\n        // |------------|---------|-----------------------------|\n        // |    0000    |    0    |        table[0] = 0         |\n        // |    0001    |    1    |        table[1] = 0         |\n        // |    0010    |    2    |        table[2] = 1         |\n        // |    0011    |    3    |        table[3] = 1         |\n        // |    0100    |    4    |        table[4] = 2         |\n        // |    0101    |    5    |        table[5] = 2         |\n        // |    0110    |    6    |        table[6] = 2         |\n        // |    0111    |    7    |        table[7] = 2         |\n        // |    1000    |    8    |        table[8] = 3         |\n        // |    1001    |    9    |        table[9] = 3         |\n        // |    1010    |   10    |        table[10] = 3        |\n        // |    1011    |   11    |        table[11] = 3        |\n        // |    1100    |   12    |        table[12] = 3        |\n        // |    1101    |   13    |        table[13] = 3        |\n        // |    1110    |   14    |        table[14] = 3        |\n        // |    1111    |   15    |        table[15] = 3        |\n        //\n        // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n        assembly (\"memory-safe\") {\n            r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 x) internal pure returns (uint256 r) {\n        // If value has upper 128 bits set, log2 result is at least 128\n        r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n        // If upper 64 bits of 128-bit half set, add 64 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n        // If upper 32 bits of 64-bit half set, add 32 to result\n        r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n        // If upper 16 bits of 32-bit half set, add 16 to result\n        r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n        // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n        return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n}\n"},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppCore.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { IOAppCore, ILayerZeroEndpointV2 } from \"./interfaces/IOAppCore.sol\";\n\n/**\n * @title OAppCore\n * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.\n */\nabstract contract OAppCore is IOAppCore, Ownable {\n    // The LayerZero endpoint associated with the given OApp\n    ILayerZeroEndpointV2 public immutable endpoint;\n\n    // Mapping to store peers associated with corresponding endpoints\n    mapping(uint32 eid => bytes32 peer) public peers;\n\n    /**\n     * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.\n     * @param _endpoint The address of the LOCAL Layer Zero endpoint.\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\n     *\n     * @dev The delegate typically should be set as the owner of the contract.\n     */\n    constructor(address _endpoint, address _delegate) {\n        endpoint = ILayerZeroEndpointV2(_endpoint);\n\n        if (_delegate == address(0)) revert InvalidDelegate();\n        endpoint.setDelegate(_delegate);\n    }\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     *\n     * @dev Only the owner/admin of the OApp can call this function.\n     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.\n     * @dev Set this to bytes32(0) to remove the peer address.\n     * @dev Peer is a bytes32 to accommodate non-evm chains.\n     */\n    function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyOwner {\n        _setPeer(_eid, _peer);\n    }\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     *\n     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.\n     * @dev Set this to bytes32(0) to remove the peer address.\n     * @dev Peer is a bytes32 to accommodate non-evm chains.\n     */\n    function _setPeer(uint32 _eid, bytes32 _peer) internal virtual {\n        peers[_eid] = _peer;\n        emit PeerSet(_eid, _peer);\n    }\n\n    /**\n     * @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.\n     * ie. the peer is set to bytes32(0).\n     * @param _eid The endpoint ID.\n     * @return peer The address of the peer associated with the specified endpoint.\n     */\n    function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {\n        bytes32 peer = peers[_eid];\n        if (peer == bytes32(0)) revert NoPeer(_eid);\n        return peer;\n    }\n\n    /**\n     * @notice Sets the delegate address for the OApp.\n     * @param _delegate The address of the delegate to be set.\n     *\n     * @dev Only the owner/admin of the OApp can call this function.\n     * @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\n     */\n    function setDelegate(address _delegate) public onlyOwner {\n        endpoint.setDelegate(_delegate);\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/devtools/packages/oft-evm/contracts/interfaces/IOFT.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { MessagingReceipt, MessagingFee } from \"@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol\";\n\n/**\n * @dev Struct representing token parameters for the OFT send() operation.\n */\nstruct SendParam {\n    uint32 dstEid; // Destination endpoint ID.\n    bytes32 to; // Recipient address.\n    uint256 amountLD; // Amount to send in local decimals.\n    uint256 minAmountLD; // Minimum amount to send in local decimals.\n    bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.\n    bytes composeMsg; // The composed message for the send() operation.\n    bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations.\n}\n\n/**\n * @dev Struct representing OFT limit information.\n * @dev These amounts can change dynamically and are up the specific oft implementation.\n */\nstruct OFTLimit {\n    uint256 minAmountLD; // Minimum amount in local decimals that can be sent to the recipient.\n    uint256 maxAmountLD; // Maximum amount in local decimals that can be sent to the recipient.\n}\n\n/**\n * @dev Struct representing OFT receipt information.\n */\nstruct OFTReceipt {\n    uint256 amountSentLD; // Amount of tokens ACTUALLY debited from the sender in local decimals.\n    // @dev In non-default implementations, the amountReceivedLD COULD differ from this value.\n    uint256 amountReceivedLD; // Amount of tokens to be received on the remote side.\n}\n\n/**\n * @dev Struct representing OFT fee details.\n * @dev Future proof mechanism to provide a standardized way to communicate fees to things like a UI.\n */\nstruct OFTFeeDetail {\n    int256 feeAmountLD; // Amount of the fee in local decimals.\n    string description; // Description of the fee.\n}\n\n/**\n * @title IOFT\n * @dev Interface for the OftChain (OFT) token.\n * @dev Does not inherit ERC20 to accommodate usage by OFTAdapter as well.\n * @dev This specific interface ID is '0x02e49c2c'.\n */\ninterface IOFT {\n    // Custom error messages\n    error InvalidLocalDecimals();\n    error SlippageExceeded(uint256 amountLD, uint256 minAmountLD);\n    error AmountSDOverflowed(uint256 amountSD);\n\n    // Events\n    event OFTSent(\n        bytes32 indexed guid, // GUID of the OFT message.\n        uint32 dstEid, // Destination Endpoint ID.\n        address indexed fromAddress, // Address of the sender on the src chain.\n        uint256 amountSentLD, // Amount of tokens sent in local decimals.\n        uint256 amountReceivedLD // Amount of tokens received in local decimals.\n    );\n    event OFTReceived(\n        bytes32 indexed guid, // GUID of the OFT message.\n        uint32 srcEid, // Source Endpoint ID.\n        address indexed toAddress, // Address of the recipient on the dst chain.\n        uint256 amountReceivedLD // Amount of tokens received in local decimals.\n    );\n\n    /**\n     * @notice Retrieves interfaceID and the version of the OFT.\n     * @return interfaceId The interface ID.\n     * @return version The version.\n     *\n     * @dev interfaceId: This specific interface ID is '0x02e49c2c'.\n     * @dev version: Indicates a cross-chain compatible msg encoding with other OFTs.\n     * @dev If a new feature is added to the OFT cross-chain msg encoding, the version will be incremented.\n     * ie. localOFT version(x,1) CAN send messages to remoteOFT version(x,1)\n     */\n    function oftVersion() external view returns (bytes4 interfaceId, uint64 version);\n\n    /**\n     * @notice Retrieves the address of the token associated with the OFT.\n     * @return token The address of the ERC20 token implementation.\n     */\n    function token() external view returns (address);\n\n    /**\n     * @notice Indicates whether the OFT contract requires approval of the 'token()' to send.\n     * @return requiresApproval Needs approval of the underlying token implementation.\n     *\n     * @dev Allows things like wallet implementers to determine integration requirements,\n     * without understanding the underlying token implementation.\n     */\n    function approvalRequired() external view returns (bool);\n\n    /**\n     * @notice Retrieves the shared decimals of the OFT.\n     * @return sharedDecimals The shared decimals of the OFT.\n     */\n    function sharedDecimals() external view returns (uint8);\n\n    /**\n     * @notice Provides the fee breakdown and settings data for an OFT. Unused in the default implementation.\n     * @param _sendParam The parameters for the send operation.\n     * @return limit The OFT limit information.\n     * @return oftFeeDetails The details of OFT fees.\n     * @return receipt The OFT receipt information.\n     */\n    function quoteOFT(\n        SendParam calldata _sendParam\n    ) external view returns (OFTLimit memory, OFTFeeDetail[] memory oftFeeDetails, OFTReceipt memory);\n\n    /**\n     * @notice Provides a quote for the send() operation.\n     * @param _sendParam The parameters for the send() operation.\n     * @param _payInLzToken Flag indicating whether the caller is paying in the LZ token.\n     * @return fee The calculated LayerZero messaging fee from the send() operation.\n     *\n     * @dev MessagingFee: LayerZero msg fee\n     *  - nativeFee: The native fee.\n     *  - lzTokenFee: The lzToken fee.\n     */\n    function quoteSend(SendParam calldata _sendParam, bool _payInLzToken) external view returns (MessagingFee memory);\n\n    /**\n     * @notice Executes the send() operation.\n     * @param _sendParam The parameters for the send operation.\n     * @param _fee The fee information supplied by the caller.\n     *      - nativeFee: The native fee.\n     *      - lzTokenFee: The lzToken fee.\n     * @param _refundAddress The address to receive any excess funds from fees etc. on the src.\n     * @return receipt The LayerZero messaging receipt from the send() operation.\n     * @return oftReceipt The OFT receipt information.\n     *\n     * @dev MessagingReceipt: LayerZero msg receipt\n     *  - guid: The unique identifier for the sent message.\n     *  - nonce: The nonce of the sent message.\n     *  - fee: The LayerZero fee incurred for the message.\n     */\n    function send(\n        SendParam calldata _sendParam,\n        MessagingFee calldata _fee,\n        address _refundAddress\n    ) external payable returns (MessagingReceipt memory, OFTReceipt memory);\n}\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"},"src/common/diamond/facets/access-control/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/// @title IAccessControlBase\n/// @notice Base interface for role-based access control system\n/// @dev Defines events, errors, and structures for access control management\ninterface IAccessControlBase {\n    /// @notice Thrown when attempting to remove admin role access from access control functions\n    /// @dev Prevents system lockout by ensuring admin always has access to ACL functions\n    error AccessControl_CannotRemoveAdmin();\n\n    /// @notice Thrown when a user attempts to call a function they're not authorized for\n    error AccessControl_CallerIsNotAuthorized();\n\n    /**\n     * @notice Emitted when a user's role assignment changes\n     * @param user The address whose role is being updated\n     * @param role The role identifier being modified\n     * @param enabled True if the role is being granted, false if being revoked\n     */\n    event UserRoleUpdated(address indexed user, uint8 indexed role, bool enabled);\n\n    /**\n     * @notice Emitted when function access permissions change for a role\n     * @param functionSig The 4-byte function selector whose access is being modified\n     * @param role The role identifier whose access is being changed\n     * @param enabled True if access is being granted, false if being revoked\n     */\n    event FunctionAccessChanged(bytes4 indexed functionSig, uint8 indexed role, bool enabled);\n\n    /// @notice Configuration structure for batch role assignments\n    /// @param user The address to receive role assignments\n    /// @param roles Array of role identifiers to assign or revoke\n    /// @param enabled True to grant roles, false to revoke roles\n    struct RoleConfiguration {\n        address user;\n        uint8[] roles;\n        bool enabled;\n    }\n}\n\n/// @title IAccessControl\n/// @notice Interface for role-based access control in the diamond\n/// @dev Extends IAccessControlBase with function and role management capabilities\ninterface IAccessControl is IAccessControlBase {\n    /**\n     * @notice Configures whether a specific role can call a function\n     * @dev Only callable by authorized admins. Cannot remove admin access to ACL functions\n     * @param functionSig The 4-byte function selector to configure\n     * @param role The role identifier to grant or revoke access\n     * @param enabled True to grant access, false to revoke access\n     */\n    function setFunctionAccess(bytes4 functionSig, uint8 role, bool enabled) external;\n\n    /**\n     * @notice Grants or revokes a role for a user\n     * @dev Only callable by authorized admins\n     * @param user The address to modify role assignment for\n     * @param role The role identifier to grant or revoke\n     * @param enabled True to grant the role, false to revoke it\n     */\n    function setUserRole(address user, uint8 role, bool enabled) external;\n\n    /**\n     * @notice Grants or revokes multiple roles for a user in a single transaction\n     * @dev Only callable by authorized admins. More gas-efficient for bulk operations\n     * @param user The address to modify role assignments for\n     * @param roles Array of role identifiers to grant or revoke\n     * @param enabled True to grant all roles, false to revoke all roles\n     */\n    function setUserRoles(address user, uint8[] calldata roles, bool enabled) external;\n\n    /**\n     * @notice Configures roles for multiple users in a single transaction\n     * @dev Only callable by authorized admins. Most gas-efficient for bulk operations\n     * @param configs Array of role configurations, each specifying user, roles, and enabled state\n     */\n    function setUserRolesBatch(RoleConfiguration[] calldata configs) external;\n\n    /**\n     * @notice Checks if a user has permission to call a specific function\n     * @dev Returns true if user has any role with access, or has DEFAULT_ADMIN_ROLE\n     * @param user The address to check permissions for\n     * @param functionSig The 4-byte function selector to check\n     * @return True if the user can call the function, false otherwise\n     */\n    function canCall(address user, bytes4 functionSig) external view returns (bool);\n\n    /**\n     * @notice Retrieves all roles assigned to a user\n     * @dev Roles are bit-packed into a bytes32 value, where each bit represents a role\n     * @param user The address to query roles for\n     * @return Bitmap of assigned roles encoded as bytes32\n     */\n    function userRoles(address user) external view returns (bytes32);\n\n    /**\n     * @notice Retrieves all roles that have access to a function\n     * @dev Roles are bit-packed into a bytes32 value, where each bit represents a role\n     * @param functionSig The 4-byte function selector to query\n     * @return Bitmap of authorized roles encoded as bytes32\n     */\n    function functionRoles(bytes4 functionSig) external view returns (bytes32);\n\n    /**\n     * @notice Checks if a user has a specific role\n     * @param user The address to check\n     * @param role The role identifier to check for\n     * @return True if the user has the role, false otherwise\n     */\n    function hasRole(address user, uint8 role) external view returns (bool);\n\n    /**\n     * @notice Checks if a specific role has access to a function\n     * @param role The role identifier to check\n     * @param functionSig The 4-byte function selector to check\n     * @return True if the role has access, false otherwise\n     */\n    function roleHasAccess(uint8 role, bytes4 functionSig) external view returns (bool);\n}\n"},"src/common/diamond/facets/asset-registry/IAssetRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/**\n * @title IAssetRegistryEvents\n * @notice Events emitted by the AssetRegistry facet.\n */\ninterface IAssetRegistryEvents {\n    /// @dev Emitted by the admin overrides `setIdOf` and `setIdOfBatch` whenever\n    ///      the reverse mapping is written. Covers backfill of pre-existing\n    ///      dShares and recovery from a corrupted state. For first-time writes\n    ///      (backfill), `oldId` is `bytes32(0)`.\n    event AssetIdUpdated(address indexed token, bytes32 indexed oldId, bytes32 indexed newId);\n}\n\n/**\n * @title IAssetRegistryErrors\n * @notice Error definitions for AssetRegistry facet.\n */\ninterface IAssetRegistryErrors {\n    /// @dev Thrown when a zero address is provided where it is not allowed.\n    error AssetRegistry_ZeroAddress();\n    /// @dev Thrown when a token already has an assetId mapped to it.\n    error AssetRegistry_TokenAlreadyRegistered();\n}\n\n/**\n * @title IAssetRegistry\n * @notice Interface for the AssetRegistry facet. Provides bidirectional lookups\n *         between asset IDs and DShare token addresses on this chain.\n * @dev Forward direction (assetId => token) is sourced from the DShareFactory\n *      facet via `getDShareByAssetId`. Reverse direction (token => assetId) is\n *      owned by this facet and populated by the factory in the same call that\n *      creates a new DShare.\n *\n *      For new dShares the factory emits `DShareAdded(dshare, name, symbol, assetId, delegate)`,\n *      and that's the event indexers should watch for asset registration.\n *      The `AssetIdUpdated` event defined here covers only admin-driven writes:\n *      backfilling pre-existing dShares, or recovering from a corrupted mapping.\n *\n */\ninterface IAssetRegistry is IAssetRegistryEvents, IAssetRegistryErrors {\n    /**\n     * @notice A (token, assetId) pair for batched reverse-mapping writes.\n     * @dev Binding the two fields in one struct makes index misalignment and\n     *      length mismatch impossible by construction, unlike parallel\n     *      `address[]` / `bytes32[]` inputs.\n     * @param token   The DShare token address.\n     * @param assetId The asset identifier to associate.\n     */\n    struct AssetIdEntry {\n        address token;\n        bytes32 assetId;\n    }\n\n    /**\n     * @notice Resolves the DShare token address for a given asset ID.\n     * @param assetId The asset identifier to look up.\n     * @return The DShare token address, or address(0) if not registered.\n     */\n    function AssetRegistry_tokenOf(bytes32 assetId) external view returns (address);\n\n    /**\n     * @notice Resolves the asset ID for a given DShare token address.\n     * @dev Returns bytes32(0) both for unregistered tokens and for tokens\n     *      registered with assetId == 0. Use `AssetRegistry_isRegistered` to disambiguate.\n     */\n    function AssetRegistry_idOf(address token) external view returns (bytes32);\n\n    /// @notice Whether a token has been registered, independent of the assetId value.\n    function AssetRegistry_isRegistered(address token) external view returns (bool);\n\n    /**\n     * @notice Admin override: write the reverse mapping `token => assetId`.\n     * @dev Gated by the diamond's access control (`protected`). Used for\n     *      backfilling pre-existing dShares and for break-glass recovery.\n     *      Overwrites any existing entry. Emits `AssetIdUpdated`.\n     * @param token   The DShare token address.\n     * @param assetId The asset identifier to associate.\n     */\n    function AssetRegistry_setIdOf(address token, bytes32 assetId) external;\n\n    /**\n     * @notice Batched variant of `AssetRegistry_setIdOf`.\n     * @dev All entries succeed or none do. Emits `AssetIdUpdated` per entry.\n     * @param entries Array of (token, assetId) pairs to write.\n     */\n    function AssetRegistry_setIdOfBatch(AssetIdEntry[] calldata entries) external;\n}\n"},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppSender.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { SafeERC20, IERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { MessagingParams, MessagingFee, MessagingReceipt } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\nimport { OAppCore } from \"./OAppCore.sol\";\n\n/**\n * @title OAppSender\n * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.\n */\nabstract contract OAppSender is OAppCore {\n    using SafeERC20 for IERC20;\n\n    // Custom error messages\n    error NotEnoughNative(uint256 msgValue);\n    error LzTokenUnavailable();\n\n    // @dev The version of the OAppSender implementation.\n    // @dev Version is bumped when changes are made to this contract.\n    uint64 internal constant SENDER_VERSION = 1;\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     *\n     * @dev Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented.\n     * ie. this is a SEND only OApp.\n     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions\n     */\n    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {\n        return (SENDER_VERSION, 0);\n    }\n\n    /**\n     * @dev Internal function to interact with the LayerZero EndpointV2.quote() for fee calculation.\n     * @param _dstEid The destination endpoint ID.\n     * @param _message The message payload.\n     * @param _options Additional options for the message.\n     * @param _payInLzToken Flag indicating whether to pay the fee in LZ tokens.\n     * @return fee The calculated MessagingFee for the message.\n     *      - nativeFee: The native fee for the message.\n     *      - lzTokenFee: The LZ token fee for the message.\n     */\n    function _quote(\n        uint32 _dstEid,\n        bytes memory _message,\n        bytes memory _options,\n        bool _payInLzToken\n    ) internal view virtual returns (MessagingFee memory fee) {\n        return\n            endpoint.quote(\n                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _payInLzToken),\n                address(this)\n            );\n    }\n\n    /**\n     * @dev Internal function to interact with the LayerZero EndpointV2.send() for sending a message.\n     * @param _dstEid The destination endpoint ID.\n     * @param _message The message payload.\n     * @param _options Additional options for the message.\n     * @param _fee The calculated LayerZero fee for the message.\n     *      - nativeFee: The native fee.\n     *      - lzTokenFee: The lzToken fee.\n     * @param _refundAddress The address to receive any excess fee values sent to the endpoint.\n     * @return receipt The receipt for the sent message.\n     *      - guid: The unique identifier for the sent message.\n     *      - nonce: The nonce of the sent message.\n     *      - fee: The LayerZero fee incurred for the message.\n     */\n    function _lzSend(\n        uint32 _dstEid,\n        bytes memory _message,\n        bytes memory _options,\n        MessagingFee memory _fee,\n        address _refundAddress\n    ) internal virtual returns (MessagingReceipt memory receipt) {\n        // @dev Push corresponding fees to the endpoint, any excess is sent back to the _refundAddress from the endpoint.\n        uint256 messageValue = _payNative(_fee.nativeFee);\n        if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);\n\n        return\n            // solhint-disable-next-line check-send-result\n            endpoint.send{ value: messageValue }(\n                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _fee.lzTokenFee > 0),\n                _refundAddress\n            );\n    }\n\n    /**\n     * @dev Internal function to pay the native fee associated with the message.\n     * @param _nativeFee The native fee to be paid.\n     * @return nativeFee The amount of native currency paid.\n     *\n     * @dev If the OApp needs to initiate MULTIPLE LayerZero messages in a single transaction,\n     * this will need to be overridden because msg.value would contain multiple lzFees.\n     * @dev Should be overridden in the event the LayerZero endpoint requires a different native currency.\n     * @dev Some EVMs use an ERC20 as a method for paying transactions/gasFees.\n     * @dev The endpoint is EITHER/OR, ie. it will NOT support both types of native payment at a time.\n     */\n    function _payNative(uint256 _nativeFee) internal virtual returns (uint256 nativeFee) {\n        if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);\n        return _nativeFee;\n    }\n\n    /**\n     * @dev Internal function to pay the LZ token fee associated with the message.\n     * @param _lzTokenFee The LZ token fee to be paid.\n     *\n     * @dev If the caller is trying to pay in the specified lzToken, then the lzTokenFee is passed to the endpoint.\n     * @dev Any excess sent, is passed back to the specified _refundAddress in the _lzSend().\n     */\n    function _payLzToken(uint256 _lzTokenFee) internal virtual {\n        // @dev Cannot cache the token because it is not immutable in the endpoint.\n        address lzToken = endpoint.lzToken();\n        if (lzToken == address(0)) revert LzTokenUnavailable();\n\n        // Pay LZ token fee by sending tokens to the endpoint.\n        IERC20(lzToken).safeTransferFrom(msg.sender, address(endpoint), _lzTokenFee);\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/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev An uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.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        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\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        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\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 _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\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 _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\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        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\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 rely 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 rely 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     * Opposedly, 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    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\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/devtools/packages/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { ILayerZeroEndpointV2 } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\n\n/**\n * @title IOAppCore\n */\ninterface IOAppCore {\n    // Custom error messages\n    error OnlyPeer(uint32 eid, bytes32 sender);\n    error NoPeer(uint32 eid);\n    error InvalidEndpointCall();\n    error InvalidDelegate();\n\n    // Event emitted when a peer (OApp) is set for a corresponding endpoint\n    event PeerSet(uint32 eid, bytes32 peer);\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     */\n    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);\n\n    /**\n     * @notice Retrieves the LayerZero endpoint associated with the OApp.\n     * @return iEndpoint The LayerZero endpoint as an interface.\n     */\n    function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);\n\n    /**\n     * @notice Retrieves the peer (OApp) associated with a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @return peer The peer address (OApp instance) associated with the corresponding endpoint.\n     */\n    function peers(uint32 _eid) external view returns (bytes32 peer);\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     */\n    function setPeer(uint32 _eid, bytes32 _peer) external;\n\n    /**\n     * @notice Sets the delegate address for the OApp Core.\n     * @param _delegate The address of the delegate to be set.\n     */\n    function setDelegate(address _delegate) external;\n}\n"},"src/common/diamond/facets/transfer-restrictor/UserAddressMetadataLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.20;\n\n/**\n * @title UserAddressMetadataLib\n * @notice Owns the `UserAddressMetadata` struct and the pure jurisdiction\n *         classifiers used by the TransferRestrictor facet.\n * @dev Classifiers are pure and operate on a memory copy of the struct.\n *      Callers in the facet load metadata from storage once per address\n *      (a single SLOAD since the four bools pack into one slot) and then\n *      call into this library, so the predicates are cheap and trivially\n *      testable in isolation. The struct lives here as the single source\n *      of truth; `TransferRestrictorStorage` imports it for the diamond\n *      storage mapping.\n */\nlibrary UserAddressMetadataLib {\n    /// @notice Jurisdiction / status flags tracked per address.\n    /// @dev Mutually-exclusive classes are derived from these flags by the\n    ///      classifiers below; do not infer membership directly from the\n    ///      raw fields outside this library.\n    struct UserAddressMetadata {\n        bool isRegistered;\n        bool isRestricted;\n        bool isBlocked;\n        bool isWhitelisted;\n        address user;\n    }\n\n    /// @notice True if any phase-2 flag is set.\n    function isDFNUser(UserAddressMetadata memory m) internal pure returns (bool) {\n        return m.isRegistered || m.isRestricted || m.isBlocked || m.isWhitelisted;\n    }\n\n    /// @notice True if the address is a BrokerageAccountLocked user.\n    function isBrokerageAccountLocked(UserAddressMetadata memory m) internal pure returns (bool) {\n        return m.isRegistered && m.isRestricted;\n    }\n\n    /// @notice True if the address is a Baseline registered user.\n    function isBaselineRegistered(UserAddressMetadata memory m) internal pure returns (bool) {\n        return m.isRegistered && !m.isRestricted;\n    }\n\n    /// @notice True if no phase-2 flags are set.\n    /// @dev \"Unknown\" at the metadata layer only. A WrappedDShare contract\n    ///      also has empty metadata; callers that need to distinguish must\n    ///      combine this with the factory lookup.\n    function isUnknown(UserAddressMetadata memory m) internal pure returns (bool) {\n        return !m.isRegistered && !m.isRestricted && !m.isBlocked && !m.isWhitelisted;\n    }\n}\n"},"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.23;\n\nimport {ITransferRestrictor} from \"src/tokens/shares/ITransferRestrictor.sol\";\nimport {UserAddressMetadataLib} from \"./UserAddressMetadataLib.sol\";\n\n/// @notice Events and errors emitted by the TransferRestrictor diamond facet\ninterface ITransferRestrictorFacetEvents {\n    /// @notice Emitted when an account is added to the blacklist\n    event Restricted(address indexed account);\n    /// @notice Emitted when an account is removed from the blacklist\n    event Unrestricted(address indexed account);\n\n    /// @notice Emitted when an account's phase-2 metadata flags are set\n    /// @param user The account whose metadata was changed\n    /// @param isRegistered Whether the address is known to the restrictor\n    /// @param isRestricted Whether the address is restricted (US-like)\n    /// @param isBlocked Whether the address is blocked (sanctioned)\n    /// @param isWhitelisted Whether the address is whitelisted\n    event TransferRestrictor__UserAddressMetadataSet(\n        address indexed user,\n        bool isRegistered,\n        bool isRestricted,\n        bool isBlocked,\n        bool isWhitelisted\n    );\n    /// @notice Emitted when `TransferRestrictor_pauseTransfers` is invoked\n    event TransferRestrictor__TransfersPausedSet(address indexed caller);\n    /// @notice Emitted when `TransferRestrictor_unpauseTransfers` is invoked\n    event TransferRestrictor_TransfersUnpausedSet(address indexed caller);\n    /// @notice Emitted when `TransferRestrictor_setLegacyDShareFactory` is invoked\n    event TransferRestrictor_LegacyDShareFactorySet(address indexed legacyDShareFactory);\n    /// @notice Emitted when `TransferRestrictor_pause` is invoked\n    event TransferRestrictor_PausedSet(address indexed caller);\n    /// @notice Emitted when `TransferRestrictor_unpause` is invoked\n    event TransferRestrictor_UnpausedSet(address indexed caller);\n\n}\n\ninterface ITransferRestrictorFacetErrors{\n    /// @notice Thrown when either side of a transfer is blacklisted\n    error TransferRestrictor_AccountRestricted();\n    /// @notice Thrown when either side of a transfer is blocked (sanction-style block)\n    error TransferRestrictor_AccountBlocked();\n    /// @notice Thrown when a transfer fails the phase-2 jurisdiction rules\n    error TransferRestrictor_TransferPhase2_NotAllowed();\n    /// @notice Thrown when a DFN-flagged user is also marked as a DFN address\n    error TransferRestrictor_TransferPhase2_Diamond_IsDFNUser();\n    /// @notice Thrown when a WrappedDShare check resolves to a DFN-flagged user\n    error TransferRestrictor_TransferPhase2_WrappedDShare_IsDFNUser();\n    error TransferRestrictor_TransfersPaused();\n    /// @notice Thrown when `TransferRestrictor_batchSetUserAddressMetadata` is called with arrays of differing length\n    error TransferRestrictor_Diamond_CannotSetSelfMetadata();\n\n    /// @notice Thrown when a zero address is provided\n    error TransferRestrictor_ZeroAddress();\n    /// @notice Thrown when `TransferRestrictor_pause` is invoked while paused\n    error TransferRestrictor_Paused();\n    /// @notice Thrown when Transfer Restrictor is not set and a transfer is attempted by a non-operator role\n    error TransferRestrictor_NotSet();\n}\n\n/// @title ITransferRestrictorFacet\n/// @notice Canonical interface for the TransferRestrictor diamond facet\n/// @dev Inherits ITransferRestrictor so external callers only need to import this interface\ninterface ITransferRestrictorFacet is ITransferRestrictor, ITransferRestrictorFacetEvents, ITransferRestrictorFacetErrors {\n    /// ------------------ Legacy Functions ------------------ ///\n\n    /// @notice Adds an account to the blacklist\n    /// @param account The address to restrict\n    function restrict(address account) external;\n\n    /// @notice Removes an account from the blacklist\n    /// @param account The address to unrestrict\n    function unrestrict(address account) external;\n\n    /// @notice Reverts with TransferRestrictor_AccountRestricted if either side of the transfer is blacklisted\n    /// @param from Sender address\n    /// @param to Recipient address\n    function requireNotRestricted(address from, address to) external view;\n\n    /// @notice Returns whether the account is on the legacy blacklist\n    /// @param account The address to check\n    /// @return True if blacklisted\n    function isBlacklisted(address account) external view returns (bool);\n\n    /// ------------------ Phase-2 Rules ------------------ ///\n\n    /// @notice Returns whether `from` -> `to` satisfies phase-2 transfer rules after base checks\n    ///         (blocks, DFN receiver bypass, and jurisdiction matrix)\n    /// @param from Sender address\n    /// @param to Recipient address\n    /// @return allowed True if the transfer is permitted under phase-2 rules\n    function TransferRestrictor_assertTransferPhase2(address from, address to) external view returns (bool allowed);\n\n    /// @notice Sets phase-2 metadata flags for an account (US / IsBaselineRegistered / blocked / whitelisted)\n    /// @dev Restricted to RESTRICTOR_ROLE via the diamond access control.\n    /// @param userAddressMetadata The address metadata to set\n    function TransferRestrictor_setUserAddressMetadata(\n        UserAddressMetadataLib.UserAddressMetadata memory userAddressMetadata\n    ) external;\n\n    /// @notice Returns the address metadata for an account\n    /// @dev This function is used to get the address metadata for an account\n    /// @param user The address to get the metadata for\n    /// @return UserAddressMetadataLib.UserAddressMetadata memory The address metadata\n    function TransferRestrictor_getUserAddressMetadata(address user) external view returns (UserAddressMetadataLib.UserAddressMetadata memory);\n\n    /// @notice Batch variant of `TransferRestrictor_getUserAddressMetadata`.\n    /// @dev This function is used to get the address metadata for multiple accounts at once.\n    /// @param users The addresses to get the metadata for\n    /// @return UserAddressMetadataLib.UserAddressMetadata[] memory The metadatas for the given addresses\n    function TransferRestrictor_batchGetUserAddressMetadata(address[] memory users) external view returns (UserAddressMetadataLib.UserAddressMetadata[] memory);\n\n    /// @notice Batch variant of `TransferRestrictor_setUserAddressMetadata`.\n    /// @dev Restricted to RESTRICTOR_ROLE via the diamond access control. Reverts on\n    ///      array-length mismatch (the index access into the shorter array panics).\n    /// @param addressMetadataArray Addresses whose metadata is being set\n    function TransferRestrictor_batchSetUserAddressMetadata(\n        UserAddressMetadataLib.UserAddressMetadata[] memory addressMetadataArray\n    ) external;\n\n    /// @notice Pauses restrictor mutations and phase-2 checks. Callable only by DEPLOYER_ROLE.\n    function TransferRestrictor_pause() external;\n\n    /// @notice Unpauses restrictor mutations and phase-2 checks. Callable only by DEPLOYER_ROLE.\n    function TransferRestrictor_unpause() external;\n\n    /// @notice Returns whether transfers are currently paused\n    function TransferRestrictor_transfersPaused() external view returns (bool);\n\n    /// @notice Pauses transfers\n    function TransferRestrictor_pauseTransfers() external;\n\n    /// @notice Unpauses transfers\n    function TransferRestrictor_unpauseTransfers() external;\n\n    ///@notice sets Legacy dshare factory \n    function TransferRestrictor_setLegacyDShareFactory(address legacyDShareFactory) external;\n}"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\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 ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\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/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n    /// @custom:storage-location erc7201:openzeppelin.storage.Pausable\n    struct PausableStorage {\n        bool _paused;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Pausable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;\n\n    function _getPausableStorage() private pure returns (PausableStorage storage $) {\n        assembly {\n            $.slot := PausableStorageLocation\n        }\n    }\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    function __Pausable_init() internal onlyInitializing {\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        PausableStorage storage $ = _getPausableStorage();\n        return $._paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $._paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $._paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingChannel {\n    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);\n    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\n    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\n\n    function eid() external view returns (uint32);\n\n    // this is an emergency function if a message cannot be verified for some reasons\n    // required to provide _nextNonce to avoid race condition\n    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;\n\n    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\n\n    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\n\n    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);\n\n    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\n\n    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);\n\n    function inboundPayloadHash(\n        address _receiver,\n        uint32 _srcEid,\n        bytes32 _sender,\n        uint64 _nonce\n    ) external view returns (bytes32);\n\n    function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingContext {\n    function isSendingMessage() external view returns (bool);\n\n    function getSendContext() external view returns (uint32 dstEid, address sender);\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nstruct SetConfigParam {\n    uint32 eid;\n    uint32 configType;\n    bytes config;\n}\n\ninterface IMessageLibManager {\n    struct Timeout {\n        address lib;\n        uint256 expiry;\n    }\n\n    event LibraryRegistered(address newLib);\n    event DefaultSendLibrarySet(uint32 eid, address newLib);\n    event DefaultReceiveLibrarySet(uint32 eid, address newLib);\n    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);\n    event SendLibrarySet(address sender, uint32 eid, address newLib);\n    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);\n    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);\n\n    function registerLibrary(address _lib) external;\n\n    function isRegisteredLibrary(address _lib) external view returns (bool);\n\n    function getRegisteredLibraries() external view returns (address[] memory);\n\n    function setDefaultSendLibrary(uint32 _eid, address _newLib) external;\n\n    function defaultSendLibrary(uint32 _eid) external view returns (address);\n\n    function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _timeout) external;\n\n    function defaultReceiveLibrary(uint32 _eid) external view returns (address);\n\n    function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;\n\n    function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);\n\n    function isSupportedEid(uint32 _eid) external view returns (bool);\n\n    function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);\n\n    /// ------------------- OApp interfaces -------------------\n    function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;\n\n    function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);\n\n    function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);\n\n    function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;\n\n    function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);\n\n    function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _gracePeriod) external;\n\n    function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);\n\n    function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;\n\n    function getConfig(\n        address _oapp,\n        address _lib,\n        uint32 _eid,\n        uint32 _configType\n    ) external view returns (bytes memory config);\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingComposer {\n    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);\n    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);\n    event LzComposeAlert(\n        address indexed from,\n        address indexed to,\n        address indexed executor,\n        bytes32 guid,\n        uint16 index,\n        uint256 gas,\n        uint256 value,\n        bytes message,\n        bytes extraData,\n        bytes reason\n    );\n\n    function composeQueue(\n        address _from,\n        address _to,\n        bytes32 _guid,\n        uint16 _index\n    ) external view returns (bytes32 messageHash);\n\n    function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;\n\n    function lzCompose(\n        address _from,\n        address _to,\n        bytes32 _guid,\n        uint16 _index,\n        bytes calldata _message,\n        bytes calldata _extraData\n    ) external payable;\n}\n"},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nimport { IMessageLibManager } from \"./IMessageLibManager.sol\";\nimport { IMessagingComposer } from \"./IMessagingComposer.sol\";\nimport { IMessagingChannel } from \"./IMessagingChannel.sol\";\nimport { IMessagingContext } from \"./IMessagingContext.sol\";\n\nstruct MessagingParams {\n    uint32 dstEid;\n    bytes32 receiver;\n    bytes message;\n    bytes options;\n    bool payInLzToken;\n}\n\nstruct MessagingReceipt {\n    bytes32 guid;\n    uint64 nonce;\n    MessagingFee fee;\n}\n\nstruct MessagingFee {\n    uint256 nativeFee;\n    uint256 lzTokenFee;\n}\n\nstruct Origin {\n    uint32 srcEid;\n    bytes32 sender;\n    uint64 nonce;\n}\n\ninterface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {\n    event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);\n\n    event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);\n\n    event PacketDelivered(Origin origin, address receiver);\n\n    event LzReceiveAlert(\n        address indexed receiver,\n        address indexed executor,\n        Origin origin,\n        bytes32 guid,\n        uint256 gas,\n        uint256 value,\n        bytes message,\n        bytes extraData,\n        bytes reason\n    );\n\n    event LzTokenSet(address token);\n\n    event DelegateSet(address sender, address delegate);\n\n    function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);\n\n    function send(\n        MessagingParams calldata _params,\n        address _refundAddress\n    ) external payable returns (MessagingReceipt memory);\n\n    function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;\n\n    function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);\n\n    function initializable(Origin calldata _origin, address _receiver) external view returns (bool);\n\n    function lzReceive(\n        Origin calldata _origin,\n        address _receiver,\n        bytes32 _guid,\n        bytes calldata _message,\n        bytes calldata _extraData\n    ) external payable;\n\n    // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order\n    function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;\n\n    function setLzToken(address _lzToken) external;\n\n    function lzToken() external view returns (address);\n\n    function nativeToken() external view returns (address);\n\n    function setDelegate(address _delegate) external;\n}\n"}},"language":"Solidity","settings":{"viaIR":true,"metadata":{"appendCBOR":false,"bytecodeHash":"none","useLiteralContent":false},"optimizer":{"runs":200,"enabled":true},"evmVersion":"cancun","remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@solady/=lib/solady/","@prb/test/=lib/prb-test/src/","forge-std/=lib/forge-std/src/","src/=src/","@permit2/=lib/permit2/src/","@permit2-oz/=lib/permit2/lib/openzeppelin-contracts/contracts/","@permit2-test/=lib/permit2/test/","@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/","@layerzerolabs/oft-evm-upgradeable/=lib/devtools/packages/oft-evm-upgradeable/","@layerzerolabs/oft-alt-evm/=lib/devtools/packages/oft-alt-evm/","@layerzerolabs/oapp-alt-evm/=lib/devtools/packages/oapp-alt-evm/","@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/","@layerzerolabs/oapp-evm-upgradeable/=lib/devtools/packages/oapp-evm-upgradeable/","@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/","@layerzerolabs/layerzero-v2-mock/=lib/devtools/packages/test-devtools-evm-foundry/","@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/","@layerzerolabs/lz-evm-v1-0.7/=lib/LayerZero-v1/","solidity-bytes-utils/=lib/solidity-bytes-utils/","@chainlink-evm/=lib/chainlink-evm/","LayerZero-v1/=lib/LayerZero-v1/contracts/","chainlink-evm/=lib/chainlink-evm/","devtools/=lib/devtools/packages/toolbox-foundry/src/","ds-test/=lib/permit2/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-gas-snapshot/=lib/permit2/lib/forge-gas-snapshot/src/","halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/","layerzero-v2/=lib/layerzero-v2/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","permit2/=lib/permit2/","prb-math/=lib/prb-math/src/","prb-test/=lib/prb-test/src/","solady/=lib/solady/src/","solidity-examples/=lib/solidity-examples/contracts/","solmate/=lib/permit2/lib/solmate/"]}},"stdJsonOutput":{"sources":{"src/tokens/ERC20Rebasing.sol":{"id":33},"src/tokens/shares/IDShare.sol":{"id":34},"lib/solady/src/tokens/ERC20.sol":{"id":23},"src/common/diamond/Constants.sol":{"id":26},"src/common/utils/NumberUtils.sol":{"id":32},"src/tokens/shares/retail/DShare.sol":{"id":36},"src/tokens/shares/ITransferRestrictor.sol":{"id":35},"lib/solady/src/utils/FixedPointMathLib.sol":{"id":24},"src/common/AccessControlledUpgradeable.sol":{"id":25},"src/common/diamond/facets/lz-routing/ILZRouting.sol":{"id":29},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"id":19},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"id":18},"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"id":12},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"id":21},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppCore.sol":{"id":0},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":15},"lib/devtools/packages/oft-evm/contracts/interfaces/IOFT.sol":{"id":3},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":14},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":16},"src/common/diamond/facets/access-control/IAccessControl.sol":{"id":27},"src/common/diamond/facets/asset-registry/IAssetRegistry.sol":{"id":28},"lib/devtools/packages/oapp-evm/contracts/oapp/OAppSender.sol":{"id":1},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":13},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"id":22},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":17},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":20},"lib/devtools/packages/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol":{"id":2},"src/common/diamond/facets/transfer-restrictor/UserAddressMetadataLib.sol":{"id":31},"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol":{"id":30},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"id":10},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"id":9},"lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol":{"id":11},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol":{"id":6},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol":{"id":8},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol":{"id":5},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol":{"id":7},"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol":{"id":4}},"contracts":{"src/tokens/shares/retail/DShare.sol":{"DShare":{"abi":[{"type":"constructor","inputs":[{"name":"","type":"uint8","internalType":"uint8"},{"name":"","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"AllowanceOverflow","type":"error","inputs":[]},{"name":"AllowanceUnderflow","type":"error","inputs":[]},{"name":"AssetPaused","type":"error","inputs":[]},{"name":"EnforcedPause","type":"error","inputs":[]},{"name":"ExpectedPause","type":"error","inputs":[]},{"name":"FundingAssetPaused","type":"error","inputs":[]},{"name":"InsufficientAllowance","type":"error","inputs":[]},{"name":"InsufficientBalance","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"InvalidName","type":"error","inputs":[]},{"name":"InvalidPermit","type":"error","inputs":[]},{"name":"InvalidSymbol","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"Permit2AllowanceIsFixedAtInfinity","type":"error","inputs":[]},{"name":"PermitExpired","type":"error","inputs":[]},{"name":"SafeCastOverflowedUintDowncast","type":"error","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"TotalSupplyOverflow","type":"error","inputs":[]},{"name":"TransferRestrictor_AccountRestricted","type":"error","inputs":[]},{"name":"TransferRestrictor_NotSet","type":"error","inputs":[]},{"name":"TransferRestrictor_TransferPhase2_NotAllowed","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"ZeroRatio","type":"error","inputs":[]},{"name":"ZeroValue","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":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BalancePerShareSet","type":"event","inputs":[{"name":"balancePerShare","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DSharePaused","type":"event","inputs":[{"name":"asset","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"DShareUnpaused","type":"event","inputs":[{"name":"asset","type":"address","indexed":true,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"NameSet","type":"event","inputs":[{"name":"name","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"OFTSent","type":"event","inputs":[{"name":"guid","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"dstEid","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"amountSentLD","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amountReceivedLD","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SplitAdjusted","type":"event","inputs":[{"name":"num","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"den","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"balancePerShare","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"result","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SymbolSet","type":"event","inputs":[{"name":"symbol","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"TransferRestrictorSet","type":"event","inputs":[{"name":"transferRestrictor","type":"address","indexed":true,"internalType":"contract ITransferRestrictor"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"DOMAIN_SEPARATOR","type":"function","inputs":[],"outputs":[{"name":"result","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"accessControl","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAccessControl"}],"stateMutability":"view"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"applySplit","type":"function","inputs":[{"name":"to","type":"uint256","internalType":"uint256"},{"name":"from","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"approvalRequired","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"balancePerShare","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"balanceToShares","type":"function","inputs":[{"name":"balance","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"burnFrom","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"diamond","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"endpoint","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ILayerZeroEndpointV2"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"},{"name":"transferRestrictor_","type":"address","internalType":"contract ITransferRestrictor"},{"name":"accessControl_","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isBlacklisted","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isTransferAllowed","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"maxSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"nonces","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"permit","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"quoteSend","type":"function","inputs":[{"name":"_sendParam","type":"tuple","components":[{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"amountLD","type":"uint256","internalType":"uint256"},{"name":"minAmountLD","type":"uint256","internalType":"uint256"},{"name":"extraOptions","type":"bytes","internalType":"bytes"},{"name":"composeMsg","type":"bytes","internalType":"bytes"},{"name":"oftCmd","type":"bytes","internalType":"bytes"}],"internalType":"struct SendParam"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"}],"stateMutability":"view"},{"name":"reinitialize","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"send","type":"function","inputs":[{"name":"_sendParam","type":"tuple","components":[{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"amountLD","type":"uint256","internalType":"uint256"},{"name":"minAmountLD","type":"uint256","internalType":"uint256"},{"name":"extraOptions","type":"bytes","internalType":"bytes"},{"name":"composeMsg","type":"bytes","internalType":"bytes"},{"name":"oftCmd","type":"bytes","internalType":"bytes"}],"internalType":"struct SendParam"},{"name":"_fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"},{"name":"_refundAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"}],"internalType":"struct MessagingReceipt"},{"name":"","type":"tuple","components":[{"name":"amountSentLD","type":"uint256","internalType":"uint256"},{"name":"amountReceivedLD","type":"uint256","internalType":"uint256"}],"internalType":"struct OFTReceipt"}],"stateMutability":"payable"},{"name":"sendFrom","type":"function","inputs":[{"name":"_sendParam","type":"tuple","components":[{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"to","type":"bytes32","internalType":"bytes32"},{"name":"amountLD","type":"uint256","internalType":"uint256"},{"name":"minAmountLD","type":"uint256","internalType":"uint256"},{"name":"extraOptions","type":"bytes","internalType":"bytes"},{"name":"composeMsg","type":"bytes","internalType":"bytes"},{"name":"oftCmd","type":"bytes","internalType":"bytes"}],"internalType":"struct SendParam"},{"name":"_from","type":"address","internalType":"address"},{"name":"_fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"},{"name":"_refundAddress","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"fee","type":"tuple","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}],"internalType":"struct MessagingFee"}],"internalType":"struct MessagingReceipt"},{"name":"","type":"tuple","components":[{"name":"amountSentLD","type":"uint256","internalType":"uint256"},{"name":"amountReceivedLD","type":"uint256","internalType":"uint256"}],"internalType":"struct OFTReceipt"}],"stateMutability":"payable"},{"name":"setBalancePerShare","type":"function","inputs":[{"name":"balancePerShare_","type":"uint128","internalType":"uint128"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setName","type":"function","inputs":[{"name":"newName","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setSymbol","type":"function","inputs":[{"name":"newSymbol","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setTransferRestrictor","type":"function","inputs":[{"name":"newRestrictor","type":"address","internalType":"contract ITransferRestrictor"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sharedDecimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"name":"sharesOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"sharesToBalance","type":"function","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"token","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferRestrictor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ITransferRestrictor"}],"stateMutability":"view"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AllowanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowanceUnderflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AssetPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundingAssetPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidName\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPermit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSymbol\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Permit2AllowanceIsFixedAtInfinity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PermitExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TotalSupplyOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferRestrictor_AccountRestricted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferRestrictor_NotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferRestrictor_TransferPhase2_NotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRatio\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValue\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balancePerShare\",\"type\":\"uint256\"}],\"name\":\"BalancePerShareSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"DSharePaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"DShareUnpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NameSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"dstEid\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountSentLD\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountReceivedLD\",\"type\":\"uint256\"}],\"name\":\"OFTSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"num\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"den\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balancePerShare\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"name\":\"SplitAdjusted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"name\":\"SymbolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ITransferRestrictor\",\"name\":\"transferRestrictor\",\"type\":\"address\"}],\"name\":\"TransferRestrictorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"result\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControl\",\"outputs\":[{\"internalType\":\"contract IAccessControl\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"to\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"from\",\"type\":\"uint256\"}],\"name\":\"applySplit\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"approvalRequired\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balancePerShare\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"balanceToShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"diamond\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"contract ITransferRestrictor\",\"name\":\"transferRestrictor_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"accessControl_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"isTransferAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"dstEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amountLD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmountLD\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraOptions\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"composeMsg\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"oftCmd\",\"type\":\"bytes\"}],\"internalType\":\"struct SendParam\",\"name\":\"_sendParam\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"_payInLzToken\",\"type\":\"bool\"}],\"name\":\"quoteSend\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reinitialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"dstEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amountLD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmountLD\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraOptions\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"composeMsg\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"oftCmd\",\"type\":\"bytes\"}],\"internalType\":\"struct SendParam\",\"name\":\"_sendParam\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"_fee\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"send\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"fee\",\"type\":\"tuple\"}],\"internalType\":\"struct MessagingReceipt\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amountSentLD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountReceivedLD\",\"type\":\"uint256\"}],\"internalType\":\"struct OFTReceipt\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"dstEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"to\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"amountLD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmountLD\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraOptions\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"composeMsg\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"oftCmd\",\"type\":\"bytes\"}],\"internalType\":\"struct SendParam\",\"name\":\"_sendParam\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"_fee\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"sendFrom\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"fee\",\"type\":\"tuple\"}],\"internalType\":\"struct MessagingReceipt\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amountSentLD\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountReceivedLD\",\"type\":\"uint256\"}],\"internalType\":\"struct OFTReceipt\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"balancePerShare_\",\"type\":\"uint128\"}],\"name\":\"setBalancePerShare\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newName\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newSymbol\",\"type\":\"string\"}],\"name\":\"setSymbol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITransferRestrictor\",\"name\":\"newRestrictor\",\"type\":\"address\"}],\"name\":\"setTransferRestrictor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sharedDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"sharesOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"sharesToBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferRestrictor\",\"outputs\":[{\"internalType\":\"contract ITransferRestrictor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AllowanceOverflow()\":[{\"details\":\"The allowance has overflowed.\"}],\"AllowanceUnderflow()\":[{\"details\":\"The allowance has underflowed.\"}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"InsufficientAllowance()\":[{\"details\":\"Insufficient allowance.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"InvalidPermit()\":[{\"details\":\"The permit is invalid.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"Permit2AllowanceIsFixedAtInfinity()\":[{\"details\":\"The allowance of Permit2 is fixed at infinity.\"}],\"PermitExpired()\":[{\"details\":\"The permit has expired.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}],\"TotalSupplyOverflow()\":[{\"details\":\"The total supply has overflowed.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `amount` tokens is approved by `owner` to be used by `spender`.\"},\"BalancePerShareSet(uint256)\":{\"params\":{\"balancePerShare\":\"The new balance per share value\"}},\"DSharePaused(address,uint256)\":{\"params\":{\"asset\":\"Address of the asset being paused\",\"timestamp\":\"Time of pause\"}},\"DShareUnpaused(address,uint256)\":{\"params\":{\"asset\":\"Address of the asset being unpaused\",\"timestamp\":\"Time of unpause\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"NameSet(string)\":{\"params\":{\"name\":\"The new token name\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"SplitAdjusted(uint256,uint256,uint256,uint256)\":{\"params\":{\"balancePerShare\":\"Current balance per share\",\"den\":\"Denominator of the split ratio\",\"num\":\"Numerator of the split ratio\",\"result\":\"Resulting balance per share after split\"}},\"SymbolSet(string)\":{\"params\":{\"symbol\":\"The new token symbol\"}},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `amount` tokens is transferred from `from` to `to`.\"},\"TransferRestrictorSet(address)\":{\"params\":{\"transferRestrictor\":\"The new transfer restrictor address\"}},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Returns the EIP-712 domain separator for the EIP-2612 permit.\"},\"allowance(address,address)\":{\"details\":\"Returns the amount of tokens that `spender` can spend on behalf of `owner`.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Emits a {Approval} event.\"},\"balancePerShare()\":{\"details\":\"Returns the number of tokens an internal share amount represents. This amount is assumed to have 18 decimals and is divided by 10 **18 when applied.\"},\"burn(uint256)\":{\"details\":\"Only callable by approved burner\",\"params\":{\"value\":\"Amount of tokens to burn\"}},\"burnFrom(address,uint256)\":{\"details\":\"TOKEN_OPERATOR_ROLE can bypass allowance, others need allowance\",\"params\":{\"account\":\"Address to burn tokens from\",\"value\":\"Amount of tokens to burn\"}},\"constructor\":{\"details\":\"Both constructor args are unused — kept for ABI compatibility with      the existing `new DShare(18, endpoint)` call sites. The LZ endpoint      is read from the diamond at runtime via `endpoint()` (single source      of truth); the diamond is read from `_getdShareStorage()._accessControl`.\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"initialize(string,string,address,address,address)\":{\"details\":\"`delegate_` is accepted for ABI compatibility with the existing      DShareFactoryFacet.createDShare call site but is no longer used.\"},\"isBlacklisted(address)\":{\"params\":{\"account\":\"The address to check\"},\"returns\":{\"_0\":\"True if the restrictor facet reports the account as blacklisted\"}},\"isTransferAllowed(address,address)\":{\"details\":\"Returns false if the restrictor is unset; otherwise defers to the phase-2 rules\",\"params\":{\"from\":\"The address of the account\",\"to\":\"The address of the account\"},\"returns\":{\"_0\":\"Whether the transfer is allowed\"}},\"maxSupply()\":{\"details\":\"Useful for sanity checks before minting since the total supply of shares can overflow.\"},\"mint(address,uint256)\":{\"details\":\"Only callable by authorized admin\",\"params\":{\"to\":\"Address to mint tokens to\",\"value\":\"Amount of tokens to mint\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"Returns the current nonce for `owner`. This value is used to compute the signature for EIP-2612 permit.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Sets `value` as the allowance of `spender` over the tokens of `owner`, authorized by a signed approval by `owner`. Emits a {Approval} event.\"},\"setBalancePerShare(uint128)\":{\"details\":\"Relies on offchain computation of aggregate splits and reverse splits\"},\"setName(string)\":{\"details\":\"Only callable by owner or deployer\"},\"setSymbol(string)\":{\"details\":\"Only callable by owner or deployer\"},\"setTransferRestrictor(address)\":{\"details\":\"Only callable by owner\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"transfer(address,uint256)\":{\"details\":\"Transfer `amount` tokens from the caller to `to`. Requirements: - `from` must at least have `amount`. Emits a {Transfer} event.\"},\"transferRestrictor()\":{\"returns\":{\"_0\":\"The transfer restrictor implementation\"}}},\"stateVariables\":{\"dShareStorageLocation\":{\"details\":\"keccak256(abi.encode(uint256(keccak256(\\\"dinaricrypto.storage.DShare\\\")) - 1)) & ~bytes32(uint256(0xff))\"}},\"title\":\"DShare (Retail)\",\"version\":1},\"userdoc\":{\"errors\":{\"AssetPaused()\":[{\"notice\":\"Thrown when attempting operations on a paused asset\"}],\"FundingAssetPaused()\":[{\"notice\":\"Thrown when funding asset is paused\"}],\"InvalidName()\":[{\"notice\":\"Thrown when token name is invalid\"}],\"InvalidSymbol()\":[{\"notice\":\"Thrown when token symbol is invalid\"}],\"TransferRestrictor_AccountRestricted()\":[{\"notice\":\"Thrown when account is restricted from transfers\"}],\"TransferRestrictor_NotSet()\":[{\"notice\":\"Thrown when Transfer Restrictor is not set and a transfer is attempted by a non-operator role\"}],\"TransferRestrictor_TransferPhase2_NotAllowed()\":[{\"notice\":\"Thrown when a transfer fails the phase-2 jurisdiction rules\"}],\"ZeroAddress()\":[{\"notice\":\"Thrown when zero address is provided where not allowed\"}],\"ZeroRatio()\":[{\"notice\":\"Thrown when zero ratio is provided where not allowed\"}],\"ZeroValue()\":[{\"notice\":\"Thrown when zero value is provided where not allowed\"}]},\"events\":{\"BalancePerShareSet(uint256)\":{\"notice\":\"Emitted when balance per share multiplier is updated (for splits)\"},\"DSharePaused(address,uint256)\":{\"notice\":\"Emitted when DShare is paused\"},\"DShareUnpaused(address,uint256)\":{\"notice\":\"Emitted when DShare is unpaused\"},\"NameSet(string)\":{\"notice\":\"Emitted when token name is updated\"},\"SplitAdjusted(uint256,uint256,uint256,uint256)\":{\"notice\":\"Emitted when split factor is adjusted\"},\"SymbolSet(string)\":{\"notice\":\"Emitted when token symbol is updated\"},\"TransferRestrictorSet(address)\":{\"notice\":\"Emitted when transfer restrictor contract is updated\"}},\"kind\":\"user\",\"methods\":{\"accessControl()\":{\"notice\":\"Interface to the AccessControlFacet on the diamond\"},\"burn(uint256)\":{\"notice\":\"Burn tokens\"},\"burnFrom(address,uint256)\":{\"notice\":\"Burn tokens from an account\"},\"diamond()\":{\"notice\":\"Returns the diamond hosting the LZ routing facet for this token.\"},\"initialize(string,string,address,address,address)\":{\"notice\":\"Initializes a DShare token via beacon proxy.\"},\"isBlacklisted(address)\":{\"notice\":\"Checks if an account is blacklisted via the configured restrictor facet\"},\"maxSupply()\":{\"notice\":\"Returns the maximum supply of the token in balance.\"},\"mint(address,uint256)\":{\"notice\":\"Mint tokens\"},\"reinitialize()\":{\"notice\":\"Reinitializes the contract (e.g. to add new functionality)\"},\"setBalancePerShare(uint128)\":{\"notice\":\"Update split factor\"},\"setName(string)\":{\"notice\":\"Set token name\"},\"setSymbol(string)\":{\"notice\":\"Set token symbol\"},\"setTransferRestrictor(address)\":{\"notice\":\"Set transfer restrictor contract\"},\"totalSupply()\":{\"notice\":\"------------------ ERC20 ------------------\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Override transferFrom to allow TOKEN_OPERATOR_ROLE bypass allowance\"},\"transferRestrictor()\":{\"notice\":\"Returns the transfer restrictor contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/shares/retail/DShare.sol\":\"DShare\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@chainlink-evm/=lib/chainlink-evm/\",\":@layerzerolabs/layerzero-v2-mock/=lib/devtools/packages/test-devtools-evm-foundry/\",\":@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/\",\":@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/\",\":@layerzerolabs/lz-evm-v1-0.7/=lib/LayerZero-v1/\",\":@layerzerolabs/oapp-alt-evm/=lib/devtools/packages/oapp-alt-evm/\",\":@layerzerolabs/oapp-evm-upgradeable/=lib/devtools/packages/oapp-evm-upgradeable/\",\":@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/\",\":@layerzerolabs/oft-alt-evm/=lib/devtools/packages/oft-alt-evm/\",\":@layerzerolabs/oft-evm-upgradeable/=lib/devtools/packages/oft-evm-upgradeable/\",\":@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@permit2-oz/=lib/permit2/lib/openzeppelin-contracts/contracts/\",\":@permit2-test/=lib/permit2/test/\",\":@permit2/=lib/permit2/src/\",\":@prb/test/=lib/prb-test/src/\",\":@solady/=lib/solady/\",\":LayerZero-v1/=lib/LayerZero-v1/contracts/\",\":chainlink-evm/=lib/chainlink-evm/\",\":devtools/=lib/devtools/packages/toolbox-foundry/src/\",\":ds-test/=lib/permit2/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-gas-snapshot/=lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":layerzero-v2/=lib/layerzero-v2/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":permit2/=lib/permit2/\",\":prb-math/=lib/prb-math/src/\",\":prb-test/=lib/prb-test/src/\",\":solady/=lib/solady/src/\",\":solidity-bytes-utils/=lib/solidity-bytes-utils/\",\":solidity-examples/=lib/solidity-examples/contracts/\",\":solmate/=lib/permit2/lib/solmate/\",\":src/=src/\"],\"viaIR\":true},\"sources\":{\"lib/devtools/packages/oapp-evm/contracts/oapp/OAppCore.sol\":{\"keccak256\":\"0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0\",\"dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH\"]},\"lib/devtools/packages/oapp-evm/contracts/oapp/OAppSender.sol\":{\"keccak256\":\"0x518cf4adca601923ed4baa6619846a253ea32b8d8775f8bc1faa3dfac7f67c20\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d42b471418efadcc3577ef3fa9f8f504e8bed7db90c3b0c862038d8b29529eb2\",\"dweb:/ipfs/QmZETDQiJN4U92fmLKo8T9ZbdDf7BNBUUvo9H7M7GqAyFU\"]},\"lib/devtools/packages/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\":{\"keccak256\":\"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd\",\"dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv\"]},\"lib/devtools/packages/oft-evm/contracts/interfaces/IOFT.sol\":{\"keccak256\":\"0xc60c7b4374b3d89f33b8de982f463c92374a8548800c816fe776f0ec76351fb0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9e2ae9efc2a93373e822b148b3a3b50e3562c8c317f2e71d73cf4a11dede9d15\",\"dweb:/ipfs/QmahCbqvqEcWLJpqE6EbHHTuSbnGWyo35ZBVqoyKv18BSF\"]},\"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol\":{\"keccak256\":\"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083\",\"dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs\"]},\"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol\":{\"keccak256\":\"0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a\",\"dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB\"]},\"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol\":{\"keccak256\":\"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927\",\"dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S\"]},\"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol\":{\"keccak256\":\"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d\",\"dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk\"]},\"lib/layerzero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol\":{\"keccak256\":\"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6\",\"dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/PausableUpgradeable.sol\":{\"keccak256\":\"0xa6bf6b7efe0e6625a9dcd30c5ddf52c4c24fe8372f37c7de9dbf5034746768d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c353ee3705bbf6fadb84c0fb10ef1b736e8ca3ca1867814349d1487ed207beb\",\"dweb:/ipfs/QmcugaPssrzGGE8q4YZKm2ZhnD3kCijjcgdWWg76nWt3FY\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"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/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/solady/src/tokens/ERC20.sol\":{\"keccak256\":\"0x19826a737039994947e9971d996e80c658f3c380705e30e7d1b5c40d35f454ac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d263a519a7c567c3af3ee7b6e223e3d37863ac35d8611131a98888b54e749141\",\"dweb:/ipfs/QmUj8FZcJgx76YeFb13ZKgKBDCMwPkhycEJhZCpuEG6xUe\"]},\"lib/solady/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x1ed875fc4a88beb012f15cbe111e69b402517adda61e5da88c55c73faf76a90f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ce07f2ee0577806e6f7dba79ab5a01a9751e6e3bffc40218c5e80e68e6bf088e\",\"dweb:/ipfs/QmVo7z5TDp1a6KVMYotNv37a5Xspcexum7Dx8h1qHLcAz8\"]},\"src/common/AccessControlledUpgradeable.sol\":{\"keccak256\":\"0x4f4ef7a5b24345a9b494ea42c2854506fe4800511fc40812348607a9a297175a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cf92881efade05e30cf92e4616b757eddb284854958205f356f6114559da0ded\",\"dweb:/ipfs/QmQBYSm5LrbuCWdcPdZFb534njvkv5fJKH6wFuQ4hDgTkU\"]},\"src/common/diamond/Constants.sol\":{\"keccak256\":\"0xf86abecc157a5284ff6542d713f923ca241eeb17646a27ad849ba50b634bdb7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f2b35912b677e8759259b2e33978d31d1a46ccf064bff335556beea1ac01d05b\",\"dweb:/ipfs/QmcwW2nWBdgj1ybLP4bB1eBX1XkuTZ4g5eLrCUa1JXPx6S\"]},\"src/common/diamond/facets/access-control/IAccessControl.sol\":{\"keccak256\":\"0x4a25a5722142c8e261cbd4dbc4fa3a6c272a67ef650be4453a5fe20cdc330b86\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0417500540e19a11afa6392f001ec3b841df178a7edaa59b34ebc6760c898d32\",\"dweb:/ipfs/QmZRPnu5rrhik4DFh7ZaPr1UPUVurqpGnVhE6Wcma7xgrh\"]},\"src/common/diamond/facets/asset-registry/IAssetRegistry.sol\":{\"keccak256\":\"0x87c879720ea73781dc60404761b55554281700293d2baab77d9a7d0e900308b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://31283d6e4773dd8b8c85fa71fde02b96e03fbf9083d7f951d27bcf7829378c83\",\"dweb:/ipfs/QmYh5y5jTDs46yekjqunfeQB79dzPS6KYUFdzoddNUsuWn\"]},\"src/common/diamond/facets/lz-routing/ILZRouting.sol\":{\"keccak256\":\"0xbfb95b5134d1e55ad67e8453d522c1a67c87756cfd1354057f6ba6e3e5c3a6e1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://54c38ef88319718f6c61032bb1413cb28ea285af33ab64983f6cf47aac56a991\",\"dweb:/ipfs/Qmf9jmQBdA6yvSuq4reSpvtuNtavqshNeTH7Yew6hmQSsE\"]},\"src/common/diamond/facets/transfer-restrictor/ITransferRestrictorFacet.sol\":{\"keccak256\":\"0xb5d48caf3d3877627040bc8d6ef87605b46425ef9d489f91661130892158fee8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46b65b07812930f64fb8320bac37aed83f0b18eeba12f84c76b9e6da2c50647f\",\"dweb:/ipfs/QmRk8C6BSDuZyyVVqox5xpLMUGLo8KHdNSToPJDN7FkCHX\"]},\"src/common/diamond/facets/transfer-restrictor/UserAddressMetadataLib.sol\":{\"keccak256\":\"0xc9ea453b405dcfeac9e676d82e23c6722462819682c1707ca3e19ff544aac4c1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f0db1d2a5706b8fb5fb1fc6afb9daffceab72a9a48bb5827d58bdfed2214efd5\",\"dweb:/ipfs/QmX9XpScshM3wbGH4kjUm4ryUSSZpytBkrG3nBUV67vfFE\"]},\"src/common/utils/NumberUtils.sol\":{\"keccak256\":\"0x9261394513e7e2a231e977f187314216090619cc788aa81f77b2930382ca9fbe\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://32a4eb31bd2fb1f0c4924f9c4c6a476fb6f32a606408996cb9a4f2151ca7f6d2\",\"dweb:/ipfs/QmTte8FdM1wVbJ6k5tQkaEsggujyGUi9iDJQzJtGfU9abo\"]},\"src/tokens/ERC20Rebasing.sol\":{\"keccak256\":\"0x3156c519e4f48a77b2d49ba35902f05f36e0d2cb6fc97359b008f167c1b7e332\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a059d7f6aef1e2e396af7eff6812a71f8f6f188f9101c64525cbff73ae619846\",\"dweb:/ipfs/QmTsdASmCYcB4Sp3PY18NvmmxPr2XsV33fhGeLKjo6cSLV\"]},\"src/tokens/shares/IDShare.sol\":{\"keccak256\":\"0x81764acd688d4ecf1b86f36b356dc4dd2bf0622450f7ad12c6d058b9164bfa69\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://447d985152ccfbc16530b5001c466c103844ca330da653235fbdf1c8559cc7c0\",\"dweb:/ipfs/QmeTVQE3HMd15kjgD4RjduXzrg9Km4TtQQXLZp7yGW67ST\"]},\"src/tokens/shares/ITransferRestrictor.sol\":{\"keccak256\":\"0xbe4eed7f33e384a8a17e2cf8646b31befa004d46957a8b55eb7d7acf1e75cb36\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c25825a26e4f9822e318bc8d30a49ee86a00231c4da5e7a18ac12ac6ee3315f8\",\"dweb:/ipfs/QmbMgJoVcxs3QPNSjPzmDuVwjPVrHE9ek6xJpjCKauYZSB\"]},\"src/tokens/shares/retail/DShare.sol\":{\"keccak256\":\"0x20e5d83e6a566162d25790e69e3a857e098aa00eb594506045460b9cc84cc3e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b55a3f0c599116743beb6b014e840de944850350bcbac445bcc44853a53218b8\",\"dweb:/ipfs/QmPQVhbsRMaoktq95FB9MHPHQ6vNAm6CWNvT5BQssyjjb8\"]}},\"version\":1}","userdoc":{"kind":"user","errors":{"ZeroRatio()":[{"notice":"Thrown when zero ratio is provided where not allowed"}],"ZeroValue()":[{"notice":"Thrown when zero value is provided where not allowed"}],"AssetPaused()":[{"notice":"Thrown when attempting operations on a paused asset"}],"InvalidName()":[{"notice":"Thrown when token name is invalid"}],"ZeroAddress()":[{"notice":"Thrown when zero address is provided where not allowed"}],"InvalidSymbol()":[{"notice":"Thrown when token symbol is invalid"}],"FundingAssetPaused()":[{"notice":"Thrown when funding asset is paused"}],"TransferRestrictor_NotSet()":[{"notice":"Thrown when Transfer Restrictor is not set and a transfer is attempted by a non-operator role"}],"TransferRestrictor_AccountRestricted()":[{"notice":"Thrown when account is restricted from transfers"}],"TransferRestrictor_TransferPhase2_NotAllowed()":[{"notice":"Thrown when a transfer fails the phase-2 jurisdiction rules"}]},"events":{"NameSet(string)":{"notice":"Emitted when token name is updated"},"SymbolSet(string)":{"notice":"Emitted when token symbol is updated"},"BalancePerShareSet(uint256)":{"notice":"Emitted when balance per share multiplier is updated (for splits)"},"DSharePaused(address,uint256)":{"notice":"Emitted when DShare is paused"},"TransferRestrictorSet(address)":{"notice":"Emitted when transfer restrictor contract is updated"},"DShareUnpaused(address,uint256)":{"notice":"Emitted when DShare is unpaused"},"SplitAdjusted(uint256,uint256,uint256,uint256)":{"notice":"Emitted when split factor is adjusted"}},"methods":{"diamond()":{"notice":"Returns the diamond hosting the LZ routing facet for this token."},"maxSupply()":{"notice":"Returns the maximum supply of the token in balance."},"burn(uint256)":{"notice":"Burn tokens"},"totalSupply()":{"notice":"------------------ ERC20 ------------------"},"reinitialize()":{"notice":"Reinitializes the contract (e.g. to add new functionality)"},"accessControl()":{"notice":"Interface to the AccessControlFacet on the diamond"},"setName(string)":{"notice":"Set token name"},"setSymbol(string)":{"notice":"Set token symbol"},"transferRestrictor()":{"notice":"Returns the transfer restrictor contract"},"mint(address,uint256)":{"notice":"Mint tokens"},"isBlacklisted(address)":{"notice":"Checks if an account is blacklisted via the configured restrictor facet"},"burnFrom(address,uint256)":{"notice":"Burn tokens from an account"},"setBalancePerShare(uint128)":{"notice":"Update split factor"},"setTransferRestrictor(address)":{"notice":"Set transfer restrictor contract"},"transferFrom(address,address,uint256)":{"notice":"Override transferFrom to allow TOKEN_OPERATOR_ROLE bypass allowance"},"initialize(string,string,address,address,address)":{"notice":"Initializes a DShare token via beacon proxy."}},"version":1},"devdoc":{"kind":"dev","title":"DShare (Retail)","errors":{"EnforcedPause()":[{"details":"The operation failed because the contract is paused."}],"ExpectedPause()":[{"details":"The operation failed because the contract is not paused."}],"InvalidPermit()":[{"details":"The permit is invalid."}],"PermitExpired()":[{"details":"The permit has expired."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"AllowanceOverflow()":[{"details":"The allowance has overflowed."}],"AllowanceUnderflow()":[{"details":"The allowance has underflowed."}],"InsufficientBalance()":[{"details":"Insufficient balance."}],"TotalSupplyOverflow()":[{"details":"The total supply has overflowed."}],"InsufficientAllowance()":[{"details":"Insufficient allowance."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}],"Permit2AllowanceIsFixedAtInfinity()":[{"details":"The allowance of Permit2 is fixed at infinity."}],"SafeCastOverflowedUintDowncast(uint8,uint256)":[{"details":"Value doesn't fit in an uint of `bits` size."}]},"events":{"NameSet(string)":{"params":{"name":"The new token name"}},"Paused(address)":{"details":"Emitted when the pause is triggered by `account`."},"SymbolSet(string)":{"params":{"symbol":"The new token symbol"}},"Unpaused(address)":{"details":"Emitted when the pause is lifted by `account`."},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"BalancePerShareSet(uint256)":{"params":{"balancePerShare":"The new balance per share value"}},"DSharePaused(address,uint256)":{"params":{"asset":"Address of the asset being paused","timestamp":"Time of pause"}},"TransferRestrictorSet(address)":{"params":{"transferRestrictor":"The new transfer restrictor address"}},"DShareUnpaused(address,uint256)":{"params":{"asset":"Address of the asset being unpaused","timestamp":"Time of unpause"}},"Approval(address,address,uint256)":{"details":"Emitted when `amount` tokens is approved by `owner` to be used by `spender`."},"Transfer(address,address,uint256)":{"details":"Emitted when `amount` tokens is transferred from `from` to `to`."},"SplitAdjusted(uint256,uint256,uint256,uint256)":{"params":{"den":"Denominator of the split ratio","num":"Numerator of the split ratio","result":"Resulting balance per share after split","balancePerShare":"Current balance per share"}}},"methods":{"name()":{"details":"Returns the name of the token."},"paused()":{"details":"Returns true if the contract is paused, and false otherwise."},"symbol()":{"details":"Returns the symbol of the token."},"decimals()":{"details":"Returns the decimals places of the token."},"constructor":{"details":"Both constructor args are unused — kept for ABI compatibility with      the existing `new DShare(18, endpoint)` call sites. The LZ endpoint      is read from the diamond at runtime via `endpoint()` (single source      of truth); the diamond is read from `_getdShareStorage()._accessControl`."},"maxSupply()":{"details":"Useful for sanity checks before minting since the total supply of shares can overflow."},"burn(uint256)":{"params":{"value":"Amount of tokens to burn"},"details":"Only callable by approved burner"},"nonces(address)":{"details":"Returns the current nonce for `owner`. This value is used to compute the signature for EIP-2612 permit."},"setName(string)":{"details":"Only callable by owner or deployer"},"balancePerShare()":{"details":"Returns the number of tokens an internal share amount represents. This amount is assumed to have 18 decimals and is divided by 10 **18 when applied."},"setSymbol(string)":{"details":"Only callable by owner or deployer"},"DOMAIN_SEPARATOR()":{"details":"Returns the EIP-712 domain separator for the EIP-2612 permit."},"transferRestrictor()":{"returns":{"_0":"The transfer restrictor implementation"}},"mint(address,uint256)":{"params":{"to":"Address to mint tokens to","value":"Amount of tokens to mint"},"details":"Only callable by authorized admin"},"isBlacklisted(address)":{"params":{"account":"The address to check"},"returns":{"_0":"True if the restrictor facet reports the account as blacklisted"}},"approve(address,uint256)":{"details":"Sets `amount` as the allowance of `spender` over the caller's tokens. Emits a {Approval} event."},"burnFrom(address,uint256)":{"params":{"value":"Amount of tokens to burn","account":"Address to burn tokens from"},"details":"TOKEN_OPERATOR_ROLE can bypass allowance, others need allowance"},"transfer(address,uint256)":{"details":"Transfer `amount` tokens from the caller to `to`. Requirements: - `from` must at least have `amount`. Emits a {Transfer} event."},"allowance(address,address)":{"details":"Returns the amount of tokens that `spender` can spend on behalf of `owner`."},"setBalancePerShare(uint128)":{"details":"Relies on offchain computation of aggregate splits and reverse splits"},"setTransferRestrictor(address)":{"details":"Only callable by owner"},"isTransferAllowed(address,address)":{"params":{"to":"The address of the account","from":"The address of the account"},"details":"Returns false if the restrictor is unset; otherwise defers to the phase-2 rules","returns":{"_0":"Whether the transfer is allowed"}},"initialize(string,string,address,address,address)":{"details":"`delegate_` is accepted for ABI compatibility with the existing      DShareFactoryFacet.createDShare call site but is no longer used."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":{"details":"Sets `value` as the allowance of `spender` over the tokens of `owner`, authorized by a signed approval by `owner`. Emits a {Approval} event."}},"version":1,"stateVariables":{"dShareStorageLocation":{"details":"keccak256(abi.encode(uint256(keccak256(\"dinaricrypto.storage.DShare\")) - 1)) & ~bytes32(uint256(0xff))"}}},"storageLayout":{"types":{"t_contract(IAccessControl)8462":{"label":"contract IAccessControl","encoding":"inplace","numberOfBytes":"20"}},"storage":[{"slot":"0","type":"t_contract(IAccessControl)8462","astId":8210,"label":"accessControl","offset":0,"contract":"src/tokens/shares/retail/DShare.sol:DShare"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"60803461010257601f6134a338819003918201601f19168301916001600160401b0383118484101761010657808492604094855283398101031261010257805160ff81160361010257602001516001600160a01b03811603610102575f5160206134835f395f51905f525460ff8160401c166100f3576002600160401b03196001600160401b0382160161009d575b604051613368908161011b8239f35b6001600160401b0319166001600160401b039081175f5160206134835f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61008e565b63f92ee8a960e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461230c578063095ea7b31461227d57806313007d551461225657806318160ddd1461222657806323b872dd146121f7578063313ce567146121dc5780633644e515146121545780633abc107914611ddf5780633b6f743b14611c825780633f4ba83a14611ba857806340c10f19146119a557806342966c68146119405780634904ac8f1461188857806353735f37146118595780635c975abb1461182b5780635e280f11146117a95780636c2eb350146116ef57806370a08231146116ab57806379cc6790146116395780637ecebe0014611607578063804d4ffc146114675780638456cb591461136b578063857749b01461135057806395d89b411461126257806397e2b9af146112365780639f68b9641461121c578063a781a3fd146111f1578063a850e02414611138578063a9059cbb14611107578063b84c824614610f59578063c47f002714610d6a578063c7c7f5b3146109a8578063d4ec137a14610961578063d505accf1461079b578063d5abeb0114610781578063d8ddf18f14610752578063db0ed6a0146102cc578063dd62ed3e14610298578063f0b7db4e14610264578063f5eb42dc14610232578063fc0c546a146102185763fe575a87146101e7575f80fd5b3461021457602036600319011261021457602061020a610205612351565b612b6b565b6040519015158152f35b5f80fd5b34610214575f366003190112610214576020604051308152f35b346102145760203660031901126102145761024b612351565b6387a211a2600c525f52602080600c2054604051908152f35b34610214575f366003190112610214575f5160206132e85f395f51905f52546040516001600160a01b039091168152602090f35b346102145760403660031901126102145760206102c46102b6612351565b6102be612367565b90612b2e565b604051908152f35b346102145760a0366003190112610214576004356001600160401b038111610214576102fc903690600401612492565b6024356001600160401b0381116102145761031b903690600401612492565b906044356001600160a01b0381169081810361021457610339612393565b9261034261237d565b505f5160206133285f395f51905f5254936001600160401b0360ff8660401c161595168015908161074a575b6001149081610740575b159081610737575b50610728578460016001600160401b03195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556106f3575b6001600160a01b03169283156106e457156106e4578051156106d5578451156106c6578051906001600160401b0382116106175761040a826104055f5160206133485f395f51905f52546124e7565b61298a565b602090601f831160011461062b5761043992915f918361058b575b50508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b83516001600160401b03811161061757610479816104745f5160206132a85f395f51905f52546124e7565b61292e565b6020601f82116001146105965790806104ac926104c09596975f9261058b5750508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f52556127cc565b5f5160206132c85f395f51905f5280546fffffffffffffffffffffffffffffffff1916670de0b6b3a76400001790555f5160206132e85f395f51905f5280546001600160a01b03191682179055610515613224565b6bffffffffffffffffffffffff60a01b5f5416175f55610533613224565b61053957005b60ff60401b195f5160206133285f395f51905f5254165f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508780610425565b601f198216955f5160206132a85f395f51905f525f52815f20965f5b8181106105ff5750916104c0959697918460019594106105e7575b505050811b015f5160206132a85f395f51905f52556127cc565b01515f1960f88460031b161c191690558680806105cd565b838301518955600190980197602093840193016105b2565b634e487b7160e01b5f52604160045260245ffd5b90601f198316915f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372925f5b8181106106ae5750908460019594939210610696575b505050811b015f5160206133485f395f51905f5255610449565b01515f1960f88460031b161c1916905586808061067c565b92936020600181928786015181550195019301610666565b63010466f160e21b5f5260045ffd5b63430f13b360e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6801000000000000000060ff60401b195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556103b6565b63f92ee8a960e01b5f5260045ffd5b90501587610380565b303b159150610378565b86915061036e565b346102145760203660031901126102145760206102c46001600160801b03610778612900565b16600435613026565b34610214575f3660031901126102145760206102c46129e6565b346102145760e0366003190112610214576107b4612351565b6107bc612367565b604435916064356084359260ff84168403610214576001600160a01b0316936e22d473030f116ddee9f6b43ac78ba385188119151715610954576107fe61251f565b6020815191012090824211610947576040519360018060a01b03169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361093a577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b34610214575f366003190112610214577f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185802546040516001600160a01b039091168152602090f35b6080366003190112610214576004356001600160401b0381116102145760e081600401916003199036030112610214576040366023190112610214576109ec612393565b6109f4612637565b506109fd61261f565b50610a06612d3a565b610a0f33612d61565b610a17612637565b50610a2061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b81526001600160a01b0390911691602082600481865afa918215610bf8576004926020915f91610d3d575b50604051631c2eb17b60e31b815293849182906001600160a01b03165afa8015610bf8575f90610cf8575b60c092506001600160a01b031680151580610ced575b610c03575b5060405192838080936362385ce160e11b825233600483015260a06024830152610ad960a48301896126e2565b906024356044840152604435606484015260018060a01b03166084830152039134905af1918215610bf8575f915f93610b72575b50815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b0390f35b9150915060c03d60c011610bf1575b610b8b8183612471565b81019080820360c08112610214576080136102145760405191610bad83612456565b8151835260208201516001600160401b038116810361021457610bea926080916020860152610bdf8360408301612669565b604086015201612669565b9183610b0d565b503d610b81565b6040513d5f823e3d90fd5b602435610c406040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b8361324f565b60205f604051928284019063095ea7b360e01b8252886024860152604485015260448452610c6f606485612471565b83519082865af15f513d82610cd1575b505015610c8d575b50610aac565b610cca91610cc560405163095ea7b360e01b60208201528760248201525f604482015260448152610cbf606482612471565b8261324f565b61324f565b8480610c87565b909150610ce55750813b15155b8780610c7f565b600114610cde565b506024351515610aa7565b50906020813d602011610d35575b81610d1360209383612471565b810103126102145751906001600160a01b03821682036102145760c091610a91565b3d9150610d06565b610d5d9150823d8411610d63575b610d558183612471565b81019061282c565b86610a66565b503d610d4b565b3461021457610d78366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610dc4915f91610f2a575b5061278d565b6001600160401b03821161061757610ded826104055f5160206133485f395f51905f52546124e7565b5f91601f8111600114610e7257610e3b81807f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf955f91610e67575b508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b610e626040519283926020845260208401916126c2565b0390a1005b905084013586610e28565b601f198116925f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372905f5b858110610f125750827f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf9510610ef9575b5050600181811b015f5160206133485f395f51905f5255610e4b565b8301355f19600384901b60f8161c191690558380610edd565b90916020600181928588013581550193019101610eac565b610f4c915060203d602011610f52575b610f448183612471565b810190612775565b84610dbe565b503d610f3a565b3461021457610f67366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610fb2915f91610f2a575061278d565b6001600160401b03821161061757610fdb826104745f5160206132a85f395f51905f52546124e7565b5f91601f811160011461104e5761102881807f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99955f91610e6757508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f5255610e626040519283926020845260208401916126c2565b5f5160206132a85f395f51905f525f908152601f198216937f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc915b8581106110ef5750827f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c9995106110d6575b5050600181811b015f5160206132a85f395f51905f5255610e4b565b8301355f19600384901b60f8161c1916905583806110ba565b90916020600181928588013581550193019101611089565b346102145760403660031901126102145761112d611123612351565b6024359033612c10565b602060405160018152f35b34610214576020366003190112610214576004356001600160801b03811690818103610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576111a6915f91610f2a575061278d565b81156111e2577f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13916111d960209261284b565b604051908152a1005b637c946ed760e01b5f5260045ffd5b34610214575f36600319011261021457602061120b612900565b6001600160801b0360405191168152f35b34610214575f3660031901126102145760206040515f8152f35b3461021457604036600319011261021457602061020a611254612351565b61125c612367565b9061287f565b34610214575f366003190112610214576040515f5f5160206132a85f395f51905f525461128e816124e7565b808452906001811690811561132c57506001146112c2575b610b6e836112b681850382612471565b60405191829182612327565b5f5160206132a85f395f51905f525f9081527f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc939250905b808210611312575090915081016020016112b66112a6565b9192600181602092548385880101520191019092916112fa565b60ff191660208086019190915291151560051b840190910191506112b690506112a6565b34610214575f36600319011261021457602060405160098152f35b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576113c3915f91611448575061278d565b6113cb612d3a565b600160ff195f5160206133085f395f51905f525416175f5160206133085f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a16040514281527fba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd660203092a2005b611461915060203d602011610f5257610f448183612471565b82610dbe565b34610214576040366003190112610214575f546040516395a8c58d60e01b8152336004808301919091526002602480840191909152359290359190602090829060449082906001600160a01b03165afa8015610bf8576114cd915f91610f2a575061278d565b6114d5613149565b801515806115fe575b156115ef575f5160206132c85f395f51905f52546001600160801b0316806115e157506001600160801b03670de0b6b3a76400005b1661151f838383613171565b926001600160801b0384116115c95792608092917f8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b946115676001600160801b03841661284b565b7f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf136020604051858152a1604051938452602084015260408301526060820152a160206001600160801b035f5160206132c85f395f51905f525416604051908152f35b836306dfcc6560e41b5f52608060045260245260445ffd5b6001600160801b0390611513565b631d94864560e11b5f5260045ffd5b508115156114de565b3461021457602036600319011261021457611620612351565b6338377508600c525f52602080600c2054604051908152f35b3461021457604036600319011261021457611652612351565b5f546040516395a8c58d60e01b8152336004820152600260248201529190602090839060449082906001600160a01b03165afa918215610bf8576116a9926116a0915f91610f2a575061278d565b60243590612e53565b005b34610214576020366003190112610214576116c4612351565b6387a211a2600c525f5260206102c481600c20546001600160801b036116e8612900565b1690612f9f565b34610214575f366003190112610214575f5160206133285f395f51905f525460ff8160401c16908115611794575b50610728575f5160206133285f395f51905f52805468ffffffffffffffffff1916680100000000000000048117909155600417611758613224565b5f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160048152a1005b600491506001600160401b031610158161171d565b34610214575f366003190112610214575f5160206132e85f395f51905f5254604051635e280f1160e01b815290602090829060049082906001600160a01b03165afa8015610bf8576020915f9161180e575b506040516001600160a01b039091168152f35b6118259150823d8411610d6357610d558183612471565b826117fb565b34610214575f36600319011261021457602060ff5f5160206133085f395f51905f5254166040519015158152f35b346102145760203660031901126102145760206102c46001600160801b0361187f612900565b16600435612f9f565b34610214576020366003190112610214576118a1612351565b5f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576118e9915f91611921575061278d565b6118f2816127cc565b6001600160a01b03167fc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea45f80a2005b61193a915060203d602011610f5257610f448183612471565b83610dbe565b34610214576020366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611999915f91611448575061278d565b6116a960043533612e53565b34610214576040366003190112610214576119be612351565b5f546040516395a8c58d60e01b81523360048201526002602480830191909152359291602090829060449082906001600160a01b03165afa8015610bf857611a0c915f91610f2a575061278d565b6001600160a01b03811680156106e4575f5160206132e85f395f51905f52546001600160a01b031690611a3e33612bcb565b15611b27575b50506805345cdf77eb68f44c5490611a6c6001600160801b03611a65612900565b1684613026565b91828101908110611b02576001600160801b03611a87612900565b16670de0b6b3a7640000611a9c8183856130c3565b918309611b11575b611aac6129e6565b10611b02576805345cdf77eb68f44c556387a211a2600c525f526020600c20908154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3005b63e5cfe95760e01b5f5260045ffd5b60010180611aa4575b63ae47f7025f526004601cfd5b8115611b99576020906044604051809481936383609b0f60e01b83525f600484015260248301525afa908115610bf8575f91611b7a575b5015611b6b578280611a44565b6315df7de160e31b5f5260045ffd5b611b93915060203d602011610f5257610f448183612471565b83611b5e565b630588ca9560e01b5f5260045ffd5b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611c00915f91611448575061278d565b611c08613149565b60ff195f5160206133085f395f51905f5254165f5160206133085f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a16040514281527fcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de60203092a2005b34610214576040366003190112610214576004356001600160401b0381116102145760e06003198236030112610214576024359081151580920361021457611cc861261f565b505f5160206132e85f395f51905f525460405163f99e156960e01b81523060048201526001600160a01b0390911690602081602481855afa908115610bf8575f91611daa575b5090604092611d43928451958694859384936315efa6af60e11b855260048501526060602485015260648401906004016126e2565b90604483015203915afa8015610bf8575f90611d6f575b60409060208251918051835201516020820152f35b5060403d604011611da3575b611d858183612471565b81019060408183031261021457604091611d9e91612669565b611d5a565b503d611d7b565b9190506020823d602011611dd7575b81611dc660209383612471565b810103126102145790516040611d0e565b3d9150611db9565b60a0366003190112610214576004356001600160401b03811161021457806004019060e0600319823603011261021457611e17612367565b604036604319011261021457611e2b61237d565b91611e34612637565b50611e3d61261f565b50611e46612d3a565b611e4f82612d61565b611e5833612bcb565b1561210b575b50611e67612637565b50611e7061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b815291906001600160a01b0316602083600481845afa928315610bf8576004936020915f916120ee575b50604051631c2eb17b60e31b815294859182906001600160a01b03165afa8015610bf8575f906120a9575b60c093506001600160a01b03168015158061209e575b611fc5575b5060405180809581946362385ce160e11b835260018060a01b0316600483015260a06024830152611f2f60a48301896126e2565b604480359084015260648035908401526001600160a01b039091166084830152039134905af1918215610bf8575f915f93610b725750815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b604435611ffc6040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b60205f604051928284019063095ea7b360e01b825286602486015260448501526044845261202b606485612471565b83519082865af15f513d82612082575b505015612049575b50611efb565b61207b91610cc560405163095ea7b360e01b60208201528560248201525f604482015260448152610cbf606482612471565b8580612043565b9091506120965750813b15155b888061203b565b60011461208f565b506044351515611ef6565b50916020813d6020116120e6575b816120c460209383612471565b810103126102145751916001600160a01b03831683036102145760c092611ee0565b3d91506120b7565b6121059150823d8411610d6357610d558183612471565b87611eb5565b6044633b9aca0091013504633b9aca00810290808204633b9aca0014901517156121405761213a903383612df5565b83611e5e565b634e487b7160e01b5f52601160045260245ffd5b34610214575f36600319011261021457602060a061217061251f565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b34610214575f36600319011261021457602060405160128152f35b3461021457606036600319011261021457602061020a612215612351565b61221d612367565b604435916125ee565b34610214575f3660031901126102145760206102c46805345cdf77eb68f44c546001600160801b036116e8612900565b34610214575f366003190112610214575f546040516001600160a01b039091168152602090f35b3461021457604036600319011261021457612296612351565b602435906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba318821915171561095457602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b34610214575f36600319011261021457610b6e6112b661251f565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361021457565b602435906001600160a01b038216820361021457565b608435906001600160a01b038216820361021457565b606435906001600160a01b038216820361021457565b909291602060a09181604060c0860197805187526001600160401b0383820151168388015201518051604087015201516060850152805160808501520151910152565b906020600319830112610214576004356001600160401b0381116102145782602382011215610214578060040135926001600160401b0384116102145760248483010111610214576024019190565b604081019081106001600160401b0382111761061757604052565b606081019081106001600160401b0382111761061757604052565b90601f801991011681019081106001600160401b0382111761061757604052565b81601f82011215610214578035906001600160401b03821161061757604051926124c6601f8401601f191660200185612471565b8284526020838301011161021457815f926020809301838601378301015290565b90600182811c92168015612515575b602083101461250157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916124f6565b604051905f825f5160206133485f395f51905f52549161253e836124e7565b80835292600181169081156125cf5750600114612564575b61256292500383612471565b565b505f5160206133485f395f51905f525f90815290917ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea750093725b8183106125b357505090602061256292820101612556565b602091935080600191548385890101520191019091849261259b565b6020925061256294915060ff191682840152151560051b820101612556565b91906125f933612bcb565b612616576126119261260c833383612df5565b612c10565b600190565b61261192612c10565b6040519061262c8261243b565b5f6020838281520152565b6040519061264482612456565b815f81525f6020820152604080519161265c8361243b565b5f83525f60208401520152565b9190826040910312610214576040516126818161243b565b6020808294805184520151910152565b9035601e19823603018112156102145701602081359101916001600160401b03821161021457813603831361021457565b908060209392818452848401375f828201840152601f01601f1916010190565b80359163ffffffff83168093036102145761277292815260208201356020820152604082013560408201526060820135606082015261276461275961273e61272d6080860186612691565b60e0608087015260e08601916126c2565b61274b60a0860186612691565b9085830360a08701526126c2565b9260c0810190612691565b9160c08185039101526126c2565b90565b90816020910312610214575180151581036102145790565b1561279457565b60405162461bcd60e51b815260206004820152601060248201526f1050ce881d5b985d5d1a1bdc9a5e995960821b6044820152606490fd5b60018060a01b03166bffffffffffffffffffffffff60a01b7f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858025416177f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f18580255565b9081602091031261021457516001600160a01b03811681036102145790565b6001600160801b03166001600160801b03195f5160206132c85f395f51905f525416175f5160206132c85f395f51905f5255565b5f5160206132e85f395f51905f52546001600160a01b03169182156128f9576040516383609b0f60e01b81526001600160a01b0392831660048201529116602482015290602090829060449082905afa908115610bf8575f916128e0575090565b612772915060203d602011610f5257610f448183612471565b5050505f90565b6001600160801b035f5160206132c85f395f51905f52541680156129215790565b50670de0b6b3a764000090565b601f811161293a575050565b5f5160206132a85f395f51905f525f5260205f20906020601f840160051c83019310612980575b601f0160051c01905b818110612975575050565b5f815560010161296a565b9091508190612961565b601f8111612996575050565b5f5160206133485f395f51905f525f5260205f20906020601f840160051c830193106129dc575b601f0160051c01905b8181106129d1575050565b5f81556001016129c6565b90915081906129bd565b6129ee612900565b6001600160801b03811690670de0b6b3a7640000821015612a8f5750805f0390670de0b6b3a7640000815f198404140215612a325750670de0b6b3a7640000900490565b670de0b6b3a76400005f1982810983811084019003915f19099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a76400008111612aa65750505f1990565b670de0b6b3a763ffff1991670de0b6b3a763fffe196001600160801b0383670de0b6b3a76400005f190992845f03161692815f03811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211015f0302170290565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612b6457602052637f5e9f20600c525f526034600c205490565b50505f1990565b5f5160206132e85f395f51905f52546001600160a01b0316908115612bc55760405163fe575a8760e01b81526001600160a01b03909116600482015290602090829060249082905afa908115610bf8575f916128e0575090565b50505f90565b5f546040516395a8c58d60e01b81526001600160a01b039283166004820152600260248201529160209183916044918391165afa908115610bf8575f916128e0575090565b5f5160206132e85f395f51905f5254909291906001600160a01b0316612c3533612bcb565b15612cca575b50612c566001600160801b03612c4f612900565b1683613026565b906387a211a28460601b17600c526020600c208054808411612cbd5783900390555f526020600c20908154019055602052600c5160601c9060018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63f4d678b85f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b0385811660048301528316602482015290602090829060449082905afa908115610bf8575f91612d1b575b5015611b6b575f612c3b565b612d34915060203d602011610f5257610f448183612471565b5f612d0f565b60ff5f5160206133085f395f51905f525416612d5257565b63d93c066560e01b5f5260045ffd5b5f5160206132e85f395f51905f52546001600160a01b03168015612df157612d8833612bcb565b612df1576040516383609b0f60e01b81526001600160a01b039290921660048301525f6024830152602090829060449082905afa908115610bf8575f91612dd2575b5015611b6b57565b612deb915060203d602011610f5257610f448183612471565b5f612dca565b5050565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612e4e57602052637f5e9f20600c525f526034600c209081548019612e3557505050565b808211612e4157039055565b6313be252b5f526004601cfd5b505050565b5f5160206132e85f395f51905f52546001600160a01b0316612e7433612bcb565b15612f31575b506001600160801b03612e8b612900565b1691612ea083670de0b6b3a7640000836130c3565b92670de0b6b3a76400008209612f1a575b6387a211a2600c52815f526020600c2092835493848211612cbd57815f950390556805345cdf77eb68f44c54036805345cdf77eb68f44c55825260018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3565b916001019182612eb15763ae47f7025f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b03831660048201525f602482015290602090829060449082905afa908115610bf8575f91612f80575b5015611b6b575f612e7a565b612f99915060203d602011610f5257610f448183612471565b5f612f74565b81810291670de0b6b3a764000081838504148315170215612fca575050670de0b6b3a7640000900490565b670de0b6b3a7640000905f198184098481108501900392099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a764000082029181670de0b6b3a76400008285041482151702156130505750900490565b81670de0b6b3a76400005f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b818102929181158285048214178302156130de575050900490565b82905f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b60ff5f5160206133085f395f51905f5254161561316257565b638dfc202b60e01b5f5260045ffd5b90915f19838309928083029283808610950394808603951461320257848311156131ea5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613210570490565b634e487b7160e01b5f52601260045260245ffd5b60ff5f5160206133285f395f51905f525460401c161561324057565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af115610bf8575f513d61329e57506001600160a01b0381163b155b61327e5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561327756fe7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858017315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858037315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185804cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a007315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00","sourceMap":"1512:13340:36:-:0;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;7894:76:9;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;7983:34:9;7979:146;;-1:-1:-1;1512:13340:36;;;;;;;;;7979:146:9;-1:-1:-1;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;8085:29:9;;1512:13340:36;;8085:29:9;7979:146;;;7894:76;7936:23;;;-1:-1:-1;7936:23:9;;-1:-1:-1;7936:23:9;1512:13340:36;-1:-1:-1;1512:13340:36;;;;;;-1:-1:-1;1512:13340:36;;;;;-1:-1:-1;1512:13340:36","linkReferences":{}},"deployedBytecode":{"object":"60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461230c578063095ea7b31461227d57806313007d551461225657806318160ddd1461222657806323b872dd146121f7578063313ce567146121dc5780633644e515146121545780633abc107914611ddf5780633b6f743b14611c825780633f4ba83a14611ba857806340c10f19146119a557806342966c68146119405780634904ac8f1461188857806353735f37146118595780635c975abb1461182b5780635e280f11146117a95780636c2eb350146116ef57806370a08231146116ab57806379cc6790146116395780637ecebe0014611607578063804d4ffc146114675780638456cb591461136b578063857749b01461135057806395d89b411461126257806397e2b9af146112365780639f68b9641461121c578063a781a3fd146111f1578063a850e02414611138578063a9059cbb14611107578063b84c824614610f59578063c47f002714610d6a578063c7c7f5b3146109a8578063d4ec137a14610961578063d505accf1461079b578063d5abeb0114610781578063d8ddf18f14610752578063db0ed6a0146102cc578063dd62ed3e14610298578063f0b7db4e14610264578063f5eb42dc14610232578063fc0c546a146102185763fe575a87146101e7575f80fd5b3461021457602036600319011261021457602061020a610205612351565b612b6b565b6040519015158152f35b5f80fd5b34610214575f366003190112610214576020604051308152f35b346102145760203660031901126102145761024b612351565b6387a211a2600c525f52602080600c2054604051908152f35b34610214575f366003190112610214575f5160206132e85f395f51905f52546040516001600160a01b039091168152602090f35b346102145760403660031901126102145760206102c46102b6612351565b6102be612367565b90612b2e565b604051908152f35b346102145760a0366003190112610214576004356001600160401b038111610214576102fc903690600401612492565b6024356001600160401b0381116102145761031b903690600401612492565b906044356001600160a01b0381169081810361021457610339612393565b9261034261237d565b505f5160206133285f395f51905f5254936001600160401b0360ff8660401c161595168015908161074a575b6001149081610740575b159081610737575b50610728578460016001600160401b03195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556106f3575b6001600160a01b03169283156106e457156106e4578051156106d5578451156106c6578051906001600160401b0382116106175761040a826104055f5160206133485f395f51905f52546124e7565b61298a565b602090601f831160011461062b5761043992915f918361058b575b50508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b83516001600160401b03811161061757610479816104745f5160206132a85f395f51905f52546124e7565b61292e565b6020601f82116001146105965790806104ac926104c09596975f9261058b5750508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f52556127cc565b5f5160206132c85f395f51905f5280546fffffffffffffffffffffffffffffffff1916670de0b6b3a76400001790555f5160206132e85f395f51905f5280546001600160a01b03191682179055610515613224565b6bffffffffffffffffffffffff60a01b5f5416175f55610533613224565b61053957005b60ff60401b195f5160206133285f395f51905f5254165f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508780610425565b601f198216955f5160206132a85f395f51905f525f52815f20965f5b8181106105ff5750916104c0959697918460019594106105e7575b505050811b015f5160206132a85f395f51905f52556127cc565b01515f1960f88460031b161c191690558680806105cd565b838301518955600190980197602093840193016105b2565b634e487b7160e01b5f52604160045260245ffd5b90601f198316915f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372925f5b8181106106ae5750908460019594939210610696575b505050811b015f5160206133485f395f51905f5255610449565b01515f1960f88460031b161c1916905586808061067c565b92936020600181928786015181550195019301610666565b63010466f160e21b5f5260045ffd5b63430f13b360e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6801000000000000000060ff60401b195f5160206133285f395f51905f525416175f5160206133285f395f51905f52556103b6565b63f92ee8a960e01b5f5260045ffd5b90501587610380565b303b159150610378565b86915061036e565b346102145760203660031901126102145760206102c46001600160801b03610778612900565b16600435613026565b34610214575f3660031901126102145760206102c46129e6565b346102145760e0366003190112610214576107b4612351565b6107bc612367565b604435916064356084359260ff84168403610214576001600160a01b0316936e22d473030f116ddee9f6b43ac78ba385188119151715610954576107fe61251f565b6020815191012090824211610947576040519360018060a01b03169465383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d510361093a577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92594602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b633f68539a5f526004601cfd5b34610214575f366003190112610214577f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185802546040516001600160a01b039091168152602090f35b6080366003190112610214576004356001600160401b0381116102145760e081600401916003199036030112610214576040366023190112610214576109ec612393565b6109f4612637565b506109fd61261f565b50610a06612d3a565b610a0f33612d61565b610a17612637565b50610a2061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b81526001600160a01b0390911691602082600481865afa918215610bf8576004926020915f91610d3d575b50604051631c2eb17b60e31b815293849182906001600160a01b03165afa8015610bf8575f90610cf8575b60c092506001600160a01b031680151580610ced575b610c03575b5060405192838080936362385ce160e11b825233600483015260a06024830152610ad960a48301896126e2565b906024356044840152604435606484015260018060a01b03166084830152039134905af1918215610bf8575f915f93610b72575b50815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b0390f35b9150915060c03d60c011610bf1575b610b8b8183612471565b81019080820360c08112610214576080136102145760405191610bad83612456565b8151835260208201516001600160401b038116810361021457610bea926080916020860152610bdf8360408301612669565b604086015201612669565b9183610b0d565b503d610b81565b6040513d5f823e3d90fd5b602435610c406040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b8361324f565b60205f604051928284019063095ea7b360e01b8252886024860152604485015260448452610c6f606485612471565b83519082865af15f513d82610cd1575b505015610c8d575b50610aac565b610cca91610cc560405163095ea7b360e01b60208201528760248201525f604482015260448152610cbf606482612471565b8261324f565b61324f565b8480610c87565b909150610ce55750813b15155b8780610c7f565b600114610cde565b506024351515610aa7565b50906020813d602011610d35575b81610d1360209383612471565b810103126102145751906001600160a01b03821682036102145760c091610a91565b3d9150610d06565b610d5d9150823d8411610d63575b610d558183612471565b81019061282c565b86610a66565b503d610d4b565b3461021457610d78366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610dc4915f91610f2a575b5061278d565b6001600160401b03821161061757610ded826104055f5160206133485f395f51905f52546124e7565b5f91601f8111600114610e7257610e3b81807f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf955f91610e67575b508160011b915f199060031b1c19161790565b5f5160206133485f395f51905f52555b610e626040519283926020845260208401916126c2565b0390a1005b905084013586610e28565b601f198116925f5160206133485f395f51905f525f527ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea75009372905f5b858110610f125750827f13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf9510610ef9575b5050600181811b015f5160206133485f395f51905f5255610e4b565b8301355f19600384901b60f8161c191690558380610edd565b90916020600181928588013581550193019101610eac565b610f4c915060203d602011610f52575b610f448183612471565b810190612775565b84610dbe565b503d610f3a565b3461021457610f67366123ec565b5f546040516395a8c58d60e01b81523360048201526002602482015291929190602090829060449082906001600160a01b03165afa8015610bf857610fb2915f91610f2a575061278d565b6001600160401b03821161061757610fdb826104745f5160206132a85f395f51905f52546124e7565b5f91601f811160011461104e5761102881807f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99955f91610e6757508160011b915f199060031b1c19161790565b5f5160206132a85f395f51905f5255610e626040519283926020845260208401916126c2565b5f5160206132a85f395f51905f525f908152601f198216937f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc915b8581106110ef5750827f3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c9995106110d6575b5050600181811b015f5160206132a85f395f51905f5255610e4b565b8301355f19600384901b60f8161c1916905583806110ba565b90916020600181928588013581550193019101611089565b346102145760403660031901126102145761112d611123612351565b6024359033612c10565b602060405160018152f35b34610214576020366003190112610214576004356001600160801b03811690818103610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576111a6915f91610f2a575061278d565b81156111e2577f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13916111d960209261284b565b604051908152a1005b637c946ed760e01b5f5260045ffd5b34610214575f36600319011261021457602061120b612900565b6001600160801b0360405191168152f35b34610214575f3660031901126102145760206040515f8152f35b3461021457604036600319011261021457602061020a611254612351565b61125c612367565b9061287f565b34610214575f366003190112610214576040515f5f5160206132a85f395f51905f525461128e816124e7565b808452906001811690811561132c57506001146112c2575b610b6e836112b681850382612471565b60405191829182612327565b5f5160206132a85f395f51905f525f9081527f1b578729ab02f713bb34fa1bcb9003cd9239cf0a9987f078c442f2f5d6ce4bcc939250905b808210611312575090915081016020016112b66112a6565b9192600181602092548385880101520191019092916112fa565b60ff191660208086019190915291151560051b840190910191506112b690506112a6565b34610214575f36600319011261021457602060405160098152f35b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576113c3915f91611448575061278d565b6113cb612d3a565b600160ff195f5160206133085f395f51905f525416175f5160206133085f395f51905f52557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a16040514281527fba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd660203092a2005b611461915060203d602011610f5257610f448183612471565b82610dbe565b34610214576040366003190112610214575f546040516395a8c58d60e01b8152336004808301919091526002602480840191909152359290359190602090829060449082906001600160a01b03165afa8015610bf8576114cd915f91610f2a575061278d565b6114d5613149565b801515806115fe575b156115ef575f5160206132c85f395f51905f52546001600160801b0316806115e157506001600160801b03670de0b6b3a76400005b1661151f838383613171565b926001600160801b0384116115c95792608092917f8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b946115676001600160801b03841661284b565b7f7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf136020604051858152a1604051938452602084015260408301526060820152a160206001600160801b035f5160206132c85f395f51905f525416604051908152f35b836306dfcc6560e41b5f52608060045260245260445ffd5b6001600160801b0390611513565b631d94864560e11b5f5260045ffd5b508115156114de565b3461021457602036600319011261021457611620612351565b6338377508600c525f52602080600c2054604051908152f35b3461021457604036600319011261021457611652612351565b5f546040516395a8c58d60e01b8152336004820152600260248201529190602090839060449082906001600160a01b03165afa918215610bf8576116a9926116a0915f91610f2a575061278d565b60243590612e53565b005b34610214576020366003190112610214576116c4612351565b6387a211a2600c525f5260206102c481600c20546001600160801b036116e8612900565b1690612f9f565b34610214575f366003190112610214575f5160206133285f395f51905f525460ff8160401c16908115611794575b50610728575f5160206133285f395f51905f52805468ffffffffffffffffff1916680100000000000000048117909155600417611758613224565b5f5160206133285f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160048152a1005b600491506001600160401b031610158161171d565b34610214575f366003190112610214575f5160206132e85f395f51905f5254604051635e280f1160e01b815290602090829060049082906001600160a01b03165afa8015610bf8576020915f9161180e575b506040516001600160a01b039091168152f35b6118259150823d8411610d6357610d558183612471565b826117fb565b34610214575f36600319011261021457602060ff5f5160206133085f395f51905f5254166040519015158152f35b346102145760203660031901126102145760206102c46001600160801b0361187f612900565b16600435612f9f565b34610214576020366003190112610214576118a1612351565b5f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf8576118e9915f91611921575061278d565b6118f2816127cc565b6001600160a01b03167fc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea45f80a2005b61193a915060203d602011610f5257610f448183612471565b83610dbe565b34610214576020366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611999915f91611448575061278d565b6116a960043533612e53565b34610214576040366003190112610214576119be612351565b5f546040516395a8c58d60e01b81523360048201526002602480830191909152359291602090829060449082906001600160a01b03165afa8015610bf857611a0c915f91610f2a575061278d565b6001600160a01b03811680156106e4575f5160206132e85f395f51905f52546001600160a01b031690611a3e33612bcb565b15611b27575b50506805345cdf77eb68f44c5490611a6c6001600160801b03611a65612900565b1684613026565b91828101908110611b02576001600160801b03611a87612900565b16670de0b6b3a7640000611a9c8183856130c3565b918309611b11575b611aac6129e6565b10611b02576805345cdf77eb68f44c556387a211a2600c525f526020600c20908154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3005b63e5cfe95760e01b5f5260045ffd5b60010180611aa4575b63ae47f7025f526004601cfd5b8115611b99576020906044604051809481936383609b0f60e01b83525f600484015260248301525afa908115610bf8575f91611b7a575b5015611b6b578280611a44565b6315df7de160e31b5f5260045ffd5b611b93915060203d602011610f5257610f448183612471565b83611b5e565b630588ca9560e01b5f5260045ffd5b34610214575f366003190112610214575f546040516395a8c58d60e01b81523360048201526002602482015290602090829060449082906001600160a01b03165afa8015610bf857611c00915f91611448575061278d565b611c08613149565b60ff195f5160206133085f395f51905f5254165f5160206133085f395f51905f52557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a16040514281527fcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de60203092a2005b34610214576040366003190112610214576004356001600160401b0381116102145760e06003198236030112610214576024359081151580920361021457611cc861261f565b505f5160206132e85f395f51905f525460405163f99e156960e01b81523060048201526001600160a01b0390911690602081602481855afa908115610bf8575f91611daa575b5090604092611d43928451958694859384936315efa6af60e11b855260048501526060602485015260648401906004016126e2565b90604483015203915afa8015610bf8575f90611d6f575b60409060208251918051835201516020820152f35b5060403d604011611da3575b611d858183612471565b81019060408183031261021457604091611d9e91612669565b611d5a565b503d611d7b565b9190506020823d602011611dd7575b81611dc660209383612471565b810103126102145790516040611d0e565b3d9150611db9565b60a0366003190112610214576004356001600160401b03811161021457806004019060e0600319823603011261021457611e17612367565b604036604319011261021457611e2b61237d565b91611e34612637565b50611e3d61261f565b50611e46612d3a565b611e4f82612d61565b611e5833612bcb565b1561210b575b50611e67612637565b50611e7061261f565b505f5160206132e85f395f51905f5254604051635e280f1160e01b815291906001600160a01b0316602083600481845afa928315610bf8576004936020915f916120ee575b50604051631c2eb17b60e31b815294859182906001600160a01b03165afa8015610bf8575f906120a9575b60c093506001600160a01b03168015158061209e575b611fc5575b5060405180809581946362385ce160e11b835260018060a01b0316600483015260a06024830152611f2f60a48301896126e2565b604480359084015260648035908401526001600160a01b039091166084830152039134905af1918215610bf8575f915f93610b725750815190359063ffffffff8216809203610214578351602085015190604051938452602084015260408301527f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a60603393a3610b6e604051928392836123a9565b604435611ffc6040516323b872dd60e01b602082015233602482015230604482015282606482015260648152610c3a608482612471565b60205f604051928284019063095ea7b360e01b825286602486015260448501526044845261202b606485612471565b83519082865af15f513d82612082575b505015612049575b50611efb565b61207b91610cc560405163095ea7b360e01b60208201528560248201525f604482015260448152610cbf606482612471565b8580612043565b9091506120965750813b15155b888061203b565b60011461208f565b506044351515611ef6565b50916020813d6020116120e6575b816120c460209383612471565b810103126102145751916001600160a01b03831683036102145760c092611ee0565b3d91506120b7565b6121059150823d8411610d6357610d558183612471565b87611eb5565b6044633b9aca0091013504633b9aca00810290808204633b9aca0014901517156121405761213a903383612df5565b83611e5e565b634e487b7160e01b5f52601160045260245ffd5b34610214575f36600319011261021457602060a061217061251f565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b34610214575f36600319011261021457602060405160128152f35b3461021457606036600319011261021457602061020a612215612351565b61221d612367565b604435916125ee565b34610214575f3660031901126102145760206102c46805345cdf77eb68f44c546001600160801b036116e8612900565b34610214575f366003190112610214575f546040516001600160a01b039091168152602090f35b3461021457604036600319011261021457612296612351565b602435906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba318821915171561095457602052637f5e9f20600c52335f52806034600c20555f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b34610214575f36600319011261021457610b6e6112b661251f565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361021457565b602435906001600160a01b038216820361021457565b608435906001600160a01b038216820361021457565b606435906001600160a01b038216820361021457565b909291602060a09181604060c0860197805187526001600160401b0383820151168388015201518051604087015201516060850152805160808501520151910152565b906020600319830112610214576004356001600160401b0381116102145782602382011215610214578060040135926001600160401b0384116102145760248483010111610214576024019190565b604081019081106001600160401b0382111761061757604052565b606081019081106001600160401b0382111761061757604052565b90601f801991011681019081106001600160401b0382111761061757604052565b81601f82011215610214578035906001600160401b03821161061757604051926124c6601f8401601f191660200185612471565b8284526020838301011161021457815f926020809301838601378301015290565b90600182811c92168015612515575b602083101461250157565b634e487b7160e01b5f52602260045260245ffd5b91607f16916124f6565b604051905f825f5160206133485f395f51905f52549161253e836124e7565b80835292600181169081156125cf5750600114612564575b61256292500383612471565b565b505f5160206133485f395f51905f525f90815290917ff5647e8615f5df7ccb190d823c0c17c7b37b329cb6d15a35cd5824ea750093725b8183106125b357505090602061256292820101612556565b602091935080600191548385890101520191019091849261259b565b6020925061256294915060ff191682840152151560051b820101612556565b91906125f933612bcb565b612616576126119261260c833383612df5565b612c10565b600190565b61261192612c10565b6040519061262c8261243b565b5f6020838281520152565b6040519061264482612456565b815f81525f6020820152604080519161265c8361243b565b5f83525f60208401520152565b9190826040910312610214576040516126818161243b565b6020808294805184520151910152565b9035601e19823603018112156102145701602081359101916001600160401b03821161021457813603831361021457565b908060209392818452848401375f828201840152601f01601f1916010190565b80359163ffffffff83168093036102145761277292815260208201356020820152604082013560408201526060820135606082015261276461275961273e61272d6080860186612691565b60e0608087015260e08601916126c2565b61274b60a0860186612691565b9085830360a08701526126c2565b9260c0810190612691565b9160c08185039101526126c2565b90565b90816020910312610214575180151581036102145790565b1561279457565b60405162461bcd60e51b815260206004820152601060248201526f1050ce881d5b985d5d1a1bdc9a5e995960821b6044820152606490fd5b60018060a01b03166bffffffffffffffffffffffff60a01b7f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858025416177f7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f18580255565b9081602091031261021457516001600160a01b03811681036102145790565b6001600160801b03166001600160801b03195f5160206132c85f395f51905f525416175f5160206132c85f395f51905f5255565b5f5160206132e85f395f51905f52546001600160a01b03169182156128f9576040516383609b0f60e01b81526001600160a01b0392831660048201529116602482015290602090829060449082905afa908115610bf8575f916128e0575090565b612772915060203d602011610f5257610f448183612471565b5050505f90565b6001600160801b035f5160206132c85f395f51905f52541680156129215790565b50670de0b6b3a764000090565b601f811161293a575050565b5f5160206132a85f395f51905f525f5260205f20906020601f840160051c83019310612980575b601f0160051c01905b818110612975575050565b5f815560010161296a565b9091508190612961565b601f8111612996575050565b5f5160206133485f395f51905f525f5260205f20906020601f840160051c830193106129dc575b601f0160051c01905b8181106129d1575050565b5f81556001016129c6565b90915081906129bd565b6129ee612900565b6001600160801b03811690670de0b6b3a7640000821015612a8f5750805f0390670de0b6b3a7640000815f198404140215612a325750670de0b6b3a7640000900490565b670de0b6b3a76400005f1982810983811084019003915f19099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a76400008111612aa65750505f1990565b670de0b6b3a763ffff1991670de0b6b3a763fffe196001600160801b0383670de0b6b3a76400005f190992845f03161692815f03811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211015f0302170290565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612b6457602052637f5e9f20600c525f526034600c205490565b50505f1990565b5f5160206132e85f395f51905f52546001600160a01b0316908115612bc55760405163fe575a8760e01b81526001600160a01b03909116600482015290602090829060249082905afa908115610bf8575f916128e0575090565b50505f90565b5f546040516395a8c58d60e01b81526001600160a01b039283166004820152600260248201529160209183916044918391165afa908115610bf8575f916128e0575090565b5f5160206132e85f395f51905f5254909291906001600160a01b0316612c3533612bcb565b15612cca575b50612c566001600160801b03612c4f612900565b1683613026565b906387a211a28460601b17600c526020600c208054808411612cbd5783900390555f526020600c20908154019055602052600c5160601c9060018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63f4d678b85f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b0385811660048301528316602482015290602090829060449082905afa908115610bf8575f91612d1b575b5015611b6b575f612c3b565b612d34915060203d602011610f5257610f448183612471565b5f612d0f565b60ff5f5160206133085f395f51905f525416612d5257565b63d93c066560e01b5f5260045ffd5b5f5160206132e85f395f51905f52546001600160a01b03168015612df157612d8833612bcb565b612df1576040516383609b0f60e01b81526001600160a01b039290921660048301525f6024830152602090829060449082905afa908115610bf8575f91612dd2575b5015611b6b57565b612deb915060203d602011610f5257610f448183612471565b5f612dca565b5050565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314612e4e57602052637f5e9f20600c525f526034600c209081548019612e3557505050565b808211612e4157039055565b6313be252b5f526004601cfd5b505050565b5f5160206132e85f395f51905f52546001600160a01b0316612e7433612bcb565b15612f31575b506001600160801b03612e8b612900565b1691612ea083670de0b6b3a7640000836130c3565b92670de0b6b3a76400008209612f1a575b6387a211a2600c52815f526020600c2092835493848211612cbd57815f950390556805345cdf77eb68f44c54036805345cdf77eb68f44c55825260018060a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a3565b916001019182612eb15763ae47f7025f526004601cfd5b8015611b99576040516383609b0f60e01b81526001600160a01b03831660048201525f602482015290602090829060449082905afa908115610bf8575f91612f80575b5015611b6b575f612e7a565b612f99915060203d602011610f5257610f448183612471565b5f612f74565b81810291670de0b6b3a764000081838504148315170215612fca575050670de0b6b3a7640000900490565b670de0b6b3a7640000905f198184098481108501900392099080670de0b6b3a76400001115611b1a57828211900360ee1b910360121c177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690290565b90670de0b6b3a764000082029181670de0b6b3a76400008285041482151702156130505750900490565b81670de0b6b3a76400005f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b818102929181158285048214178302156130de575050900490565b82905f1981840985811086019003920990825f0383169281811115611b1a5783900480600302600218808202600203028082026002030280820260020302808202600203028082026002030280910260020302936001848483030494805f0304019211900302170290565b60ff5f5160206133085f395f51905f5254161561316257565b638dfc202b60e01b5f5260045ffd5b90915f19838309928083029283808610950394808603951461320257848311156131ea5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613210570490565b634e487b7160e01b5f52601260045260245ffd5b60ff5f5160206133285f395f51905f525460401c161561324057565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af115610bf8575f513d61329e57506001600160a01b0381163b155b61327e5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b6001141561327756fe7315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858017315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f1858037315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185804cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a007315beb2381679795e06870021c0fca5deb85616e29e098c2e7b7e488f185800","sourceMap":"1512:13340:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11144:31;1512:13340;11144:31;;;1512:13340;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;10865:4;1512:13340;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;7321:148:23;;;1512:13340:36;7321:148:23;1512:13340:36;7321:148:23;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;1512:13340:36;;;;;4301:16:9;1512:13340:36;;4724:16:9;;:34;;;;1512:13340:36;4803:1:9;4788:16;:50;;;;1512:13340:36;4853:13:9;:30;;;;1512:13340:36;4849:91:9;;;1512:13340:36;4803:1:9;-1:-1:-1;;;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;4977:67:9;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;3501:28;;1512:13340;;3563:54;1512:13340;;;;3651:23;1512:13340;;;;3708:25;1512:13340;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;3871:43;1512:13340;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3871:43;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;1512:13340:36;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;;1512:13340:36;;;;;6891:76:9;;:::i;:::-;1512:13340:36;;;;;;;;;6891:76:9;;:::i;:::-;5064:101;;1512:13340:36;5064:101:9;-1:-1:-1;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;5140:14:9;1512:13340:36;;;4803:1:9;1512:13340:36;;5140:14:9;1512:13340:36;;;;;-1:-1:-1;1512:13340:36;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;3871:43;1512:13340;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3871:43;:::i;1512:13340::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;4803:1:9;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4977:67:9;1512:13340:36;-1:-1:-1;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;4977:67:9;;4849:91;6496:23;;;1512:13340:36;4906:23:9;1512:13340:36;;4906:23:9;4853:30;4870:13;;;4853:30;;;4788:50;4816:4;4808:25;:30;;-1:-1:-1;4788:50:9;;4724:34;;;-1:-1:-1;4724:34:9;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;;1347:84:33;-1:-1:-1;;;;;1413:17:33;;:::i;:::-;1512:13340:36;;;1347:84:33;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17979:337:23;;;;;;;;;;;;1512:13340:36;;:::i;:::-;;;;;;18516:24:23;18639:2753;;;;;;1512:13340:36;18639:2753:23;8384:339;;;;;;18639:2753;;;;;;1512:13340:36;18639:2753:23;1512:13340:36;;18639:2753:23;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;1512:13340:36;18639:2753:23;;;5177:66;18639:2753;;;1512:13340:36;18639:2753:23;;;;;;;1512:13340:36;18639:2753:23;;;;;;1512:13340:36;18639:2753:23;;;;;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;;;;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;1512:13340:36;;;18639:2753:23;1512:13340:36;;;18639:2753:23;1512:13340:36;18639:2753:23;1512:13340:36;;;18639:2753:23;;;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;;;;1512:13340:36;18639:2753:23;;;;;;1512:13340:36;18639:2753:23;;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;;;;1512:13340:36;18639:2753:23;1512:13340:36;18639:2753:23;;17979:337;;1512:13340:36;17979:337:23;1512:13340:36;17979:337:23;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;4575:39;1512:13340;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;1944:72:11;;:::i;:::-;11443:10:36;;;:::i;:::-;1512:13340;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;13774:25:36;;-1:-1:-1;;;;;1512:13340:36;;;;13774:25;1512:13340;;;;13774:25;;;;;;;1512:13340;13774:25;;;1512:13340;13774:25;;;1512:13340;-1:-1:-1;1512:13340:36;;-1:-1:-1;;;13774:39:36;;1512:13340;;;;;-1:-1:-1;;;;;1512:13340:36;13774:39;;;;;;1512:13340;13774:39;;;1512:13340;14081:74;;-1:-1:-1;;;;;;1512:13340:36;13827:25;;;;:46;;1512:13340;13823:221;;1512:13340;;;;;;;;;;;;14081:74;;11443:10;1512:13340;14081:74;;1512:13340;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;8384:339:23;;;;;1512:13340:36;;;;;14081:74;14122:9;;14081:74;;;;;;;;1512:13340;;;14081:74;;;1512:13340;14054:101;1512:13340;;;;;;;;;;;;;;;13774:25;14462:27;;1512:13340;;;;;;;13774:25;1512:13340;;;;;;;14387:103;1512:13340;11443:10;14387:103;;1512:13340;;;;;;;;:::i;:::-;;;;14081:74;;;;;;;;;;;;;;;;:::i;:::-;;;1512:13340;;;;14081:74;1512:13340;;;;;-1:-1:-1;1512:13340:36;;;;;;;;:::i;:::-;;;;;13774:25;1512:13340;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;13774:25;1512:13340;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;14081:74;;;;;;;;;;1512:13340;;;;;;;;;13823:221;1512:13340;;1745:53:17;1512:13340:36;;;;;13774:25;1745:53:17;;;11443:10:36;1512:13340;1745:53:17;;1512:13340:36;13946:4;1512:13340;;;;;;;;;;1745:53:17;;;;;;:::i;:::-;;;:::i;:::-;13774:25:36;1512:13340;;;5199:47:17;;;;1512:13340:36;;;;5199:47:17;;;1512:13340:36;5199:47:17;;1512:13340:36;;;;;;5199:47:17;;;1512:13340:36;5199:47:17;;:::i;:::-;9770:199;;;;;;;1512:13340:36;9770:199:17;;9985:80;;;13823:221:36;5261:45:17;;;5257:201;;13823:221:36;;;;5257:201:17;5434:12;1512:13340:36;5349:43:17;1512:13340:36;;;;;13774:25;5349:43:17;;;;1512:13340:36;5349:43:17;;1512:13340:36;;;;;;;5349:43:17;;;1512:13340:36;5349:43:17;;:::i;:::-;;;:::i;:::-;5434:12;:::i;:::-;5257:201;;;;9985:80;9997:67;;-1:-1:-1;9997:15:17;;10015:26;;;:30;;9997:67;9985:80;;;;9997:67;1512:13340:36;10048:16:17;9997:67;;13827:46:36;1512:13340;;;13856:17;;13827:46;;13774:39;;;:25;:39;;:25;:39;;;;;;:25;:39;;;:::i;:::-;;;1512:13340;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;14081:74;13774:39;;;;;;-1:-1:-1;13774:39:36;;:25;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1512:13340;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;8384:339:23;;;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1512:13340:36;1686:68:25;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;;;;;;;;;;;;5952:16;1512:13340;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;1694:39:25;1512:13340:36;;1694:39:25;1512:13340:36;;;;:::i;:::-;5952:16;;;1512:13340;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;5952:16;1512:13340;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;;1694:39:25;1512:13340:36;;;;;;;;;;;;;;;;1694:39:25;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;1512:13340:36;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;8384:339:23;;;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;:::i;:::-;;;;;;;;;;;;;6248:20;1512:13340;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;1694:39:25;1512:13340:36;;1694:39:25;1512:13340:36;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;6248:20;1512:13340;;;;;;;6212:9;1512:13340;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;;1694:39:25;6212:9:36;1512:13340;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;3023:6:33;1512:13340:36;;:::i;:::-;;;3007:10:33;;3023:6;:::i;:::-;1512:13340:36;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;6511:20:36;;1512:13340;;6663:36;6611:37;;1512:13340;6611:37;;:::i;:::-;1512:13340;;;;;6663:36;1512:13340;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;11048:1;1512:13340;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;1944:72:11;;:::i;:::-;3300:4;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3319:20:11;1694:39:25;1512:13340:36;;1716:10:25;1512:13340:36;;3319:20:11;1512:13340:36;;14675:15;1512:13340;;14647:44;1694:39:25;14668:4:36;14647:44;;1512:13340;1694:39:25;;;;;;;;;;;;;;:::i;:::-;;;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;2194:66:11;;:::i;:::-;4759:7:36;;;:20;;;1512:13340;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;4877:23;1512:13340;;4877:97;-1:-1:-1;;;;;796:7:33;4877:97:36;1512:13340;5029:30;;;;;:::i;:::-;9344:25:22;-1:-1:-1;;;;;9344:25:22;;9340:105;;1512:13340:36;;;;5196:41;1512:13340;5070:40;-1:-1:-1;;;;;1512:13340:36;;5070:40;:::i;:::-;5154:27;1512:13340;;;;;;5154:27;1512:13340;;;;;;;;;;;;;;;;;5196:41;1512:13340;-1:-1:-1;;;;;;;;;;;;;;;;1512:13340:36;;;;;;;;9340:105:22;9392:42;;;;1512:13340:36;9392:42:22;9423:3;1512:13340:36;;;;;;9392:42:22;4877:97:36;-1:-1:-1;;;;;4877:97:36;;;1512:13340;;;;;;;;;4759:20;4770:9;;;;4759:20;;1512:13340;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;17287:205:23;;;1512:13340:36;17287:205:23;1512:13340:36;17287:205:23;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;;8040:5:36;1694:39:25;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;1512:13340:36;;8040:5;;:::i;:::-;1512:13340;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;7321:148:23;;;1512:13340:36;7321:148:23;1512:13340:36;1153:83:33;7321:148:23;;;;-1:-1:-1;;;;;1190:17:33;;:::i;:::-;1512:13340:36;1153:83:33;;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;6429:44:9;;;;;1512:13340:36;6425:105:9;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;1512:13340:36;;;;;;;;;6891:76:9;;:::i;:::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;6654:20:9;1512:13340:36;;;;;;6654:20:9;1512:13340:36;6429:44:9;1512:13340:36;;;-1:-1:-1;;;;;1512:13340:36;6448:25:9;;6429:44;;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;11144:31:36;;1512:13340;11144:31;;1512:13340;;;;;;-1:-1:-1;;;;;1512:13340:36;11144:31;;;;;;;;1512:13340;11144:31;;;1512:13340;-1:-1:-1;1512:13340:36;;-1:-1:-1;;;;;1512:13340:36;;;;;;11144:31;;;;;;;;;;;;;;:::i;:::-;;;;1512:13340;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;1153:83:33;-1:-1:-1;;;;;1190:17:33;;:::i;:::-;1512:13340:36;;;1153:83:33;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;6967:37:36;;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;7019:36;1512:13340;;7019:36;1512:13340;1694:39:25;;;;1512:13340:36;1694:39:25;1512:13340:36;1694:39:25;;;;;;;:::i;:::-;;;;1512:13340:36;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;7689:5:36;1512:13340;;1716:10:25;7689:5:36;:::i;1512:13340::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;7402:16;;1512:13340;;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;8786:42;1716:10:25;8786:42:36;:::i;:::-;8785:43;8781:537;;1512:13340;7049:68:23;;;;1413:17:33;1347:84;-1:-1:-1;;;;;1413:17:33;;:::i;:::-;1512:13340:36;1347:84:33;;:::i;:::-;1512:13340:36;;;;5284:36:33;;;5280:70;;-1:-1:-1;;;;;5566:17:33;;:::i;:::-;1512:13340:36;;25748:19:24;;;;;:::i;:::-;25820:256;;;;;1512:13340:36;5631:11:33;;:::i;:::-;-1:-1:-1;5500:181:33;;7049:68:23;5734:588:33;;;;1512:13340:36;5734:588:33;1512:13340:36;5734:588:33;;;;;;;;1512:13340:36;5734:588:33;;;;;1512:13340:36;5734:588:33;1512:13340:36;5734:588:33;;1512:13340:36;5500:181:33;5329:21;;;1512:13340:36;5660:21:33;1512:13340:36;;5660:21:33;25820:256:24;;;;;;;;1512:13340:36;25820:256:24;1512:13340:36;25820:256:24;;8781:537:36;8856:33;;1512:13340;;;;9091:95;1512:13340;;;;;;;;;9091:95;;1512:13340;;9091:95;;1512:13340;;;;;9091:95;;;;;;;1512:13340;9091:95;;;8781:537;1512:13340;;;;8781:537;;;;1512:13340;;;;;;;;;9091:95;;;;1512:13340;9091:95;1512:13340;9091:95;;;;;;;:::i;:::-;;;;1512:13340;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;1694:39:25;;1716:10;1512:13340:36;1694:39:25;;1512:13340:36;;;;;;;1694:39:25;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;1694:39:25;;;;;;1686:68;1694:39;1512:13340:36;1694:39:25;;;1686:68;;:::i;:::-;2194:66:11;;:::i;:::-;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;;-1:-1:-1;;;;;;;;;;;1512:13340:36;3627:22:11;1694:39:25;1512:13340:36;;1716:10:25;1512:13340:36;;3627:22:11;1512:13340:36;;14827:15;1512:13340;;14797:46;1694:39:25;14820:4:36;14797:46;;1512:13340;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;13353:53:36;;13400:4;1512:13340;13353:53;;1512:13340;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;13353:53;;;;;;;1512:13340;13353:53;;;1512:13340;;;;;;;;;;;;;;;;;;;13423:71;;1512:13340;13423:71;;1512:13340;;;;;;;;;;;;;:::i;:::-;;;;;;13423:71;;;;;;;;1512:13340;13423:71;;;1512:13340;;;;;;;;;;;;;;;;;;13423:71;;1512:13340;13423:71;1512:13340;13423:71;;;;;;;;:::i;:::-;;;1512:13340;;;;;;;;;;;;;:::i;:::-;13423:71;;;;;;;13353:53;;;;1512:13340;13353:53;;1512:13340;13353:53;;;;;;1512:13340;13353:53;;;:::i;:::-;;;1512:13340;;;;;;;13353:53;;;;;-1:-1:-1;13353:53:36;;1512:13340;;;-1:-1:-1;;1512:13340:36;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;;1944:72:11;;:::i;:::-;11814:5:36;;;:::i;:::-;11835:42;966:10:10;11835:42:36;:::i;:::-;11834:43;11830:301;;1512:13340;12147:49;1512:13340;;:::i;:::-;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;13774:25:36;;1512:13340;;-1:-1:-1;;;;;1512:13340:36;13774:25;1512:13340;;;;13774:25;;;;;;;1512:13340;13774:25;;;1512:13340;13774:25;;;1512:13340;-1:-1:-1;1512:13340:36;;-1:-1:-1;;;13774:39:36;;1512:13340;;;;;-1:-1:-1;;;;;1512:13340:36;13774:39;;;;;;1512:13340;13774:39;;;1512:13340;14081:74;;-1:-1:-1;;;;;;1512:13340:36;13827:25;;;;:46;;1512:13340;13823:221;;1512:13340;;;;;;;;;;;;14081:74;;8384:339:23;;;;;1512:13340:36;;14081:74;;1512:13340;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;14081:74;;14122:9;;14081:74;;;;;;;1512:13340;;;14081:74;;;14054:101;1512:13340;;;;;;;;;;;;;;;13774:25;14462:27;;1512:13340;;;;;;;13774:25;1512:13340;;;;;;;14387:103;1512:13340;966:10:10;14387:103:36;;1512:13340;;;;;;;;:::i;13823:221::-;1512:13340;;1745:53:17;1512:13340:36;;;;;13774:25;1745:53:17;;;966:10:10;1512:13340:36;1745:53:17;;1512:13340:36;13946:4;1512:13340;;;;;;;;;;1745:53:17;;;;;;:::i;:::-;13774:25:36;1512:13340;;;5199:47:17;;;;1512:13340:36;;;;5199:47:17;;;1512:13340:36;5199:47:17;;1512:13340:36;;;;;;5199:47:17;;;1512:13340:36;5199:47:17;;:::i;:::-;9770:199;;;;;;;1512:13340:36;9770:199:17;;9985:80;;;13823:221:36;5261:45:17;;;5257:201;;13823:221:36;;;;5257:201:17;5434:12;1512:13340:36;5349:43:17;1512:13340:36;;;;;13774:25;5349:43:17;;;;1512:13340:36;5349:43:17;;1512:13340:36;;;;;;;5349:43:17;;;1512:13340:36;5349:43:17;;:::i;5434:12::-;5257:201;;;;9985:80;9997:67;;-1:-1:-1;9997:15:17;;10015:26;;;:30;;9997:67;9985:80;;;;9997:67;1512:13340:36;10048:16:17;9997:67;;13827:46:36;1512:13340;;;13856:17;;13827:46;;13774:39;;;:25;:39;;:25;:39;;;;;;:25;:39;;;:::i;:::-;;;1512:13340;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;14081:74;13774:39;;;;;;-1:-1:-1;13774:39:36;;:25;;;;;;;;;;;;;;:::i;:::-;;;;11830:301;1512:13340;12109:3;12087:19;;1512:13340;;12109:3;1512:13340;;;;;;12109:3;1512:13340;;;;;;;12086:33;966:10:10;;12086:33:36;;:::i;:::-;11830:301;;;1512:13340;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;21866:344:23;1512:13340:36;;:::i;:::-;;;;;;21743:24:23;1512:13340:36;21866:344:23;;;;;;;;;5177:66;1512:13340:36;21866:344:23;;;;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;6574:2:23;1512:13340:36;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;-1:-1:-1;;1512:13340:36;;;;;1153:83:33;7049:68:23;;-1:-1:-1;;;;;1190:17:33;;:::i;1512:13340:36:-;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;8384:339:23;;;;;;;;;;;1512:13340:36;8785:413:23;;;;;1512:13340:36;8785:413:23;;;;;;1512:13340:36;8785:413:23;;;;;;;1512:13340:36;;8785:413:23;1512:13340:36;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1512:13340:36;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;-1:-1:-1;;1512:13340:36;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;-1:-1:-1;;;;;;;;;;;;;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8204:289;;;8313:42;966:10:10;8313:42:36;:::i;:::-;8309:125;;3248:6:33;966:10:10;3211:6:33;966:10:10;;3211:6:33;;:::i;:::-;3248;:::i;:::-;3272:4;8204:289:36;:::o;8309:125::-;8391:6;;;:::i;1512:13340::-;;;;;;;:::i;:::-;-1:-1:-1;1512:13340:36;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;:::i;:::-;-1:-1:-1;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;;-1:-1:-1;;1512:13340:36;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;-1:-1:-1;;;1512:13340:36;;;;;;;;;;;;-1:-1:-1;;;1512:13340:36;;;;;;;;8384:339:23;;;;;1512:13340:36;;;;6967:21;1512:13340;;;6967:21;1512:13340;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;1512:13340:36;;;;;;;:::o;:::-;-1:-1:-1;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;-1:-1:-1;;;;;;;;;;;1512:13340:36;:::o;9575:373::-;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;9782:33;;9778:51;;1512:13340;;-1:-1:-1;;;9846:95:36;;-1:-1:-1;;;;;1512:13340:36;;;9752:16;9846:95;;1512:13340;;;;;;;;9846:95;;1512:13340;;;;;;9846:95;;;;;;;1512:13340;9846:95;;;9839:102;9575:373;:::o;9846:95::-;;;;;;;;;;;;;;:::i;9778:51::-;9817:12;;;1512:13340;9817:12;:::o;5285:345::-;-1:-1:-1;;;;;;;;;;;;;;;;1512:13340:36;;5534:21;;5530:60;;5285:345;:::o;5530:60::-;5557:33;796:7:33;5557:33:36;:::o;1512:13340::-;;;;;;;;:::o;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;1512:13340:36;;;;;;;;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;;;;;;;;1512:13340:36;;-1:-1:-1;1512:13340:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;1512:13340:36;;;;;;;;;-1:-1:-1;1512:13340:36;;;;1810:805:33;2004:17;;:::i;:::-;-1:-1:-1;;;;;1512:13340:36;;;796:7:33;2035:45;;796:7;;;2196:93;21083:3141:24;1512:13340:36;21083:3141:24;;796:7:33;1512:13340:36;;;21083:3141:24;;;;;;;;796:7:33;21083:3141:24;;2189:100:33;:::o;21083:3141:24:-;796:7:33;-1:-1:-1;;1512:13340:36;;21083:3141:24;;;;;;;;;-1:-1:-1;;21083:3141:24;;;796:7:33;21083:3141:24;;;;;;;;;;;;;;;;;;;2189:100:33:o;2031:544::-;2310:45;796:7;2310:45;;2306:269;;2031:544;;1512:13340:36;;1810:805:33;:::o;2306:269::-;-1:-1:-1;;21083:3141:24;-1:-1:-1;;;;;;;1512:13340:36;796:7:33;-1:-1:-1;;21083:3141:24;;;1512:13340:36;21083:3141:24;;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1512:13340:36;21083:3141:24;;;;;;1512:13340:36;21083:3141:24;;;;2464:100:33;:::o;7570:495:23:-;;-1:-1:-1;;;;;1512:13340:36;;5890:42:23;7767:19;7763:49;;7875:184;;;;;1512:13340:36;7875:184:23;;;;;7570:495;:::o;7763:49::-;1512:13340:36;;;;7788:24:23;:::o;10179:333:36:-;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;;10373:33;;10369:51;;1512:13340;;-1:-1:-1;;;10437:68:36;;-1:-1:-1;;;;;1512:13340:36;;;10343:16;10437:68;;1512:13340;;;;;;10437:68;;1512:13340;;10437:68;;;;;;;1512:13340;10437:68;;;10430:75;10179:333;:::o;10369:51::-;10408:12;;1512:13340;10408:12;:::o;1361:129:25:-;1450:13;1512:13340:36;;;-1:-1:-1;;;1450:33:25;;-1:-1:-1;;;;;1512:13340:36;;;1450:33:25;;;1512:13340:36;;;;;;;;;;;1450:33:25;;1512:13340:36;;;1450:33:25;;;;;;;:13;:33;;;1443:40;1361:129;:::o;3314:1455:33:-;-1:-1:-1;;;;;;;;;;;1512:13340:36;3314:1455:33;;;;-1:-1:-1;;;;;1512:13340:36;8786:42;966:10:10;8786:42:36;:::i;:::-;8785:43;8781:537;;3314:1455:33;1413:17;1347:84;-1:-1:-1;;;;;1413:17:33;;:::i;:::-;1512:13340:36;1347:84:33;;:::i;:::-;3552:1164;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3552:1164:33;;;;;;;;;;;;;;;;8384:339:23;;;;;;3552:1164:33;;;;;3314:1455::o;3552:1164::-;;-1:-1:-1;3552:1164:33;8755:16:36;3552:1164:33;;8781:537:36;8856:33;;1512:13340;;;;-1:-1:-1;;;9091:95:36;;-1:-1:-1;;;;;1512:13340:36;;;8755:16;9091:95;;1512:13340;;;;;;;;9091:95;;1512:13340;;;;;;9091:95;;;;;;;-1:-1:-1;9091:95:36;;;8781:537;1512:13340;;;;8781:537;;;9091:95;;;;;;;;;;;;;;:::i;:::-;;;;2709:128:11;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;2770:61:11;;2709:128::o;2770:61::-;2805:15;;;-1:-1:-1;2805:15:11;;-1:-1:-1;2805:15:11;12672:500:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;12825:33;;12821:46;;12880:42;966:10:10;12880:42:36;:::i;:::-;12876:55;;1512:13340;;-1:-1:-1;;;12961:103:36;;-1:-1:-1;;;;;1512:13340:36;;;;12777:34;12961:103;;1512:13340;-1:-1:-1;1512:13340:36;;;;12961:103;;1512:13340;;;;;;12961:103;;;;;;;-1:-1:-1;12961:103:36;;;12672:500;1512:13340;;;;12672:500::o;12961:103::-;;;;;;;;;;;;;;:::i;:::-;;;;12876:55;12924:7;;:::o;27435:1087:23:-;;-1:-1:-1;;;;;1512:13340:36;;5890:42:23;27590:19;27586:32;;27721:795;;;;;;;;;;;;;;;;;27435:1087;;;:::o;27721:795::-;;;;;;;;;27435:1087::o;27721:795::-;;;;;;;27586:32;27611:7;;;:::o;6412:1304:33:-;-1:-1:-1;;;;;;;;;;;1512:13340:36;-1:-1:-1;;;;;1512:13340:36;8786:42;966:10:10;8786:42:36;:::i;:::-;8785:43;8781:537;;6412:1304:33;6697:17;-1:-1:-1;;;;;6697:17:33;;:::i;:::-;1512:13340:36;6630:85:33;25748:19:24;;1512:13340:36;25748:19:24;;:::i;:::-;25820:256;1512:13340:36;25820:256:24;;;;6412:1304:33;6768:887;;;;6528:1;6768:887;;;;;;;;;;;;;;6528:1;6768:887;;;;;;;;;;;8384:339:23;;;;;6768:887:33;;;;;6412:1304::o;25820:256:24:-;;;;;;;;;6528:1:33;25820:256:24;8755:16:36;25820:256:24;;8781:537:36;8856:33;;1512:13340;;;;-1:-1:-1;;;9091:95:36;;-1:-1:-1;;;;;1512:13340:36;;8755:16;9091:95;;1512:13340;-1:-1:-1;1512:13340:36;;;;;9091:95;;1512:13340;;;;;;9091:95;;;;;;;6528:1:33;9091:95:36;;;8781:537;1512:13340;;;;8781:537;;;9091:95;;;;;;;;;;;;;;:::i;:::-;;;;20943:3287:24;21083:3141;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;1512:13340:36;21083:3141:24;;;20943:3287::o;21083:3141::-;1512:13340:36;;-1:-1:-1;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;20943:3287::o;:::-;;1512:13340:36;21083:3141:24;;;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;20943:3287::o;21083:3141::-;1512:13340:36;;-1:-1:-1;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:3287::o;:::-;21083:3141;;;;20943:3287;21083:3141;;;;;;;;;;;;;;;;;;20943:3287::o;21083:3141::-;1512:13340:36;;-1:-1:-1;;1512:13340:36;21083:3141:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:3287::o;2909:126:11:-;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;2971:9:11;2967:62;;2909:126::o;2967:62::-;3003:15;;;-1:-1:-1;3003:15:11;;-1:-1:-1;3003:15:11;7242:3683:21;;;-1:-1:-1;;7242:3683:21;;1412:159;;;;;;;;;;;;;;;;7498:9;;7494:365;;7969:19;;;;7965:142;;8390:308;;;;940:4:19;1512:13340:36;940:4:19;8917:31:21;;8962:384;;;9800:1;940:4:19;9781:1:21;940:4:19;9780:21:21;940:4:19;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;;;;9800:1:21;940:4:19;;8962:384:21;;;;1512:13340:36;8962:384:21;;;8390:308;;;;;;940:4:19;8390:308:21;;8962:384;9409:18;940:4:19;7242:3683:21;:::o;7965:142::-;1829:135:19;;1512:13340:36;1829:135:19;8028:16:21;5312:5;940:4:19;;5306:42:21;1829:135:19;;;;;7494:365:21;7827:17;;;;1512:13340:36;;;;;7820:24:21;:::o;1512:13340:36:-;;;;;;;;;;;;7082:141:9;1512:13340:36;-1:-1:-1;;;;;;;;;;;1512:13340:36;;;;7148:18:9;7144:73;;7082:141::o;7144:73::-;7189:17;;;-1:-1:-1;7189:17:9;;-1:-1:-1;7189:17:9;8370:720:17;;-1:-1:-1;8507:421:17;8370:720;8507:421;;;;;;;;;;;;-1:-1:-1;8507:421:17;;8942:15;;-1:-1:-1;;;;;;1512:13340:36;;8960:26:17;:31;8942:68;8938:146;;8370:720;:::o;8938:146::-;-1:-1:-1;;;;9033:40:17;;;-1:-1:-1;;;;;1512:13340:36;;;;9033:40:17;1512:13340:36;;;9033:40:17;8942:68;9009:1;8994:16;;8942:68;","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"accessControl()","signatureHash4":"0x13007d55","signatureHash32":"0x13007d55f557a45612c4afdb48dab1774f1e9a1a60e53c68ae604e2cf641ec3b"},{"signature":"allowance(address,address)","signatureHash4":"0xdd62ed3e","signatureHash32":"0xdd62ed3e90e97b3d417db9c0c7522647811bafca5afc6694f143588d255fdfb4"},{"signature":"applySplit(uint256,uint256)","signatureHash4":"0x804d4ffc","signatureHash32":"0x804d4ffc723ba3b3b32ca7230be65f24be0908e691b5a8ebe9d2db44412d3deb"},{"signature":"approvalRequired()","signatureHash4":"0x9f68b964","signatureHash32":"0x9f68b96462eb2bd818b53c215998b3f0c94a1161a0b3a7053b1679c4420d9735"},{"signature":"approve(address,uint256)","signatureHash4":"0x095ea7b3","signatureHash32":"0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba"},{"signature":"balanceOf(address)","signatureHash4":"0x70a08231","signatureHash32":"0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be"},{"signature":"balancePerShare()","signatureHash4":"0xa781a3fd","signatureHash32":"0xa781a3fdd4a1aacd7ee0ad4af04d6c9d073d3069fb7227e1252a08a05c25a627"},{"signature":"balanceToShares(uint256)","signatureHash4":"0xd8ddf18f","signatureHash32":"0xd8ddf18f1bfb3b85f6a37faa9da07fbfa94ad04de3d343dc198fee4955208ead"},{"signature":"burnFrom(address,uint256)","signatureHash4":"0x79cc6790","signatureHash32":"0x79cc679044ee9a2021f0a26c0fdec02ac39179cd005bb971a471b7f9f17c576c"},{"signature":"burn(uint256)","signatureHash4":"0x42966c68","signatureHash32":"0x42966c689b5afe9b9b3f8a7103b2a19980d59629bfd6a20a60972312ed41d836"},{"signature":"decimals()","signatureHash4":"0x313ce567","signatureHash32":"0x313ce567add4d438edf58b94ff345d7d38c45b17dfc0f947988d7819dca364f9"},{"signature":"diamond()","signatureHash4":"0xf0b7db4e","signatureHash32":"0xf0b7db4e1394f9e8f99313c54613d4b5022e1ea8ef980b5d223fa402802c0cd8"},{"signature":"DOMAIN_SEPARATOR()","signatureHash4":"0x3644e515","signatureHash32":"0x3644e5157256d68e3eeedd2ead302507a9c4ffaff665547d2c3623a1e9e7edf4"},{"signature":"endpoint()","signatureHash4":"0x5e280f11","signatureHash32":"0x5e280f11c532a795eedd9ba2bba00037ba6dc8f5f567bb1d3c4d80503b05a14f"},{"signature":"initialize(string,string,address,address,address)","signatureHash4":"0xdb0ed6a0","signatureHash32":"0xdb0ed6a04fe2c1749d33e22c76507a2661e152a12ca72c3f22fb18d7e5a7e4e8"},{"signature":"isBlacklisted(address)","signatureHash4":"0xfe575a87","signatureHash32":"0xfe575a87aab505e234db2b42c812533d8e3bd159f25615abf29ce636184a6cb4"},{"signature":"isTransferAllowed(address,address)","signatureHash4":"0x97e2b9af","signatureHash32":"0x97e2b9af595d7fc3ca5e93e4833abf467ca9cba5bad9ee09e4e8ed554355027a"},{"signature":"maxSupply()","signatureHash4":"0xd5abeb01","signatureHash32":"0xd5abeb019d507b76d3c173387b805b2b51d2b70f218401ea3504c69c56d36777"},{"signature":"mint(address,uint256)","signatureHash4":"0x40c10f19","signatureHash32":"0x40c10f19c047ae7dfa66d6312b683d2ea3dfbcb4159e96b967c5f4b0a86f2842"},{"signature":"name()","signatureHash4":"0x06fdde03","signatureHash32":"0x06fdde0383f15d582d1a74511486c9ddf862a882fb7904b3d9fe9b8b8e58a796"},{"signature":"nonces(address)","signatureHash4":"0x7ecebe00","signatureHash32":"0x7ecebe00bc8d5df94a191da8e29b79e67a22b668e14b756a81ef2f5fa215cb0c"},{"signature":"pause()","signatureHash4":"0x8456cb59","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89"},{"signature":"paused()","signatureHash4":"0x5c975abb","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2"},{"signature":"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)","signatureHash4":"0xd505accf","signatureHash32":"0xd505accfee7b46ac3ce97322c21f328b64073d188137e16f7ef87f8de076b51c"},{"signature":"quoteSend((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),bool)","signatureHash4":"0x3b6f743b","signatureHash32":"0x3b6f743b07f188abab3dfb4349d74007ba286c8a5d7b741b103db011cee89052"},{"signature":"reinitialize()","signatureHash4":"0x6c2eb350","signatureHash32":"0x6c2eb350012306baa69518c6cbf50ccc70318129e0f15e575dfcf82926c972e8"},{"signature":"sendFrom((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),address,(uint256,uint256),address)","signatureHash4":"0x3abc1079","signatureHash32":"0x3abc10794713edd02db27a9ebf4f79c1e0479fc3f0a7f8513030d2037aa8c5e3"},{"signature":"send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address)","signatureHash4":"0xc7c7f5b3","signatureHash32":"0xc7c7f5b397ef5677f49aab0666b16f406b8b208ba20e1b2504dc99c14fafbfb6"},{"signature":"setBalancePerShare(uint128)","signatureHash4":"0xa850e024","signatureHash32":"0xa850e0246241f445338c396d2daad8f21012a911de7cb40543ea0f56ce012941"},{"signature":"setName(string)","signatureHash4":"0xc47f0027","signatureHash32":"0xc47f00276f2f257a0d6e08fde7692b09d811f0ee9b5a09ef0807a6ba46c7db94"},{"signature":"setSymbol(string)","signatureHash4":"0xb84c8246","signatureHash32":"0xb84c82465850ce875c6133a6ebc7b108e7c2670c154ab13675a3c664385c3e34"},{"signature":"setTransferRestrictor(address)","signatureHash4":"0x4904ac8f","signatureHash32":"0x4904ac8fbe7f696d567e86c61bf3e8754f99fae24ddb5e33d3f60f32f43c9273"},{"signature":"sharedDecimals()","signatureHash4":"0x857749b0","signatureHash32":"0x857749b0ad0dffca23ea685aae691a12631d4d940f7371270d8c33e8bab5bfc3"},{"signature":"sharesOf(address)","signatureHash4":"0xf5eb42dc","signatureHash32":"0xf5eb42dc5b75aeacf458fb7ee3a7e64aff33064c435de4410e593730eb7c3169"},{"signature":"sharesToBalance(uint256)","signatureHash4":"0x53735f37","signatureHash32":"0x53735f371cb1ade6a9cc30002cc68e0ec9ce7a6551493492d7ab7d761d4a80ea"},{"signature":"symbol()","signatureHash4":"0x95d89b41","signatureHash32":"0x95d89b41e2f5f391a79ec54e9d87c79d6e777c63e32c28da95b4e9e4a79250ec"},{"signature":"token()","signatureHash4":"0xfc0c546a","signatureHash32":"0xfc0c546a8dce9d6e9b97c086302918c9106d97a17809f6bcacfe02124763cb39"},{"signature":"totalSupply()","signatureHash4":"0x18160ddd","signatureHash32":"0x18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932"},{"signature":"transfer(address,uint256)","signatureHash4":"0xa9059cbb","signatureHash32":"0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b"},{"signature":"transferFrom(address,address,uint256)","signatureHash4":"0x23b872dd","signatureHash32":"0x23b872dd7302113369cda2901243429419bec145408fa8b352b3dd92b66c680b"},{"signature":"transferRestrictor()","signatureHash4":"0xd4ec137a","signatureHash32":"0xd4ec137af4bf8dabf467d6f0ca475d9c2d919e2efda2cb6fabdb7c5a09d559b9"},{"signature":"unpause()","signatureHash4":"0x3f4ba83a","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc"}],"event":[{"signature":"Approval(address,address,uint256)","signatureHash4":"0x8c5be1e5","signatureHash32":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"},{"signature":"BalancePerShareSet(uint256)","signatureHash4":"0x7d1fa2fe","signatureHash32":"0x7d1fa2fe734d16276290c7f8713b6aac4d03f2ef2a604f4ef62525ccead2cf13"},{"signature":"DSharePaused(address,uint256)","signatureHash4":"0xba2d1108","signatureHash32":"0xba2d110807559072380c1694c3b4407aa036be7f4d52e74acba57ab005c91cd6"},{"signature":"DShareUnpaused(address,uint256)","signatureHash4":"0xcc17df5c","signatureHash32":"0xcc17df5c3ae5e9ad208367f6b7b7d99a24f74ede2777c475bdaec931558243de"},{"signature":"Initialized(uint64)","signatureHash4":"0xc7f505b2","signatureHash32":"0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"},{"signature":"NameSet(string)","signatureHash4":"0x13c98778","signatureHash32":"0x13c98778b0c1a086bb98d7f1986e15788b5d3a1ad4c492e1d78f1c4cc51c20cf"},{"signature":"OFTSent(bytes32,uint32,address,uint256,uint256)","signatureHash4":"0x85496b76","signatureHash32":"0x85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a"},{"signature":"Paused(address)","signatureHash4":"0x62e78cea","signatureHash32":"0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258"},{"signature":"SplitAdjusted(uint256,uint256,uint256,uint256)","signatureHash4":"0x8597746f","signatureHash32":"0x8597746f16247e9c83f7993e198d5d45bd8d43c460ec868c1899832d2099de5b"},{"signature":"SymbolSet(string)","signatureHash4":"0x3e46ff90","signatureHash32":"0x3e46ff90086ee29856e77591e82c82ff8ed513379b0fd82e84fc5290dd633c99"},{"signature":"Transfer(address,address,uint256)","signatureHash4":"0xddf252ad","signatureHash32":"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},{"signature":"TransferRestrictorSet(address)","signatureHash4":"0xc2315c0e","signatureHash32":"0xc2315c0e6785ae744f588d76c3aa8b08329e38dc33e849116b425556ef076ea4"},{"signature":"Unpaused(address)","signatureHash4":"0x5db9ee0a","signatureHash32":"0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa"}],"error":[{"signature":"AllowanceOverflow()","signatureHash4":"0xf9067066","signatureHash32":"0xf90670665e03a4773b0ff0038950e59dcf6eb0e11a551c751bfc6d601d4fba1f"},{"signature":"AllowanceUnderflow()","signatureHash4":"0x8301ab38","signatureHash32":"0x8301ab3813d043283976247523a0a38774b9155d7216ecc20ceae2039c28e28f"},{"signature":"AssetPaused()","signatureHash4":"0x823d7200","signatureHash32":"0x823d720090b9993109c2d323522c2331d1961fbdab01d1940ccf8c8db5300563"},{"signature":"EnforcedPause()","signatureHash4":"0xd93c0665","signatureHash32":"0xd93c0665d6c96d04a8f174024fc4ddd66c250604aff22bbec808de86dd3637e3"},{"signature":"ExpectedPause()","signatureHash4":"0x8dfc202b","signatureHash32":"0x8dfc202bcfe9a735b559bee70674422512bc5c30f687046ae8778315fb81da44"},{"signature":"FundingAssetPaused()","signatureHash4":"0xf628c973","signatureHash32":"0xf628c9734cfdcc4cdfa2be8e578ef3bc12064cd2fa4911c66bfaecadfb7a6af3"},{"signature":"InsufficientAllowance()","signatureHash4":"0x13be252b","signatureHash32":"0x13be252bc8f22c3de689f75d88d90b4c4aeb9cd39d50c39ae82df3b19f85cf73"},{"signature":"InsufficientBalance()","signatureHash4":"0xf4d678b8","signatureHash32":"0xf4d678b8ce6b5157126b1484a53523762a93571537a7d5ae97d8014a44715c94"},{"signature":"InvalidInitialization()","signatureHash4":"0xf92ee8a9","signatureHash32":"0xf92ee8a957075833165f68c320933b1a1294aafc84ee6e0dd3fb178008f9aaf5"},{"signature":"InvalidName()","signatureHash4":"0x430f13b3","signatureHash32":"0x430f13b3258f41708e03c9ac10900c92a05198a20080a57c2127a1b40ea76e92"},{"signature":"InvalidPermit()","signatureHash4":"0xddafbaef","signatureHash32":"0xddafbaefe5cdbfc41219261b5d7468d1f16bc986eedbdef2ea223830eb9c5e3e"},{"signature":"InvalidSymbol()","signatureHash4":"0x04119bc4","signatureHash32":"0x04119bc463cbaad70c035ff41b8e99def150c7fef0c59420332fbb28d8e79053"},{"signature":"NotInitializing()","signatureHash4":"0xd7e6bcf8","signatureHash32":"0xd7e6bcf8597daa127dc9f0048d2f08d5ef140a2cb659feabd700beff1f7a8302"},{"signature":"Permit2AllowanceIsFixedAtInfinity()","signatureHash4":"0x3f68539a","signatureHash32":"0x3f68539a770258d2bb543cd58b5796e9a7d3756f652a2877fca18c376b7d6d2d"},{"signature":"PermitExpired()","signatureHash4":"0x1a15a3cc","signatureHash32":"0x1a15a3cc224edbade4d933d5c6e98dd80b0bac0717489018b924d44d9f0272ea"},{"signature":"SafeCastOverflowedUintDowncast(uint8,uint256)","signatureHash4":"0x6dfcc650","signatureHash32":"0x6dfcc6503a32754ce7a89698e18201fc5294fd4aad43edefee786f88423b1a12"},{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"},{"signature":"TotalSupplyOverflow()","signatureHash4":"0xe5cfe957","signatureHash32":"0xe5cfe9574234d28adee0e141da16b8cf97573d6cdb05963cf8520ef32a8feff8"},{"signature":"TransferRestrictor_AccountRestricted()","signatureHash4":"0x377660d8","signatureHash32":"0x377660d8989378b99281a9addaaf40fad2dd95519a35f2095f462974a3237c45"},{"signature":"TransferRestrictor_NotSet()","signatureHash4":"0x0588ca95","signatureHash32":"0x0588ca95dfed6f680c268d52b46dd226edff4df366fb91371f20cc49cb40d300"},{"signature":"TransferRestrictor_TransferPhase2_NotAllowed()","signatureHash4":"0xaefbef08","signatureHash32":"0xaefbef0887f01c4ef51696e141181b50e25283dad985e167a671e8f2e45647e0"},{"signature":"ZeroAddress()","signatureHash4":"0xd92e233d","signatureHash32":"0xd92e233df2717d4a40030e20904abd27b68fcbeede117eaaccbbdac9618c8c73"},{"signature":"ZeroRatio()","signatureHash4":"0x3b290c8a","signatureHash32":"0x3b290c8ab0f6532422304b181efc7a03bc45f1142f70331d083f81c0ac60a8d2"},{"signature":"ZeroValue()","signatureHash4":"0x7c946ed7","signatureHash32":"0x7c946ed78134c23eac50c0c02964d68f22dd28448c070d39c9f8e8389b217469"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"42161","address":"0xf971CD2516Eae8bB197eE21987A8421069BD0a68"}