{"matchId":"42313445","creationMatch":null,"runtimeMatch":"match","verifiedAt":"2026-07-15T11:31:10Z","creationBytecode":{"onchainBytecode":null,"recompiledBytecode":"0x6080604052348015600e575f5ffd5b506118078061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106101ba575f3560e01c8063a035b1fe116100f3578063d2ef739811610093578063de1a69751161006e578063de1a697514610357578063e2997d6b1461035f578063f8f8b5f014610367578063f9e3444714610371575f5ffd5b8063d2ef73981461033d578063d83ed44014610345578063d94ad8371461034e575f5ffd5b8063bd8f238e116100ce578063bd8f238e146102fa578063c2ee5df914610319578063ccc1b9cd14610321578063d13f90b41461032a575f5ffd5b8063a035b1fe146102e2578063ad891006146102ea578063b166bf6b146102f2575f5ffd5b8063362a07ae1161015e5780637ad6d6d5116101395780637ad6d6d5146102a8578063836efd31146102b057806389ab3532146102d05780639df4d0fe146102d8575f5ffd5b8063362a07ae146102645780633682152b1461027a578063498e8b6e1461029f575f5ffd5b80631fc08644116101995780631fc0864414610207578063219a94b81461020f5780632289445e146102175780632f0a577b1461025c575f5ffd5b8062372f87146101be57806303c01e68146101c85780630434fe0b146101ff575b5f5ffd5b6101c661037a565b005b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116145b60405190151581526020015b60405180910390f35b6101c66104e4565b6101ea610664565b6101c66106b4565b6005546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f6565b6101ea6108b2565b61026c6108cf565b6040519081526020016101f6565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146101ea565b61026c60035481565b6101ea61095d565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61026c6109b5565b60065415156101ea565b61026c610b57565b61026c610d00565b6101c6610d6d565b5f546102379073ffffffffffffffffffffffffffffffffffffffff1681565b6101ea610f69565b61026c60065481565b6101c66103383660046116c9565b610f86565b6101c66113b7565b61026c60045481565b61026c60025481565b6101ea61152f565b6101c6611541565b60075415156101ea565b61026c60075481565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146103ec5760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064015b60405180910390fd5b60075461043b5760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b61044361152f565b6104b55760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60078190556040517ff5decdb337f3f69eb4a1610788fd6d8325897945c0f070fef7218c25b84ea9089190a1565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146105515760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b600754156105a15760405162461bcd60e51b815260206004820152601560248201527f4d4f44543a20416c7265616479206865616c696e67000000000000000000000060448201526064016103e3565b6105a961152f565b1561061c5760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b600454610629904261173f565b60078190556040519081527fb36d2484c6d35cccf36d46eafe82aa81628f80b9c4e6d1828f5837236a0641bd906020015b60405180910390a1565b5f805460055473ffffffffffffffffffffffffffffffffffffffff9182169116148015610692575060065415155b80156106a057506006544210155b80156106af57506106af61152f565b905090565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146107215760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b6007546107705760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b6007544210156107e85760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a204865616c696e672074696d656c6f636b206e6f7420706173736560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6107f061152f565b1561083d5760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e206f63637572726564000000000000000060448201526064016103e3565b5f8054600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169182179055600782905560405190917f184591035d84fab784c414962589ca8bf109c62ce76e7b318ca83c16c7c63b6491a2565b5f6108be600654151590565b80156106af57505060065442101590565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190611758565b5f61098560015460055473ffffffffffffffffffffffffffffffffffffffff90811691161490565b8015610992575060075415155b80156109a057506007544210155b80156106af57506109af61152f565b15905090565b5f8054604080517fa035b1fe0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a469190611758565b90505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190611758565b905081158015610ae5575080155b15610af2575f9250505090565b5f818310610b0b57610b04828461176f565b9050610b18565b610b15838361176f565b90505b5f6002610b25848661173f565b610b2f9190611782565b905080610b4483670de0b6b3a76400006117ba565b610b4e9190611782565b94505050505090565b600554604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa925050508015610c00575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bfd91810190611758565b60015b610cfb575f5460055473ffffffffffffffffffffffffffffffffffffffff918216911603610c925760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b919050565b600154604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610939573d5f5f3e3d5ffd5b5f5460055473ffffffffffffffffffffffffffffffffffffffff918216911614610dd95760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654610e285760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b600654421015610ea05760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a204368616c6c656e67652074696d656c6f636b206e6f742070617360448201527f736564000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b610ea861152f565b610ef45760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e207265736f6c766564000000000000000060448201526064016103e3565b600154600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790555f60068190556040517f235d3c92abef402ad8969f43056a1212760efee2e4357b1e165a93aed19329e39190a2565b5f610f75600754151590565b80156106af57505060075442101590565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610fd05750825b90505f8267ffffffffffffffff166001148015610fec5750303b155b905081158015610ffa575080155b15611031576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b73ffffffffffffffffffffffffffffffffffffffff8a166110f55760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207072696d617279206f7261636c650000000000000000000060448201526064016103e3565b73ffffffffffffffffffffffffffffffffffffffff89166111585760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261636b7570206f7261636c65000000000000000000000060448201526064016103e3565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16036111d35760405162461bcd60e51b815260206004820152601960248201527f4f7261636c6573206d75737420626520646966666572656e740000000000000060448201526064016103e3565b5f88116112475760405162461bcd60e51b8152602060048201526024808201527f446576696174696f6e207468726573686f6c64206d75737420626520706f736960448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f805473ffffffffffffffffffffffffffffffffffffffff808d167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617835560018054918d16919092161790556002899055600388905560048790556112ae6109b5565b9050888111156113005760405162461bcd60e51b815260206004820181905260248201527f4d4f44543a20496e697469616c20646576696174696f6e20746f6f206869676860448201526064016103e3565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c161790555f600681905560075583156113ab5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146114235760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654156114735760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20416c7265616479206368616c6c656e676564000000000000000060448201526064016103e3565b61147b61152f565b6114ed5760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6003546114fa904261173f565b60068190556040519081527fa895da4b794aeba8d8082db237265459db7b7ffdb5aa7c2332a7c5eafbfae7359060200161065a565b5f60025461153b6109b5565b11905090565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146115ad5760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b6006546115fc5760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b61160461152f565b156116775760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60068190556040517f50b374cefefbe966ce88eecb3ec50723325b080e27f17d311661c9c0790957889190a1565b803573ffffffffffffffffffffffffffffffffffffffff81168114610cfb575f5ffd5b5f5f5f5f5f60a086880312156116dd575f5ffd5b6116e6866116a6565b94506116f4602087016116a6565b94979496505050506040830135926060810135926080909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175257611752611712565b92915050565b5f60208284031215611768575f5ffd5b5051919050565b8181038181111561175257611752611712565b5f826117b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176117525761175261171256fea26469706673582212202d2c4443a6f63a7e838658d15ea6a69b2cea9aeab4171bf4f448dfb8e3a93ac364736f6c63430008210033","sourceMap":"650:9140:1:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212202d2c4443a6f63a7e838658d15ea6a69b2cea9aeab4171bf4f448dfb8e3a93ac364736f6c63430008210033","offset":6126}},"transformations":null,"transformationValues":null},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561000f575f5ffd5b50600436106101ba575f3560e01c8063a035b1fe116100f3578063d2ef739811610093578063de1a69751161006e578063de1a697514610357578063e2997d6b1461035f578063f8f8b5f014610367578063f9e3444714610371575f5ffd5b8063d2ef73981461033d578063d83ed44014610345578063d94ad8371461034e575f5ffd5b8063bd8f238e116100ce578063bd8f238e146102fa578063c2ee5df914610319578063ccc1b9cd14610321578063d13f90b41461032a575f5ffd5b8063a035b1fe146102e2578063ad891006146102ea578063b166bf6b146102f2575f5ffd5b8063362a07ae1161015e5780637ad6d6d5116101395780637ad6d6d5146102a8578063836efd31146102b057806389ab3532146102d05780639df4d0fe146102d8575f5ffd5b8063362a07ae146102645780633682152b1461027a578063498e8b6e1461029f575f5ffd5b80631fc08644116101995780631fc0864414610207578063219a94b81461020f5780632289445e146102175780632f0a577b1461025c575f5ffd5b8062372f87146101be57806303c01e68146101c85780630434fe0b146101ff575b5f5ffd5b6101c661037a565b005b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116145b60405190151581526020015b60405180910390f35b6101c66104e4565b6101ea610664565b6101c66106b4565b6005546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f6565b6101ea6108b2565b61026c6108cf565b6040519081526020016101f6565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146101ea565b61026c60035481565b6101ea61095d565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61026c6109b5565b60065415156101ea565b61026c610b57565b61026c610d00565b6101c6610d6d565b5f546102379073ffffffffffffffffffffffffffffffffffffffff1681565b6101ea610f69565b61026c60065481565b6101c66103383660046116c9565b610f86565b6101c66113b7565b61026c60045481565b61026c60025481565b6101ea61152f565b6101c6611541565b60075415156101ea565b61026c60075481565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146103ec5760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064015b60405180910390fd5b60075461043b5760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b61044361152f565b6104b55760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60078190556040517ff5decdb337f3f69eb4a1610788fd6d8325897945c0f070fef7218c25b84ea9089190a1565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146105515760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b600754156105a15760405162461bcd60e51b815260206004820152601560248201527f4d4f44543a20416c7265616479206865616c696e67000000000000000000000060448201526064016103e3565b6105a961152f565b1561061c5760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b600454610629904261173f565b60078190556040519081527fb36d2484c6d35cccf36d46eafe82aa81628f80b9c4e6d1828f5837236a0641bd906020015b60405180910390a1565b5f805460055473ffffffffffffffffffffffffffffffffffffffff9182169116148015610692575060065415155b80156106a057506006544210155b80156106af57506106af61152f565b905090565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146107215760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b6007546107705760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b6007544210156107e85760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a204865616c696e672074696d656c6f636b206e6f7420706173736560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6107f061152f565b1561083d5760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e206f63637572726564000000000000000060448201526064016103e3565b5f8054600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169182179055600782905560405190917f184591035d84fab784c414962589ca8bf109c62ce76e7b318ca83c16c7c63b6491a2565b5f6108be600654151590565b80156106af57505060065442101590565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190611758565b5f61098560015460055473ffffffffffffffffffffffffffffffffffffffff90811691161490565b8015610992575060075415155b80156109a057506007544210155b80156106af57506109af61152f565b15905090565b5f8054604080517fa035b1fe0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a469190611758565b90505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190611758565b905081158015610ae5575080155b15610af2575f9250505090565b5f818310610b0b57610b04828461176f565b9050610b18565b610b15838361176f565b90505b5f6002610b25848661173f565b610b2f9190611782565b905080610b4483670de0b6b3a76400006117ba565b610b4e9190611782565b94505050505090565b600554604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa925050508015610c00575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bfd91810190611758565b60015b610cfb575f5460055473ffffffffffffffffffffffffffffffffffffffff918216911603610c925760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b919050565b600154604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610939573d5f5f3e3d5ffd5b5f5460055473ffffffffffffffffffffffffffffffffffffffff918216911614610dd95760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654610e285760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b600654421015610ea05760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a204368616c6c656e67652074696d656c6f636b206e6f742070617360448201527f736564000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b610ea861152f565b610ef45760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e207265736f6c766564000000000000000060448201526064016103e3565b600154600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790555f60068190556040517f235d3c92abef402ad8969f43056a1212760efee2e4357b1e165a93aed19329e39190a2565b5f610f75600754151590565b80156106af57505060075442101590565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610fd05750825b90505f8267ffffffffffffffff166001148015610fec5750303b155b905081158015610ffa575080155b15611031576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b73ffffffffffffffffffffffffffffffffffffffff8a166110f55760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207072696d617279206f7261636c650000000000000000000060448201526064016103e3565b73ffffffffffffffffffffffffffffffffffffffff89166111585760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261636b7570206f7261636c65000000000000000000000060448201526064016103e3565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16036111d35760405162461bcd60e51b815260206004820152601960248201527f4f7261636c6573206d75737420626520646966666572656e740000000000000060448201526064016103e3565b5f88116112475760405162461bcd60e51b8152602060048201526024808201527f446576696174696f6e207468726573686f6c64206d75737420626520706f736960448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f805473ffffffffffffffffffffffffffffffffffffffff808d167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617835560018054918d16919092161790556002899055600388905560048790556112ae6109b5565b9050888111156113005760405162461bcd60e51b815260206004820181905260248201527f4d4f44543a20496e697469616c20646576696174696f6e20746f6f206869676860448201526064016103e3565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c161790555f600681905560075583156113ab5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146114235760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654156114735760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20416c7265616479206368616c6c656e676564000000000000000060448201526064016103e3565b61147b61152f565b6114ed5760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6003546114fa904261173f565b60068190556040519081527fa895da4b794aeba8d8082db237265459db7b7ffdb5aa7c2332a7c5eafbfae7359060200161065a565b5f60025461153b6109b5565b11905090565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146115ad5760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b6006546115fc5760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b61160461152f565b156116775760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60068190556040517f50b374cefefbe966ce88eecb3ec50723325b080e27f17d311661c9c0790957889190a1565b803573ffffffffffffffffffffffffffffffffffffffff81168114610cfb575f5ffd5b5f5f5f5f5f60a086880312156116dd575f5ffd5b6116e6866116a6565b94506116f4602087016116a6565b94979496505050506040830135926060810135926080909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175257611752611712565b92915050565b5f60208284031215611768575f5ffd5b5051919050565b8181038181111561175257611752611712565b5f826117b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176117525761175261171256fea2646970667358221220e81c692102d3216ee52f177f8fbb054e78560181c06a432ba89f4a1be4b89baa64736f6c63430008210033","recompiledBytecode":"0x608060405234801561000f575f5ffd5b50600436106101ba575f3560e01c8063a035b1fe116100f3578063d2ef739811610093578063de1a69751161006e578063de1a697514610357578063e2997d6b1461035f578063f8f8b5f014610367578063f9e3444714610371575f5ffd5b8063d2ef73981461033d578063d83ed44014610345578063d94ad8371461034e575f5ffd5b8063bd8f238e116100ce578063bd8f238e146102fa578063c2ee5df914610319578063ccc1b9cd14610321578063d13f90b41461032a575f5ffd5b8063a035b1fe146102e2578063ad891006146102ea578063b166bf6b146102f2575f5ffd5b8063362a07ae1161015e5780637ad6d6d5116101395780637ad6d6d5146102a8578063836efd31146102b057806389ab3532146102d05780639df4d0fe146102d8575f5ffd5b8063362a07ae146102645780633682152b1461027a578063498e8b6e1461029f575f5ffd5b80631fc08644116101995780631fc0864414610207578063219a94b81461020f5780632289445e146102175780632f0a577b1461025c575f5ffd5b8062372f87146101be57806303c01e68146101c85780630434fe0b146101ff575b5f5ffd5b6101c661037a565b005b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116145b60405190151581526020015b60405180910390f35b6101c66104e4565b6101ea610664565b6101c66106b4565b6005546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f6565b6101ea6108b2565b61026c6108cf565b6040519081526020016101f6565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146101ea565b61026c60035481565b6101ea61095d565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61026c6109b5565b60065415156101ea565b61026c610b57565b61026c610d00565b6101c6610d6d565b5f546102379073ffffffffffffffffffffffffffffffffffffffff1681565b6101ea610f69565b61026c60065481565b6101c66103383660046116c9565b610f86565b6101c66113b7565b61026c60045481565b61026c60025481565b6101ea61152f565b6101c6611541565b60075415156101ea565b61026c60075481565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146103ec5760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064015b60405180910390fd5b60075461043b5760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b61044361152f565b6104b55760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60078190556040517ff5decdb337f3f69eb4a1610788fd6d8325897945c0f070fef7218c25b84ea9089190a1565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146105515760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b600754156105a15760405162461bcd60e51b815260206004820152601560248201527f4d4f44543a20416c7265616479206865616c696e67000000000000000000000060448201526064016103e3565b6105a961152f565b1561061c5760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b600454610629904261173f565b60078190556040519081527fb36d2484c6d35cccf36d46eafe82aa81628f80b9c4e6d1828f5837236a0641bd906020015b60405180910390a1565b5f805460055473ffffffffffffffffffffffffffffffffffffffff9182169116148015610692575060065415155b80156106a057506006544210155b80156106af57506106af61152f565b905090565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146107215760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b6007546107705760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b6007544210156107e85760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a204865616c696e672074696d656c6f636b206e6f7420706173736560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6107f061152f565b1561083d5760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e206f63637572726564000000000000000060448201526064016103e3565b5f8054600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169182179055600782905560405190917f184591035d84fab784c414962589ca8bf109c62ce76e7b318ca83c16c7c63b6491a2565b5f6108be600654151590565b80156106af57505060065442101590565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190611758565b5f61098560015460055473ffffffffffffffffffffffffffffffffffffffff90811691161490565b8015610992575060075415155b80156109a057506007544210155b80156106af57506109af61152f565b15905090565b5f8054604080517fa035b1fe0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a469190611758565b90505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190611758565b905081158015610ae5575080155b15610af2575f9250505090565b5f818310610b0b57610b04828461176f565b9050610b18565b610b15838361176f565b90505b5f6002610b25848661173f565b610b2f9190611782565b905080610b4483670de0b6b3a76400006117ba565b610b4e9190611782565b94505050505090565b600554604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa925050508015610c00575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bfd91810190611758565b60015b610cfb575f5460055473ffffffffffffffffffffffffffffffffffffffff918216911603610c925760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b919050565b600154604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610939573d5f5f3e3d5ffd5b5f5460055473ffffffffffffffffffffffffffffffffffffffff918216911614610dd95760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654610e285760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b600654421015610ea05760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a204368616c6c656e67652074696d656c6f636b206e6f742070617360448201527f736564000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b610ea861152f565b610ef45760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e207265736f6c766564000000000000000060448201526064016103e3565b600154600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790555f60068190556040517f235d3c92abef402ad8969f43056a1212760efee2e4357b1e165a93aed19329e39190a2565b5f610f75600754151590565b80156106af57505060075442101590565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610fd05750825b90505f8267ffffffffffffffff166001148015610fec5750303b155b905081158015610ffa575080155b15611031576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b73ffffffffffffffffffffffffffffffffffffffff8a166110f55760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207072696d617279206f7261636c650000000000000000000060448201526064016103e3565b73ffffffffffffffffffffffffffffffffffffffff89166111585760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261636b7570206f7261636c65000000000000000000000060448201526064016103e3565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16036111d35760405162461bcd60e51b815260206004820152601960248201527f4f7261636c6573206d75737420626520646966666572656e740000000000000060448201526064016103e3565b5f88116112475760405162461bcd60e51b8152602060048201526024808201527f446576696174696f6e207468726573686f6c64206d75737420626520706f736960448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f805473ffffffffffffffffffffffffffffffffffffffff808d167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617835560018054918d16919092161790556002899055600388905560048790556112ae6109b5565b9050888111156113005760405162461bcd60e51b815260206004820181905260248201527f4d4f44543a20496e697469616c20646576696174696f6e20746f6f206869676860448201526064016103e3565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c161790555f600681905560075583156113ab5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146114235760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654156114735760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20416c7265616479206368616c6c656e676564000000000000000060448201526064016103e3565b61147b61152f565b6114ed5760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6003546114fa904261173f565b60068190556040519081527fa895da4b794aeba8d8082db237265459db7b7ffdb5aa7c2332a7c5eafbfae7359060200161065a565b5f60025461153b6109b5565b11905090565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146115ad5760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b6006546115fc5760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b61160461152f565b156116775760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60068190556040517f50b374cefefbe966ce88eecb3ec50723325b080e27f17d311661c9c0790957889190a1565b803573ffffffffffffffffffffffffffffffffffffffff81168114610cfb575f5ffd5b5f5f5f5f5f60a086880312156116dd575f5ffd5b6116e6866116a6565b94506116f4602087016116a6565b94979496505050506040830135926060810135926080909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175257611752611712565b92915050565b5f60208284031215611768575f5ffd5b5051919050565b8181038181111561175257611752611712565b5f826117b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176117525761175261171256fea26469706673582212202d2c4443a6f63a7e838658d15ea6a69b2cea9aeab4171bf4f448dfb8e3a93ac364736f6c63430008210033","sourceMap":"650:9140:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8407:314;;;:::i;:::-;;3992:102;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;3992:102;;;179:14:4;;172:22;154:41;;142:2;127:18;3992:102:1;;;;;;;;7959:343;;;:::i;6966:168::-;;;:::i;9320:467::-;;;:::i;1111:28::-;;;;;;;;;;;;398:42:4;386:55;;;368:74;;356:2;341:18;1111:28:1;206:242:4;6761:139:1;;;:::i;3477:101::-;;;:::i;:::-;;;599:25:4;;;587:2;572:18;3477:101:1;453:177:4;3812:104:1;3854:4;3895:13;3878;;3895;;;;3878;;:30;3812:104;;949:40;;;;;;8977:161;;;:::i;834:27::-;;;;;;;;;4693:843;;;:::i;4162:99::-;4231:18;;:22;;4162:99;;3070:349;;;:::i;3636:99::-;;;:::i;7299:477::-;;;:::i;799:28::-;;;;;;;;;8781:132;;;:::i;1175:33::-;;;;;;1857:1176;;;;;;:::i;:::-;;:::i;5914:361::-;;;:::i;1019:38::-;;;;;;868:33;;;;;;5619:109;;;:::i;6367:332::-;;;:::i;4334:94::-;4400:16;;:20;;4334:94;;1277:31;;;;;;8407:314;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;8452:50;;;;-1:-1:-1;;;8452:50:1;;1718:2:4;8452:50:1;;;1700:21:4;1757:2;1737:18;;;1730:30;1796:29;1776:18;;;1769:57;1843:18;;8452:50:1;;;;;;;;;4400:16;;8539:41;;;;-1:-1:-1;;;8539:41:1;;2074:2:4;8539:41:1;;;2056:21:4;2113:2;2093:18;;;2086:30;2152:19;2132:18;;;2125:47;2189:18;;8539:41:1;1872:341:4;8539:41:1;8599:11;:9;:11::i;:::-;8591:57;;;;-1:-1:-1;;;8591:57:1;;2420:2:4;8591:57:1;;;2402:21:4;2459:2;2439:18;;;2432:30;2498:34;2478:18;;;2471:62;2569:3;2549:18;;;2542:31;2590:19;;8591:57:1;2218:397:4;8591:57:1;8680:1;8661:16;:20;;;8697:16;;;;8680:1;8697:16;8407:314::o;7959:343::-;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;7995:50;;;;-1:-1:-1;;;7995:50:1;;1718:2:4;7995:50:1;;;1700:21:4;1757:2;1737:18;;;1730:30;1796:29;1776:18;;;1769:57;1843:18;;7995:50:1;1516:351:4;7995:50:1;4400:16;;:20;8056:46;;;;-1:-1:-1;;;8056:46:1;;2822:2:4;8056:46:1;;;2804:21:4;2861:2;2841:18;;;2834:30;2900:23;2880:18;;;2873:51;2941:18;;8056:46:1;2620:345:4;8056:46:1;8122:11;:9;:11::i;:::-;8121:12;8113:60;;;;-1:-1:-1;;;8113:60:1;;3172:2:4;8113:60:1;;;3154:21:4;3211:2;3191:18;;;3184:30;3250:34;3230:18;;;3223:62;3321:5;3301:18;;;3294:33;3344:19;;8113:60:1;2970:399:4;8113:60:1;8223:23;;8205:41;;:15;:41;:::i;:::-;8186:16;:60;;;8262:32;;599:25:4;;;8262:32:1;;587:2:4;572:18;8262:32:1;;;;;;;;7959:343::o;6966:168::-;7017:4;3895:13;;3878;;3895;;;;3878;;:30;7041:29;;;;-1:-1:-1;4231:18:1;;:22;;7056:14;7041:70;;;;;7093:18;;7074:15;:37;;7041:70;:85;;;;;7115:11;:9;:11::i;:::-;7034:92;;6966:168;:::o;9320:467::-;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;9365:50;;;;-1:-1:-1;;;9365:50:1;;1718:2:4;9365:50:1;;;1700:21:4;1757:2;1737:18;;;1730:30;1796:29;1776:18;;;1769:57;1843:18;;9365:50:1;1516:351:4;9365:50:1;4400:16;;9426:41;;;;-1:-1:-1;;;9426:41:1;;2074:2:4;9426:41:1;;;2056:21:4;2113:2;2093:18;;;2086:30;2152:19;2132:18;;;2125:47;2189:18;;9426:41:1;1872:341:4;9426:41:1;9505:16;;9486:15;:35;;9478:81;;;;-1:-1:-1;;;9478:81:1;;3895:2:4;9478:81:1;;;3877:21:4;3934:2;3914:18;;;3907:30;3973:34;3953:18;;;3946:62;4044:3;4024:18;;;4017:31;4065:19;;9478:81:1;3693:397:4;9478:81:1;9579:11;:9;:11::i;:::-;9578:12;9570:49;;;;-1:-1:-1;;;9570:49:1;;4297:2:4;9570:49:1;;;4279:21:4;4336:2;4316:18;;;4309:30;4375:26;4355:18;;;4348:54;4419:18;;9570:49:1;4095:348:4;9570:49:1;9680:13;;;9664;:29;;;;9680:13;;;;9664:29;;;;;9704:16;:20;;;9740:39;;9680:13;;9740:39;;;9320:467::o;6761:139::-;6813:4;6837:14;4231:18;;:22;;;4162:99;6837:14;:55;;;;-1:-1:-1;;6874:18:1;;6855:15;:37;;;6761:139::o;3477:101::-;3522:7;3549:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8977:161::-;9026:4;9050:10;4074:12;;4057:13;;4074:12;4057:13;;;4074:12;;4057:29;;3992:102;9050:10;:25;;;;-1:-1:-1;4400:16:1;;:20;;9064:11;9050:64;;;;;9098:16;;9079:15;:35;;9050:64;:80;;;;;9119:11;:9;:11::i;:::-;9118:12;9043:87;;8977:161;:::o;4693:843::-;4738:7;4788:13;;:21;;;;;;;;4738:7;;4788:13;;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4758:51;;4820:26;4849:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4820:49;-1:-1:-1;4937:24:1;;:51;;;;-1:-1:-1;4965:23:1;;4937:51;4933:92;;;5012:1;5005:8;;;;4693:843;:::o;4933:92::-;5037:12;5087:18;5064:19;:41;5060:201;;5129:40;5151:18;5129:19;:40;:::i;:::-;5122:47;;5060:201;;;5209:40;5230:19;5209:18;:40;:::i;:::-;5202:47;;5060:201;5321:15;5384:1;5340:40;5362:18;5340:19;:40;:::i;:::-;5339:46;;;;:::i;:::-;5321:64;-1:-1:-1;5321:64:1;5504:13;:4;5511:6;5504:13;:::i;:::-;5503:25;;;;:::i;:::-;5496:32;;;;;;4693:843;:::o;3070:349::-;3132:13;;:21;;;;;;;;3108:7;;3132:13;;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;-1:-1:-1;3132:21:1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3128:284;;3854:4;3895:13;3878;;3895;;;;3878;;:30;3253:148;;3296:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3253:148;3364:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3128:284;3207:12;3070:349;-1:-1:-1;3070:349:1:o;3636:99::-;3707:12;;:20;;;;;;;;3680:7;;3707:12;;;:18;;:20;;;;;;;;;;;;;;:12;:20;;;;;;;;;;;;;;7299:477;3854:4;3895:13;3878;;3895;;;;3878;;:30;7346:52;;;;-1:-1:-1;;;7346:52:1;;5424:2:4;7346:52:1;;;5406:21:4;5463:2;5443:18;;;5436:30;5502;5482:18;;;5475:58;5550:18;;7346:52:1;5222:352:4;7346:52:1;4231:18;;7409:47;;;;-1:-1:-1;;;7409:47:1;;5781:2:4;7409:47:1;;;5763:21:4;5820:2;5800:18;;;5793:30;5859:22;5839:18;;;5832:50;5899:18;;7409:47:1;5579:344:4;7409:47:1;7494:18;;7475:15;:37;;7467:85;;;;-1:-1:-1;;;7467:85:1;;6130:2:4;7467:85:1;;;6112:21:4;6169:2;6149:18;;;6142:30;6208:34;6188:18;;;6181:62;6279:5;6259:18;;;6252:33;6302:19;;7467:85:1;5928:399:4;7467:85:1;7571:11;:9;:11::i;:::-;7563:48;;;;-1:-1:-1;;;7563:48:1;;6534:2:4;7563:48:1;;;6516:21:4;6573:2;6553:18;;;6546:30;6612:26;6592:18;;;6585:54;6656:18;;7563:48:1;6332:348:4;7563:48:1;7666:12;;7650:13;:28;;;;7666:12;;;;7650:28;;;;;7666:12;7689:18;:22;;;7727:41;;;;7666:12;7727:41;7299:477::o;8781:132::-;8831:4;8855:11;4400:16;;:20;;;4334:94;8855:11;:50;;;;-1:-1:-1;;8889:16:1;;8870:15;:35;;;8781:132::o;1857:1176::-;8870:21:0;4302:15;;;;;;;4301:16;;4348:14;;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;:16;;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:0;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;;;;;;;;;;;;;4851:91;4951:18;;;;4968:1;4951:18;;;4979:67;;;;5013:22;;;;;;;;4979:67;2115:37:1::1;::::0;::::1;2107:72;;;::::0;-1:-1:-1;;;2107:72:1;;6887:2:4;2107:72:1::1;::::0;::::1;6869:21:4::0;6926:2;6906:18;;;6899:30;6965:24;6945:18;;;6938:52;7007:18;;2107:72:1::1;6685:346:4::0;2107:72:1::1;2198:36;::::0;::::1;2190:70;;;::::0;-1:-1:-1;;;2190:70:1;;7238:2:4;2190:70:1::1;::::0;::::1;7220:21:4::0;7277:2;7257:18;;;7250:30;7316:23;7296:18;;;7289:51;7357:18;;2190:70:1::1;7036:345:4::0;2190:70:1::1;2314:13;2279:49;;2287:14;2279:49;;::::0;2271:87:::1;;;::::0;-1:-1:-1;;;2271:87:1;;7588:2:4;2271:87:1::1;::::0;::::1;7570:21:4::0;7627:2;7607:18;;;7600:30;7666:27;7646:18;;;7639:55;7711:18;;2271:87:1::1;7386:349:4::0;2271:87:1::1;2399:1;2377:19;:23;2369:72;;;::::0;-1:-1:-1;;;2369:72:1;;7942:2:4;2369:72:1::1;::::0;::::1;7924:21:4::0;7981:2;7961:18;;;7954:30;8020:34;8000:18;;;7993:62;8091:6;8071:18;;;8064:34;8115:19;;2369:72:1::1;7740:400:4::0;2369:72:1::1;2454:13;:30:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;2495:28;;;;::::1;::::0;;;::::1;;::::0;;2534:18:::1;:40:::0;;;2585:25:::1;:54:::0;;;2650:23:::1;:50:::0;;;2776:14:::1;:12;:14::i;:::-;2749:41;;2829:19;2809:16;:39;;2801:84;;;::::0;-1:-1:-1;;;2801:84:1;;8347:2:4;2801:84:1::1;::::0;::::1;8329:21:4::0;;;8366:18;;;8359:30;8425:34;8405:18;;;8398:62;8477:18;;2801:84:1::1;8145:356:4::0;2801:84:1::1;-1:-1:-1::0;2898:13:1::1;:30:::0;;;::::1;;::::0;::::1;;::::0;;-1:-1:-1;2972:18:1::1;:22:::0;;;3005:16:::1;:20:::0;5066:101:0;;;;5100:23;;;;;;5142:14;;-1:-1:-1;8659:50:4;;5142:14:0;;8647:2:4;8632:18;5142:14:0;;;;;;;5066:101;4092:1081;;;;;1857:1176:1;;;;;:::o;5914:361::-;3854:4;3895:13;3878;;3895;;;;3878;;:30;5955:52;;;;-1:-1:-1;;;5955:52:1;;5424:2:4;5955:52:1;;;5406:21:4;5463:2;5443:18;;;5436:30;5502;5482:18;;;5475:58;5550:18;;5955:52:1;5222:352:4;5955:52:1;4231:18;;:22;6018:52;;;;-1:-1:-1;;;6018:52:1;;8922:2:4;6018:52:1;;;8904:21:4;8961:2;8941:18;;;8934:30;9000:26;8980:18;;;8973:54;9044:18;;6018:52:1;8720:348:4;6018:52:1;6089:11;:9;:11::i;:::-;6081:57;;;;-1:-1:-1;;;6081:57:1;;2420:2:4;6081:57:1;;;2402:21:4;2459:2;2439:18;;;2432:30;2498:34;2478:18;;;2471:62;2569:3;2549:18;;;2542:31;2590:19;;6081:57:1;2218:397:4;6081:57:1;6190:25;;6172:43;;:15;:43;:::i;:::-;6151:18;:64;;;6231:36;;599:25:4;;;6231:36:1;;587:2:4;572:18;6231:36:1;453:177:4;5619:109:1;5661:4;5702:18;;5685:14;:12;:14::i;:::-;:35;5678:42;;5619:109;:::o;6367:332::-;3854:4;3895:13;3878;;3895;;;;3878;;:30;6414:52;;;;-1:-1:-1;;;6414:52:1;;5424:2:4;6414:52:1;;;5406:21:4;5463:2;5443:18;;;5436:30;5502;5482:18;;;5475:58;5550:18;;6414:52:1;5222:352:4;6414:52:1;4231:18;;6504:47;;;;-1:-1:-1;;;6504:47:1;;5781:2:4;6504:47:1;;;5763:21:4;5820:2;5800:18;;;5793:30;5859:22;5839:18;;;5832:50;5899:18;;6504:47:1;5579:344:4;6504:47:1;6571:11;:9;:11::i;:::-;6570:12;6562:60;;;;-1:-1:-1;;;6562:60:1;;3172:2:4;6562:60:1;;;3154:21:4;3211:2;3191:18;;;3184:30;3250:34;3230:18;;;3223:62;3321:5;3301:18;;;3294:33;3344:19;;6562:60:1;2970:399:4;6562:60:1;6656:1;6635:18;:22;;;6673:18;;;;6656:1;6673:18;6367:332::o;635:205:4:-;712:20;;772:42;761:54;;751:65;;741:93;;830:1;827;820:12;845:666;972:6;980;988;996;1004;1057:3;1045:9;1036:7;1032:23;1028:33;1025:53;;;1074:1;1071;1064:12;1025:53;1097:38;1125:9;1097:38;:::i;:::-;1087:48;;1154:47;1197:2;1186:9;1182:18;1154:47;:::i;:::-;845:666;;1144:57;;-1:-1:-1;;;;1270:2:4;1255:18;;1242:32;;1371:2;1356:18;;1343:32;;1474:3;1459:19;;;1446:33;;-1:-1:-1;845:666:4:o;3374:184::-;3426:77;3423:1;3416:88;3523:4;3520:1;3513:15;3547:4;3544:1;3537:15;3563:125;3628:9;;;3649:10;;;3646:36;;;3662:18;;:::i;:::-;3563:125;;;;:::o;4448:184::-;4518:6;4571:2;4559:9;4550:7;4546:23;4542:32;4539:52;;;4587:1;4584;4577:12;4539:52;-1:-1:-1;4610:16:4;;4448:184;-1:-1:-1;4448:184:4:o;4637:128::-;4704:9;;;4725:11;;;4722:37;;;4739:18;;:::i;4770:274::-;4810:1;4836;4826:189;;4871:77;4868:1;4861:88;4972:4;4969:1;4962:15;5000:4;4997:1;4990:15;4826:189;-1:-1:-1;5029:9:4;;4770:274::o;5049:168::-;5122:9;;;5153;;5170:15;;;5164:22;;5150:37;5140:71;;5191:18;;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212202d2c4443a6f63a7e838658d15ea6a69b2cea9aeab4171bf4f448dfb8e3a93ac364736f6c63430008210033","offset":6098}},"immutableReferences":{},"transformations":[{"id":"1","type":"replace","offset":6098,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa2646970667358221220e81c692102d3216ee52f177f8fbb054e78560181c06a432ba89f4a1be4b89baa64736f6c63430008210033"}}},"deployment":{"transactionHash":null,"blockNumber":null,"transactionIndex":null,"deployer":null},"sources":{"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.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 reininitialization) 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 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        assembly {\n            $.slot := INITIALIZABLE_STORAGE\n        }\n    }\n}\n"},"src/MetaOracleDeviationTimelock.sol":{"content":"// SPDX-License-Identifier: MIT\r\n\r\npragma solidity ^0.8.20;\r\n\r\nimport {Initializable} from \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\r\nimport {IMetaOracleDeviationTimelock} from \"./interfaces/IMetaOracleDeviationTimelock.sol\";\r\nimport {IOracle} from \"./interfaces/IOracle.sol\";\r\n\r\n/// @title MetaOracleDeviationTimelock\r\n/// @author Steakhouse Financial\r\n/// @notice A meta-oracle that selects between a primary and backup oracle based on price deviation and timelocks.\r\n/// @dev Switches to backup if primary deviates significantly, switches back when prices reconverge.\r\n/// MUST be initialized by calling the `initialize` function.\r\ncontract MetaOracleDeviationTimelock is IMetaOracleDeviationTimelock, Initializable {\r\n    // --- Configuration (set during initialization) ---\r\n    IOracle public primaryOracle;\r\n    IOracle public backupOracle;\r\n    uint256 public deviationThreshold; // Scaled by 1e18 (e.g., 0.01e18 for 1%)\r\n    uint256 public challengeTimelockDuration; // Duration in seconds\r\n    uint256 public healingTimelockDuration; // Duration in seconds\r\n\r\n    // --- State ---\r\n    IOracle public currentOracle; // Currently selected oracle\r\n    uint256 public challengeExpiresAt; // Timestamp when challenge period ends (0 if not challenged)\r\n    uint256 public healingExpiresAt; // Timestamp when healing period ends (0 if not healing)\r\n\r\n    /// @param _primaryOracle The primary price feed.\r\n    /// @param _backupOracle The backup price feed.\r\n    /// @param _deviationThreshold The maximum allowed relative deviation (scaled by 1e18) before a challenge can be initiated.\r\n    /// @param _challengeTimelockDuration The duration (seconds) a challenge must persist before switching to backup.\r\n    /// @param _healingTimelockDuration The duration (seconds) prices must remain converged before switching back to primary.\r\n    function initialize(\r\n        IOracle _primaryOracle,\r\n        IOracle _backupOracle,\r\n        uint256 _deviationThreshold,\r\n        uint256 _challengeTimelockDuration,\r\n        uint256 _healingTimelockDuration\r\n    ) external initializer {\r\n        require(address(_primaryOracle) != address(0), \"Invalid primary oracle\");\r\n        require(address(_backupOracle) != address(0), \"Invalid backup oracle\");\r\n        require(address(_primaryOracle) != address(_backupOracle), \"Oracles must be different\");\r\n        require(_deviationThreshold > 0, \"Deviation threshold must be positive\");\r\n\r\n        primaryOracle = _primaryOracle;\r\n        backupOracle = _backupOracle;\r\n        deviationThreshold = _deviationThreshold;\r\n        challengeTimelockDuration = _challengeTimelockDuration;\r\n        healingTimelockDuration = _healingTimelockDuration;\r\n\r\n        // Check initial deviation\r\n        uint256 initialDeviation = getDeviation();\r\n        require(initialDeviation <= _deviationThreshold, \"MODT: Initial deviation too high\");\r\n\r\n        currentOracle = _primaryOracle; // Start with the primary oracle\r\n        challengeExpiresAt = 0;\r\n        healingExpiresAt = 0;\r\n    }\r\n\r\n    /// @inheritdoc IOracle\r\n    function price() public view returns (uint256) {\r\n        try currentOracle.price() returns (uint256 currentPrice) {\r\n            return currentPrice;\r\n        } catch {\r\n            if (isPrimary()) {\r\n                return backupOracle.price();\r\n            } else {\r\n                return primaryOracle.price();\r\n            }\r\n        }\r\n    }\r\n\r\n    /// @inheritdoc IMetaOracleDeviationTimelock\r\n    function primaryPrice() public view returns (uint256) {\r\n        return primaryOracle.price();\r\n    }\r\n\r\n    /// @inheritdoc IMetaOracleDeviationTimelock\r\n    function backupPrice() public view returns (uint256) {\r\n        return backupOracle.price();\r\n    }\r\n\r\n    /// @notice Checks if the primary oracle is currently selected.\r\n    function isPrimary() public view returns (bool) {\r\n        return currentOracle == primaryOracle;\r\n    }\r\n\r\n    /// @notice Checks if the backup oracle is currently selected.\r\n    function isBackup() public view returns (bool) {\r\n        return currentOracle == backupOracle;\r\n    }\r\n\r\n    /// @notice Checks if a challenge is currently active.\r\n    function isChallenged() public view returns (bool) {\r\n        return challengeExpiresAt > 0;\r\n    }\r\n\r\n    /// @notice Checks if a healing period is currently active.\r\n    function isHealing() public view returns (bool) {\r\n        return healingExpiresAt > 0;\r\n    }\r\n\r\n    /// @notice Calculates the absolute relative deviation between primary and backup oracles.\r\n    /// @dev Deviation is calculated as `abs(primaryPrice - backupPrice) * 1e18 / average(primaryPrice, backupPrice)`.\r\n    /// Returns 0 if both prices are 0.\r\n    function getDeviation() public view returns (uint256) {\r\n        uint256 currentPrimaryPrice = primaryOracle.price();\r\n        uint256 currentBackupPrice = backupOracle.price();\r\n\r\n        // Handle case where both prices are zero\r\n        if (currentPrimaryPrice == 0 && currentBackupPrice == 0) {\r\n            return 0;\r\n        }\r\n\r\n        uint256 diff;\r\n        if (currentPrimaryPrice >= currentBackupPrice) {\r\n            diff = currentPrimaryPrice - currentBackupPrice;\r\n        } else {\r\n            diff = currentBackupPrice - currentPrimaryPrice;\r\n        }\r\n\r\n        // Calculate average of the two prices\r\n        uint256 average = (currentPrimaryPrice + currentBackupPrice) / 2;\r\n        \r\n        // Use uint256 for intermediate multiplication to avoid overflow before division\r\n        return (diff * 10**18) / average;\r\n    }\r\n\r\n    /// @notice Checks if the deviation exceeds the configured threshold.\r\n    function isDeviant() public view returns (bool) {\r\n        return getDeviation() > deviationThreshold;\r\n    }\r\n\r\n    /// @notice Initiates a challenge if the primary oracle is active and deviation threshold is exceeded.\r\n    /// @dev Starts a timelock period (`challengeTimelockDuration`).\r\n    function challenge() external {\r\n        require(isPrimary(), \"MODT: Must be primary oracle\");\r\n        require(!isChallenged(), \"MODT: Already challenged\");\r\n        require(isDeviant(), \"MODT: Deviation threshold not met\");\r\n\r\n        challengeExpiresAt = block.timestamp + challengeTimelockDuration;\r\n        emit ChallengeStarted(challengeExpiresAt);\r\n    }\r\n\r\n    /// @notice Revokes an active challenge if the deviation is no longer present.\r\n    function revokeChallenge() external {\r\n        require(isPrimary(), \"MODT: Must be primary oracle\"); // Should still be primary\r\n        require(isChallenged(), \"MODT: Not challenged\");\r\n        require(!isDeviant(), \"MODT: Deviation threshold still met\");\r\n\r\n        challengeExpiresAt = 0;\r\n        emit ChallengeRevoked();\r\n    }\r\n\r\n    /// @notice Checks if the challenge has expired.\r\n    function hasChallengeExpired() public view returns (bool) {\r\n        return isChallenged() && block.timestamp >= challengeExpiresAt;\r\n    }\r\n\r\n    /// @notice Checks if the challenge can be accepted.\r\n    function canAcceptChallenge() public view returns (bool) {\r\n        return isPrimary() && isChallenged() && block.timestamp >= challengeExpiresAt && isDeviant();\r\n    }\r\n\r\n    /// @notice Accepts the challenge after the timelock expires, switching to the backup oracle.\r\n    /// @dev Requires the deviation to still be present.\r\n    function acceptChallenge() external {\r\n        require(isPrimary(), \"MODT: Must be primary oracle\");\r\n        require(isChallenged(), \"MODT: Not challenged\");\r\n        require(block.timestamp >= challengeExpiresAt, \"MODT: Challenge timelock not passed\");\r\n        require(isDeviant(), \"MODT: Deviation resolved\"); // Deviation must persist\r\n\r\n        currentOracle = backupOracle;\r\n        challengeExpiresAt = 0;\r\n        emit ChallengeAccepted(address(currentOracle));\r\n    }\r\n\r\n    /// @notice Initiates the healing process if the backup oracle is active and prices have reconverged.\r\n    /// @dev Starts a timelock period (`healingTimelockDuration`).\r\n    function heal() external {\r\n        require(isBackup(), \"MODT: Must be backup oracle\");\r\n        require(!isHealing(), \"MODT: Already healing\");\r\n        require(!isDeviant(), \"MODT: Deviation threshold still met\");\r\n\r\n        healingExpiresAt = block.timestamp + healingTimelockDuration;\r\n        emit HealingStarted(healingExpiresAt);\r\n    }\r\n\r\n    /// @notice Revokes an active healing process if the deviation threshold is exceeded again.\r\n    function revokeHealing() external {\r\n        require(isBackup(), \"MODT: Must be backup oracle\"); // Should still be backup\r\n        require(isHealing(), \"MODT: Not healing\");\r\n        require(isDeviant(), \"MODT: Deviation threshold not met\");\r\n\r\n        healingExpiresAt = 0;\r\n        emit HealingRevoked();\r\n    }\r\n\r\n    /// @notice Checks if the healing has expired.\r\n    function hasHealingExpired() public view returns (bool) {\r\n        return isHealing() && block.timestamp >= healingExpiresAt;\r\n    }\r\n\r\n    /// @notice Checks if the healing can be accepted.\r\n    function canAcceptHealing() public view returns (bool) {\r\n        return isBackup() && isHealing() && block.timestamp >= healingExpiresAt && !isDeviant();\r\n    }\r\n\r\n    /// @notice Accepts the healing after the timelock expires, switching back to the primary oracle.\r\n    /// @dev Requires the prices to still be converged (not deviant).\r\n    function acceptHealing() external {\r\n        require(isBackup(), \"MODT: Must be backup oracle\");\r\n        require(isHealing(), \"MODT: Not healing\");\r\n        require(block.timestamp >= healingExpiresAt, \"MODT: Healing timelock not passed\");\r\n        require(!isDeviant(), \"MODT: Deviation occurred\"); // Prices must remain converged\r\n\r\n        currentOracle = primaryOracle;\r\n        healingExpiresAt = 0;\r\n        emit HealingAccepted(address(currentOracle));\r\n    }\r\n}"},"src/interfaces/IMetaOracleDeviationTimelock.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.20;\r\n\r\nimport {IOracle} from \"./IOracle.sol\";\r\n\r\n/// @title IMetaOracleDeviationTimelock\r\n/// @notice Interface for the MetaOracleDeviationTimelock contract, extending IOracle.\r\ninterface IMetaOracleDeviationTimelock is IOracle {\r\n    // --- Events (Mirroring implementation) ---\r\n    event ChallengeStarted(uint256 expiresAt);\r\n    event ChallengeRevoked();\r\n    event ChallengeAccepted(address indexed newOracle);\r\n    event HealingStarted(uint256 expiresAt);\r\n    event HealingRevoked();\r\n    event HealingAccepted(address indexed newOracle);\r\n\r\n    // --- Configuration --- Accessors for state variables set during initialization\r\n    function primaryOracle() external view returns (IOracle);\r\n    function backupOracle() external view returns (IOracle);\r\n    function primaryPrice() external view returns (uint256);\r\n    function backupPrice() external view returns (uint256);\r\n    function deviationThreshold() external view returns (uint256);\r\n    function challengeTimelockDuration() external view returns (uint256);\r\n    function healingTimelockDuration() external view returns (uint256);\r\n\r\n    // --- State --- Accessors for dynamic state variables\r\n    function currentOracle() external view returns (IOracle);\r\n    function challengeExpiresAt() external view returns (uint256);\r\n    function healingExpiresAt() external view returns (uint256);\r\n\r\n    // --- Views ---\r\n    function isPrimary() external view returns (bool);\r\n    function isBackup() external view returns (bool);\r\n    function isChallenged() external view returns (bool);\r\n    function isHealing() external view returns (bool);\r\n    function getDeviation() external view returns (uint256);\r\n    function isDeviant() external view returns (bool);\r\n    function hasChallengeExpired() external view returns (bool);\r\n    function hasHealingExpired() external view returns (bool);\r\n    function canAcceptChallenge() external view returns (bool);\r\n    function canAcceptHealing() external view returns (bool);\r\n\r\n    // --- State Changing Functions ---\r\n    function challenge() external;\r\n    function revokeChallenge() external;\r\n    function acceptChallenge() external;\r\n    function heal() external;\r\n    function revokeHealing() external;\r\n    function acceptHealing() external;\r\n} "},"src/interfaces/IOracle.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.20;\r\n\r\n/// @title IOracle\r\n/// @author Morpho Labs\r\n/// @custom:contact security@morpho.org\r\n/// @notice Interface that oracles used by Morpho must implement.\r\n/// @dev It is the user's responsibility to select markets with safe oracles.\r\ninterface IOracle {\r\n    /// @notice Returns the price of 1 asset of collateral token quoted in 1 asset of loan token, scaled by 1e36.\r\n    /// @dev It corresponds to the price of 10**(collateral token decimals) assets of collateral token quoted in\r\n    /// 10**(loan token decimals) assets of loan token with `36 + loan token decimals - collateral token decimals`\r\n    /// decimals of precision.\r\n    function price() external view returns (uint256);\r\n} "}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.33+commit.64118f21","compilerSettings":{"libraries":{},"optimizer":{"runs":10000,"enabled":true},"evmVersion":"cancun"},"name":"MetaOracleDeviationTimelock","fullyQualifiedName":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},"abi":[{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"ChallengeAccepted","type":"event","inputs":[{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ChallengeRevoked","type":"event","inputs":[],"anonymous":false},{"name":"ChallengeStarted","type":"event","inputs":[{"name":"expiresAt","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"HealingAccepted","type":"event","inputs":[{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"HealingRevoked","type":"event","inputs":[],"anonymous":false},{"name":"HealingStarted","type":"event","inputs":[{"name":"expiresAt","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"acceptChallenge","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"acceptHealing","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"backupOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOracle"}],"stateMutability":"view"},{"name":"backupPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"canAcceptChallenge","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"canAcceptHealing","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"challenge","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"challengeExpiresAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"challengeTimelockDuration","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"currentOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOracle"}],"stateMutability":"view"},{"name":"deviationThreshold","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getDeviation","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"hasChallengeExpired","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasHealingExpired","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"heal","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"healingExpiresAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"healingTimelockDuration","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"_primaryOracle","type":"address","internalType":"contract IOracle"},{"name":"_backupOracle","type":"address","internalType":"contract IOracle"},{"name":"_deviationThreshold","type":"uint256","internalType":"uint256"},{"name":"_challengeTimelockDuration","type":"uint256","internalType":"uint256"},{"name":"_healingTimelockDuration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isBackup","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isChallenged","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isDeviant","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isHealing","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPrimary","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"price","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"primaryOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOracle"}],"stateMutability":"view"},{"name":"primaryPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"revokeChallenge","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"revokeHealing","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.33+commit.64118f21"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOracle","type":"address"}],"name":"ChallengeAccepted","type":"event"},{"anonymous":false,"inputs":[],"name":"ChallengeRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"ChallengeStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOracle","type":"address"}],"name":"HealingAccepted","type":"event"},{"anonymous":false,"inputs":[],"name":"HealingRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"HealingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"inputs":[],"name":"acceptChallenge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptHealing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backupOracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backupPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canAcceptChallenge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canAcceptHealing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challenge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"challengeExpiresAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeTimelockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentOracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deviationThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasChallengeExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasHealingExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"healingExpiresAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"healingTimelockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"_primaryOracle","type":"address"},{"internalType":"contract IOracle","name":"_backupOracle","type":"address"},{"internalType":"uint256","name":"_deviationThreshold","type":"uint256"},{"internalType":"uint256","name":"_challengeTimelockDuration","type":"uint256"},{"internalType":"uint256","name":"_healingTimelockDuration","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isBackup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isChallenged","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDeviant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHealing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrimary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryOracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeChallenge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeHealing","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"Steakhouse Financial","details":"Switches to backup if primary deviates significantly, switches back when prices reconverge. MUST be initialized by calling the `initialize` function.","errors":{"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"kind":"dev","methods":{"acceptChallenge()":{"details":"Requires the deviation to still be present."},"acceptHealing()":{"details":"Requires the prices to still be converged (not deviant)."},"challenge()":{"details":"Starts a timelock period (`challengeTimelockDuration`)."},"getDeviation()":{"details":"Deviation is calculated as `abs(primaryPrice - backupPrice) * 1e18 / average(primaryPrice, backupPrice)`. Returns 0 if both prices are 0."},"heal()":{"details":"Starts a timelock period (`healingTimelockDuration`)."},"initialize(address,address,uint256,uint256,uint256)":{"params":{"_backupOracle":"The backup price feed.","_challengeTimelockDuration":"The duration (seconds) a challenge must persist before switching to backup.","_deviationThreshold":"The maximum allowed relative deviation (scaled by 1e18) before a challenge can be initiated.","_healingTimelockDuration":"The duration (seconds) prices must remain converged before switching back to primary.","_primaryOracle":"The primary price feed."}},"price()":{"details":"It corresponds to the price of 10**(collateral token decimals) assets of collateral token quoted in 10**(loan token decimals) assets of loan token with `36 + loan token decimals - collateral token decimals` decimals of precision."}},"title":"MetaOracleDeviationTimelock","version":1},"userdoc":{"kind":"user","methods":{"acceptChallenge()":{"notice":"Accepts the challenge after the timelock expires, switching to the backup oracle."},"acceptHealing()":{"notice":"Accepts the healing after the timelock expires, switching back to the primary oracle."},"canAcceptChallenge()":{"notice":"Checks if the challenge can be accepted."},"canAcceptHealing()":{"notice":"Checks if the healing can be accepted."},"challenge()":{"notice":"Initiates a challenge if the primary oracle is active and deviation threshold is exceeded."},"getDeviation()":{"notice":"Calculates the absolute relative deviation between primary and backup oracles."},"hasChallengeExpired()":{"notice":"Checks if the challenge has expired."},"hasHealingExpired()":{"notice":"Checks if the healing has expired."},"heal()":{"notice":"Initiates the healing process if the backup oracle is active and prices have reconverged."},"isBackup()":{"notice":"Checks if the backup oracle is currently selected."},"isChallenged()":{"notice":"Checks if a challenge is currently active."},"isDeviant()":{"notice":"Checks if the deviation exceeds the configured threshold."},"isHealing()":{"notice":"Checks if a healing period is currently active."},"isPrimary()":{"notice":"Checks if the primary oracle is currently selected."},"price()":{"notice":"Returns the price of 1 asset of collateral token quoted in 1 asset of loan token, scaled by 1e36."},"revokeChallenge()":{"notice":"Revokes an active challenge if the deviation is no longer present."},"revokeHealing()":{"notice":"Revokes an active healing process if the deviation threshold is exceeded again."}},"notice":"A meta-oracle that selects between a primary and backup oracle based on price deviation and timelocks.","version":1}},"settings":{"compilationTarget":{"src/MetaOracleDeviationTimelock.sol":"MetaOracleDeviationTimelock"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":10000},"remappings":[]},"sources":{"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","license":"MIT","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"]},"src/MetaOracleDeviationTimelock.sol":{"keccak256":"0xb3f83d95dc920403edf0d09335ed96cfc85b7fb4774b07922e91bcaa21725870","license":"MIT","urls":["bzz-raw://4dafd02c6c96b76e660b55749ea839d3f36e2e285fb5af8f1a61fd01263792d8","dweb:/ipfs/QmWi2994qV4iDKGvVB86rZnPZZDxG7dxe59uvDN4G8tfJi"]},"src/interfaces/IMetaOracleDeviationTimelock.sol":{"keccak256":"0xf5ec4731a061d65b7e744b7b59e2d6b3b80b953173eba087f095cec99a06116a","license":"MIT","urls":["bzz-raw://37817e806f7d0593624c3879876252fcea56ee0d74185905295dbc6a36f87113","dweb:/ipfs/Qmd8fncm8jZFZe7q3doCrU2ayDwJ9r7EzW1NmpCewJdU3Z"]},"src/interfaces/IOracle.sol":{"keccak256":"0x33622c3a1bd94334012d3a4755da1404e102cd9c00871513e041ae3481e5035b","license":"MIT","urls":["bzz-raw://d56e96ff2547732eb1e621d81e62310b03b1b69140cfb6619cfabeb4b96d2442","dweb:/ipfs/QmdiwKDvT7AfhZJJWgiDDSELzqvuz2NFcw8SFNq5hrDRVi"]}},"version":1},"storageLayout":{"types":{"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(IOracle)1032":{"label":"contract IOracle","encoding":"inplace","numberOfBytes":"20"}},"storage":[{"slot":"0","type":"t_contract(IOracle)1032","astId":269,"label":"primaryOracle","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"1","type":"t_contract(IOracle)1032","astId":272,"label":"backupOracle","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"2","type":"t_uint256","astId":274,"label":"deviationThreshold","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"3","type":"t_uint256","astId":276,"label":"challengeTimelockDuration","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"4","type":"t_uint256","astId":278,"label":"healingTimelockDuration","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"5","type":"t_contract(IOracle)1032","astId":281,"label":"currentOracle","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"6","type":"t_uint256","astId":283,"label":"challengeExpiresAt","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"7","type":"t_uint256","astId":285,"label":"healingExpiresAt","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","notice":"A meta-oracle that selects between a primary and backup oracle based on price deviation and timelocks.","methods":{"heal()":{"notice":"Initiates the healing process if the backup oracle is active and prices have reconverged."},"price()":{"notice":"Returns the price of 1 asset of collateral token quoted in 1 asset of loan token, scaled by 1e36."},"isBackup()":{"notice":"Checks if the backup oracle is currently selected."},"challenge()":{"notice":"Initiates a challenge if the primary oracle is active and deviation threshold is exceeded."},"isDeviant()":{"notice":"Checks if the deviation exceeds the configured threshold."},"isHealing()":{"notice":"Checks if a healing period is currently active."},"isPrimary()":{"notice":"Checks if the primary oracle is currently selected."},"getDeviation()":{"notice":"Calculates the absolute relative deviation between primary and backup oracles."},"isChallenged()":{"notice":"Checks if a challenge is currently active."},"acceptHealing()":{"notice":"Accepts the healing after the timelock expires, switching back to the primary oracle."},"revokeHealing()":{"notice":"Revokes an active healing process if the deviation threshold is exceeded again."},"acceptChallenge()":{"notice":"Accepts the challenge after the timelock expires, switching to the backup oracle."},"revokeChallenge()":{"notice":"Revokes an active challenge if the deviation is no longer present."},"canAcceptHealing()":{"notice":"Checks if the healing can be accepted."},"hasHealingExpired()":{"notice":"Checks if the healing has expired."},"canAcceptChallenge()":{"notice":"Checks if the challenge can be accepted."},"hasChallengeExpired()":{"notice":"Checks if the challenge has expired."}},"version":1},"devdoc":{"kind":"dev","title":"MetaOracleDeviationTimelock","author":"Steakhouse Financial","errors":{"NotInitializing()":[{"details":"The contract is not initializing."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"details":"Switches to backup if primary deviates significantly, switches back when prices reconverge. MUST be initialized by calling the `initialize` function.","methods":{"heal()":{"details":"Starts a timelock period (`healingTimelockDuration`)."},"price()":{"details":"It corresponds to the price of 10**(collateral token decimals) assets of collateral token quoted in 10**(loan token decimals) assets of loan token with `36 + loan token decimals - collateral token decimals` decimals of precision."},"challenge()":{"details":"Starts a timelock period (`challengeTimelockDuration`)."},"getDeviation()":{"details":"Deviation is calculated as `abs(primaryPrice - backupPrice) * 1e18 / average(primaryPrice, backupPrice)`. Returns 0 if both prices are 0."},"acceptHealing()":{"details":"Requires the prices to still be converged (not deviant)."},"acceptChallenge()":{"details":"Requires the deviation to still be present."},"initialize(address,address,uint256,uint256,uint256)":{"params":{"_backupOracle":"The backup price feed.","_primaryOracle":"The primary price feed.","_deviationThreshold":"The maximum allowed relative deviation (scaled by 1e18) before a challenge can be initiated.","_healingTimelockDuration":"The duration (seconds) prices must remain converged before switching back to primary.","_challengeTimelockDuration":"The duration (seconds) a challenge must persist before switching to backup."}}},"version":1},"sourceIds":{"src/interfaces/IOracle.sol":{"id":3},"src/MetaOracleDeviationTimelock.sol":{"id":1},"src/interfaces/IMetaOracleDeviationTimelock.sol":{"id":2},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"id":0}},"additionalInput":null,"stdJsonInput":{"sources":{"src/interfaces/IOracle.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.20;\r\n\r\n/// @title IOracle\r\n/// @author Morpho Labs\r\n/// @custom:contact security@morpho.org\r\n/// @notice Interface that oracles used by Morpho must implement.\r\n/// @dev It is the user's responsibility to select markets with safe oracles.\r\ninterface IOracle {\r\n    /// @notice Returns the price of 1 asset of collateral token quoted in 1 asset of loan token, scaled by 1e36.\r\n    /// @dev It corresponds to the price of 10**(collateral token decimals) assets of collateral token quoted in\r\n    /// 10**(loan token decimals) assets of loan token with `36 + loan token decimals - collateral token decimals`\r\n    /// decimals of precision.\r\n    function price() external view returns (uint256);\r\n} "},"src/MetaOracleDeviationTimelock.sol":{"content":"// SPDX-License-Identifier: MIT\r\n\r\npragma solidity ^0.8.20;\r\n\r\nimport {Initializable} from \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\r\nimport {IMetaOracleDeviationTimelock} from \"./interfaces/IMetaOracleDeviationTimelock.sol\";\r\nimport {IOracle} from \"./interfaces/IOracle.sol\";\r\n\r\n/// @title MetaOracleDeviationTimelock\r\n/// @author Steakhouse Financial\r\n/// @notice A meta-oracle that selects between a primary and backup oracle based on price deviation and timelocks.\r\n/// @dev Switches to backup if primary deviates significantly, switches back when prices reconverge.\r\n/// MUST be initialized by calling the `initialize` function.\r\ncontract MetaOracleDeviationTimelock is IMetaOracleDeviationTimelock, Initializable {\r\n    // --- Configuration (set during initialization) ---\r\n    IOracle public primaryOracle;\r\n    IOracle public backupOracle;\r\n    uint256 public deviationThreshold; // Scaled by 1e18 (e.g., 0.01e18 for 1%)\r\n    uint256 public challengeTimelockDuration; // Duration in seconds\r\n    uint256 public healingTimelockDuration; // Duration in seconds\r\n\r\n    // --- State ---\r\n    IOracle public currentOracle; // Currently selected oracle\r\n    uint256 public challengeExpiresAt; // Timestamp when challenge period ends (0 if not challenged)\r\n    uint256 public healingExpiresAt; // Timestamp when healing period ends (0 if not healing)\r\n\r\n    /// @param _primaryOracle The primary price feed.\r\n    /// @param _backupOracle The backup price feed.\r\n    /// @param _deviationThreshold The maximum allowed relative deviation (scaled by 1e18) before a challenge can be initiated.\r\n    /// @param _challengeTimelockDuration The duration (seconds) a challenge must persist before switching to backup.\r\n    /// @param _healingTimelockDuration The duration (seconds) prices must remain converged before switching back to primary.\r\n    function initialize(\r\n        IOracle _primaryOracle,\r\n        IOracle _backupOracle,\r\n        uint256 _deviationThreshold,\r\n        uint256 _challengeTimelockDuration,\r\n        uint256 _healingTimelockDuration\r\n    ) external initializer {\r\n        require(address(_primaryOracle) != address(0), \"Invalid primary oracle\");\r\n        require(address(_backupOracle) != address(0), \"Invalid backup oracle\");\r\n        require(address(_primaryOracle) != address(_backupOracle), \"Oracles must be different\");\r\n        require(_deviationThreshold > 0, \"Deviation threshold must be positive\");\r\n\r\n        primaryOracle = _primaryOracle;\r\n        backupOracle = _backupOracle;\r\n        deviationThreshold = _deviationThreshold;\r\n        challengeTimelockDuration = _challengeTimelockDuration;\r\n        healingTimelockDuration = _healingTimelockDuration;\r\n\r\n        // Check initial deviation\r\n        uint256 initialDeviation = getDeviation();\r\n        require(initialDeviation <= _deviationThreshold, \"MODT: Initial deviation too high\");\r\n\r\n        currentOracle = _primaryOracle; // Start with the primary oracle\r\n        challengeExpiresAt = 0;\r\n        healingExpiresAt = 0;\r\n    }\r\n\r\n    /// @inheritdoc IOracle\r\n    function price() public view returns (uint256) {\r\n        try currentOracle.price() returns (uint256 currentPrice) {\r\n            return currentPrice;\r\n        } catch {\r\n            if (isPrimary()) {\r\n                return backupOracle.price();\r\n            } else {\r\n                return primaryOracle.price();\r\n            }\r\n        }\r\n    }\r\n\r\n    /// @inheritdoc IMetaOracleDeviationTimelock\r\n    function primaryPrice() public view returns (uint256) {\r\n        return primaryOracle.price();\r\n    }\r\n\r\n    /// @inheritdoc IMetaOracleDeviationTimelock\r\n    function backupPrice() public view returns (uint256) {\r\n        return backupOracle.price();\r\n    }\r\n\r\n    /// @notice Checks if the primary oracle is currently selected.\r\n    function isPrimary() public view returns (bool) {\r\n        return currentOracle == primaryOracle;\r\n    }\r\n\r\n    /// @notice Checks if the backup oracle is currently selected.\r\n    function isBackup() public view returns (bool) {\r\n        return currentOracle == backupOracle;\r\n    }\r\n\r\n    /// @notice Checks if a challenge is currently active.\r\n    function isChallenged() public view returns (bool) {\r\n        return challengeExpiresAt > 0;\r\n    }\r\n\r\n    /// @notice Checks if a healing period is currently active.\r\n    function isHealing() public view returns (bool) {\r\n        return healingExpiresAt > 0;\r\n    }\r\n\r\n    /// @notice Calculates the absolute relative deviation between primary and backup oracles.\r\n    /// @dev Deviation is calculated as `abs(primaryPrice - backupPrice) * 1e18 / average(primaryPrice, backupPrice)`.\r\n    /// Returns 0 if both prices are 0.\r\n    function getDeviation() public view returns (uint256) {\r\n        uint256 currentPrimaryPrice = primaryOracle.price();\r\n        uint256 currentBackupPrice = backupOracle.price();\r\n\r\n        // Handle case where both prices are zero\r\n        if (currentPrimaryPrice == 0 && currentBackupPrice == 0) {\r\n            return 0;\r\n        }\r\n\r\n        uint256 diff;\r\n        if (currentPrimaryPrice >= currentBackupPrice) {\r\n            diff = currentPrimaryPrice - currentBackupPrice;\r\n        } else {\r\n            diff = currentBackupPrice - currentPrimaryPrice;\r\n        }\r\n\r\n        // Calculate average of the two prices\r\n        uint256 average = (currentPrimaryPrice + currentBackupPrice) / 2;\r\n        \r\n        // Use uint256 for intermediate multiplication to avoid overflow before division\r\n        return (diff * 10**18) / average;\r\n    }\r\n\r\n    /// @notice Checks if the deviation exceeds the configured threshold.\r\n    function isDeviant() public view returns (bool) {\r\n        return getDeviation() > deviationThreshold;\r\n    }\r\n\r\n    /// @notice Initiates a challenge if the primary oracle is active and deviation threshold is exceeded.\r\n    /// @dev Starts a timelock period (`challengeTimelockDuration`).\r\n    function challenge() external {\r\n        require(isPrimary(), \"MODT: Must be primary oracle\");\r\n        require(!isChallenged(), \"MODT: Already challenged\");\r\n        require(isDeviant(), \"MODT: Deviation threshold not met\");\r\n\r\n        challengeExpiresAt = block.timestamp + challengeTimelockDuration;\r\n        emit ChallengeStarted(challengeExpiresAt);\r\n    }\r\n\r\n    /// @notice Revokes an active challenge if the deviation is no longer present.\r\n    function revokeChallenge() external {\r\n        require(isPrimary(), \"MODT: Must be primary oracle\"); // Should still be primary\r\n        require(isChallenged(), \"MODT: Not challenged\");\r\n        require(!isDeviant(), \"MODT: Deviation threshold still met\");\r\n\r\n        challengeExpiresAt = 0;\r\n        emit ChallengeRevoked();\r\n    }\r\n\r\n    /// @notice Checks if the challenge has expired.\r\n    function hasChallengeExpired() public view returns (bool) {\r\n        return isChallenged() && block.timestamp >= challengeExpiresAt;\r\n    }\r\n\r\n    /// @notice Checks if the challenge can be accepted.\r\n    function canAcceptChallenge() public view returns (bool) {\r\n        return isPrimary() && isChallenged() && block.timestamp >= challengeExpiresAt && isDeviant();\r\n    }\r\n\r\n    /// @notice Accepts the challenge after the timelock expires, switching to the backup oracle.\r\n    /// @dev Requires the deviation to still be present.\r\n    function acceptChallenge() external {\r\n        require(isPrimary(), \"MODT: Must be primary oracle\");\r\n        require(isChallenged(), \"MODT: Not challenged\");\r\n        require(block.timestamp >= challengeExpiresAt, \"MODT: Challenge timelock not passed\");\r\n        require(isDeviant(), \"MODT: Deviation resolved\"); // Deviation must persist\r\n\r\n        currentOracle = backupOracle;\r\n        challengeExpiresAt = 0;\r\n        emit ChallengeAccepted(address(currentOracle));\r\n    }\r\n\r\n    /// @notice Initiates the healing process if the backup oracle is active and prices have reconverged.\r\n    /// @dev Starts a timelock period (`healingTimelockDuration`).\r\n    function heal() external {\r\n        require(isBackup(), \"MODT: Must be backup oracle\");\r\n        require(!isHealing(), \"MODT: Already healing\");\r\n        require(!isDeviant(), \"MODT: Deviation threshold still met\");\r\n\r\n        healingExpiresAt = block.timestamp + healingTimelockDuration;\r\n        emit HealingStarted(healingExpiresAt);\r\n    }\r\n\r\n    /// @notice Revokes an active healing process if the deviation threshold is exceeded again.\r\n    function revokeHealing() external {\r\n        require(isBackup(), \"MODT: Must be backup oracle\"); // Should still be backup\r\n        require(isHealing(), \"MODT: Not healing\");\r\n        require(isDeviant(), \"MODT: Deviation threshold not met\");\r\n\r\n        healingExpiresAt = 0;\r\n        emit HealingRevoked();\r\n    }\r\n\r\n    /// @notice Checks if the healing has expired.\r\n    function hasHealingExpired() public view returns (bool) {\r\n        return isHealing() && block.timestamp >= healingExpiresAt;\r\n    }\r\n\r\n    /// @notice Checks if the healing can be accepted.\r\n    function canAcceptHealing() public view returns (bool) {\r\n        return isBackup() && isHealing() && block.timestamp >= healingExpiresAt && !isDeviant();\r\n    }\r\n\r\n    /// @notice Accepts the healing after the timelock expires, switching back to the primary oracle.\r\n    /// @dev Requires the prices to still be converged (not deviant).\r\n    function acceptHealing() external {\r\n        require(isBackup(), \"MODT: Must be backup oracle\");\r\n        require(isHealing(), \"MODT: Not healing\");\r\n        require(block.timestamp >= healingExpiresAt, \"MODT: Healing timelock not passed\");\r\n        require(!isDeviant(), \"MODT: Deviation occurred\"); // Prices must remain converged\r\n\r\n        currentOracle = primaryOracle;\r\n        healingExpiresAt = 0;\r\n        emit HealingAccepted(address(currentOracle));\r\n    }\r\n}"},"src/interfaces/IMetaOracleDeviationTimelock.sol":{"content":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.20;\r\n\r\nimport {IOracle} from \"./IOracle.sol\";\r\n\r\n/// @title IMetaOracleDeviationTimelock\r\n/// @notice Interface for the MetaOracleDeviationTimelock contract, extending IOracle.\r\ninterface IMetaOracleDeviationTimelock is IOracle {\r\n    // --- Events (Mirroring implementation) ---\r\n    event ChallengeStarted(uint256 expiresAt);\r\n    event ChallengeRevoked();\r\n    event ChallengeAccepted(address indexed newOracle);\r\n    event HealingStarted(uint256 expiresAt);\r\n    event HealingRevoked();\r\n    event HealingAccepted(address indexed newOracle);\r\n\r\n    // --- Configuration --- Accessors for state variables set during initialization\r\n    function primaryOracle() external view returns (IOracle);\r\n    function backupOracle() external view returns (IOracle);\r\n    function primaryPrice() external view returns (uint256);\r\n    function backupPrice() external view returns (uint256);\r\n    function deviationThreshold() external view returns (uint256);\r\n    function challengeTimelockDuration() external view returns (uint256);\r\n    function healingTimelockDuration() external view returns (uint256);\r\n\r\n    // --- State --- Accessors for dynamic state variables\r\n    function currentOracle() external view returns (IOracle);\r\n    function challengeExpiresAt() external view returns (uint256);\r\n    function healingExpiresAt() external view returns (uint256);\r\n\r\n    // --- Views ---\r\n    function isPrimary() external view returns (bool);\r\n    function isBackup() external view returns (bool);\r\n    function isChallenged() external view returns (bool);\r\n    function isHealing() external view returns (bool);\r\n    function getDeviation() external view returns (uint256);\r\n    function isDeviant() external view returns (bool);\r\n    function hasChallengeExpired() external view returns (bool);\r\n    function hasHealingExpired() external view returns (bool);\r\n    function canAcceptChallenge() external view returns (bool);\r\n    function canAcceptHealing() external view returns (bool);\r\n\r\n    // --- State Changing Functions ---\r\n    function challenge() external;\r\n    function revokeChallenge() external;\r\n    function acceptChallenge() external;\r\n    function heal() external;\r\n    function revokeHealing() external;\r\n    function acceptHealing() external;\r\n} "},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.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 reininitialization) 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 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        assembly {\n            $.slot := INITIALIZABLE_STORAGE\n        }\n    }\n}\n"}},"language":"Solidity","settings":{"libraries":{},"optimizer":{"runs":10000,"enabled":true},"evmVersion":"cancun"}},"stdJsonOutput":{"sources":{"src/interfaces/IOracle.sol":{"id":3},"src/MetaOracleDeviationTimelock.sol":{"id":1},"src/interfaces/IMetaOracleDeviationTimelock.sol":{"id":2},"@openzeppelin/contracts/proxy/utils/Initializable.sol":{"id":0}},"contracts":{"src/MetaOracleDeviationTimelock.sol":{"MetaOracleDeviationTimelock":{"abi":[{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"ChallengeAccepted","type":"event","inputs":[{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ChallengeRevoked","type":"event","inputs":[],"anonymous":false},{"name":"ChallengeStarted","type":"event","inputs":[{"name":"expiresAt","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"HealingAccepted","type":"event","inputs":[{"name":"newOracle","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"HealingRevoked","type":"event","inputs":[],"anonymous":false},{"name":"HealingStarted","type":"event","inputs":[{"name":"expiresAt","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"acceptChallenge","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"acceptHealing","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"backupOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOracle"}],"stateMutability":"view"},{"name":"backupPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"canAcceptChallenge","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"canAcceptHealing","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"challenge","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"challengeExpiresAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"challengeTimelockDuration","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"currentOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOracle"}],"stateMutability":"view"},{"name":"deviationThreshold","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getDeviation","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"hasChallengeExpired","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"hasHealingExpired","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"heal","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"healingExpiresAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"healingTimelockDuration","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"_primaryOracle","type":"address","internalType":"contract IOracle"},{"name":"_backupOracle","type":"address","internalType":"contract IOracle"},{"name":"_deviationThreshold","type":"uint256","internalType":"uint256"},{"name":"_challengeTimelockDuration","type":"uint256","internalType":"uint256"},{"name":"_healingTimelockDuration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isBackup","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isChallenged","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isDeviant","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isHealing","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPrimary","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"price","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"primaryOracle","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOracle"}],"stateMutability":"view"},{"name":"primaryPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"revokeChallenge","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"revokeHealing","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.33+commit.64118f21\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"ChallengeAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ChallengeRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiresAt\",\"type\":\"uint256\"}],\"name\":\"ChallengeStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"HealingAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"HealingRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiresAt\",\"type\":\"uint256\"}],\"name\":\"HealingStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptChallenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptHealing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"backupOracle\",\"outputs\":[{\"internalType\":\"contract IOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"backupPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canAcceptChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canAcceptHealing\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challengeExpiresAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challengeTimelockDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentOracle\",\"outputs\":[{\"internalType\":\"contract IOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deviationThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDeviation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hasChallengeExpired\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hasHealingExpired\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"heal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"healingExpiresAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"healingTimelockDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IOracle\",\"name\":\"_primaryOracle\",\"type\":\"address\"},{\"internalType\":\"contract IOracle\",\"name\":\"_backupOracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_deviationThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_challengeTimelockDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_healingTimelockDuration\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isBackup\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isChallenged\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDeviant\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isHealing\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPrimary\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"price\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"primaryOracle\",\"outputs\":[{\"internalType\":\"contract IOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"primaryPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revokeChallenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revokeHealing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Steakhouse Financial\",\"details\":\"Switches to backup if primary deviates significantly, switches back when prices reconverge. MUST be initialized by calling the `initialize` function.\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptChallenge()\":{\"details\":\"Requires the deviation to still be present.\"},\"acceptHealing()\":{\"details\":\"Requires the prices to still be converged (not deviant).\"},\"challenge()\":{\"details\":\"Starts a timelock period (`challengeTimelockDuration`).\"},\"getDeviation()\":{\"details\":\"Deviation is calculated as `abs(primaryPrice - backupPrice) * 1e18 / average(primaryPrice, backupPrice)`. Returns 0 if both prices are 0.\"},\"heal()\":{\"details\":\"Starts a timelock period (`healingTimelockDuration`).\"},\"initialize(address,address,uint256,uint256,uint256)\":{\"params\":{\"_backupOracle\":\"The backup price feed.\",\"_challengeTimelockDuration\":\"The duration (seconds) a challenge must persist before switching to backup.\",\"_deviationThreshold\":\"The maximum allowed relative deviation (scaled by 1e18) before a challenge can be initiated.\",\"_healingTimelockDuration\":\"The duration (seconds) prices must remain converged before switching back to primary.\",\"_primaryOracle\":\"The primary price feed.\"}},\"price()\":{\"details\":\"It corresponds to the price of 10**(collateral token decimals) assets of collateral token quoted in 10**(loan token decimals) assets of loan token with `36 + loan token decimals - collateral token decimals` decimals of precision.\"}},\"title\":\"MetaOracleDeviationTimelock\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptChallenge()\":{\"notice\":\"Accepts the challenge after the timelock expires, switching to the backup oracle.\"},\"acceptHealing()\":{\"notice\":\"Accepts the healing after the timelock expires, switching back to the primary oracle.\"},\"canAcceptChallenge()\":{\"notice\":\"Checks if the challenge can be accepted.\"},\"canAcceptHealing()\":{\"notice\":\"Checks if the healing can be accepted.\"},\"challenge()\":{\"notice\":\"Initiates a challenge if the primary oracle is active and deviation threshold is exceeded.\"},\"getDeviation()\":{\"notice\":\"Calculates the absolute relative deviation between primary and backup oracles.\"},\"hasChallengeExpired()\":{\"notice\":\"Checks if the challenge has expired.\"},\"hasHealingExpired()\":{\"notice\":\"Checks if the healing has expired.\"},\"heal()\":{\"notice\":\"Initiates the healing process if the backup oracle is active and prices have reconverged.\"},\"isBackup()\":{\"notice\":\"Checks if the backup oracle is currently selected.\"},\"isChallenged()\":{\"notice\":\"Checks if a challenge is currently active.\"},\"isDeviant()\":{\"notice\":\"Checks if the deviation exceeds the configured threshold.\"},\"isHealing()\":{\"notice\":\"Checks if a healing period is currently active.\"},\"isPrimary()\":{\"notice\":\"Checks if the primary oracle is currently selected.\"},\"price()\":{\"notice\":\"Returns the price of 1 asset of collateral token quoted in 1 asset of loan token, scaled by 1e36.\"},\"revokeChallenge()\":{\"notice\":\"Revokes an active challenge if the deviation is no longer present.\"},\"revokeHealing()\":{\"notice\":\"Revokes an active healing process if the deviation threshold is exceeded again.\"}},\"notice\":\"A meta-oracle that selects between a primary and backup oracle based on price deviation and timelocks.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/MetaOracleDeviationTimelock.sol\":\"MetaOracleDeviationTimelock\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"src/MetaOracleDeviationTimelock.sol\":{\"keccak256\":\"0xb3f83d95dc920403edf0d09335ed96cfc85b7fb4774b07922e91bcaa21725870\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4dafd02c6c96b76e660b55749ea839d3f36e2e285fb5af8f1a61fd01263792d8\",\"dweb:/ipfs/QmWi2994qV4iDKGvVB86rZnPZZDxG7dxe59uvDN4G8tfJi\"]},\"src/interfaces/IMetaOracleDeviationTimelock.sol\":{\"keccak256\":\"0xf5ec4731a061d65b7e744b7b59e2d6b3b80b953173eba087f095cec99a06116a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://37817e806f7d0593624c3879876252fcea56ee0d74185905295dbc6a36f87113\",\"dweb:/ipfs/Qmd8fncm8jZFZe7q3doCrU2ayDwJ9r7EzW1NmpCewJdU3Z\"]},\"src/interfaces/IOracle.sol\":{\"keccak256\":\"0x33622c3a1bd94334012d3a4755da1404e102cd9c00871513e041ae3481e5035b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d56e96ff2547732eb1e621d81e62310b03b1b69140cfb6619cfabeb4b96d2442\",\"dweb:/ipfs/QmdiwKDvT7AfhZJJWgiDDSELzqvuz2NFcw8SFNq5hrDRVi\"]}},\"version\":1}","userdoc":{"kind":"user","notice":"A meta-oracle that selects between a primary and backup oracle based on price deviation and timelocks.","methods":{"heal()":{"notice":"Initiates the healing process if the backup oracle is active and prices have reconverged."},"price()":{"notice":"Returns the price of 1 asset of collateral token quoted in 1 asset of loan token, scaled by 1e36."},"isBackup()":{"notice":"Checks if the backup oracle is currently selected."},"challenge()":{"notice":"Initiates a challenge if the primary oracle is active and deviation threshold is exceeded."},"isDeviant()":{"notice":"Checks if the deviation exceeds the configured threshold."},"isHealing()":{"notice":"Checks if a healing period is currently active."},"isPrimary()":{"notice":"Checks if the primary oracle is currently selected."},"getDeviation()":{"notice":"Calculates the absolute relative deviation between primary and backup oracles."},"isChallenged()":{"notice":"Checks if a challenge is currently active."},"acceptHealing()":{"notice":"Accepts the healing after the timelock expires, switching back to the primary oracle."},"revokeHealing()":{"notice":"Revokes an active healing process if the deviation threshold is exceeded again."},"acceptChallenge()":{"notice":"Accepts the challenge after the timelock expires, switching to the backup oracle."},"revokeChallenge()":{"notice":"Revokes an active challenge if the deviation is no longer present."},"canAcceptHealing()":{"notice":"Checks if the healing can be accepted."},"hasHealingExpired()":{"notice":"Checks if the healing has expired."},"canAcceptChallenge()":{"notice":"Checks if the challenge can be accepted."},"hasChallengeExpired()":{"notice":"Checks if the challenge has expired."}},"version":1},"devdoc":{"kind":"dev","title":"MetaOracleDeviationTimelock","author":"Steakhouse Financial","errors":{"NotInitializing()":[{"details":"The contract is not initializing."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."}},"details":"Switches to backup if primary deviates significantly, switches back when prices reconverge. MUST be initialized by calling the `initialize` function.","methods":{"heal()":{"details":"Starts a timelock period (`healingTimelockDuration`)."},"price()":{"details":"It corresponds to the price of 10**(collateral token decimals) assets of collateral token quoted in 10**(loan token decimals) assets of loan token with `36 + loan token decimals - collateral token decimals` decimals of precision."},"challenge()":{"details":"Starts a timelock period (`challengeTimelockDuration`)."},"getDeviation()":{"details":"Deviation is calculated as `abs(primaryPrice - backupPrice) * 1e18 / average(primaryPrice, backupPrice)`. Returns 0 if both prices are 0."},"acceptHealing()":{"details":"Requires the prices to still be converged (not deviant)."},"acceptChallenge()":{"details":"Requires the deviation to still be present."},"initialize(address,address,uint256,uint256,uint256)":{"params":{"_backupOracle":"The backup price feed.","_primaryOracle":"The primary price feed.","_deviationThreshold":"The maximum allowed relative deviation (scaled by 1e18) before a challenge can be initiated.","_healingTimelockDuration":"The duration (seconds) prices must remain converged before switching back to primary.","_challengeTimelockDuration":"The duration (seconds) a challenge must persist before switching to backup."}}},"version":1},"storageLayout":{"types":{"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(IOracle)1032":{"label":"contract IOracle","encoding":"inplace","numberOfBytes":"20"}},"storage":[{"slot":"0","type":"t_contract(IOracle)1032","astId":269,"label":"primaryOracle","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"1","type":"t_contract(IOracle)1032","astId":272,"label":"backupOracle","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"2","type":"t_uint256","astId":274,"label":"deviationThreshold","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"3","type":"t_uint256","astId":276,"label":"challengeTimelockDuration","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"4","type":"t_uint256","astId":278,"label":"healingTimelockDuration","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"5","type":"t_contract(IOracle)1032","astId":281,"label":"currentOracle","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"6","type":"t_uint256","astId":283,"label":"challengeExpiresAt","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"},{"slot":"7","type":"t_uint256","astId":285,"label":"healingExpiresAt","offset":0,"contract":"src/MetaOracleDeviationTimelock.sol:MetaOracleDeviationTimelock"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"6080604052348015600e575f5ffd5b506118078061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106101ba575f3560e01c8063a035b1fe116100f3578063d2ef739811610093578063de1a69751161006e578063de1a697514610357578063e2997d6b1461035f578063f8f8b5f014610367578063f9e3444714610371575f5ffd5b8063d2ef73981461033d578063d83ed44014610345578063d94ad8371461034e575f5ffd5b8063bd8f238e116100ce578063bd8f238e146102fa578063c2ee5df914610319578063ccc1b9cd14610321578063d13f90b41461032a575f5ffd5b8063a035b1fe146102e2578063ad891006146102ea578063b166bf6b146102f2575f5ffd5b8063362a07ae1161015e5780637ad6d6d5116101395780637ad6d6d5146102a8578063836efd31146102b057806389ab3532146102d05780639df4d0fe146102d8575f5ffd5b8063362a07ae146102645780633682152b1461027a578063498e8b6e1461029f575f5ffd5b80631fc08644116101995780631fc0864414610207578063219a94b81461020f5780632289445e146102175780632f0a577b1461025c575f5ffd5b8062372f87146101be57806303c01e68146101c85780630434fe0b146101ff575b5f5ffd5b6101c661037a565b005b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116145b60405190151581526020015b60405180910390f35b6101c66104e4565b6101ea610664565b6101c66106b4565b6005546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f6565b6101ea6108b2565b61026c6108cf565b6040519081526020016101f6565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146101ea565b61026c60035481565b6101ea61095d565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61026c6109b5565b60065415156101ea565b61026c610b57565b61026c610d00565b6101c6610d6d565b5f546102379073ffffffffffffffffffffffffffffffffffffffff1681565b6101ea610f69565b61026c60065481565b6101c66103383660046116c9565b610f86565b6101c66113b7565b61026c60045481565b61026c60025481565b6101ea61152f565b6101c6611541565b60075415156101ea565b61026c60075481565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146103ec5760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064015b60405180910390fd5b60075461043b5760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b61044361152f565b6104b55760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60078190556040517ff5decdb337f3f69eb4a1610788fd6d8325897945c0f070fef7218c25b84ea9089190a1565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146105515760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b600754156105a15760405162461bcd60e51b815260206004820152601560248201527f4d4f44543a20416c7265616479206865616c696e67000000000000000000000060448201526064016103e3565b6105a961152f565b1561061c5760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b600454610629904261173f565b60078190556040519081527fb36d2484c6d35cccf36d46eafe82aa81628f80b9c4e6d1828f5837236a0641bd906020015b60405180910390a1565b5f805460055473ffffffffffffffffffffffffffffffffffffffff9182169116148015610692575060065415155b80156106a057506006544210155b80156106af57506106af61152f565b905090565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146107215760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b6007546107705760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b6007544210156107e85760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a204865616c696e672074696d656c6f636b206e6f7420706173736560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6107f061152f565b1561083d5760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e206f63637572726564000000000000000060448201526064016103e3565b5f8054600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169182179055600782905560405190917f184591035d84fab784c414962589ca8bf109c62ce76e7b318ca83c16c7c63b6491a2565b5f6108be600654151590565b80156106af57505060065442101590565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190611758565b5f61098560015460055473ffffffffffffffffffffffffffffffffffffffff90811691161490565b8015610992575060075415155b80156109a057506007544210155b80156106af57506109af61152f565b15905090565b5f8054604080517fa035b1fe0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a469190611758565b90505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190611758565b905081158015610ae5575080155b15610af2575f9250505090565b5f818310610b0b57610b04828461176f565b9050610b18565b610b15838361176f565b90505b5f6002610b25848661173f565b610b2f9190611782565b905080610b4483670de0b6b3a76400006117ba565b610b4e9190611782565b94505050505090565b600554604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa925050508015610c00575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bfd91810190611758565b60015b610cfb575f5460055473ffffffffffffffffffffffffffffffffffffffff918216911603610c925760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b919050565b600154604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610939573d5f5f3e3d5ffd5b5f5460055473ffffffffffffffffffffffffffffffffffffffff918216911614610dd95760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654610e285760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b600654421015610ea05760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a204368616c6c656e67652074696d656c6f636b206e6f742070617360448201527f736564000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b610ea861152f565b610ef45760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e207265736f6c766564000000000000000060448201526064016103e3565b600154600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790555f60068190556040517f235d3c92abef402ad8969f43056a1212760efee2e4357b1e165a93aed19329e39190a2565b5f610f75600754151590565b80156106af57505060075442101590565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610fd05750825b90505f8267ffffffffffffffff166001148015610fec5750303b155b905081158015610ffa575080155b15611031576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b73ffffffffffffffffffffffffffffffffffffffff8a166110f55760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207072696d617279206f7261636c650000000000000000000060448201526064016103e3565b73ffffffffffffffffffffffffffffffffffffffff89166111585760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261636b7570206f7261636c65000000000000000000000060448201526064016103e3565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16036111d35760405162461bcd60e51b815260206004820152601960248201527f4f7261636c6573206d75737420626520646966666572656e740000000000000060448201526064016103e3565b5f88116112475760405162461bcd60e51b8152602060048201526024808201527f446576696174696f6e207468726573686f6c64206d75737420626520706f736960448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f805473ffffffffffffffffffffffffffffffffffffffff808d167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617835560018054918d16919092161790556002899055600388905560048790556112ae6109b5565b9050888111156113005760405162461bcd60e51b815260206004820181905260248201527f4d4f44543a20496e697469616c20646576696174696f6e20746f6f206869676860448201526064016103e3565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c161790555f600681905560075583156113ab5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146114235760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654156114735760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20416c7265616479206368616c6c656e676564000000000000000060448201526064016103e3565b61147b61152f565b6114ed5760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6003546114fa904261173f565b60068190556040519081527fa895da4b794aeba8d8082db237265459db7b7ffdb5aa7c2332a7c5eafbfae7359060200161065a565b5f60025461153b6109b5565b11905090565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146115ad5760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b6006546115fc5760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b61160461152f565b156116775760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60068190556040517f50b374cefefbe966ce88eecb3ec50723325b080e27f17d311661c9c0790957889190a1565b803573ffffffffffffffffffffffffffffffffffffffff81168114610cfb575f5ffd5b5f5f5f5f5f60a086880312156116dd575f5ffd5b6116e6866116a6565b94506116f4602087016116a6565b94979496505050506040830135926060810135926080909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175257611752611712565b92915050565b5f60208284031215611768575f5ffd5b5051919050565b8181038181111561175257611752611712565b5f826117b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176117525761175261171256fea26469706673582212202d2c4443a6f63a7e838658d15ea6a69b2cea9aeab4171bf4f448dfb8e3a93ac364736f6c63430008210033","sourceMap":"650:9140:1:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561000f575f5ffd5b50600436106101ba575f3560e01c8063a035b1fe116100f3578063d2ef739811610093578063de1a69751161006e578063de1a697514610357578063e2997d6b1461035f578063f8f8b5f014610367578063f9e3444714610371575f5ffd5b8063d2ef73981461033d578063d83ed44014610345578063d94ad8371461034e575f5ffd5b8063bd8f238e116100ce578063bd8f238e146102fa578063c2ee5df914610319578063ccc1b9cd14610321578063d13f90b41461032a575f5ffd5b8063a035b1fe146102e2578063ad891006146102ea578063b166bf6b146102f2575f5ffd5b8063362a07ae1161015e5780637ad6d6d5116101395780637ad6d6d5146102a8578063836efd31146102b057806389ab3532146102d05780639df4d0fe146102d8575f5ffd5b8063362a07ae146102645780633682152b1461027a578063498e8b6e1461029f575f5ffd5b80631fc08644116101995780631fc0864414610207578063219a94b81461020f5780632289445e146102175780632f0a577b1461025c575f5ffd5b8062372f87146101be57806303c01e68146101c85780630434fe0b146101ff575b5f5ffd5b6101c661037a565b005b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116145b60405190151581526020015b60405180910390f35b6101c66104e4565b6101ea610664565b6101c66106b4565b6005546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f6565b6101ea6108b2565b61026c6108cf565b6040519081526020016101f6565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146101ea565b61026c60035481565b6101ea61095d565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61026c6109b5565b60065415156101ea565b61026c610b57565b61026c610d00565b6101c6610d6d565b5f546102379073ffffffffffffffffffffffffffffffffffffffff1681565b6101ea610f69565b61026c60065481565b6101c66103383660046116c9565b610f86565b6101c66113b7565b61026c60045481565b61026c60025481565b6101ea61152f565b6101c6611541565b60075415156101ea565b61026c60075481565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146103ec5760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064015b60405180910390fd5b60075461043b5760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b61044361152f565b6104b55760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60078190556040517ff5decdb337f3f69eb4a1610788fd6d8325897945c0f070fef7218c25b84ea9089190a1565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146105515760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b600754156105a15760405162461bcd60e51b815260206004820152601560248201527f4d4f44543a20416c7265616479206865616c696e67000000000000000000000060448201526064016103e3565b6105a961152f565b1561061c5760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b600454610629904261173f565b60078190556040519081527fb36d2484c6d35cccf36d46eafe82aa81628f80b9c4e6d1828f5837236a0641bd906020015b60405180910390a1565b5f805460055473ffffffffffffffffffffffffffffffffffffffff9182169116148015610692575060065415155b80156106a057506006544210155b80156106af57506106af61152f565b905090565b60015460055473ffffffffffffffffffffffffffffffffffffffff9182169116146107215760405162461bcd60e51b815260206004820152601b60248201527f4d4f44543a204d757374206265206261636b7570206f7261636c65000000000060448201526064016103e3565b6007546107705760405162461bcd60e51b815260206004820152601160248201527f4d4f44543a204e6f74206865616c696e6700000000000000000000000000000060448201526064016103e3565b6007544210156107e85760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a204865616c696e672074696d656c6f636b206e6f7420706173736560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6107f061152f565b1561083d5760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e206f63637572726564000000000000000060448201526064016103e3565b5f8054600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169182179055600782905560405190917f184591035d84fab784c414962589ca8bf109c62ce76e7b318ca83c16c7c63b6491a2565b5f6108be600654151590565b80156106af57505060065442101590565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190611758565b5f61098560015460055473ffffffffffffffffffffffffffffffffffffffff90811691161490565b8015610992575060075415155b80156109a057506007544210155b80156106af57506109af61152f565b15905090565b5f8054604080517fa035b1fe0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a469190611758565b90505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad79190611758565b905081158015610ae5575080155b15610af2575f9250505090565b5f818310610b0b57610b04828461176f565b9050610b18565b610b15838361176f565b90505b5f6002610b25848661173f565b610b2f9190611782565b905080610b4483670de0b6b3a76400006117ba565b610b4e9190611782565b94505050505090565b600554604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa925050508015610c00575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bfd91810190611758565b60015b610cfb575f5460055473ffffffffffffffffffffffffffffffffffffffff918216911603610c925760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610939573d5f5f3e3d5ffd5b919050565b600154604080517fa035b1fe00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163a035b1fe9160048083019260209291908290030181865afa158015610939573d5f5f3e3d5ffd5b5f5460055473ffffffffffffffffffffffffffffffffffffffff918216911614610dd95760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654610e285760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b600654421015610ea05760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a204368616c6c656e67652074696d656c6f636b206e6f742070617360448201527f736564000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b610ea861152f565b610ef45760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20446576696174696f6e207265736f6c766564000000000000000060448201526064016103e3565b600154600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790555f60068190556040517f235d3c92abef402ad8969f43056a1212760efee2e4357b1e165a93aed19329e39190a2565b5f610f75600754151590565b80156106af57505060075442101590565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610fd05750825b90505f8267ffffffffffffffff166001148015610fec5750303b155b905081158015610ffa575080155b15611031576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b73ffffffffffffffffffffffffffffffffffffffff8a166110f55760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207072696d617279206f7261636c650000000000000000000060448201526064016103e3565b73ffffffffffffffffffffffffffffffffffffffff89166111585760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261636b7570206f7261636c65000000000000000000000060448201526064016103e3565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16036111d35760405162461bcd60e51b815260206004820152601960248201527f4f7261636c6573206d75737420626520646966666572656e740000000000000060448201526064016103e3565b5f88116112475760405162461bcd60e51b8152602060048201526024808201527f446576696174696f6e207468726573686f6c64206d75737420626520706f736960448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f805473ffffffffffffffffffffffffffffffffffffffff808d167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617835560018054918d16919092161790556002899055600388905560048790556112ae6109b5565b9050888111156113005760405162461bcd60e51b815260206004820181905260248201527f4d4f44543a20496e697469616c20646576696174696f6e20746f6f206869676860448201526064016103e3565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c161790555f600681905560075583156113ab5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146114235760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b600654156114735760405162461bcd60e51b815260206004820152601860248201527f4d4f44543a20416c7265616479206368616c6c656e676564000000000000000060448201526064016103e3565b61147b61152f565b6114ed5760405162461bcd60e51b815260206004820152602160248201527f4d4f44543a20446576696174696f6e207468726573686f6c64206e6f74206d6560448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b6003546114fa904261173f565b60068190556040519081527fa895da4b794aeba8d8082db237265459db7b7ffdb5aa7c2332a7c5eafbfae7359060200161065a565b5f60025461153b6109b5565b11905090565b5f5460055473ffffffffffffffffffffffffffffffffffffffff9182169116146115ad5760405162461bcd60e51b815260206004820152601c60248201527f4d4f44543a204d757374206265207072696d617279206f7261636c650000000060448201526064016103e3565b6006546115fc5760405162461bcd60e51b815260206004820152601460248201527f4d4f44543a204e6f74206368616c6c656e67656400000000000000000000000060448201526064016103e3565b61160461152f565b156116775760405162461bcd60e51b815260206004820152602360248201527f4d4f44543a20446576696174696f6e207468726573686f6c64207374696c6c2060448201527f6d6574000000000000000000000000000000000000000000000000000000000060648201526084016103e3565b5f60068190556040517f50b374cefefbe966ce88eecb3ec50723325b080e27f17d311661c9c0790957889190a1565b803573ffffffffffffffffffffffffffffffffffffffff81168114610cfb575f5ffd5b5f5f5f5f5f60a086880312156116dd575f5ffd5b6116e6866116a6565b94506116f4602087016116a6565b94979496505050506040830135926060810135926080909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175257611752611712565b92915050565b5f60208284031215611768575f5ffd5b5051919050565b8181038181111561175257611752611712565b5f826117b5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176117525761175261171256fea26469706673582212202d2c4443a6f63a7e838658d15ea6a69b2cea9aeab4171bf4f448dfb8e3a93ac364736f6c63430008210033","sourceMap":"650:9140:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8407:314;;;:::i;:::-;;3992:102;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;3992:102;;;179:14:4;;172:22;154:41;;142:2;127:18;3992:102:1;;;;;;;;7959:343;;;:::i;6966:168::-;;;:::i;9320:467::-;;;:::i;1111:28::-;;;;;;;;;;;;398:42:4;386:55;;;368:74;;356:2;341:18;1111:28:1;206:242:4;6761:139:1;;;:::i;3477:101::-;;;:::i;:::-;;;599:25:4;;;587:2;572:18;3477:101:1;453:177:4;3812:104:1;3854:4;3895:13;3878;;3895;;;;3878;;:30;3812:104;;949:40;;;;;;8977:161;;;:::i;834:27::-;;;;;;;;;4693:843;;;:::i;4162:99::-;4231:18;;:22;;4162:99;;3070:349;;;:::i;3636:99::-;;;:::i;7299:477::-;;;:::i;799:28::-;;;;;;;;;8781:132;;;:::i;1175:33::-;;;;;;1857:1176;;;;;;:::i;:::-;;:::i;5914:361::-;;;:::i;1019:38::-;;;;;;868:33;;;;;;5619:109;;;:::i;6367:332::-;;;:::i;4334:94::-;4400:16;;:20;;4334:94;;1277:31;;;;;;8407:314;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;8452:50;;;;-1:-1:-1;;;8452:50:1;;1718:2:4;8452:50:1;;;1700:21:4;1757:2;1737:18;;;1730:30;1796:29;1776:18;;;1769:57;1843:18;;8452:50:1;;;;;;;;;4400:16;;8539:41;;;;-1:-1:-1;;;8539:41:1;;2074:2:4;8539:41:1;;;2056:21:4;2113:2;2093:18;;;2086:30;2152:19;2132:18;;;2125:47;2189:18;;8539:41:1;1872:341:4;8539:41:1;8599:11;:9;:11::i;:::-;8591:57;;;;-1:-1:-1;;;8591:57:1;;2420:2:4;8591:57:1;;;2402:21:4;2459:2;2439:18;;;2432:30;2498:34;2478:18;;;2471:62;2569:3;2549:18;;;2542:31;2590:19;;8591:57:1;2218:397:4;8591:57:1;8680:1;8661:16;:20;;;8697:16;;;;8680:1;8697:16;8407:314::o;7959:343::-;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;7995:50;;;;-1:-1:-1;;;7995:50:1;;1718:2:4;7995:50:1;;;1700:21:4;1757:2;1737:18;;;1730:30;1796:29;1776:18;;;1769:57;1843:18;;7995:50:1;1516:351:4;7995:50:1;4400:16;;:20;8056:46;;;;-1:-1:-1;;;8056:46:1;;2822:2:4;8056:46:1;;;2804:21:4;2861:2;2841:18;;;2834:30;2900:23;2880:18;;;2873:51;2941:18;;8056:46:1;2620:345:4;8056:46:1;8122:11;:9;:11::i;:::-;8121:12;8113:60;;;;-1:-1:-1;;;8113:60:1;;3172:2:4;8113:60:1;;;3154:21:4;3211:2;3191:18;;;3184:30;3250:34;3230:18;;;3223:62;3321:5;3301:18;;;3294:33;3344:19;;8113:60:1;2970:399:4;8113:60:1;8223:23;;8205:41;;:15;:41;:::i;:::-;8186:16;:60;;;8262:32;;599:25:4;;;8262:32:1;;587:2:4;572:18;8262:32:1;;;;;;;;7959:343::o;6966:168::-;7017:4;3895:13;;3878;;3895;;;;3878;;:30;7041:29;;;;-1:-1:-1;4231:18:1;;:22;;7056:14;7041:70;;;;;7093:18;;7074:15;:37;;7041:70;:85;;;;;7115:11;:9;:11::i;:::-;7034:92;;6966:168;:::o;9320:467::-;4074:12;;4057:13;;4074:12;;;;4057:13;;:29;9365:50;;;;-1:-1:-1;;;9365:50:1;;1718:2:4;9365:50:1;;;1700:21:4;1757:2;1737:18;;;1730:30;1796:29;1776:18;;;1769:57;1843:18;;9365:50:1;1516:351:4;9365:50:1;4400:16;;9426:41;;;;-1:-1:-1;;;9426:41:1;;2074:2:4;9426:41:1;;;2056:21:4;2113:2;2093:18;;;2086:30;2152:19;2132:18;;;2125:47;2189:18;;9426:41:1;1872:341:4;9426:41:1;9505:16;;9486:15;:35;;9478:81;;;;-1:-1:-1;;;9478:81:1;;3895:2:4;9478:81:1;;;3877:21:4;3934:2;3914:18;;;3907:30;3973:34;3953:18;;;3946:62;4044:3;4024:18;;;4017:31;4065:19;;9478:81:1;3693:397:4;9478:81:1;9579:11;:9;:11::i;:::-;9578:12;9570:49;;;;-1:-1:-1;;;9570:49:1;;4297:2:4;9570:49:1;;;4279:21:4;4336:2;4316:18;;;4309:30;4375:26;4355:18;;;4348:54;4419:18;;9570:49:1;4095:348:4;9570:49:1;9680:13;;;9664;:29;;;;9680:13;;;;9664:29;;;;;9704:16;:20;;;9740:39;;9680:13;;9740:39;;;9320:467::o;6761:139::-;6813:4;6837:14;4231:18;;:22;;;4162:99;6837:14;:55;;;;-1:-1:-1;;6874:18:1;;6855:15;:37;;;6761:139::o;3477:101::-;3522:7;3549:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8977:161::-;9026:4;9050:10;4074:12;;4057:13;;4074:12;4057:13;;;4074:12;;4057:29;;3992:102;9050:10;:25;;;;-1:-1:-1;4400:16:1;;:20;;9064:11;9050:64;;;;;9098:16;;9079:15;:35;;9050:64;:80;;;;;9119:11;:9;:11::i;:::-;9118:12;9043:87;;8977:161;:::o;4693:843::-;4738:7;4788:13;;:21;;;;;;;;4738:7;;4788:13;;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4758:51;;4820:26;4849:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4820:49;-1:-1:-1;4937:24:1;;:51;;;;-1:-1:-1;4965:23:1;;4937:51;4933:92;;;5012:1;5005:8;;;;4693:843;:::o;4933:92::-;5037:12;5087:18;5064:19;:41;5060:201;;5129:40;5151:18;5129:19;:40;:::i;:::-;5122:47;;5060:201;;;5209:40;5230:19;5209:18;:40;:::i;:::-;5202:47;;5060:201;5321:15;5384:1;5340:40;5362:18;5340:19;:40;:::i;:::-;5339:46;;;;:::i;:::-;5321:64;-1:-1:-1;5321:64:1;5504:13;:4;5511:6;5504:13;:::i;:::-;5503:25;;;;:::i;:::-;5496:32;;;;;;4693:843;:::o;3070:349::-;3132:13;;:21;;;;;;;;3108:7;;3132:13;;;:19;;:21;;;;;;;;;;;;;;:13;:21;;;;;;;;;;-1:-1:-1;3132:21:1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3128:284;;3854:4;3895:13;3878;;3895;;;;3878;;:30;3253:148;;3296:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3253:148;3364:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3128:284;3207:12;3070:349;-1:-1:-1;3070:349:1:o;3636:99::-;3707:12;;:20;;;;;;;;3680:7;;3707:12;;;:18;;:20;;;;;;;;;;;;;;:12;:20;;;;;;;;;;;;;;7299:477;3854:4;3895:13;3878;;3895;;;;3878;;:30;7346:52;;;;-1:-1:-1;;;7346:52:1;;5424:2:4;7346:52:1;;;5406:21:4;5463:2;5443:18;;;5436:30;5502;5482:18;;;5475:58;5550:18;;7346:52:1;5222:352:4;7346:52:1;4231:18;;7409:47;;;;-1:-1:-1;;;7409:47:1;;5781:2:4;7409:47:1;;;5763:21:4;5820:2;5800:18;;;5793:30;5859:22;5839:18;;;5832:50;5899:18;;7409:47:1;5579:344:4;7409:47:1;7494:18;;7475:15;:37;;7467:85;;;;-1:-1:-1;;;7467:85:1;;6130:2:4;7467:85:1;;;6112:21:4;6169:2;6149:18;;;6142:30;6208:34;6188:18;;;6181:62;6279:5;6259:18;;;6252:33;6302:19;;7467:85:1;5928:399:4;7467:85:1;7571:11;:9;:11::i;:::-;7563:48;;;;-1:-1:-1;;;7563:48:1;;6534:2:4;7563:48:1;;;6516:21:4;6573:2;6553:18;;;6546:30;6612:26;6592:18;;;6585:54;6656:18;;7563:48:1;6332:348:4;7563:48:1;7666:12;;7650:13;:28;;;;7666:12;;;;7650:28;;;;;7666:12;7689:18;:22;;;7727:41;;;;7666:12;7727:41;7299:477::o;8781:132::-;8831:4;8855:11;4400:16;;:20;;;4334:94;8855:11;:50;;;;-1:-1:-1;;8889:16:1;;8870:15;:35;;;8781:132::o;1857:1176::-;8870:21:0;4302:15;;;;;;;4301:16;;4348:14;;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;:16;;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:0;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;;;;;;;;;;;;;4851:91;4951:18;;;;4968:1;4951:18;;;4979:67;;;;5013:22;;;;;;;;4979:67;2115:37:1::1;::::0;::::1;2107:72;;;::::0;-1:-1:-1;;;2107:72:1;;6887:2:4;2107:72:1::1;::::0;::::1;6869:21:4::0;6926:2;6906:18;;;6899:30;6965:24;6945:18;;;6938:52;7007:18;;2107:72:1::1;6685:346:4::0;2107:72:1::1;2198:36;::::0;::::1;2190:70;;;::::0;-1:-1:-1;;;2190:70:1;;7238:2:4;2190:70:1::1;::::0;::::1;7220:21:4::0;7277:2;7257:18;;;7250:30;7316:23;7296:18;;;7289:51;7357:18;;2190:70:1::1;7036:345:4::0;2190:70:1::1;2314:13;2279:49;;2287:14;2279:49;;::::0;2271:87:::1;;;::::0;-1:-1:-1;;;2271:87:1;;7588:2:4;2271:87:1::1;::::0;::::1;7570:21:4::0;7627:2;7607:18;;;7600:30;7666:27;7646:18;;;7639:55;7711:18;;2271:87:1::1;7386:349:4::0;2271:87:1::1;2399:1;2377:19;:23;2369:72;;;::::0;-1:-1:-1;;;2369:72:1;;7942:2:4;2369:72:1::1;::::0;::::1;7924:21:4::0;7981:2;7961:18;;;7954:30;8020:34;8000:18;;;7993:62;8091:6;8071:18;;;8064:34;8115:19;;2369:72:1::1;7740:400:4::0;2369:72:1::1;2454:13;:30:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;2495:28;;;;::::1;::::0;;;::::1;;::::0;;2534:18:::1;:40:::0;;;2585:25:::1;:54:::0;;;2650:23:::1;:50:::0;;;2776:14:::1;:12;:14::i;:::-;2749:41;;2829:19;2809:16;:39;;2801:84;;;::::0;-1:-1:-1;;;2801:84:1;;8347:2:4;2801:84:1::1;::::0;::::1;8329:21:4::0;;;8366:18;;;8359:30;8425:34;8405:18;;;8398:62;8477:18;;2801:84:1::1;8145:356:4::0;2801:84:1::1;-1:-1:-1::0;2898:13:1::1;:30:::0;;;::::1;;::::0;::::1;;::::0;;-1:-1:-1;2972:18:1::1;:22:::0;;;3005:16:::1;:20:::0;5066:101:0;;;;5100:23;;;;;;5142:14;;-1:-1:-1;8659:50:4;;5142:14:0;;8647:2:4;8632:18;5142:14:0;;;;;;;5066:101;4092:1081;;;;;1857:1176:1;;;;;:::o;5914:361::-;3854:4;3895:13;3878;;3895;;;;3878;;:30;5955:52;;;;-1:-1:-1;;;5955:52:1;;5424:2:4;5955:52:1;;;5406:21:4;5463:2;5443:18;;;5436:30;5502;5482:18;;;5475:58;5550:18;;5955:52:1;5222:352:4;5955:52:1;4231:18;;:22;6018:52;;;;-1:-1:-1;;;6018:52:1;;8922:2:4;6018:52:1;;;8904:21:4;8961:2;8941:18;;;8934:30;9000:26;8980:18;;;8973:54;9044:18;;6018:52:1;8720:348:4;6018:52:1;6089:11;:9;:11::i;:::-;6081:57;;;;-1:-1:-1;;;6081:57:1;;2420:2:4;6081:57:1;;;2402:21:4;2459:2;2439:18;;;2432:30;2498:34;2478:18;;;2471:62;2569:3;2549:18;;;2542:31;2590:19;;6081:57:1;2218:397:4;6081:57:1;6190:25;;6172:43;;:15;:43;:::i;:::-;6151:18;:64;;;6231:36;;599:25:4;;;6231:36:1;;587:2:4;572:18;6231:36:1;453:177:4;5619:109:1;5661:4;5702:18;;5685:14;:12;:14::i;:::-;:35;5678:42;;5619:109;:::o;6367:332::-;3854:4;3895:13;3878;;3895;;;;3878;;:30;6414:52;;;;-1:-1:-1;;;6414:52:1;;5424:2:4;6414:52:1;;;5406:21:4;5463:2;5443:18;;;5436:30;5502;5482:18;;;5475:58;5550:18;;6414:52:1;5222:352:4;6414:52:1;4231:18;;6504:47;;;;-1:-1:-1;;;6504:47:1;;5781:2:4;6504:47:1;;;5763:21:4;5820:2;5800:18;;;5793:30;5859:22;5839:18;;;5832:50;5899:18;;6504:47:1;5579:344:4;6504:47:1;6571:11;:9;:11::i;:::-;6570:12;6562:60;;;;-1:-1:-1;;;6562:60:1;;3172:2:4;6562:60:1;;;3154:21:4;3211:2;3191:18;;;3184:30;3250:34;3230:18;;;3223:62;3321:5;3301:18;;;3294:33;3344:19;;6562:60:1;2970:399:4;6562:60:1;6656:1;6635:18;:22;;;6673:18;;;;6656:1;6673:18;6367:332::o;635:205:4:-;712:20;;772:42;761:54;;751:65;;741:93;;830:1;827;820:12;845:666;972:6;980;988;996;1004;1057:3;1045:9;1036:7;1032:23;1028:33;1025:53;;;1074:1;1071;1064:12;1025:53;1097:38;1125:9;1097:38;:::i;:::-;1087:48;;1154:47;1197:2;1186:9;1182:18;1154:47;:::i;:::-;845:666;;1144:57;;-1:-1:-1;;;;1270:2:4;1255:18;;1242:32;;1371:2;1356:18;;1343:32;;1474:3;1459:19;;;1446:33;;-1:-1:-1;845:666:4:o;3374:184::-;3426:77;3423:1;3416:88;3523:4;3520:1;3513:15;3547:4;3544:1;3537:15;3563:125;3628:9;;;3649:10;;;3646:36;;;3662:18;;:::i;:::-;3563:125;;;;:::o;4448:184::-;4518:6;4571:2;4559:9;4550:7;4546:23;4542:32;4539:52;;;4587:1;4584;4577:12;4539:52;-1:-1:-1;4610:16:4;;4448:184;-1:-1:-1;4448:184:4:o;4637:128::-;4704:9;;;4725:11;;;4722:37;;;4739:18;;:::i;4770:274::-;4810:1;4836;4826:189;;4871:77;4868:1;4861:88;4972:4;4969:1;4962:15;5000:4;4997:1;4990:15;4826:189;-1:-1:-1;5029:9:4;;4770:274::o;5049:168::-;5122:9;;;5153;;5170:15;;;5164:22;;5150:37;5140:71;;5191:18;;:::i","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"acceptChallenge()","signatureHash4":"0xb166bf6b","signatureHash32":"0xb166bf6b9ad9d6c138c6a9368947ae5eb5b6854d8ae7af910c2e4e455e058452"},{"signature":"acceptHealing()","signatureHash4":"0x219a94b8","signatureHash32":"0x219a94b80dc7b13893cfd726cc278751da5bca62c794cf0364b2198c24600d56"},{"signature":"backupOracle()","signatureHash4":"0x836efd31","signatureHash32":"0x836efd31cc25fd31aa91a6c03742d46e527bb2383c673b978a7e02a67137cc41"},{"signature":"backupPrice()","signatureHash4":"0xad891006","signatureHash32":"0xad891006ce34341ef114ee1fb160dac42a88c717fbd759d913e2e8b0fb4be69f"},{"signature":"canAcceptChallenge()","signatureHash4":"0x1fc08644","signatureHash32":"0x1fc0864403d590a369c78c6a57f1976682fc1920232c9396df00e97e8b6fc349"},{"signature":"canAcceptHealing()","signatureHash4":"0x7ad6d6d5","signatureHash32":"0x7ad6d6d518c4fc2b0848f040d047a43c1e6b4090bcf3bf52f7c6f4e76925800a"},{"signature":"challenge()","signatureHash4":"0xd2ef7398","signatureHash32":"0xd2ef73985870176bb7e5ec11557baf1495b52fd71d8c81ec3526f15df863f62f"},{"signature":"challengeExpiresAt()","signatureHash4":"0xccc1b9cd","signatureHash32":"0xccc1b9cd1729686ee670594caac39e5f032ad990710c2ba5f09b0d6e7ee49244"},{"signature":"challengeTimelockDuration()","signatureHash4":"0x498e8b6e","signatureHash32":"0x498e8b6e5bd7d42e0c24addc11e32590b1ca12d80690e5a54176dc70d2b384f7"},{"signature":"currentOracle()","signatureHash4":"0x2289445e","signatureHash32":"0x2289445e81fd36d0c4c1f4710aa0b0741207bfb741acacfa4b33c79085ee243e"},{"signature":"deviationThreshold()","signatureHash4":"0xd94ad837","signatureHash32":"0xd94ad837f21f658f2bffb00a6061348d0a423ce19d5f084d73cfa684756e0f21"},{"signature":"getDeviation()","signatureHash4":"0x89ab3532","signatureHash32":"0x89ab3532337b245bd34efceea704d36107101a6bea890ff65dd52e5e7c3a2e22"},{"signature":"hasChallengeExpired()","signatureHash4":"0x2f0a577b","signatureHash32":"0x2f0a577b884dacc5321b4fca1e27e482d7e3838850163ee08cca1b40111a89ec"},{"signature":"hasHealingExpired()","signatureHash4":"0xc2ee5df9","signatureHash32":"0xc2ee5df9578aef2f2553ab058c75dca6afdb085b14e6a2098cf7ce2e3bdd32e7"},{"signature":"heal()","signatureHash4":"0x0434fe0b","signatureHash32":"0x0434fe0be1187da30d2fd6872dd9a34d660c5327012f239be34605765ffe247f"},{"signature":"healingExpiresAt()","signatureHash4":"0xf9e34447","signatureHash32":"0xf9e344473a8a580ecd39e772af222eefe554e3ead1ae023c8a9d779d104be68a"},{"signature":"healingTimelockDuration()","signatureHash4":"0xd83ed440","signatureHash32":"0xd83ed440f4880f49f152ee6a1de44b049add8794a873d3ac2246a56fe14a7f7f"},{"signature":"initialize(address,address,uint256,uint256,uint256)","signatureHash4":"0xd13f90b4","signatureHash32":"0xd13f90b4a70df481dfe905edf398daad42991d461203fabcffaaa135dbbd95e6"},{"signature":"isBackup()","signatureHash4":"0x03c01e68","signatureHash32":"0x03c01e68d61c7ced1ac049bdeea1e3f2cd82b74ee6cfa7358b82f59179547c8a"},{"signature":"isChallenged()","signatureHash4":"0x9df4d0fe","signatureHash32":"0x9df4d0feca5ab9fa1d3aa396e2262e5f6b1252122888c8bdf3702f9091f5af68"},{"signature":"isDeviant()","signatureHash4":"0xde1a6975","signatureHash32":"0xde1a6975c009b6084663cf55396b46ff04e63e21b3a01ba41e2baa32334eb6a7"},{"signature":"isHealing()","signatureHash4":"0xf8f8b5f0","signatureHash32":"0xf8f8b5f0261f464584c94ee9a1d0b03b64f66e4325f01da43012f35b3eb8b12f"},{"signature":"isPrimary()","signatureHash4":"0x3682152b","signatureHash32":"0x3682152b75e2a4ba384348ef6263fc328264aae3f66a3b435f4f9ab28dc0950a"},{"signature":"price()","signatureHash4":"0xa035b1fe","signatureHash32":"0xa035b1fe6fc95504ec34c01f5f457ced39c26a91e52e2bdf1623238a202c7c3c"},{"signature":"primaryOracle()","signatureHash4":"0xbd8f238e","signatureHash32":"0xbd8f238e9a9c1303c5b218800f9b520697f373475fc17631f22ee74acdcae4f7"},{"signature":"primaryPrice()","signatureHash4":"0x362a07ae","signatureHash32":"0x362a07ae7710683f85b1a19c8c0739374def93d86aaf9a478c3eee47aaff4acc"},{"signature":"revokeChallenge()","signatureHash4":"0xe2997d6b","signatureHash32":"0xe2997d6bc69f8c73c5ab5c07cb4a0e7440ca610700ca1733d448ba40fc5e7e4f"},{"signature":"revokeHealing()","signatureHash4":"0x00372f87","signatureHash32":"0x00372f876748ddd002212c513e5eeb4e9b6a6076ea01d58f539cf8f33718ebf9"}],"event":[{"signature":"ChallengeAccepted(address)","signatureHash4":"0x235d3c92","signatureHash32":"0x235d3c92abef402ad8969f43056a1212760efee2e4357b1e165a93aed19329e3"},{"signature":"ChallengeRevoked()","signatureHash4":"0x50b374ce","signatureHash32":"0x50b374cefefbe966ce88eecb3ec50723325b080e27f17d311661c9c079095788"},{"signature":"ChallengeStarted(uint256)","signatureHash4":"0xa895da4b","signatureHash32":"0xa895da4b794aeba8d8082db237265459db7b7ffdb5aa7c2332a7c5eafbfae735"},{"signature":"HealingAccepted(address)","signatureHash4":"0x18459103","signatureHash32":"0x184591035d84fab784c414962589ca8bf109c62ce76e7b318ca83c16c7c63b64"},{"signature":"HealingRevoked()","signatureHash4":"0xf5decdb3","signatureHash32":"0xf5decdb337f3f69eb4a1610788fd6d8325897945c0f070fef7218c25b84ea908"},{"signature":"HealingStarted(uint256)","signatureHash4":"0xb36d2484","signatureHash32":"0xb36d2484c6d35cccf36d46eafe82aa81628f80b9c4e6d1828f5837236a0641bd"},{"signature":"Initialized(uint64)","signatureHash4":"0xc7f505b2","signatureHash32":"0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"}],"error":[{"signature":"InvalidInitialization()","signatureHash4":"0xf92ee8a9","signatureHash32":"0xf92ee8a957075833165f68c320933b1a1294aafc84ee6e0dd3fb178008f9aaf5"},{"signature":"NotInitializing()","signatureHash4":"0xd7e6bcf8","signatureHash32":"0xd7e6bcf8597daa127dc9f0048d2f08d5ef140a2cb659feabd700beff1f7a8302"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"4663","address":"0x6A16d6fe1bA26E6BA52fdA03972b1FE2e31cA729"}